@moonbase-machines/c64 0.6.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/moonbase-c64.js +2 -2
- package/dist/moonbase-c64.js.map +3 -3
- package/package.json +3 -3
- package/start.js +2 -2
package/dist/moonbase-c64.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../basic-compile.js", "../basic-lang.js", "../numbers.js", "../float.js", "../basic-list.js", "../petscii.js", "../basic-rom.js", "../basic.js", "../browser.js", "../keys.js", "../vic.js", "../d64.js", "../drive.js", "../editor.js", "../glyph-hash.js", "../glyph-hashes.js", "../kernal.js", "../machine.js", "moonbase-module:mos6502/cpu.js", "../printer.js", "../rom.js", "moonbase-module:charset/chargen.js", "../paint.js", "../picture.js", "../saves.js", "../sid.js", "../start.js"],
|
|
4
|
-
"sourcesContent": ["// A program's statements, as read from Blitz!'s code or by basic-lang.js from BASIC's text,\n// compiled to JavaScript: a module, a step a statement, which an engine runs, each step's work\n// done by the BASIC of basic.js (`b`, the engine's `basic`).\n//\n// compile(statements, { name, source, mem, cost, render }) the module's text\n// instantiate(statements, { ... }) the same, as the program itself\n// statements the tree: statements, and labels where a jump goes\n// mem memory as the program has it, for the text after each SYS: its parameters'\n// expressions are compiled too (`params`), for the ROM's routines that the\n// machine code reads them with\n// cost the cycles a statement takes, for the page's clock\n// render a statement as BASIC, each step's text\nimport { expression } from './basic-lang.js';\n\nconst hex = (v, w = 4) => v.toString(16).toUpperCase().padStart(w, '0');\nconst q = s => JSON.stringify(s);\n\n// where an operation that can fail is, as the last argument of its call (evaluated after the\n// others, so after any inner operation's): BASIC's error gives it (basic.js `here`)\nconst here = x => x.op !== undefined ? `, b.here(0x${x.op.toString(16)})` : '';\n// an expression as JavaScript, and whether it is a string\nfunction js(x) {\n switch (x.k) {\n case 'num': return String(x.v);\n case 'str': return q(x.s);\n case 'special': return { ti: 'b.ti()', 'ti$': 'b.tis()', st: 'b.st()', pi: String(Math.PI) }[x.n];\n case 'var': return `b.get(${q(x.n)})`;\n case 'elem': return `b.elem(${q(x.n)}, [${x.i.map(js).join(', ')}]${here(x)})`;\n case 'neg': return `-b.num(${js(x.a)})`;\n case 'not': return `b.not(${js(x.a)})`;\n case 'op': {\n const a = js(x.a), c = js(x.b);\n switch (x.o) {\n case '+': return `b.add(${a}, ${c}${here(x)})`;\n case '-': return `(b.num(${a}) - b.num(${c}))`;\n case '*': return `(b.num(${a}) * b.num(${c}))`;\n case '/': return `b.div(${a}, ${c}${here(x)})`;\n case '^': return `b.pow(${a}, ${c}${here(x)})`;\n case 'and': return `b.and(${a}, ${c}${here(x)})`;\n case 'or': return `b.or(${a}, ${c}${here(x)})`;\n default: return `b.cmp(${a}, ${c}, ${q(x.o)}${here(x)})`;\n }\n }\n case 'fn-call': return `b.fn(${q(x.n)}, ${js(x.a)})`;\n case 'fn': {\n const a = x.args.map(js);\n const F = { 'str$': 'str', 'chr$': 'chr', 'left$': 'left', 'right$': 'right', 'mid$': 'mid' };\n return `b.${F[x.n] ?? x.n}(${a.join(', ')}${a.length < 3 && (x.n === 'mid$') ? ', undefined' : ''}${here(x)})`;\n }\n }\n throw new Error('no expression ' + x.k);\n}\n\n// a place to store into: a variable or an array's element\nconst store = (t, v, s) => t.k === 'elem' ? `b.setElem(${q(t.n)}, [${t.i.map(js).join(', ')}], ${v}${s ? here(s) : ''})` : `b.set(${q(t.n)}, ${v}${s ? here(s) : ''})`;\nconst isString = t => t.n.endsWith('$');\n\nexport function compile(statements, { name, source, mem, cost = 0, render }) {\n // each statement a step, each label the step after it\n const labels = {}, steps = [];\n for (const s of statements) { if (s.label !== undefined) labels['L' + hex(typeof s.label === 'number' ? s.label : parseInt(s.label.slice(1), 16))] = steps.length; else steps.push(s); }\n // (a jump to a line not there is UNDEF'D STATEMENT when it is taken: `missing`)\n const step = to => { if (to?.missing !== undefined) return null; const k = labels['L' + hex(to)]; if (k === undefined) throw new Error('no label for $' + hex(to)); return k; };\n const params = new Map();\n const body = steps.map((s, k) => {\n const go = to => to?.missing !== undefined ? 'b.undef();' : `e.pc = ${step(to)};`;\n let c;\n switch (s.k) {\n case 'let': c = store(s.t, js(s.e), s); break;\n case 'dim': c = `b.dim(${q(s.n)}, [${s.sizes.map(js).join(', ')}]);`; break;\n case 'poke': c = `b.poke(${js(s.a)}, ${js(s.v)}${here(s)});`; break;\n case 'for': c = `b.for(${q(s.v)}, ${js(s.to)}, ${s.step ? js(s.step) : 1}, ${k + 1});`; break;\n case 'next': case 'next-var': c = `{ const back = b.next(${s.v ? q(s.v) : 'null'}); if (back !== null) e.pc = back; }`; break;\n case 'goto': c = go(s.to); break;\n case 'gosub': c = `b.gosub(${k + 1}); ${go(s.to)}`; break;\n case 'return': c = 'e.pc = b.ret();'; break;\n case 'on': c = `{ const n = b.on(${js(s.e)}${here(s)}); if (n >= 1 && n <= ${s.to.length}) { const to = [${s.to.map(step).join(', ')}][n - 1]; if (to === null) b.undef(); ${s.gosub ? `b.gosub(${k + 1}); ` : ''}e.pc = to; } }`; break;\n case 'unless': c = s.to < 0 ? `if (!b.num(${js(s.e)})) e.pc = ${steps.length};` : `if (!b.num(${js(s.e)})) ${go(s.to)}`; break;\n case 'if-goto': c = `if (b.num(${js(s.e)})) ${go(s.to)}`; break;\n case 'if-return': c = `if (b.num(${js(s.e)})) e.pc = b.ret();`; break;\n case 'print': c = `b.print(${js(s.args[0])});`; break;\n case 'print,': c = `b.print(${js(s.args[0])}); b.comma();`; break;\n case 'print-line': c = `b.print(${js(s.args[0])}); b.newline();`; break;\n case 'print-line#': c = `b.print(${js(s.args[0])}); b.newline(); b.clrchn();`; break;\n case 'print#': c = `b.output(${js(s.args[0])});`; break;\n case 'print#-line': c = `b.output(${js(s.args[0])}); b.newline(); b.clrchn();`; break;\n case 'clrchn': c = 'b.clrchn();'; break;\n case 'input#': c = `b.input(${js(s.args[0])});`; break;\n // GET#: the file the input, a character for each variable (none, \"\"), and the keyboard again\n case 'get#': c = `b.input(${js(s.args[0])}); ${s.targets.map(t => store(t, isString(t) ? 'b.getFrom()' : 'b.val(b.getFrom())')).join('; ')}; b.clrchn();`; break;\n // (an item of an INPUT given up, a read from the file timed out, leaves its variable)\n case 'input': case 'input-item': c = `{ const v = b.item(${isString(s.t)}, ${s.k === 'input'}); if (v !== undefined) ${store(s.t, 'v')}; }` + (s.last ? ' b.inputDone();' : ''); break;\n case 'input-start': c = ''; break;\n case 'open': c = `b.open([${s.args.map(js).join(', ')}]);`; break;\n case 'close': c = `b.close(${js(s.args[0])});`; break;\n // WAIT: this step again until the place's bits come, the wait the run stops for\n case 'wait': c = `if (!b.wait(${s.args.map(js).join(', ')})) { e.pc = ${k}; if (++e.idle > (e.routines.polls ?? 200) && !e.clock) e.polled = true; }`; break;\n case 'print-comma': c = 'b.comma();'; break;\n case 'newline': c = 'b.newline();'; break;\n case 'tab': c = `b.tab(${js(s.args[0])}${here(s)});`; break;\n case 'spc': c = `b.spc(${js(s.args[0])}${here(s)});`; break;\n case 'get': c = `{ const k = b.key(); if (k === null) { e.pc = ${k}; return; } ${store(s.t, isString(s.t) ? 'k' : 'b.val(k)')} }`; break;\n case 'read': case 'read$': c = store(s.t, `b.read(${isString(s.t)})`); break;\n case 'clr': c = 'b.clr();'; break;\n case 'restore': c = 'b.restore();'; break;\n // DEF FN: the function kept, its expression a function of the BASIC it runs on\n case 'def': c = `b.def(${q(s.n)}, ${q(s.p)}, b => ${js(s.e)});`; break;\n case 'end': case 'stop': c = 'e.ended = true;'; break;\n case 'ti$=': c = `b.setTis(${js(s.args[0])});`; break;\n // RUN, Blitz!'s: the files closed, the variables cleared, the program's start run again (its\n // DIMs), and on from after the RUN; the start's jump past the DATA is to there, or else to\n // the main code\n case 'run': c = `b.run(${k + 1}); ${s.to !== undefined ? go(s.to) : 'e.pc = 0;'}`; break;\n // a statement BASIC could not read: its error, when it is reached\n case 'fail': c = `b.failWith(${q(s.what)});`; break;\n case 'run-main': c = `e.pc = b.resume ?? ${steps.length ? step(s.to) : 0}; b.resume = undefined;`; break;\n case 'nop': case 'flag+40': case 'flag-40': case 'flag+80': case 'flag-80': c = ''; break;\n // SYS: the machine code at the address, with its text from just after SYS for its\n // parameters\n case 'sys': {\n c = `return b.sys(${js(s.e)}, 0x${hex(s.text)}, s[${k}]);`;\n if (mem) for (let at = s.text; at < s.end;) {\n while (mem[at] === 0x20 || mem[at] === 0x2c) at++;\n if (at >= s.end) break;\n // (as far as there are expressions: what follows SYS 2076, Blitz!'s own bytes, BASIC\n // never reads, the machine code never coming back to it)\n let x; try { x = expression(mem, at); } catch { break; }\n params.set(at, [x.end, js(x.e), x.e.k === 'str' ? x.e.at : null]);\n at = x.end;\n }\n break;\n }\n // what goes through the KERNAL's files and the rest: the library's\n default: c = `return b.statement(${q(s.k)}, [${(s.args ?? []).map(js).join(', ')}]${s.t ? ', ' + q(s.t.n) : ''}, s[${k}]);`;\n }\n // (and where the statement's own instruction is, for an error of its own, RETURN WITHOUT\n // GOSUB, before anything else in it notes its place)\n return (s.op !== undefined ? `b.here(0x${s.op.toString(16)}); ` : '') + c;\n });\n const out = [];\n out.push(`// ${name}, compiled from ${source} by @moonbase-machines/c64/basic-compile.js: compiled again, never edited`);\n out.push('export default {');\n out.push(` labels: ${JSON.stringify(labels)},`);\n out.push(' data: [],');\n out.push(' steps: [');\n for (const [k, s] of steps.entries()) out.push(` [0x${hex(s.at)}, ${k}, ${q(render(s))}],`);\n out.push(' ],');\n out.push(' run: {');\n for (const [k, c] of body.entries()) out.push(` ${k}: (e, s) => { const b = e.basic;${cost ? ` b.cost(${cost});` : ''} ${c} },`);\n out.push(' },');\n // each SYS's parameters by where their text starts: where it ends, its value, and a string's\n // place in memory\n out.push(' params: {');\n for (const [at, [end, v, place]] of [...params].sort((a, b) => a[0] - b[0])) out.push(` 0x${hex(at)}: [0x${hex(end)}, b => ${v}${place !== null ? `, 0x${hex(place)}` : ''}],`);\n out.push(' },');\n out.push('};');\n return out.join('\\n') + '\\n';\n}\n\n// The same, as the program itself rather than its module's text: for a program compiled as it\n// runs (moonbase's BASIC ROM's RUN, rom.js), from the very code the remake's are written\n// with. (Its steps' functions are the text's, made by the browser's or Node's own JavaScript.)\nexport function instantiate(statements, options) {\n const text = compile(statements, options);\n return new Function('return ' + text.slice(text.indexOf('export default ') + 'export default '.length).replace(/;\\s*$/, ''))();\n}\n\n// An expression of the tree as a function of BASIC (`b`, basic.js's methods), from the same\n// code the compiled programs' are: for moonbase's BASIC ROM's evaluator, an expression read from\n// BASIC's text as the original runs (basic-rom.js)\nexport const evaluator = x => new Function('b', 'return ' + js(x));\n", "// Commodore BASIC's tokenized text read into the tree made of Blitz!'s code: expressions, for\n// the text after a SYS that the machine code reads its parameters from, and statements, for\n// Goldfields' boot program, GOLDFIELDS. Shared: a remake is built with it (basic-compile.js), and\n// moonbase's BASIC ROM reads with it as the original runs (basic-rom.js).\n//\n// expression(mem, at) { e, end }: the expression at `at`, and where it ends\n// lines(mem, from) the program at `from` as statements, each line a label of its address\n// crunch(text) a typed line's text to BASIC's tokenized bytes, as the ROM's CRUNCH\n// list(bytes) a line's bytes back to the text LIST prints\n// store(mem, txttab, n, bytes) a line put in its place in the program, or taken out\n\nimport { fail, BasicError } from './numbers.js';\n\n// text BASIC cannot read: its SYNTAX ERROR when the statement is reached, as BASIC finds it only\n// then (a line changed by a POKE, say); what was wrong kept for whoever looks\nconst syntax = detail => Object.assign(new BasicError('?SYNTAX ERROR'), { detail });\n\n// the tokens from $80, as BASIC V2 has them\nexport const TOKENS = ('END FOR NEXT DATA INPUT# INPUT DIM READ LET GOTO RUN IF RESTORE GOSUB RETURN REM STOP ON WAIT LOAD SAVE VERIFY ' +\n 'DEF POKE PRINT# PRINT CONT LIST CLR CMD SYS OPEN CLOSE GET NEW TAB( TO FN SPC( THEN NOT STEP + - * / ^ AND OR > = < ' +\n 'SGN INT ABS USR FRE POS SQR RND LOG EXP COS SIN TAN ATN PEEK LEN STR$ VAL ASC CHR$ LEFT$ RIGHT$ MID$ GO').split(' ');\nconst T = Object.fromEntries(TOKENS.map((t, k) => [t, 0x80 + k]));\nconst FUNCTIONS = new Set(['SGN', 'INT', 'ABS', 'USR', 'FRE', 'POS', 'SQR', 'RND', 'LOG', 'EXP', 'COS', 'SIN', 'TAN', 'ATN', 'PEEK', 'LEN', 'STR$', 'VAL', 'ASC', 'CHR$', 'LEFT$', 'RIGHT$', 'MID$']);\n// the binary operators by their token, and how tightly each binds, as BASIC evaluates them\nconst BINARY = { [T['OR']]: ['or', 1], [T['AND']]: ['and', 2], [T['>']]: ['>', 4], [T['=']]: ['=', 4], [T['<']]: ['<', 4], [T['+']]: ['+', 5], [T['-']]: ['-', 5], [T['*']]: ['*', 6], [T['/']]: ['/', 6], [T['^']]: ['^', 8] };\n\n// a reader of the text at `at`: BASIC skips spaces between everything outside a string\nfunction reader(mem, at) {\n const r = {\n at,\n peek() { while (mem[r.at] === 0x20) r.at++; return mem[r.at]; },\n next() { const b = r.peek(); r.at++; return b; },\n end() { const b = r.peek(); return b === 0 || b === 0x3a; },\n expect(b) { if (r.next() !== b) throw syntax(`$${(r.at - 1).toString(16)}: expected $${b.toString(16)}`); },\n };\n return r;\n}\n\nconst letter = b => b >= 0x41 && b <= 0x5a, digit = b => b >= 0x30 && b <= 0x39;\n\n// a variable's name: its first two characters (the rest are BASIC's to ignore), and $ or %\nfunction name(r) {\n let n = String.fromCharCode(r.next());\n while (letter(mem(r)) || digit(mem(r))) { const c = String.fromCharCode(r.next()); if (n.length < 2) n += c; }\n if (mem(r) === 0x24 || mem(r) === 0x25) n += String.fromCharCode(r.next());\n return n;\n}\nconst mem = r => r.peek();\n\nfunction primary(r, m) {\n const b = r.peek();\n if (b === 0x22) { // a string, to its closing quote or the line's end\n r.at++; const from = r.at; while (m[r.at] && m[r.at] !== 0x22) r.at++;\n const s = String.fromCharCode(...m.subarray(from, r.at)); if (m[r.at] === 0x22) r.at++;\n return { k: 'str', s, at: from };\n }\n if (digit(b) || b === 0x2e) { // a number: digits, a point, an exponent\n let t = ''; const take = () => { t += String.fromCharCode(r.next()); };\n while (digit(r.peek()) || r.peek() === 0x2e) take();\n if (r.peek() === 0x45) { take(); if (r.peek() === T['-'] || r.peek() === T['+']) { r.at++; t += m[r.at - 1] === T['-'] ? '-' : '+'; } while (digit(r.peek())) take(); }\n return { k: 'num', v: Number(t) };\n }\n if (b === 0x28) { r.at++; const e = expr(r, m, 0); r.expect(0x29); return e; }\n if (b === T['-']) { r.at++; return { k: 'neg', a: expr(r, m, 7) }; }\n if (b === T['+']) { r.at++; return expr(r, m, 7); }\n if (b === T['NOT']) { r.at++; return { k: 'not', a: expr(r, m, 3) }; }\n if (b === T['FN']) { r.at++; const n = name(r); r.expect(0x28); const a = expr(r, m, 0); r.expect(0x29); return { k: 'fn-call', n, a }; }\n if (b >= 0x80 && FUNCTIONS.has(TOKENS[b - 0x80])) {\n r.at++; r.expect(0x28); const args = [expr(r, m, 0)];\n while (r.peek() === 0x2c) { r.at++; args.push(expr(r, m, 0)); }\n r.expect(0x29);\n return { k: 'fn', n: TOKENS[b - 0x80].toLowerCase(), args };\n }\n if (letter(b)) {\n const n = name(r);\n if (n === 'TI' || n === 'ST' || n === 'TI$') return { k: 'special', n: n.toLowerCase() };\n if (r.peek() === 0x28) { r.at++; const i = [expr(r, m, 0)]; while (r.peek() === 0x2c) { r.at++; i.push(expr(r, m, 0)); } r.expect(0x29); return { k: 'elem', n, i }; }\n return { k: 'var', n };\n }\n throw syntax(`$${r.at.toString(16)}: not an expression ($${b.toString(16)})`);\n}\n\n// an expression, by precedence: a relation of two of > = < at once (>=, <>) is one operator\nfunction expr(r, m, min) {\n let a = primary(r, m);\n for (;;) {\n const b = r.peek(), op = BINARY[b];\n if (!op || op[1] < min) return a;\n r.at++;\n let o = op[0];\n if (op[1] === 4 && BINARY[r.peek()]?.[1] === 4) { o = ({ '<>': '<>', '><': '<>', '<=': '<=', '=<': '<=', '>=': '>=', '=>': '>=' })[o + BINARY[r.peek()][0]]; r.at++; }\n a = { k: 'op', o, a, b: expr(r, m, op[1] + 1) };\n }\n}\n\n// The items of the program's DATA statements, in order, as READ finds them ($AC06): each its text,\n// a quoted string to its closing quote, else to a comma, a colon or the line's end, its leading\n// spaces passed over; whether it was quoted; and its line, for an error's IN. A REM's line, and\n// a string's, hold no DATA.\nexport function dataItems(m, from) {\n const items = [];\n for (const l of program(m, from)) {\n const b = l.bytes;\n for (let i = 0, q = false; b[i]; i++) {\n if (b[i] === 0x22) q = !q;\n if (q) continue;\n if (b[i] === REM_TOKEN) break;\n if (b[i] !== DATA_TOKEN) continue;\n for (i++; ; i++) {\n while (b[i] === 0x20) i++;\n let text = '', quoted = false;\n if (b[i] === 0x22) { quoted = true; for (i++; b[i] && b[i] !== 0x22; i++) text += String.fromCharCode(b[i]); if (b[i] === 0x22) i++; while (b[i] && b[i] !== 0x2c && b[i] !== 0x3a) i++; }\n else for (; b[i] && b[i] !== 0x2c && b[i] !== 0x3a; i++) text += String.fromCharCode(b[i]);\n items.push({ text, quoted, line: l.n });\n if (b[i] !== 0x2c) break;\n }\n if (!b[i]) break;\n }\n }\n return items;\n}\n\n// A line typed with no number (direct mode), its statements after the program's at `from`, as\n// BASIC runs it from its buffer at `at`: a jump from it goes into the program, and the program\n// ends before it. The direct statements start at the label 'direct'.\nexport function direct(m, from, at) {\n const out = lines(m, from);\n const numbers = new Map(out.filter(s => s.label !== undefined).map(s => [s.line, s.label]));\n out.push({ at: 0, k: 'end', args: [] }, { label: 'direct', line: 0xffff });\n statement(reader(m, at), m, out, n => numbers.has(n) ? numbers.get(n) : { missing: n }, null);\n out.push({ at: 0, k: 'end', args: [] });\n return out;\n}\n\nexport function expression(m, at) {\n const r = reader(m, at), e = expr(r, m, 0);\n return { e, end: r.at };\n}\n\n// The program from `from`, BASIC's own: each line its next line's address, its number, its\n// text, a zero; two zeros end it. The next line is the one after the zero, as BASIC links them\n// again when it loads a program (GOLDFIELDS was saved from elsewhere). Each statement as the\n// tree has Blitz!'s, `to` a line's address; the lines numbered as `numbers` says.\nexport function lines(m, from) {\n const out = [], numbers = new Map(), order = [];\n for (let at = from; m[at] | m[at + 1] << 8; at = m.indexOf(0, at + 4) + 1) { numbers.set(m[at + 2] | m[at + 3] << 8, at); order.push(at); }\n // (a line not there, a jump's error when it is taken: UNDEF'D STATEMENT, as BASIC finds it then)\n const line = n => numbers.has(n) ? numbers.get(n) : { missing: n };\n for (const [k, at] of order.entries()) {\n out.push({ label: at, line: m[at + 2] | m[at + 3] << 8 });\n const next = order[k + 1] ?? null, r = reader(m, at + 4);\n statement(r, m, out, line, next);\n }\n return out;\n}\n\n// the statements of one line from the reader's place, to its end\nfunction statement(r, m, out, line, next) {\n while (!r.end() || r.peek() === 0x3a) {\n if (r.peek() === 0x3a) { r.at++; continue; }\n const at = r.at;\n // (a statement that cannot be read is its error when BASIC reaches it, and the rest of\n // the line goes with it)\n try { one(r, m, out, line, next, at); }\n catch (err) {\n if (!(err instanceof BasicError)) throw err;\n out.push({ at, k: 'fail', what: /^\\?(.*) ERROR$/.exec(err.message)[1], args: [] });\n while (m[r.at]) r.at++;\n }\n }\n}\nfunction one(r, m, out, line, next, at) {\n {\n const b = r.next(), word = b >= 0x80 ? TOKENS[b - 0x80] : null;\n const say = x => out.push({ at, ...x });\n const target = () => { const v = expression(m, r.at); r.at = v.end; return v.e; };\n // PRINT's items, each with what follows it: ; nothing, , a zone, else a new line; none at\n // all, a new line\n const printItems = () => {\n if (r.end()) { say({ k: 'newline', args: [] }); return; }\n while (!r.end()) {\n const b2 = r.peek();\n if (b2 === T['TAB('] || b2 === T['SPC(']) { r.at++; const e = target(); r.expect(0x29); say({ k: b2 === T['TAB('] ? 'tab' : 'spc', args: [e] }); }\n else if (b2 === 0x3b) { r.at++; continue; }\n else if (b2 === 0x2c) { r.at++; say({ k: 'print-comma', args: [] }); continue; }\n else say({ k: 'print', args: [target()] });\n if (r.end()) { say({ k: 'newline', args: [] }); break; }\n if (r.peek() === 0x3b) { r.at++; if (r.end()) break; }\n }\n };\n if (!word || word === 'LET') { // an assignment\n if (word) r.peek(); else r.at--;\n const t = primary(r, m); r.expect(T['=']);\n say({ k: 'let', t, e: target() });\n } else if (word === 'IF') {\n const e = target();\n if (r.peek() === T['GOTO']) { r.at++; say({ k: 'if-goto', e, to: line(number(r)) }); return; }\n r.expect(T['THEN']);\n if (digit(r.peek())) { say({ k: 'if-goto', e, to: line(number(r)) }); return; }\n // the rest of the line runs when it holds: on to the next line when not\n say({ k: 'unless', e, to: next ?? -1 });\n } else if (word === 'GOTO' || word === 'GOSUB') say({ k: word.toLowerCase(), to: line(number(r)) });\n else if (word === 'GO') { r.expect(T['TO']); say({ k: 'goto', to: line(number(r)) }); } // GO TO\n // (a token past the statements', $A3 on, TAB( to GO: no statement begins with one)\n else if (b >= 0xa3) throw syntax(`$${at.toString(16)}: ${word} begins no statement`);\n // DATA, its items read by READ (`dataItems`), passed over to its statement's end; REM, the rest\n // of its line; RESTORE\n else if (word === 'DATA') { let q = false; while (m[r.at] && (q || m[r.at] !== 0x3a)) { if (m[r.at] === 0x22) q = !q; r.at++; } }\n else if (word === 'REM') { while (m[r.at]) r.at++; }\n else if (word === 'RESTORE') say({ k: 'restore', args: [] });\n else if (word === 'DIM') { // DIM, each array and its sizes in turn\n for (;;) { const t = primary(r, m); if (t.k !== 'elem') fail('SYNTAX'); say({ k: 'dim', n: t.n, sizes: t.i }); if (r.peek() !== 0x2c) break; r.at++; }\n }\n else if (word === 'DEF') { // DEF FN name(parameter) = its expression\n r.expect(T['FN']); const n = name(r); r.expect(0x28); const p = name(r); r.expect(0x29); r.expect(T['=']);\n say({ k: 'def', n, p, e: target() });\n }\n else if (word === 'INPUT') { // INPUT, a prompt (a string, then ;) if any, and its variables\n let prompt = null;\n if (r.peek() === 0x22) { const p = primary(r, m); prompt = p.s; if (r.next() !== 0x3b) fail('SYNTAX'); }\n const targets = [];\n for (;;) { const t = primary(r, m); if (t.k !== 'var' && t.k !== 'elem') fail('SYNTAX'); targets.push(t); if (r.peek() !== 0x2c) break; r.at++; }\n say({ k: 'input-keys', prompt, targets });\n }\n else if (word === 'READ') { // READ, each variable (or element) in turn\n for (;;) { const t = primary(r, m); if (t.k !== 'var' && t.k !== 'elem') fail('SYNTAX'); say({ k: t.n.endsWith('$') ? 'read$' : 'read', t }); if (r.peek() !== 0x2c) break; r.at++; }\n }\n else if (word === 'ON') { // ON e GOTO or GOSUB, its lines\n const e = target(), go = r.next();\n if (go !== T['GOTO'] && go !== T['GOSUB']) fail('SYNTAX');\n const to = [line(number(r))]; while (r.peek() === 0x2c) { r.at++; to.push(line(number(r))); }\n say({ k: 'on', e, to, gosub: go === T['GOSUB'] });\n }\n else if (word === 'RETURN' || word === 'CLR' || word === 'END' || word === 'STOP' || word === 'NEW' || word === 'CONT') say({ k: word.toLowerCase(), args: [] });\n // RUN, from the start or a line; LIST, all of it or a range (a number, -, a number, either\n // left out), the numbers as LINGET reads them\n else if (word === 'RUN') say(digit(r.peek()) ? { k: 'run', to: line(number(r)), args: [] } : { k: 'run', args: [] });\n else if (word === 'LIST') { // ($A6A4) the first number or 0; after a -, the last or 0; an end of 0 the program's end\n const from = number(r); let to = from;\n if (r.peek() === T['-']) { r.at++; to = number(r); }\n if (!r.end()) fail('SYNTAX');\n say({ k: 'list', args: [{ k: 'num', v: from }, { k: 'num', v: to || 0xffff }] });\n }\n else if (word === 'POKE') { const a = target(); r.expect(0x2c); say({ k: 'poke', a, v: target() }); }\n else if (word === 'SYS') { // its address, and the rest of its text for the machine code\n const e = target(), text = r.at; while (m[r.at] && m[r.at] !== 0x3a) r.at++;\n say({ k: 'sys', e, text, end: r.at, words: '' });\n } else if (word === 'LOAD') {\n const args = [target()]; while (r.peek() === 0x2c) { r.at++; args.push(target()); }\n say({ k: 'load', args });\n } else if (word === 'GET' && r.peek() === 0x23) { // GET#: its file, then each variable, a character each\n r.at++; const n = target(); r.expect(0x2c);\n const targets = [primary(r, m)]; while (r.peek() === 0x2c) { r.at++; targets.push(primary(r, m)); }\n say({ k: 'get#', args: [n], targets });\n } else if (word === 'GET') say({ k: 'get', t: primary(r, m) });\n else if (word === 'INPUT#') { // INPUT#: its file, then its variables, as Blitz!'s INPUT# has them\n const n = target(); r.expect(0x2c);\n const targets = [primary(r, m)]; while (r.peek() === 0x2c) { r.at++; targets.push(primary(r, m)); }\n say({ k: 'input#', args: [n] });\n targets.forEach((t, i) => say({ k: i ? 'input-item' : 'input', t, last: i === targets.length - 1 }));\n }\n else if (word === 'WAIT') { // WAIT place, mask[, flip]\n const args = [target()]; r.expect(0x2c); args.push(target());\n if (r.peek() === 0x2c) { r.at++; args.push(target()); }\n say({ k: 'wait', args });\n }\n else if (word === 'SAVE' || word === 'VERIFY') { // its name, device and secondary address, each if given\n const args = r.end() ? [] : [target()]; while (r.peek() === 0x2c) { r.at++; args.push(target()); }\n say({ k: word.toLowerCase(), args });\n }\n else if (word === 'FOR') {\n const v = name(r); r.expect(T['=']); const from = target(); r.expect(T['TO']);\n const to = target(), step = r.peek() === T['STEP'] ? (r.at++, target()) : undefined;\n say({ k: 'let', t: { k: 'var', n: v }, e: from }); out.push({ at, k: 'for', v, to, ...step ? { step } : {} });\n } else if (word === 'NEXT') { // NEXT, or NEXT and its variables, each in turn: NEXT J,I\n if (!letter(r.peek())) { say({ k: 'next', v: null, args: [] }); return; }\n for (;;) { say({ k: 'next-var', v: name(r), args: [] }); if (r.peek() !== 0x2c) break; r.at++; }\n }\n else if (word === 'PRINT') printItems();\n // CMD: the output to a file, and PRINT's items after a comma; PRINT#, the same, and then the\n // output back to the screen (Microsoft's PRINTN: CMD, then IODONE)\n else if (word === 'CMD' || word === 'PRINT#') {\n say({ k: 'print#', args: [target()] });\n if (r.peek() === 0x2c) r.at++; else if (!r.end()) fail('SYNTAX');\n printItems();\n if (word === 'PRINT#') say({ k: 'clrchn', args: [] });\n }\n else if (word === 'OPEN') { const args = r.end() ? [] : [target()]; while (r.peek() === 0x2c) { r.at++; args.push(target()); } say({ k: 'open', args }); }\n else if (word === 'CLOSE') say({ k: 'close', args: [target()] }); else throw new Error(`$${at.toString(16)}: ${word} is not handled`);\n }\n}\n\nconst number = r => { let n = 0; while (digit(r.peek())) n = n * 10 + r.next() - 0x30; return n; };\n\n// The keywords as BASIC's ROM keeps them (RESLST, $A09E): each one's characters, its last with\n// its top bit set, in token order, then a zero: 256 bytes exactly, which LIST indexes with the\n// Y register, so that past GO it comes round to the start again\nconst RESLST = [...TOKENS.flatMap(t => [...t].map((c, i, a) => c.charCodeAt(0) | (i === a.length - 1 ? 0x80 : 0))), 0];\nconst PRINT_TOKEN = T['PRINT'], DATA_TOKEN = T['DATA'], REM_TOKEN = T['REM'];\n\n// CRUNCH ($A579): a line's text, as typed (PETSCII, after its number), to the bytes BASIC keeps,\n// its keywords as tokens, as the ROM makes them, its quirks too. Outside a string, a space, a\n// digit, : and ; are kept as they are, ? is PRINT, and a shifted character is dropped (pi is\n// kept); else the keywords are tried in their order, a character at a time, the first that\n// matches taken (so INPUT# before INPUT, and TO inside TOTAL), a shifted letter ending one early\n// (P shifted-R is PRINT); no keyword, and the character is kept. A string is kept to its closing\n// quote, the rest of a line after REM all of it, and after DATA all but a string's quotes to the\n// next colon. The bytes end with the line's zero.\nexport function crunch(text) {\n const buf = [...text, 0], out = [];\n let x = 0, dores = 0;\n const stuff = a => {\n out.push(a); x++;\n if (a === 0) return 'done';\n if (a === 0x3a) dores = 0; else if (a === DATA_TOKEN) dores = DATA_TOKEN - 0x3a;\n return a === REM_TOKEN ? 'rem' : null;\n };\n // a string's or REM's characters, to the end character (a quote, or the line's zero)\n const copy = end => { for (;;) { const ch = buf[x]; if (ch === 0 || ch === end) return stuff(ch); out.push(ch); x++; } };\n for (;;) {\n let ch = buf[x], r = null;\n if (ch >= 0x80) { if (ch !== 0xff) { x++; continue; } r = stuff(ch); }\n else if (ch === 0x20) r = stuff(ch);\n else if (ch === 0x22) { out.push(ch); x++; r = copy(0x22); }\n else if (dores & 0x40) r = stuff(ch);\n else if (ch === 0x3f) r = stuff(PRINT_TOKEN);\n else if (ch >= 0x30 && ch < 0x3c) r = stuff(ch);\n else {\n // the keywords tried: the next character against the list's, until a difference of $80\n // (the keyword's last, or a shifted letter in the text) ends it, or another moves on\n // (one place in the list, as the ROM's Y: a keyword that does not match is passed from\n // where it stopped matching, which a shifted letter matching a keyword's last may carry\n // into the next)\n let y = 0, count = 0, found = null;\n for (;;) {\n let k = x;\n for (;;) { const d = (buf[k] - RESLST[y]) & 0xff; if (d === 0) { k++; y++; continue; } if (d === 0x80) found = { token: 0x80 | count, end: k }; break; }\n if (found) break;\n count++;\n do y++; while (!(RESLST[y - 1] & 0x80));\n if (RESLST[y] === 0) break;\n }\n if (found) { x = found.end; r = stuff(found.token); }\n else r = stuff(ch);\n }\n if (r === 'done') return out;\n if (r === 'rem' && copy(0) === 'done') return out;\n }\n}\n\n// LIST's text of a line ($A71A): its bytes after the number as BASIC prints them, each token\n// its keyword's characters, and inside a string, the bytes as they are; pi as its character.\n// Past GO the keywords come round again, Y being a byte: $CC is the table's last zero, which\n// printed ends the keyword at once (CHROUT leaves Z set), and $CD on are FOR, NEXT and the rest.\n// Even after REM a byte of $80 or more is a keyword's: BASIC's own oddity.\nexport function list(bytes) {\n const out = [];\n let quote = false;\n for (const b of bytes) {\n if (b === 0) break;\n if (b < 0x80 || b === 0xff || quote) { if (b === 0x22) quote = !quote; out.push(b); continue; }\n let n = b - 0x7f, y = 0xff;\n while (--n) { do y = (y + 1) & 0xff; while (!(RESLST[y] & 0x80)); }\n for (;;) { y = (y + 1) & 0xff; const c = RESLST[y]; if (c & 0x80) { out.push(c & 0x7f); break; } out.push(c); if (!c) break; }\n }\n return out;\n}\n\n// The program kept at `txttab` in `mem`: a line put in by its number, in its place, over one\n// of the same number, or taken out when it is empty, as BASIC's line entry does ($A49C), and\n// every line linked to the next again (LINKPRG, $A533). Gives the program's end, where the\n// variables start (VARTAB).\nexport function program(mem, txttab) {\n const lines = [];\n for (let at = txttab; mem[at] | mem[at + 1] << 8; ) {\n const end = mem.indexOf(0, at + 4);\n lines.push({ n: mem[at + 2] | mem[at + 3] << 8, bytes: [...mem.subarray(at + 4, end + 1)] });\n at = end + 1;\n }\n return lines;\n}\nexport function store(mem, txttab, n, bytes) {\n const lines = program(mem, txttab).filter(l => l.n !== n);\n if (bytes.length > 1) lines.push({ n, bytes });\n lines.sort((a, b) => a.n - b.n);\n let at = txttab;\n for (const l of lines) {\n const next = at + 4 + l.bytes.length;\n mem.set([next & 0xff, next >> 8, l.n & 0xff, l.n >> 8, ...l.bytes], at);\n at = next;\n }\n mem[at] = 0; mem[at + 1] = 0;\n return at + 2;\n}\n", "// Commodore BASIC's rules for numbers, held once for every layer that keeps them: the remake's\n// BASIC (basic.js, on JavaScript's numbers) and moonbase's BASIC ROM (basic-rom.js, on the ROM's\n// five-byte floats). BASIC's errors in its own words; a whole number of 16 bits; a number as FOUT\n// writes it and as VAL reads it; and RND's numbers as moonbase gives them, the same on every line.\n//\n// (FOUT and VAL are held to the ROM's.)\n\nimport { Floats, CONSTANTS, pack } from './float.js';\n\n// (an error's BASIC line, where it is not the statement's own, is its `basicLine`: WebKit gives\n// every Error a `line` of its own, the line of the JavaScript it was thrown from)\nexport class BasicError extends Error {}\n// BASIC's error messages, by their number in its table (the X its error routine takes, $A437, less 1)\nexport const ERRORS = ['TOO MANY FILES', 'FILE OPEN', 'FILE NOT OPEN', 'FILE NOT FOUND', 'DEVICE NOT PRESENT', 'NOT INPUT FILE', 'NOT OUTPUT FILE', 'MISSING FILE NAME',\n 'ILLEGAL DEVICE NUMBER', 'NEXT WITHOUT FOR', 'SYNTAX', 'RETURN WITHOUT GOSUB', 'OUT OF DATA', 'ILLEGAL QUANTITY', 'OVERFLOW', 'OUT OF MEMORY', 'UNDEF\\'D STATEMENT',\n 'BAD SUBSCRIPT', 'REDIM\\'D ARRAY', 'DIVISION BY ZERO', 'ILLEGAL DIRECT', 'TYPE MISMATCH', 'STRING TOO LONG', 'FILE DATA', 'FORMULA TOO COMPLEX', 'CAN\\'T CONTINUE',\n 'UNDEF\\'D FUNCTION', 'VERIFY', 'LOAD', 'BREAK'];\nexport const fail = what => { throw new BasicError('?' + what + ' ERROR'); };\n\n// A number as BASIC writes it (FOUT): a space for its sign when it is not negative, nine\n// significant digits, no 0 before the point, and an exponent below 0.01 or from 1E+09 on. The\n// number as BASIC's five bytes hold it, and FOUT's own steps on them (float.js, held to\n// Microsoft's and Commodore's), its last digit as theirs: JavaScript's rounding of nine digits\n// differs from it for one number in twenty.\nconst page = new Uint8Array(0x10000), floats = new Floats({ read: a => page[a], write: (a, v) => { page[a] = v; } });\nfor (const [at, bytes] of Object.entries(CONSTANTS)) page.set(bytes, +at);\nexport function fout(x) {\n const b = pack(x);\n if (!b[0] || Math.abs(x) < 2 ** -128) return ' 0';\n if (b[0] > 255) fail('OVERFLOW');\n page[0x61] = b[0]; page[0x62] = b[1] | 0x80; page.set(b.slice(2), 0x63); page[0x66] = x < 0 ? 0xff : 0; page[0x70] = 0;\n floats.fout();\n let s = ''; for (let a = 0x100; page[a]; a++) s += String.fromCharCode(page[a]);\n return s;\n}\n\n// VAL: the number at a string's start, BASIC's way: spaces skipped, a sign, digits, a point, an\n// exponent; 0 if there is none\nexport function val(s) {\n const t = s.replace(/ /g, ''), m = /^[+-]?(\\d*\\.?\\d*)(E[+-]?\\d+)?/.exec(t);\n const n = m && m[1] && m[1] !== '.' ? Number(m[0].replace(/E$/, '')) : 0;\n return Number.isFinite(n) ? n : 0;\n}\n\n// A number's text where INPUT reads one, as FIN reads it ($BCF3): spaces passed over anywhere,\n// as CHRGET passes them; a sign; digits; a point and digits; an E, a sign and digits. Where it\n// ends, for INPUT to look at what follows (a comma, a colon or the line's end, or the item is bad)\nexport function scanNumber(s, k) {\n let text = '';\n const sp = () => { while (s[k] === ' ') k++; }, digits = () => { while (s[k] >= '0' && s[k] <= '9') { text += s[k++]; sp(); } };\n sp();\n if (s[k] === '-' || s[k] === '+') { text += s[k++]; sp(); }\n digits();\n if (s[k] === '.') { text += s[k++]; sp(); digits(); }\n if (s[k] === 'E') { text += s[k++]; sp(); if (s[k] === '-' || s[k] === '+') { text += s[k++]; sp(); } digits(); }\n return { text, end: k };\n}\n\nexport const int16 = x => { const n = Math.floor(x); if (n < -32768 || n > 32767) fail('ILLEGAL QUANTITY'); return n; };\n\n// the seed's random numbers: a 32-bit state, each number its top 31 bits as a fraction, which\n// BASIC's five-byte floats hold exactly\nexport const seedRandom = seed => Math.imul(seed, 2654435761) >>> 0;\nexport const nextRandom = s => (((Math.imul(s, 1664525) + 1013904223) >>> 0) & 0xfffffffe) >>> 0;\n", "// Commodore BASIC's floating point, moonbase's own: the five-byte numbers BASIC keeps, and its\n// arithmetic on them, computing what BASIC's ROM computes, to the bit. It works where the ROM's\n// does, in the zero page, so that moonbase's BASIC ROM (basic-rom.js) can answer a program's\n// call into the ROM's arithmetic at its own address and leave memory as the ROM leaves it. Every\n// routine here is held to Commodore's, run on the processor, from thousands of random starting\n// states.\n//\n// const f = new Floats(memory) memory: read(address) and write(address, value)\n//\n// A number in memory is five bytes: its exponent (128 + the power of two, 0 for zero), then\n// its 32-bit mantissa, highest byte first, whose top bit, always 1, is the sign's place. In the\n// accumulator (FAC, $61 to $66) the mantissa's top bit is 1 and the sign has its own byte, $66;\n// a sixth byte, $70, holds the bits below the mantissa, which an operation keeps, and only\n// storing a number (or ROUND) rounds them in. The other operand (ARG, $69 to $6E) is the same,\n// its own low bits at $56 while an addition lines the two up. $6F is the two signs' EOR.\n//\n// The ROM's routines have their ways, and these keep them: the low bits are kept, not rounded,\n// until a number is stored; a shift by whole bytes brings in $68 at the top, whatever an earlier\n// routine left there; a shift's length depends on the carry it is entered with. Each method\n// says the ROM's address it stands for; its results are the ROM's, in memory and in the\n// registers its callers read (`regs`).\nexport const FAC = 0x61, ARG = 0x69, FACOV = 0x70, ARGOV = 0x56, ARISGN = 0x6f, BITS = 0x68, RESHO = 0x26;\n\n// Constants of BASIC's that its routines take from the ROM, by their place there: their values,\n// as five bytes, each named as Microsoft's source names it (BASIC-M6502). A game that reads one\n// reads it from moonbase's ROM image too (rom.js).\nconst words = ns => ns.flatMap(n => [n >>> 24 & 0xff, n >>> 16 & 0xff, n >>> 8 & 0xff, n & 0xff]);\nexport const CONSTANTS = {\n 0xb9bc: [0x81, 0x00, 0x00, 0x00, 0x00], // 1 (Microsoft's FONE)\n 0xbf11: [0x80, 0x00, 0x00, 0x00, 0x00], // 0.5 (FHALF)\n 0xbaf9: [0x84, 0x20, 0x00, 0x00, 0x00], // 10 (TENZC)\n // LOG's: its series' (a count, then the coefficients of x squared, highest first, for POLY1),\n // the square roots of a half and of two, -0.5, and the logarithm of two (LOGCN2, SQRHLF, SQRTWO,\n // NEGHLF, LOG2)\n 0xb9c1: [0x03, 0x7f, 0x5e, 0x56, 0xcb, 0x79, 0x80, 0x13, 0x9b, 0x0b, 0x64, 0x80, 0x76, 0x38, 0x93, 0x16, 0x82, 0x38, 0xaa, 0x3b, 0x20],\n 0xb9d6: [0x80, 0x35, 0x04, 0xf3, 0x34], // 0.707...\n 0xb9db: [0x81, 0x35, 0x04, 0xf3, 0x34], // 1.414...\n 0xb9e0: [0x80, 0x80, 0x00, 0x00, 0x00], // -0.5\n 0xb9e5: [0x80, 0x31, 0x72, 0x17, 0xf8], // 0.693...\n // EXP's: one over the logarithm of two, and its series (for POLY2) (LOGEB2, EXPCON)\n 0xbfbf: [0x81, 0x38, 0xaa, 0x3b, 0x29], // 1.442...\n 0xbfc4: [0x07, 0x71, 0x34, 0x58, 0x3e, 0x56, 0x74, 0x16, 0x7e, 0xb3, 0x1b, 0x77, 0x2f, 0xee, 0xe3, 0x85, 0x7a, 0x1d, 0x84, 0x1c, 0x2a,\n 0x7c, 0x63, 0x59, 0x58, 0x0a, 0x7e, 0x75, 0xfd, 0xe7, 0xc6, 0x80, 0x31, 0x72, 0x18, 0x10, 0x81, 0x00, 0x00, 0x00, 0x00],\n // FOUT's: the powers of ten its digits are counted out with, and TI$'s steps of the clock (hours\n // to seconds, in jiffies), each a 32-bit whole number, alternately subtracted and added (FOUTBL)\n 0xbf16: words([-100000000, 10000000, -1000000, 100000, -10000, 1000, -100, 10, -1, -2160000, 216000, -36000, 3600, -600, 60]),\n // and the bounds it brings a number between, 99999999.9 and 999999999 (both rounded up a\n // little), and 1E9, a small number's first step up (NZ0999, NZ9999, NZMIL)\n 0xbdb3: [0x9b, 0x3e, 0xbc, 0x1f, 0xfd],\n 0xbdb8: [0x9e, 0x6e, 0x6b, 0x27, 0xfd],\n 0xbdbd: [0x9e, 0x6e, 0x6b, 0x28, 0x00],\n // SIN's and COS's: a half pi, two pi, a quarter, and SIN's series (for POLY1) (PI2, TWOPI, FR4,\n // SINCON)\n 0xe2e0: [0x81, 0x49, 0x0f, 0xda, 0xa2], // 1.570...\n 0xe2e5: [0x83, 0x49, 0x0f, 0xda, 0xa2], // 6.283...\n 0xe2ea: [0x7f, 0x00, 0x00, 0x00, 0x00], // 0.25\n 0xe2ef: [0x05, 0x84, 0xe6, 0x1a, 0x2d, 0x1b, 0x86, 0x28, 0x07, 0xfb, 0xf8, 0x87, 0x99, 0x68, 0x89, 0x01, 0x87, 0x23, 0x35, 0xdf, 0xe1,\n 0x86, 0xa5, 0x5d, 0xe7, 0x28, 0x83, 0x49, 0x0f, 0xda, 0xa2],\n};\n\n// a number as the five bytes BASIC stores, from JavaScript's (for tests and for constants)\nexport function pack(x) {\n if (x === 0) return [0, 0, 0, 0, 0];\n const a = Math.abs(x);\n let ex = Math.floor(Math.log2(a)) + 1, f = a / 2 ** ex;\n if (f >= 1) { f /= 2; ex++; } else if (f < 0.5) { f *= 2; ex--; }\n let m = Math.round(f * 2 ** 32); if (m >= 2 ** 32) { m /= 2; ex++; }\n return [ex + 128, (m >>> 24 & 0x7f) | (x < 0 ? 0x80 : 0), m >>> 16 & 0xff, m >>> 8 & 0xff, m & 0xff];\n}\n// a number into the accumulator as BASIC holds it: $61 its exponent, $62 to $65 its mantissa,\n// $66 its sign, its low bits ($70) 0\nexport function setFac(memory, x) {\n const b = pack(x);\n memory.write(0x70, 0);\n if (!b[0]) { for (let a = 0x61; a <= 0x66; a++) memory.write(a, 0); return; }\n memory.write(0x61, b[0]); memory.write(0x62, b[1] | 0x80); memory.write(0x63, b[2]); memory.write(0x64, b[3]); memory.write(0x65, b[4]); memory.write(0x66, x < 0 ? 0xff : 0);\n}\n// and back: the number five bytes hold\nexport function unpack(b) {\n if (!b[0]) return 0;\n const m = ((b[1] | 0x80) * 2 ** 24) + b[2] * 65536 + b[3] * 256 + b[4];\n return (b[1] & 0x80 ? -1 : 1) * m / 2 ** 32 * 2 ** (b[0] - 128);\n}\n\nexport class Floats {\n constructor(memory) { this.mem = memory; }\n r(a) { return this.mem.read(a & 0xffff); }\n w(a, v) { this.mem.write(a & 0xffff, v & 0xff); }\n // a register's mantissa, four bytes from `at`, as a number, and back\n mant(at) { return ((this.r(at) * 256 + this.r(at + 1)) * 256 + this.r(at + 2)) * 256 + this.r(at + 3); }\n setMant(at, m) { this.w(at, m / 2 ** 24); this.w(at + 1, m / 65536); this.w(at + 2, m / 256); this.w(at + 3, m); }\n // (the FAC's value, for this module's own use and for tests)\n fac() { const e = this.r(FAC); return e ? (this.r(0x66) & 0x80 ? -1 : 1) * (this.mant(0x62) + this.r(FACOV) / 256) / 2 ** 32 * 2 ** (e - 128) : 0; }\n\n // ---- moving numbers ----\n\n // CONUPK ($BA8C): ARG from memory at A/Y; $6F the two signs' EOR; A the FAC's exponent\n conupk(at) {\n this.w(0x22, at); this.w(0x23, at >> 8);\n const b = [0, 1, 2, 3, 4].map(i => this.r(at + i));\n this.w(0x6d, b[4]); this.w(0x6c, b[3]); this.w(0x6b, b[2]); this.w(0x6e, b[1]);\n this.w(ARISGN, b[1] ^ this.r(0x66)); this.w(0x6a, b[1] | 0x80); this.w(ARG, b[0]);\n return { a: this.r(FAC), y: 0 };\n }\n // MOVFM ($BBA2): the FAC from memory at A/Y, its low bits 0; A its exponent\n movfm(at) {\n this.w(0x22, at); this.w(0x23, at >> 8);\n const b = [0, 1, 2, 3, 4].map(i => this.r(at + i));\n this.w(0x65, b[4]); this.w(0x64, b[3]); this.w(0x63, b[2]); this.w(0x66, b[1]); this.w(0x62, b[1] | 0x80); this.w(FAC, b[0]); this.w(FACOV, 0);\n return { a: b[0], y: 0 };\n }\n // MOVMF ($BBD4): the FAC, rounded, into memory at X/Y; its low bits 0 after\n movmf(at) {\n this.round();\n this.w(0x22, at); this.w(0x23, at >> 8);\n this.w(at + 4, this.r(0x65)); this.w(at + 3, this.r(0x64)); this.w(at + 2, this.r(0x63));\n this.w(at + 1, (this.r(0x66) | 0x7f) & this.r(0x62)); this.w(at, this.r(FAC)); this.w(FACOV, 0);\n return { a: this.r(FAC), y: 0 };\n }\n // MOVFA ($BBFC): the FAC from ARG; MOVAF ($BC0C): ARG from the FAC, rounded first\n movfa() { this.w(0x66, this.r(0x6e)); for (let i = 5; i >= 1; i--) this.w(0x60 + i, this.r(0x68 + i)); this.w(FACOV, 0); return { a: this.r(ARG), x: 0 }; }\n movaf() { this.round(); return this.movef(); }\n // ($BC0F, MOVAF after its ROUND: the FAC copied as it is)\n movef() { for (let i = 6; i >= 1; i--) this.w(0x68 + i, this.r(0x60 + i)); this.w(FACOV, 0); return { a: this.r(FAC), x: 0 }; }\n\n // ---- rounding, sign, comparing ----\n\n // ROUND ($BC1B): the low bits' top bit added in at the mantissa's foot; the low bits shifted\n // left, as the ROM leaves them; a carry out of the mantissa a power of two more\n round() {\n if (!this.r(FAC)) return;\n const ov = this.r(FACOV); this.w(FACOV, ov << 1);\n if (!(ov & 0x80)) return;\n const m = this.mant(0x62) + 1;\n if (m < 2 ** 32) { this.setMant(0x62, m); return; }\n this.setMant(0x62, 0);\n this.carryIn(1);\n }\n // ($B938) the exponent one more, and the mantissa and low bits shifted right with C in at the top\n carryIn(c) {\n const e = this.r(FAC) + 1; if (e > 255) throw overflow();\n this.w(FAC, e);\n const m = this.mant(0x62), ov = this.r(FACOV);\n this.setMant(0x62, Math.floor(m / 2) + (c ? 2 ** 31 : 0)); this.w(FACOV, (ov >> 1) | ((m & 1) << 7));\n }\n // SIGN ($BC2B): 0 for zero, 1 for positive, $FF for negative\n sign() { return !this.r(FAC) ? 0 : this.r(0x66) & 0x80 ? 0xff : 1; }\n // FCOMP ($BC5B, the address in A and Y; $BC5D with $24 set): the FAC against a number in memory,\n // 1 if the FAC is more, $FF if less, 0 if the same; the FAC's low bits, rounded, count only in\n // the mantissa's last byte, as the ROM's subtraction there borrows them\n fcomp(at) { return this.compare(at).a; }\n // (and Y as FCOMP leaves it: the byte it decided at, 1 for the exponent or the sign, 4 if equal)\n compare(at) {\n this.w(0x24, at); this.w(0x25, at >> 8);\n const ex = this.r(at);\n if (!ex) return { a: this.sign(), y: 1 };\n const b1 = this.r(at + 1), s = this.r(0x66);\n const memMore = (more, y) => { const neg = s & 0x80 ? 1 : 0; return { a: (more ? neg ^ 1 : neg) ? 0xff : 1, y }; }; // more: memory > FAC in size\n if ((b1 ^ s) & 0x80) return { a: s & 0x80 ? 0xff : 1, y: 1 };\n if (ex !== this.r(FAC)) return memMore(ex > this.r(FAC), 1);\n for (const [k, fac] of [[1, 0x62], [2, 0x63], [3, 0x64]]) {\n const mb = k === 1 ? b1 | 0x80 : this.r(at + k), fb = this.r(fac);\n if (mb !== fb) return memMore(mb > fb, k);\n }\n const borrow = this.r(FACOV) > 0x7f ? 1 : 0, d = this.r(at + 4) - this.r(0x65) - borrow;\n if ((d & 0xff) === 0) return { a: 0, y: 4 };\n return memMore(d >= 0, 4);\n }\n\n // ---- adding ----\n\n // FADD ($B867, the address in A and Y: memory plus the FAC; $B86A, ARG plus the FAC, A the\n // FAC's exponent): the result normalised, its low bits kept\n fadd(at) { this.conupk(at); return this.faddt(); }\n // FSUB ($B850): memory minus the FAC; FSUBT ($B853): ARG minus the FAC\n fsub(at) { this.conupk(at); return this.fsubt(); }\n fsubt() { this.w(0x66, this.r(0x66) ^ 0xff); this.w(ARISGN, this.r(0x66) ^ this.r(0x6e)); return this.faddt(); }\n faddt() {\n if (!this.r(FAC)) return this.movfa();\n this.w(ARGOV, this.r(FACOV));\n const ey = this.r(ARG);\n if (!ey) return { a: 0 };\n let d = (ey - this.r(FAC)) & 0xff, x = ARG, c = ey >= this.r(FAC) ? 1 : 0, a = 0;\n if (d !== 0) {\n if (c) { // ARG the larger: the FAC takes its exponent and sign, and is the one shifted\n this.w(FAC, ey); this.w(0x66, this.r(0x6e));\n d = (~d + 1) & 0xff; this.w(ARGOV, 0); x = FAC;\n } else this.w(FACOV, 0);\n // (under a byte by the ROM's own signed test of A - $F9, $B897: bit by bit, the first\n // shifted plainly, the rest keeping the top bit, $B89B, which for a count the test misreads\n // is up to 255 bits; otherwise whole bytes first, $B862)\n a = ((d - 0xf9) & 0x80) ? this.shift(x, d, 0) : this.bitShift(x, d, this.r(FACOV), false);\n }\n if (this.r(ARISGN) & 0x80) {\n // the signs differ: the one not shifted less the one shifted, into the FAC\n const minus = x === ARG ? FAC : ARG;\n const low = this.r(ARGOV) - a, lowByte = low & 0xff, borrow = low < 0 ? 1 : 0;\n const m = this.mant(minus + 1) - this.mant(x + 1) - borrow;\n this.w(FACOV, lowByte); this.setMant(0x62, (m + 2 ** 32) % 2 ** 32);\n if (m < 0) this.negate();\n return this.normal();\n }\n // the same signs: the sum, a carry out a power of two more; with the exponents the same,\n // the carry their comparison left adds one more to the low bits ($B8FE)\n const low = a + this.r(ARGOV) + (d === 0 ? 1 : 0), m = this.mant(0x62) + this.mant(0x6a) + (low > 255 ? 1 : 0);\n this.w(FACOV, low); this.setMant(0x62, m % 2 ** 32);\n if (m >= 2 ** 32) this.carryIn(1);\n return { a: this.r(FAC) };\n }\n // the FAC's mantissa and low bits two's-complemented, its sign turned over ($B947); $B94D the\n // same without the sign\n negate() { this.w(0x66, this.r(0x66) ^ 0xff); this.complement(); }\n complement() {\n const ov = (~this.r(FACOV) & 0xff) + 1, m = 2 ** 32 - 1 - this.mant(0x62) + (ov > 255 ? 1 : 0);\n this.w(FACOV, ov); this.setMant(0x62, m % 2 ** 32);\n }\n // NORMAL ($B8D7): the mantissa shifted up until its top bit is 1, a byte at a time and then a\n // bit, the low bits coming in below it, and the exponent that much less; zero if it was zero,\n // or if the exponent would go under\n normal() {\n let n = 0;\n while (!this.r(0x62)) {\n this.w(0x62, this.r(0x63)); this.w(0x63, this.r(0x64)); this.w(0x64, this.r(0x65)); this.w(0x65, this.r(FACOV)); this.w(FACOV, 0);\n n += 8; if (n === 32) return this.zero();\n }\n while (!(this.r(0x62) & 0x80)) {\n const ov = this.r(FACOV), m = this.mant(0x62);\n this.w(FACOV, ov << 1); this.setMant(0x62, (m * 2 + (ov >> 7)) % 2 ** 32); n++;\n }\n if (n >= this.r(FAC)) return this.zero();\n this.w(FAC, this.r(FAC) - n);\n return { a: this.r(FAC) };\n }\n zero() { this.w(FAC, 0); this.w(0x66, 0); return { a: 0 }; }\n // The ROM's shift right of a register (X: $61 the FAC, $69 ARG, $25 the product) by -A bits,\n // A a negative count; its low bits are $70, or the A register (the return here) in a shift of\n // under a byte. Whole bytes first, each bringing $68 in at the top ($B985), as long as A + 8\n // (and the carry) stays under 1; then the bits, the top one kept, as for a signed number ($B9A6).\n shift(x, a, c = 0) {\n for (;;) {\n const sum = a + 8 + c; a = sum & 0xff; c = sum > 255 ? 1 : 0;\n if (a & 0x80 || !a) { this.byteShift(x); continue; }\n const diff = a - 8 - (1 - c); a = diff & 0xff; c = diff >= 0 ? 1 : 0;\n if (c) return this.r(FACOV);\n return this.bitShift(x, a, this.r(FACOV), true);\n }\n }\n byteShift(x) {\n this.w(FACOV, this.r(x + 4)); this.w(x + 4, this.r(x + 3)); this.w(x + 3, this.r(x + 2)); this.w(x + 2, this.r(x + 1)); this.w(x + 1, this.r(BITS));\n }\n // bits: Y counting up from -n, each a shift right of the register's four bytes and A below them,\n // the top byte's top bit kept (signed) or, for the first of an addition's, cleared\n bitShift(x, y, a, signed) {\n for (; y !== 0; y = (y + 1) & 0xff) {\n const top = this.r(x + 1), m = this.mant(x + 1);\n const keep = signed ? top & 0x80 : 0;\n this.setMant(x + 1, Math.floor(m / 2) + keep * 2 ** 24);\n a = (a >> 1) | ((m & 1) << 7);\n signed = true;\n }\n return a;\n }\n\n // ---- multiplying and dividing ----\n\n // FMULT ($BA28, memory times the FAC; $BA2B, ARG times the FAC): the mantissas multiplied a\n // byte of the FAC's at a time, its low bits first, the product's bits shifted out below lost\n fmult(at) { this.conupk(at); return this.fmultt(); }\n fmultt() {\n if (!this.r(FAC)) return { a: 0 };\n const md = this.muldiv();\n if (md.zero) return { a: 0 };\n for (const r of [0x26, 0x27, 0x28, 0x29]) this.w(r, 0);\n let c = md.c;\n for (const at of [FACOV, 0x65, 0x64, 0x63, 0x62]) c = this.mltply(this.r(at), c, at === 0x62);\n this.w(0x62, this.r(0x26)); this.w(0x63, this.r(0x27)); this.w(0x64, this.r(0x28)); this.w(0x65, this.r(0x29));\n return this.normal();\n }\n // one byte of the multiplier ($BA59): a zero byte a shift of the product by bytes; another, its\n // bits from the lowest, ARG's mantissa added in for each 1, the product shifted right each time\n mltply(b, c, last) {\n if (!b && !last) { this.byteShift(0x25); this.shift(0x25, 0, c); return 0; }\n for (let bits = (b >> 1) | 0x80, bit = b & 1; ; ) {\n let p = this.mant(0x26), carry = 0;\n if (bit) { p += this.mant(0x6a); carry = p >= 2 ** 32 ? 1 : 0; p %= 2 ** 32; }\n const ov = this.r(FACOV);\n this.w(FACOV, (ov >> 1) | ((p & 1) << 7)); this.setMant(0x26, Math.floor(p / 2) + carry * 2 ** 31);\n bit = bits & 1; bits >>= 1;\n if (!bits) return 1;\n }\n }\n // MULDIV ($BAB7; $BAB9 with A in place of ARG's exponent, `ey`): the exponents added for a product or quotient, and its sign. `zero` when ARG is\n // zero or the sum too small (the FAC zeroed, and the caller done); too large is an overflow. An\n // exponent of exactly 0 goes on, its sign 0, the caller working the mantissa out all the same.\n // `c` the carry it leaves, which a product begins with.\n muldiv(ey = this.r(ARG)) {\n if (!ey) { this.zero(); return { zero: true }; }\n const sum = ey + this.r(FAC), low = sum & 0xff;\n if (sum < 256 && low < 0x80) { this.zero(); return { zero: true }; }\n if (sum >= 256 && (low & 0x80)) throw overflow();\n const e = (low + 0x80) & 0xff, c = sum < 256 ? 1 : 0;\n this.w(FAC, e);\n this.w(0x66, e ? this.r(ARISGN) : 0);\n return { zero: false, c };\n }\n // FDIV ($BB0F, memory divided by the FAC; $BB12, ARG by the FAC): the FAC rounded first, then\n // 34 bits of quotient by subtracting, 32 as the mantissa and two as the low bits' top\n fdiv(at) { this.conupk(at); return this.fdivt(); }\n fdivt() {\n if (!this.r(FAC)) throw new FloatError(0x14); // DIVISION BY ZERO\n this.round();\n this.w(FAC, (0 - this.r(FAC)) & 0xff);\n if (this.muldiv().zero) return { a: 0 };\n const e = this.r(FAC) + 1; if (e > 255) throw overflow();\n this.w(FAC, e);\n let a = this.mant(0x6a), carry = 0, q = 0;\n const f = this.mant(0x62);\n for (let i = 0; i < 34; i++) {\n const bit = carry || a >= f ? 1 : 0;\n if (bit) a = (a - f + 2 ** 32) % 2 ** 32;\n q = q * 2 + bit;\n carry = a >= 2 ** 31 ? 1 : 0; a = (a * 2) % 2 ** 32;\n }\n this.setMant(0x6a, a);\n this.w(FACOV, (q % 4) << 6); this.setMant(0x62, Math.floor(q / 4));\n return this.normal();\n }\n\n // ---- whole numbers ----\n\n // QINT ($BC9B): the FAC as a 32-bit whole number in $62 to $65, two's complement, its fraction\n // shifted out (so, for a negative, the next whole number down); $68 0 after\n qint() {\n if (!this.r(FAC)) { for (const r of [0x62, 0x63, 0x64, 0x65]) this.w(r, 0); return { a: 0, y: 0 }; }\n const a = (this.r(FAC) - 0xa0) & 0xff;\n if (this.r(0x66) & 0x80) { this.w(BITS, 0xff); this.complement(); }\n if (((a - 0xf9) & 0xff) & 0x80) this.shift(FAC, a, 0);\n else {\n // (under a byte: the first shift brings the sign in at the top, the rest keep it)\n const m = this.mant(0x62);\n this.setMant(0x62, Math.floor(m / 2) + ((this.r(0x66) & 0x80) ? 2 ** 31 : 0));\n this.bitShift(FAC, (a + 1) & 0xff, 0, true);\n }\n this.w(BITS, 0);\n return { y: 0 };\n }\n // INT ($BCCC): the FAC's whole part, the next whole number down, as a number again\n int() {\n if (this.r(FAC) >= 0xa0) return { a: this.r(FAC) };\n this.qint();\n this.w(FACOV, 0);\n const s = this.r(0x66); this.w(0x66, 0);\n return this.float32(s);\n }\n // ($BCDB) a 32-bit two's complement whole number in $62 to $65 as a number: negative when A's top\n // bit is set, as INT and Blitz! enter it; $07 its lowest byte, as the ROM keeps it\n float32(a) {\n this.w(FAC, 0xa0); this.w(0x07, this.r(0x65));\n if (a & 0x80) this.negate();\n return this.normal();\n }\n}\n\n// (the methods for building a number from its digits, FIN's: basic-rom.js)\nObject.assign(Floats.prototype, {\n // MUL10 ($BAE2): the FAC ten times, as the ROM does it: ARG the FAC (rounded), then ($BAED) with\n // the exponent two more: five times it, doubled\n mul10() {\n this.movaf();\n const e = this.r(FAC);\n if (!e) return { a: 0 };\n if (e + 2 > 255) throw overflow();\n return this.addDoubled(e + 2);\n },\n // ($BAED) ARG added to the FAC with its exponent `a`, then doubled: FADDT entered at $B877 as if\n // ARG's exponent were `a` (one or two more than its own: ARG the FAC, it is three or five times\n // it), the FAC shifted right by the difference and ARG added, and the exponent one more\n addDoubled(a) {\n const by = (this.r(ARG) - a) & 0xff;\n this.w(ARISGN, 0);\n this.w(FAC, a); this.w(0x66, this.r(0x6e)); this.w(ARGOV, 0);\n const low = this.bitShift(FAC, by, this.r(FACOV), false) + this.r(ARGOV), m = this.mant(0x62) + this.mant(0x6a) + (low > 255 ? 1 : 0);\n this.w(FACOV, low); this.setMant(0x62, m % 2 ** 32);\n if (m >= 2 ** 32) this.carryIn(1);\n const e2 = this.r(FAC) + 1; if (e2 > 255) throw overflow();\n this.w(FAC, e2);\n return { a: e2 };\n },\n // DIV10 ($BAFE): the FAC a tenth: ARG the FAC (rounded), the FAC 10 (the ROM's constant at $BAF9),\n // the signs' EOR 0, and ARG divided by it\n div10() { this.movaf(); return this.divInto(0xbaf9, 0); },\n // ($BB07) ARG divided by a number in memory: the signs' EOR `sign` (X), the FAC the number, FDIVT\n divInto(at, sign) { this.w(ARISGN, sign); this.movfm(at); return this.fdivt(); },\n // ($BC3C) a byte, 0 to 127, as a number in the FAC (a digit, for FIN)\n byte(v) {\n this.w(0x62, v); this.w(0x63, 0);\n for (const at of [0x64, 0x65, FACOV, 0x66]) this.w(at, 0);\n this.w(FAC, 0x88);\n if (v & 0x80) this.negate();\n return this.normal();\n },\n // ($BD7E) a digit added to the FAC: ARG the FAC (rounded), the FAC the digit, and FADDT\n addDigit(d) { this.movaf(); this.byte(d); this.w(ARISGN, this.r(0x6e) ^ this.r(0x66)); return this.faddt(); },\n // ---- the series and the functions on them ----\n\n // POLY2 ($E059, the table's address in $71/$72): the FAC, x, kept at $5C (rounded), then from the\n // table's count and coefficients, highest first, x times each and the next added (Horner's)\n poly2(at) { this.w(0x71, at); this.w(0x72, at >> 8); return this.poly(); },\n poly() {\n this.movmf(0x5c);\n let p = this.r(0x71) | this.r(0x72) << 8;\n this.w(0x67, this.r(p)); p++; this.w(0x71, p); this.w(0x72, p >> 8);\n for (let from = p; ; from = 0x5c) {\n this.fmult(from);\n p = (this.r(0x71) | this.r(0x72) << 8) + 5; this.w(0x71, p); this.w(0x72, p >> 8);\n this.fadd(p);\n this.w(0x67, this.r(0x67) - 1); if (!this.r(0x67)) return { a: this.r(FAC) };\n }\n },\n // POLY1 ($E043): a series of x squared, x kept at $57, times x\n poly1(at) { this.w(0x71, at); this.w(0x72, at >> 8); this.movmf(0x57); this.fmult(0x57); this.poly(); return this.fmult(0x57); },\n // LOG ($B9EA): ILLEGAL QUANTITY for zero or less; the exponent kept, less 128 (SIGN's carry\n // clear), the mantissa as a number from a half to one, and log2 of that from LOG's series of\n // (sqrt 2 / (x + sqrt .5)), from 1; the exponent added (as $BD7E adds a digit), times log 2\n log() {\n if (this.sign() !== 1) throw new FloatError(0x0e);\n const n = (this.r(FAC) - 0x80) & 0xff;\n this.w(FAC, 0x80);\n this.fadd(0xb9d6); this.fdiv(0xb9db); this.fsub(0xb9bc); this.poly1(0xb9c1); this.fadd(0xb9e0);\n this.addDigit(n);\n return this.fmult(0xb9e5);\n },\n // EXP ($BFED, `c` the carry it is entered with): the FAC over log 2; its low bits rounded in, a\n // carry from $70 + $50 (and the carry FMULT leaves: clear for a product, as entered for a zero)\n // the mantissa one more; past 2^7 an overflow, or 0 for a negative; the whole part (INT, $07\n // its low byte) and the fraction, from the swapped FAC and ARG; EXP's series of the fraction, and\n // 2 to the whole part, by MULDIV with that exponent ($BAB9)\n exp(c = 0) {\n const ex = this.r(FAC);\n this.fmult(0xbfbf);\n if (ex && this.r(FAC)) c = 0;\n else if (ex) { const sum = 0x81 + ex; c = sum < 256 && (sum & 0xff) < 0x80 ? 0 : 1; }\n const s = this.r(FACOV) + 0x50 + c;\n if (s > 255) { const m = this.mant(0x62) + 1; this.setMant(0x62, m % 2 ** 32); if (m >= 2 ** 32) this.carryIn(1); }\n this.w(ARGOV, s);\n this.movef();\n const tooBig = () => { if (!(this.r(0x66) & 0x80)) throw overflow(); return this.zero(); };\n if (this.r(FAC) >= 0x88) return tooBig();\n this.int();\n const a = (this.r(0x07) + 0x81) & 0xff;\n if (!a) return tooBig();\n for (let k = 0; k < 6; k++) { const v = this.r(ARG + k); this.w(ARG + k, this.r(FAC + k)); this.w(FAC + k, v); }\n this.w(FACOV, this.r(ARGOV));\n this.fsubt(); this.negop();\n this.poly2(0xbfc4);\n this.w(ARISGN, 0);\n const e = (a - 1) & 0xff;\n if (!e) return this.zero();\n this.muldiv(e);\n return { a: 0 };\n },\n // FPWRT ($BF7B, ARG to the power of the FAC; `z` the Z flag it is entered with, set for a power\n // of 0, `c` the carry): EXP(0) for that; 0 for a base of 0; the power kept at $4E; a negative base\n // only to a whole power, its sign then dropped (as FCOMP's Y, 4, for the FAC's) and the power's\n // low bit kept (in $07): EXP of the power times LOG of the base, negated for an odd power. (A\n // power not whole is FCOMP's answer for the sign, its Y for the oddness: an ILLEGAL QUANTITY,\n // unless INT, from the ROM's fill byte $68, made the power more.)\n fpwrt(z, c) {\n if (z) return this.exp(c);\n if (!this.r(ARG)) { this.w(FAC, 0); this.w(0x66, 0); return { a: 0 }; }\n this.movmf(0x4e);\n let sign = this.r(0x6e), odd = 0;\n if (sign & 0x80) {\n this.int();\n const { a, y } = this.compare(0x4e);\n if (a) { sign = a; odd = y & 1; } else { sign = y; odd = this.r(0x07) & 1; }\n }\n this.w(0x66, sign); for (let i = 5; i >= 1; i--) this.w(0x60 + i, this.r(0x68 + i)); this.w(FACOV, 0);\n this.log(); this.fmult(0x4e);\n this.exp(0);\n if (odd && this.r(FAC)) this.w(0x66, this.r(0x66) ^ 0xff);\n return { a: this.r(FAC) };\n },\n // SIN ($E26B): the FAC over two pi; its fraction, from a quarter, and folded (a negative a half\n // on, and if then positive, the TAN's flag at $12 turned over), a quarter on, its sign back; and\n // SIN's series. COS ($E264): a half pi on, then SIN.\n sin() {\n this.movaf(); this.divInto(0xe2e5, this.r(0x6e));\n this.movaf(); this.int(); this.w(ARISGN, 0); this.fsubt(); this.fsub(0xe2ea);\n const s = this.r(0x66);\n if (!(s & 0x80)) this.negop();\n else { this.fadd(0xbf11); if (!(this.r(0x66) & 0x80)) { this.w(0x12, this.r(0x12) ^ 0xff); this.negop(); } }\n this.fadd(0xe2ea);\n if (s & 0x80) this.negop();\n return this.poly1(0xe2ef);\n },\n cos() { this.fadd(0xe2e0); return this.sin(); },\n // FOUT ($BDDD): the FAC as text at $0100, a zero after, as Microsoft's FOUT writes it (its\n // source's steps, BASIC-M6502): its sign or a space at $0100; the number brought\n // between 99999999.9 and 999999999 by tens, $5D counting them; a half added, as a whole number;\n // its nine digits counted out by adding the powers of ten, each in turn, the point placed among\n // them; the zeros at the end taken off, and the exponent ($5E) last. $71 where it writes, $47\n // where it is in the table. A and Y the text's address.\n fout() {\n const buf = (y, v) => this.w(0xff + y, v);\n let y = 1;\n buf(y, this.r(0x66) & 0x80 ? 0x2d : 0x20);\n this.w(0x66, this.r(0xff + y)); this.w(0x71, y); y++;\n if (!this.r(FAC)) { buf(y, 0x30); buf(y + 1, 0); return { a: 0x00, y: 0x01 }; }\n let a = 0;\n if (this.r(FAC) <= 0x80) { this.fmult(0xbdbd); a = 0xf7; }\n this.w(0x5d, a);\n // (between the bounds: smaller by tens, or bigger; the half not added when it is exactly the top)\n let step = 'FOUT4';\n for (;;) {\n if (step === 'FOUT4') {\n const c = this.fcomp(0xbdb8);\n if (c === 0) { step = 'BIGGES'; break; }\n step = c === 1 ? 'FOUT9' : 'FOUT3';\n } else if (step === 'FOUT3') {\n const c = this.fcomp(0xbdb3);\n if (c === 1) { step = 'FOUT5'; break; }\n this.mul10(); this.w(0x5d, (this.r(0x5d) - 1) & 0xff);\n step = this.r(0x5d) ? 'FOUT3' : 'FOUT9';\n } else {\n this.div10(); this.w(0x5d, (this.r(0x5d) + 1) & 0xff);\n if (this.r(0x5d)) step = 'FOUT4'; else { step = 'FOUT5'; break; }\n }\n }\n if (step === 'FOUT5') this.fadd(0xbf11);\n this.qint();\n // the form: E notation below 0.01 or from 1E9 ($5E the exponent), else the places before the point\n let x = 1, e;\n a = (this.r(0x5d) + 10) & 0xff;\n if (a & 0x80) e = a - 2;\n else if (a >= 11) e = a - 2;\n else { x = (a - 1) & 0xff; e = 0; }\n this.w(0x5e, e & 0xff); this.w(0x5d, x);\n if (x === 0 || x & 0x80) {\n y = this.r(0x71); y++; buf(y, 0x2e);\n if (x) { y++; buf(y, 0x30); }\n this.w(0x71, y);\n }\n // each digit: a power of ten added, or taken away, until the mantissa's sign turns\n y = 0; x = 0x80;\n for (;;) {\n let c = 0;\n for (const k of [3, 2, 1, 0]) { const v = this.r(0x62 + k) + this.r(0xbf16 + y + k) + c; this.w(0x62 + k, v & 0xff); c = v >> 8; }\n x = (x + 1) & 0xff;\n if (c ? x & 0x80 : !(x & 0x80)) continue;\n a = x;\n if (c) { const v = (a ^ 0xff) + 0x0a + 1; a = v & 0xff; c = v >> 8; }\n a = (a + 0x2f + c) & 0xff;\n y += 4; this.w(0x47, y);\n y = this.r(0x71) + 1; x = a;\n buf(y, a & 0x7f);\n this.w(0x5d, (this.r(0x5d) - 1) & 0xff);\n if (!this.r(0x5d)) { y++; buf(y, 0x2e); }\n this.w(0x71, y);\n y = this.r(0x47);\n x = (x ^ 0xff) & 0x80;\n if (y === 0x24 || y === 0x3c) break;\n }\n // the zeros at the end off, and a point left last; then the exponent\n y = this.r(0x71);\n let ch; do { ch = this.r(0xff + y); y--; } while (ch === 0x30);\n if (ch !== 0x2e) y++;\n let ex = this.r(0x5e);\n if (!ex) { buf(y + 1, 0); return { a: 0x00, y: 0x01 }; }\n let sign = 0x2b;\n if (ex & 0x80) { ex = (0 - ex) & 0xff; sign = 0x2d; }\n buf(y + 2, sign); buf(y + 1, 0x45);\n let hi = 0x2f, c = 1;\n do { hi++; const t = ex - 10 - (1 - c); c = t >= 0 ? 1 : 0; ex = t & 0xff; } while (c);\n buf(y + 4, (ex + 0x3a) & 0xff); buf(y + 3, hi); buf(y + 5, 0);\n return { a: 0x00, y: 0x01 };\n },\n // NEGOP ($BFB4): the FAC's sign turned over, unless it is zero\n negop() { if (this.r(FAC)) this.w(0x66, this.r(0x66) ^ 0xff); return { a: this.r(0x66) }; },\n});\n\n// an overflow, and BASIC's errors by their number in its table (X for its error routine, $A437)\nexport class FloatError extends Error { constructor(x) { super('BASIC error ' + x); this.x = x; } }\nconst overflow = () => new FloatError(0x0f);\n", "// A Commodore BASIC V2 program as text, a line to a line: each line as the 64's own LIST prints it (basic-lang.js\n// list, from its ROM at $A71A, its oddities kept), then as moonbase's listings write PETSCII (petscii.js text: the\n// control characters by their names in braces). A program is lines, each the address of the next line, the line\n// number, then the line, ending in a zero; two zeros end it. `lower`: the letters as the second character set\n// shows them.\n//\n// listing(bytes, { lower }) the program's text (its bytes after the load address)\nimport { list } from './basic-lang.js';\nimport { text } from './petscii.js';\n\nexport function listing(bytes, { lower = false } = {}) {\n const lines = [];\n for (let at = 0; at + 4 <= bytes.length && (bytes[at] | bytes[at + 1] << 8); ) {\n const number = bytes[at + 2] | bytes[at + 3] << 8;\n let end = at + 4;\n while (end < bytes.length && bytes[end]) end++;\n lines.push(number + ' ' + text(list(bytes.subarray(at + 4, end)), { lower }));\n at = end + 1;\n }\n return lines.join('\\n') + '\\n';\n}\n", "// PETSCII as text that can be typed and read, as moonbase's listings write it: the control\n// characters by their names in braces, {CLR}, {RVS ON}, and any other byte as {$xx}; for game\n// documents and a BASIC page.\n//\n// bytes('{CLR}HELLO', { lower }) the bytes a C64 prints: with lower, the second character\n// set's (a small letter $41 to $5A, a capital $C1 to $DA);\n// without, the first's (letters typed either way, $41 to $5A)\n// text(bytes, { lower }) back again: with lower, the second character set's way\n// ($41 to $5A small letters, $C1 to $DA capitals)\n\nexport const CONTROLS = { WHT: 0x05, 'DISABLE SHIFT': 0x08, 'ENABLE SHIFT': 0x09, RETURN: 0x0d, LOWER: 0x0e, DOWN: 0x11, 'RVS ON': 0x12, HOME: 0x13, DEL: 0x14,\n RED: 0x1c, RIGHT: 0x1d, GRN: 0x1e, BLU: 0x1f, ORNG: 0x81, F1: 0x85, F3: 0x86, F5: 0x87, F7: 0x88, F2: 0x89, F4: 0x8a, F6: 0x8b, F8: 0x8c,\n UPPER: 0x8e, BLK: 0x90, UP: 0x91, 'RVS OFF': 0x92, CLR: 0x93, INST: 0x94, BRN: 0x95,\n LRED: 0x96, GRY1: 0x97, GRY2: 0x98, LGRN: 0x99, LBLU: 0x9a, GRY3: 0x9b, PUR: 0x9c, LEFT: 0x9d, YEL: 0x9e, CYN: 0x9f, 'SHIFT SPACE': 0xa0, PI: 0xff };\nconst NAMES = Object.fromEntries(Object.entries(CONTROLS).map(([n, b]) => [b, n]));\n\nexport function bytes(t, { lower = false } = {}) {\n const out = [];\n for (let k = 0; k < t.length; k++) {\n const c = t[k];\n if (c === '{') {\n const end = t.indexOf('}', k), name = t.slice(k + 1, end);\n if (end < 0) throw new Error('a { with no }: ' + t);\n const n = /^\\$([0-9A-F]{2})$/i.exec(name) ? parseInt(name.slice(1), 16) : CONTROLS[name.toUpperCase()];\n if (n === undefined) throw new Error(`no control character {${name}}`);\n out.push(n); k = end; continue;\n }\n const v = c.charCodeAt(0);\n if (c === '\u00A3') out.push(0x5c);\n else if (c === '\u2191') out.push(0x5e);\n else if (c === '\u2190') out.push(0x5f);\n else if (c === '\u03C0') out.push(0xff);\n else if (v >= 0x61 && v <= 0x7a) out.push(v - 0x20);\n else if (lower && v >= 0x41 && v <= 0x5a) out.push(v + 0x80);\n else out.push(v & 0xff);\n }\n return out;\n}\n\nexport function text(b, { lower = false } = {}) {\n let out = '';\n for (const v of b) {\n if (lower && v >= 0x41 && v <= 0x5a) out += String.fromCharCode(v + 0x20);\n else if (lower && v >= 0xc1 && v <= 0xda) out += String.fromCharCode(v - 0x80);\n else if (v === 0x0d) out += '\\r';\n else if (v >= 0x20 && v < 0x5b || v === 0x5d) out += String.fromCharCode(v);\n else if (v === 0x5c) out += '\u00A3';\n else if (v === 0x5e) out += '\u2191';\n else if (v === 0x5f) out += '\u2190';\n else if (v === 0x5b) out += '[';\n else out += `{${NAMES[v] ?? '$' + v.toString(16).toUpperCase().padStart(2, '0')}}`;\n }\n return out;\n}\n", "// BASIC's ROM, moonbase's own: the routines of Commodore BASIC that a program's machine code calls,\n// answered at their addresses, as the ROM's would leave the registers and memory. Shared by every\n// layer that runs such code: the original on moonbase's ROMs (rom.js, on the 6510) and a remake\n// (on its stand-in for the processor), as kernal.js is for the KERNAL. Its rules for numbers are\n// numbers.js's, its arithmetic float.js's.\n//\n// install({ cpu, read, write, evaluate, chrout })\n// cpu a processor, or a stand-in for one: its registers, and `hooks`, which this fills\n// read, write memory as the processor sees it\n// evaluate the expression in BASIC's text at an address: { value, end, place }, its value (a\n// number or a string), where it ends, and for a string written in the text, where\n// its characters are. The remake takes its compiled parameters' (compiled with\n// the program, basic-compile.js); the original reads the text and BASIC's\n// variables in memory.\n// chrout CHROUT, a character in A to the output (the KERNAL's $FFD2 unless given)\n//\n// A routine that returns from its caller too (`'return'`: $E206, at a statement's end) leaves\n// that to the layer running it.\nimport { BasicError, ERRORS } from './numbers.js';\nimport { setFac, Floats, FloatError, unpack } from './float.js';\nimport { Basic } from './basic.js';\nimport { expression } from './basic-lang.js';\nimport { evaluator } from './basic-compile.js';\nimport { seedRandom, nextRandom } from './numbers.js';\n\nconst hex4 = n => n.toString(16).toUpperCase().padStart(4, '0');\nconst FAC_EXP = 0x61;\n// BASIC's functions' routines, SGN to MID$, as its table at $A052 holds them\nconst FUNCTIONS = [0xbc39, 0xbccc, 0xbc58, 0x0310, 0xb37d, 0xb39e, 0xbf71, 0xe097, 0xb9ea, 0xbfed, 0xe264, 0xe26b, 0xe2b4, 0xe30e,\n 0xb80d, 0xb77c, 0xb465, 0xb7ad, 0xb78b, 0xb6ec, 0xb700, 0xb72c, 0xb737];\n\nexport function install({ cpu, read, write, evaluate, chrout = c => cpu.hooks.get(0xffd2)(c) }) {\n // BASIC's text pointer ($7A), and what it reads there: CHRGOT ($0079) and CHRGET ($0073) as\n // BASIC's text pointer reads, spaces passed over, Z at a statement's end, C clear for a digit\n const txt = () => read(0x7a) | read(0x7b) << 8, setTxt = a => { write(0x7a, a & 0xff); write(0x7b, a >> 8 & 0xff); };\n const syntax = () => { throw new BasicError('?SYNTAX ERROR'); };\n const chrgot = c => { let a = txt(); while (read(a) === 0x20) a++; setTxt(a); const v = read(a); c.a = v; c.z = v === 0 || v === 0x3a ? 1 : 0; c.c = v >= 0x30 && v <= 0x39 ? 0 : 1; c.n = v >> 7; };\n const chkcom = c => { chrgot(c); if (c.a !== 0x2c) syntax(); setTxt(txt() + 1); chrgot(c); };\n // the expression at the text pointer: a number into the accumulator ($0D 0, numeric), a string\n // as BASIC's descriptor at $19 ($0D $FF, string)\n let last = 0;\n const frm = (c, number) => {\n chrgot(c);\n const at = txt(), { value, end, place } = evaluate(at);\n if (typeof value === 'string') {\n if (number) throw new BasicError('?TYPE MISMATCH ERROR');\n if (place === undefined) throw new Error('a string parameter not in the text, at $' + hex4(at) + ': not handled');\n write(0x19, value.length); write(0x1a, place & 0xff); write(0x1b, place >> 8); write(0x64, 0x19); write(0x65, 0); write(0x0d, 0xff);\n } else { last = value; write(0x0d, 0); setFac({ read, write }, value); }\n setTxt(end); chrgot(c);\n };\n const whole = (lo, hi) => { if (last !== Math.floor(last) || last < lo || last > hi) throw new BasicError('?ILLEGAL QUANTITY ERROR'); return last; };\n const getbyt = c => { frm(c, true); c.x = whole(0, 255); };\n // (A left as the last character out, as the ROM's leave it)\n const out = ch => { cpu.a = ch; chrout(cpu); };\n const H = {\n 0x79: chrgot, 0x73: c => { setTxt(txt() + 1); chrgot(c); },\n // CHKCOM ($AEFD), FRMNUM ($AD8A), FRMEVL ($AD9E), GETADR ($B7F7), GETBYT ($B79E); FRESTR's below ($B6A3)\n 0xaefd: chkcom, 0xad8a: c => frm(c, true), 0xad9e: c => frm(c, false),\n 0xb7f7: c => { const x = whole(0, 65535); write(0x14, x & 0xff); write(0x15, x >> 8); c.y = x & 0xff; c.a = x >> 8; },\n 0xb79e: getbyt,\n // the LOAD and OPEN parameters': $E200 a comma and a byte, $E206 the statement's end, which\n // returns from its caller, $E20E a comma and more\n 0xe200: c => { chkcom(c); getbyt(c); },\n 0xe206: c => { chrgot(c); if (c.z) return 'return'; },\n 0xe20e: c => { chkcom(c); if (c.z) syntax(); },\n // STROUT ($AB1E), the text at A/Y to its 0; the screen cleared ($E544) and a line of it ($E9FF)\n 0xab1e: c => { for (let a = c.a | c.y << 8, k = 0; read(a + k) && k < 256; k++) out(read(a + k)); },\n 0xe544: () => out(0x93),\n 0xe9ff: c => { const at = (read(0x288) << 8) + c.x * 40; for (let k = 0; k < 40; k++) { write(at + k, 0x20); write(0xd800 + c.x * 40 + k, read(0x286)); } },\n };\n // ---- the routines Blitz!'s runtime calls (Goldfields' GAME), on the original only ----\n\n // ($B194) where an array's elements begin, its header ($5F) and two bytes for each of its\n // dimensions ($0B) past it: $58/$59, and A/Y\n H[0xb194] = c => {\n let t = read(0x0b) << 1, carry = t >> 8; t &= 0xff;\n t += 5 + carry; carry = t >> 8; t &= 0xff;\n t += read(0x5f) + carry; carry = t >> 8; t &= 0xff;\n let y = read(0x60); if (carry) y = (y + 1) & 0xff;\n write(0x58, t); write(0x59, y); c.a = t; c.y = y; c.c = carry;\n const flag = carry ? y : t; c.z = flag ? 0 : 1; c.n = flag >> 7;\n };\n // REASON ($A408): whether the address in A/Y is below the strings' bottom (FRETOP, $33), the\n // flags as the comparison leaves them (C clear); if not, the strings collected (GARBAG, $B526)\n // and the comparison again, its registers kept across it; and if still not, OUT OF MEMORY\n const below = (a, y) => { const top = read(0x34); if (y !== top) return y < top; return a < read(0x33); };\n const compare = (c, a, y) => { const top = read(0x34), v = y !== top ? y - top : a - read(0x33); c.c = v >= 0 ? 1 : 0; c.z = (v & 0xff) ? 0 : 1; c.n = v >> 7 & 1; };\n H[0xa408] = c => {\n const { a, y } = c;\n if (below(a, y)) return compare(c, a, y);\n const kept = []; for (let k = 0x57; k <= 0x60; k++) kept.push(read(k));\n H[0xb526](c);\n kept.forEach((v, k) => write(0x57 + k, v));\n Object.assign(c, { a, y });\n if (below(a, y)) return compare(c, a, y);\n throw new BasicError('?OUT OF MEMORY ERROR');\n };\n // UMULT ($B34C): an array's index ($71/$72) times its dimension's size, read from its header at\n // ($5F)+Y (the low byte) and Y-1 (the high), into X/Y (A the high byte too); past 16 bits is OUT\n // OF MEMORY. $71/$72 are shifted out to 0, $5D counted down to 0, as the ROM leaves them.\n H[0xb34c] = c => {\n write(0x22, c.y);\n const base = read(0x5f) | read(0x60) << 8, size = read(base + c.y) | read(base + ((c.y - 1) & 0xff)) << 8;\n write(0x28, size & 0xff); write(0x29, size >> 8);\n const index = read(0x71) | read(0x72) << 8, product = index * size;\n // (the ROM's own test: a shift or a sum carrying out of 16 bits on the way, which for a\n // product past 16 bits it always meets)\n if (product > 0xffff) throw new BasicError('?OUT OF MEMORY ERROR');\n write(0x71, 0); write(0x72, 0); write(0x5d, 0);\n Object.assign(c, { x: product & 0xff, y: product >> 8, a: product >> 8, c: 0, z: 1, n: 0 });\n };\n // ($B2AA) DIM's end: the array's elements, A/X bytes of them (high, low) from $58/$59, past the\n // end of memory OUT OF MEMORY; then REASON for its end, the arrays' end (STREND, $31) there,\n // its elements cleared to 0 (a page at a time down from the last, as the ROM does), and its\n // length into its header, at ($5F)+2. DIM's flag ($0C) set, back to DIM; an array made by its\n // first use, which goes on to find its element, is not handled (an error).\n H[0xb2aa] = c => {\n const start = read(0x58) | read(0x59) << 8;\n let hi = c.a + read(0x59) + c.c;\n if (hi > 255) throw new BasicError('?OUT OF MEMORY ERROR');\n write(0x59, hi);\n let lo = c.x + read(0x58);\n if (lo > 255) { lo &= 0xff; hi = (hi + 1) & 0xff; if (!hi) throw new BasicError('?OUT OF MEMORY ERROR'); }\n const kept = { a: c.a, x: c.x };\n Object.assign(c, { a: lo, y: hi }); H[0xa408](c);\n write(0x31, lo); write(0x32, hi);\n const end = lo | hi << 8;\n for (let a = start; a < end; a++) write(a, 0);\n write(0x59, start >> 8); write(0x72, 0);\n const base = read(0x5f) | read(0x60) << 8, length = end - base;\n write(base + 2, length & 0xff); write(base + 3, length >> 8);\n if (!read(0x0c)) throw new Error('an array made by its first use ($B2AA, DIM\\'s flag clear): not handled');\n const f = read(0x0c);\n Object.assign(c, { a: f, x: kept.x, y: 3, c: 1, z: f ? 0 : 1, n: f >> 7 });\n };\n // SYS's own ($E130): a return pushed to $E147, the registers from $030C to $030F (A, X, Y, the\n // flags), and on to the address at $14/$15 (GETADR's), where the machine code runs; and $E147, as\n // it comes back (or as a routine ends that jumps there), the registers kept at $030C again\n H[0xe130] = c => {\n c.push(0xe1); c.push(0x46);\n Object.assign(c, { a: read(0x30c), x: read(0x30d), y: read(0x30e) }); c.p = read(0x30f);\n c.pc = read(0x14) | read(0x15) << 8;\n return false;\n };\n H[0xe147] = c => { write(0x30c, c.a); write(0x30d, c.x); write(0x30e, c.y); write(0x30f, c.p); };\n // The accumulator onto the processor's stack, for the evaluator ($AE38): the caller's return\n // taken into $22/$23, its low byte one on (only the low byte: the ROM's INC carries no further),\n // A pushed (the sign), then ($AE43) the accumulator rounded and its five bytes pushed, the\n // exponent last, and on to the caller at ($22)\n const f = new Floats({ read, write });\n // (a routine called from the ROM's code at `from`, its JSR's return address on the stack for the\n // while, as an observer sees the ROM's own calls)\n const call = (c, at, from) => { const r = from + 2; c.push(r >> 8); c.push(r & 0xff); try { return cpu.hooks.get(at)(c); } finally { c.pull(); c.pull(); } };\n // (the floating point's errors, an overflow or a division by zero, as BASIC's)\n const arith = g => { try { return g(); } catch (err) { if (err instanceof FloatError) throw new BasicError('?' + ERRORS[err.x - 1] + ' ERROR'); throw err; } };\n H[0xae38] = c => {\n const y = c.a, lo = c.pull(), hi = c.pull();\n write(0x22, (lo + 1) & 0xff); write(0x23, hi); c.y = y; c.push(y);\n return H[0xae43](c);\n };\n H[0xae43] = c => {\n f.round();\n for (const at of [0x65, 0x64, 0x63, 0x62, 0x61]) c.push(read(at));\n c.a = read(0x61); c.z = c.a ? 0 : 1; c.n = c.a >> 7;\n c.pc = read(0x22) | read(0x23) << 8;\n return false;\n };\n // The floating point's entries (float.js, each held to the ROM's): the address of a\n // number in memory in A/Y (X/Y for a store, FORPNT $49 for BBD0's, $5C and $57 for BBC7's and\n // BBCA's); A the result's exponent, or the comparison's or the sign's answer, its flags N and Z.\n // An overflow or a division by zero is BASIC's error.\n const ay = c => c.a | c.y << 8, nz = (c, v) => { c.z = v & 0xff ? 0 : 1; c.n = v >> 7 & 1; };\n const floating = (run, regs = () => ({})) => c => {\n const r = arith(() => run(c));\n Object.assign(c, regs(c, r) ?? {});\n nz(c, c.a);\n };\n const A = (c, r) => ({ a: r?.a ?? read(0x61) });\n Object.assign(H, {\n 0xbba2: floating(c => f.movfm(ay(c)), (c, r) => ({ a: r.a, y: 0 })),\n 0xbbd4: floating(c => f.movmf(c.x | c.y << 8), (c, r) => ({ a: r.a, y: 0 })),\n 0xbbd0: floating(c => { c.x = read(0x49); c.y = read(0x4a); return f.movmf(c.x | c.y << 8); }, (c, r) => ({ a: r.a, y: 0 })),\n 0xbbc7: floating(c => { c.x = 0x5c; return f.movmf(0x5c); }, (c, r) => ({ a: r.a, y: 0 })),\n 0xbbca: floating(c => { c.x = 0x57; return f.movmf(0x57); }, (c, r) => ({ a: r.a, y: 0 })),\n 0xbbfc: floating(() => f.movfa(), () => ({ a: read(0x69), x: 0 })),\n 0xbc0c: floating(() => f.movaf(), () => ({ a: read(0x61), x: 0 })),\n 0xbc0f: floating(() => f.movef(), () => ({ a: read(0x61), x: 0 })),\n 0xbc1b: floating(() => f.round(), () => ({ a: read(0x61) })),\n 0xbc2b: floating(() => ({ a: f.sign() }), (c, r) => ({ a: r.a, c: read(0x66) >> 7 })),\n 0xbc5b: floating(c => f.compare(ay(c)), (c, r) => r),\n 0xbc5d: floating(c => f.compare(read(0x24) | c.y << 8), (c, r) => r),\n 0xb867: floating(c => f.fadd(ay(c)), A), 0xb86a: floating(() => f.faddt(), A),\n 0xb850: floating(c => f.fsub(ay(c)), A), 0xb853: floating(() => f.fsubt(), A),\n 0xba28: floating(c => f.fmult(ay(c)), A), 0xba2b: floating(() => f.fmultt(), A),\n 0xbb0f: floating(c => f.fdiv(ay(c)), A), 0xbb12: floating(() => f.fdivt(), A),\n 0xbccc: floating(() => f.int(), A), 0xbc9b: floating(() => f.qint(), () => ({ y: 0 })),\n // ($BCDB) a 32-bit whole number in $62 to $65 as a number, negative when A's top bit is set,\n // as INT enters it and Blitz! does\n 0xbcdb: floating(c => f.float32(c.a), A),\n // the functions on the series: LOG, EXP, the power (entered past its test of the FAC, at $BF7B,\n // its Z flag that test's), SQR (a half's power), SIN and COS\n 0xb9ea: floating(() => f.log(), A), 0xbfed: floating(c => f.exp(c.c), A),\n 0xbf7b: floating(c => f.fpwrt(c.z, c.c), A), 0xbf71: floating(c => { f.movaf(); f.movfm(0xbf11); return f.fpwrt(0, c.c); }, A),\n 0xe26b: floating(() => f.sin(), A), 0xe264: floating(() => f.cos(), A),\n });\n // RND ($E097): the next of the seed's numbers (numbers.js, the remake's own) into the\n // accumulator, whatever RND's argument; A its exponent, so that the original and the remake draw\n // the same numbers.\n let randomState = null;\n H[0xe097] = c => {\n randomState = nextRandom(randomState ?? seedRandom(0x11));\n setFac({ read, write }, randomState / 2 ** 32);\n c.a = read(0x61); nz(c, c.a);\n };\n // ($BF04) FOUT's end, which Blitz! calls to end a number's text: A at $00FF+Y, a 0 after it, and\n // the text's address, $0100, in A/Y\n H[0xbf04] = c => { write(0xff + c.y, c.a); write(0x100 + c.y, 0); Object.assign(c, { a: 0, y: 1, z: 0, n: 0 }); };\n // FIN ($BCF3): the number in BASIC's text at its pointer, read with CHRGET, into the FAC, A its\n // first character and C clear for a digit, as CHRGOT leaves them. As the ROM builds it (each\n // step float.js's): $5D to $67 cleared, the FAC with them; a sign; each digit the FAC ten\n // times and the digit added, those after the point counted ($5D); a second point the end; an E,\n // its sign ($60) and its digits ($5E), capped at 100 when negative and an overflow past 9 when\n // not; then ten times or a tenth for each power left, and the sign last.\n H[0xbcf3] = c => {\n for (let x = 0x0a; x >= 0; x--) write(0x5d + x, 0);\n const next = () => H[0x73](c), digit = () => !c.c;\n if (!digit()) {\n if (c.a === 0x2d) { write(0x67, 0xff); next(); }\n else if (c.a === 0x2b) next();\n }\n let power;\n for (;;) {\n if (digit()) {\n const ch = c.a;\n if (read(0x5f) & 0x80) write(0x5d, read(0x5d) + 1);\n arith(() => { f.mul10(); f.addDigit(ch - 0x30); });\n next(); continue;\n }\n if (c.a === 0x2e) {\n write(0x5f, (read(0x5f) >> 1) | 0x80);\n if (read(0x5f) & 0x40) { power = read(0x5e); break; }\n next(); continue;\n }\n if (c.a === 0x45) {\n next();\n if (c.c && (c.a === 0xab || c.a === 0x2d)) { write(0x60, (read(0x60) >> 1) | 0x80); next(); }\n else if (c.c && (c.a === 0xaa || c.a === 0x2b)) next();\n while (digit()) {\n const e = read(0x5e);\n if (e >= 10) { if (!(read(0x60) & 0x80)) throw new BasicError('?OVERFLOW ERROR'); write(0x5e, 100); }\n else write(0x5e, e * 10 + c.a - 0x30);\n next();\n }\n power = read(0x60) & 0x80 ? (0 - read(0x5e)) & 0xff : read(0x5e);\n break;\n }\n power = read(0x5e); break;\n }\n let n = (power - read(0x5d)) & 0xff; write(0x5e, n);\n if (n && n < 0x80) for (; n; n = (n - 1) & 0xff) { arith(() => f.mul10()); write(0x5e, n - 1); }\n else if (n) for (; n; n = (n + 1) & 0xff) { arith(() => f.div10()); write(0x5e, (n + 1) & 0xff); }\n if (read(0x67) & 0x80) f.negop();\n c.a = read(read(0x67) & 0x80 ? 0x66 : 0x67); nz(c, c.a);\n };\n // TI ($AF7B): the clock read (RDTIM, $FFDE: A, X, Y its low, middle and high bytes) as a 24-bit\n // whole number in the FAC ($62 0, $63 to $65 the clock), exponent $A0, its low bits and sign 0,\n // then normalised; as the ROM goes on through $B8D2, a carry clear on entry has it negated first\n // ($AF84) the clock (RDTIM) into the FAC's mantissa, $63 to $65, $62 0; Y 0\n const clock = c => { call(c, 0xffde, 0xaf84); write(0x64, c.x); write(0x63, c.y); write(0x65, c.a); write(0x62, 0); c.y = 0; };\n H[0xaf7b] = c => {\n const carry = c.c;\n clock(c);\n write(FAC_EXP, 0xa0); write(0x70, 0); write(0x66, 0);\n if (!carry) f.negate();\n const r = f.normal(); Object.assign(c, { a: r.a, y: 0 }); nz(c, c.a);\n };\n // WAIT's loop ($B83C, X the bits to flip, $49 the mask, $14 the address): at $B840, the address\n // read until its bits, flipped, meet the mask; the machine goes on meanwhile, as the ROM's loop\n // does\n H[0xb83c] = c => { write(0x4a, c.x); c.y = 0; c.pc = 0xb840; return false; };\n H[0xb840] = c => {\n const v = (read((read(0x14) | read(0x15) << 8) + c.y) ^ read(0x4a)) & read(0x49);\n if (!v) return 'wait';\n c.a = v; nz(c, v);\n };\n // FREFAC ($B6A6): the string whose descriptor is at $64/$65, its length in A, its characters'\n // address in $22/$23 (X/Y); its descriptor let go if it is the last temporary one (FRETMS,\n // $B6DB: $16 and $17 three back), and its characters too if they are the strings' bottom\n // (FRETOP, $33, moved up past them)\n H[0xb6a6] = c => {\n const at = read(0x64) | read(0x65) << 8;\n write(0x22, at & 0xff); write(0x23, at >> 8);\n const freed = H[0xb6db]({ a: at & 0xff, y: at >> 8 });\n const len = read(at), x = read(at + 1), y = read(at + 2);\n if (freed && y === read(0x34) && x === read(0x33)) { const top = read(0x33) + len; write(0x33, top & 0xff); if (top > 255) write(0x34, read(0x34) + 1); }\n write(0x22, x); write(0x23, y);\n Object.assign(c, { a: len, x, y }); nz(c, len);\n };\n H[0xb6db] = c => {\n if (c.y !== read(0x18) || c.a !== read(0x17)) { c.z = 0; return false; }\n write(0x16, c.a); write(0x17, (c.a - 3) & 0xff); c.y = 0; c.z = 1;\n return true;\n };\n // ($AFD5) a function's call, the evaluator's: A its token times two, its routine's address from\n // BASIC's table ($A052) into JMPER's ($55/$56) and called there; then CHKNUM ($AD8D), its\n // result a number or TYPE MISMATCH\n H[0xafd5] = c => {\n const to = FUNCTIONS[(c.a - 0x68) >> 1];\n if (to === undefined || c.a & 1) throw new Error('a function at $' + hex4(0x9fea + c.a) + ' ($AFD5): not handled');\n write(0x55, to & 0xff); write(0x56, to >> 8);\n c.y = c.a; c.push(0xaf); c.push(0xe2); c.pc = to;\n return false;\n };\n H[0xafe3] = c => { const t = read(0x0d); if (t & 0x80) throw new BasicError('?TYPE MISMATCH ERROR'); c.n = 1 & t >> 7; c.v = 1 & t >> 6; c.z = c.a & t ? 0 : 1; };\n // VAL's own ($B7B0), past LEN's start ($B782: A the string's length, $22/$23 its characters):\n // none, the FAC 0 ($B8F7); else the text pointer kept at $71/$72 and moved to the string, a 0\n // put past its end ($24/$25) for the while, and FIN; then the byte and the pointer back\n H[0xb7b0] = c => {\n if (!c.a) { write(FAC_EXP, 0); write(0x66, 0); c.a = 0; c.z = 1; c.n = 0; return; }\n const from = read(0x22) | read(0x23) << 8, end = from + c.a;\n write(0x71, read(0x7a)); write(0x72, read(0x7b));\n setTxt(from); write(0x24, end & 0xff); write(0x25, end >> 8 & 0xff);\n const kept = read(end); write(end, 0);\n H[0x79](c); H[0xbcf3](c);\n write(end, kept);\n Object.assign(c, { a: kept, x: read(0x71), y: read(0x72) }); nz(c, c.y);\n setTxt(c.x | c.y << 8);\n };\n // TI$ set ($A9E0, the string evaluated): FREFAC, six characters or ILLEGAL QUANTITY; the FAC 0,\n // then for each pair a character added ($AA1D), ten times, the next added and six times (twice\n // over, then $BAED, unless 0): the time in jiffies over ten, ten times again, QINT, and the\n // clock set (SETTIM, $FFDB) from $65, $64 and $63. A character is a digit for the ROM if it is\n // \"0\" or more, CHRGOT entered past its colon test ($0080); a space goes on to CHRGET itself.\n H[0xa9e0] = c => {\n H[0xb6a6](c);\n if (c.a !== 6) throw new BasicError('?ILLEGAL QUANTITY ERROR');\n write(FAC_EXP, 0); write(0x66, 0);\n const character = y => {\n c.a = read((read(0x22) | read(0x23) << 8) + y);\n if (c.a === 0x20) H[0x73](c); else c.c = c.a >= 0x30 ? 0 : 1;\n if (c.c) throw new BasicError('?ILLEGAL QUANTITY ERROR');\n arith(() => f.addDigit((c.a - 0x30) & 0xff));\n };\n for (let y = 0; y < 6; y += 2) {\n write(0x71, y); character(y); arith(() => f.mul10());\n write(0x71, y + 1); character(y + 1);\n const { a } = f.movaf(); if (a) arith(() => f.addDoubled(a + 1));\n }\n arith(() => f.mul10()); f.qint();\n Object.assign(c, { x: read(0x64), y: read(0x63), a: read(0x65) });\n return cpu.hooks.get(0xffdb)(c);\n };\n // FOUT's digits ($BE68, Y the table's place, $BF16 on): the 32-bit whole number in $62 to $65\n // counted down (or up) by each power until it passes 0, the count a digit, to $00FF on at $71+1\n // (a point after the $5D'th); to Y $24, or $3C (TI$'s). Then ($BEC4) the zeros at the end let go,\n // and a point there, an exponent from $5E, and a 0 after\n const digits = c => {\n let x = 0x80, y = c.y, cy = 0;\n for (;;) {\n do {\n let sum = 0; cy = 0;\n for (let k = 3; k >= 0; k--) { sum = read(0x62 + k) + read(0xbf16 + y + k) + cy; write(0x62 + k, sum); cy = sum >> 8; }\n x = (x + 1) & 0xff;\n } while (cy ? x & 0x80 : !(x & 0x80));\n let a = x;\n if (cy) { const t = (a ^ 0xff) + 0x0a + 1; a = t & 0xff; cy = t >> 8; }\n a = (a + 0x2f + cy) & 0xff;\n y = (y + 4) & 0xff; write(0x47, y);\n let at = (read(0x71) + 1) & 0xff;\n write(0xff + at, a & 0x7f);\n write(0x5d, read(0x5d) - 1);\n if (!read(0x5d)) { at = (at + 1) & 0xff; write(0xff + at, 0x2e); }\n write(0x71, at);\n x = (a ^ 0xff) & 0x80;\n if (y === 0x24 || y === 0x3c) break;\n }\n let at = read(0x71), ch;\n do { ch = read(0xff + at); at = (at - 1) & 0xff; } while (ch === 0x30);\n if (ch !== 0x2e) at = (at + 1) & 0xff;\n let e = read(0x5e);\n if (e) {\n let sign = 0x2b; if (e & 0x80) { e = (0 - e) & 0xff; sign = 0x2d; }\n write(0x101 + at, sign); write(0x100 + at, 0x45);\n write(0x103 + at, 0x30 + e % 10); write(0x102 + at, 0x30 + Math.floor(e / 10)); write(0x104 + at, 0);\n } else write(0x100 + at, 0);\n Object.assign(c, { a: 0, y: 1, z: 0, n: 0 });\n };\n H[0xbe68] = digits;\n // GETSPA ($B4F4): A bytes of the strings' space, down from FRETOP ($33), FRESPC ($35) too, X/Y\n // their address; below STREND ($31), the strings collected first ($0F the flag), then OUT OF\n // MEMORY\n H[0xb4f4] = c => {\n const len = c.a;\n write(0x0f, read(0x0f) >> 1);\n for (;;) {\n const at = r16(0x33) - len;\n if (at >= r16(0x31) && at >= 0) { w16(0x33, at); w16(0x35, at); Object.assign(c, { a: len, x: at & 0xff, y: at >> 8 }); return; }\n if (read(0x0f) & 0x80) throw new BasicError('?OUT OF MEMORY ERROR');\n H[0xb526](c); write(0x0f, 0x80);\n }\n };\n // STRINI ($B475: $50/$51 the descriptor's at $64/$65 kept; $B47D): a string of A bytes made\n // room for, its descriptor in the FAC's $61 to $63\n H[0xb47d] = c => { H[0xb4f4](c); write(0x62, c.x); write(0x63, c.y); write(0x61, c.a); };\n H[0xb475] = c => { write(0x50, read(0x64)); write(0x51, read(0x65)); return H[0xb47d](c); };\n // MOVSTR ($B688): A bytes from X/Y to FRESPC ($35), and FRESPC on past them\n H[0xb688] = c => {\n write(0x22, c.x); write(0x23, c.y);\n const from = c.x | c.y << 8, to = r16(0x35), len = c.a;\n for (let k = len - 1; k >= 0; k--) write(to + k, read(from + k));\n w16(0x35, to + len);\n };\n // PUTNEW ($B4CA): the FAC's descriptor ($61 to $63) pushed on the temporary ones (TEMPPT, $16;\n // full at $22, FORMULA TOO COMPLEX), its address at $64/$65, LASTPT ($17) it, $0D a string\n H[0xb4ca] = c => {\n const x = read(0x16);\n if (x === 0x22) throw new BasicError('?FORMULA TOO COMPLEX ERROR');\n write(x, read(0x61)); write(x + 1, read(0x62)); write(x + 2, read(0x63));\n write(0x64, x); write(0x65, 0); write(0x70, 0); write(0x0d, 0xff); write(0x17, x); write(0x16, x + 3);\n Object.assign(c, { x: x + 3, y: 0xff });\n };\n // STRLIT ($B487, the text at A/Y; $B46F at $00FF, FOUT's): to a 0 or a quote; copied into the\n // strings' space if it is in the zero page or the input buffer (page 0 or 2), else left where it\n // is; and PUTNEW\n H[0xb487] = c => {\n write(0x07, 0x22); write(0x08, 0x22);\n const from = c.a | c.y << 8;\n write(0x6f, c.a); write(0x70, c.y); write(0x62, c.a); write(0x63, c.y);\n let y = 0, quote = 0;\n for (; ; y++) { const ch = read(from + y); if (!ch) break; if (ch === 0x22) { quote = 1; break; } }\n write(0x61, y);\n const end = from + y + quote; write(0x71, end & 0xff); write(0x72, end >> 8 & 0xff);\n if (c.y === 0 || c.y === 2) { c.a = y; H[0xb475](c); Object.assign(c, { a: y, x: from & 0xff, y: from >> 8 }); H[0xb688](c); }\n return H[0xb4ca](c);\n };\n H[0xb46f] = c => { Object.assign(c, { a: 0xff, y: 0 }); return H[0xb487](c); };\n // TI$ ($AF48): the clock, as TI's, counted out to its six digits (hours, minutes, seconds; $5E\n // no exponent, $71 the text's start, a point after the sixth and let go), and a string of them\n H[0xaf48] = c => {\n clock(c);\n write(0x5e, 0); write(0x71, 0xff); write(0x5d, 6);\n c.y = 0x24; digits(c);\n return H[0xb46f](c);\n };\n // ($B248) ILLEGAL QUANTITY, as Blitz! jumps there\n H[0xb248] = () => { throw new BasicError('?ILLEGAL QUANTITY ERROR'); };\n // FRESTR ($B6A3): CHKSTR ($AD8F), a string or TYPE MISMATCH, then FREFAC\n H[0xb6a3] = c => { if (!(read(0x0d) & 0x80)) throw new BasicError('?TYPE MISMATCH ERROR'); return H[0xb6a6](c); };\n // ($E25A) a file's name, the string evaluated: FRESTR, and SETNAM ($FFBD) with it\n H[0xe25a] = c => { H[0xb6a3](c); c.x = read(0x22); c.y = read(0x23); return cpu.hooks.get(0xffbd)(c); };\n // GARBAG ($B526), the strings collected, as the ROM does it, byte for byte: the strings' bottom\n // (FRETOP, $33) at the top of memory (MEMSIZ, $37), then, over and over, the highest string\n // below it still to move found (its address $5F/$60, from STREND $31 up; its descriptor's\n // $4E/$4F, and $55 the step it was found with) among the temporary descriptors ($19 to TEMPPT,\n // $16, a step of $53 as it stands), the variables (VARTAB $2D to ARYTAB $2F, seven bytes each, a\n // string's two name bytes top bit clear then set) and the string arrays' elements (to STREND,\n // three bytes each, past each one's header), and moved up to just under the bottom (BLTUC,\n // $A3BF), its descriptor pointed there, and that the bottom; until none is left\n const r16 = a => read(a) | read(a + 1) << 8, w16 = (a, v) => { write(a, v & 0xff); write(a + 1, v >> 8 & 0xff); };\n // (one descriptor at ($22)+y ($B5C7): a string, below the bottom and above the best so far, the\n // best; then $22 on by the step, $53)\n const candidate = y => {\n const at = r16(0x22);\n if (read(at + y)) {\n const lo = read(at + y + 1), hi = read(at + y + 2);\n const below = hi < read(0x34) || (hi === read(0x34) && lo < read(0x33));\n const above = hi > read(0x60) || (hi === read(0x60) && lo >= read(0x5f));\n if (below && above) { write(0x5f, lo); write(0x60, hi); w16(0x4e, at); write(0x55, read(0x53)); }\n }\n w16(0x22, at + read(0x53));\n };\n // BLTUC ($A3BF): the bytes from $5F/$60 to $5A/$5B moved to end at $58/$59, from the top down,\n // a page at a time, those pointers left as the ROM's loop leaves them\n const bltuc = () => {\n const n = (r16(0x5a) - r16(0x5f)) & 0xffff;\n let y = n & 0xff, x = ((n >> 8) + 1) & 0xff;\n write(0x22, y);\n const copy = k => write(r16(0x58) + k, read(r16(0x5a) + k));\n if (y) { w16(0x5a, r16(0x5a) - y); w16(0x58, r16(0x58) - y); }\n for (let first = true; ; first = false) {\n if (!first || y) { do { y = (y - 1) & 0xff; if (y) copy(y); } while (y); copy(0); }\n write(0x5b, (read(0x5b) - 1) & 0xff); write(0x59, (read(0x59) - 1) & 0xff);\n x = (x - 1) & 0xff; if (!x) break;\n }\n };\n H[0xb526] = c => {\n let bottom = r16(0x37);\n for (;;) {\n w16(0x33, bottom); w16(0x4e, 0); w16(0x5f, r16(0x31));\n for (w16(0x22, 0x19); read(0x22) !== read(0x16);) candidate(0);\n write(0x53, 7);\n for (w16(0x22, r16(0x2d)); r16(0x22) !== r16(0x2f);) {\n const at = r16(0x22);\n if (!(read(at) & 0x80) && read(at + 1) & 0x80) candidate(2); else w16(0x22, at + 7);\n }\n w16(0x58, r16(0x2f));\n write(0x53, 3);\n while (r16(0x58) !== r16(0x31)) {\n const at = r16(0x58); w16(0x22, at);\n // (its length added with the carry the comparison with STREND left, clear below it)\n w16(0x58, at + r16(at + 2) + (at >= r16(0x31) ? 1 : 0));\n if (read(at) & 0x80 || !(read(at + 1) & 0x80)) continue;\n // (past its header: five bytes and two for each dimension, the ROM's sum carrying once only)\n const v = ((read(at + 4) << 1) & 0xff) + 5 + (read(at + 4) >> 7);\n w16(0x22, at + (v & 0xff) + (v >> 8));\n while (r16(0x22) !== r16(0x58)) candidate(0);\n }\n if (!r16(0x4e)) { Object.assign(c, { a: 0, x: read(0x23), y: 0, z: 1, n: 0 }); return; }\n const y = (read(0x55) & 4) >> 1; write(0x55, y);\n w16(0x5a, r16(0x5f) + read(r16(0x4e) + y));\n w16(0x58, r16(0x33));\n bltuc();\n write(r16(0x4e) + y + 1, read(0x58));\n write(0x59, (read(0x59) + 1) & 0xff);\n write(r16(0x4e) + y + 2, read(0x59));\n bottom = r16(0x58);\n }\n };\n for (const [a, f] of Object.entries(H)) cpu.hooks.set(+a, f);\n}\n\n// A BASIC error, as the ROM's routine gives it ($A43A, through the vector at $0300): the output\n// back to the screen (CLRCHN), a new line, ? and the message, ERROR, IN and the \"line\" (for\n// Blitz!'s code its program counter at the instruction that failed), then READY. False if the\n// message is not one of BASIC's.\nexport function printError({ cpu, write }, message, line) {\n const what = /^\\?(.*) ERROR$/.exec(message)?.[1];\n if (!ERRORS.includes(what)) return false;\n const out = ch => { cpu.a = ch; cpu.hooks.get(0xffd2)(cpu); };\n const text = s => { for (const ch of s) out(ch.charCodeAt(0)); };\n cpu.hooks.get(0xffcc)(cpu); write(0x13, 0);\n out(0x0d); out(0x3f); text(what); text(' ERROR');\n if (line !== undefined && line >> 8 !== 0xff) { text(' IN '); text(String(line)); }\n text('\\r\\nREADY.\\r\\n');\n write(0x9d, 0x80);\n return true;\n}\n\n// The evaluator on the original: the expression in BASIC's text at an address read\n// (basic-lang.js), made a function by the compiler's own code (basic-compile.js),\n// and worked out by BASIC's own rules (basic.js's), its variables read where BASIC keeps\n// them: its table from VARTAB ($2D) to ARYTAB ($2F), seven bytes each, two of name (a whole\n// number's both with the top bit set, a string's the second) and five of value (a number's five\n// bytes; a whole number's high and low; a string's length and where it is). RND is the ROM's\n// routine at $E097, called as the ROM's evaluator calls it. Each address's function is kept.\nexport function evaluateInMemory({ cpu, read, write, ram }) {\n const f = new Floats({ read, write }), made = new Map();\n const variable = n => {\n const kind = n.endsWith('%') ? '%' : n.endsWith('$') ? '$' : '', name = kind ? n.slice(0, -1) : n;\n const c1 = name.charCodeAt(0) | (kind === '%' ? 0x80 : 0), c2 = (name.charCodeAt(1) || 0) | (kind ? 0x80 : 0);\n const end = read(0x2f) | read(0x30) << 8;\n for (let at = read(0x2d) | read(0x2e) << 8; at < end; at += 7) {\n if (read(at) !== c1 || read(at + 1) !== c2) continue;\n const v = [2, 3, 4, 5, 6].map(k => read(at + k));\n if (kind === '%') return (v[0] << 8 | v[1]) << 16 >> 16;\n if (kind === '$') { let s = ''; const p = v[1] | v[2] << 8; for (let k = 0; k < v[0]; k++) s += String.fromCharCode(read(p + k)); return s; }\n return unpack(v);\n }\n throw new Error(`the variable ${n} not in BASIC's table: its making by PTRGET not handled`);\n };\n const b = Object.assign(Object.create(Basic.prototype), {\n get: variable,\n rnd: () => { cpu.hooks.get(0xe097)(cpu); return f.fac(); },\n });\n // (the text read from RAM, where a program's is: `ram`)\n return at => {\n const { e, end } = expression(ram, at);\n let fn = made.get(at); if (!fn) made.set(at, fn = evaluator(e));\n return { value: fn(b), end, place: e.k === 'str' ? e.at : undefined };\n };\n}\n", "// What Commodore BASIC does for a program, for a remake whose BASIC (or Blitz!'s code) is\n// compiled to JavaScript (basic-compile.js): its variables and arrays, its numbers printed as it\n// prints them, its strings as their bytes, its FOR and GOSUB on one stack, its DATA, and its\n// statements' calls into the KERNAL, made as the original makes them, through the engine, so\n// that they are the same events.\n//\n// const b = new Basic(engine, { data, quiet })\n// data where the program's DATA is in memory (Blitz!'s: each item its length and its text,\n// $FF at the end)\n// quiet BASIC's own interpreter, in the ROM, ran the program: its calls into the KERNAL are\n// the ROM's, and no events (GOLDFIELDS, the boot)\n//\n// Numbers are JavaScript's; a whole-number variable (%) floors what is stored, as BASIC does, and\n// BASIC's errors stop the remake with BASIC's own words. The rules for numbers (FOUT, VAL, RND,\n// the errors) are BASIC's, kept once for every layer in numbers.js.\n\nimport { fail, int16, fout, val, scanNumber, seedRandom, nextRandom, BasicError } from './numbers.js';\n\nexport class Basic {\n constructor(e, { data = 0, quiet = false } = {}) {\n this.e = e; this.data = this.dataStart = data; this.quiet = quiet;\n this.v = Object.create(null); this.arrays = Object.create(null); this.stack = [];\n this.channel = 0;\n }\n // where the operation is that may fail next, as Blitz!'s program counter has it then: BASIC's\n // error gives it as its line (the engine's `error`)\n here(at) { this.at = at; }\n // a variable's value, 0 or \"\" until it is set\n get(n) { return this.v[n] ?? (n.endsWith('$') ? '' : 0); }\n set(n, x) {\n if (n.endsWith('$')) { if (typeof x !== 'string') fail('TYPE MISMATCH'); if (x.length > 255) fail('STRING TOO LONG'); this.v[n] = x; return; }\n if (typeof x !== 'number') fail('TYPE MISMATCH');\n this.v[n] = n.endsWith('%') ? int16(x) : x;\n }\n clr() { this.v = Object.create(null); this.arrays = Object.create(null); this.stack = []; this.fns = null; }\n // RUN: every file closed (the KERNAL's CLALL), the variables cleared and DATA from its start,\n // the program run again to its DIMs and on from `back`\n run(back) { const m = this.e.mem; m[0x98] = 0; m[0x99] = 0; m[0x9a] = 3; this.clr(); this.data = this.dataStart; this.datum = 0; this.resume = back; }\n\n // arrays: DIM's sizes are the last index of each dimension\n dim(n, sizes) { if (this.arrays[n]) fail('REDIM\\'D ARRAY'); const dims = sizes.map(s => int16(s) + 1), size = dims.reduce((a, b) => a * b, 1); this.arrays[n] = { dims, data: new Array(size).fill(n.endsWith('$') ? '' : 0) }; }\n place(n, i) {\n const a = this.arrays[n] ?? (this.dim(n, i.map(() => 10)), this.arrays[n]);\n if (i.length !== a.dims.length) fail('BAD SUBSCRIPT');\n let k = 0; for (let d = 0; d < i.length; d++) { const x = int16(i[d]); if (x < 0 || x >= a.dims[d]) fail('BAD SUBSCRIPT'); k = k * a.dims[d] + x; }\n return [a, k];\n }\n elem(n, i) { const [a, k] = this.place(n, i); return a.data[k]; }\n setElem(n, i, x) {\n const [a, k] = this.place(n, i);\n if (n.endsWith('$') !== (typeof x === 'string')) fail('TYPE MISMATCH');\n a.data[k] = n.endsWith('%') ? int16(x) : x;\n }\n\n // operators: comparisons give -1 or 0, AND, OR and NOT work on whole numbers of 16 bits\n add(a, b) { if (typeof a !== typeof b) fail('TYPE MISMATCH'); if (typeof a === 'string' && a.length + b.length > 255) fail('STRING TOO LONG'); return a + b; }\n num(a) { if (typeof a !== 'number') fail('TYPE MISMATCH'); return a; }\n cmp(a, b, o) {\n if (typeof a !== typeof b) fail('TYPE MISMATCH');\n const c = a < b ? -1 : a > b ? 1 : 0;\n return ({ '=': c === 0, '<>': c !== 0, '<': c < 0, '>': c > 0, '<=': c <= 0, '>=': c >= 0 })[o] ? -1 : 0;\n }\n and(a, b) { return int16(this.num(a)) & int16(this.num(b)); }\n or(a, b) { return int16(this.num(a)) | int16(this.num(b)); }\n not(a) { return ~int16(this.num(a)); }\n div(a, b) { if (this.num(b) === 0) fail('DIVISION BY ZERO'); return this.num(a) / b; }\n\n pow(a, b) { a = this.num(a); b = this.num(b); if (a < 0 && b !== Math.floor(b)) fail('ILLEGAL QUANTITY'); return a ** b; }\n\n // functions\n int(x) { return Math.floor(this.num(x)); }\n abs(x) { return Math.abs(this.num(x)); }\n sqr(x) { if (this.num(x) < 0) fail('ILLEGAL QUANTITY'); return Math.sqrt(x); }\n log(x) { if (this.num(x) <= 0) fail('ILLEGAL QUANTITY'); return Math.log(x); }\n exp(x) { return Math.exp(this.num(x)); }\n sin(x) { return Math.sin(this.num(x)); }\n cos(x) { return Math.cos(this.num(x)); }\n tan(x) { return Math.tan(this.num(x)); }\n atn(x) { return Math.atan(this.num(x)); }\n len(s) { if (typeof s !== 'string') fail('TYPE MISMATCH'); return s.length; }\n val(s) { if (typeof s !== 'string') fail('TYPE MISMATCH'); return val(s); }\n rnd() { return this.random(); }\n fre() { return 0; }\n usr() { fail('UNDEF\\'D FUNCTION'); }\n sgn(x) { return Math.sign(this.num(x)); }\n chr(x) { const n = int16(x); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); return String.fromCharCode(n); }\n asc(s) { if (!s.length) fail('ILLEGAL QUANTITY'); return s.charCodeAt(0); }\n str(x) { return fout(this.num(x)); }\n left(s, n) { n = int16(n); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); return s.slice(0, n); }\n right(s, n) { n = int16(n); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); return n ? s.slice(-n) : ''; }\n mid(s, from, n = 255) { from = int16(from); n = int16(n); if (from < 1 || from > 255 || n < 0 || n > 255) fail('ILLEGAL QUANTITY'); return s.substr(from - 1, n); }\n peek(a) { a = Math.floor(this.num(a)); if (a < 0 || a > 0xffff) fail('ILLEGAL QUANTITY'); return this.e.read(a); }\n // RND: the seed's numbers, the same on the original (basic-rom.js's RND draws them too)\n // (kept on the engine, one run of them for the boot and the game, as the ROM's is one)\n random() { const e = this.e; e.randomState = nextRandom(e.randomState ?? seedRandom(e.title.seed ?? 0x11)); return e.randomState / 2 ** 32; }\n // TI, the clock at $A0 to $A2; TI$ as its hours, minutes and seconds\n // (a program's read of the clock takes the interrupts first, as a poll of GETIN does, so that a\n // wait it counts out moves on, the same on the original)\n // (but only every so many reads, the title's `reads`, and not after a poll of GETIN has taken\n // them since the last read)\n ti() {\n const e = this.e, m = e.mem;\n if (!e.clock && !this.quiet) {\n if (e.polledSince) { e.polledSince = false; e.reads = 0; }\n else if ((e.reads = (e.reads ?? 0) + 1) >= (e.routines.reads ?? 1)) { e.reads = 0; e.routines.poll(e); }\n }\n return m[0xa0] * 65536 + m[0xa1] * 256 + m[0xa2];\n }\n tis() { const t = Math.floor(this.ti() / 60); return [Math.floor(t / 3600) % 24, Math.floor(t / 60) % 60, t % 60].map(n => String(n).padStart(2, '0')).join(''); }\n // TI$ set: through the KERNAL's SETTIM, as the original sets it (A the clock's low byte, Y its high)\n setTis(s) { if (!/^\\d{6}$/.test(s)) fail('ILLEGAL QUANTITY'); const t = ((+s.slice(0, 2) * 60 + +s.slice(2, 4)) * 60 + +s.slice(4)) * 60, e = this.e; e.a = t & 0xff; e.x = t >> 8 & 0xff; e.y = t >> 16 & 0xff; this.call('settim'); }\n st() { return this.e.mem[0x90]; }\n poke(a, v) { a = Math.floor(this.num(a)); v = Math.floor(this.num(v)); if (a < 0 || a > 0xffff || v < 0 || v > 255) fail('ILLEGAL QUANTITY'); this.e.write(a, v); }\n\n // the time a statement took on the original, in its cycles, for the page's clock\n cost(n) { const e = this.e; e.cycles += n; e.delay += n / 1022.727; }\n // SYS, and the statements that go through the KERNAL's files: the engine's\n sys(at, text, step) { return this.e.routines.sys(this.e, Math.floor(this.num(at)), text, step); }\n undef() { fail('UNDEF\\'D STATEMENT'); }\n // READ from DATA in BASIC's own text (`items`, basic-lang.js `dataItems`): the next item, a\n // string as it is, a number as FIN reads it, anything else in it a SYNTAX ERROR IN the DATA's\n // line, as BASIC gives it; RESTORE, from the first again\n readText(string) {\n const item = this.items[this.datum ?? 0];\n if (!item) fail('OUT OF DATA');\n this.datum = (this.datum ?? 0) + 1;\n if (string) return item.text;\n const t = item.text.replace(/ /g, '');\n if (item.quoted || !/^[+-]?(\\d+\\.?\\d*|\\.\\d*)?(E[+-]?\\d*)?$/.test(t)) { const err = new BasicError('?SYNTAX ERROR'); err.basicLine = item.line; throw err; }\n return val(t);\n }\n restore() { this.datum = 0; this.data = this.dataStart; }\n // DEF FN and FN: a function of one variable, which while it is worked out holds the argument,\n // and then its own value again, as BASIC's FN does; one not defined, UNDEF'D FUNCTION; DEF only\n // in a program, not typed at once (ILLEGAL DIRECT)\n def(n, p, f) { if (this.e.mem[0x3a] === 0xff) fail('ILLEGAL DIRECT'); (this.fns ??= Object.create(null))[n] = { p, f }; }\n fn(n, x) {\n const d = this.fns?.[n];\n if (!d) fail('UNDEF\\'D FUNCTION');\n const was = this.v[d.p], arg = this.num(x);\n this.set(d.p, arg);\n try { return d.f(this); } finally { if (was === undefined) delete this.v[d.p]; else this.v[d.p] = was; }\n }\n failWith(what) { fail(what); }\n statement(k, args, into, step) {\n const f = this.e.routines['basic-' + k];\n if (!f) throw new Error(k.toUpperCase() + ' is not handled');\n return f(this.e, args, into, step);\n }\n pos() { return this.e.mem[0xd3] % 40; }\n\n // FOR and GOSUB on one stack, as BASIC keeps them: a FOR of a variable already looping drops\n // that loop and what is above it; NEXT drops the loops above its own; RETURN, everything above\n // its GOSUB\n for(n, to, step, next) {\n const k = this.stack.findLastIndex(f => f.for === n);\n if (k >= 0) this.stack.length = k;\n this.stack.push({ for: n, to: this.num(to), step: this.num(step), next });\n }\n next(n) {\n const k = n ? this.stack.findLastIndex(f => f.for === n) : this.stack.findLastIndex(f => f.for !== undefined);\n if (k < 0 || (n === null && this.stack.slice(k + 1).some(f => f.gosub !== undefined))) fail('NEXT WITHOUT FOR');\n this.stack.length = k + 1;\n const f = this.stack[k], x = this.get(f.for) + f.step;\n this.set(f.for, x);\n if (f.step >= 0 ? x <= f.to : x >= f.to) return f.next;\n this.stack.length = k;\n return null;\n }\n gosub(back) { this.stack.push({ gosub: back }); }\n ret() { const k = this.stack.findLastIndex(f => f.gosub !== undefined); if (k < 0) fail('RETURN WITHOUT GOSUB'); const back = this.stack[k].gosub; this.stack.length = k; return back; }\n on(x) { const k = Math.floor(this.num(x)); if (k < 0 || k > 255) fail('ILLEGAL QUANTITY'); return k; }\n\n // READ, from DATA as Blitz! keeps it\n read(string) {\n if (this.items) return this.readText(string);\n const m = this.e.mem, n = m[this.data];\n if (n & 0x80) fail('OUT OF DATA');\n const s = String.fromCharCode(...m.subarray(this.data + 1, this.data + 1 + n));\n this.data += 1 + n;\n return string ? s : val(s);\n }\n\n // the KERNAL's calls, through the engine: CHROUT a byte at a time, GETIN\n out(ch) { const e = this.e; e.a = ch; this.call('chrout'); }\n call(name) { const e = this.e; if (this.quiet) e.inside++; try { e.routines[name](e, [], null); } finally { if (this.quiet) e.inside--; } }\n // PRINT: a number written as FOUT writes it, then a step right on the screen or a space to a\n // file; a string as it is\n print(x) {\n if (typeof x === 'number') { for (const c of fout(x)) this.out(c.charCodeAt(0)); this.out(this.e.mem[0x13] ? 0x20 : 0x1d); }\n else for (let k = 0; k < x.length; k++) this.out(x.charCodeAt(k));\n }\n // a new line: a carriage return, and a line feed after it to a file numbered from 128\n newline() { this.out(0x0d); if (this.e.mem[0x13] & 0x80) this.out(0x0a); }\n\n // files, through the KERNAL: OPEN's parameters (the file, the device, 1 if not given, the\n // secondary address, 0, or 255 below device 3, and the name) as BASIC sets them, then OPEN;\n // CLOSE; PRINT# and INPUT#, the output's or the input's file, which $13 notes for PRINT\n open([la, fa = 1, sa, name = '']) {\n const m = this.e.mem;\n m[0xb8] = int16(la) & 0xff; m[0xba] = int16(fa) & 0xff; m[0xb9] = sa === undefined ? (m[0xba] < 3 ? 0xff : 0) : int16(sa) & 0xff;\n // (a name through SETNAM, as Blitz!'s OPEN gives it, from a place of the remake's own)\n for (let k = 0; k < name.length; k++) m[0x200 + k] = name.charCodeAt(k);\n if (name.length) { Object.assign(this.e, { a: name.length, x: 0x00, y: 0x02 }); this.call('setnam'); }\n else m[0xb7] = 0;\n this.call('open');\n if (this.e.c) fail(['', 'TOO MANY FILES', 'FILE OPEN', 'FILE NOT OPEN'][this.e.a] ?? 'DEVICE NOT PRESENT');\n }\n close(la) { this.e.a = int16(la) & 0xff; this.call('close'); }\n output(n) { this.e.mem[0x13] = int16(n) & 0xff; this.e.x = this.e.mem[0x13]; this.call('chkout'); }\n input(n) { this.e.mem[0x13] = int16(n) & 0xff; this.e.x = this.e.mem[0x13]; this.call('chkin'); this.line = null; }\n clrchn() { this.call('clrchn'); this.e.mem[0x13] = 0; }\n // WAIT: whether the place's bits, flipped by `xor`, meet the mask yet, as the ROM's loop reads\n // them ($B840); a key pressed on the page goes into the KERNAL's buffer meanwhile, as the\n // keyboard puts it there\n wait(at, mask, xor = 0) {\n const e = this.e, m = e.mem;\n if (!m[0xc6] && e.keys.length) { const k = e.keys.shift(); if (k >= 0) { m[0x277] = k; m[0xc6] = 1; } }\n return ((this.peek(at) ^ int16(xor)) & int16(mask)) !== 0;\n }\n // INPUT from a file (Microsoft's GETAGN and INLOOP): a line read with CHRIN to its carriage\n // return, the first an INPUT# reads read again while it is empty, a later one empty its items\n // empty; a read timed out (ST bit 1), the INPUT given up, its variables as they were\n // (`given up`); then its items, each to a comma: a string quoted to its quote, or to a comma\n // or a colon; a number as FIN reads it, a comma, a colon or the line's end after it, or\n // ?FILE DATA ERROR\n readLine(first) {\n for (;;) {\n let s = '';\n for (;;) { this.call('chrin'); if (this.e.a === 0x0d) break; s += String.fromCharCode(this.e.a); if (s.length > 88) fail('STRING TOO LONG'); }\n if (this.e.mem[0x90] & 2) { this.givenUp = true; return ''; }\n if (s.length || !first) return s;\n }\n }\n item(string, first) {\n if (first) this.givenUp = false;\n if (first || this.line === null || this.linePos >= this.line.length) { this.line = this.readLine(first); this.linePos = 0; }\n if (this.givenUp) return undefined;\n const s = this.line; let k = this.linePos;\n while (s[k] === ' ') k++;\n let v;\n if (string && s[k] === '\"') { const end = s.indexOf('\"', k + 1); v = s.slice(k + 1, end < 0 ? s.length : end); k = end < 0 ? s.length : end + 1; while (s[k] === ' ') k++; }\n else if (string) { let end = k; while (end < s.length && s[end] !== ',' && s[end] !== ':') end++; v = s.slice(k, end); k = end; }\n else { const n = scanNumber(s, k); v = n.text; k = n.end; }\n if (k < s.length && s[k] !== ',' && s[k] !== ':') fail('FILE DATA');\n if (s[k] === ',') k++;\n this.linePos = k;\n return string ? v : val(v);\n }\n // the end of an INPUT: from a file, the input back to the keyboard (Blitz!'s $1AAA)\n inputDone() {\n if (this.e.mem[0x13]) { this.call('clrchn'); this.e.mem[0x13] = 0; return; }\n throw new Error('INPUT from the keyboard is not handled');\n }\n // GET#'s character: GETIN from the file CHKIN chose, \"\" for none\n getFrom() { this.call('getin'); return this.e.a ? String.fromCharCode(this.e.a) : ''; }\n // `,`: on to the next column of ten\n comma() { const c = this.e.mem[0xd3] % 40; let n = 10 - c % 10; while (n--) this.out(this.e.mem[0x13] ? 0x20 : 0x1d); }\n spc(n) { n = int16(n); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); while (n-- > 0) this.out(this.e.mem[0x13] ? 0x20 : 0x1d); }\n tab(n) { n = int16(n); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); let k = n - this.e.mem[0xd3] % 40; while (k-- > 0) this.out(0x1d); }\n // GET: the key from GETIN, or \"\" with none; Blitz!'s calls CLRCHN after each, as its handler\n // does ($16CD), and BASIC's, in the ROM, does not\n // (the run stops for a key as GETIN returns, as the original does, its CLRCHN still to come:\n // null, and the step runs again for the rest)\n key() {\n if (this.got === undefined) {\n this.e.mem[0x13] = 0; this.call('getin'); this.got = this.e.a;\n if (this.e.polled && !this.quiet) return null;\n }\n const k = this.got; this.got = undefined;\n if (!this.quiet) this.call('clrchn');\n return k ? String.fromCharCode(k) : '';\n }\n}\n\n", "// A Commodore 64 (machine.js) in a browser page: the keys as the C64's matrix, the arrows as the\n// joystick and the cursor keys, Escape as RUN/STOP, Control the Commodore key (and fire), Tab\n// CTRL; a gamepad (an 8BitDo, or any in the browser's standard mapping) as the joystick too; the\n// frame painted on a canvas doubled; and the machine run 50 frames a second, keeping up with the\n// clock, two frames at most at a time.\n//\n// const keys = keyboard(m, { ignore, onKey, log }) ignore(e): a key the page keeps (a pane's)\n// keys.press(column, row, frames) a key held for so many frames (RUN/STOP)\n// const draw = painter(canvas) draw(m.vic.frame)\n// pace(m, after) the frames run; after() each animation frame\nimport { MATRIX, SHIFTED, JOYSTICK, CURSOR, MODIFIERS } from './keys.js';\nimport { PALETTE, WIDTH, HEIGHT } from './vic.js';\n\nconst PAD_DEAD = 0.4; // a stick pushed less far than this is at rest (the dead zone)\n\nexport function keyboard(m, { ignore = () => false, onKey = () => {}, log = false } = {}) {\n // (a letter by the key it is, not the character the browser makes of it: in the C64's first\n // character set, capitals and graphics, a letter is a letter, Shift or Caps Lock or not, and\n // Option with it is its graphic, the C64's shifted letter; in the second, small letters and\n // capitals, Shift is a capital, as on the C64)\n const upper = () => !((m.vic?.r[0x18] ?? 0x15) & 2);\n // (a key let go within two frames of going down is held to the end of them: the KERNAL scans\n // the keyboard once a frame, and a tap shorter than that, which a real key never is, would\n // never be seen)\n const down = new Map(), held = [], pressed = new Map(), withCbm = new Set();\n let frame = 0;\n const release = (key, shift) => {\n const since = frame - (pressed.get(key) ?? -9);\n if (since >= 2) { m.key(key[0], key[1], false); if (shift) m.key(1, 7, false); return; }\n held.push([key[0], key[1], 2 - since]); if (shift) held.push([1, 7, 2 - since]);\n };\n window.addEventListener('keydown', e => {\n if (ignore(e)) return;\n onKey(e);\n if (e.metaKey || e.repeat) return;\n if (MODIFIERS[e.key]) { m.key(...MODIFIERS[e.key], true); e.preventDefault(); }\n if (JOYSTICK[e.key]) { m.joystick |= JOYSTICK[e.key]; const cur = CURSOR[e.key]; if (cur) { if (cur[2]) m.key(1, 7, true); m.key(cur[0], cur[1], true); } e.preventDefault(); return; }\n const letter = /^Key([A-Z])$/.exec(e.code)?.[1]?.toLowerCase();\n const shifted = letter ? null : SHIFTED[e.key], key = letter ? MATRIX[letter] : shifted ? MATRIX[shifted] : MATRIX[e.key] || MATRIX[e.key.toLowerCase()];\n if (!key) { if (MODIFIERS[e.key]) e.preventDefault(); return; }\n // (the left shift: a letter's graphic, a shifted sign, and shift with a function key, F2, F4, F6\n // and F8 being shift with F1, F3, F5 and F7 on the 64)\n if (letter ? (upper() ? e.altKey : e.shiftKey) : shifted || (e.key.length === 1 && e.key !== e.key.toLowerCase() && !/[0-9]/.test(e.key)) || (e.shiftKey && /^F[1357]$/.test(e.key))) m.key(1, 7, true);\n // (Control held, as the event says, the Commodore key down with the key, if Control's own\n // keydown has not put it there, and let go with it)\n const [cc, cr] = MODIFIERS.Control, cbm = e.ctrlKey && !(m.keys[cc] & 1 << cr) ? MODIFIERS.Control : null;\n if (cbm) { m.key(...cbm, true); pressed.set(cbm, frame); }\n m.key(key[0], key[1], true); down.set(e.code, key); pressed.set(key, frame); if (cbm) withCbm.add(e.code);\n if (log) console.log('key', JSON.stringify(e.key), '-> column', key[0], 'row', key[1]);\n e.preventDefault();\n });\n window.addEventListener('keyup', e => {\n if (MODIFIERS[e.key]) m.key(...MODIFIERS[e.key], false);\n if (JOYSTICK[e.key]) { m.joystick &= ~JOYSTICK[e.key]; const cur = CURSOR[e.key]; if (cur) { m.key(cur[0], cur[1], false); if (cur[2]) m.key(1, 7, false); } return; }\n const key = down.get(e.code);\n if (key) { release(key, true); if (withCbm.delete(e.code)) release(MODIFIERS.Control, false); down.delete(e.code); } else m.key(1, 7, false);\n });\n // the page left (another window, another tab, Cmd-Tab): the browser sends no keyup for what was\n // held, so everything is let go, the keys, the joystick and fire, or a key (CTRL by Tab, Shift's\n // fire) would stay down and every key after it be read wrongly\n const letGo = () => { m.keys.fill(0); m.joystick = 0; down.clear(); held.length = 0; pressed.clear(); withCbm.clear(); padBits = 0; padStop = false; };\n // a gamepad, read each frame in the browser's standard mapping: the D-pad or the left stick\n // (pushed past PAD_DEAD) the joystick in port 2, A or B its fire, Start RUN/STOP; added to what\n // the keys hold, and let go with the pad\n let padBits = 0, padStop = false;\n const readPads = () => {\n if (typeof navigator === 'undefined' || typeof navigator.getGamepads !== 'function') return;\n let bits = 0, stop = false;\n for (const p of navigator.getGamepads()) {\n if (!p || !p.connected) continue;\n const b = i => !!p.buttons[i]?.pressed, x = p.axes[0] ?? 0, y = p.axes[1] ?? 0;\n if (b(12) || y < -PAD_DEAD) bits |= 1;\n if (b(13) || y > PAD_DEAD) bits |= 2;\n if (b(14) || x < -PAD_DEAD) bits |= 4;\n if (b(15) || x > PAD_DEAD) bits |= 8;\n if (b(0) || b(1)) bits |= 16;\n if (b(9)) stop = true;\n }\n m.joystick = (m.joystick & ~padBits) | bits; padBits = bits;\n if (stop !== padStop) { m.key(7, 7, stop); padStop = stop; }\n };\n window.addEventListener('blur', letGo);\n document.addEventListener('visibilitychange', () => { if (document.hidden) letGo(); });\n return {\n // a key held for so many frames, then let go (frame() lets them go)\n press(column, row, frames = 3) { m.key(column, row, true); held.push([column, row, frames]); },\n frame() { frame++; readPads(); for (let i = held.length - 1; i >= 0; i--) if (--held[i][2] <= 0) { m.key(held[i][0], held[i][1], false); held.splice(i, 1); } },\n };\n}\n\nexport function painter(canvas) {\n const ctx = canvas.getContext('2d');\n canvas.width = WIDTH * 2; canvas.height = HEIGHT * 2;\n const rgba = new Uint8ClampedArray(WIDTH * 2 * HEIGHT * 2 * 4), image = new ImageData(rgba, WIDTH * 2, HEIGHT * 2);\n return f => {\n for (let y = 0; y < HEIGHT; y++) for (let x = 0; x < WIDTH; x++) {\n const [r, g, b] = PALETTE[f[y * WIDTH + x]];\n for (let dy = 0; dy < 2; dy++) { let o = (((y * 2 + dy) * WIDTH * 2) + x * 2) * 4; for (let dx = 0; dx < 2; dx++) { rgba[o++] = r; rgba[o++] = g; rgba[o++] = b; rgba[o++] = 255; } }\n }\n ctx.putImageData(image, 0, 0);\n };\n}\n\n// the C64's 50 frames a second, kept up with the clock (two at most at a time, so a tab left in\n// the background does not run on and on when it comes back); each(frame) after each one run\nexport function pace(m, after, each = () => {}) {\n let frames = 0;\n const started = performance.now();\n function tick() {\n const due = Math.min(2, Math.floor((performance.now() - started) / 20) - frames);\n for (let i = 0; i < due; i++) { m.runFrame(); frames++; each(frames); }\n after(frames);\n requestAnimationFrame(tick);\n }\n tick();\n}\n", "// The browser's keys as the C64's keyboard matrix, column then row, and the joystick in port 2\n// on the arrow keys with the fire button on the left control key or shift.\nexport const MATRIX = {\n Backspace: [0, 0], Delete: [0, 0], Enter: [0, 1], F7: [0, 3], F1: [0, 4], F3: [0, 5], F5: [0, 6],\n '3': [1, 0], w: [1, 1], a: [1, 2], '4': [1, 3], z: [1, 4], s: [1, 5], e: [1, 6],\n '5': [2, 0], r: [2, 1], d: [2, 2], '6': [2, 3], c: [2, 4], f: [2, 5], t: [2, 6], x: [2, 7],\n '7': [3, 0], y: [3, 1], g: [3, 2], '8': [3, 3], b: [3, 4], h: [3, 5], u: [3, 6], v: [3, 7],\n '9': [4, 0], i: [4, 1], j: [4, 2], '0': [4, 3], m: [4, 4], k: [4, 5], o: [4, 6], n: [4, 7],\n '+': [5, 0], p: [5, 1], l: [5, 2], '-': [5, 3], '.': [5, 4], ':': [5, 5], '@': [5, 6], ',': [5, 7],\n '\u00A3': [6, 0], '*': [6, 1], ';': [6, 2], Home: [6, 3], '=': [6, 5], '^': [6, 6], '/': [6, 7],\n '1': [7, 0], _: [7, 1], '2': [7, 3], ' ': [7, 4], q: [7, 6], Escape: [7, 7],\n};\n// keys that need shift on the C64: the shifted character (or function key) and its unshifted key\nexport const SHIFTED = { '!': '1', '\"': '2', '#': '3', '$': '4', '%': '5', '&': '6', \"'\": '7', '(': '8', ')': '9', '?': '/', '<': ',', '>': '.', '[': ':', ']': ';',\n F2: 'F1', F4: 'F3', F6: 'F5', F8: 'F7' }; // (F2, F4, F6 and F8 are shift with F1, F3, F5 and F7 on the 64)\n// the C64's own modifier keys, where VICE puts them: Control the Commodore key (and the\n// joystick's fire too), Tab CTRL\nexport const MODIFIERS = { Control: [7, 5], Tab: [7, 2] };\nexport const JOYSTICK = { ArrowUp: 1, ArrowDown: 2, ArrowLeft: 4, ArrowRight: 8, Control: 16, Shift: 16, Alt: 16 };\n// the arrow keys are also the cursor keys: down and right, and with shift, up and left\nexport const CURSOR = { ArrowDown: [0, 7, 0], ArrowRight: [0, 2, 0], ArrowUp: [0, 7, 1], ArrowLeft: [0, 2, 1] };\n", "// The VIC-II, drawn a raster line at a time into a frame of 384 by 272: the 320 by 200 screen\n// with the border around it. Text in the standard, multicolor and extended modes, bitmaps in\n// hi-res and multicolor, the eight sprites with their expansion, priority and multicolor, and\n// the raster interrupt. The VIC-II reads memory in the 16K bank CIA2 selects, and sees the\n// character ROM at $1000 in the first and third banks.\nexport const PALETTE = [[0, 0, 0], [255, 255, 255], [136, 0, 0], [170, 255, 238], [204, 68, 204], [0, 204, 85], [0, 0, 170], [238, 238, 119],\n [221, 136, 85], [102, 68, 0], [255, 119, 119], [51, 51, 51], [119, 119, 119], [170, 255, 102], [0, 136, 255], [187, 187, 187]];\n\nexport const WIDTH = 384, HEIGHT = 272, LEFT = 32, TOP = 35; // where the 320 by 200 screen sits in the frame\nconst FIRST_LINE = 16, LAST_LINE = 287; // the raster lines of the frame's 272, out of 312\n\nexport class VIC {\n constructor(m) {\n this.m = m; this.r = new Uint8Array(0x40); this.r[0x11] = 0x1b; this.r[0x16] = 0xc8; this.r[0x18] = 0x14;\n this.frame = new Uint8Array(WIDTH * HEIGHT); // a color a pixel\n this.rasterIrq = false; this.spriteHits = 0; this.spriteBackground = 0; this.inside = [0, WIDTH - 1];\n this.priority = new Uint8Array(WIDTH); // this line: 1 where the background's foreground is\n }\n read(r) {\n if (r === 0x11) return (this.r[0x11] & 0x7f) | ((this.m.line >> 1) & 0x80);\n if (r === 0x12) return this.m.line & 0xff;\n if (r === 0x19) return this.r[0x19] | 0x70;\n if (r === 0x1e) { const v = this.spriteHits; this.spriteHits = 0; return v; }\n if (r === 0x1f) { const v = this.spriteBackground; this.spriteBackground = 0; return v; }\n if (r >= 0x20 && r < 0x2f) return this.r[r] | 0xf0;\n return this.r[r];\n }\n write(r, v) {\n if (r === 0x19) { this.r[0x19] &= ~(v & 0x0f); return; } // acknowledged by writing the bit\n this.r[r] = v;\n }\n irq() {\n const line = this.m.line, target = this.r[0x12] | (this.r[0x11] & 0x80) << 1;\n if (line === target && !this.rasterIrq) { this.rasterIrq = true; this.r[0x19] |= 1; }\n if (line !== target) this.rasterIrq = false;\n if (this.r[0x19] & this.r[0x1a] & 0x0f) { this.r[0x19] |= 0x80; return true; }\n return false;\n }\n // the VIC-II's view of memory\n bank() { return (~this.m.cia2.pra & 3) << 14; }\n fetch(a) { const b = this.bank(), full = b | (a & 0x3fff); if ((full & 0x7000) === 0x1000 && !(b & 0x4000)) return this.m.chargen[full & 0xfff]; return this.m.ram[full]; }\n\n // the raster line `y` of the frame, into the pixels\n line(y) {\n if (y < FIRST_LINE || y > LAST_LINE) return;\n const py = y - FIRST_LINE, out = this.frame, row = py * WIDTH, r = this.r;\n const border = r[0x20] & 15, bg = r[0x21] & 15;\n const den = r[0x11] & 0x10, rsel = r[0x11] & 8, csel = r[0x16] & 8;\n const top = rsel ? 51 : 55, bottom = rsel ? 250 : 246, left = csel ? 24 : 31, right = csel ? 343 : 334;\n const prio = this.priority; prio.fill(0);\n for (let x = 0; x < WIDTH; x++) out[row + x] = border;\n if (!den || y < top || y > bottom) { this.sprites(y, row, true); return; }\n const yscroll = r[0x11] & 7, xscroll = r[0x16] & 7, bitmap = r[0x11] & 0x20, ecm = r[0x11] & 0x40, mcm = r[0x16] & 0x10;\n const screenBase = ((r[0x18] >> 4) & 15) << 10, charBase = ((r[0x18] >> 1) & 7) << 11, bitmapBase = (r[0x18] & 8) << 10;\n const sy = y - 48 - yscroll; // the line within the 200 of the screen: with the usual scroll of 3, the first is raster 51\n if (sy < 0 || sy >= 200) { this.sprites(y, row, false); return; }\n const cy = sy >> 3, ly = sy & 7;\n for (let cx = 0; cx < 40; cx++) {\n const cell = cy * 40 + cx, code = this.fetch(screenBase + cell), color = this.m.color[cell] & 15;\n let bits, colors;\n if (bitmap) {\n bits = this.fetch(bitmapBase + cell * 8 + ly);\n colors = mcm ? [bg, code >> 4, code & 15, color] : [code & 15, code >> 4];\n } else {\n bits = this.fetch(charBase + ((ecm ? code & 0x3f : code) << 3) + ly);\n if (ecm) colors = [r[0x21 + (code >> 6)] & 15, color];\n else if (mcm && color & 8) colors = [bg, r[0x22] & 15, r[0x23] & 15, color & 7];\n else colors = [bg, color];\n }\n const multi = colors.length === 4 && (bitmap ? true : true);\n const x0 = LEFT + xscroll + cx * 8;\n if (multi && (bitmap || (mcm && (color & 8)))) {\n for (let k = 0; k < 4; k++) { const pair = (bits >> (6 - k * 2)) & 3, c = colors[pair]; const x = x0 + k * 2; if (x >= 0 && x + 1 < WIDTH) { out[row + x] = c; out[row + x + 1] = c; if (pair >= 2) { prio[x] = 1; prio[x + 1] = 1; } } }\n } else {\n for (let k = 0; k < 8; k++) { const set = (bits >> (7 - k)) & 1, x = x0 + k; if (x >= 0 && x < WIDTH) { out[row + x] = set ? colors[1] : colors[0]; if (set) prio[x] = 1; } }\n }\n }\n // the side borders over the screen's edge, and the whole border row outside it; the border over\n // the sprites too, as the 64's is (they show in it only where a program opens it)\n for (let x = 0; x < LEFT + left - 24; x++) out[row + x] = border;\n for (let x = LEFT + right - 24 + 1; x < WIDTH; x++) out[row + x] = border;\n this.inside = [LEFT + left - 24, LEFT + right - 24];\n this.sprites(y, row, false);\n }\n\n // the sprites on raster line `y`: each is 24 by 21 at its position, doubled when expanded,\n // its pixels from the 63 bytes its pointer names, over or under the background by priority. A\n // sprite shows from the line after its Y: the VIC-II reads its first line's data on line Y and\n // shows it on the next (as VICE shows it, held against it on Subway Arts' curtains)\n sprites(y, row, borderOnly) {\n const r = this.r, enabled = r[0x15];\n if (!enabled) return;\n const screenBase = ((r[0x18] >> 4) & 15) << 10, out = this.frame, prio = this.priority;\n const drawn = new Uint8Array(WIDTH); // which sprite drew each pixel, plus one\n for (let s = 7; s >= 0; s--) {\n if (!(enabled & (1 << s))) continue;\n const sx = r[s * 2] | ((r[0x10] >> s) & 1) << 8, sy = r[s * 2 + 1], yx = r[0x17] & (1 << s), xx = r[0x1d] & (1 << s);\n const height = yx ? 42 : 21;\n const ry = y - sy - 1; // the sprite is placed by raster line, from the one after its Y\n if (ry < 0 || ry >= height) continue;\n const line = yx ? ry >> 1 : ry, pointer = this.fetch(screenBase + 0x3f8 + s), data = pointer << 6;\n const multi = r[0x1c] & (1 << s), behind = r[0x1b] & (1 << s), color = r[0x27 + s] & 15;\n const px0 = LEFT + sx - 24;\n for (let byte = 0; byte < 3; byte++) {\n const bits = this.fetch(data + line * 3 + byte);\n if (multi) {\n for (let k = 0; k < 4; k++) { const pair = (bits >> (6 - k * 2)) & 3; if (!pair) continue; const c = pair === 1 ? r[0x25] & 15 : pair === 2 ? color : r[0x26] & 15; const base = (byte * 8 + k * 2) * (xx ? 2 : 1); for (let d = 0; d < (xx ? 4 : 2); d++) this.spritePixel(row, px0 + base + d, c, s, behind, drawn, borderOnly); }\n } else {\n for (let k = 0; k < 8; k++) { if (!((bits >> (7 - k)) & 1)) continue; const base = (byte * 8 + k) * (xx ? 2 : 1); for (let d = 0; d < (xx ? 2 : 1); d++) this.spritePixel(row, px0 + base + d, color, s, behind, drawn, borderOnly); }\n }\n }\n }\n }\n spritePixel(row, x, c, s, behind, drawn, borderOnly) {\n if (x < 0 || x >= WIDTH) return;\n if (drawn[x]) { this.spriteHits |= (1 << s) | (1 << (drawn[x] - 1)); }\n drawn[x] = s + 1;\n if (this.priority[x]) { this.spriteBackground |= 1 << s; if (behind) return; }\n if (borderOnly || x < this.inside[0] || x > this.inside[1]) return;\n this.frame[row + x] = c;\n }\n}\n", "// Writing a Commodore 1541 disk image, a .d64, as the 1541 itself would leave it, so that it loads\n// on Moonbase's C64, in VICE and on a real 64 (by an SD2IEC or the like). 35 tracks of 256-byte\n// sectors, 21 a track on the outer tracks and fewer further in, 174,848 bytes. Track 18 holds the\n// BAM and the disk's name in sector 0 and the directory from sector 1; each file is a chain of\n// sectors, each starting with the track and sector of the next, or 0 and the index of its last\n// byte. Files are laid down from track 17 outward and from 19 inward, as the 1541 does, ten\n// sectors apart on a track, the directory three apart.\n//\n// make({ name: 'CRAYON', id: 'MB', files: [{ name: 'CRAYON', data, type: 'PRG' }] })\n// data the file's bytes; for a program, its load address first, as a .prg has it\n// a Uint8Array of 174,848 bytes\n// add(image, files) files added to a disk that has some, theirs left where they are (below)\n// read(image) a disk read: { name, id, files: [{ name, type, locked, closed, blocks, body, address and raw\n// (a program: its load address, and its bytes with it) }] }; each body a Uint8Array\n// petsciiName(bytes) a name as the 1541 keeps it, as text: shifted letters $C1 to $DA as capitals, the $A0\n// padding gone\nexport const SECTORS = [...Array(17).fill(21), ...Array(7).fill(19), ...Array(6).fill(18), ...Array(5).fill(17)];\nconst TYPES = { DEL: 0, SEQ: 1, PRG: 2, USR: 3, REL: 4 };\nconst offset = (t, s) => (SECTORS.slice(0, t - 1).reduce((a, b) => a + b, 0) + s) * 256;\n\n// a name as the 1541 keeps it: 16 bytes of PETSCII, the letters as capitals, padded with $A0\nconst name16 = text => {\n const out = new Uint8Array(16).fill(0xa0);\n [...String(text).toUpperCase()].slice(0, 16).forEach((c, i) => { out[i] = c.charCodeAt(0) & 0xff; });\n return out;\n};\n\nexport function make({ name = 'MOONBASE', id = 'MB', files = [] } = {}) {\n const image = new Uint8Array(174848), used = SECTORS.map(n => new Array(n).fill(false));\n const take = (t, s) => { used[t - 1][s] = true; return offset(t, s); };\n take(18, 0);\n\n // the sectors for a file: the tracks nearest the directory first, ten sectors apart on each\n const ORDER = [];\n for (let d = 1; d <= 17; d++) { if (18 - d >= 1) ORDER.push(18 - d); if (18 + d <= 35) ORDER.push(18 + d); }\n const free = () => {\n for (const t of ORDER) {\n const n = SECTORS[t - 1], start = used[t - 1].lastTaken ?? -10;\n for (let k = 0; k < n; k++) { const s = (start + 10 + k) % n; if (!used[t - 1][s]) { used[t - 1][s] = true; used[t - 1].lastTaken = s; return [t, s]; } }\n }\n throw new Error('the disk is full');\n };\n\n // the files' bodies, sector by sector\n const entries = files.map(f => {\n const data = f.data instanceof Uint8Array ? f.data : Uint8Array.from(f.data);\n const chunks = Math.max(1, Math.ceil(data.length / 254)), places = Array.from({ length: chunks }, free);\n places.forEach(([t, s], i) => {\n const at = take(t, s), part = data.subarray(i * 254, (i + 1) * 254);\n if (i + 1 < chunks) { image[at] = places[i + 1][0]; image[at + 1] = places[i + 1][1]; }\n else { image[at] = 0; image[at + 1] = part.length + 1; }\n image.set(part, at + 2);\n });\n return { name: name16(f.name), type: 0x80 | (TYPES[f.type ?? 'PRG'] ?? 2), first: places[0], blocks: chunks };\n });\n\n // the directory: eight entries a sector, on track 18 from sector 1, three apart\n const dirSectors = [];\n for (let i = 0, s = 1; i < Math.max(1, Math.ceil(entries.length / 8)); i++, s = (s + 3) % 19) {\n while (used[17][s]) s = (s + 1) % 19;\n if (dirSectors.length >= 18) throw new Error('the directory is full: 144 files');\n take(18, s); dirSectors.push(s);\n }\n dirSectors.forEach((s, i) => {\n const at = offset(18, s);\n if (i + 1 < dirSectors.length) { image[at] = 18; image[at + 1] = dirSectors[i + 1]; } else { image[at] = 0; image[at + 1] = 0xff; }\n entries.slice(i * 8, i * 8 + 8).forEach((e, k) => {\n const p = at + k * 32;\n image[p + 2] = e.type; image[p + 3] = e.first[0]; image[p + 4] = e.first[1];\n image.set(e.name, p + 5);\n image[p + 30] = e.blocks & 0xff; image[p + 31] = e.blocks >> 8;\n });\n });\n\n // the BAM: the directory's first sector, the format's mark, each track's free count and map\n const bam = offset(18, 0);\n image[bam] = 18; image[bam + 1] = dirSectors[0]; image[bam + 2] = 0x41;\n for (let t = 1; t <= 35; t++) {\n const map = used[t - 1].map(u => !u), at = bam + 4 * t;\n image[at] = map.filter(Boolean).length;\n for (let s = 0; s < map.length; s++) if (map[s]) image[at + 1 + (s >> 3)] |= 1 << (s & 7);\n }\n image.set(name16(name), bam + 0x90);\n image[bam + 0xa0] = image[bam + 0xa1] = 0xa0;\n image[bam + 0xa2] = String(id).charCodeAt(0) || 0x30; image[bam + 0xa3] = String(id).charCodeAt(1) || 0x30;\n image[bam + 0xa4] = 0xa0; image[bam + 0xa5] = 0x32; image[bam + 0xa6] = 0x41;\n image.fill(0xa0, bam + 0xa7, bam + 0xab);\n return image;\n}\n\n// Files added to a disk that already has some, as a 1541 SAVEs them: the disk's own files left in\n// their sectors (a game may read them by track and sector), a file of the same name replaced and\n// its sectors freed, the new ones laid in free sectors as the BAM has them and entered in the\n// directory's first empty entry (a new directory sector where none is empty).\n//\n// add(image, [{ name, data }]) a new image; the one given is not changed\nexport function add(image, files) {\n const out = Uint8Array.from(image), bam = offset(18, 0);\n const isFree = (t, s) => !!(out[bam + 4 * t + 1 + (s >> 3)] & 1 << (s & 7));\n const mark = (t, s, free) => {\n const at = bam + 4 * t + 1 + (s >> 3), was = isFree(t, s);\n if (free) out[at] |= 1 << (s & 7); else out[at] &= ~(1 << (s & 7));\n out[bam + 4 * t] += free && !was ? 1 : !free && was ? -1 : 0;\n };\n const ORDER = [];\n for (let d = 1; d <= 17; d++) { if (18 - d >= 1) ORDER.push(18 - d); if (18 + d <= 35) ORDER.push(18 + d); }\n const last = {};\n const take = () => {\n for (const t of ORDER) {\n const n = SECTORS[t - 1];\n for (let k = 0; k < n; k++) { const s = ((last[t] ?? -10) + 10 + k) % n; if (isFree(t, s)) { mark(t, s, false); last[t] = s; return [t, s]; } }\n }\n throw new Error('the disk is full');\n };\n // the directory's entries, by where each is\n const entries = () => {\n const list = [];\n for (let [t, s] = [out[bam], out[bam + 1]], n = 0; t && n < 18; n++) {\n const at = offset(t, s);\n for (let k = 0; k < 8; k++) list.push(at + k * 32);\n [t, s] = [out[at], out[at + 1]];\n }\n return list;\n };\n for (const f of files) {\n const name = name16(f.name), data = f.data instanceof Uint8Array ? f.data : Uint8Array.from(f.data);\n // (one of the same name: its sectors freed, its entry emptied)\n for (const e of entries()) {\n if (!(out[e + 2] & 7) || !name.every((b, i) => out[e + 5 + i] === b)) continue;\n for (let [t, s] = [out[e + 3], out[e + 4]], n = 0; t && n < 683; n++) { const at = offset(t, s); mark(t, s, true); [t, s] = [out[at], out[at + 1]]; }\n out[e + 2] = 0;\n }\n const chunks = Math.max(1, Math.ceil(data.length / 254)), places = Array.from({ length: chunks }, take);\n places.forEach(([t, s], i) => {\n const at = offset(t, s), part = data.subarray(i * 254, (i + 1) * 254);\n out.fill(0, at, at + 256);\n if (i + 1 < chunks) { out[at] = places[i + 1][0]; out[at + 1] = places[i + 1][1]; } else { out[at] = 0; out[at + 1] = part.length + 1; }\n out.set(part, at + 2);\n });\n let e = entries().find(e => !(out[e + 2] & 7) && !out[e + 2]);\n if (e === undefined) {\n // (a new directory sector, on track 18, linked after the last)\n const list = entries(), lastSector = list[list.length - 1] - 7 * 32;\n let s = 1; while (s < 19 && !isFree(18, s)) s++;\n if (s >= 19) throw new Error('the directory is full');\n mark(18, s, false);\n const at = offset(18, s); out.fill(0, at, at + 256); out[at + 1] = 0xff;\n out[lastSector] = 18; out[lastSector + 1] = s;\n e = at;\n }\n out.fill(0, e + 2, e + 32);\n out[e + 2] = 0x80 | (TYPES[f.type ?? 'PRG'] ?? 2); out[e + 3] = places[0][0]; out[e + 4] = places[0][1];\n out.set(name, e + 5);\n out[e + 30] = chunks & 0xff; out[e + 31] = chunks >> 8;\n }\n return out;\n}\n\n// Reading a disk: the BAM's sector names the disk, and the directory's chain from track 18, sector 1, eight\n// 32-byte entries a sector, each a file's type, its first sector and its name; a file's sectors follow each\n// other by their first two bytes, the last one's second byte the index of its last byte.\nconst NAMES = ['DEL', 'SEQ', 'PRG', 'USR', 'REL'];\nexport const petsciiName = bytes => String.fromCharCode(...[...bytes].filter(b => b !== 0xa0).map(b => (b >= 0xc1 && b <= 0xda ? b - 0x80 : b))).trim();\n\nexport function read(image) {\n if (image.length !== 174848 && image.length !== 175531) throw new Error('a .d64 is 174,848 bytes, and this one is ' + image.length);\n const sector = (t, s) => image.subarray(offset(t, s), offset(t, s) + 256);\n const chain = (t, s) => {\n const parts = [];\n while (t) { const b = sector(t, s); [t, s] = [b[0], b[1]]; parts.push(b.subarray(2, t ? 256 : s + 1)); }\n const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n parts.reduce((at, p) => (out.set(p, at), at + p.length), 0);\n return out;\n };\n const bam = sector(18, 0);\n const name = petsciiName(bam.subarray(0x90, 0xa0)), id = String.fromCharCode(bam[0xa2], bam[0xa3]);\n const files = [];\n for (let [t, s] = [bam[0], bam[1]]; t; ) {\n const b = sector(t, s);\n for (let i = 0; i < 8; i++) {\n const e = b.subarray(i * 32, (i + 1) * 32);\n if (!e[2]) continue;\n const type = NAMES[e[2] & 7] || '?', body = chain(e[3], e[4]);\n const file = { name: petsciiName(e.subarray(5, 21)), type, locked: !!(e[2] & 0x40), closed: !!(e[2] & 0x80), blocks: e[30] | e[31] << 8, body };\n if (type === 'PRG' && body.length >= 2) { file.address = body[0] | body[1] << 8; file.body = body.subarray(2); file.raw = body; }\n files.push(file);\n }\n [t, s] = [b[0], b[1]];\n }\n return { name, id, files };\n}\n", "// A Commodore 1541 as far as the games use it: the disk image itself, read a sector at a time;\n// the directory, searched with the drive's own wildcards; the command channel, with the memory\n// commands M-W, M-R and M-E, the block read U1 and the buffer pointer B-P; LOAD\"$\", the\n// directory as a BASIC program; files opened by name\n// and read a byte at a time; and the drive's memory, since Zoopak reads the directory through it\n// and then pokes a picture's track and sector into the two places the drive keeps its last\n// file's, so that LOAD\"*\", which on a 1541 loads the last file without a directory search,\n// fetches that picture. The KERNAL's bus routines, LISTEN, SECOND, CIOUT, UNLSN, TALK, TKSA,\n// ACPTR and UNTLK, are answered here by the machine's hooks, so the KERNAL's own OPEN, CHRIN\n// and CLOSE work on device 8 without the serial bus being modelled.\n\nimport { add } from './d64.js';\n\nconst SECTORS = [...Array(17).fill(21), ...Array(7).fill(19), ...Array(6).fill(18), ...Array(5).fill(17)];\nconst TYPES = ['DEL', 'SEQ', 'PRG', 'USR', 'REL'];\nconst OK = '00, OK,00,00\\r', NOT_FOUND = '62,FILE NOT FOUND,00,00\\r', SYNTAX = '31,SYNTAX ERROR,00,00\\r';\nconst bytes = s => Uint8Array.from(s, c => c.charCodeAt(0));\nconst upper = b => (b >= 0xc1 && b <= 0xda ? b - 0x80 : b); // shifted letters as unshifted\n\nexport class Drive {\n constructor(image) {\n this.image = image;\n this.mem = new Uint8Array(0x800); // the drive's RAM: $0200 the command buffer, $0300 to $07FF the four buffers\n this.saved = new Map(); // files saved this session, by name, as raw bytes; they shadow the disk\n this.keep = null; // (name, raw): told of each file saved, to keep it (saves.js)\n this.channels = new Map(); // open channels by secondary address 0 to 15\n this.listening = false; this.talking = false; this.channel = 0; this.opening = null;\n this.status = bytes(OK); this.reply = null; this.pos = 0;\n this.channels.set(15, { command: [] });\n }\n\n // the disk\n sector(t, s, image = this.image) { const n = SECTORS.slice(0, t - 1).reduce((a, b) => a + b, 0) + s; return image.subarray(n * 256, (n + 1) * 256); }\n chain(t, s) {\n const parts = []; let n = 0;\n while (t && n++ < 800) { const b = this.sector(t, s); [t, s] = [b[0], b[1]]; parts.push(b.subarray(2, t ? 256 : s + 1)); }\n const out = new Uint8Array(parts.reduce((a, p) => a + p.length, 0)); let at = 0;\n for (const p of parts) { out.set(p, at); at += p.length; }\n return out;\n }\n directory() {\n const bam = this.sector(18, 0), files = [];\n for (let [t, s] = [bam[0], bam[1]], n = 0; t && n++ < 40; ) {\n const b = this.sector(t, s);\n for (let i = 0; i < 8; i++) {\n const e = b.subarray(i * 32, (i + 1) * 32);\n if (!e[2]) continue;\n files.push({ name: Array.from(e.subarray(5, 21)).filter(c => c !== 0xa0).map(upper), type: TYPES[e[2] & 7] || '?', track: e[3], sector: e[4] });\n }\n [t, s] = [b[0], b[1]];\n }\n return files;\n }\n // the files a name can find: not DEL's, which the 1541's search passes over (a directory's art,\n // drawn in DEL entries' names, so that none of them loads)\n loadable() { return this.directory().filter(f => f.type !== 'DEL'); }\n // a name as the drive matches it: the drive prefix dropped, '*' ending the comparison, '?' any character\n static matches(pattern, name) {\n for (let i = 0; i < pattern.length; i++) {\n if (pattern[i] === 0x2a) return true;\n if (i >= name.length) return false;\n if (pattern[i] !== 0x3f && upper(pattern[i]) !== name[i]) return false;\n }\n return pattern.length === name.length;\n }\n static strip(name) { let n = Array.from(name).map(upper); if (n[0] === 0x40) n = n.slice(1); if (n[1] === 0x3a) n = n.slice(2); return n; }\n find(name) {\n name = Drive.strip(name);\n for (const [k, raw] of this.saved) if (Drive.matches(name, Array.from(bytes(k)))) return { raw, saved: true };\n for (const f of this.loadable()) if (Drive.matches(name, f.name)) return { ...f, raw: this.chain(f.track, f.sector) };\n return undefined;\n }\n // LOAD\"$\": the directory as the 1541 makes it, a BASIC program at $0401: the header line, the\n // disk's name reversed in quotes with its ID and DOS type; a line for each entry, its blocks the\n // line's number, its name in quotes as it is, its type (* if not closed, < if locked); and the\n // blocks free. BASIC's LOAD links its lines after. The files saved this session are listed as a\n // 1541 would have them, the disk read as if they were on it (d64.js `add`)\n listing() {\n const image = this.saved.size ? add(this.image, [...this.saved].map(([name, data]) => ({ name, data }))) : this.image;\n const sector = (t, s) => this.sector(t, s, image);\n const bam = sector(18, 0), out = [0x01, 0x04];\n const line = (n, text) => out.push(0x01, 0x01, n & 255, n >> 8, ...text, 0);\n line(0, [0x12, 0x22, ...bam.subarray(0x90, 0xa0), 0x22, 0x20, bam[0xa2], bam[0xa3], 0x20, bam[0xa5], bam[0xa6]]);\n for (let [t, s] = [bam[0], bam[1]], k = 0; t && k++ < 40; ) {\n const b = sector(t, s);\n for (let i = 0; i < 8; i++) {\n const e = b.subarray(i * 32, (i + 1) * 32);\n if (!e[2]) continue;\n const blocks = e[30] | e[31] << 8, raw = Array.from(e.subarray(5, 21)), end = raw.indexOf(0xa0), name = end < 0 ? raw : raw.slice(0, end);\n const pad = blocks < 10 ? 3 : blocks < 100 ? 2 : 1;\n line(blocks, [...Array(pad).fill(0x20), 0x22, ...name, 0x22, ...Array(16 - name.length).fill(0x20), e[2] & 0x80 ? 0x20 : 0x2a, ...bytes(TYPES[e[2] & 7] || '???'), e[2] & 0x40 ? 0x3c : 0x20]);\n }\n [t, s] = [b[0], b[1]];\n }\n let free = 0; for (let t = 1; t <= 35; t++) if (t !== 18) free += bam[4 * t];\n line(free, [...bytes('BLOCKS FREE.'), ...Array(13).fill(0x20)]);\n out.push(0, 0);\n return Uint8Array.from(out);\n }\n // the drive keeps its last file's track and sector at $7E and $026F, and LOAD\"*\" starts there\n remember(f) { if (f && f.track) { this.mem[0x7e] = f.track; this.mem[0x26e] = 0; this.mem[0x26f] = f.sector; } }\n load(name) {\n name = Drive.strip(name);\n let f;\n if (name[0] === 0x24) { this.status = bytes(OK); return this.listing(); }\n if (name.length === 1 && name[0] === 0x2a) f = this.mem[0x7e] ? { raw: this.chain(this.mem[0x7e], this.mem[0x26f]) } : { ...this.loadable()[0], raw: null };\n else f = this.find(name);\n if (f && !f.raw) f.raw = this.chain(f.track, f.sector);\n this.remember(f); this.status = bytes(f ? OK : NOT_FOUND);\n return f && f.raw;\n }\n save(name, raw) { this.store(String.fromCharCode(...Drive.strip(name)), raw); this.status = bytes(OK); }\n store(name, raw) { this.saved.set(name, raw); this.keep?.(name, raw); }\n\n // the bus, as the KERNAL's routines present it\n listen(device) { this.listening = device === 8; return this.listening; }\n talk(device) { this.talking = device === 8; return this.talking; }\n second(sa) {\n if (!this.listening) return;\n const ch = sa & 15, kind = sa & 0xf0;\n if (kind === 0xf0) this.opening = { ch, name: [] };\n else if (kind === 0xe0) this.close(ch);\n else this.channel = ch;\n }\n tksa(sa) { if (this.talking) { this.channel = sa & 15; this.pos = 0; } }\n ciout(b) {\n if (!this.listening) return;\n if (this.opening) { this.opening.name.push(b); return; }\n const c = this.channels.get(this.channel);\n if (!c) return;\n if (c.command) c.command.push(b);\n else if (c.write) c.write.push(b);\n else if (c.buffer) { c.buffer[c.pos] = b; c.pos = (c.pos + 1) & 0xff; }\n }\n unlsn() {\n if (this.opening) { this.open(this.opening.ch, this.opening.name); this.opening = null; }\n else if (this.channel === 15) { const c = this.channels.get(15); if (c.command.length) { this.execute(Uint8Array.from(c.command)); c.command = []; } }\n this.listening = false;\n }\n untlk() { this.talking = false; }\n // the next byte for the talker, and whether it is the last; nothing when the channel is empty\n acptr() {\n const c = this.channels.get(this.channel);\n if (this.channel === 15) {\n const data = this.reply || this.status;\n if (this.pos >= data.length) { this.reply = null; this.pos = 0; return null; }\n const byte = data[this.pos++], eoi = this.pos >= data.length;\n if (eoi) { if (this.reply) this.reply = null; else this.status = bytes(OK); this.pos = 0; }\n return { byte, eoi };\n }\n if (!c) return null;\n if (c.buffer) { const byte = c.buffer[c.pos]; c.pos = (c.pos + 1) & 0xff; return { byte, eoi: c.pos === 0 }; }\n if (!c.data || c.pos >= c.data.length) return null;\n return { byte: c.data[c.pos++], eoi: c.pos >= c.data.length };\n }\n\n // a file opened on a channel: '#' a buffer, else a name with its type and mode after commas\n open(ch, name) {\n if (ch === 15) { if (name.length) this.execute(Uint8Array.from(name)); return; }\n if (name[0] === 0x23) { this.channels.set(ch, { buffer: new Uint8Array(256), pos: 0 }); this.status = bytes(OK); return; }\n const parts = []; let cur = [];\n for (const b of name) { if (b === 0x2c) { parts.push(cur); cur = []; } else cur.push(b); }\n parts.push(cur);\n // ,W writes; and channel 1 always, SAVE's, as channel 0 always reads, LOAD's\n const mode = ch === 1 || ch !== 0 && parts.slice(1).some(p => p[0] === 0x57) ? 'W' : 'R';\n if (mode === 'W') { this.channels.set(ch, { write: [], name: String.fromCharCode(...Drive.strip(parts[0])) }); this.status = bytes(OK); return; }\n // (a file to read as LOAD finds it: \"*\" the last file, as a 1541 has it)\n const raw = this.load(parts[0]);\n this.channels.set(ch, { data: raw ?? new Uint8Array(0), pos: 0 });\n }\n close(ch) {\n const c = this.channels.get(ch);\n if (c && c.write) this.store(c.name, Uint8Array.from(c.write));\n if (ch !== 15) this.channels.delete(ch);\n }\n\n // a command on channel 15\n execute(cmd) {\n this.mem.set(cmd.subarray(0, 0x2a), 0x200); // the command buffer, where M-E code runs from\n const text = String.fromCharCode(...cmd);\n this.status = bytes(OK); this.reply = null;\n if (text.startsWith('M-W')) { const at = cmd[3] | cmd[4] << 8, n = cmd[5]; for (let i = 0; i < n && 6 + i < cmd.length; i++) this.mem[(at + i) & 0x7ff] = cmd[6 + i]; return; }\n if (text.startsWith('M-R')) { const at = cmd[3] | cmd[4] << 8, n = cmd.length > 5 ? cmd[5] || 256 : 1; this.reply = this.mem.slice(at & 0x7ff, (at & 0x7ff) + n); this.pos = 0; return; }\n if (text.startsWith('M-E')) {\n // the one program the games send: LDX #track, LDY #sector, STX $06, STY $07, LDA #$80 (read),\n // STA $00, and wait, which reads a sector into the drive's buffer 0 at $0300\n const code = cmd.subarray(5);\n for (let i = 0; i + 8 <= code.length; i++)\n if (code[i] === 0xa2 && code[i + 2] === 0xa0 && code[i + 4] === 0x86 && code[i + 5] === 0x06 && code[i + 6] === 0x84 && code[i + 7] === 0x07) {\n const t = code[i + 1], s = code[i + 3];\n if (t >= 1 && t <= 35 && s < SECTORS[t - 1]) this.mem.set(this.sector(t, s), 0x300);\n return;\n }\n return;\n }\n const m = /^(U1|UA|B-R|B-P)[: ]?\\s*(.*)$/.exec(text.replace(/\\r$/, ''));\n if (m) {\n const n = m[2].split(/[\\s,]+/).filter(Boolean).map(Number), c = this.channels.get(n[0]);\n if (!c || !c.buffer) { this.status = bytes('70,NO CHANNEL,00,00\\r'); return; }\n if (m[1] === 'B-P') { c.pos = n[1] & 0xff; return; }\n const [, , t, s] = n;\n if (t >= 1 && t <= 35 && s < SECTORS[t - 1]) { c.buffer.set(this.sector(t, s)); c.pos = 0; }\n else this.status = bytes('66,ILLEGAL TRACK OR SECTOR,' + String(t).padStart(2, '0') + ',' + String(s).padStart(2, '0') + '\\r');\n return;\n }\n if (/^I/.test(text)) return;\n this.status = bytes(SYNTAX);\n }\n}\n", "// The KERNAL's screen editor, moonbase's own: what CHROUT does with a character for the screen,\n// as the Commodore 64's KERNAL does it, keeping its working storage as it keeps it, so that a game\n// that reads it (Goldfields' TEXT/CODE reads the table of lines) finds what it would. Shared by\n// moonbase's KERNAL (kernal.js), for the remake and the original alike.\n//\n// const ed = editor({ read, write, keyRow })\n// ed.chrout(ch) a character to the screen ($E716)\n// ed.clear() the screen cleared, its lines made single ($E544); ed.home() ($E566)\n// ed.setLine() the pointers set from the row and the column ($E56C), as PLOT ends\n// ed.clearLine(x) a row cleared ($E9FF)\n// ed.begin(), ed.input() the keyboard's line, as CHRIN reads it ($F157, $E632): a character,\n// or null while it waits for a key\n//\n// The screen is lines of 40 columns, and a logical line one or two of them. Its storage:\n// $D1/$D2 where the cursor's logical line starts on the screen; $F3/$F4 the same in colour\n// $D3 the cursor's column in its logical line (0 to 79); $D5 its last column (39 or 79)\n// $D6 the cursor's row; $D9 to $F2 a byte a row, the high byte of the row's place (its low\n// two bits, with $0288 the page) and its top bit set if the row starts a logical line\n// $C7 reverse on; $D4 quote mode; $D8 inserts to come; $0286 the colour; $CD the blink's count\n// A row's low byte of place is 40 times it, as the KERNAL's table at $ECF0 has it.\nconst COLOURS = [0x90, 0x05, 0x1c, 0x9f, 0x9c, 0x1e, 0x1f, 0x9e, 0x81, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b];\n\nexport function editor({ read: r, write: w, keyRow = () => 0xff }) {\n const W = (a, v) => w(a, v & 0xff);\n const low = x => (x * 40) & 0xff;\n // ($E9F0) the line pointer for row X: its low byte, and its high from the table and $0288\n const linePointer = x => { W(0xd1, low(x)); W(0xd2, (r(0xd9 + x) & 3) | r(0x288)); };\n // ($EA24) the colour pointer from the line pointer\n const colourPointer = () => { W(0xf3, r(0xd1)); W(0xf4, (r(0xd2) & 3) | 0xd8); };\n const pnt = () => r(0xd1) | r(0xd2) << 8, user = () => r(0xf3) | r(0xf4) << 8;\n // ($E9FF) row X cleared to spaces, in the cursor's colour ($0286, as $E4DA puts it)\n function clearLine(x) {\n linePointer(x); colourPointer();\n for (let y = 39; y >= 0; y--) { w(user() + y, r(0x286)); w(pnt() + y, 0x20); }\n }\n // ($E56C) the pointers from the row and the column: back to the logical line's first row, the\n // column counted on from it; the line's last column from the rows that go on from it\n function setLine() {\n let x = r(0xd6), a = r(0xd3);\n while (!(r(0xd9 + x) & 0x80)) { a = (a + 40) & 0xff; W(0xd3, a); x--; if (x < 0) break; }\n linePointer(x & 0xff);\n let max = 0x27; x++;\n while (!(r(0xd9 + x) & 0x80)) { max += 40; x++; if (x > 0x7f) break; }\n W(0xd5, max);\n colourPointer();\n }\n // ($E544) the screen cleared: every row a logical line of its own, the table's end marked, the\n // rows cleared from the bottom; then home ($E566)\n function clear() {\n let y = r(0x288) | 0x80, a = 0;\n for (let x = 0; x < 0x1a; x++) { W(0xd9 + x, y); a += 40; if (a > 255) { a &= 0xff; y++; } }\n W(0xd9 + 0x1a, 0xff);\n for (let x = 0x18; x >= 0; x--) clearLine(x);\n home();\n }\n function home() { W(0xd3, 0); W(0xd6, 0); setLine(); }\n // ($E8EA) the screen scrolled up a row: each row moved up from the one below, the table's\n // links moved with them, the last row cleared; again while the first row goes on from above;\n // and with CTRL held a moment's wait. (The cursor's row, the input's row and $02A5 a row up.)\n function scroll() {\n const kept = [0xac, 0xad, 0xae, 0xaf].map(r);\n for (;;) {\n W(0xd6, r(0xd6) - 1); W(0xc9, r(0xc9) - 1); W(0x2a5, r(0x2a5) - 1);\n let x;\n for (x = 0; x < 0x18; x++) { linePointer(x); moveLine(low(x + 1), r(0xda + x)); }\n linePointer(x);\n clearLine(0x18);\n for (let k = 0; k < 0x18; k++) W(0xd9 + k, (r(0xd9 + k) & 0x7f) | (r(0xda + k) & 0x80));\n W(0xf1, r(0xf1) | 0x80);\n if (r(0xd9) & 0x80) break;\n }\n W(0xd6, r(0xd6) + 1); W(0x2a5, r(0x2a5) + 1);\n if (keyRow(0x7f) === 0xfb) W(0xc6, 0); // CTRL held: the KERNAL waits a moment, and empties the keyboard's buffer\n [0xac, 0xad, 0xae, 0xaf].forEach((a, k) => W(a, kept[k]));\n }\n // ($E9C8) a row copied to the line pointer's, from the row whose low byte is `from` and whose\n // table entry is `entry`\n function moveLine(from, entry) {\n const src = from | ((entry & 3) | r(0x288)) << 8, srcColour = from | ((entry & 3) | 0xd8) << 8;\n W(0xac, from); W(0xad, src >> 8); colourPointer(); W(0xae, from); W(0xaf, srcColour >> 8);\n for (let y = 0x27; y >= 0; y--) { w(pnt() + y, r(src + y)); w(user() + y, r(srcColour + y)); }\n }\n // ($E965) a row opened below the logical line, for it to grow into: the rows below moved down,\n // or the screen scrolled first if the line is at the bottom\n function openLine(from = r(0xd6) + 1) {\n let x = from;\n while (!(r(0xd9 + x) & 0x80)) x++;\n W(0x2a5, x);\n if (x > 0x18) { scroll(); x = r(0x2a5) - 1; W(0xd6, r(0xd6) - 1); return grow(x); }\n const kept = [0xac, 0xad, 0xae, 0xaf].map(r);\n for (let k = 0x18; k > r(0x2a5); k--) { linePointer(k); moveLine(low(k - 1), r(0xd8 + k)); }\n linePointer(Math.max(r(0x2a5), 0));\n clearLine(r(0x2a5));\n for (let k = 0x17; k >= r(0x2a5) && k > 0; k--) W(0xda + k, (r(0xda + k) & 0x7f) | (r(0xd9 + k) & 0x80));\n grow(r(0x2a5));\n [0xac, 0xad, 0xae, 0xaf].forEach((a, k) => W(a, kept[k]));\n }\n // ($E6DA) the logical line made two rows: the cursor's row's link cleared, the next row's\n // marked its own start, the line's last column 40 more, and the pointers from its first row\n function grow(x) {\n W(0xd9 + x, r(0xd9 + x) & 0x7f);\n W(0xd9 + x + 1, r(0xd9 + x + 1) | 0x80);\n W(0xd5, r(0xd5) + 40);\n let k = x; while (!(r(0xd9 + k) & 0x80) && k > 0) k--;\n linePointer(k);\n }\n // ($E87C) on to the next logical line's first row, scrolling at the bottom; ($E891) RETURN, which\n // ends inserts, reverse and quote mode too\n function nextLine() {\n W(0xc9, r(0xc9) >> 1);\n let x = r(0xd6);\n // (the scroll comes back with X its row, $D6, from where the search goes on: $E956)\n do { x++; if (x === 0x19) { scroll(); x = r(0xd6); } } while (!(r(0xd9 + x) & 0x80));\n W(0xd6, x); setLine();\n }\n function carriageReturn() { W(0xd8, 0); W(0xc7, 0); W(0xd4, 0); W(0xd3, 0); nextLine(); }\n // ($E8B3) at the end of a row (column 39 or 79), on to the next row; ($E8A1) at the start of one\n // (column 0 or 40), back to the row before\n function rowEndForward() { for (const end of [0x27, 0x4f]) if (r(0xd3) === end) { if (r(0xd6) !== 0x19) W(0xd6, r(0xd6) + 1); return; } }\n function rowStartBack() { for (const start of [0x00, 0x28]) if (r(0xd3) === start) { W(0xd6, r(0xd6) - 1); return; } }\n // ($EA13) a screen code at the cursor, in colour X, the blink's count 2\n function put(code, colour) { W(0xcd, 2); colourPointer(); w(pnt() + r(0xd3), code); w(user() + r(0xd3), colour); }\n // ($E6B6) the cursor one on: past the line's end, the line grows (to two rows) or a new line\n // (with AUTODN, $0292, set, as while keys wait to be shown, a line opened below: the search for\n // the next line's start from the row the cursor was on, plus one, as $E6CA jumps to $E967 with X\n // as $E8B3 left it, past the LDX $D6 at $E965)\n function advance() {\n const row = r(0xd6);\n rowEndForward();\n W(0xd3, r(0xd3) + 1);\n if (r(0xd5) >= r(0xd3)) return;\n if (r(0xd5) === 0x4f) { W(0xd6, r(0xd6) - 1); nextLine(); W(0xd3, 0); return; }\n if (r(0x292)) return openLine(row + 1);\n let x = r(0xd6);\n if (x >= 0x19) { scroll(); W(0xd6, r(0xd6) - 1); x = r(0xd6); }\n grow(x);\n }\n // a character, quote mode and inserts as the KERNAL keeps them\n function show(code) {\n if (r(0xc7)) code |= 0x80;\n if (r(0xd8)) W(0xd8, r(0xd8) - 1);\n put(code, r(0x286));\n advance();\n }\n function done() { if (r(0xd8)) W(0xd4, r(0xd4) >> 1); }\n // ($E701) back to the end of the logical line before, or nowhere at the top\n function backLine() {\n const x = r(0xd6);\n if (!x) { W(0xd3, 0); return false; }\n W(0xd6, x - 1); setLine(); W(0xd3, r(0xd5)); return true;\n }\n function chrout(ch) {\n W(0xd7, ch); W(0xd0, 0);\n if (ch & 0x80) return shifted(ch);\n if (ch === 0x0d) { carriageReturn(); return done(); }\n if (ch >= 0x20) {\n let code = ch < 0x60 ? ch & 0x3f : ch & 0xdf;\n if (ch === 0x22) W(0xd4, r(0xd4) ^ 1);\n show(code); return done();\n }\n if (r(0xd8)) { show(ch | 0x80); return done(); }\n if (ch === 0x14) { // DEL\n if (r(0xd3) === 0) { if (!backLine()) return done(); }\n else {\n rowStartBack(); W(0xd3, r(0xd3) - 1); colourPointer();\n for (let y = r(0xd3); y + 1 !== r(0xd5) + 1 && y < r(0xd5); y++) { w(pnt() + y, r(pnt() + y + 1)); w(user() + y, r(user() + y + 1)); }\n }\n w(pnt() + r(0xd5), 0x20); w(user() + r(0xd5), r(0x286));\n return done();\n }\n if (r(0xd4)) { show(ch | 0x80); return done(); }\n if (ch === 0x12) W(0xc7, 0x12);\n if (ch === 0x13) home();\n if (ch === 0x1d) { // cursor right\n const y = r(0xd3) + 1; rowEndForward(); W(0xd3, y);\n if (y - 1 >= r(0xd5)) { W(0xd6, r(0xd6) - 1); nextLine(); W(0xd3, 0); }\n return done();\n }\n if (ch === 0x11) { // cursor down\n let y = r(0xd3) + 40; W(0xd6, r(0xd6) + 1);\n if (y > r(0xd5)) { W(0xd6, r(0xd6) - 1); do { y -= 40; if (y >= 0) W(0xd3, y); } while (y > 0 && y >= 40); nextLine(); }\n else W(0xd3, y);\n return done();\n }\n const colour = COLOURS.indexOf(ch); if (colour >= 0) W(0x286, colour);\n if (ch === 0x0e) w(0xd018, r(0xd018) | 2);\n if (ch === 0x08) W(0x291, 0x80); if (ch === 0x09) W(0x291, 0);\n return done();\n }\n function shifted(ch) {\n ch &= 0x7f; if (ch === 0x7f) ch = 0x5e;\n if (ch >= 0x20) { show(ch | 0x40); return done(); }\n if (ch === 0x0d) { carriageReturn(); return done(); }\n if (r(0xd4) || (ch !== 0x14 && r(0xd8))) { show(ch | 0x40 | 0x80); return done(); }\n if (ch === 0x14) { // INST\n let y = r(0xd5);\n if (r(pnt() + y) === 0x20 && y !== r(0xd3)) { /* room at the end */ }\n else if (y === 0x4f) return done();\n else openLine();\n y = r(0xd5); colourPointer();\n for (; y > r(0xd3); y--) { w(pnt() + y, r(pnt() + y - 1)); w(user() + y, r(user() + y - 1)); }\n w(pnt() + y, 0x20); w(user() + y, r(0x286)); W(0xd8, r(0xd8) + 1);\n return done();\n }\n if (ch === 0x11) { // cursor up\n const x = r(0xd6);\n if (x) { W(0xd6, x - 1); const y = r(0xd3) - 40; if (y >= 0) W(0xd3, y); else setLine(); }\n return done();\n }\n if (ch === 0x12) W(0xc7, 0);\n if (ch === 0x1d) { // cursor left\n if (r(0xd3) === 0) backLine(); else { rowStartBack(); W(0xd3, r(0xd3) - 1); }\n return done();\n }\n if (ch === 0x13) { clear(); return done(); }\n const colour = COLOURS.indexOf(ch | 0x80); if (colour >= 0) W(0x286, colour);\n if (ch === 0x0e) w(0xd018, r(0xd018) & ~2);\n return done();\n }\n // The line typed at the keyboard, as CHRIN gives it ($E632): while no line is being read ($D0\n // 0), each key in the buffer shown as CHROUT shows it ($E5CA), the cursor's character put back\n // first if it shows, and SHIFT-RUN/STOP putting LOAD and RUN in the buffer; at RETURN, the\n // logical line the cursor is on read back from the screen ($E602): to its last character that\n // is not a space, from its start, or from where the input began if that was on this line (a\n // prompt's place, $C9/$CA, which CHRIN's caller sets: `begin`). Then a character a call, each\n // screen code made a character again ($E63A), quote mode followed, and RETURN at the end.\n // Gives the character, or null while it waits for a key.\n function begin() { W(0xca, r(0xd3)); W(0xc9, r(0xd6)); }\n function take() { const k = r(0x277); for (let i = 0; i < r(0xc6) - 1; i++) W(0x277 + i, r(0x278 + i)); W(0xc6, r(0xc6) - 1); return k; }\n function input() {\n if (!r(0xd0)) {\n for (;;) {\n const n = r(0xc6); W(0xcc, n); W(0x292, n);\n if (!n) return null;\n if (r(0xcf)) { W(0xcf, 0); W(0xcd, 2); colourPointer(); w(pnt() + r(0xd3), r(0xce)); w(user() + r(0xd3), r(0x287)); }\n const k = take();\n if (k === 0x83) { W(0xc6, 9); [0x4c, 0x4f, 0x41, 0x44, 0x0d, 0x52, 0x55, 0x4e, 0x0d].forEach((v, i) => W(0x277 + i, v)); continue; }\n if (k !== 0x0d) { chrout(k); continue; }\n // RETURN: the line's end, its last character that is not a space, and where to read from\n let y = r(0xd5); W(0xd0, y);\n while (r(pnt() + y) === 0x20 && --y) ;\n W(0xc8, y + 1); W(0x292, 0); W(0xd3, 0); W(0xd4, 0);\n if (!(r(0xc9) & 0x80)) {\n let x = r(0xd6);\n if (x !== r(0xc9)) { while (!(r(0xd9 + x) & 0x80) && x) x--; linePointer(x); }\n if (x === r(0xc9)) { W(0xd3, r(0xca)); if (r(0xca) >= r(0xc8)) return end(); }\n }\n break;\n }\n }\n // a character of the line from the screen: its screen code made a character again, the top\n // bit of a reversed one kept in quote mode\n const y = r(0xd3), s = r(pnt() + y);\n let a = s & 0x3f;\n if (s & 0x40) a |= 0x80;\n if (!((s & 0x80) && r(0xd4)) && !(s & 0x20)) a |= 0x40;\n W(0xd3, y + 1);\n if (a === 0x22) W(0xd4, r(0xd4) ^ 1);\n if (y === r(0xc8)) return end();\n W(0xd7, a); // (the character given kept, as $E674 keeps it)\n return a === 0xde ? 0xff : a;\n }\n // the line's end: RETURN, shown only if the input is the screen or the output is not\n function end() { W(0xd0, 0); if (r(0x99) === 3 || r(0x9a) !== 3) chrout(0x0d); W(0xd7, 0x0d); return 0x0d; }\n\n return { chrout, clear, home, setLine, clearLine, scroll, linePointer, colourPointer, begin, input };\n}\n", "// A character's eight bytes (its rows, the left dot the top bit) as a 32-bit FNV-1a hash: how\n// glyph-hashes.js keeps the 64's characters, and how a cell of a picture is recognised as one of\n// them.\nexport function glyphHash(rows) {\n let h = 0x811c9dc5;\n for (let i = 0; i < 8; i++) { h ^= rows[i]; h = Math.imul(h, 0x01000193) >>> 0; }\n return h;\n}\n", "// The 64's 512 characters as hashes: the character ROM's first set (screen codes 0 to 255, the last 128\n// reversed), then its second, each a 32-bit FNV-1a hash of its eight bytes (glyph-hash.js).\n// Generated from Commodore's character ROM; numbers only, no character can be drawn from them.\n// Not edited by hand.\nexport const GLYPH_HASHES = Uint32Array.of(\n 0xa63acec9, 0xcfb72db7, 0xc1892941, 0xd80b2795, 0x1b055853, 0x733925ed, 0xb76faaf3, 0x94217edd,\n 0xe71b097b, 0xcc9f3afd, 0xb1af50c7, 0x6f9d9a15, 0x61fb6d9b, 0x464b312c, 0x85f6570b, 0x96070b83,\n 0xb876df6d, 0xbdd92233, 0x5295e507, 0x32cadce7, 0x4dd2b86b, 0xe0a58b69, 0xb909704f, 0x0a4ca684,\n 0x090b885d, 0x391a859f, 0x1efef677, 0x3b8708c5, 0x2401ada1, 0xd655d051, 0xb19651ef, 0xeb166297,\n 0x9be17165, 0xccb1980d, 0x760cedb3, 0x63e18eff, 0x0294278d, 0xa3ebed65, 0x49817fb1, 0xf278feff,\n 0x987ef385, 0x52c0c411, 0x99e73ab0, 0xbed544ab, 0x730351a5, 0x93a47d1b, 0x63033875, 0x2dc56d46,\n 0xf5f3b30b, 0xbe43f89b, 0xae016c73, 0x52bd07e1, 0xb6f6f3fe, 0xff3909cd, 0x557295c7, 0xade16941,\n 0xf0fb1a01, 0x0161eb3b, 0x64320035, 0x8445ba4d, 0x710653c5, 0x0c491265, 0xd1adc673, 0xb34aabed,\n 0xb700ca17, 0x22397953, 0x3c19df65, 0xb700ca17, 0xbe9abf9b, 0xfe689467, 0xc712d72b, 0x0ff37de5,\n 0xefec4d45, 0x931ca24d, 0x62103ab3, 0xfa82e19d, 0x49efc6bb, 0xa706e569, 0xcc6ef1e5, 0x084b2e8b,\n 0xa637d02d, 0xf466251d, 0xfd160a47, 0xfbed4f22, 0x1e3ba9e5, 0x03bc99db, 0x937537f9, 0x8c73847d,\n 0x1df09969, 0x5d6969e5, 0x05f85cb4, 0xee667567, 0xa3db00e5, 0x3c19df65, 0xd5bf523e, 0xf607d477,\n 0x9be17165, 0x99f161e5, 0xb4512201, 0xe802ca7a, 0x4ce28808, 0x58e31265, 0xb2c0a219, 0x461f842d,\n 0x1d055413, 0xd33f53e4, 0x461f842d, 0xc051b967, 0x581deaa1, 0x1e2ddc7f, 0x36f8d78d, 0x4c4ff03b,\n 0xa300624f, 0x4c42987f, 0x34dd1f8f, 0x6a2e9b65, 0x58e31265, 0xf5528fe5, 0x7e413aad, 0x2505bf8b,\n 0x292df97c, 0x02147f26, 0xcaefc185, 0x6044a0a5, 0x940b4261, 0x099fd55d, 0xe0455ea5, 0x9c81d7e1,\n 0xd4b39b79, 0xdc8da58b, 0x538ca0cd, 0xfc193485, 0x0d506237, 0x64e1ab41, 0x64f248cb, 0xd27b4ccd,\n 0xf43f3a73, 0xd240f335, 0x9ae62617, 0x432d4101, 0xf2c122cf, 0xc379e674, 0x84d795e3, 0xb34cb6f7,\n 0xd3fcf7ad, 0xd6841827, 0x112d3413, 0x9c712aff, 0xc43b5f63, 0xa22875e5, 0x1fb4d0cf, 0x20c02064,\n 0xbf7a9239, 0x9d5ca57f, 0xf0de6067, 0xbb7ae8dd, 0xc45b03c9, 0xe2b4e829, 0x426d54d7, 0xa759948f,\n 0x6cae0a5d, 0xeae53e95, 0x8f14b49b, 0xaf792ac7, 0x9a0280a1, 0x5f6a9421, 0x0f9d9745, 0x30f21787,\n 0xc87f5d8d, 0xf48ead51, 0x5b0c5cb8, 0x27bf827b, 0xf389198d, 0x24c7045b, 0x038932bd, 0xf4b2cc5e,\n 0xdcb56f9f, 0x353848ef, 0xe4e4cf5f, 0xf2a5976d, 0xd84a1f36, 0x8f42ce19, 0xe6e0319f, 0xcc9d583d,\n 0x6061d50d, 0x74a966cf, 0x618c4ead, 0x31c82d45, 0xc7adac99, 0x581a4af1, 0x798d5a93, 0xd29d4d6d,\n 0xe319f30f, 0xdbab8ea3, 0x5383376d, 0xe319f30f, 0xdf630227, 0xa95eb15f, 0xcd40fc97, 0xd6d6ff3d,\n 0xe9c4fd6d, 0x1df55185, 0x1ba82113, 0x5d3b77b5, 0x26170287, 0xe26129c9, 0xc075e735, 0xbc1077b7,\n 0x74c89f8d, 0xe8063525, 0xcea2193f, 0xf8fc836a, 0x12c5d25d, 0x9a04a2db, 0x8702da71, 0xcd17a8c5,\n 0xdab3d03d, 0xd23a719d, 0x4f6b1528, 0xf706ca4f, 0xcfd5ec5d, 0x5383376d, 0xd9381ec2, 0xc813957f,\n 0x6cae0a5d, 0x40a3e13d, 0x84bf99c1, 0x35f2d172, 0xcdaea310, 0x6ac9fbdd, 0xf6f39359, 0x3b0bc5c5,\n 0x929224ef, 0xa650b140, 0x3b0bc5c5, 0x24bfc80f, 0x6905c661, 0xe6460697, 0x67b30275, 0xe75cdb87,\n 0xe444ee97, 0xb889e2d7, 0x3f4d1217, 0x1f6cbaad, 0x6ac9fbdd, 0xf2c9775d, 0x273093e5, 0xac1d7c37,\n 0x7eec1c74, 0x83a3362e, 0x78676dcd, 0x3158389d, 0xedfde341, 0xa33c8f45, 0x255796fd, 0x21af5301,\n 0xa63acec9, 0x673c3eb9, 0xca581dfd, 0x9d3e9be5, 0x33baa295, 0x2d1fe45d, 0xcc4cbbd5, 0x285415f7,\n 0xe6493f87, 0xab3ae759, 0x72d77a37, 0xae73670b, 0x7674dbb1, 0xed13a8c7, 0x57ca9f29, 0xd280ad53,\n 0xf4a4184d, 0x9254bcd5, 0x9dd85cef, 0x6199a3dd, 0xb581d065, 0xab4edadb, 0x2a68d62f, 0x734fcf38,\n 0x766f48fd, 0x982b9639, 0x32bbe4f9, 0x3b8708c5, 0x2401ada1, 0xd655d051, 0xb19651ef, 0xeb166297,\n 0x9be17165, 0xccb1980d, 0x760cedb3, 0x63e18eff, 0x0294278d, 0xa3ebed65, 0x49817fb1, 0xf278feff,\n 0x987ef385, 0x52c0c411, 0x99e73ab0, 0xbed544ab, 0x730351a5, 0x93a47d1b, 0x63033875, 0x2dc56d46,\n 0xf5f3b30b, 0xbe43f89b, 0xae016c73, 0x52bd07e1, 0xb6f6f3fe, 0xff3909cd, 0x557295c7, 0xade16941,\n 0xf0fb1a01, 0x0161eb3b, 0x64320035, 0x8445ba4d, 0x710653c5, 0x0c491265, 0xd1adc673, 0xb34aabed,\n 0xb700ca17, 0xcfb72db7, 0xc1892941, 0xd80b2795, 0x1b055853, 0x733925ed, 0xb76faaf3, 0x94217edd,\n 0xe71b097b, 0xcc9f3afd, 0xb1af50c7, 0x6f9d9a15, 0x61fb6d9b, 0x464b312c, 0x85f6570b, 0x96070b83,\n 0xb876df6d, 0xbdd92233, 0x5295e507, 0x32cadce7, 0x4dd2b86b, 0xe0a58b69, 0xb909704f, 0x0a4ca684,\n 0x090b885d, 0x391a859f, 0x1efef677, 0xee667567, 0xa3db00e5, 0x3c19df65, 0xf6f39359, 0x9fa87cb9,\n 0x9be17165, 0x99f161e5, 0xb4512201, 0xe802ca7a, 0x4ce28808, 0x58e31265, 0xb2c0a219, 0x461f842d,\n 0x1d055413, 0x3f02d529, 0x461f842d, 0xc051b967, 0x581deaa1, 0x1e2ddc7f, 0x36f8d78d, 0x4c4ff03b,\n 0xa300624f, 0x4c42987f, 0x34dd1f8f, 0x6a2e9b65, 0x58e31265, 0xf5528fe5, 0x7e413aad, 0x2505bf8b,\n 0x292df97c, 0x02147f26, 0xef56af2f, 0x6044a0a5, 0x940b4261, 0x099fd55d, 0xe0455ea5, 0x9c81d7e1,\n 0xd4b39b79, 0x714f19f9, 0xab5825e9, 0x2e72d0e5, 0xefc916bd, 0xf026a62d, 0x7999cad1, 0xd1c47a1b,\n 0xab98cd3f, 0x4ab842e1, 0x8225944b, 0x7d050287, 0x00942f29, 0xbba2f25b, 0xfebe3ab9, 0xbfcf382f,\n 0x8ef2c8cd, 0x9bc42519, 0xc873ae67, 0x4eadea0d, 0xbeea2dd5, 0x9f665097, 0x7c4d047b, 0x850c239c,\n 0x42907bdd, 0x2b960839, 0xed57b699, 0xbb7ae8dd, 0xc45b03c9, 0xe2b4e829, 0x426d54d7, 0xa759948f,\n 0x6cae0a5d, 0xeae53e95, 0x8f14b49b, 0xaf792ac7, 0x9a0280a1, 0x5f6a9421, 0x0f9d9745, 0x30f21787,\n 0xc87f5d8d, 0xf48ead51, 0x5b0c5cb8, 0x27bf827b, 0xf389198d, 0x24c7045b, 0x038932bd, 0xf4b2cc5e,\n 0xdcb56f9f, 0x353848ef, 0xe4e4cf5f, 0xf2a5976d, 0xd84a1f36, 0x8f42ce19, 0xe6e0319f, 0xcc9d583d,\n 0x6061d50d, 0x74a966cf, 0x618c4ead, 0x31c82d45, 0xc7adac99, 0x581a4af1, 0x798d5a93, 0xd29d4d6d,\n 0xe319f30f, 0xdc8da58b, 0x538ca0cd, 0xfc193485, 0x0d506237, 0x64e1ab41, 0x64f248cb, 0xd27b4ccd,\n 0xf43f3a73, 0xd240f335, 0x9ae62617, 0x432d4101, 0xf2c122cf, 0xc379e674, 0x84d795e3, 0xb34cb6f7,\n 0xd3fcf7ad, 0xd6841827, 0x112d3413, 0x9c712aff, 0xc43b5f63, 0xa22875e5, 0x1fb4d0cf, 0x20c02064,\n 0xbf7a9239, 0x9d5ca57f, 0xf0de6067, 0xf706ca4f, 0xcfd5ec5d, 0x5383376d, 0xb2c0a219, 0xd4d06f39,\n 0x6cae0a5d, 0x40a3e13d, 0x84bf99c1, 0x35f2d172, 0xcdaea310, 0x6ac9fbdd, 0xf6f39359, 0x3b0bc5c5,\n 0x929224ef, 0x402c8be1, 0x3b0bc5c5, 0x24bfc80f, 0x6905c661, 0xe6460697, 0x67b30275, 0xe75cdb87,\n 0xe444ee97, 0xb889e2d7, 0x3f4d1217, 0x1f6cbaad, 0x6ac9fbdd, 0xf2c9775d, 0x273093e5, 0xac1d7c37,\n 0x7eec1c74, 0x83a3362e, 0x86ee680f, 0x3158389d, 0xedfde341, 0xa33c8f45, 0x255796fd, 0x21af5301,\n);\n", "// The Commodore 64's KERNAL as far as Zoopak calls it, in JavaScript, at the addresses it calls\n// it: the remake's counterpart of @moonbase-machines/apple2e/rom.js, without Commodore's ROM. Each routine\n// takes what the KERNAL took in the registers and the zero page, and leaves what it left there.\n//\n// install({ cpu, read, write, drive, loaded, call, log })\n// cpu a stand-in for the processor: its registers, and `hooks`, which this fills\n// read, write memory as the processor sees it, the I/O page at $D000 by the 6510's port\n// drive the serial bus (printer.js `bus`): a 1541 (drive.js), its files by\n// name, its command channel and its memory, and a printer, device 4, if it is on\n// loaded told of each LOAD: the name, and where the file went\n// call runs the game's own code at an address, to its return: a routine the KERNAL calls\n// through a vector the game has pointed at it (Tell-A-Tale's keyboard decode)\n// held the key held down on the page, as the keyboard's matrix shows it to the KERNAL's\n// scan ({ code, shift }, matrixOf), or none\n//\n// Text out (CHROUT) is the screen editor's part the games use: a character at the cursor, in the\n// colour at $0286 and reversed while $C7 says so; RETURN, CLR and HOME, the cursor keys, RVS ON\n// and OFF, DEL, the colours and the two character sets. A control code it has no use for is\n// nothing, as on the machine. The screen is where $0288 says, the colours at $D800.\nimport { editor } from './editor.js';\n\nexport const VIC = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x37, 0x00, 0x00, 0x00, 0x08, 0x00,\n 0x14, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x06, 0x01, 0x02, 0x03, 0x04, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x4c]; // $D000 to $D02E, as CINT sets them\nexport const VECTORS = [0xea31, 0xfe66, 0xfe47, 0xf34a, 0xf291, 0xf20e, 0xf250, 0xf333, 0xf157, 0xf1ca, 0xf6ed, 0xf13e, 0xf32f, 0xfe66, 0xf4a5, 0xf5ed]; // $0314 on, as RESTOR puts them\nconst COLOURS = { 0x90: 0, 0x05: 1, 0x1c: 2, 0x9f: 3, 0x9c: 4, 0x1e: 5, 0x1f: 6, 0x9e: 7, 0x81: 8, 0x95: 9, 0x96: 10, 0x97: 11, 0x98: 12, 0x99: 13, 0x9a: 14, 0x9b: 15 };\n\n// a PETSCII character as the screen code that shows it\nexport function screenCode(p) {\n if (p >= 0x20 && p < 0x40) return p;\n if (p >= 0x40 && p < 0x60) return p - 0x40;\n if (p >= 0x60 && p < 0x80) return p - 0x20;\n if (p >= 0xa0 && p < 0xc0) return p - 0x40;\n if (p >= 0xc0 && p < 0xff) return p - 0x80;\n return p === 0xff ? 0x5e : 0x20;\n}\n\n// The KERNAL's keyboard tables, which a game reads in the ROM: where each of the four is ($EB79:\n// unshifted, shifted, Commodore key, CTRL), the character of each key of the keyboard's matrix\n// unshifted (Find Me looks a character up in it, for the key to hold down), shifted (BASIC\n// typed with the shift keys), with the Commodore key (the keycaps' left graphics) and with CTRL\n// (the colours, RVS ON and OFF, and the control codes). `kernalByte` gives the byte at an address\n// of the ROM, or undefined where it is not these. (They are the ROM's own bytes.)\nconst UNSHIFTED = [\n 0x14, 0x0d, 0x1d, 0x88, 0x85, 0x86, 0x87, 0x11, // DEL, RETURN, cursor right, F7, F1, F3, F5, cursor down\n 0x33, 0x57, 0x41, 0x34, 0x5a, 0x53, 0x45, 0x01, // 3 W A 4 Z S E, left shift\n 0x35, 0x52, 0x44, 0x36, 0x43, 0x46, 0x54, 0x58, // 5 R D 6 C F T X\n 0x37, 0x59, 0x47, 0x38, 0x42, 0x48, 0x55, 0x56, // 7 Y G 8 B H U V\n 0x39, 0x49, 0x4a, 0x30, 0x4d, 0x4b, 0x4f, 0x4e, // 9 I J 0 M K O N\n 0x2b, 0x50, 0x4c, 0x2d, 0x2e, 0x3a, 0x40, 0x2c, // + P L - . : @ ,\n 0x5c, 0x2a, 0x3b, 0x13, 0x01, 0x3d, 0x5e, 0x2f, // pound * ; HOME, right shift, = up-arrow /\n 0x31, 0x5f, 0x04, 0x32, 0x20, 0x02, 0x51, 0x03, // 1, left arrow, CTRL, 2, space, Commodore key, Q, RUN/STOP\n];\n// and with a shift key down: the second character of each key, a letter's graphic\nconst SHIFTED = [\n 0x94, 0x8d, 0x9d, 0x8c, 0x89, 0x8a, 0x8b, 0x91, // INST, shift RETURN, cursor left, F8, F2, F4, F6, cursor up\n 0x23, 0xd7, 0xc1, 0x24, 0xda, 0xd3, 0xc5, 0x01, // # and the graphics of W A, $, Z S E, left shift\n 0x25, 0xd2, 0xc4, 0x26, 0xc3, 0xc6, 0xd4, 0xd8, // % R D & C F T X\n 0x27, 0xd9, 0xc7, 0x28, 0xc2, 0xc8, 0xd5, 0xd6, // ' Y G ( B H U V\n 0x29, 0xc9, 0xca, 0x30, 0xcd, 0xcb, 0xcf, 0xce, // ) I J 0 M K O N\n 0xdb, 0xd0, 0xcc, 0xdd, 0x3e, 0x5b, 0xba, 0x3c, // + P L - > [ @ <\n 0xa9, 0xc0, 0x5d, 0x93, 0x01, 0x3d, 0xde, 0x3f, // pound * ] CLR, right shift, = pi ?\n 0x21, 0x5f, 0x04, 0x22, 0xa0, 0x02, 0xd1, 0x83, // ! left arrow, CTRL, \" shift space, Commodore key, Q, LOAD and RUN\n];\n// with the Commodore key down: a letter's other graphic, the left one on its keycap; the digits\n// 1 to 8 the second eight colours\nconst COMMODORE = [\n 0x94, 0x8d, 0x9d, 0x8c, 0x89, 0x8a, 0x8b, 0x91, // INST, shift RETURN, cursor left, F8, F2, F4, F6, cursor up\n 0x96, 0xb3, 0xb0, 0x97, 0xad, 0xae, 0xb1, 0x01, // light red, the graphics of W A, dark grey, Z S E, left shift\n 0x98, 0xb2, 0xac, 0x99, 0xbc, 0xbb, 0xa3, 0xbd, // grey, R D, light green, C F T X\n 0x9a, 0xb7, 0xa5, 0x9b, 0xbf, 0xb4, 0xb8, 0xbe, // light blue, Y G, light grey, B H U V\n 0x29, 0xa2, 0xb5, 0x30, 0xa7, 0xa1, 0xb9, 0xaa, // ) I J 0 M K O N\n 0xa6, 0xaf, 0xb6, 0xdc, 0x3e, 0x5b, 0xa4, 0x3c, // + P L - > [ @ <\n 0xa8, 0xdf, 0x5d, 0x93, 0x01, 0x3d, 0xde, 0x3f, // pound * ] CLR, right shift, = pi ?\n 0x81, 0x5f, 0x04, 0x95, 0xa0, 0x02, 0xab, 0x83, // orange, left arrow, CTRL, brown, shift space, Commodore key, Q, LOAD and RUN\n];\n// with CTRL down: the digits 1 to 8 the first eight colours, 9 and 0 RVS ON and OFF, the letters\n// their control codes (A 1 to Z 26); $FF where a key gives nothing\nconst CTRL = [\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // DEL, RETURN, cursor right, F7, F1, F3, F5, cursor down: nothing\n 0x1c, 0x17, 0x01, 0x9f, 0x1a, 0x13, 0x05, 0xff, // red, W A, cyan, Z S, white (E), left shift\n 0x9c, 0x12, 0x04, 0x1e, 0x03, 0x06, 0x14, 0x18, // purple, R (RVS ON) D, green, C F T X\n 0x1f, 0x19, 0x07, 0x9e, 0x02, 0x08, 0x15, 0x16, // blue, Y G, yellow, B H U V\n 0x12, 0x09, 0x0a, 0x92, 0x0d, 0x0b, 0x0f, 0x0e, // RVS ON (9), I J, RVS OFF (0), M K O N\n 0xff, 0x10, 0x0c, 0xff, 0xff, 0x1b, 0x00, 0xff, // + P L - . : @ ,\n 0x1c, 0xff, 0x1d, 0xff, 0xff, 0x1f, 0x1e, 0xff, // pound * ; HOME, right shift, = up-arrow /\n 0x90, 0x06, 0xff, 0x05, 0xff, 0xff, 0x11, 0xff, // black (1), left arrow, CTRL, white (2), space, Commodore key, Q, RUN/STOP\n];\nconst DECODE = [UNSHIFTED, SHIFTED, COMMODORE, CTRL]; // the tables at $EB81, $EBC2, $EC03 and $EC78\nconst TABLES = [0xeb81, 0xebc2, 0xec03, 0xec78];\nexport const KEY_TABLES = [0xeb79, 0xecb9]; // the addresses they take, the four and where they are\nexport function kernalByte(at) {\n if (at >= 0xeb79 && at < 0xeb81) return TABLES[(at - 0xeb79) >> 1] >> ((at & 1) ? 0 : 8) & 0xff;\n const t = TABLES.findIndex(f => at >= f && at <= f + 0x40), code = at - TABLES[t];\n const v = t < 0 ? undefined : code === 0x40 ? 0xff : DECODE[t][code];\n if (v === undefined && at >= KEY_TABLES[0] && at < KEY_TABLES[1]) throw new Error(`the KERNAL's byte at $${at.toString(16).toUpperCase()}: not handled`);\n return v;\n}\n\n// A character as the key of the matrix that types it, and the shift with it: the cursor keys,\n// RETURN, DEL and the keys of the unshifted table; or null (a character typed only into the buffer)\nexport function matrixOf(p) {\n const shifted = { 0x9d: 2, 0x91: 7 };\n if (shifted[p] !== undefined) return { code: shifted[p], shift: 1 };\n const code = UNSHIFTED.indexOf(p);\n return code < 0 || [0x01, 0x02, 0x03, 0x04].includes(p) ? null : { code, shift: 0 };\n}\n\nexport function install({ cpu: c, read, write, drive, loaded = () => {}, call, held = () => null, log = () => {} }) {\n const z = a => read(a), zw = (a, v) => write(a, v & 0xff);\n // the screen editor, as the KERNAL's (editor.js): CHROUT's characters for the screen,\n // the screen cleared, the pointers set; its scroll reads the keyboard's CTRL row as the KERNAL's does\n const ed = editor({ read, write, keyRow: column => { write(0xdc00, column); const v = read(0xdc01); write(0xdc00, 0x7f); return v; } });\n const chrout = ch => ed.chrout(ch), clear = () => ed.clear();\n let typing = false;\n const status = v => zw(0x90, v);\n // Files, as the KERNAL keeps them: a table of up to ten, each its logical number ($0259), its\n // device ($0263) and its secondary address ($026D), how many at $98; the input's device at $99\n // and the output's at $9A. Device 8 is the drive, through the bus; the keyboard (0) and the\n // screen (3) are the KERNAL's own. Any other device on the bus (4 on) is not there: its LISTEN\n // or TALK leaves the status $80, DEVICE NOT PRESENT, and CHKOUT or CHKIN to it fails (5) and\n // leaves the output on the screen, as Goldfields' check for a printer finds ($3EB3).\n const files = () => z(0x98), entry = la => { for (let k = 0; k < files(); k++) if (z(0x259 + k) === la) return k; return -1; };\n const open = () => {\n const la = z(0xb8), fa = z(0xba), sa = z(0xb9);\n if (entry(la) >= 0) { c.a = 2; c.c = 1; return; } // FILE OPEN\n if (files() >= 10) { c.a = 1; c.c = 1; return; } // TOO MANY FILES\n const k = files(); zw(0x259 + k, la); zw(0x263 + k, fa); zw(0x26d + k, sa | 0x60); zw(0x98, k + 1);\n if (fa >= 4) {\n status(0);\n if (z(0xb7)) {\n if (!drive.listen(fa)) { status(0x80); c.a = 5; c.c = 1; return; }\n drive.second((sa | 0x60) | 0xf0); const at = z(0xbb) | z(0xbc) << 8; for (let i = 0; i < z(0xb7); i++) drive.ciout(read(at + i)); drive.unlsn();\n }\n }\n c.c = 0;\n };\n const close = () => {\n const k = entry(c.a); if (k < 0) { c.c = 0; return; }\n const fa = z(0x263 + k), sa = z(0x26d + k);\n if (fa >= 4) { const there = drive.listen(fa); status(there ? 0 : 0x80); if (there) { drive.second((sa & 0xef) | 0xe0); drive.unlsn(); } }\n for (let i = k; i < files() - 1; i++) { zw(0x259 + i, z(0x25a + i)); zw(0x263 + i, z(0x264 + i)); zw(0x26d + i, z(0x26e + i)); }\n zw(0x98, files() - 1); c.c = 0;\n };\n const channel = output => {\n const k = entry(c.x); if (k < 0) { c.a = 3; c.c = 1; return; } // FILE NOT OPEN\n const fa = z(0x263 + k), sa = z(0x26d + k);\n if (fa >= 4) {\n const there = output ? drive.listen(fa) : drive.talk(fa); status(there ? 0 : 0x80);\n if (!there) { c.a = 5; c.c = 1; return; }\n if (output) drive.second(sa); else drive.tksa(sa);\n }\n zw(output ? 0x9a : 0x99, fa); c.c = 0;\n };\n const clrchn = () => { if (z(0x9a) >= 4) drive.unlsn(); if (z(0x99) >= 4) drive.untlk(); zw(0x9a, 3); zw(0x99, 0); };\n const hooks = {\n 0xffd2: () => { if (z(0x9a) >= 4) drive.ciout(c.a); else chrout(c.a); c.c = 0; }, // CHROUT: to the screen, or a device on the bus (the drive's file, the printer)\n 0xffc0: open, 0xffc3: close, 0xffc6: () => channel(false), 0xffc9: () => channel(true), // OPEN, CLOSE, CHKIN, CHKOUT\n 0xffe7: () => { clrchn(); zw(0x98, 0); }, // CLALL\n // CHRIN: from the keyboard, the line typed, a character a call (the screen editor's, its\n // place begun once a call and not again while it waits for keys: `typing`); else a byte from\n // the file on the drive, its status as it ends (none read once it is set: CHKIN clears it)\n 0xffcf: () => {\n if (z(0x99) === 0) {\n if (!typing) { ed.begin(); typing = true; }\n const ch = ed.input();\n if (ch === null) return 'wait';\n typing = false; c.a = ch; c.c = 0; return;\n }\n if (z(0x99) !== 8) throw new Error('CHRIN from device ' + z(0x99) + ': not handled');\n // ($F1AD) with the status already set, a RETURN and no read; else ACPTR's byte\n if (z(0x90)) { c.a = 0x0d; c.c = 0; return; }\n const r = drive.acptr(); if (r) { c.a = r.byte; if (r.eoi) status(z(0x90) | 0x40); } else { c.a = 0x0d; status(z(0x90) | 0x42); } c.c = 0;\n },\n 0xfff0: () => { if (c.c) { c.x = z(0xd6); c.y = z(0xd3); } else { zw(0xd6, c.x); zw(0xd3, c.y); ed.setLine(); } }, // PLOT\n 0xffcc: clrchn, 0xff90: () => { zw(0x9d, c.a); }, // CLRCHN, SETMSG\n 0xffe1: () => { c.z = 0; }, // STOP: not pressed\n 0xffb7: () => { c.a = z(0x90); c.nz(c.a); }, // READST\n 0xffba: () => { zw(0xb8, c.a); zw(0xba, c.x); zw(0xb9, c.y); }, // SETLFS\n 0xffbd: () => { zw(0xb7, c.a); zw(0xbb, c.x); zw(0xbc, c.y); }, // SETNAM\n // LOAD: the file the name says from device 8, where it says or at X and Y; the end in X and Y\n 0xffd5: () => {\n const n = z(0xb7), from = z(0xbb) | z(0xbc) << 8, name = Uint8Array.from({ length: n }, (_, i) => z(from + i)), sa = z(0xb9);\n const raw = z(0xba) === 8 ? drive.load(name) : null;\n if (!raw || raw.length < 2 || c.a !== 0) { c.a = raw ? 4 : 4; c.c = 1; status(0x42); log('LOAD', String.fromCharCode(...name), 'not found'); return; }\n const at = sa === 0 ? c.x | c.y << 8 : raw[0] | raw[1] << 8, body = raw.subarray(2);\n for (let i = 0; i < body.length; i++) write(at + i, body[i]);\n const end = at + body.length;\n zw(0xae, end); zw(0xaf, end >> 8); status(0); c.x = end & 0xff; c.y = end >> 8; c.c = 0; c.a = 0;\n loaded(String.fromCharCode(...name), at, end - 1);\n },\n // SAVE: from the address in the zero page at A to the one in X and Y\n 0xffd8: () => {\n const n = z(0xb7), at = z(0xbb) | z(0xbc) << 8, name = Uint8Array.from({ length: n }, (_, i) => z(at + i));\n const from = z(c.a) | z(c.a + 1) << 8, to = c.x | c.y << 8, body = new Uint8Array(to - from + 2);\n body[0] = from & 0xff; body[1] = from >> 8; for (let i = from; i < to; i++) body[i - from + 2] = read(i);\n drive.save(name, body); c.c = 0; c.a = 0;\n },\n // the serial bus, answered by the drive as the machine's hooks answer it\n 0xffb1: () => status(drive.listen(c.a) ? 0 : 0x80), 0xffb4: () => status(drive.talk(c.a) ? 0 : 0x80),\n 0xff93: () => drive.second(c.a), 0xff96: () => drive.tksa(c.a), 0xffa8: () => drive.ciout(c.a),\n 0xffae: () => drive.unlsn(), 0xffab: () => drive.untlk(),\n 0xffa5: () => { const r = drive.acptr(); if (r) { c.a = r.byte; if (r.eoi) status(z(0x90) | 0x40); } else { c.a = 0x0d; status(z(0x90) | 0x42); } c.c = 0; },\n // the clock at $A0 to $A2, which only the interrupt moves (UDTIM, a sixtieth of a second, and\n // round again after 24 hours), and the keyboard's row with STOP, read as it moves: no key\n 0xffdb: () => { zw(0xa2, c.a); zw(0xa1, c.x); zw(0xa0, c.y); }, 0xffde: () => { c.a = z(0xa2); c.x = z(0xa1); c.y = z(0xa0); },\n 0xffea: () => {\n let t = (z(0xa0) << 16 | z(0xa1) << 8 | z(0xa2)) + 1;\n if (t >= 0x4f1a01) t = 0;\n zw(0xa0, t >> 16); zw(0xa1, t >> 8); zw(0xa2, t); zw(0x91, read(0xdc01));\n },\n // CINT, as MENU calls it within the ROM ($FF5B): the VIC set up, the screen cleared\n 0xff5b: () => { VIC.forEach((v, i) => write(0xd000 + i, v)); zw(0x286, z(0x286) || 14); zw(0x288, z(0x288) || 4); zw(0xc7, 0); clear(); },\n // RESTOR ($FD15): the KERNAL's vectors back to its own\n 0xfd15: () => VECTORS.forEach((v, i) => { zw(0x314 + 2 * i, v); zw(0x315 + 2 * i, v >> 8); }),\n };\n // The keyboard read (SCNKEY, $EA87), from the key it found down: its code in the matrix at $CB\n // and the shift keys at $028D, as the KERNAL's decode takes them on from $EADD (where MENU's\n // interrupt sends a cursor key it holds down for the joystick or the last key, $02). The key\n // goes into the buffer when it is new, or held long enough to repeat (the cursor keys, space\n // and DEL repeat, after 16 interrupts and then every 4). A key held on the page is down in the\n // matrix (`held`); keys typed by a program go into the buffer, as the machine's typing does\n // (machine.js).\n // (or the game's own decode, where it has pointed $028F)\n const decode = () => {\n const own = z(0x28f) | z(0x290) << 8;\n if (own !== 0xeb48) { call(own); return; }\n const code = z(0xcb), shift = z(0x28d);\n // (the table as the KERNAL's decode chooses it, $EB48: SHIFT the shifted, the Commodore key its\n // own, CTRL with or without the others CTRL's; the Commodore key and SHIFT together switch the\n // character set, once a press, unless $0291 locks it, and decode with the table before)\n let table;\n if (shift === 3) { switchSets(shift); table = Math.max(0, TABLES.indexOf(z(0xf5) | z(0xf6) << 8)); }\n else { table = shift * 2 >= 8 ? 3 : shift; zw(0xf5, TABLES[table]); zw(0xf6, TABLES[table] >> 8); }\n const key = code === 0x40 ? 0xff : DECODE[table][code];\n const put = () => {\n zw(0xc5, code); zw(0x28e, shift);\n if (key !== 0xff && z(0xc6) < z(0x289)) { zw(0x277 + z(0xc6), key); zw(0xc6, z(0xc6) + 1); }\n };\n if (code !== z(0xc5)) { zw(0x28c, 0x10); put(); return; } // a new key: in at once, its repeat 16 interrupts on\n const k = key & 0x7f, mode = z(0x28a);\n if (!(mode & 0x80)) { // only these keys repeat, unless all do ($028A)\n if (mode & 0x40) return; // (or none)\n if (k === 0x7f) { put(); return; }\n if (![0x14, 0x20, 0x1d, 0x11].includes(k)) return;\n }\n if (z(0x28c)) { zw(0x28c, z(0x28c) - 1); if (z(0x28c)) return; }\n zw(0x28b, z(0x28b) - 1); if (z(0x28b)) return;\n zw(0x28b, 4);\n if (z(0xc6)) return; // a repeat only into an empty buffer\n put();\n };\n // the scan: the key held down, decoded; or none (keys typed by a program come only through the\n // buffer), which goes past the decode and its vector, and only notes that none is down\n const scnkey = () => {\n const h = held(), shift = h?.shift ?? 0; zw(0x28d, shift); zw(0xcb, h?.code ?? 0x40);\n if (h && h.code !== null) decode(); else { switchSets(shift); zw(0xc5, 0x40); zw(0x28e, shift); }\n };\n // the Commodore key and SHIFT pressed together: the other character set, as $D018 has it\n const switchSets = shift => { if (shift === 3 && z(0x28e) !== 3 && !(z(0x291) & 0x80)) write(0xd018, read(0xd018) ^ 2); };\n hooks[0xeadd] = decode;\n // The interrupt's own routine ($EA31, where $0314 points first): the clock, the cursor's blink\n // (only while BASIC takes a line: $CC is 0), the cassette's motor off, the keyboard; and its end,\n // which a game's own routine goes on to: $EA7B the keyboard read, $EA7E the CIA's interrupt\n // answered, $EA81 the registers back and RTI, which are the remake's to put back\n // ($EA34 the same without the clock, where Goldfields' boot points $0314 while it loads)\n hooks[0xea31] = () => { hooks[0xffea](); hooks[0xea34](); };\n hooks[0xea34] = () => {\n // the cursor's blink, while $CC is 0: every 20 interrupts ($CD) the character at the cursor\n // reversed, it and its colour kept ($CE, $0287) while it is ($CF), and put back after\n if (!z(0xcc)) {\n zw(0xcd, z(0xcd) - 1);\n if (!z(0xcd)) {\n zw(0xcd, 20);\n const y = z(0xd3), at = (z(0xd1) | z(0xd2) << 8) + y, colour = 0xd800 + ((z(0xd1) | z(0xd2) << 8) & 0x3ff) + y;\n const was = z(0xcf) & 1; zw(0xcf, z(0xcf) >> 1);\n let x = z(0x287), a = read(at);\n if (!was) { zw(0xcf, z(0xcf) + 1); zw(0xce, a); zw(0x287, read(colour)); x = z(0x286); a = z(0xce); }\n write(at, a ^ 0x80); write(colour, x);\n }\n }\n if (z(1) & 0x10) { zw(0xc0, 0); zw(1, z(1) | 0x20); } else if (!z(0xc0)) zw(1, z(1) & 0x1f);\n scnkey();\n };\n hooks[0xea7b] = scnkey;\n for (const a of [0xea7e, 0xea81]) hooks[a] = () => {};\n // Two of BASIC's routines, which Tell-A-Tale calls to write a number: a whole number in $62 and\n // $63 into the floating point accumulator (FLOATC, $BC49, X the exponent: $90 for 16 bits, C set\n // for positive), and the accumulator as text (FOUT, entered at $BDDF): its sign at $00FF+Y (Y as\n // FLOATC leaves it, 0), its digits after, a 0 at the end, and its address in A and Y. Another\n // number than a whole one is not handled: it stops the remake.\n hooks[0xbc49] = () => {\n if (c.x !== 0x90 || !c.c) throw new Error('FLOATC with another exponent or sign: not handled');\n let mant = z(0x62) << 24 | z(0x63) << 16, exp = c.x;\n if (!mant) exp = 0; else while (!(mant & 0x80000000)) { mant = (mant << 1) >>> 0; exp--; }\n zw(0x61, exp); zw(0x62, mant >>> 24); zw(0x63, mant >>> 16); zw(0x64, 0); zw(0x65, 0); zw(0x66, 0); zw(0x70, 0); c.y = 0;\n };\n hooks[0xbddf] = () => {\n const exp = z(0x61), mant = (z(0x62) << 24 | z(0x63) << 16 | z(0x64) << 8 | z(0x65)) >>> 0, shift = 0xa0 - exp;\n if (exp && (shift < 0 || shift > 32 || mant % 2 ** shift)) throw new Error('FOUT of a number not whole: not handled');\n const n = exp ? mant / 2 ** shift : 0, sign = z(0x66) & 0x80 ? 0x2d : 0x20, text = String(n);\n write(0xff + c.y, sign); zw(0x66, sign);\n for (let i = 0; i < text.length; i++) write(0x100 + c.y + i, text.charCodeAt(i));\n write(0x100 + c.y + text.length, 0);\n c.a = 0x00; c.y = 0x01; c.x = 0;\n };\n // two of OPEN's and CLOSE's own steps for a file on the drive, which MENU's fast loader calls\n // within the ROM: the secondary address and name sent ($F3D5), and the file closed ($F642)\n hooks[0xf3d5] = () => {\n if (z(0xb9) & 0x80 || !z(0xb7)) { c.c = 0; return; }\n status(drive.listen(z(0xba)) ? 0 : 0x80); drive.second(z(0xb9) | 0xf0);\n const at = z(0xbb) | z(0xbc) << 8; for (let i = 0; i < z(0xb7); i++) drive.ciout(z(at + i));\n drive.unlsn(); c.c = z(0x90) & 0x80 ? 1 : 0;\n };\n hooks[0xf642] = () => { if (z(0xb9) & 0x80) return; const there = drive.listen(z(0xba)); status(there ? 0 : 0x80); if (there) { drive.second((z(0xb9) & 0xef) | 0xe0); drive.unlsn(); } c.c = 0; };\n // and the routines the vectors lead to, which a game's own routine hands on to (MENU's CHROUT\n // ends JMP $F1CA): the same\n Object.assign(hooks, { 0xf1ca: hooks[0xffd2], 0xf4a5: hooks[0xffd5], 0xf5ed: hooks[0xffd8] });\n for (const [a, f] of Object.entries(hooks)) c.hooks.set(+a, f);\n}\n", "// A Commodore 64, as far as the games use it: 64K of RAM with the KERNAL, BASIC and character\n// ROMs banked over it by the 6510's port, the VIC-II's text and bitmap modes and sprites drawn\n// a raster line at a time, its raster interrupt, the two CIAs' timers and the keyboard and\n// joystick through the first, the SID's registers, and the 1541 in drive.js, answered when the\n// KERNAL is asked to load or save and at the KERNAL's serial bus routines, so that the games'\n// own talking to the drive works too. PAL: 312 lines of 63 cycles, 985,248 cycles a second.\nimport { CPU } from '@moonbase-machines/mos6502/cpu.js';\nimport { VIC } from './vic.js';\nimport { Drive } from './drive.js';\nimport { Printer, bus } from './printer.js';\nimport { install as standIn } from './rom.js';\n\nconst LINES = 312, CYCLES_PER_LINE = 63, DISPLAY_START = 15; // (the cycle of a line its first character is fetched at)\n\nexport class C64 {\n constructor(game, roms, { log = () => {}, printer = new Printer({ on: false }) } = {}) {\n this.game = game; this.log = log;\n this.ram = new Uint8Array(0x10000);\n this.kernal = roms.kernal; this.basic = roms.basic; this.chargen = roms.chargen;\n this.color = new Uint8Array(0x400);\n this.port = 0x37; this.portDir = 0x2f;\n this.cia1 = new CIA(); this.cia2 = new CIA();\n this.sid = new Uint8Array(0x20); this.sidWrites = []; // [cycle, register, value] since the last frame\n this.vic = new VIC(this);\n this.keys = new Uint8Array(8); // the keyboard matrix, a bit a key, set while held\n this.joystick = 0; // port 2: up 1, down 2, left 4, right 8, fire 16\n this.drive = new Drive(Uint8Array.from(atob(game.image), c => c.charCodeAt(0)));\n this.printer = printer; // device 4, on the bus if switched on (printer.js)\n this.halted = false; this.frame = 0; this.line = 0;\n this.cpu = new CPU(this, { nmos: true, writeBack: true }); // the 6510 is an NMOS 6502, undocumented NOPs and all, and its read-modify-writes write twice\n // the KERNAL's LOAD, once the name and device are set, and its SAVE; on Commodore's ROMs with\n // their vectors ($0330, $0332) as the KERNAL sets them, its own code instead, on the bus\n // below: its messages (SEARCHING FOR, LOADING, VERIFYING, SAVING) and VERIFY as it does them.\n // A game's own loader at the vector (Zoopak's) is answered here.\n const own = (vector, at) => !roms.standIn && this.read16(vector) === at;\n this.cpu.hooks.set(0xf49e, () => own(0x330, 0xf4a5) ? false : this.load());\n this.cpu.hooks.set(0xf5dd, () => own(0x332, 0xf5ed) ? false : this.save());\n // the serial bus, at the routines the KERNAL's jump table leads to; the status at $90 says\n // whether the device answered, and bit 6 marks the last byte of a file\n const d = this.bus = bus(this.drive, this.printer), st = this.ram;\n // (a device not there adds DEVICE NOT PRESENT to the status, as the KERNAL's $FE1C does; one\n // that answers leaves it as it was: a VERIFY's mismatch, bit 4, kept through the CLOSE after)\n this.cpu.hooks.set(0xed0c, c => { if (!d.listen(c.a)) st[0x90] |= 0x80; return true; });\n this.cpu.hooks.set(0xed09, c => { if (!d.talk(c.a)) st[0x90] |= 0x80; return true; });\n this.cpu.hooks.set(0xedb9, c => { d.second(c.a); return true; });\n this.cpu.hooks.set(0xedc7, c => { d.tksa(c.a); return true; });\n // (CIOUT ends CLC, as Commodore's does: BASIC's CHROUT, $E10C, takes a carry set as an error)\n this.cpu.hooks.set(0xeddd, c => { d.ciout(c.a); c.c = 0; return true; });\n this.cpu.hooks.set(0xedfe, () => { d.unlsn(); return true; });\n this.cpu.hooks.set(0xedef, () => { d.untlk(); return true; });\n this.cpu.hooks.set(0xee13, c => { const r = d.acptr(); if (r) { c.a = r.byte; if (r.eoi) st[0x90] |= 0x40; } else { c.a = 0x0d; st[0x90] |= 0x42; } c.c = 0; return true; });\n // Commodore's ROMs, or moonbase's in their place (rom.js)\n if (roms.standIn) standIn(this);\n this.reset();\n }\n\n reset() { this.port = 0x37; this.portDir = 0x2f; this.cpu.pc = this.read16(0xfffc); this.cpu.sp = 0xfd; this.cpu.i = 1; }\n read16(a) { return this.read(a) | this.read(a + 1) << 8; }\n\n // what the CPU sees, by the port's LORAM, HIRAM and CHAREN bits\n read(a) {\n if (a === 0) return this.portDir;\n if (a === 1) return (this.port & this.portDir) | (~this.portDir & 0x17) & 0xff | 0x10; // the cassette sense reads high\n const p = this.port & 7;\n if (a >= 0xe000) return p & 2 ? this.rom(this.kernal, a) : this.ram[a];\n if (a >= 0xd000 && a < 0xe000) { if (p & 3 && p & 4) return this.io(a); if (p & 3) return this.chargen[a - 0xd000]; return this.ram[a]; }\n if (a >= 0xa000 && a < 0xc000) return (p & 3) === 3 ? this.rom(this.basic, a) : this.ram[a];\n return this.ram[a];\n }\n // a ROM's byte; in moonbase's stand-in only those it has (rom.js), another stops the machine\n rom(r, a) {\n const i = a - (r === this.kernal ? 0xe000 : 0xa000);\n if (r.known && !r.known[i]) throw new Error(`the ${r === this.kernal ? 'KERNAL' : 'BASIC'} ROM at $${a.toString(16).toUpperCase()}: not handled`);\n return r[i];\n }\n write(a, v) {\n if (a === 0) { this.portDir = v; return; }\n if (a === 1) { this.port = v; return; }\n const p = this.port & 7;\n if (a >= 0xd000 && a < 0xe000 && (p & 3) && (p & 4)) { this.ioWrite(a, v); return; }\n this.ram[a] = v; // a write under a ROM goes to the RAM beneath\n }\n\n // the I/O page: the VIC-II at $D000, the SID at $D400, color RAM at $D800, the CIAs at $DC00 and $DD00\n io(a) {\n if (a < 0xd400) return this.vic.read(a & 0x3f);\n if (a < 0xd800) return (a & 0x1f) === 0x1b ? Math.random() * 256 | 0 : (a & 0x1f) === 0x1c ? 0 : this.sid[a & 0x1f]; // OSC3 reads noise, ENV3 nothing\n if (a < 0xdc00) return this.color[a - 0xd800] | 0xf0;\n if (a < 0xdd00) return this.cia1.read(a & 0xf, this);\n if (a < 0xde00) return this.cia2.read(a & 0xf, this);\n return 0xff;\n }\n ioWrite(a, v) {\n if (a < 0xd400) this.vic.write(a & 0x3f, v);\n else if (a < 0xd800) { this.sid[a & 0x1f] = v; this.sidWrites.push([this.cpu.cycles, a & 0x1f, v]); }\n else if (a < 0xdc00) this.color[a - 0xd800] = v & 15;\n else if (a < 0xdd00) this.cia1.write(a & 0xf, v);\n else if (a < 0xde00) this.cia2.write(a & 0xf, v);\n }\n\n // the keyboard matrix as CIA1 scans it: port A selects columns, low; port B reads rows, low\n // for a key held; the joystick in port 2 pulls port A's low bits, in port 1 port B's\n keyboardRows(columns) {\n let rows = 0xff;\n for (let c = 0; c < 8; c++) if (!(columns & (1 << c))) rows &= ~this.keys[c];\n return rows & 0xff;\n }\n\n // the KERNAL's LOAD: the name at ($BB) of $B7 bytes, the device in $BA, the secondary address\n // in $B9, and the address to load at in X and Y when the secondary address is 0. The file goes\n // into memory, the end goes to $AE/$AF and X/Y, and carry clear says it worked.\n load() {\n const c = this.cpu, nameBytes = this.ram.subarray(this.ram[0xbb] | this.ram[0xbc] << 8, (this.ram[0xbb] | this.ram[0xbc] << 8) + this.ram[0xb7]), device = this.ram[0xba], sa = this.ram[0xb9];\n const name = String.fromCharCode(...nameBytes);\n if (device !== 8) { c.a = 5; c.c = 1; return; } // DEVICE NOT PRESENT\n const raw = this.drive.load(nameBytes);\n if (!raw || raw.length < 2 || c.a !== 0) { this.log('LOAD ' + JSON.stringify(name) + (raw ? ' verify' : ' not found')); c.a = 4; c.c = 1; this.ram[0x90] = 0x42; return; }\n const at = sa === 0 ? c.x | c.y << 8 : raw[0] | raw[1] << 8, body = raw.subarray(2);\n for (let i = 0; i < body.length; i++) this.write(at + i, body[i]);\n const end = at + body.length;\n this.ram[0xae] = end & 0xff; this.ram[0xaf] = end >> 8; this.ram[0x90] = 0;\n c.x = end & 0xff; c.y = end >> 8; c.c = 0; c.a = 0;\n this.log('LOAD', JSON.stringify(name), '$' + at.toString(16), body.length + ' bytes');\n }\n // SAVE: the start address is in the zero page at A, the end in X and Y\n save() {\n const c = this.cpu, name = this.pstringAt(this.ram[0xbb] | this.ram[0xbc] << 8, this.ram[0xb7]);\n const from = this.ram[c.a] | this.ram[c.a + 1] << 8, to = c.x | c.y << 8;\n const body = new Uint8Array(to - from + 2); body[0] = from & 0xff; body[1] = from >> 8;\n for (let i = from; i < to; i++) body[i - from + 2] = this.read(i);\n this.drive.save(this.ram.subarray(this.ram[0xbb] | this.ram[0xbc] << 8, (this.ram[0xbb] | this.ram[0xbc] << 8) + this.ram[0xb7]), body);\n this.log('SAVE', JSON.stringify(name), body.length + ' bytes'); c.c = 0; c.a = 0;\n }\n pstringAt(a, n) { let s = ''; for (let i = 0; i < n; i++) s += String.fromCharCode(this.ram[a + i]); return s; }\n\n // a key held or released, by its place in the matrix: column 0 to 7 and row 0 to 7\n key(column, row, down) { if (down) this.keys[column] |= 1 << row; else this.keys[column] &= ~(1 << row); }\n // type a line as if at the keyboard, through the KERNAL's buffer at $0277, once BASIC is ready\n type(text) { const n = Math.min(10, text.length); for (let i = 0; i < n; i++) this.ram[0x277 + i] = text.charCodeAt(i); this.ram[0xc6] = n; return text.slice(n); }\n\n // one raster line: the CPU's cycles, the CIAs' timers, the VIC-II's line, and any interrupt. The\n // line is drawn with the registers and memory as they are where its display starts, cycle 15,\n // as the VIC-II takes them: a register written later in the line (a demo's raster split, after\n // its wait) shows from the next line, as the 64 shows the left of the screen (held to VICE on\n // Subway Arts' $D016 at line $42)\n runLine() {\n const until = this.cpu.cycles + CYCLES_PER_LINE, display = this.cpu.cycles + DISPLAY_START;\n let drawn = false;\n while (this.cpu.cycles < until && !this.halted) {\n if (!drawn && this.cpu.cycles >= display) { this.vic.line(this.line); drawn = true; }\n const before = this.cpu.cycles;\n const pc = this.cpu.pc;\n if ((this.port & 2) === 0 && pc >= 0xe000 && !this.cpu.hooks.has(pc)) { /* RAM under the KERNAL: fine, it runs */ }\n this.cpu.step();\n const spent = this.cpu.cycles - before;\n if (this.cia1.tick(spent) && (this.cia1.icr & 0x80)) this.cpu.irq();\n // (NMI on its edge, as the 6502 takes it: once as CIA 2's line goes active, not again until\n // it has gone inactive, its flags read, and active again; a demo that leaves it active,\n // unacknowledged, is not interrupted for ever after, which is how RESTORE is locked out)\n this.cia2.tick(spent);\n const nmi = (this.cia2.icr & 0x80) !== 0;\n if (nmi && !this.nmiLine) this.cpu.nmi();\n this.nmiLine = nmi;\n }\n if (!drawn) this.vic.line(this.line);\n if (this.vic.irq()) this.cpu.irq();\n this.line = (this.line + 1) % LINES;\n if (this.line === 0) this.frame++;\n }\n runFrame() { for (let i = 0; i < LINES; i++) this.runLine(); }\n}\n\n// A 6526 CIA: two timers counting cycles, an interrupt when one runs out, and two ports.\nclass CIA {\n constructor() { this.ta = 0xffff; this.taLatch = 0xffff; this.tb = 0xffff; this.tbLatch = 0xffff; this.cra = 0; this.crb = 0; this.icr = 0; this.mask = 0; this.pra = 0xff; this.prb = 0xff; this.ddra = 0; this.ddrb = 0; this.tod = 0; }\n read(r, m) {\n switch (r) {\n case 0: return m && this === m.cia1 ? (this.pra | ~this.ddra) & ~(m.joystick) & 0xff : (this.pra | ~this.ddra) & 0xff;\n case 1: return m && this === m.cia1 ? m.keyboardRows(this.pra | ~this.ddra) & (this.prb | ~this.ddrb) : (this.prb | ~this.ddrb) & 0xff;\n case 2: return this.ddra; case 3: return this.ddrb;\n case 4: return this.ta & 0xff; case 5: return this.ta >> 8; case 6: return this.tb & 0xff; case 7: return this.tb >> 8;\n case 8: return 0; case 9: return 0; case 10: return 0; case 11: return 0;\n case 13: { const v = this.icr; this.icr = 0; return v; }\n case 14: return this.cra; case 15: return this.crb;\n }\n return 0;\n }\n write(r, v) {\n switch (r) {\n case 0: this.pra = v; break; case 1: this.prb = v; break; case 2: this.ddra = v; break; case 3: this.ddrb = v; break;\n case 4: this.taLatch = (this.taLatch & 0xff00) | v; break; case 5: this.taLatch = (this.taLatch & 0xff) | v << 8; if (!(this.cra & 1)) this.ta = this.taLatch; break;\n case 6: this.tbLatch = (this.tbLatch & 0xff00) | v; break; case 7: this.tbLatch = (this.tbLatch & 0xff) | v << 8; if (!(this.crb & 1)) this.tb = this.tbLatch; break;\n case 13: if (v & 0x80) this.mask |= v & 0x1f; else this.mask &= ~v; break;\n case 14: this.cra = v; if (v & 0x10) this.ta = this.taLatch; break;\n case 15: this.crb = v; if (v & 0x10) this.tb = this.tbLatch; break;\n }\n }\n // the timers by `cycles`; true when an enabled interrupt is raised\n tick(cycles) {\n let raised = false;\n if (this.cra & 1) {\n this.ta -= cycles;\n while (this.ta < 0) { this.ta += this.taLatch + 1; this.icr |= 1; if (this.cra & 8) { this.cra &= ~1; this.ta = this.taLatch; } if ((this.crb & 0x60) === 0x40 && this.crb & 1) { if (--this.tb < 0) { this.tb = this.tbLatch; this.icr |= 2; } } }\n }\n if (this.crb & 1 && (this.crb & 0x60) === 0) { this.tb -= cycles; while (this.tb < 0) { this.tb += this.tbLatch + 1; this.icr |= 2; if (this.crb & 8) { this.crb &= ~1; this.tb = this.tbLatch; } } }\n if (this.icr & this.mask & 0x1f) { this.icr |= 0x80; raised = true; }\n return raised;\n }\n}\n", "import { cpu as m } from '@moonbase-machines/mos6502';\nexport const { CPU, CYCLES } = m;", "// A printer on the Commodore 64's serial bus, device 4, as the games print to it: OPEN 4,4 (or\n// 4,4,7 for small letters), PRINT# and CLOSE. It keeps what it is sent as lines of characters, in\n// the mode it was in for each (capitals and graphics, or small letters and capitals), for a page\n// to show as a sheet of paper (`paper`). It is not on the bus unless it is switched on, as the\n// machines were sold: with it off, a game finds DEVICE NOT PRESENT, as Goldfields does.\n//\n// The bus (`bus`) puts it beside the drive: LISTEN, SECOND, CIOUT and UNLISTEN go to every device,\n// and each takes them only while it is the one listening; TALK and the rest, and LOAD and SAVE,\n// are the drive's alone.\nimport { screenCode } from './kernal.js';\n\nexport const WIDTH = 80; // the characters a line holds, as Commodore's printers had\n\nexport class Printer {\n constructor({ on = true } = {}) {\n this.on = on;\n this.listening = false; this.lower = false; this.wide = false; this.reverse = false;\n this.lines = []; this.line = [];\n this.changed = () => {}; // called when a line is finished, for a page to draw it\n }\n listen(device) { this.listening = this.on && device === 4; return this.listening; }\n talk() { return false; }\n // the secondary address: 7 is small letters and capitals, the rest capitals and graphics\n second(sa) { if (this.listening) this.lower = (sa & 15) === 7; }\n tksa() {}\n ciout(b) {\n if (!this.listening) return;\n switch (b) {\n case 13: this.feed(); return; // a new line\n case 10: return;\n case 17: this.lower = true; return; // small letters and capitals\n case 145: this.lower = false; return; // capitals and graphics\n case 14: this.wide = true; return; // double width\n case 15: this.wide = false; return;\n case 18: this.reverse = true; return; // reversed\n case 146: this.reverse = false; return;\n case 29: b = 32; break; // (cursor right: a space)\n }\n if ((b & 0x7f) < 32) return; // the other controls\n if (this.line.length >= WIDTH) this.feed();\n this.line.push({ code: b, lower: this.lower, wide: this.wide, reverse: this.reverse });\n }\n feed() { this.lines.push(this.line); this.line = []; this.wide = false; this.reverse = false; this.changed(); }\n unlsn() { this.listening = false; }\n untlk() {}\n acptr() { return null; }\n tear() { this.lines = []; this.line = []; this.changed(); } // the paper torn off\n}\n\n// the drive and the printer on one bus, as the KERNAL's serial routines reach them\nexport function bus(drive, printer) {\n const all = [drive, printer];\n return {\n drive, printer,\n listen: d => all.map(x => x.listen(d)).some(Boolean),\n talk: d => drive.talk(d),\n second: sa => all.forEach(x => x.second(sa)),\n tksa: sa => drive.tksa(sa),\n ciout: b => all.forEach(x => x.ciout(b)),\n unlsn: () => all.forEach(x => x.unlsn()),\n untlk: () => drive.untlk(),\n acptr: () => drive.acptr(),\n load: name => drive.load(name),\n save: (name, raw) => drive.save(name, raw),\n find: name => drive.find(name),\n };\n}\n\n// The sheet: what the printer has printed, drawn on a canvas in the 64's own characters (the\n// character ROM, `chargen`), black on continuous paper with its feed holes down both sides\nexport function paper(canvas, printer, chargen, { scale = 2 } = {}) {\n // (a line a character and a half high, as a printer spaces them)\n const margin = 24, cell = 8 * scale, line = cell * 1.5, rows = Math.max(12, printer.lines.length + 2);\n canvas.width = (WIDTH * 8 + margin * 2) * scale / 2 * 2; canvas.height = rows * line + cell;\n const g = canvas.getContext('2d'), w = canvas.width;\n g.fillStyle = '#fbfaf3'; g.fillRect(0, 0, w, canvas.height);\n for (let r = 0; r < rows; r += 6) { g.fillStyle = '#e6f0e2'; g.fillRect(margin * scale / 2, r * line + cell / 2, w - margin * scale, line * 3); } // the green bars\n g.fillStyle = '#d9d6c8';\n for (let y = cell / 2; y < canvas.height; y += cell * 2) for (const x of [margin * scale / 4, w - margin * scale / 4]) { g.beginPath(); g.arc(x, y, scale * 2.5, 0, Math.PI * 2); g.fill(); }\n const lines = [...printer.lines, printer.line], dot = scale;\n lines.forEach((chars, r) => {\n let x = margin * scale / 2 + cell / 2;\n for (const c of chars) {\n const sc = screenCode(c.code), base = (c.lower ? 0x800 : 0) + sc * 8, wide = c.wide ? 2 : 1;\n for (let py = 0; py < 8; py++) {\n const bits = chargen ? chargen[base + py] : 0;\n for (let px = 0; px < 8; px++) {\n const on = (bits >> (7 - px) & 1) ^ (c.reverse ? 1 : 0);\n if (on) { g.fillStyle = '#26241f'; g.fillRect(x + px * dot * wide, r * line + cell / 2 + py * dot, dot * wide, dot); }\n }\n }\n x += cell * wide;\n }\n });\n}\n", "// The Commodore 64's ROMs in JavaScript, since the ROMs are Commodore's own: the original's\n// counterpart of @moonbase-machines/apple2e/rom.js for the Apple. The games run as they are, their own\n// bytes on the 6510; where one calls into the KERNAL or BASIC, the routine is answered here, at\n// its address, as the remake's KERNAL answers it (kernal.js), and the machine goes on as the\n// ROM's would have left it. A routine not here stops the machine and says where, as the remake\n// does.\n//\n// const roms = standIn() the three ROMs' places, for new C64(game, roms)\n// install(machine) the routines, on the machine's processor\n//\n// What the ROM images hold is only what a game reads as data, each byte with its reason: the\n// processor's three vectors, the KERNAL's keyboard tables (kernal.js `kernalByte`), and three\n// bytes Zoopak's code reads with BIT only to skip the two bytes after it (BIT $AE91, $FBB1 and\n// $FFA9), whose top two bits the flags take. Any other byte read stops the machine too. The\n// character set is moonbase's own 5 by 7 font (@moonbase-machines/charset/font.js), the Apple's: a game\n// that draws in its own characters (Zoopak's, from RAM) is not touched by it.\n//\n// The titles it runs, each held to the remake and to Commodore's ROMs, are `STANDS_IN`: Zoopak,\n// and Goldfields, whose Blitz! code calls BASIC's ROM as its library (basic-rom.js); and Crayon\n// on the 64, Moonbase's own, held to Commodore's ROMs.\nimport { install as kernal, kernalByte, VIC, VECTORS } from './kernal.js';\nimport { CONSTANTS } from './float.js';\nimport { chargen } from '@moonbase-machines/charset/chargen.js';\nimport { install as basicRom, printError, evaluateInMemory } from './basic-rom.js';\nimport { lines, direct, crunch, store, list, program as programLines, dataItems } from './basic-lang.js';\nimport { instantiate, evaluator } from './basic-compile.js';\nimport { Basic } from './basic.js';\nimport { BasicError, ERRORS, val, scanNumber } from './numbers.js';\n\nexport const STANDS_IN = ['zoopak', 'goldfields', 'crayon64', 'crayon64-studio'];\n\nconst BYTES = {\n 0xfffa: 0x43, 0xfffb: 0xfe, // NMI: $FE43\n 0xfffc: 0xe2, 0xfffd: 0xfc, // RESET: $FCE2, the cold start\n 0xfffe: 0x48, 0xffff: 0xff, // IRQ and BRK: $FF48\n 0xae91: 0xbc, 0xfbb1: 0x8d, 0xffa9: 0xdd, // read by BIT only: N set, and V for $FFA9\n};\n\n// a ROM's 8K and which of its bytes are here; reading one that is not stops the machine\nfunction image(from) {\n const bytes = new Uint8Array(0x2000), known = new Uint8Array(0x2000);\n for (let a = from; a < from + 0x2000; a++) {\n let v = BYTES[a];\n if (v === undefined && from === 0xe000) try { v = kernalByte(a); } catch { v = undefined; }\n // (BASIC's constants, which its arithmetic reads from the ROM: float.js)\n for (const [at, bytes] of Object.entries(CONSTANTS)) if (a >= +at && a < +at + bytes.length) v = bytes[a - at];\n if (v !== undefined) { bytes[a - from] = v; known[a - from] = 1; }\n }\n return Object.assign(bytes, { known, from });\n}\nexport function standIn() {\n return { kernal: image(0xe000), basic: image(0xa000), chargen: chargen(), standIn: true };\n}\n\n// The keyboard's matrix as the KERNAL's scan finds it: the first key held that is not a shift\n// key, as its code (column * 8 + row), and the shift keys down as $028D has them (1 SHIFT, 2 the\n// Commodore key, 4 CTRL)\nconst SHIFTS = { 0x0f: 1, 0x34: 1, 0x3d: 2, 0x3a: 4 };\nfunction held(m) {\n let code = null, shift = 0;\n for (let column = 0; column < 8; column++) for (let row = 0; row < 8; row++) {\n if (!(m.keys[column] & 1 << row)) continue;\n const k = column * 8 + row;\n if (SHIFTS[k]) shift |= SHIFTS[k]; else if (code === null) code = k;\n }\n return code === null && !shift ? null : { code, shift }; // (code null: only shift keys down)\n}\n\nexport function install(m) {\n const c = m.cpu, r = a => m.read(a), w = (a, v) => m.write(a, v & 0xff);\n // (CHRGET and CHRGOT, $0073 and $0079, BASIC's in RAM, answered as its ROM's are, whatever is banked)\n const banked = pc => (pc >= 0xe000 && m.port & 2) || (pc >= 0xa000 && pc < 0xc000 && (m.port & 3) === 3) || pc === 0x73 || pc === 0x79;\n const vector = a => r(a) | r(a + 1) << 8;\n // a routine the game's own code calls, run to its return: the keyboard decode a game has\n // pointed $028F at (Tell-A-Tale's)\n const call = at => {\n const back = c.pc, sp = c.sp;\n c.push((back - 1) >> 8); c.push((back - 1) & 0xff); c.pc = at;\n for (let guard = 0; guard < 1e6 && !(c.pc === back && c.sp === sp); guard++) c.step();\n };\n const before = new Set(c.hooks.keys());\n kernal({ cpu: c, read: r, write: w, drive: m.bus, call, held: () => held(m), log: m.log });\n // and what the remake's KERNAL leaves to the remake: GETIN, the next key in the keyboard's\n // buffer ($0277, $C6 of them), or 0, or from the drive when the input is a file on it, as CHRIN\n // reads it; SCNKEY\n // ($FF9F, and $EA87 itself), the interrupt's keyboard read; SCREEN and IOBASE, the screen's size and the I/O's place\n c.hooks.set(0xffe4, () => {\n if (r(0x99) >= 4) return c.hooks.get(0xf157)(c); // (from a file, CHRIN's own way: $F14A on to $F166)\n const n = r(0xc6);\n if (!n) { c.a = 0; c.nz(0); c.c = 0; return; }\n c.a = r(0x277); for (let i = 0; i < n - 1; i++) w(0x277 + i, r(0x278 + i)); w(0xc6, n - 1); c.nz(c.a); c.c = 0;\n });\n c.hooks.set(0xff9f, c.hooks.get(0xea7b));\n c.hooks.set(0xea87, c.hooks.get(0xea7b)); // (and SCNKEY at its own address, past the jump table)\n c.hooks.set(0xffed, () => { c.x = 40; c.y = 25; });\n c.hooks.set(0xfff3, () => { c.x = 0x00; c.y = 0xdc; });\n // The jump table's routines that go through a vector in RAM ($031A to $0333), as the KERNAL's\n // own do (CHROUT, $FFD2, is JMP ($0326)): the routine at the vector's own place, and the table's\n // entry on through the vector, to it or to a game's own routine there (Zoopak's MENU points\n // CHROUT at its own, which draws on its screen and ends JMP $F1CA). But LOAD and SAVE go to the\n // machine's own, at $F49E and $F5DD (machine.js), before their vectors, as with\n // Commodore's ROM: the drive is answered at the KERNAL's routines, not on the serial bus's\n // wires, so a game's own fast loader at the vector (Zoopak's, at $C20C) is gone past.\n const VECTORED = { 0xffc0: [0x31a, 0xf34a], 0xffc3: [0x31c, 0xf291], 0xffc6: [0x31e, 0xf20e], 0xffc9: [0x320, 0xf250], 0xffcc: [0x322, 0xf333],\n 0xffcf: [0x324, 0xf157], 0xffd2: [0x326, 0xf1ca], 0xffe1: [0x328, 0xf6ed], 0xffe4: [0x32a, 0xf13e], 0xffe7: [0x32c, 0xf32f] };\n for (const [entry, [via, own]] of Object.entries(VECTORED).map(([e, v]) => [+e, v])) {\n c.hooks.set(own, c.hooks.get(entry));\n c.hooks.set(entry, () => { c.pc = vector(via); return false; });\n }\n c.hooks.set(0xffd5, () => { w(0xc3, c.x); w(0xc4, c.y); c.pc = 0xf49e; return false; });\n c.hooks.set(0xffd8, () => { c.pc = 0xf5dd; return false; });\n // BASIC's ROM: the routines a program's machine code calls (basic-rom.js), an\n // expression's value from the program being run (its compiled parameters)\n basicRom({ cpu: c, read: r, write: w, chrout: c.hooks.get(0xf1ca),\n // (the program RUN has compiled, the boot, its own compiled parameters; any other text, a\n // program BASIC is not running (Blitz!'s GAME), read from memory and its variables there)\n evaluate: at => {\n const p = program?.params?.[at];\n if (!p) return inMemory(at);\n const [end, f, place] = p;\n return { value: f(basic), end, place };\n } });\n const inMemory = evaluateInMemory({ cpu: c, read: r, write: w, ram: m.ram });\n\n const ours = [...c.hooks.keys()].filter(a => !before.has(a));\n // the return from an interrupt, as the KERNAL's ends ($EA81): Y, X and A back, and RTI\n const exit = () => { c.y = c.pull(); c.x = c.pull(); c.a = c.pull(); c.p = c.pull(); c.pc = c.pull() | c.pull() << 8; };\n const set = (a, f) => c.hooks.set(a, f);\n // CINT ($FF5B), as the KERNAL's goes on after the screen: it waits for the raster's line 0\n // ($D012), takes PAL or NTSC from the VIC's raster interrupt flag ($D019, kept at $02A6), sets\n // CIA 1's timer A for it ($4025 or $4295 cycles, a sixtieth of a second) and starts it, with its\n // interrupt on, and lets the serial bus's clock line go. The VIC is read as the KERNAL reads\n // it, so that a machine that counts its reads counts the same.\n { const screen = c.hooks.get(0xff5b);\n c.hooks.set(0xff5b, () => {\n screen(c);\n for (let guard = 0; guard < 1e5 && r(0xd012) !== 0; guard++);\n w(0x2a6, r(0xd019) & 1);\n const timer = r(0x2a6) ? 0x4025 : 0x4295;\n w(0xdc04, timer); w(0xdc05, timer >> 8);\n w(0xdc0d, 0x81); w(0xdc0e, (r(0xdc0e) & 0x80) | 0x11);\n // and the serial bus's clock line let go ($EE8E): CIA 2's port read back, its bit 4 set\n w(0xdd00, r(0xdd00) | 0x10);\n }); }\n // The interrupt's own routine and its ends, which a game's routine jumps on to: the work (the\n // remake's), the CIA's interrupt answered ($DC0D read), and the return\n for (const a of [0xea31, 0xea34, 0xea7b, 0xea7e]) { const f = c.hooks.get(a); set(a, () => { f(c); r(0xdc0d); exit(); return false; }); }\n set(0xea81, () => { exit(); return false; });\n // the way in: A, X and Y kept, and on through $0316 for BRK or $0314 for an interrupt ($FF48)\n set(0xff48, () => { c.push(c.a); c.push(c.x); c.push(c.y); c.pc = vector(r(0x104 + c.sp) & 0x10 ? 0x316 : 0x314); return false; });\n // NMI, the RESTORE key: on through $0318 ($FE43), whose own routine ($FE47) answers CIA 2 and returns\n set(0xfe43, () => { c.i = 1; c.pc = vector(0x318); return false; });\n set(0xfe47, () => { r(0xdd0d); c.p = c.pull(); c.pc = c.pull() | c.pull() << 8; return false; });\n // the cold start ($FCE2), and BASIC ready for a command (`ready`, at $A480)\n set(0xfce2, () => { coldStart(); c.i = 0; c.pc = 0xa480; return false; });\n set(0xa480, () => ready());\n // where BASIC's LOAD comes back to, when the file loaded has not taken the stack: READY again\n set(0xe178, () => {\n // (a program, loaded at BASIC's start, has its variables after it, as a LOAD from the keyboard sets them)\n if (!r(0xb9)) { w(0x2d, r(0xae)); w(0x2e, r(0xaf)); }\n print('\\rREADY.\\r'); c.sp = 0xff; c.pc = 0xa480; return false;\n });\n // RUN ($A871) and BASIC going on to its next statement ($A7AE), where SYS's machine code and\n // GET's GETIN come back to\n set(0xa871, () => { run(); c.pc = 0xa7ae; return false; });\n set(0xa7ae, () => go());\n // CLR as RUN's own start calls it ($A659: the text pointer at the program's start, and CLEARC,\n // the variables and arrays after its end ($2D), the strings down from the top, $37) and LINKPRG\n // ($A533: each line's link set to the next, from TXTTAB, to the line whose link's high byte is\n // 0), as a cruncher calls them at its end, over the program it has unpacked, before $A7AE runs\n // it: the program read afresh each time, so that $A7AE starts it at its first line\n set(0xa659, () => {\n w(0x2f, r(0x2d)); w(0x30, r(0x2e)); w(0x31, r(0x2d)); w(0x32, r(0x2e)); w(0x33, r(0x37)); w(0x34, r(0x38));\n run(); cont = null; return true;\n });\n set(0xa533, () => {\n for (let at = r(0x2b) | r(0x2c) << 8, k = 0; r(at + 1) && k < 0x10000; k++) {\n let end = at + 4; while (r(end)) end++;\n w(at, (end + 1) & 0xff); w(at + 1, (end + 1) >> 8); at = end + 1;\n }\n if (basic) compile();\n return true;\n });\n // BASIC's errors, as its ROM has them: X the error's number, $A437 on through the vector at\n // $0300 (to $E38B, unless a program has moved it), there to $A43A for an error (X under $80) or\n // READY ($A474) for none; and $A43A the message, IN the line (CURLIN, $39), and READY\n set(0xa437, () => { c.pc = r(0x300) | r(0x301) << 8; return false; });\n set(0xe38b, () => { c.pc = c.x & 0x80 ? 0xa474 : 0xa43a; return false; });\n set(0xa43a, () => { printError(fromRom, '?' + ERRORS[c.x - 1] + ' ERROR', r(0x39) | r(0x3a) << 8); c.sp = 0xff; c.pc = 0xa480; return false; });\n // (the KERNAL's routines, CLRCHN and CHROUT, called as the ROM's error routine calls them: a JSR\n // from it, at $A447, through the jump table and the vector a program may have moved, run on the\n // processor until it returns there)\n const jsr = (at, from) => {\n const sp = c.sp, ret = from + 2, pc = c.pc;\n c.push(ret >> 8); c.push(ret & 0xff); c.pc = at;\n for (let k = 0; k < 1e6 && !(c.pc === ret + 1 && c.sp === sp); k++) c.step();\n c.pc = pc;\n };\n const fromRom = { cpu: { get a() { return c.a; }, set a(v) { c.a = v; }, hooks: { get: at => () => jsr(at, 0xa447) } }, write: w };\n set(0xa474, () => { print('\\rREADY.\\r'); c.sp = 0xff; c.pc = 0xa480; return false; });\n // each of these only while its ROM is in; under it, the RAM's own code runs\n // (and a routine that returns from its caller too, `'return'`, has its caller's return address\n // pulled before its own RTS: basic-rom.js's $E206). An error in a routine the machine code has\n // called goes on as the ROM's does, above; in one a statement of the program has called\n // (`inStatement`, go() below), to the statement's own.\n for (const a of [...ours, 0xa437, 0xe38b, 0xa43a, 0xa474, 0xea81, 0xff48, 0xfe43, 0xfe47, 0xfce2, 0xa480, 0xe178, 0xa871, 0xa7ae, 0xa659, 0xa533]) {\n const f = c.hooks.get(a);\n c.hooks.set(a, cpu => {\n if (!banked(cpu.pc)) return false;\n let result;\n try { result = f(cpu); }\n catch (err) {\n const word = err instanceof BasicError && !inStatement && /^\\?(.*) ERROR$/.exec(err.message)?.[1];\n if (!ERRORS.includes(word)) throw err;\n cpu.x = ERRORS.indexOf(word) + 1; cpu.pc = 0xa437; return false;\n }\n if (result === 'return') { cpu.pull(); cpu.pull(); return true; }\n return result;\n });\n }\n\n const chrout = ch => { const { a, x, y } = c; c.a = ch; c.hooks.get(0xf1ca)(c); Object.assign(c, { a, x, y }); };\n const print = s => { for (const ch of s) chrout(ch.charCodeAt(0)); };\n\n // The machine as the KERNAL and BASIC start it: the I/O (the CIAs, CIA 1's timer A the\n // interrupt sixty times a second, the VIC through CINT), the RAM's first pages cleared and\n // the KERNAL's own variables and vectors set, and the screen cleared with the light blue cursor\n function coldStart() {\n c.i = 1; c.sp = 0xff; m.port = 0x37; m.portDir = 0x2f;\n for (let a = 2; a < 0x400; a++) if (a < 0x100 || a >= 0x200) m.ram[a] = 0;\n w(0xdc0d, 0x7f); w(0xdd0d, 0x7f); w(0xdc00, 0x7f); w(0xdc02, 0xff); w(0xdc03, 0x00);\n w(0xdc0e, 0x08); w(0xdc0f, 0x08); w(0xdd0e, 0x08); w(0xdd0f, 0x08); // the timers stopped, one-shot\n w(0xdd00, 0x07); w(0xdd02, 0x3f);\n w(0xdc04, 0x25); w(0xdc05, 0x40); w(0xdc0d, 0x81); w(0xdc0e, 0x11); // timer A: $4025 cycles, its interrupt on, started\n w(0x282, 0x08); w(0x284, 0xa0); w(0x283, 0x00); w(0x281, 0x00); // the memory BASIC has, $0800 to $A000\n w(0x288, 0x04); w(0x286, 0x0e); w(0x289, 0x0a); w(0x28b, 0x04); w(0x28c, 0x0a); w(0x28a, 0x00);\n w(0x28f, 0x48); w(0x290, 0xeb); // the keyboard's decode, the KERNAL's own ($EB48)\n w(0xf5, 0x81); w(0xf6, 0xeb); // its table, the unshifted ($EB81)\n w(0x2a6, 0x01); // PAL\n w(0x9a, 0x03); w(0x99, 0x00); w(0x9d, 0x80); w(0xcc, 0x01); w(0xcd, 0x14);\n // BASIC's pointers, as it starts with no program (NEW): its text at $0801, the variables and\n // arrays after its empty end, the strings down from the top of its memory, $A000\n const word = (at, v) => { w(at, v); w(at + 1, v >> 8); };\n word(0x2b, 0x0801); word(0x2d, 0x0803); word(0x2f, 0x0803); word(0x31, 0x0803); word(0x33, 0xa000); word(0x37, 0xa000);\n // and its two jumps in RAM: its functions' (JMPER, $54, which a program sets the address of,\n // Blitz!'s calls to the floating point), and USR's ($0310, to ILLEGAL QUANTITY until it is set)\n w(0x54, 0x4c); w(0x310, 0x4c); word(0x311, 0xb248);\n // the rest of BASIC's start ($E453, $E3BF): its vectors (the error's, the main loop's, the\n // tokeniser's, the lister's, a statement's and an expression's routines), the conversions'\n // ($03 and $05: a number to a whole one, and back), CHRGET and CHRGOT in RAM (INC $7A; BNE;\n // INC $7B; LDA $EA60; CMP #$3A; BCS; CMP #$20; BEQ $73; SEC; SBC #$30; SEC; SBC #$D0; RTS, and\n // RND's first seed after them), the garbage collector's step, the fill byte, the input device,\n // the temporary strings' stack empty ($16 at $19), and two bytes of the stack\n [0xe38b, 0xa483, 0xa57c, 0xa71a, 0xa7e4, 0xae86].forEach((v, i) => word(0x300 + 2 * i, v));\n word(0x03, 0xb1aa); word(0x05, 0xb391);\n [0xe6, 0x7a, 0xd0, 0x02, 0xe6, 0x7b, 0xad, 0x60, 0xea, 0xc9, 0x3a, 0xb0, 0x0a, 0xc9, 0x20, 0xf0, 0xef, 0x38, 0xe9, 0x30, 0x38, 0xe9, 0xd0, 0x60,\n 0x80, 0x4f, 0xc7, 0x52, 0x58].forEach((v, i) => w(0x73 + i, v));\n w(0x53, 0x03); w(0x68, 0); w(0x13, 0); w(0x18, 0); w(0x1fd, 1); w(0x1fc, 1); w(0x16, 0x19);\n m.ram[0x800] = 0; m.ram[0x801] = 0; m.ram[0x802] = 0;\n VECTORS.forEach((v, i) => { w(0x314 + 2 * i, v); w(0x315 + 2 * i, v >> 8); });\n VIC.forEach((v, i) => w(0xd000 + i, v));\n c.hooks.get(0xff5b)(c); // CINT: the VIC and the screen\n print('\\rREADY.\\r');\n }\n\n // BASIC's main loop ($A480): a line typed read into the buffer at $0200, as INLIN reads it\n // ($A560: CHRIN's characters, the screen editor's line, to RETURN; past 88, STRING TOO LONG;\n // then a RETURN printed), and carried out. An empty line is read again. A line with a number\n // goes into the program in its place (its number as LINGET reads it, the rest tokenized as\n // CRUNCH tokenizes it: basic-lang.js), the variables cleared, and the next line read.\n // Any other runs at once (direct mode, `direct` below), and READY. Two keep their ways:\n // LOAD\"name\",device[,1], with the KERNAL's own messages, the file loaded\n // as the KERNAL's LOAD loads it, and back as BASIC's LOAD comes back, through the stack, which a\n // file loaded over it (Zoopak's) takes to its own start; and RUN, by $A871.\n let typed = [];\n function ready() {\n for (;;) {\n if (c.hooks.get(0xf157)(c) === 'wait') return 'wait'; // (CHRIN's own routine, past its jump-table entry and vector)\n if (c.a === 0x0d) break;\n typed.push(c.a);\n if (typed.length >= 0x59) { typed = []; c.x = 0x17; c.pc = 0xa437; return false; }\n }\n const text = typed; typed = [];\n text.forEach((ch, i) => w(0x200 + i, ch)); w(0x200 + text.length, 0);\n chrout(0x0d);\n let i = 0;\n while (text[i] === 0x20) i++;\n if (i === text.length) return 'wait';\n w(0x3a, 0xff);\n // a line for the program: its number ($A96B, LINGET: digits, spaces passed over, past 63999\n // a SYNTAX ERROR), its text tokenized, put in its place, and the variables cleared\n if (text[i] >= 0x30 && text[i] <= 0x39) {\n let n = 0;\n for (; i < text.length && (text[i] === 0x20 || text[i] >= 0x30 && text[i] <= 0x39); i++) {\n if (text[i] === 0x20) continue;\n if (n >= 6400) { c.x = 0x0b; c.pc = 0xa437; return false; }\n n = n * 10 + text[i] - 0x30;\n }\n const end = store(m.ram, r(0x2b) | r(0x2c) << 8, n, crunch(text.slice(i)));\n for (const at of [0x2d, 0x2f, 0x31]) { w(at, end); w(at + 1, end >> 8); }\n w(0x33, r(0x37)); w(0x34, r(0x38));\n basic?.clr(); cont = null;\n return 'wait';\n }\n const command = String.fromCharCode(...text.slice(i)).trim();\n if (command === 'RUN') { c.pc = 0xa871; return false; }\n const load = /^LOAD\"([^\"]*)\"(?:,(\\d+))?(?:,(\\d+))?$/.exec(command);\n if (load) {\n const [, name, device = '1', secondary = '0'] = load;\n for (let i = 0; i < name.length; i++) w(0x200 + i, name.charCodeAt(i));\n w(0xb7, name.length); w(0xbb, 0x00); w(0xbc, 0x02); w(0xba, +device); w(0xb9, +secondary); w(0xb8, 1);\n // (the KERNAL's messages, each its return first: \\rSEARCHING FOR name, \\rLOADING)\n print('\\rSEARCHING FOR ' + name);\n c.a = 0; c.x = 0x01; c.y = 0x08; // (where a file with secondary address 0 goes: $0801)\n // the stack as BASIC's LOAD has it, its return to BASIC ($E178) at $01F8, then the load\n c.sp = 0xf7; w(0x1f8, 0x77); w(0x1f9, 0xe1);\n m.load();\n if (c.c) { print('\\r?FILE NOT FOUND ERROR'); c.sp = 0xff; print('\\rREADY.\\r'); return 'wait'; }\n // (LOADING once the file is found; the registers LOAD leaves, its end, kept for BASIC)\n const { a, x, y } = c; print('\\rLOADING'); Object.assign(c, { a, x, y, c: 0 });\n return true; // as the KERNAL's LOAD returns: RTS, to wherever $01F8 now says\n }\n // direct mode: the line tokenized in the buffer, as CRUNCH leaves it, and run after the\n // program's statements\n crunch(text.slice(i)).forEach((b, k) => w(0x200 + k, b));\n return runDirect();\n }\n\n // A program run (RUN): the BASIC program in memory, at TXTTAB ($2B), read (basic-lang.js)\n // and compiled (basic-compile.js) as the remake's are, and its statements carried out\n // by the remake's BASIC (basic.js), on `engine`, this machine as that BASIC asks for one:\n // its memory, the registers it calls the KERNAL with, and the KERNAL's routines by name,\n // answered here. GET and SYS go through the processor, as BASIC's own do: GET calls GETIN at\n // $FFE4, SYS jumps to the machine code; both come back to $A7AE,\n // and the program goes on. LOAD from a program loads, and runs the program again from its start,\n // its variables kept, or the program it has loaded (GAME, over the boot). An error is BASIC's\n // message (basic-rom.js) and READY.\n let program = null, basic = null, statements = [], getting = null, inStatement = false;\n // each step's line, for CURLIN ($39) as it runs and an error's IN (direct mode's $FFFF: none),\n // and where CONT goes on, the step after a STOP or END, until the program is changed\n let lineOf = [], cont = null, waiting = null, paced = -1, budget = 0;\n const DIRECT = 0x10000; // the label the direct statements start at\n const YIELD = Symbol('the processor goes on');\n const routine = at => e => { Object.assign(c, { a: e.a, x: e.x, y: e.y }); c.hooks.get(at)(c); Object.assign(e, { a: c.a, x: c.x, y: c.y, c: c.c, z: c.z, n: c.n, v: c.v }); };\n const engine = {\n get mem() { return m.ram; }, read: r, write: w,\n a: 0, x: 0, y: 0, c: 0, z: 0, n: 0, v: 0, pc: 0, ended: false, idle: 0, polled: false, inside: 0, keys: [], delay: 0, cycles: 0,\n title: { seed: 0x11 },\n routines: {\n chrout: routine(0xf1ca), chrin: routine(0xf157), getin: routine(0xf13e), clrchn: routine(0xf333), chkin: routine(0xf20e), chkout: routine(0xf250),\n open: routine(0xf34a), close: routine(0xf291), setnam: routine(0xffbd), settim: routine(0xffdb), setlfs: routine(0xffba),\n load: e => { Object.assign(c, { a: e.a, x: e.x, y: e.y }); m.load(); Object.assign(e, { a: c.a, x: c.x, y: c.y, c: c.c }); },\n // SYS: BASIC's text pointer at the text after it, its address at $14 as GETADR leaves it,\n // and on through SYS's own ($E130, basic-rom.js), which keeps the registers, back to $A7AE\n sys: (e, at, text) => {\n w(0x7a, text); w(0x7b, text >> 8); w(0x14, at); w(0x15, at >> 8);\n c.push((0xa7ae - 1) >> 8); c.push((0xa7ae - 1) & 0xff); c.pc = 0xe130;\n return YIELD;\n },\n // LOAD in a program\n 'basic-load': (e, [name, device = 1, sa = 0]) => {\n for (let k = 0; k < name.length; k++) w(0x200 + k, name.charCodeAt(k));\n w(0xb7, name.length); w(0xbb, 0x00); w(0xbc, 0x02); w(0xba, device); w(0xb9, sa); w(0xb8, 0);\n Object.assign(e, { a: 0, x: 0x01, y: 0x08 });\n e.routines.load(e);\n if (e.c) throw new BasicError('?FILE NOT FOUND ERROR');\n if (!sa) compile(); else e.pc = 0;\n },\n },\n };\n function compile(all = lines(m.ram, r(0x2b) | r(0x2c) << 8)) {\n program = instantiate(all, { name: 'program', source: 'BASIC\\'s text in memory', mem: m.ram, cost: 0, render: () => '' });\n lineOf = []; let line = 0xffff, start = 0;\n for (const s of all) { if (s.label !== undefined) { line = s.line ?? 0xffff; if (s.label === DIRECT) start = lineOf.length; } else lineOf.push(line); }\n statements = all.filter(s => s.label === undefined);\n if (basic) basic.items = dataItems(m.ram, r(0x2b) | r(0x2c) << 8); // (DATA, as READ reads it)\n engine.pc = 0; engine.ended = false;\n return start;\n }\n function run() { basic = new Basic(engine, { quiet: true }); engine.basic = basic; compile(); }\n // INPUT from the keyboard (Microsoft's INPUT, QINLIN and INLOOP): not in direct mode; the\n // prompt and \"? \", a line read as the main loop reads one (CHRIN, the screen editor's), and\n // its items taken in turn: a string quoted to its closing quote, or to a comma or a colon; a\n // number as FIN reads it, which a comma, a colon or the line's end must follow, or\n // \"?REDO FROM START\" and the INPUT again; a line run out before the variables, \"?? \" and\n // another; items left, \"?EXTRA IGNORED\"; an empty line, the program ended, as END ends it.\n // While a line is read, the run waits here (`inputting`).\n let inputting = null;\n function input(st, k) {\n if (lineOf[k] === 0xffff) throw new BasicError('?ILLEGAL DIRECT ERROR');\n if (!inputting) {\n inputting = { k, n: 0, text: null, at: 0, typed: [] };\n if (st.prompt !== null) for (const ch of st.prompt) chrout(ch.charCodeAt(0));\n print('? ');\n }\n const s = inputting;\n for (;;) {\n if (s.text === null) {\n // a line, to RETURN\n for (;;) {\n if (c.hooks.get(0xf157)(c) === 'wait') { engine.pc = k; c.pc = 0xa7ae; return 'wait'; }\n if (c.a === 0x0d) break;\n s.typed.push(c.a);\n if (s.typed.length >= 0x59) { inputting = null; throw new BasicError('?STRING TOO LONG ERROR'); }\n }\n chrout(0x0d);\n s.text = s.typed; s.typed = []; s.at = 0; s.fresh = true;\n if (!s.text.length && s.n === 0) { inputting = null; engine.ended = true; engine.pc = k + 1; return undefined; }\n }\n const t = s.text, skip = () => { while (t[s.at] === 0x20) s.at++; };\n if (s.n === st.targets.length) {\n if (s.at < t.length) print('?EXTRA IGNORED\\r');\n inputting = null; engine.pc = k + 1; return undefined;\n }\n // this variable's item, or the line run out: another\n // (a line just read is read from, empty or not: an empty one gives 0, or \"\")\n if (s.n > 0 && !s.fresh && (s.at >= t.length || t[s.at] === 0x3a)) { print('?? '); s.text = null; continue; }\n if (!s.fresh && t[s.at] === 0x2c) s.at++; // past the comma (a new line's first comma is an empty item)\n s.fresh = false;\n skip();\n const target = st.targets[s.n], string = target.n.endsWith('$');\n let value;\n if (string) {\n let v = '';\n if (t[s.at] === 0x22) { s.at++; while (s.at < t.length && t[s.at] !== 0x22) v += String.fromCharCode(t[s.at++]); if (t[s.at] === 0x22) s.at++; skip(); }\n else while (s.at < t.length && t[s.at] !== 0x2c && t[s.at] !== 0x3a) v += String.fromCharCode(t[s.at++]);\n value = v;\n } else {\n const n = scanNumber(String.fromCharCode(...t), s.at);\n s.at = n.end; value = val(n.text);\n }\n if (s.at < t.length && t[s.at] !== 0x2c && t[s.at] !== 0x3a) { print('?REDO FROM START\\r'); inputting = null; return input(st, k); }\n if (target.k === 'elem') basic.setElem(target.n, target.i.map(e => evaluator(e)(basic)), value); else basic.set(target.n, value);\n s.n++;\n }\n }\n function breakIn(line) { print('\\rBREAK'); if (line !== undefined && line >> 8 !== 0xff) print(' IN ' + line); }\n // A line run at once (direct mode): its statements after the program's (basic-lang.js\n // `direct`), on the variables the program left, or a BASIC of its own the first time; READY at\n // its end, as at the program's\n function runDirect() {\n if (!basic) { basic = new Basic(engine, { quiet: true }); engine.basic = basic; }\n const all = direct(m.ram, r(0x2b) | r(0x2c) << 8, 0x200);\n all[all.findIndex(s => s.label === 'direct')].label = DIRECT;\n engine.pc = compile(all);\n c.pc = 0xa7ae; return false;\n }\n // LIST ($A69C): from the first line at the first number or after, each a RETURN, then (past\n // the last number, the RETURN printed first, as the ROM prints it, and no more) its number, a\n // space and its text as LIST gives it (basic-lang.js `list`); NEW ($A642): no program, and\n // the variables cleared\n engine.routines['basic-list'] = (e, [from, to]) => {\n for (const l of programLines(m.ram, r(0x2b) | r(0x2c) << 8)) {\n if (l.n < from) continue;\n chrout(0x0d);\n if (l.n > to) break;\n print(l.n + ' '); list(l.bytes).forEach(ch => chrout(ch));\n }\n };\n engine.routines['basic-new'] = e => {\n const at = r(0x2b) | r(0x2c) << 8; w(at, 0); w(at + 1, 0);\n for (const v of [0x2d, 0x2f, 0x31]) { w(v, at + 2); w(v + 1, (at + 2) >> 8); }\n w(0x33, r(0x37)); w(0x34, r(0x38));\n basic?.clr(); cont = null; e.ended = true;\n };\n // SAVE ($E156) and VERIFY ($E165): the program, TXTTAB to VARTAB, to the drive's file, or held\n // to it; in direct mode the KERNAL's messages (SAVING, SEARCHING FOR, VERIFYING), and after a\n // VERIFY, BASIC's OK, or ?VERIFY ERROR where a byte differs. Device 8 only: the tape is not\n // moonbase's.\n const file = (name, device) => {\n if (device !== 8) { if (device === 1) throw new Error('the tape is not handled'); throw new BasicError('?DEVICE NOT PRESENT ERROR'); }\n if (!name.length) throw new BasicError('?MISSING FILE NAME ERROR');\n return Uint8Array.from(name, ch => ch.charCodeAt(0));\n };\n const directMode = () => r(0x3a) === 0xff;\n engine.routines['basic-save'] = (e, [name = '', device = 1]) => {\n const n = file(name, device), from = r(0x2b) | r(0x2c) << 8, to = r(0x2d) | r(0x2e) << 8;\n if (directMode()) print('\\rSAVING ' + name);\n const body = new Uint8Array(to - from + 2); body[0] = from & 0xff; body[1] = from >> 8;\n for (let a = from; a < to; a++) body[a - from + 2] = r(a);\n m.drive.save(n, body);\n };\n engine.routines['basic-verify'] = (e, [name = '', device = 1, sa = 0]) => {\n const n = file(name, device);\n if (directMode()) print('\\rSEARCHING FOR ' + name);\n const raw = m.drive.load(n);\n if (!raw || raw.length < 2) throw new BasicError('?FILE NOT FOUND ERROR');\n if (directMode()) print('\\rVERIFYING');\n const at = sa ? raw[0] | raw[1] << 8 : r(0x2b) | r(0x2c) << 8;\n for (let k = 2; k < raw.length; k++) if (r(at + k - 2) !== raw[k]) throw new BasicError('?VERIFY ERROR');\n print('\\rOK\\r');\n };\n engine.routines['basic-cont'] = e => { if (cont === null) throw new BasicError('?CAN\\'T CONTINUE ERROR'); e.pc = cont; };\n function go() {\n if (getting) {\n const { k, t } = getting; getting = null;\n const ch = c.a, s = ch ? String.fromCharCode(ch) : '';\n basic.set(t.n, t.n.endsWith('$') ? s : (ch ? Number(s) || 0 : 0));\n engine.pc = k + 1;\n }\n for (let i = 0; i < 100000; i++) {\n // (so many statements a frame where the page asks, m.basicPace, as a C64's BASIC takes its\n // time: a wait on the clock, or a FOR counted out for a pause, as long as on the machine)\n if (m.basicPace) { if (m.frame !== paced) { paced = m.frame; budget = m.basicPace; } if (budget-- <= 0) return 'wait'; }\n const k = engine.pc;\n if (engine.ended || k >= program.steps.length) {\n // (an END or STOP in the program leaves CONT the step after it)\n if (engine.ended && /^(end|stop)$/.test(statements[k - 1]?.k) && lineOf[k - 1] !== 0xffff) cont = k;\n // (STOP: BREAK, and IN its line in a program, as BASIC's error path prints it, $A469)\n if (engine.ended && statements[k - 1]?.k === 'stop') breakIn(lineOf[k - 1]);\n print('\\rREADY.\\r'); c.sp = 0xff; c.pc = 0xa480; return false;\n }\n const st = statements[k];\n if (lineOf[k] !== undefined) { w(0x39, lineOf[k]); w(0x3a, lineOf[k] >> 8); }\n // GET: GETIN through the processor, from BASIC's ROM\n // the RUN/STOP key, as BASIC's ISCNTC looks before each statement: BREAK IN the line\n if (r(0x91) === 0x7f && waiting !== k) { w(0xc6, 0); cont = k; breakIn(lineOf[k]); print('\\rREADY.\\r'); c.sp = 0xff; c.pc = 0xa480; return false; }\n waiting = null;\n if (st.k === 'input-keys') { const r1 = input(st, k); if (r1 !== undefined) return r1; continue; }\n if (st.k === 'get') { w(0x13, 0); getting = { k, t: st.t }; c.push((0xa7ae - 1) >> 8); c.push((0xa7ae - 1) & 0xff); c.pc = 0xffe4; return false; }\n engine.pc = k + 1;\n let result;\n try { inStatement = true; result = program.run[k](engine, program.steps); }\n catch (err) {\n if (!(err instanceof BasicError) || !printError(fromRom, err.message, err.basicLine ?? lineOf[k] ?? basic.at)) throw err;\n c.sp = 0xff; c.pc = 0xa480; return false;\n }\n finally { inStatement = false; }\n if (result === YIELD) return false;\n // WAIT, its bits not come: again on the next frame, as the ROM's loop ($B82D) goes on round,\n // RUN/STOP not looked at\n if (st.k === 'wait' && engine.pc === k) { waiting = k; c.pc = 0xa7ae; return 'wait'; }\n }\n return 'wait';\n }\n}\n\n", "import { chargen as m } from '@moonbase-machines/charset';\nexport const { chargen } = m;", "// A Commodore 64's frame painted from memory and the chips' registers, by the VIC-II as the\n// emulator draws it (vic.js), for a remake: its memory, its I/O page's bytes ($D000 to\n// $DFFF as the remake keeps them: the VIC's registers, the colours, CIA 2's bank) and the\n// character ROM, which a text screen in the ROM's own characters needs. And `splits`, where a\n// game's raster interrupt changes the VIC's registers partway down (Find Me's two character\n// sets): each line's interrupt's writes, from the line after, and the last's from the top.\nimport { VIC } from './vic.js';\n\nexport function paint(mem, chip, chargen, vic, splits) {\n const m = { ram: mem, chargen: chargen ?? new Uint8Array(0x1000), color: chip.subarray(0x800, 0xc00), cia2: { pra: chip[0xd00] }, line: 0 };\n vic ??= new VIC(m);\n vic.m = m;\n vic.r.set(chip.subarray(0, 0x40));\n const at = splits?.size ? [...splits].sort((a, b) => a[0] - b[0]) : [];\n // (a split's $100 is CIA 2's first port, the VIC's bank)\n const set = (r, v) => { if (r === 0x100) m.cia2.pra = v; else vic.r[r] = v; };\n if (at.length) for (const [r, v] of at.at(-1)[1]) set(r, v);\n for (let y = 0, k = 0; y < 312; y++) {\n while (k < at.length && at[k][0] < y) { for (const [r, v] of at[k][1]) set(r, v); k++; }\n m.line = y; vic.line(y);\n }\n return vic.frame;\n}\n", "// A picture of what the VIC-II shows, for a tool: a 64's memory and the chips' registers painted as the VIC-II\n// paints them (paint.js, vic.js), a part of the screen cropped and its colours the 64's own (PALETTE), as rows of\n// [r, g, b] (for @moonbase-machines/files/png.js: png, sheet). The screen's dots: a hi-res dot one pixel, a\n// multicolour dot two wide, as the VIC-II makes them; `scale` repeats each pixel across and down.\n//\n// rows({ mem, chip, chargen, crop: [x, y, width, height], scale })\n// mem the 64K the VIC-II reads (in the bank CIA 2's port gives, chip[0xd00])\n// chip the I/O page from $D000, 4K: the VIC-II's registers at 0 to $3F, colour memory at $800, CIA 2's\n// port A at $D00 (registers.chip() makes one from names)\n// chargen the character ROM, where text in the ROM's own characters is shown; none, zeros\n// crop a part of the 320 by 200 screen, from its top left; the whole of it unless given\n// chip({ registers, color, bank }) an I/O page: registers as { 0x11: 0x1b, ... }, colour memory's bytes from\n// $D800, and the VIC-II's bank ($0000, $4000, $8000 or $C000)\nimport { paint } from './paint.js';\nimport { PALETTE, LEFT, TOP, WIDTH } from './vic.js';\n\nexport function chip({ registers = {}, color = [], bank = 0 } = {}) {\n const page = new Uint8Array(0x1000);\n for (const [r, v] of Object.entries(registers)) page[+r] = v;\n page.set(color.slice(0, 0x400), 0x800);\n page[0xd00] = 3 - (bank >> 14); // (CIA 2's port A, its two low bits the bank turned over)\n return page;\n}\n\nexport function rows({ mem, chip: io, chargen, crop = [0, 0, 320, 200], scale = 1 }) {\n const frame = paint(mem, io, chargen), [cx, cy, w, h] = crop, out = [];\n for (let y = 0; y < h; y++) {\n const row = [];\n for (let x = 0; x < w; x++) { const c = PALETTE[frame[(TOP + cy + y) * WIDTH + LEFT + cx + x]]; for (let s = 0; s < scale; s++) row.push(c); }\n for (let s = 0; s < scale; s++) out.push(row);\n }\n return out;\n}\n", "// What a Commodore 64 game SAVEs to its disk, kept on the player's disk (`disk`, opened before the machine\n// starts: { list(), read(name), write(name, bytes) }), each file by its name as the 1541 has it, its raw\n// bytes, the load address first: put back in the drive (drive.js `saved`, which shadows the disk's own\n// files) when the game starts again, and each file saved written there as it is saved.\n//\n// keepDrive(drive, disk)\nexport function keepDrive(drive, disk) {\n for (const f of disk.list()) drive.saved.set(f.name, disk.read(f.name));\n drive.keep = (name, raw) => disk.write(name, raw);\n}\n", "// The SID, as far as a square-wave era of school software used it: three voices, each an\n// oscillator at a 16-bit frequency with a triangle, sawtooth, pulse or noise wave, gated by an\n// attack, decay, sustain and release envelope, mixed under the master volume. Ring modulation,\n// sync and the filter are not here. The machine keeps each register write with its cycle, and\n// `render` turns a frame's writes into samples at the sound card's rate.\nconst CLOCK = 985248;\nconst ATTACK = [2, 8, 16, 24, 38, 56, 68, 80, 100, 250, 500, 800, 1000, 3000, 5000, 8000]; // ms\nconst DECAY = [6, 24, 48, 72, 114, 168, 204, 240, 300, 750, 1500, 2400, 3000, 9000, 15000, 24000];\n\nexport class SID {\n constructor(rate) {\n this.rate = rate; this.r = new Uint8Array(0x20);\n this.v = [0, 1, 2].map(() => ({ phase: 0, env: 0, stage: 'off', noise: 0x7ffff8, noiseOut: 0 }));\n }\n write(reg, val) {\n const prev = this.r[reg]; this.r[reg] = val;\n if (reg % 7 === 4 && reg < 21) { const v = this.v[(reg / 7) | 0]; if ((val & 1) && !(prev & 1)) v.stage = 'attack'; else if (!(val & 1) && (prev & 1)) v.stage = 'release'; }\n }\n // `n` samples, with the writes in `events` as [sampleIndex, reg, val] applied in order\n render(n, events) {\n const out = new Float32Array(n);\n let e = 0;\n for (let i = 0; i < n; i++) {\n while (e < events.length && events[e][0] <= i) { this.write(events[e][1], events[e][2]); e++; }\n let mix = 0;\n for (let k = 0; k < 3; k++) {\n const b = k * 7, v = this.v[k], r = this.r;\n const freq = r[b] | r[b + 1] << 8, ctrl = r[b + 4];\n // the envelope, in levels of 0 to 1 per sample\n const a = ATTACK[r[b + 5] >> 4] / 1000 * this.rate, d = DECAY[r[b + 5] & 15] / 1000 * this.rate, sus = (r[b + 6] >> 4) / 15, rel = DECAY[r[b + 6] & 15] / 1000 * this.rate;\n if (v.stage === 'attack') { v.env += 1 / Math.max(1, a); if (v.env >= 1) { v.env = 1; v.stage = 'decay'; } }\n else if (v.stage === 'decay') { v.env -= (1 - sus) / Math.max(1, d) * 3; if (v.env <= sus) { v.env = sus; v.stage = 'sustain'; } }\n else if (v.stage === 'release') { v.env -= 1 / Math.max(1, rel) * 3; if (v.env <= 0) { v.env = 0; v.stage = 'off'; } }\n if (v.env <= 0 && v.stage !== 'attack') continue;\n // the oscillator: a 24-bit accumulator, as the chip's, stepped by the frequency\n const step = freq * CLOCK / 16777216 / this.rate; // cycles of the wave per sample\n const before = v.phase; v.phase = (v.phase + step) % 1;\n let wave = 0;\n if (ctrl & 0x10) wave += v.phase < 0.5 ? v.phase * 4 - 1 : 3 - v.phase * 4; // triangle\n if (ctrl & 0x20) wave += v.phase * 2 - 1; // sawtooth\n if (ctrl & 0x40) { const pw = (r[b + 2] | (r[b + 3] & 15) << 8) / 4096; wave += v.phase < pw ? 1 : -1; } // pulse\n if (ctrl & 0x80) { if (v.phase < before) { const bit = ((v.noise >> 22) ^ (v.noise >> 17)) & 1; v.noise = ((v.noise << 1) | bit) & 0x7fffff; v.noiseOut = (((v.noise >> 22) & 1) << 7 | ((v.noise >> 20) & 1) << 6 | ((v.noise >> 16) & 1) << 5 | ((v.noise >> 13) & 1) << 4 | ((v.noise >> 11) & 1) << 3 | ((v.noise >> 7) & 1) << 2 | ((v.noise >> 4) & 1) << 1 | ((v.noise >> 2) & 1)) / 128 - 1; } wave += v.noiseOut; }\n mix += wave * v.env;\n }\n out[i] = mix * (this.r[0x18] & 15) / 15 * 0.2;\n }\n return out;\n }\n}\n", "// How a C64 game starts, in a page and in tests that start every game as the page does: which\n// ROMs it runs on, a player page's ?roms=<choice> (/play/<slug>/original/, in the preview),\n// (none), moonbase moonbase's, characters and all (rom.js): the default, as moonbase.au\n// has it\n// commodore Commodore's, where this machine has them: a flag, off unless asked for,\n// kept as everyone else keeps them, to compare\n// moonbase-petscii moonbase's, with Commodore's character ROM, where this machine has it\n//\n// await c64Roms(choice, slug, load) the roms for new C64(game, roms), or null where Commodore's\n// are asked for and cannot be had; load(name) gives a ROM's\n// bytes (<name>.bin), or throws where it is not there\n// typed(m, game) what is typed once BASIC is ready: LOAD\"<start>\",8,1,\n// and RUN for a BASIC program, one loaded at $0801 (ZOOPAK\n// loads over the stack and starts itself, and a RUN typed\n// after it would reach its menu as a stray RETURN)\nimport { standIn } from './rom.js';\n\nexport const ROM_CHOICES = [null, 'commodore', 'moonbase-petscii'];\n\nexport async function c64Roms(choice, slug, load) {\n if (choice !== 'commodore' && choice !== 'moonbase-petscii') return standIn();\n try {\n if (choice === 'moonbase-petscii') return { ...standIn(), chargen: await load('chargen') };\n return { kernal: await load('kernal'), basic: await load('basic'), chargen: await load('chargen') };\n } catch {\n return null;\n }\n}\n\nexport function typed(m, game) {\n const raw = m.drive.find(Uint8Array.from(game.start, c => c.charCodeAt(0)))?.raw;\n return 'LOAD\"' + game.start + '\",8,1\\r' + (raw && (raw[0] | raw[1] << 8) === 0x801 ? 'RUN\\r' : '');\n}\n"],
|
|
5
|
-
"mappings": "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AY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UACpF,UAAY,UAAY,UAAY,UAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,SAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,SAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WACpF,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,UAAY,SAAY,WAAY,WACpF,UAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,UAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UAAY,WACpF,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,UACpF,UAAY,SAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,UAAY,WAAY,UAAY,SAAY,WACpF,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,UAAY,UAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,UAAY,UAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,UAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,WAAY,UAAY,UAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WACpF,WAAY,WAAY,UAAY,UAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,SAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,SAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UACpF,UAAY,UAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,UAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UAAY,WACpF,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,UACpF,UAAY,SAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,QAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,UAAY,WAAY,UAAY,SAAY,WACpF,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY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",
|
|
6
|
-
"names": ["basic_compile_exports", "__export", "compile", "evaluator", "instantiate", "basic_lang_exports", "__export", "TOKENS", "crunch", "dataItems", "direct", "expression", "lines", "list", "program", "store", "numbers_exports", "__export", "BasicError", "ERRORS", "fail", "fout", "int16", "nextRandom", "scanNumber", "seedRandom", "val", "float_exports", "__export", "ARG", "ARGOV", "ARISGN", "BITS", "CONSTANTS", "FAC", "FACOV", "FloatError", "Floats", "RESHO", "pack", "setFac", "unpack", "words", "ns", "n", "a", "ex", "f", "m", "memory", "x", "b", "v", "at", "e", "i", "ov", "c", "overflow", "b1", "s", "memMore", "more", "y", "neg", "k", "fac", "mb", "fb", "borrow", "d", "ey", "minus", "low", "lowByte", "sum", "diff", "signed", "top", "keep", "md", "r", "last", "bits", "bit", "p", "carry", "q", "by", "e2", "sign", "from", "tooBig", "z", "odd", "buf", "step", "ch", "hi", "t", "BasicError", "ERRORS", "fail", "what", "page", "floats", "Floats", "a", "v", "at", "bytes", "CONSTANTS", "fout", "b", "pack", "s", "val", "m", "n", "scanNumber", "k", "text", "sp", "digits", "int16", "seedRandom", "seed", "nextRandom", "syntax", "detail", "BasicError", "TOKENS", "T", "t", "k", "FUNCTIONS", "BINARY", "reader", "mem", "at", "r", "b", "letter", "digit", "name", "n", "c", "primary", "m", "from", "s", "take", "e", "expr", "a", "args", "i", "min", "op", "dataItems", "items", "l", "program", "q", "REM_TOKEN", "DATA_TOKEN", "text", "quoted", "direct", "out", "lines", "numbers", "statement", "expression", "order", "line", "next", "one", "err", "word", "say", "x", "target", "v", "printItems", "b2", "number", "fail", "p", "prompt", "targets", "go", "to", "step", "RESLST", "PRINT_TOKEN", "crunch", "buf", "dores", "stuff", "copy", "end", "ch", "y", "count", "found", "d", "list", "bytes", "quote", "txttab", "store", "hex", "v", "w", "q", "s", "here", "js", "a", "c", "store", "t", "isString", "compile", "statements", "name", "source", "mem", "cost", "render", "labels", "steps", "step", "to", "k", "params", "body", "go", "at", "x", "expression", "out", "end", "place", "b", "instantiate", "options", "text", "evaluator", "basic_list_exports", "__export", "listing", "petscii_exports", "__export", "CONTROLS", "bytes", "text", "NAMES", "n", "b", "t", "lower", "out", "k", "c", "end", "name", "v", "listing", "bytes", "lower", "lines", "at", "number", "end", "text", "list", "basic_rom_exports", "__export", "evaluateInMemory", "install", "printError", "basic_exports", "__export", "Basic", "Basic", "e", "data", "quiet", "at", "n", "x", "fail", "int16", "back", "m", "sizes", "dims", "s", "size", "a", "b", "i", "k", "d", "o", "c", "val", "fout", "from", "nextRandom", "seedRandom", "t", "v", "text", "step", "string", "item", "err", "BasicError", "p", "f", "was", "arg", "what", "args", "into", "to", "next", "ch", "name", "la", "fa", "sa", "mask", "xor", "first", "end", "scanNumber", "hex4", "n", "FAC_EXP", "FUNCTIONS", "install", "cpu", "read", "write", "evaluate", "chrout", "c", "txt", "setTxt", "a", "syntax", "BasicError", "chrgot", "v", "chkcom", "last", "frm", "number", "at", "value", "end", "place", "setFac", "whole", "lo", "hi", "getbyt", "out", "ch", "H", "x", "k", "t", "carry", "y", "flag", "below", "top", "compare", "kept", "base", "size", "index", "product", "start", "length", "f", "Floats", "call", "from", "r", "arith", "g", "err", "FloatError", "ERRORS", "ay", "nz", "floating", "run", "regs", "A", "randomState", "nextRandom", "seedRandom", "next", "digit", "power", "e", "clock", "freed", "len", "to", "character", "digits", "cy", "sum", "sign", "r16", "w16", "quote", "candidate", "above", "bltuc", "copy", "first", "bottom", "printError", "message", "line", "what", "text", "s", "evaluateInMemory", "ram", "made", "variable", "kind", "name", "c1", "c2", "p", "unpack", "b", "Basic", "expression", "fn", "evaluator", "browser_exports", "__export", "keyboard", "pace", "painter", "keys_exports", "__export", "CURSOR", "JOYSTICK", "MATRIX", "MODIFIERS", "SHIFTED", "vic_exports", "__export", "HEIGHT", "LEFT", "PALETTE", "TOP", "VIC", "WIDTH", "FIRST_LINE", "LAST_LINE", "m", "r", "v", "line", "target", "a", "b", "full", "y", "py", "out", "row", "border", "bg", "den", "rsel", "csel", "top", "bottom", "left", "right", "prio", "x", "yscroll", "xscroll", "bitmap", "ecm", "mcm", "screenBase", "charBase", "bitmapBase", "sy", "cy", "ly", "cx", "cell", "code", "color", "bits", "colors", "multi", "x0", "pair", "c", "set", "borderOnly", "enabled", "drawn", "s", "sx", "yx", "xx", "height", "ry", "pointer", "data", "behind", "px0", "byte", "k", "base", "d", "PAD_DEAD", "keyboard", "m", "ignore", "onKey", "log", "upper", "down", "held", "pressed", "withCbm", "frame", "release", "key", "shift", "since", "e", "MODIFIERS", "JOYSTICK", "cur", "CURSOR", "letter", "shifted", "SHIFTED", "MATRIX", "cc", "cr", "cbm", "letGo", "padBits", "padStop", "readPads", "bits", "stop", "p", "b", "i", "x", "y", "column", "row", "frames", "painter", "canvas", "ctx", "WIDTH", "HEIGHT", "rgba", "image", "r", "g", "PALETTE", "dy", "o", "dx", "pace", "after", "each", "started", "tick", "due", "d64_exports", "__export", "SECTORS", "add", "make", "petsciiName", "read", "TYPES", "offset", "t", "s", "a", "b", "name16", "text", "out", "c", "i", "name", "id", "files", "image", "used", "n", "take", "ORDER", "free", "start", "k", "entries", "f", "data", "chunks", "places", "at", "part", "dirSectors", "e", "p", "bam", "map", "u", "isFree", "mark", "was", "d", "last", "list", "lastSector", "NAMES", "bytes", "sector", "chain", "parts", "type", "body", "file", "drive_exports", "__export", "Drive", "SECTORS", "TYPES", "OK", "NOT_FOUND", "SYNTAX", "bytes", "s", "c", "upper", "b", "Drive", "_Drive", "image", "n", "a", "parts", "out", "p", "at", "bam", "files", "t", "i", "e", "f", "pattern", "name", "k", "raw", "add", "data", "sector", "line", "text", "blocks", "end", "pad", "free", "device", "sa", "ch", "kind", "byte", "eoi", "cur", "cmd", "code", "m", "editor_exports", "__export", "editor", "COLOURS", "r", "w", "keyRow", "W", "a", "v", "low", "x", "linePointer", "colourPointer", "pnt", "user", "clearLine", "y", "setLine", "max", "clear", "home", "scroll", "kept", "moveLine", "k", "from", "entry", "src", "srcColour", "openLine", "grow", "nextLine", "carriageReturn", "rowEndForward", "end", "rowStartBack", "start", "put", "code", "colour", "advance", "row", "show", "done", "backLine", "chrout", "ch", "shifted", "begin", "take", "i", "input", "n", "s", "glyph_hash_exports", "__export", "glyphHash", "rows", "h", "i", "glyph_hashes_exports", "__export", "GLYPH_HASHES", "kernal_exports", "__export", "KEY_TABLES", "VECTORS", "VIC", "install", "kernalByte", "matrixOf", "screenCode", "VIC", "VECTORS", "screenCode", "p", "UNSHIFTED", "SHIFTED", "COMMODORE", "CTRL", "DECODE", "TABLES", "KEY_TABLES", "kernalByte", "at", "code", "v", "matrixOf", "shifted", "install", "c", "read", "write", "drive", "loaded", "call", "held", "log", "z", "a", "zw", "ed", "editor", "column", "chrout", "ch", "clear", "typing", "status", "files", "entry", "la", "k", "open", "fa", "sa", "i", "close", "there", "channel", "output", "clrchn", "hooks", "r", "n", "from", "name", "_", "raw", "body", "end", "to", "t", "VIC", "VECTORS", "decode", "own", "shift", "table", "switchSets", "key", "put", "mode", "scnkey", "h", "y", "colour", "was", "x", "mant", "exp", "sign", "text", "f", "machine_exports", "__export", "C64", "m", "CPU", "CYCLES", "printer_exports", "__export", "Printer", "WIDTH", "bus", "paper", "WIDTH", "Printer", "on", "device", "sa", "b", "bus", "drive", "printer", "all", "d", "x", "name", "raw", "paper", "canvas", "chargen", "scale", "cell", "line", "rows", "g", "w", "r", "y", "lines", "dot", "chars", "c", "sc", "screenCode", "base", "wide", "py", "bits", "px", "rom_exports", "__export", "STANDS_IN", "install", "standIn", "m", "chargen", "STANDS_IN", "BYTES", "image", "from", "bytes", "known", "a", "v", "kernalByte", "at", "CONSTANTS", "standIn", "chargen", "SHIFTS", "held", "m", "code", "shift", "column", "row", "k", "install", "c", "r", "w", "banked", "pc", "vector", "call", "back", "sp", "guard", "before", "n", "i", "VECTORED", "entry", "via", "own", "e", "p", "program", "inMemory", "end", "f", "place", "basic", "evaluateInMemory", "ours", "exit", "set", "screen", "timer", "coldStart", "ready", "print", "run", "go", "cont", "compile", "printError", "fromRom", "ERRORS", "jsr", "ret", "cpu", "result", "err", "word", "BasicError", "inStatement", "chrout", "ch", "x", "y", "s", "VECTORS", "VIC", "typed", "text", "store", "crunch", "command", "load", "name", "device", "secondary", "b", "runDirect", "statements", "getting", "lineOf", "waiting", "paced", "budget", "DIRECT", "YIELD", "routine", "engine", "sa", "all", "lines", "instantiate", "line", "start", "dataItems", "Basic", "inputting", "input", "st", "t", "skip", "target", "string", "value", "scanNumber", "val", "evaluator", "breakIn", "direct", "to", "l", "list", "file", "directMode", "body", "raw", "r1", "LINES", "CYCLES_PER_LINE", "DISPLAY_START", "C64", "game", "roms", "log", "printer", "Printer", "CIA", "VIC", "Drive", "c", "CPU", "own", "vector", "at", "d", "bus", "st", "r", "install", "a", "p", "i", "v", "columns", "rows", "nameBytes", "device", "sa", "name", "raw", "body", "end", "from", "to", "n", "column", "row", "down", "text", "until", "display", "drawn", "before", "pc", "spent", "nmi", "m", "cycles", "raised", "paint_exports", "__export", "paint", "paint", "mem", "chip", "chargen", "vic", "splits", "m", "VIC", "at", "a", "b", "set", "v", "y", "k", "r", "picture_exports", "__export", "chip", "rows", "chip", "registers", "color", "bank", "page", "r", "v", "rows", "mem", "io", "chargen", "crop", "scale", "frame", "paint", "cx", "cy", "w", "out", "y", "row", "x", "c", "PALETTE", "TOP", "WIDTH", "LEFT", "s", "saves_exports", "__export", "keepDrive", "drive", "disk", "f", "name", "raw", "sid_exports", "__export", "SID", "ATTACK", "DECAY", "SID", "rate", "reg", "val", "prev", "v", "n", "events", "out", "e", "i", "mix", "k", "b", "r", "freq", "ctrl", "a", "d", "sus", "rel", "step", "before", "wave", "pw", "bit", "start_exports", "__export", "ROM_CHOICES", "c64Roms", "typed", "ROM_CHOICES", "c64Roms", "choice", "slug", "load", "standIn", "typed", "m", "game", "raw", "c"]
|
|
4
|
+
"sourcesContent": ["// A program's statements, as read from Blitz!'s code or by basic-lang.js from BASIC's text,\n// compiled to JavaScript: a module, a step a statement, which an engine runs, each step's work\n// done by the BASIC of basic.js (`b`, the engine's `basic`).\n//\n// compile(statements, { name, source, mem, cost, render }) the module's text\n// instantiate(statements, { ... }) the same, as the program itself\n// statements the tree: statements, and labels where a jump goes\n// mem memory as the program has it, for the text after each SYS: its parameters'\n// expressions are compiled too (`params`), for the ROM's routines that the\n// machine code reads them with\n// cost the cycles a statement takes, for the page's clock\n// render a statement as BASIC, each step's text\nimport { expression } from './basic-lang.js';\n\nconst hex = (v, w = 4) => v.toString(16).toUpperCase().padStart(w, '0');\nconst q = s => JSON.stringify(s);\n\n// where an operation that can fail is, as the last argument of its call (evaluated after the\n// others, so after any inner operation's): BASIC's error gives it (basic.js `here`)\nconst here = x => x.op !== undefined ? `, b.here(0x${x.op.toString(16)})` : '';\n// an expression as JavaScript, and whether it is a string\nfunction js(x) {\n switch (x.k) {\n case 'num': return String(x.v);\n case 'str': return q(x.s);\n case 'special': return { ti: 'b.ti()', 'ti$': 'b.tis()', st: 'b.st()', pi: String(Math.PI) }[x.n];\n case 'var': return `b.get(${q(x.n)})`;\n case 'elem': return `b.elem(${q(x.n)}, [${x.i.map(js).join(', ')}]${here(x)})`;\n case 'neg': return `-b.num(${js(x.a)})`;\n case 'not': return `b.not(${js(x.a)})`;\n case 'op': {\n const a = js(x.a), c = js(x.b);\n switch (x.o) {\n case '+': return `b.add(${a}, ${c}${here(x)})`;\n case '-': return `(b.num(${a}) - b.num(${c}))`;\n case '*': return `(b.num(${a}) * b.num(${c}))`;\n case '/': return `b.div(${a}, ${c}${here(x)})`;\n case '^': return `b.pow(${a}, ${c}${here(x)})`;\n case 'and': return `b.and(${a}, ${c}${here(x)})`;\n case 'or': return `b.or(${a}, ${c}${here(x)})`;\n default: return `b.cmp(${a}, ${c}, ${q(x.o)}${here(x)})`;\n }\n }\n case 'fn-call': return `b.fn(${q(x.n)}, ${js(x.a)})`;\n case 'fn': {\n const a = x.args.map(js);\n const F = { 'str$': 'str', 'chr$': 'chr', 'left$': 'left', 'right$': 'right', 'mid$': 'mid' };\n return `b.${F[x.n] ?? x.n}(${a.join(', ')}${a.length < 3 && (x.n === 'mid$') ? ', undefined' : ''}${here(x)})`;\n }\n }\n throw new Error('no expression ' + x.k);\n}\n\n// a place to store into: a variable or an array's element\nconst store = (t, v, s) => t.k === 'elem' ? `b.setElem(${q(t.n)}, [${t.i.map(js).join(', ')}], ${v}${s ? here(s) : ''})` : `b.set(${q(t.n)}, ${v}${s ? here(s) : ''})`;\nconst isString = t => t.n.endsWith('$');\n\nexport function compile(statements, { name, source, mem, cost = 0, render }) {\n // each statement a step, each label the step after it\n const labels = {}, steps = [];\n for (const s of statements) { if (s.label !== undefined) labels['L' + hex(typeof s.label === 'number' ? s.label : parseInt(s.label.slice(1), 16))] = steps.length; else steps.push(s); }\n // (a jump to a line not there is UNDEF'D STATEMENT when it is taken: `missing`)\n const step = to => { if (to?.missing !== undefined) return null; const k = labels['L' + hex(to)]; if (k === undefined) throw new Error('no label for $' + hex(to)); return k; };\n const params = new Map();\n const body = steps.map((s, k) => {\n const go = to => to?.missing !== undefined ? 'b.undef();' : `e.pc = ${step(to)};`;\n let c;\n switch (s.k) {\n case 'let': c = store(s.t, js(s.e), s); break;\n case 'dim': c = `b.dim(${q(s.n)}, [${s.sizes.map(js).join(', ')}]);`; break;\n case 'poke': c = `b.poke(${js(s.a)}, ${js(s.v)}${here(s)});`; break;\n case 'for': c = `b.for(${q(s.v)}, ${js(s.to)}, ${s.step ? js(s.step) : 1}, ${k + 1});`; break;\n case 'next': case 'next-var': c = `{ const back = b.next(${s.v ? q(s.v) : 'null'}); if (back !== null) e.pc = back; }`; break;\n case 'goto': c = go(s.to); break;\n case 'gosub': c = `b.gosub(${k + 1}); ${go(s.to)}`; break;\n case 'return': c = 'e.pc = b.ret();'; break;\n case 'on': c = `{ const n = b.on(${js(s.e)}${here(s)}); if (n >= 1 && n <= ${s.to.length}) { const to = [${s.to.map(step).join(', ')}][n - 1]; if (to === null) b.undef(); ${s.gosub ? `b.gosub(${k + 1}); ` : ''}e.pc = to; } }`; break;\n case 'unless': c = s.to < 0 ? `if (!b.num(${js(s.e)})) e.pc = ${steps.length};` : `if (!b.num(${js(s.e)})) ${go(s.to)}`; break;\n case 'if-goto': c = `if (b.num(${js(s.e)})) ${go(s.to)}`; break;\n case 'if-return': c = `if (b.num(${js(s.e)})) e.pc = b.ret();`; break;\n case 'print': c = `b.print(${js(s.args[0])});`; break;\n case 'print,': c = `b.print(${js(s.args[0])}); b.comma();`; break;\n case 'print-line': c = `b.print(${js(s.args[0])}); b.newline();`; break;\n case 'print-line#': c = `b.print(${js(s.args[0])}); b.newline(); b.clrchn();`; break;\n case 'print#': c = `b.output(${js(s.args[0])});`; break;\n case 'print#-line': c = `b.output(${js(s.args[0])}); b.newline(); b.clrchn();`; break;\n case 'clrchn': c = 'b.clrchn();'; break;\n case 'input#': c = `b.input(${js(s.args[0])});`; break;\n // GET#: the file the input, a character for each variable (none, \"\"), and the keyboard again\n case 'get#': c = `b.input(${js(s.args[0])}); ${s.targets.map(t => store(t, isString(t) ? 'b.getFrom()' : 'b.val(b.getFrom())')).join('; ')}; b.clrchn();`; break;\n // (an item of an INPUT given up, a read from the file timed out, leaves its variable)\n case 'input': case 'input-item': c = `{ const v = b.item(${isString(s.t)}, ${s.k === 'input'}); if (v !== undefined) ${store(s.t, 'v')}; }` + (s.last ? ' b.inputDone();' : ''); break;\n case 'input-start': c = ''; break;\n case 'open': c = `b.open([${s.args.map(js).join(', ')}]);`; break;\n case 'close': c = `b.close(${js(s.args[0])});`; break;\n // WAIT: this step again until the place's bits come, the wait the run stops for\n case 'wait': c = `if (!b.wait(${s.args.map(js).join(', ')})) { e.pc = ${k}; if (++e.idle > (e.routines.polls ?? 200) && !e.clock) e.polled = true; }`; break;\n case 'print-comma': c = 'b.comma();'; break;\n case 'newline': c = 'b.newline();'; break;\n case 'tab': c = `b.tab(${js(s.args[0])}${here(s)});`; break;\n case 'spc': c = `b.spc(${js(s.args[0])}${here(s)});`; break;\n case 'get': c = `{ const k = b.key(); if (k === null) { e.pc = ${k}; return; } ${store(s.t, isString(s.t) ? 'k' : 'b.val(k)')} }`; break;\n case 'read': case 'read$': c = store(s.t, `b.read(${isString(s.t)})`); break;\n case 'clr': c = 'b.clr();'; break;\n case 'restore': c = 'b.restore();'; break;\n // DEF FN: the function kept, its expression a function of the BASIC it runs on\n case 'def': c = `b.def(${q(s.n)}, ${q(s.p)}, b => ${js(s.e)});`; break;\n case 'end': case 'stop': c = 'e.ended = true;'; break;\n case 'ti$=': c = `b.setTis(${js(s.args[0])});`; break;\n // RUN, Blitz!'s: the files closed, the variables cleared, the program's start run again (its\n // DIMs), and on from after the RUN; the start's jump past the DATA is to there, or else to\n // the main code\n case 'run': c = `b.run(${k + 1}); ${s.to !== undefined ? go(s.to) : 'e.pc = 0;'}`; break;\n // a statement BASIC could not read: its error, when it is reached\n case 'fail': c = `b.failWith(${q(s.what)});`; break;\n case 'run-main': c = `e.pc = b.resume ?? ${steps.length ? step(s.to) : 0}; b.resume = undefined;`; break;\n case 'nop': case 'flag+40': case 'flag-40': case 'flag+80': case 'flag-80': c = ''; break;\n // SYS: the machine code at the address, with its text from just after SYS for its\n // parameters\n case 'sys': {\n c = `return b.sys(${js(s.e)}, 0x${hex(s.text)}, s[${k}]);`;\n if (mem) for (let at = s.text; at < s.end;) {\n while (mem[at] === 0x20 || mem[at] === 0x2c) at++;\n if (at >= s.end) break;\n // (as far as there are expressions: what follows SYS 2076, Blitz!'s own bytes, BASIC\n // never reads, the machine code never coming back to it)\n let x; try { x = expression(mem, at); } catch { break; }\n params.set(at, [x.end, js(x.e), x.e.k === 'str' ? x.e.at : null]);\n at = x.end;\n }\n break;\n }\n // what goes through the KERNAL's files and the rest: the library's\n default: c = `return b.statement(${q(s.k)}, [${(s.args ?? []).map(js).join(', ')}]${s.t ? ', ' + q(s.t.n) : ''}, s[${k}]);`;\n }\n // (and where the statement's own instruction is, for an error of its own, RETURN WITHOUT\n // GOSUB, before anything else in it notes its place)\n return (s.op !== undefined ? `b.here(0x${s.op.toString(16)}); ` : '') + c;\n });\n const out = [];\n out.push(`// ${name}, compiled from ${source} by @moonbase-machines/c64/basic-compile.js: compiled again, never edited`);\n out.push('export default {');\n out.push(` labels: ${JSON.stringify(labels)},`);\n out.push(' data: [],');\n out.push(' steps: [');\n for (const [k, s] of steps.entries()) out.push(` [0x${hex(s.at)}, ${k}, ${q(render(s))}],`);\n out.push(' ],');\n out.push(' run: {');\n for (const [k, c] of body.entries()) out.push(` ${k}: (e, s) => { const b = e.basic;${cost ? ` b.cost(${cost});` : ''} ${c} },`);\n out.push(' },');\n // each SYS's parameters by where their text starts: where it ends, its value, and a string's\n // place in memory\n out.push(' params: {');\n for (const [at, [end, v, place]] of [...params].sort((a, b) => a[0] - b[0])) out.push(` 0x${hex(at)}: [0x${hex(end)}, b => ${v}${place !== null ? `, 0x${hex(place)}` : ''}],`);\n out.push(' },');\n out.push('};');\n return out.join('\\n') + '\\n';\n}\n\n// The same, as the program itself rather than its module's text: for a program compiled as it\n// runs (moonbase's BASIC ROM's RUN, rom.js), from the very code the remake's are written\n// with. (Its steps' functions are the text's, made by the browser's or Node's own JavaScript.)\nexport function instantiate(statements, options) {\n const text = compile(statements, options);\n return new Function('return ' + text.slice(text.indexOf('export default ') + 'export default '.length).replace(/;\\s*$/, ''))();\n}\n\n// An expression of the tree as a function of BASIC (`b`, basic.js's methods), from the same\n// code the compiled programs' are: for moonbase's BASIC ROM's evaluator, an expression read from\n// BASIC's text as the original runs (basic-rom.js)\nexport const evaluator = x => new Function('b', 'return ' + js(x));\n", "// Commodore BASIC's tokenized text read into the tree made of Blitz!'s code: expressions, for\n// the text after a SYS that the machine code reads its parameters from, and statements, for\n// Goldfields' boot program, GOLDFIELDS. Shared: a remake is built with it (basic-compile.js), and\n// moonbase's BASIC ROM reads with it as the original runs (basic-rom.js).\n//\n// expression(mem, at) { e, end }: the expression at `at`, and where it ends\n// lines(mem, from) the program at `from` as statements, each line a label of its address\n// crunch(text) a typed line's text to BASIC's tokenized bytes, as the ROM's CRUNCH\n// list(bytes) a line's bytes back to the text LIST prints\n// store(mem, txttab, n, bytes) a line put in its place in the program, or taken out\n\nimport { fail, BasicError } from './numbers.js';\n\n// text BASIC cannot read: its SYNTAX ERROR when the statement is reached, as BASIC finds it only\n// then (a line changed by a POKE, say); what was wrong kept for whoever looks\nconst syntax = detail => Object.assign(new BasicError('?SYNTAX ERROR'), { detail });\n\n// the tokens from $80, as BASIC V2 has them\nexport const TOKENS = ('END FOR NEXT DATA INPUT# INPUT DIM READ LET GOTO RUN IF RESTORE GOSUB RETURN REM STOP ON WAIT LOAD SAVE VERIFY ' +\n 'DEF POKE PRINT# PRINT CONT LIST CLR CMD SYS OPEN CLOSE GET NEW TAB( TO FN SPC( THEN NOT STEP + - * / ^ AND OR > = < ' +\n 'SGN INT ABS USR FRE POS SQR RND LOG EXP COS SIN TAN ATN PEEK LEN STR$ VAL ASC CHR$ LEFT$ RIGHT$ MID$ GO').split(' ');\nconst T = Object.fromEntries(TOKENS.map((t, k) => [t, 0x80 + k]));\nconst FUNCTIONS = new Set(['SGN', 'INT', 'ABS', 'USR', 'FRE', 'POS', 'SQR', 'RND', 'LOG', 'EXP', 'COS', 'SIN', 'TAN', 'ATN', 'PEEK', 'LEN', 'STR$', 'VAL', 'ASC', 'CHR$', 'LEFT$', 'RIGHT$', 'MID$']);\n// the binary operators by their token, and how tightly each binds, as BASIC evaluates them\nconst BINARY = { [T['OR']]: ['or', 1], [T['AND']]: ['and', 2], [T['>']]: ['>', 4], [T['=']]: ['=', 4], [T['<']]: ['<', 4], [T['+']]: ['+', 5], [T['-']]: ['-', 5], [T['*']]: ['*', 6], [T['/']]: ['/', 6], [T['^']]: ['^', 8] };\n\n// a reader of the text at `at`: BASIC skips spaces between everything outside a string\nfunction reader(mem, at) {\n const r = {\n at,\n peek() { while (mem[r.at] === 0x20) r.at++; return mem[r.at]; },\n next() { const b = r.peek(); r.at++; return b; },\n end() { const b = r.peek(); return b === 0 || b === 0x3a; },\n expect(b) { if (r.next() !== b) throw syntax(`$${(r.at - 1).toString(16)}: expected $${b.toString(16)}`); },\n };\n return r;\n}\n\nconst letter = b => b >= 0x41 && b <= 0x5a, digit = b => b >= 0x30 && b <= 0x39;\n\n// a variable's name: its first two characters (the rest are BASIC's to ignore), and $ or %\nfunction name(r) {\n let n = String.fromCharCode(r.next());\n while (letter(mem(r)) || digit(mem(r))) { const c = String.fromCharCode(r.next()); if (n.length < 2) n += c; }\n if (mem(r) === 0x24 || mem(r) === 0x25) n += String.fromCharCode(r.next());\n return n;\n}\nconst mem = r => r.peek();\n\nfunction primary(r, m) {\n const b = r.peek();\n if (b === 0x22) { // a string, to its closing quote or the line's end\n r.at++; const from = r.at; while (m[r.at] && m[r.at] !== 0x22) r.at++;\n const s = String.fromCharCode(...m.subarray(from, r.at)); if (m[r.at] === 0x22) r.at++;\n return { k: 'str', s, at: from };\n }\n if (digit(b) || b === 0x2e) { // a number: digits, a point, an exponent\n let t = ''; const take = () => { t += String.fromCharCode(r.next()); };\n while (digit(r.peek()) || r.peek() === 0x2e) take();\n if (r.peek() === 0x45) { take(); if (r.peek() === T['-'] || r.peek() === T['+']) { r.at++; t += m[r.at - 1] === T['-'] ? '-' : '+'; } while (digit(r.peek())) take(); }\n return { k: 'num', v: Number(t) };\n }\n if (b === 0x28) { r.at++; const e = expr(r, m, 0); r.expect(0x29); return e; }\n if (b === T['-']) { r.at++; return { k: 'neg', a: expr(r, m, 7) }; }\n if (b === T['+']) { r.at++; return expr(r, m, 7); }\n if (b === T['NOT']) { r.at++; return { k: 'not', a: expr(r, m, 3) }; }\n if (b === T['FN']) { r.at++; const n = name(r); r.expect(0x28); const a = expr(r, m, 0); r.expect(0x29); return { k: 'fn-call', n, a }; }\n if (b >= 0x80 && FUNCTIONS.has(TOKENS[b - 0x80])) {\n r.at++; r.expect(0x28); const args = [expr(r, m, 0)];\n while (r.peek() === 0x2c) { r.at++; args.push(expr(r, m, 0)); }\n r.expect(0x29);\n return { k: 'fn', n: TOKENS[b - 0x80].toLowerCase(), args };\n }\n if (letter(b)) {\n const n = name(r);\n if (n === 'TI' || n === 'ST' || n === 'TI$') return { k: 'special', n: n.toLowerCase() };\n if (r.peek() === 0x28) { r.at++; const i = [expr(r, m, 0)]; while (r.peek() === 0x2c) { r.at++; i.push(expr(r, m, 0)); } r.expect(0x29); return { k: 'elem', n, i }; }\n return { k: 'var', n };\n }\n throw syntax(`$${r.at.toString(16)}: not an expression ($${b.toString(16)})`);\n}\n\n// an expression, by precedence: a relation of two of > = < at once (>=, <>) is one operator\nfunction expr(r, m, min) {\n let a = primary(r, m);\n for (;;) {\n const b = r.peek(), op = BINARY[b];\n if (!op || op[1] < min) return a;\n r.at++;\n let o = op[0];\n if (op[1] === 4 && BINARY[r.peek()]?.[1] === 4) { o = ({ '<>': '<>', '><': '<>', '<=': '<=', '=<': '<=', '>=': '>=', '=>': '>=' })[o + BINARY[r.peek()][0]]; r.at++; }\n a = { k: 'op', o, a, b: expr(r, m, op[1] + 1) };\n }\n}\n\n// The items of the program's DATA statements, in order, as READ finds them ($AC06): each its text,\n// a quoted string to its closing quote, else to a comma, a colon or the line's end, its leading\n// spaces passed over; whether it was quoted; and its line, for an error's IN. A REM's line, and\n// a string's, hold no DATA.\nexport function dataItems(m, from) {\n const items = [];\n for (const l of program(m, from)) {\n const b = l.bytes;\n for (let i = 0, q = false; b[i]; i++) {\n if (b[i] === 0x22) q = !q;\n if (q) continue;\n if (b[i] === REM_TOKEN) break;\n if (b[i] !== DATA_TOKEN) continue;\n for (i++; ; i++) {\n while (b[i] === 0x20) i++;\n let text = '', quoted = false;\n if (b[i] === 0x22) { quoted = true; for (i++; b[i] && b[i] !== 0x22; i++) text += String.fromCharCode(b[i]); if (b[i] === 0x22) i++; while (b[i] && b[i] !== 0x2c && b[i] !== 0x3a) i++; }\n else for (; b[i] && b[i] !== 0x2c && b[i] !== 0x3a; i++) text += String.fromCharCode(b[i]);\n items.push({ text, quoted, line: l.n });\n if (b[i] !== 0x2c) break;\n }\n if (!b[i]) break;\n }\n }\n return items;\n}\n\n// A line typed with no number (direct mode), its statements after the program's at `from`, as\n// BASIC runs it from its buffer at `at`: a jump from it goes into the program, and the program\n// ends before it. The direct statements start at the label 'direct'.\nexport function direct(m, from, at) {\n const out = lines(m, from);\n const numbers = new Map(out.filter(s => s.label !== undefined).map(s => [s.line, s.label]));\n out.push({ at: 0, k: 'end', args: [] }, { label: 'direct', line: 0xffff });\n statement(reader(m, at), m, out, n => numbers.has(n) ? numbers.get(n) : { missing: n }, null);\n out.push({ at: 0, k: 'end', args: [] });\n return out;\n}\n\nexport function expression(m, at) {\n const r = reader(m, at), e = expr(r, m, 0);\n return { e, end: r.at };\n}\n\n// The program from `from`, BASIC's own: each line its next line's address, its number, its\n// text, a zero; two zeros end it. The next line is the one after the zero, as BASIC links them\n// again when it loads a program (GOLDFIELDS was saved from elsewhere). Each statement as the\n// tree has Blitz!'s, `to` a line's address; the lines numbered as `numbers` says.\nexport function lines(m, from) {\n const out = [], numbers = new Map(), order = [];\n for (let at = from; m[at] | m[at + 1] << 8; at = m.indexOf(0, at + 4) + 1) { numbers.set(m[at + 2] | m[at + 3] << 8, at); order.push(at); }\n // (a line not there, a jump's error when it is taken: UNDEF'D STATEMENT, as BASIC finds it then)\n const line = n => numbers.has(n) ? numbers.get(n) : { missing: n };\n for (const [k, at] of order.entries()) {\n out.push({ label: at, line: m[at + 2] | m[at + 3] << 8 });\n const next = order[k + 1] ?? null, r = reader(m, at + 4);\n statement(r, m, out, line, next);\n }\n return out;\n}\n\n// the statements of one line from the reader's place, to its end\nfunction statement(r, m, out, line, next) {\n while (!r.end() || r.peek() === 0x3a) {\n if (r.peek() === 0x3a) { r.at++; continue; }\n const at = r.at;\n // (a statement that cannot be read is its error when BASIC reaches it, and the rest of\n // the line goes with it)\n try { one(r, m, out, line, next, at); }\n catch (err) {\n if (!(err instanceof BasicError)) throw err;\n out.push({ at, k: 'fail', what: /^\\?(.*) ERROR$/.exec(err.message)[1], args: [] });\n while (m[r.at]) r.at++;\n }\n }\n}\nfunction one(r, m, out, line, next, at) {\n {\n const b = r.next(), word = b >= 0x80 ? TOKENS[b - 0x80] : null;\n const say = x => out.push({ at, ...x });\n const target = () => { const v = expression(m, r.at); r.at = v.end; return v.e; };\n // PRINT's items, each with what follows it: ; nothing, , a zone, else a new line; none at\n // all, a new line\n const printItems = () => {\n if (r.end()) { say({ k: 'newline', args: [] }); return; }\n while (!r.end()) {\n const b2 = r.peek();\n if (b2 === T['TAB('] || b2 === T['SPC(']) { r.at++; const e = target(); r.expect(0x29); say({ k: b2 === T['TAB('] ? 'tab' : 'spc', args: [e] }); }\n else if (b2 === 0x3b) { r.at++; continue; }\n else if (b2 === 0x2c) { r.at++; say({ k: 'print-comma', args: [] }); continue; }\n else say({ k: 'print', args: [target()] });\n if (r.end()) { say({ k: 'newline', args: [] }); break; }\n if (r.peek() === 0x3b) { r.at++; if (r.end()) break; }\n }\n };\n if (!word || word === 'LET') { // an assignment\n if (word) r.peek(); else r.at--;\n const t = primary(r, m); r.expect(T['=']);\n say({ k: 'let', t, e: target() });\n } else if (word === 'IF') {\n const e = target();\n if (r.peek() === T['GOTO']) { r.at++; say({ k: 'if-goto', e, to: line(number(r)) }); return; }\n r.expect(T['THEN']);\n if (digit(r.peek())) { say({ k: 'if-goto', e, to: line(number(r)) }); return; }\n // the rest of the line runs when it holds: on to the next line when not\n say({ k: 'unless', e, to: next ?? -1 });\n } else if (word === 'GOTO' || word === 'GOSUB') say({ k: word.toLowerCase(), to: line(number(r)) });\n else if (word === 'GO') { r.expect(T['TO']); say({ k: 'goto', to: line(number(r)) }); } // GO TO\n // (a token past the statements', $A3 on, TAB( to GO: no statement begins with one)\n else if (b >= 0xa3) throw syntax(`$${at.toString(16)}: ${word} begins no statement`);\n // DATA, its items read by READ (`dataItems`), passed over to its statement's end; REM, the rest\n // of its line; RESTORE\n else if (word === 'DATA') { let q = false; while (m[r.at] && (q || m[r.at] !== 0x3a)) { if (m[r.at] === 0x22) q = !q; r.at++; } }\n else if (word === 'REM') { while (m[r.at]) r.at++; }\n else if (word === 'RESTORE') say({ k: 'restore', args: [] });\n else if (word === 'DIM') { // DIM, each array and its sizes in turn\n for (;;) { const t = primary(r, m); if (t.k !== 'elem') fail('SYNTAX'); say({ k: 'dim', n: t.n, sizes: t.i }); if (r.peek() !== 0x2c) break; r.at++; }\n }\n else if (word === 'DEF') { // DEF FN name(parameter) = its expression\n r.expect(T['FN']); const n = name(r); r.expect(0x28); const p = name(r); r.expect(0x29); r.expect(T['=']);\n say({ k: 'def', n, p, e: target() });\n }\n else if (word === 'INPUT') { // INPUT, a prompt (a string, then ;) if any, and its variables\n let prompt = null;\n if (r.peek() === 0x22) { const p = primary(r, m); prompt = p.s; if (r.next() !== 0x3b) fail('SYNTAX'); }\n const targets = [];\n for (;;) { const t = primary(r, m); if (t.k !== 'var' && t.k !== 'elem') fail('SYNTAX'); targets.push(t); if (r.peek() !== 0x2c) break; r.at++; }\n say({ k: 'input-keys', prompt, targets });\n }\n else if (word === 'READ') { // READ, each variable (or element) in turn\n for (;;) { const t = primary(r, m); if (t.k !== 'var' && t.k !== 'elem') fail('SYNTAX'); say({ k: t.n.endsWith('$') ? 'read$' : 'read', t }); if (r.peek() !== 0x2c) break; r.at++; }\n }\n else if (word === 'ON') { // ON e GOTO or GOSUB, its lines\n const e = target(), go = r.next();\n if (go !== T['GOTO'] && go !== T['GOSUB']) fail('SYNTAX');\n const to = [line(number(r))]; while (r.peek() === 0x2c) { r.at++; to.push(line(number(r))); }\n say({ k: 'on', e, to, gosub: go === T['GOSUB'] });\n }\n else if (word === 'RETURN' || word === 'CLR' || word === 'END' || word === 'STOP' || word === 'NEW' || word === 'CONT') say({ k: word.toLowerCase(), args: [] });\n // RUN, from the start or a line; LIST, all of it or a range (a number, -, a number, either\n // left out), the numbers as LINGET reads them\n else if (word === 'RUN') say(digit(r.peek()) ? { k: 'run', to: line(number(r)), args: [] } : { k: 'run', args: [] });\n else if (word === 'LIST') { // ($A6A4) the first number or 0; after a -, the last or 0; an end of 0 the program's end\n const from = number(r); let to = from;\n if (r.peek() === T['-']) { r.at++; to = number(r); }\n if (!r.end()) fail('SYNTAX');\n say({ k: 'list', args: [{ k: 'num', v: from }, { k: 'num', v: to || 0xffff }] });\n }\n else if (word === 'POKE') { const a = target(); r.expect(0x2c); say({ k: 'poke', a, v: target() }); }\n else if (word === 'SYS') { // its address, and the rest of its text for the machine code\n const e = target(), text = r.at; while (m[r.at] && m[r.at] !== 0x3a) r.at++;\n say({ k: 'sys', e, text, end: r.at, words: '' });\n } else if (word === 'LOAD') {\n const args = [target()]; while (r.peek() === 0x2c) { r.at++; args.push(target()); }\n say({ k: 'load', args });\n } else if (word === 'GET' && r.peek() === 0x23) { // GET#: its file, then each variable, a character each\n r.at++; const n = target(); r.expect(0x2c);\n const targets = [primary(r, m)]; while (r.peek() === 0x2c) { r.at++; targets.push(primary(r, m)); }\n say({ k: 'get#', args: [n], targets });\n } else if (word === 'GET') say({ k: 'get', t: primary(r, m) });\n else if (word === 'INPUT#') { // INPUT#: its file, then its variables, as Blitz!'s INPUT# has them\n const n = target(); r.expect(0x2c);\n const targets = [primary(r, m)]; while (r.peek() === 0x2c) { r.at++; targets.push(primary(r, m)); }\n say({ k: 'input#', args: [n] });\n targets.forEach((t, i) => say({ k: i ? 'input-item' : 'input', t, last: i === targets.length - 1 }));\n }\n else if (word === 'WAIT') { // WAIT place, mask[, flip]\n const args = [target()]; r.expect(0x2c); args.push(target());\n if (r.peek() === 0x2c) { r.at++; args.push(target()); }\n say({ k: 'wait', args });\n }\n else if (word === 'SAVE' || word === 'VERIFY') { // its name, device and secondary address, each if given\n const args = r.end() ? [] : [target()]; while (r.peek() === 0x2c) { r.at++; args.push(target()); }\n say({ k: word.toLowerCase(), args });\n }\n else if (word === 'FOR') {\n const v = name(r); r.expect(T['=']); const from = target(); r.expect(T['TO']);\n const to = target(), step = r.peek() === T['STEP'] ? (r.at++, target()) : undefined;\n say({ k: 'let', t: { k: 'var', n: v }, e: from }); out.push({ at, k: 'for', v, to, ...step ? { step } : {} });\n } else if (word === 'NEXT') { // NEXT, or NEXT and its variables, each in turn: NEXT J,I\n if (!letter(r.peek())) { say({ k: 'next', v: null, args: [] }); return; }\n for (;;) { say({ k: 'next-var', v: name(r), args: [] }); if (r.peek() !== 0x2c) break; r.at++; }\n }\n else if (word === 'PRINT') printItems();\n // CMD: the output to a file, and PRINT's items after a comma; PRINT#, the same, and then the\n // output back to the screen (Microsoft's PRINTN: CMD, then IODONE)\n else if (word === 'CMD' || word === 'PRINT#') {\n say({ k: 'print#', args: [target()] });\n if (r.peek() === 0x2c) r.at++; else if (!r.end()) fail('SYNTAX');\n printItems();\n if (word === 'PRINT#') say({ k: 'clrchn', args: [] });\n }\n else if (word === 'OPEN') { const args = r.end() ? [] : [target()]; while (r.peek() === 0x2c) { r.at++; args.push(target()); } say({ k: 'open', args }); }\n else if (word === 'CLOSE') say({ k: 'close', args: [target()] }); else throw new Error(`$${at.toString(16)}: ${word} is not handled`);\n }\n}\n\nconst number = r => { let n = 0; while (digit(r.peek())) n = n * 10 + r.next() - 0x30; return n; };\n\n// The keywords as BASIC's ROM keeps them (RESLST, $A09E): each one's characters, its last with\n// its top bit set, in token order, then a zero: 256 bytes exactly, which LIST indexes with the\n// Y register, so that past GO it comes round to the start again\nconst RESLST = [...TOKENS.flatMap(t => [...t].map((c, i, a) => c.charCodeAt(0) | (i === a.length - 1 ? 0x80 : 0))), 0];\nconst PRINT_TOKEN = T['PRINT'], DATA_TOKEN = T['DATA'], REM_TOKEN = T['REM'];\n\n// CRUNCH ($A579): a line's text, as typed (PETSCII, after its number), to the bytes BASIC keeps,\n// its keywords as tokens, as the ROM makes them, its quirks too. Outside a string, a space, a\n// digit, : and ; are kept as they are, ? is PRINT, and a shifted character is dropped (pi is\n// kept); else the keywords are tried in their order, a character at a time, the first that\n// matches taken (so INPUT# before INPUT, and TO inside TOTAL), a shifted letter ending one early\n// (P shifted-R is PRINT); no keyword, and the character is kept. A string is kept to its closing\n// quote, the rest of a line after REM all of it, and after DATA all but a string's quotes to the\n// next colon. The bytes end with the line's zero.\nexport function crunch(text) {\n const buf = [...text, 0], out = [];\n let x = 0, dores = 0;\n const stuff = a => {\n out.push(a); x++;\n if (a === 0) return 'done';\n if (a === 0x3a) dores = 0; else if (a === DATA_TOKEN) dores = DATA_TOKEN - 0x3a;\n return a === REM_TOKEN ? 'rem' : null;\n };\n // a string's or REM's characters, to the end character (a quote, or the line's zero)\n const copy = end => { for (;;) { const ch = buf[x]; if (ch === 0 || ch === end) return stuff(ch); out.push(ch); x++; } };\n for (;;) {\n let ch = buf[x], r = null;\n if (ch >= 0x80) { if (ch !== 0xff) { x++; continue; } r = stuff(ch); }\n else if (ch === 0x20) r = stuff(ch);\n else if (ch === 0x22) { out.push(ch); x++; r = copy(0x22); }\n else if (dores & 0x40) r = stuff(ch);\n else if (ch === 0x3f) r = stuff(PRINT_TOKEN);\n else if (ch >= 0x30 && ch < 0x3c) r = stuff(ch);\n else {\n // the keywords tried: the next character against the list's, until a difference of $80\n // (the keyword's last, or a shifted letter in the text) ends it, or another moves on\n // (one place in the list, as the ROM's Y: a keyword that does not match is passed from\n // where it stopped matching, which a shifted letter matching a keyword's last may carry\n // into the next)\n let y = 0, count = 0, found = null;\n for (;;) {\n let k = x;\n for (;;) { const d = (buf[k] - RESLST[y]) & 0xff; if (d === 0) { k++; y++; continue; } if (d === 0x80) found = { token: 0x80 | count, end: k }; break; }\n if (found) break;\n count++;\n do y++; while (!(RESLST[y - 1] & 0x80));\n if (RESLST[y] === 0) break;\n }\n if (found) { x = found.end; r = stuff(found.token); }\n else r = stuff(ch);\n }\n if (r === 'done') return out;\n if (r === 'rem' && copy(0) === 'done') return out;\n }\n}\n\n// LIST's text of a line ($A71A): its bytes after the number as BASIC prints them, each token\n// its keyword's characters, and inside a string, the bytes as they are; pi as its character.\n// Past GO the keywords come round again, Y being a byte: $CC is the table's last zero, which\n// printed ends the keyword at once (CHROUT leaves Z set), and $CD on are FOR, NEXT and the rest.\n// Even after REM a byte of $80 or more is a keyword's: BASIC's own oddity.\nexport function list(bytes) {\n const out = [];\n let quote = false;\n for (const b of bytes) {\n if (b === 0) break;\n if (b < 0x80 || b === 0xff || quote) { if (b === 0x22) quote = !quote; out.push(b); continue; }\n let n = b - 0x7f, y = 0xff;\n while (--n) { do y = (y + 1) & 0xff; while (!(RESLST[y] & 0x80)); }\n for (;;) { y = (y + 1) & 0xff; const c = RESLST[y]; if (c & 0x80) { out.push(c & 0x7f); break; } out.push(c); if (!c) break; }\n }\n return out;\n}\n\n// The program kept at `txttab` in `mem`: a line put in by its number, in its place, over one\n// of the same number, or taken out when it is empty, as BASIC's line entry does ($A49C), and\n// every line linked to the next again (LINKPRG, $A533). Gives the program's end, where the\n// variables start (VARTAB).\nexport function program(mem, txttab) {\n const lines = [];\n for (let at = txttab; mem[at] | mem[at + 1] << 8; ) {\n const end = mem.indexOf(0, at + 4);\n lines.push({ n: mem[at + 2] | mem[at + 3] << 8, bytes: [...mem.subarray(at + 4, end + 1)] });\n at = end + 1;\n }\n return lines;\n}\nexport function store(mem, txttab, n, bytes) {\n const lines = program(mem, txttab).filter(l => l.n !== n);\n if (bytes.length > 1) lines.push({ n, bytes });\n lines.sort((a, b) => a.n - b.n);\n let at = txttab;\n for (const l of lines) {\n const next = at + 4 + l.bytes.length;\n mem.set([next & 0xff, next >> 8, l.n & 0xff, l.n >> 8, ...l.bytes], at);\n at = next;\n }\n mem[at] = 0; mem[at + 1] = 0;\n return at + 2;\n}\n", "// Commodore BASIC's rules for numbers, held once for every layer that keeps them: the remake's\n// BASIC (basic.js, on JavaScript's numbers) and moonbase's BASIC ROM (basic-rom.js, on the ROM's\n// five-byte floats). BASIC's errors in its own words; a whole number of 16 bits; a number as FOUT\n// writes it and as VAL reads it; and RND's numbers as moonbase gives them, the same on every line.\n//\n// (FOUT and VAL are held to the ROM's.)\n\nimport { Floats, CONSTANTS, pack } from './float.js';\n\n// (an error's BASIC line, where it is not the statement's own, is its `basicLine`: WebKit gives\n// every Error a `line` of its own, the line of the JavaScript it was thrown from)\nexport class BasicError extends Error {}\n// BASIC's error messages, by their number in its table (the X its error routine takes, $A437, less 1)\nexport const ERRORS = ['TOO MANY FILES', 'FILE OPEN', 'FILE NOT OPEN', 'FILE NOT FOUND', 'DEVICE NOT PRESENT', 'NOT INPUT FILE', 'NOT OUTPUT FILE', 'MISSING FILE NAME',\n 'ILLEGAL DEVICE NUMBER', 'NEXT WITHOUT FOR', 'SYNTAX', 'RETURN WITHOUT GOSUB', 'OUT OF DATA', 'ILLEGAL QUANTITY', 'OVERFLOW', 'OUT OF MEMORY', 'UNDEF\\'D STATEMENT',\n 'BAD SUBSCRIPT', 'REDIM\\'D ARRAY', 'DIVISION BY ZERO', 'ILLEGAL DIRECT', 'TYPE MISMATCH', 'STRING TOO LONG', 'FILE DATA', 'FORMULA TOO COMPLEX', 'CAN\\'T CONTINUE',\n 'UNDEF\\'D FUNCTION', 'VERIFY', 'LOAD', 'BREAK'];\nexport const fail = what => { throw new BasicError('?' + what + ' ERROR'); };\n\n// A number as BASIC writes it (FOUT): a space for its sign when it is not negative, nine\n// significant digits, no 0 before the point, and an exponent below 0.01 or from 1E+09 on. The\n// number as BASIC's five bytes hold it, and FOUT's own steps on them (float.js, held to\n// Microsoft's and Commodore's), its last digit as theirs: JavaScript's rounding of nine digits\n// differs from it for one number in twenty.\nconst page = new Uint8Array(0x10000), floats = new Floats({ read: a => page[a], write: (a, v) => { page[a] = v; } });\nfor (const [at, bytes] of Object.entries(CONSTANTS)) page.set(bytes, +at);\nexport function fout(x) {\n const b = pack(x);\n if (!b[0] || Math.abs(x) < 2 ** -128) return ' 0';\n if (b[0] > 255) fail('OVERFLOW');\n page[0x61] = b[0]; page[0x62] = b[1] | 0x80; page.set(b.slice(2), 0x63); page[0x66] = x < 0 ? 0xff : 0; page[0x70] = 0;\n floats.fout();\n let s = ''; for (let a = 0x100; page[a]; a++) s += String.fromCharCode(page[a]);\n return s;\n}\n\n// VAL: the number at a string's start, BASIC's way: spaces skipped, a sign, digits, a point, an\n// exponent; 0 if there is none\nexport function val(s) {\n const t = s.replace(/ /g, ''), m = /^[+-]?(\\d*\\.?\\d*)(E[+-]?\\d+)?/.exec(t);\n const n = m && m[1] && m[1] !== '.' ? Number(m[0].replace(/E$/, '')) : 0;\n return Number.isFinite(n) ? n : 0;\n}\n\n// A number's text where INPUT reads one, as FIN reads it ($BCF3): spaces passed over anywhere,\n// as CHRGET passes them; a sign; digits; a point and digits; an E, a sign and digits. Where it\n// ends, for INPUT to look at what follows (a comma, a colon or the line's end, or the item is bad)\nexport function scanNumber(s, k) {\n let text = '';\n const sp = () => { while (s[k] === ' ') k++; }, digits = () => { while (s[k] >= '0' && s[k] <= '9') { text += s[k++]; sp(); } };\n sp();\n if (s[k] === '-' || s[k] === '+') { text += s[k++]; sp(); }\n digits();\n if (s[k] === '.') { text += s[k++]; sp(); digits(); }\n if (s[k] === 'E') { text += s[k++]; sp(); if (s[k] === '-' || s[k] === '+') { text += s[k++]; sp(); } digits(); }\n return { text, end: k };\n}\n\nexport const int16 = x => { const n = Math.floor(x); if (n < -32768 || n > 32767) fail('ILLEGAL QUANTITY'); return n; };\n\n// the seed's random numbers: a 32-bit state, each number its top 31 bits as a fraction, which\n// BASIC's five-byte floats hold exactly\nexport const seedRandom = seed => Math.imul(seed, 2654435761) >>> 0;\nexport const nextRandom = s => (((Math.imul(s, 1664525) + 1013904223) >>> 0) & 0xfffffffe) >>> 0;\n", "// Commodore BASIC's floating point, moonbase's own: the five-byte numbers BASIC keeps, and its\n// arithmetic on them, computing what BASIC's ROM computes, to the bit. It works where the ROM's\n// does, in the zero page, so that moonbase's BASIC ROM (basic-rom.js) can answer a program's\n// call into the ROM's arithmetic at its own address and leave memory as the ROM leaves it. Every\n// routine here is held to Commodore's, run on the processor, from thousands of random starting\n// states.\n//\n// const f = new Floats(memory) memory: read(address) and write(address, value)\n//\n// A number in memory is five bytes: its exponent (128 + the power of two, 0 for zero), then\n// its 32-bit mantissa, highest byte first, whose top bit, always 1, is the sign's place. In the\n// accumulator (FAC, $61 to $66) the mantissa's top bit is 1 and the sign has its own byte, $66;\n// a sixth byte, $70, holds the bits below the mantissa, which an operation keeps, and only\n// storing a number (or ROUND) rounds them in. The other operand (ARG, $69 to $6E) is the same,\n// its own low bits at $56 while an addition lines the two up. $6F is the two signs' EOR.\n//\n// The ROM's routines have their ways, and these keep them: the low bits are kept, not rounded,\n// until a number is stored; a shift by whole bytes brings in $68 at the top, whatever an earlier\n// routine left there; a shift's length depends on the carry it is entered with. Each method\n// says the ROM's address it stands for; its results are the ROM's, in memory and in the\n// registers its callers read (`regs`).\nexport const FAC = 0x61, ARG = 0x69, FACOV = 0x70, ARGOV = 0x56, ARISGN = 0x6f, BITS = 0x68, RESHO = 0x26;\n\n// Constants of BASIC's that its routines take from the ROM, by their place there: their values,\n// as five bytes, each named as Microsoft's source names it (BASIC-M6502). A game that reads one\n// reads it from moonbase's ROM image too (rom.js).\nconst words = ns => ns.flatMap(n => [n >>> 24 & 0xff, n >>> 16 & 0xff, n >>> 8 & 0xff, n & 0xff]);\nexport const CONSTANTS = {\n 0xb9bc: [0x81, 0x00, 0x00, 0x00, 0x00], // 1 (Microsoft's FONE)\n 0xbf11: [0x80, 0x00, 0x00, 0x00, 0x00], // 0.5 (FHALF)\n 0xbaf9: [0x84, 0x20, 0x00, 0x00, 0x00], // 10 (TENZC)\n // LOG's: its series' (a count, then the coefficients of x squared, highest first, for POLY1),\n // the square roots of a half and of two, -0.5, and the logarithm of two (LOGCN2, SQRHLF, SQRTWO,\n // NEGHLF, LOG2)\n 0xb9c1: [0x03, 0x7f, 0x5e, 0x56, 0xcb, 0x79, 0x80, 0x13, 0x9b, 0x0b, 0x64, 0x80, 0x76, 0x38, 0x93, 0x16, 0x82, 0x38, 0xaa, 0x3b, 0x20],\n 0xb9d6: [0x80, 0x35, 0x04, 0xf3, 0x34], // 0.707...\n 0xb9db: [0x81, 0x35, 0x04, 0xf3, 0x34], // 1.414...\n 0xb9e0: [0x80, 0x80, 0x00, 0x00, 0x00], // -0.5\n 0xb9e5: [0x80, 0x31, 0x72, 0x17, 0xf8], // 0.693...\n // EXP's: one over the logarithm of two, and its series (for POLY2) (LOGEB2, EXPCON)\n 0xbfbf: [0x81, 0x38, 0xaa, 0x3b, 0x29], // 1.442...\n 0xbfc4: [0x07, 0x71, 0x34, 0x58, 0x3e, 0x56, 0x74, 0x16, 0x7e, 0xb3, 0x1b, 0x77, 0x2f, 0xee, 0xe3, 0x85, 0x7a, 0x1d, 0x84, 0x1c, 0x2a,\n 0x7c, 0x63, 0x59, 0x58, 0x0a, 0x7e, 0x75, 0xfd, 0xe7, 0xc6, 0x80, 0x31, 0x72, 0x18, 0x10, 0x81, 0x00, 0x00, 0x00, 0x00],\n // FOUT's: the powers of ten its digits are counted out with, and TI$'s steps of the clock (hours\n // to seconds, in jiffies), each a 32-bit whole number, alternately subtracted and added (FOUTBL)\n 0xbf16: words([-100000000, 10000000, -1000000, 100000, -10000, 1000, -100, 10, -1, -2160000, 216000, -36000, 3600, -600, 60]),\n // and the bounds it brings a number between, 99999999.9 and 999999999 (both rounded up a\n // little), and 1E9, a small number's first step up (NZ0999, NZ9999, NZMIL)\n 0xbdb3: [0x9b, 0x3e, 0xbc, 0x1f, 0xfd],\n 0xbdb8: [0x9e, 0x6e, 0x6b, 0x27, 0xfd],\n 0xbdbd: [0x9e, 0x6e, 0x6b, 0x28, 0x00],\n // SIN's and COS's: a half pi, two pi, a quarter, and SIN's series (for POLY1) (PI2, TWOPI, FR4,\n // SINCON)\n 0xe2e0: [0x81, 0x49, 0x0f, 0xda, 0xa2], // 1.570...\n 0xe2e5: [0x83, 0x49, 0x0f, 0xda, 0xa2], // 6.283...\n 0xe2ea: [0x7f, 0x00, 0x00, 0x00, 0x00], // 0.25\n 0xe2ef: [0x05, 0x84, 0xe6, 0x1a, 0x2d, 0x1b, 0x86, 0x28, 0x07, 0xfb, 0xf8, 0x87, 0x99, 0x68, 0x89, 0x01, 0x87, 0x23, 0x35, 0xdf, 0xe1,\n 0x86, 0xa5, 0x5d, 0xe7, 0x28, 0x83, 0x49, 0x0f, 0xda, 0xa2],\n};\n\n// a number as the five bytes BASIC stores, from JavaScript's (for tests and for constants)\nexport function pack(x) {\n if (x === 0) return [0, 0, 0, 0, 0];\n const a = Math.abs(x);\n let ex = Math.floor(Math.log2(a)) + 1, f = a / 2 ** ex;\n if (f >= 1) { f /= 2; ex++; } else if (f < 0.5) { f *= 2; ex--; }\n let m = Math.round(f * 2 ** 32); if (m >= 2 ** 32) { m /= 2; ex++; }\n return [ex + 128, (m >>> 24 & 0x7f) | (x < 0 ? 0x80 : 0), m >>> 16 & 0xff, m >>> 8 & 0xff, m & 0xff];\n}\n// a number into the accumulator as BASIC holds it: $61 its exponent, $62 to $65 its mantissa,\n// $66 its sign, its low bits ($70) 0\nexport function setFac(memory, x) {\n const b = pack(x);\n memory.write(0x70, 0);\n if (!b[0]) { for (let a = 0x61; a <= 0x66; a++) memory.write(a, 0); return; }\n memory.write(0x61, b[0]); memory.write(0x62, b[1] | 0x80); memory.write(0x63, b[2]); memory.write(0x64, b[3]); memory.write(0x65, b[4]); memory.write(0x66, x < 0 ? 0xff : 0);\n}\n// and back: the number five bytes hold\nexport function unpack(b) {\n if (!b[0]) return 0;\n const m = ((b[1] | 0x80) * 2 ** 24) + b[2] * 65536 + b[3] * 256 + b[4];\n return (b[1] & 0x80 ? -1 : 1) * m / 2 ** 32 * 2 ** (b[0] - 128);\n}\n\nexport class Floats {\n constructor(memory) { this.mem = memory; }\n r(a) { return this.mem.read(a & 0xffff); }\n w(a, v) { this.mem.write(a & 0xffff, v & 0xff); }\n // a register's mantissa, four bytes from `at`, as a number, and back\n mant(at) { return ((this.r(at) * 256 + this.r(at + 1)) * 256 + this.r(at + 2)) * 256 + this.r(at + 3); }\n setMant(at, m) { this.w(at, m / 2 ** 24); this.w(at + 1, m / 65536); this.w(at + 2, m / 256); this.w(at + 3, m); }\n // (the FAC's value, for this module's own use and for tests)\n fac() { const e = this.r(FAC); return e ? (this.r(0x66) & 0x80 ? -1 : 1) * (this.mant(0x62) + this.r(FACOV) / 256) / 2 ** 32 * 2 ** (e - 128) : 0; }\n\n // ---- moving numbers ----\n\n // CONUPK ($BA8C): ARG from memory at A/Y; $6F the two signs' EOR; A the FAC's exponent\n conupk(at) {\n this.w(0x22, at); this.w(0x23, at >> 8);\n const b = [0, 1, 2, 3, 4].map(i => this.r(at + i));\n this.w(0x6d, b[4]); this.w(0x6c, b[3]); this.w(0x6b, b[2]); this.w(0x6e, b[1]);\n this.w(ARISGN, b[1] ^ this.r(0x66)); this.w(0x6a, b[1] | 0x80); this.w(ARG, b[0]);\n return { a: this.r(FAC), y: 0 };\n }\n // MOVFM ($BBA2): the FAC from memory at A/Y, its low bits 0; A its exponent\n movfm(at) {\n this.w(0x22, at); this.w(0x23, at >> 8);\n const b = [0, 1, 2, 3, 4].map(i => this.r(at + i));\n this.w(0x65, b[4]); this.w(0x64, b[3]); this.w(0x63, b[2]); this.w(0x66, b[1]); this.w(0x62, b[1] | 0x80); this.w(FAC, b[0]); this.w(FACOV, 0);\n return { a: b[0], y: 0 };\n }\n // MOVMF ($BBD4): the FAC, rounded, into memory at X/Y; its low bits 0 after\n movmf(at) {\n this.round();\n this.w(0x22, at); this.w(0x23, at >> 8);\n this.w(at + 4, this.r(0x65)); this.w(at + 3, this.r(0x64)); this.w(at + 2, this.r(0x63));\n this.w(at + 1, (this.r(0x66) | 0x7f) & this.r(0x62)); this.w(at, this.r(FAC)); this.w(FACOV, 0);\n return { a: this.r(FAC), y: 0 };\n }\n // MOVFA ($BBFC): the FAC from ARG; MOVAF ($BC0C): ARG from the FAC, rounded first\n movfa() { this.w(0x66, this.r(0x6e)); for (let i = 5; i >= 1; i--) this.w(0x60 + i, this.r(0x68 + i)); this.w(FACOV, 0); return { a: this.r(ARG), x: 0 }; }\n movaf() { this.round(); return this.movef(); }\n // ($BC0F, MOVAF after its ROUND: the FAC copied as it is)\n movef() { for (let i = 6; i >= 1; i--) this.w(0x68 + i, this.r(0x60 + i)); this.w(FACOV, 0); return { a: this.r(FAC), x: 0 }; }\n\n // ---- rounding, sign, comparing ----\n\n // ROUND ($BC1B): the low bits' top bit added in at the mantissa's foot; the low bits shifted\n // left, as the ROM leaves them; a carry out of the mantissa a power of two more\n round() {\n if (!this.r(FAC)) return;\n const ov = this.r(FACOV); this.w(FACOV, ov << 1);\n if (!(ov & 0x80)) return;\n const m = this.mant(0x62) + 1;\n if (m < 2 ** 32) { this.setMant(0x62, m); return; }\n this.setMant(0x62, 0);\n this.carryIn(1);\n }\n // ($B938) the exponent one more, and the mantissa and low bits shifted right with C in at the top\n carryIn(c) {\n const e = this.r(FAC) + 1; if (e > 255) throw overflow();\n this.w(FAC, e);\n const m = this.mant(0x62), ov = this.r(FACOV);\n this.setMant(0x62, Math.floor(m / 2) + (c ? 2 ** 31 : 0)); this.w(FACOV, (ov >> 1) | ((m & 1) << 7));\n }\n // SIGN ($BC2B): 0 for zero, 1 for positive, $FF for negative\n sign() { return !this.r(FAC) ? 0 : this.r(0x66) & 0x80 ? 0xff : 1; }\n // FCOMP ($BC5B, the address in A and Y; $BC5D with $24 set): the FAC against a number in memory,\n // 1 if the FAC is more, $FF if less, 0 if the same; the FAC's low bits, rounded, count only in\n // the mantissa's last byte, as the ROM's subtraction there borrows them\n fcomp(at) { return this.compare(at).a; }\n // (and Y as FCOMP leaves it: the byte it decided at, 1 for the exponent or the sign, 4 if equal)\n compare(at) {\n this.w(0x24, at); this.w(0x25, at >> 8);\n const ex = this.r(at);\n if (!ex) return { a: this.sign(), y: 1 };\n const b1 = this.r(at + 1), s = this.r(0x66);\n const memMore = (more, y) => { const neg = s & 0x80 ? 1 : 0; return { a: (more ? neg ^ 1 : neg) ? 0xff : 1, y }; }; // more: memory > FAC in size\n if ((b1 ^ s) & 0x80) return { a: s & 0x80 ? 0xff : 1, y: 1 };\n if (ex !== this.r(FAC)) return memMore(ex > this.r(FAC), 1);\n for (const [k, fac] of [[1, 0x62], [2, 0x63], [3, 0x64]]) {\n const mb = k === 1 ? b1 | 0x80 : this.r(at + k), fb = this.r(fac);\n if (mb !== fb) return memMore(mb > fb, k);\n }\n const borrow = this.r(FACOV) > 0x7f ? 1 : 0, d = this.r(at + 4) - this.r(0x65) - borrow;\n if ((d & 0xff) === 0) return { a: 0, y: 4 };\n return memMore(d >= 0, 4);\n }\n\n // ---- adding ----\n\n // FADD ($B867, the address in A and Y: memory plus the FAC; $B86A, ARG plus the FAC, A the\n // FAC's exponent): the result normalised, its low bits kept\n fadd(at) { this.conupk(at); return this.faddt(); }\n // FSUB ($B850): memory minus the FAC; FSUBT ($B853): ARG minus the FAC\n fsub(at) { this.conupk(at); return this.fsubt(); }\n fsubt() { this.w(0x66, this.r(0x66) ^ 0xff); this.w(ARISGN, this.r(0x66) ^ this.r(0x6e)); return this.faddt(); }\n faddt() {\n if (!this.r(FAC)) return this.movfa();\n this.w(ARGOV, this.r(FACOV));\n const ey = this.r(ARG);\n if (!ey) return { a: 0 };\n let d = (ey - this.r(FAC)) & 0xff, x = ARG, c = ey >= this.r(FAC) ? 1 : 0, a = 0;\n if (d !== 0) {\n if (c) { // ARG the larger: the FAC takes its exponent and sign, and is the one shifted\n this.w(FAC, ey); this.w(0x66, this.r(0x6e));\n d = (~d + 1) & 0xff; this.w(ARGOV, 0); x = FAC;\n } else this.w(FACOV, 0);\n // (under a byte by the ROM's own signed test of A - $F9, $B897: bit by bit, the first\n // shifted plainly, the rest keeping the top bit, $B89B, which for a count the test misreads\n // is up to 255 bits; otherwise whole bytes first, $B862)\n a = ((d - 0xf9) & 0x80) ? this.shift(x, d, 0) : this.bitShift(x, d, this.r(FACOV), false);\n }\n if (this.r(ARISGN) & 0x80) {\n // the signs differ: the one not shifted less the one shifted, into the FAC\n const minus = x === ARG ? FAC : ARG;\n const low = this.r(ARGOV) - a, lowByte = low & 0xff, borrow = low < 0 ? 1 : 0;\n const m = this.mant(minus + 1) - this.mant(x + 1) - borrow;\n this.w(FACOV, lowByte); this.setMant(0x62, (m + 2 ** 32) % 2 ** 32);\n if (m < 0) this.negate();\n return this.normal();\n }\n // the same signs: the sum, a carry out a power of two more; with the exponents the same,\n // the carry their comparison left adds one more to the low bits ($B8FE)\n const low = a + this.r(ARGOV) + (d === 0 ? 1 : 0), m = this.mant(0x62) + this.mant(0x6a) + (low > 255 ? 1 : 0);\n this.w(FACOV, low); this.setMant(0x62, m % 2 ** 32);\n if (m >= 2 ** 32) this.carryIn(1);\n return { a: this.r(FAC) };\n }\n // the FAC's mantissa and low bits two's-complemented, its sign turned over ($B947); $B94D the\n // same without the sign\n negate() { this.w(0x66, this.r(0x66) ^ 0xff); this.complement(); }\n complement() {\n const ov = (~this.r(FACOV) & 0xff) + 1, m = 2 ** 32 - 1 - this.mant(0x62) + (ov > 255 ? 1 : 0);\n this.w(FACOV, ov); this.setMant(0x62, m % 2 ** 32);\n }\n // NORMAL ($B8D7): the mantissa shifted up until its top bit is 1, a byte at a time and then a\n // bit, the low bits coming in below it, and the exponent that much less; zero if it was zero,\n // or if the exponent would go under\n normal() {\n let n = 0;\n while (!this.r(0x62)) {\n this.w(0x62, this.r(0x63)); this.w(0x63, this.r(0x64)); this.w(0x64, this.r(0x65)); this.w(0x65, this.r(FACOV)); this.w(FACOV, 0);\n n += 8; if (n === 32) return this.zero();\n }\n while (!(this.r(0x62) & 0x80)) {\n const ov = this.r(FACOV), m = this.mant(0x62);\n this.w(FACOV, ov << 1); this.setMant(0x62, (m * 2 + (ov >> 7)) % 2 ** 32); n++;\n }\n if (n >= this.r(FAC)) return this.zero();\n this.w(FAC, this.r(FAC) - n);\n return { a: this.r(FAC) };\n }\n zero() { this.w(FAC, 0); this.w(0x66, 0); return { a: 0 }; }\n // The ROM's shift right of a register (X: $61 the FAC, $69 ARG, $25 the product) by -A bits,\n // A a negative count; its low bits are $70, or the A register (the return here) in a shift of\n // under a byte. Whole bytes first, each bringing $68 in at the top ($B985), as long as A + 8\n // (and the carry) stays under 1; then the bits, the top one kept, as for a signed number ($B9A6).\n shift(x, a, c = 0) {\n for (;;) {\n const sum = a + 8 + c; a = sum & 0xff; c = sum > 255 ? 1 : 0;\n if (a & 0x80 || !a) { this.byteShift(x); continue; }\n const diff = a - 8 - (1 - c); a = diff & 0xff; c = diff >= 0 ? 1 : 0;\n if (c) return this.r(FACOV);\n return this.bitShift(x, a, this.r(FACOV), true);\n }\n }\n byteShift(x) {\n this.w(FACOV, this.r(x + 4)); this.w(x + 4, this.r(x + 3)); this.w(x + 3, this.r(x + 2)); this.w(x + 2, this.r(x + 1)); this.w(x + 1, this.r(BITS));\n }\n // bits: Y counting up from -n, each a shift right of the register's four bytes and A below them,\n // the top byte's top bit kept (signed) or, for the first of an addition's, cleared\n bitShift(x, y, a, signed) {\n for (; y !== 0; y = (y + 1) & 0xff) {\n const top = this.r(x + 1), m = this.mant(x + 1);\n const keep = signed ? top & 0x80 : 0;\n this.setMant(x + 1, Math.floor(m / 2) + keep * 2 ** 24);\n a = (a >> 1) | ((m & 1) << 7);\n signed = true;\n }\n return a;\n }\n\n // ---- multiplying and dividing ----\n\n // FMULT ($BA28, memory times the FAC; $BA2B, ARG times the FAC): the mantissas multiplied a\n // byte of the FAC's at a time, its low bits first, the product's bits shifted out below lost\n fmult(at) { this.conupk(at); return this.fmultt(); }\n fmultt() {\n if (!this.r(FAC)) return { a: 0 };\n const md = this.muldiv();\n if (md.zero) return { a: 0 };\n for (const r of [0x26, 0x27, 0x28, 0x29]) this.w(r, 0);\n let c = md.c;\n for (const at of [FACOV, 0x65, 0x64, 0x63, 0x62]) c = this.mltply(this.r(at), c, at === 0x62);\n this.w(0x62, this.r(0x26)); this.w(0x63, this.r(0x27)); this.w(0x64, this.r(0x28)); this.w(0x65, this.r(0x29));\n return this.normal();\n }\n // one byte of the multiplier ($BA59): a zero byte a shift of the product by bytes; another, its\n // bits from the lowest, ARG's mantissa added in for each 1, the product shifted right each time\n mltply(b, c, last) {\n if (!b && !last) { this.byteShift(0x25); this.shift(0x25, 0, c); return 0; }\n for (let bits = (b >> 1) | 0x80, bit = b & 1; ; ) {\n let p = this.mant(0x26), carry = 0;\n if (bit) { p += this.mant(0x6a); carry = p >= 2 ** 32 ? 1 : 0; p %= 2 ** 32; }\n const ov = this.r(FACOV);\n this.w(FACOV, (ov >> 1) | ((p & 1) << 7)); this.setMant(0x26, Math.floor(p / 2) + carry * 2 ** 31);\n bit = bits & 1; bits >>= 1;\n if (!bits) return 1;\n }\n }\n // MULDIV ($BAB7; $BAB9 with A in place of ARG's exponent, `ey`): the exponents added for a product or quotient, and its sign. `zero` when ARG is\n // zero or the sum too small (the FAC zeroed, and the caller done); too large is an overflow. An\n // exponent of exactly 0 goes on, its sign 0, the caller working the mantissa out all the same.\n // `c` the carry it leaves, which a product begins with.\n muldiv(ey = this.r(ARG)) {\n if (!ey) { this.zero(); return { zero: true }; }\n const sum = ey + this.r(FAC), low = sum & 0xff;\n if (sum < 256 && low < 0x80) { this.zero(); return { zero: true }; }\n if (sum >= 256 && (low & 0x80)) throw overflow();\n const e = (low + 0x80) & 0xff, c = sum < 256 ? 1 : 0;\n this.w(FAC, e);\n this.w(0x66, e ? this.r(ARISGN) : 0);\n return { zero: false, c };\n }\n // FDIV ($BB0F, memory divided by the FAC; $BB12, ARG by the FAC): the FAC rounded first, then\n // 34 bits of quotient by subtracting, 32 as the mantissa and two as the low bits' top\n fdiv(at) { this.conupk(at); return this.fdivt(); }\n fdivt() {\n if (!this.r(FAC)) throw new FloatError(0x14); // DIVISION BY ZERO\n this.round();\n this.w(FAC, (0 - this.r(FAC)) & 0xff);\n if (this.muldiv().zero) return { a: 0 };\n const e = this.r(FAC) + 1; if (e > 255) throw overflow();\n this.w(FAC, e);\n let a = this.mant(0x6a), carry = 0, q = 0;\n const f = this.mant(0x62);\n for (let i = 0; i < 34; i++) {\n const bit = carry || a >= f ? 1 : 0;\n if (bit) a = (a - f + 2 ** 32) % 2 ** 32;\n q = q * 2 + bit;\n carry = a >= 2 ** 31 ? 1 : 0; a = (a * 2) % 2 ** 32;\n }\n this.setMant(0x6a, a);\n this.w(FACOV, (q % 4) << 6); this.setMant(0x62, Math.floor(q / 4));\n return this.normal();\n }\n\n // ---- whole numbers ----\n\n // QINT ($BC9B): the FAC as a 32-bit whole number in $62 to $65, two's complement, its fraction\n // shifted out (so, for a negative, the next whole number down); $68 0 after\n qint() {\n if (!this.r(FAC)) { for (const r of [0x62, 0x63, 0x64, 0x65]) this.w(r, 0); return { a: 0, y: 0 }; }\n const a = (this.r(FAC) - 0xa0) & 0xff;\n if (this.r(0x66) & 0x80) { this.w(BITS, 0xff); this.complement(); }\n if (((a - 0xf9) & 0xff) & 0x80) this.shift(FAC, a, 0);\n else {\n // (under a byte: the first shift brings the sign in at the top, the rest keep it)\n const m = this.mant(0x62);\n this.setMant(0x62, Math.floor(m / 2) + ((this.r(0x66) & 0x80) ? 2 ** 31 : 0));\n this.bitShift(FAC, (a + 1) & 0xff, 0, true);\n }\n this.w(BITS, 0);\n return { y: 0 };\n }\n // INT ($BCCC): the FAC's whole part, the next whole number down, as a number again\n int() {\n if (this.r(FAC) >= 0xa0) return { a: this.r(FAC) };\n this.qint();\n this.w(FACOV, 0);\n const s = this.r(0x66); this.w(0x66, 0);\n return this.float32(s);\n }\n // ($BCDB) a 32-bit two's complement whole number in $62 to $65 as a number: negative when A's top\n // bit is set, as INT and Blitz! enter it; $07 its lowest byte, as the ROM keeps it\n float32(a) {\n this.w(FAC, 0xa0); this.w(0x07, this.r(0x65));\n if (a & 0x80) this.negate();\n return this.normal();\n }\n}\n\n// (the methods for building a number from its digits, FIN's: basic-rom.js)\nObject.assign(Floats.prototype, {\n // MUL10 ($BAE2): the FAC ten times, as the ROM does it: ARG the FAC (rounded), then ($BAED) with\n // the exponent two more: five times it, doubled\n mul10() {\n this.movaf();\n const e = this.r(FAC);\n if (!e) return { a: 0 };\n if (e + 2 > 255) throw overflow();\n return this.addDoubled(e + 2);\n },\n // ($BAED) ARG added to the FAC with its exponent `a`, then doubled: FADDT entered at $B877 as if\n // ARG's exponent were `a` (one or two more than its own: ARG the FAC, it is three or five times\n // it), the FAC shifted right by the difference and ARG added, and the exponent one more\n addDoubled(a) {\n const by = (this.r(ARG) - a) & 0xff;\n this.w(ARISGN, 0);\n this.w(FAC, a); this.w(0x66, this.r(0x6e)); this.w(ARGOV, 0);\n const low = this.bitShift(FAC, by, this.r(FACOV), false) + this.r(ARGOV), m = this.mant(0x62) + this.mant(0x6a) + (low > 255 ? 1 : 0);\n this.w(FACOV, low); this.setMant(0x62, m % 2 ** 32);\n if (m >= 2 ** 32) this.carryIn(1);\n const e2 = this.r(FAC) + 1; if (e2 > 255) throw overflow();\n this.w(FAC, e2);\n return { a: e2 };\n },\n // DIV10 ($BAFE): the FAC a tenth: ARG the FAC (rounded), the FAC 10 (the ROM's constant at $BAF9),\n // the signs' EOR 0, and ARG divided by it\n div10() { this.movaf(); return this.divInto(0xbaf9, 0); },\n // ($BB07) ARG divided by a number in memory: the signs' EOR `sign` (X), the FAC the number, FDIVT\n divInto(at, sign) { this.w(ARISGN, sign); this.movfm(at); return this.fdivt(); },\n // ($BC3C) a byte, 0 to 127, as a number in the FAC (a digit, for FIN)\n byte(v) {\n this.w(0x62, v); this.w(0x63, 0);\n for (const at of [0x64, 0x65, FACOV, 0x66]) this.w(at, 0);\n this.w(FAC, 0x88);\n if (v & 0x80) this.negate();\n return this.normal();\n },\n // ($BD7E) a digit added to the FAC: ARG the FAC (rounded), the FAC the digit, and FADDT\n addDigit(d) { this.movaf(); this.byte(d); this.w(ARISGN, this.r(0x6e) ^ this.r(0x66)); return this.faddt(); },\n // ---- the series and the functions on them ----\n\n // POLY2 ($E059, the table's address in $71/$72): the FAC, x, kept at $5C (rounded), then from the\n // table's count and coefficients, highest first, x times each and the next added (Horner's)\n poly2(at) { this.w(0x71, at); this.w(0x72, at >> 8); return this.poly(); },\n poly() {\n this.movmf(0x5c);\n let p = this.r(0x71) | this.r(0x72) << 8;\n this.w(0x67, this.r(p)); p++; this.w(0x71, p); this.w(0x72, p >> 8);\n for (let from = p; ; from = 0x5c) {\n this.fmult(from);\n p = (this.r(0x71) | this.r(0x72) << 8) + 5; this.w(0x71, p); this.w(0x72, p >> 8);\n this.fadd(p);\n this.w(0x67, this.r(0x67) - 1); if (!this.r(0x67)) return { a: this.r(FAC) };\n }\n },\n // POLY1 ($E043): a series of x squared, x kept at $57, times x\n poly1(at) { this.w(0x71, at); this.w(0x72, at >> 8); this.movmf(0x57); this.fmult(0x57); this.poly(); return this.fmult(0x57); },\n // LOG ($B9EA): ILLEGAL QUANTITY for zero or less; the exponent kept, less 128 (SIGN's carry\n // clear), the mantissa as a number from a half to one, and log2 of that from LOG's series of\n // (sqrt 2 / (x + sqrt .5)), from 1; the exponent added (as $BD7E adds a digit), times log 2\n log() {\n if (this.sign() !== 1) throw new FloatError(0x0e);\n const n = (this.r(FAC) - 0x80) & 0xff;\n this.w(FAC, 0x80);\n this.fadd(0xb9d6); this.fdiv(0xb9db); this.fsub(0xb9bc); this.poly1(0xb9c1); this.fadd(0xb9e0);\n this.addDigit(n);\n return this.fmult(0xb9e5);\n },\n // EXP ($BFED, `c` the carry it is entered with): the FAC over log 2; its low bits rounded in, a\n // carry from $70 + $50 (and the carry FMULT leaves: clear for a product, as entered for a zero)\n // the mantissa one more; past 2^7 an overflow, or 0 for a negative; the whole part (INT, $07\n // its low byte) and the fraction, from the swapped FAC and ARG; EXP's series of the fraction, and\n // 2 to the whole part, by MULDIV with that exponent ($BAB9)\n exp(c = 0) {\n const ex = this.r(FAC);\n this.fmult(0xbfbf);\n if (ex && this.r(FAC)) c = 0;\n else if (ex) { const sum = 0x81 + ex; c = sum < 256 && (sum & 0xff) < 0x80 ? 0 : 1; }\n const s = this.r(FACOV) + 0x50 + c;\n if (s > 255) { const m = this.mant(0x62) + 1; this.setMant(0x62, m % 2 ** 32); if (m >= 2 ** 32) this.carryIn(1); }\n this.w(ARGOV, s);\n this.movef();\n const tooBig = () => { if (!(this.r(0x66) & 0x80)) throw overflow(); return this.zero(); };\n if (this.r(FAC) >= 0x88) return tooBig();\n this.int();\n const a = (this.r(0x07) + 0x81) & 0xff;\n if (!a) return tooBig();\n for (let k = 0; k < 6; k++) { const v = this.r(ARG + k); this.w(ARG + k, this.r(FAC + k)); this.w(FAC + k, v); }\n this.w(FACOV, this.r(ARGOV));\n this.fsubt(); this.negop();\n this.poly2(0xbfc4);\n this.w(ARISGN, 0);\n const e = (a - 1) & 0xff;\n if (!e) return this.zero();\n this.muldiv(e);\n return { a: 0 };\n },\n // FPWRT ($BF7B, ARG to the power of the FAC; `z` the Z flag it is entered with, set for a power\n // of 0, `c` the carry): EXP(0) for that; 0 for a base of 0; the power kept at $4E; a negative base\n // only to a whole power, its sign then dropped (as FCOMP's Y, 4, for the FAC's) and the power's\n // low bit kept (in $07): EXP of the power times LOG of the base, negated for an odd power. (A\n // power not whole is FCOMP's answer for the sign, its Y for the oddness: an ILLEGAL QUANTITY,\n // unless INT, from the ROM's fill byte $68, made the power more.)\n fpwrt(z, c) {\n if (z) return this.exp(c);\n if (!this.r(ARG)) { this.w(FAC, 0); this.w(0x66, 0); return { a: 0 }; }\n this.movmf(0x4e);\n let sign = this.r(0x6e), odd = 0;\n if (sign & 0x80) {\n this.int();\n const { a, y } = this.compare(0x4e);\n if (a) { sign = a; odd = y & 1; } else { sign = y; odd = this.r(0x07) & 1; }\n }\n this.w(0x66, sign); for (let i = 5; i >= 1; i--) this.w(0x60 + i, this.r(0x68 + i)); this.w(FACOV, 0);\n this.log(); this.fmult(0x4e);\n this.exp(0);\n if (odd && this.r(FAC)) this.w(0x66, this.r(0x66) ^ 0xff);\n return { a: this.r(FAC) };\n },\n // SIN ($E26B): the FAC over two pi; its fraction, from a quarter, and folded (a negative a half\n // on, and if then positive, the TAN's flag at $12 turned over), a quarter on, its sign back; and\n // SIN's series. COS ($E264): a half pi on, then SIN.\n sin() {\n this.movaf(); this.divInto(0xe2e5, this.r(0x6e));\n this.movaf(); this.int(); this.w(ARISGN, 0); this.fsubt(); this.fsub(0xe2ea);\n const s = this.r(0x66);\n if (!(s & 0x80)) this.negop();\n else { this.fadd(0xbf11); if (!(this.r(0x66) & 0x80)) { this.w(0x12, this.r(0x12) ^ 0xff); this.negop(); } }\n this.fadd(0xe2ea);\n if (s & 0x80) this.negop();\n return this.poly1(0xe2ef);\n },\n cos() { this.fadd(0xe2e0); return this.sin(); },\n // FOUT ($BDDD): the FAC as text at $0100, a zero after, as Microsoft's FOUT writes it (its\n // source's steps, BASIC-M6502): its sign or a space at $0100; the number brought\n // between 99999999.9 and 999999999 by tens, $5D counting them; a half added, as a whole number;\n // its nine digits counted out by adding the powers of ten, each in turn, the point placed among\n // them; the zeros at the end taken off, and the exponent ($5E) last. $71 where it writes, $47\n // where it is in the table. A and Y the text's address.\n fout() {\n const buf = (y, v) => this.w(0xff + y, v);\n let y = 1;\n buf(y, this.r(0x66) & 0x80 ? 0x2d : 0x20);\n this.w(0x66, this.r(0xff + y)); this.w(0x71, y); y++;\n if (!this.r(FAC)) { buf(y, 0x30); buf(y + 1, 0); return { a: 0x00, y: 0x01 }; }\n let a = 0;\n if (this.r(FAC) <= 0x80) { this.fmult(0xbdbd); a = 0xf7; }\n this.w(0x5d, a);\n // (between the bounds: smaller by tens, or bigger; the half not added when it is exactly the top)\n let step = 'FOUT4';\n for (;;) {\n if (step === 'FOUT4') {\n const c = this.fcomp(0xbdb8);\n if (c === 0) { step = 'BIGGES'; break; }\n step = c === 1 ? 'FOUT9' : 'FOUT3';\n } else if (step === 'FOUT3') {\n const c = this.fcomp(0xbdb3);\n if (c === 1) { step = 'FOUT5'; break; }\n this.mul10(); this.w(0x5d, (this.r(0x5d) - 1) & 0xff);\n step = this.r(0x5d) ? 'FOUT3' : 'FOUT9';\n } else {\n this.div10(); this.w(0x5d, (this.r(0x5d) + 1) & 0xff);\n if (this.r(0x5d)) step = 'FOUT4'; else { step = 'FOUT5'; break; }\n }\n }\n if (step === 'FOUT5') this.fadd(0xbf11);\n this.qint();\n // the form: E notation below 0.01 or from 1E9 ($5E the exponent), else the places before the point\n let x = 1, e;\n a = (this.r(0x5d) + 10) & 0xff;\n if (a & 0x80) e = a - 2;\n else if (a >= 11) e = a - 2;\n else { x = (a - 1) & 0xff; e = 0; }\n this.w(0x5e, e & 0xff); this.w(0x5d, x);\n if (x === 0 || x & 0x80) {\n y = this.r(0x71); y++; buf(y, 0x2e);\n if (x) { y++; buf(y, 0x30); }\n this.w(0x71, y);\n }\n // each digit: a power of ten added, or taken away, until the mantissa's sign turns\n y = 0; x = 0x80;\n for (;;) {\n let c = 0;\n for (const k of [3, 2, 1, 0]) { const v = this.r(0x62 + k) + this.r(0xbf16 + y + k) + c; this.w(0x62 + k, v & 0xff); c = v >> 8; }\n x = (x + 1) & 0xff;\n if (c ? x & 0x80 : !(x & 0x80)) continue;\n a = x;\n if (c) { const v = (a ^ 0xff) + 0x0a + 1; a = v & 0xff; c = v >> 8; }\n a = (a + 0x2f + c) & 0xff;\n y += 4; this.w(0x47, y);\n y = this.r(0x71) + 1; x = a;\n buf(y, a & 0x7f);\n this.w(0x5d, (this.r(0x5d) - 1) & 0xff);\n if (!this.r(0x5d)) { y++; buf(y, 0x2e); }\n this.w(0x71, y);\n y = this.r(0x47);\n x = (x ^ 0xff) & 0x80;\n if (y === 0x24 || y === 0x3c) break;\n }\n // the zeros at the end off, and a point left last; then the exponent\n y = this.r(0x71);\n let ch; do { ch = this.r(0xff + y); y--; } while (ch === 0x30);\n if (ch !== 0x2e) y++;\n let ex = this.r(0x5e);\n if (!ex) { buf(y + 1, 0); return { a: 0x00, y: 0x01 }; }\n let sign = 0x2b;\n if (ex & 0x80) { ex = (0 - ex) & 0xff; sign = 0x2d; }\n buf(y + 2, sign); buf(y + 1, 0x45);\n let hi = 0x2f, c = 1;\n do { hi++; const t = ex - 10 - (1 - c); c = t >= 0 ? 1 : 0; ex = t & 0xff; } while (c);\n buf(y + 4, (ex + 0x3a) & 0xff); buf(y + 3, hi); buf(y + 5, 0);\n return { a: 0x00, y: 0x01 };\n },\n // NEGOP ($BFB4): the FAC's sign turned over, unless it is zero\n negop() { if (this.r(FAC)) this.w(0x66, this.r(0x66) ^ 0xff); return { a: this.r(0x66) }; },\n});\n\n// an overflow, and BASIC's errors by their number in its table (X for its error routine, $A437)\nexport class FloatError extends Error { constructor(x) { super('BASIC error ' + x); this.x = x; } }\nconst overflow = () => new FloatError(0x0f);\n", "// A Commodore BASIC V2 program as text, a line to a line: each line as the 64's own LIST prints it (basic-lang.js\n// list, from its ROM at $A71A, its oddities kept), then as moonbase's listings write PETSCII (petscii.js text: the\n// control characters by their names in braces). A program is lines, each the address of the next line, the line\n// number, then the line, ending in a zero; two zeros end it. `lower`: the letters as the second character set\n// shows them.\n//\n// listing(bytes, { lower }) the program's text (its bytes after the load address)\nimport { list } from './basic-lang.js';\nimport { text } from './petscii.js';\n\nexport function listing(bytes, { lower = false } = {}) {\n const lines = [];\n for (let at = 0; at + 4 <= bytes.length && (bytes[at] | bytes[at + 1] << 8); ) {\n const number = bytes[at + 2] | bytes[at + 3] << 8;\n let end = at + 4;\n while (end < bytes.length && bytes[end]) end++;\n lines.push(number + ' ' + text(list(bytes.subarray(at + 4, end)), { lower }));\n at = end + 1;\n }\n return lines.join('\\n') + '\\n';\n}\n", "// PETSCII as text that can be typed and read, as moonbase's listings write it: the control\n// characters by their names in braces, {CLR}, {RVS ON}, and any other byte as {$xx}; for game\n// documents and a BASIC page.\n//\n// bytes('{CLR}HELLO', { lower }) the bytes a C64 prints: with lower, the second character\n// set's (a small letter $41 to $5A, a capital $C1 to $DA);\n// without, the first's (letters typed either way, $41 to $5A)\n// text(bytes, { lower }) back again: with lower, the second character set's way\n// ($41 to $5A small letters, $C1 to $DA capitals)\n\nexport const CONTROLS = { WHT: 0x05, 'DISABLE SHIFT': 0x08, 'ENABLE SHIFT': 0x09, RETURN: 0x0d, LOWER: 0x0e, DOWN: 0x11, 'RVS ON': 0x12, HOME: 0x13, DEL: 0x14,\n RED: 0x1c, RIGHT: 0x1d, GRN: 0x1e, BLU: 0x1f, ORNG: 0x81, F1: 0x85, F3: 0x86, F5: 0x87, F7: 0x88, F2: 0x89, F4: 0x8a, F6: 0x8b, F8: 0x8c,\n UPPER: 0x8e, BLK: 0x90, UP: 0x91, 'RVS OFF': 0x92, CLR: 0x93, INST: 0x94, BRN: 0x95,\n LRED: 0x96, GRY1: 0x97, GRY2: 0x98, LGRN: 0x99, LBLU: 0x9a, GRY3: 0x9b, PUR: 0x9c, LEFT: 0x9d, YEL: 0x9e, CYN: 0x9f, 'SHIFT SPACE': 0xa0, PI: 0xff };\nconst NAMES = Object.fromEntries(Object.entries(CONTROLS).map(([n, b]) => [b, n]));\n\nexport function bytes(t, { lower = false } = {}) {\n const out = [];\n for (let k = 0; k < t.length; k++) {\n const c = t[k];\n if (c === '{') {\n const end = t.indexOf('}', k), name = t.slice(k + 1, end);\n if (end < 0) throw new Error('a { with no }: ' + t);\n const n = /^\\$([0-9A-F]{2})$/i.exec(name) ? parseInt(name.slice(1), 16) : CONTROLS[name.toUpperCase()];\n if (n === undefined) throw new Error(`no control character {${name}}`);\n out.push(n); k = end; continue;\n }\n const v = c.charCodeAt(0);\n if (c === '\u00A3') out.push(0x5c);\n else if (c === '\u2191') out.push(0x5e);\n else if (c === '\u2190') out.push(0x5f);\n else if (c === '\u03C0') out.push(0xff);\n else if (v >= 0x61 && v <= 0x7a) out.push(v - 0x20);\n else if (lower && v >= 0x41 && v <= 0x5a) out.push(v + 0x80);\n else out.push(v & 0xff);\n }\n return out;\n}\n\nexport function text(b, { lower = false } = {}) {\n let out = '';\n for (const v of b) {\n if (lower && v >= 0x41 && v <= 0x5a) out += String.fromCharCode(v + 0x20);\n else if (lower && v >= 0xc1 && v <= 0xda) out += String.fromCharCode(v - 0x80);\n else if (v === 0x0d) out += '\\r';\n else if (v >= 0x20 && v < 0x5b || v === 0x5d) out += String.fromCharCode(v);\n else if (v === 0x5c) out += '\u00A3';\n else if (v === 0x5e) out += '\u2191';\n else if (v === 0x5f) out += '\u2190';\n else if (v === 0x5b) out += '[';\n else out += `{${NAMES[v] ?? '$' + v.toString(16).toUpperCase().padStart(2, '0')}}`;\n }\n return out;\n}\n", "// BASIC's ROM, moonbase's own: the routines of Commodore BASIC that a program's machine code calls,\n// answered at their addresses, as the ROM's would leave the registers and memory. Shared by every\n// layer that runs such code: the original on moonbase's ROMs (rom.js, on the 6510) and a remake\n// (on its stand-in for the processor), as kernal.js is for the KERNAL. Its rules for numbers are\n// numbers.js's, its arithmetic float.js's.\n//\n// install({ cpu, read, write, evaluate, chrout })\n// cpu a processor, or a stand-in for one: its registers, and `hooks`, which this fills\n// read, write memory as the processor sees it\n// evaluate the expression in BASIC's text at an address: { value, end, place }, its value (a\n// number or a string), where it ends, and for a string written in the text, where\n// its characters are. The remake takes its compiled parameters' (compiled with\n// the program, basic-compile.js); the original reads the text and BASIC's\n// variables in memory.\n// chrout CHROUT, a character in A to the output (the KERNAL's $FFD2 unless given)\n//\n// A routine that returns from its caller too (`'return'`: $E206, at a statement's end) leaves\n// that to the layer running it.\nimport { BasicError, ERRORS } from './numbers.js';\nimport { setFac, Floats, FloatError, unpack } from './float.js';\nimport { Basic } from './basic.js';\nimport { expression } from './basic-lang.js';\nimport { evaluator } from './basic-compile.js';\nimport { seedRandom, nextRandom } from './numbers.js';\n\nconst hex4 = n => n.toString(16).toUpperCase().padStart(4, '0');\nconst FAC_EXP = 0x61;\n// BASIC's functions' routines, SGN to MID$, as its table at $A052 holds them\nconst FUNCTIONS = [0xbc39, 0xbccc, 0xbc58, 0x0310, 0xb37d, 0xb39e, 0xbf71, 0xe097, 0xb9ea, 0xbfed, 0xe264, 0xe26b, 0xe2b4, 0xe30e,\n 0xb80d, 0xb77c, 0xb465, 0xb7ad, 0xb78b, 0xb6ec, 0xb700, 0xb72c, 0xb737];\n\nexport function install({ cpu, read, write, evaluate, chrout = c => cpu.hooks.get(0xffd2)(c) }) {\n // BASIC's text pointer ($7A), and what it reads there: CHRGOT ($0079) and CHRGET ($0073) as\n // BASIC's text pointer reads, spaces passed over, Z at a statement's end, C clear for a digit\n const txt = () => read(0x7a) | read(0x7b) << 8, setTxt = a => { write(0x7a, a & 0xff); write(0x7b, a >> 8 & 0xff); };\n const syntax = () => { throw new BasicError('?SYNTAX ERROR'); };\n const chrgot = c => { let a = txt(); while (read(a) === 0x20) a++; setTxt(a); const v = read(a); c.a = v; c.z = v === 0 || v === 0x3a ? 1 : 0; c.c = v >= 0x30 && v <= 0x39 ? 0 : 1; c.n = v >> 7; };\n const chkcom = c => { chrgot(c); if (c.a !== 0x2c) syntax(); setTxt(txt() + 1); chrgot(c); };\n // the expression at the text pointer: a number into the accumulator ($0D 0, numeric), a string\n // as BASIC's descriptor at $19 ($0D $FF, string)\n let last = 0;\n const frm = (c, number) => {\n chrgot(c);\n const at = txt(), { value, end, place } = evaluate(at);\n if (typeof value === 'string') {\n if (number) throw new BasicError('?TYPE MISMATCH ERROR');\n if (place === undefined) throw new Error('a string parameter not in the text, at $' + hex4(at) + ': not handled');\n write(0x19, value.length); write(0x1a, place & 0xff); write(0x1b, place >> 8); write(0x64, 0x19); write(0x65, 0); write(0x0d, 0xff);\n } else { last = value; write(0x0d, 0); setFac({ read, write }, value); }\n setTxt(end); chrgot(c);\n };\n const whole = (lo, hi) => { if (last !== Math.floor(last) || last < lo || last > hi) throw new BasicError('?ILLEGAL QUANTITY ERROR'); return last; };\n const getbyt = c => { frm(c, true); c.x = whole(0, 255); };\n // (A left as the last character out, as the ROM's leave it)\n const out = ch => { cpu.a = ch; chrout(cpu); };\n const H = {\n 0x79: chrgot, 0x73: c => { setTxt(txt() + 1); chrgot(c); },\n // CHKCOM ($AEFD), FRMNUM ($AD8A), FRMEVL ($AD9E), GETADR ($B7F7), GETBYT ($B79E); FRESTR's below ($B6A3)\n 0xaefd: chkcom, 0xad8a: c => frm(c, true), 0xad9e: c => frm(c, false),\n 0xb7f7: c => { const x = whole(0, 65535); write(0x14, x & 0xff); write(0x15, x >> 8); c.y = x & 0xff; c.a = x >> 8; },\n 0xb79e: getbyt,\n // the LOAD and OPEN parameters': $E200 a comma and a byte, $E206 the statement's end, which\n // returns from its caller, $E20E a comma and more\n 0xe200: c => { chkcom(c); getbyt(c); },\n 0xe206: c => { chrgot(c); if (c.z) return 'return'; },\n 0xe20e: c => { chkcom(c); if (c.z) syntax(); },\n // STROUT ($AB1E), the text at A/Y to its 0; the screen cleared ($E544) and a line of it ($E9FF)\n 0xab1e: c => { for (let a = c.a | c.y << 8, k = 0; read(a + k) && k < 256; k++) out(read(a + k)); },\n 0xe544: () => out(0x93),\n 0xe9ff: c => { const at = (read(0x288) << 8) + c.x * 40; for (let k = 0; k < 40; k++) { write(at + k, 0x20); write(0xd800 + c.x * 40 + k, read(0x286)); } },\n };\n // ---- the routines Blitz!'s runtime calls (Goldfields' GAME), on the original only ----\n\n // ($B194) where an array's elements begin, its header ($5F) and two bytes for each of its\n // dimensions ($0B) past it: $58/$59, and A/Y\n H[0xb194] = c => {\n let t = read(0x0b) << 1, carry = t >> 8; t &= 0xff;\n t += 5 + carry; carry = t >> 8; t &= 0xff;\n t += read(0x5f) + carry; carry = t >> 8; t &= 0xff;\n let y = read(0x60); if (carry) y = (y + 1) & 0xff;\n write(0x58, t); write(0x59, y); c.a = t; c.y = y; c.c = carry;\n const flag = carry ? y : t; c.z = flag ? 0 : 1; c.n = flag >> 7;\n };\n // REASON ($A408): whether the address in A/Y is below the strings' bottom (FRETOP, $33), the\n // flags as the comparison leaves them (C clear); if not, the strings collected (GARBAG, $B526)\n // and the comparison again, its registers kept across it; and if still not, OUT OF MEMORY\n const below = (a, y) => { const top = read(0x34); if (y !== top) return y < top; return a < read(0x33); };\n const compare = (c, a, y) => { const top = read(0x34), v = y !== top ? y - top : a - read(0x33); c.c = v >= 0 ? 1 : 0; c.z = (v & 0xff) ? 0 : 1; c.n = v >> 7 & 1; };\n H[0xa408] = c => {\n const { a, y } = c;\n if (below(a, y)) return compare(c, a, y);\n const kept = []; for (let k = 0x57; k <= 0x60; k++) kept.push(read(k));\n H[0xb526](c);\n kept.forEach((v, k) => write(0x57 + k, v));\n Object.assign(c, { a, y });\n if (below(a, y)) return compare(c, a, y);\n throw new BasicError('?OUT OF MEMORY ERROR');\n };\n // UMULT ($B34C): an array's index ($71/$72) times its dimension's size, read from its header at\n // ($5F)+Y (the low byte) and Y-1 (the high), into X/Y (A the high byte too); past 16 bits is OUT\n // OF MEMORY. $71/$72 are shifted out to 0, $5D counted down to 0, as the ROM leaves them.\n H[0xb34c] = c => {\n write(0x22, c.y);\n const base = read(0x5f) | read(0x60) << 8, size = read(base + c.y) | read(base + ((c.y - 1) & 0xff)) << 8;\n write(0x28, size & 0xff); write(0x29, size >> 8);\n const index = read(0x71) | read(0x72) << 8, product = index * size;\n // (the ROM's own test: a shift or a sum carrying out of 16 bits on the way, which for a\n // product past 16 bits it always meets)\n if (product > 0xffff) throw new BasicError('?OUT OF MEMORY ERROR');\n write(0x71, 0); write(0x72, 0); write(0x5d, 0);\n Object.assign(c, { x: product & 0xff, y: product >> 8, a: product >> 8, c: 0, z: 1, n: 0 });\n };\n // ($B2AA) DIM's end: the array's elements, A/X bytes of them (high, low) from $58/$59, past the\n // end of memory OUT OF MEMORY; then REASON for its end, the arrays' end (STREND, $31) there,\n // its elements cleared to 0 (a page at a time down from the last, as the ROM does), and its\n // length into its header, at ($5F)+2. DIM's flag ($0C) set, back to DIM; an array made by its\n // first use, which goes on to find its element, is not handled (an error).\n H[0xb2aa] = c => {\n const start = read(0x58) | read(0x59) << 8;\n let hi = c.a + read(0x59) + c.c;\n if (hi > 255) throw new BasicError('?OUT OF MEMORY ERROR');\n write(0x59, hi);\n let lo = c.x + read(0x58);\n if (lo > 255) { lo &= 0xff; hi = (hi + 1) & 0xff; if (!hi) throw new BasicError('?OUT OF MEMORY ERROR'); }\n const kept = { a: c.a, x: c.x };\n Object.assign(c, { a: lo, y: hi }); H[0xa408](c);\n write(0x31, lo); write(0x32, hi);\n const end = lo | hi << 8;\n for (let a = start; a < end; a++) write(a, 0);\n write(0x59, start >> 8); write(0x72, 0);\n const base = read(0x5f) | read(0x60) << 8, length = end - base;\n write(base + 2, length & 0xff); write(base + 3, length >> 8);\n if (!read(0x0c)) throw new Error('an array made by its first use ($B2AA, DIM\\'s flag clear): not handled');\n const f = read(0x0c);\n Object.assign(c, { a: f, x: kept.x, y: 3, c: 1, z: f ? 0 : 1, n: f >> 7 });\n };\n // SYS's own ($E130): a return pushed to $E147, the registers from $030C to $030F (A, X, Y, the\n // flags), and on to the address at $14/$15 (GETADR's), where the machine code runs; and $E147, as\n // it comes back (or as a routine ends that jumps there), the registers kept at $030C again\n H[0xe130] = c => {\n c.push(0xe1); c.push(0x46);\n Object.assign(c, { a: read(0x30c), x: read(0x30d), y: read(0x30e) }); c.p = read(0x30f);\n c.pc = read(0x14) | read(0x15) << 8;\n return false;\n };\n H[0xe147] = c => { write(0x30c, c.a); write(0x30d, c.x); write(0x30e, c.y); write(0x30f, c.p); };\n // The accumulator onto the processor's stack, for the evaluator ($AE38): the caller's return\n // taken into $22/$23, its low byte one on (only the low byte: the ROM's INC carries no further),\n // A pushed (the sign), then ($AE43) the accumulator rounded and its five bytes pushed, the\n // exponent last, and on to the caller at ($22)\n const f = new Floats({ read, write });\n // (a routine called from the ROM's code at `from`, its JSR's return address on the stack for the\n // while, as an observer sees the ROM's own calls)\n const call = (c, at, from) => { const r = from + 2; c.push(r >> 8); c.push(r & 0xff); try { return cpu.hooks.get(at)(c); } finally { c.pull(); c.pull(); } };\n // (the floating point's errors, an overflow or a division by zero, as BASIC's)\n const arith = g => { try { return g(); } catch (err) { if (err instanceof FloatError) throw new BasicError('?' + ERRORS[err.x - 1] + ' ERROR'); throw err; } };\n H[0xae38] = c => {\n const y = c.a, lo = c.pull(), hi = c.pull();\n write(0x22, (lo + 1) & 0xff); write(0x23, hi); c.y = y; c.push(y);\n return H[0xae43](c);\n };\n H[0xae43] = c => {\n f.round();\n for (const at of [0x65, 0x64, 0x63, 0x62, 0x61]) c.push(read(at));\n c.a = read(0x61); c.z = c.a ? 0 : 1; c.n = c.a >> 7;\n c.pc = read(0x22) | read(0x23) << 8;\n return false;\n };\n // The floating point's entries (float.js, each held to the ROM's): the address of a\n // number in memory in A/Y (X/Y for a store, FORPNT $49 for BBD0's, $5C and $57 for BBC7's and\n // BBCA's); A the result's exponent, or the comparison's or the sign's answer, its flags N and Z.\n // An overflow or a division by zero is BASIC's error.\n const ay = c => c.a | c.y << 8, nz = (c, v) => { c.z = v & 0xff ? 0 : 1; c.n = v >> 7 & 1; };\n const floating = (run, regs = () => ({})) => c => {\n const r = arith(() => run(c));\n Object.assign(c, regs(c, r) ?? {});\n nz(c, c.a);\n };\n const A = (c, r) => ({ a: r?.a ?? read(0x61) });\n Object.assign(H, {\n 0xbba2: floating(c => f.movfm(ay(c)), (c, r) => ({ a: r.a, y: 0 })),\n 0xbbd4: floating(c => f.movmf(c.x | c.y << 8), (c, r) => ({ a: r.a, y: 0 })),\n 0xbbd0: floating(c => { c.x = read(0x49); c.y = read(0x4a); return f.movmf(c.x | c.y << 8); }, (c, r) => ({ a: r.a, y: 0 })),\n 0xbbc7: floating(c => { c.x = 0x5c; return f.movmf(0x5c); }, (c, r) => ({ a: r.a, y: 0 })),\n 0xbbca: floating(c => { c.x = 0x57; return f.movmf(0x57); }, (c, r) => ({ a: r.a, y: 0 })),\n 0xbbfc: floating(() => f.movfa(), () => ({ a: read(0x69), x: 0 })),\n 0xbc0c: floating(() => f.movaf(), () => ({ a: read(0x61), x: 0 })),\n 0xbc0f: floating(() => f.movef(), () => ({ a: read(0x61), x: 0 })),\n 0xbc1b: floating(() => f.round(), () => ({ a: read(0x61) })),\n 0xbc2b: floating(() => ({ a: f.sign() }), (c, r) => ({ a: r.a, c: read(0x66) >> 7 })),\n 0xbc5b: floating(c => f.compare(ay(c)), (c, r) => r),\n 0xbc5d: floating(c => f.compare(read(0x24) | c.y << 8), (c, r) => r),\n 0xb867: floating(c => f.fadd(ay(c)), A), 0xb86a: floating(() => f.faddt(), A),\n 0xb850: floating(c => f.fsub(ay(c)), A), 0xb853: floating(() => f.fsubt(), A),\n 0xba28: floating(c => f.fmult(ay(c)), A), 0xba2b: floating(() => f.fmultt(), A),\n 0xbb0f: floating(c => f.fdiv(ay(c)), A), 0xbb12: floating(() => f.fdivt(), A),\n 0xbccc: floating(() => f.int(), A), 0xbc9b: floating(() => f.qint(), () => ({ y: 0 })),\n // ($BCDB) a 32-bit whole number in $62 to $65 as a number, negative when A's top bit is set,\n // as INT enters it and Blitz! does\n 0xbcdb: floating(c => f.float32(c.a), A),\n // the functions on the series: LOG, EXP, the power (entered past its test of the FAC, at $BF7B,\n // its Z flag that test's), SQR (a half's power), SIN and COS\n 0xb9ea: floating(() => f.log(), A), 0xbfed: floating(c => f.exp(c.c), A),\n 0xbf7b: floating(c => f.fpwrt(c.z, c.c), A), 0xbf71: floating(c => { f.movaf(); f.movfm(0xbf11); return f.fpwrt(0, c.c); }, A),\n 0xe26b: floating(() => f.sin(), A), 0xe264: floating(() => f.cos(), A),\n });\n // RND ($E097): the next of the seed's numbers (numbers.js, the remake's own) into the\n // accumulator, whatever RND's argument; A its exponent, so that the original and the remake draw\n // the same numbers.\n let randomState = null;\n H[0xe097] = c => {\n randomState = nextRandom(randomState ?? seedRandom(0x11));\n setFac({ read, write }, randomState / 2 ** 32);\n c.a = read(0x61); nz(c, c.a);\n };\n // ($BF04) FOUT's end, which Blitz! calls to end a number's text: A at $00FF+Y, a 0 after it, and\n // the text's address, $0100, in A/Y\n H[0xbf04] = c => { write(0xff + c.y, c.a); write(0x100 + c.y, 0); Object.assign(c, { a: 0, y: 1, z: 0, n: 0 }); };\n // FIN ($BCF3): the number in BASIC's text at its pointer, read with CHRGET, into the FAC, A its\n // first character and C clear for a digit, as CHRGOT leaves them. As the ROM builds it (each\n // step float.js's): $5D to $67 cleared, the FAC with them; a sign; each digit the FAC ten\n // times and the digit added, those after the point counted ($5D); a second point the end; an E,\n // its sign ($60) and its digits ($5E), capped at 100 when negative and an overflow past 9 when\n // not; then ten times or a tenth for each power left, and the sign last.\n H[0xbcf3] = c => {\n for (let x = 0x0a; x >= 0; x--) write(0x5d + x, 0);\n const next = () => H[0x73](c), digit = () => !c.c;\n if (!digit()) {\n if (c.a === 0x2d) { write(0x67, 0xff); next(); }\n else if (c.a === 0x2b) next();\n }\n let power;\n for (;;) {\n if (digit()) {\n const ch = c.a;\n if (read(0x5f) & 0x80) write(0x5d, read(0x5d) + 1);\n arith(() => { f.mul10(); f.addDigit(ch - 0x30); });\n next(); continue;\n }\n if (c.a === 0x2e) {\n write(0x5f, (read(0x5f) >> 1) | 0x80);\n if (read(0x5f) & 0x40) { power = read(0x5e); break; }\n next(); continue;\n }\n if (c.a === 0x45) {\n next();\n if (c.c && (c.a === 0xab || c.a === 0x2d)) { write(0x60, (read(0x60) >> 1) | 0x80); next(); }\n else if (c.c && (c.a === 0xaa || c.a === 0x2b)) next();\n while (digit()) {\n const e = read(0x5e);\n if (e >= 10) { if (!(read(0x60) & 0x80)) throw new BasicError('?OVERFLOW ERROR'); write(0x5e, 100); }\n else write(0x5e, e * 10 + c.a - 0x30);\n next();\n }\n power = read(0x60) & 0x80 ? (0 - read(0x5e)) & 0xff : read(0x5e);\n break;\n }\n power = read(0x5e); break;\n }\n let n = (power - read(0x5d)) & 0xff; write(0x5e, n);\n if (n && n < 0x80) for (; n; n = (n - 1) & 0xff) { arith(() => f.mul10()); write(0x5e, n - 1); }\n else if (n) for (; n; n = (n + 1) & 0xff) { arith(() => f.div10()); write(0x5e, (n + 1) & 0xff); }\n if (read(0x67) & 0x80) f.negop();\n c.a = read(read(0x67) & 0x80 ? 0x66 : 0x67); nz(c, c.a);\n };\n // TI ($AF7B): the clock read (RDTIM, $FFDE: A, X, Y its low, middle and high bytes) as a 24-bit\n // whole number in the FAC ($62 0, $63 to $65 the clock), exponent $A0, its low bits and sign 0,\n // then normalised; as the ROM goes on through $B8D2, a carry clear on entry has it negated first\n // ($AF84) the clock (RDTIM) into the FAC's mantissa, $63 to $65, $62 0; Y 0\n const clock = c => { call(c, 0xffde, 0xaf84); write(0x64, c.x); write(0x63, c.y); write(0x65, c.a); write(0x62, 0); c.y = 0; };\n H[0xaf7b] = c => {\n const carry = c.c;\n clock(c);\n write(FAC_EXP, 0xa0); write(0x70, 0); write(0x66, 0);\n if (!carry) f.negate();\n const r = f.normal(); Object.assign(c, { a: r.a, y: 0 }); nz(c, c.a);\n };\n // WAIT's loop ($B83C, X the bits to flip, $49 the mask, $14 the address): at $B840, the address\n // read until its bits, flipped, meet the mask; the machine goes on meanwhile, as the ROM's loop\n // does\n H[0xb83c] = c => { write(0x4a, c.x); c.y = 0; c.pc = 0xb840; return false; };\n H[0xb840] = c => {\n const v = (read((read(0x14) | read(0x15) << 8) + c.y) ^ read(0x4a)) & read(0x49);\n if (!v) return 'wait';\n c.a = v; nz(c, v);\n };\n // FREFAC ($B6A6): the string whose descriptor is at $64/$65, its length in A, its characters'\n // address in $22/$23 (X/Y); its descriptor let go if it is the last temporary one (FRETMS,\n // $B6DB: $16 and $17 three back), and its characters too if they are the strings' bottom\n // (FRETOP, $33, moved up past them)\n H[0xb6a6] = c => {\n const at = read(0x64) | read(0x65) << 8;\n write(0x22, at & 0xff); write(0x23, at >> 8);\n const freed = H[0xb6db]({ a: at & 0xff, y: at >> 8 });\n const len = read(at), x = read(at + 1), y = read(at + 2);\n if (freed && y === read(0x34) && x === read(0x33)) { const top = read(0x33) + len; write(0x33, top & 0xff); if (top > 255) write(0x34, read(0x34) + 1); }\n write(0x22, x); write(0x23, y);\n Object.assign(c, { a: len, x, y }); nz(c, len);\n };\n H[0xb6db] = c => {\n if (c.y !== read(0x18) || c.a !== read(0x17)) { c.z = 0; return false; }\n write(0x16, c.a); write(0x17, (c.a - 3) & 0xff); c.y = 0; c.z = 1;\n return true;\n };\n // ($AFD5) a function's call, the evaluator's: A its token times two, its routine's address from\n // BASIC's table ($A052) into JMPER's ($55/$56) and called there; then CHKNUM ($AD8D), its\n // result a number or TYPE MISMATCH\n H[0xafd5] = c => {\n const to = FUNCTIONS[(c.a - 0x68) >> 1];\n if (to === undefined || c.a & 1) throw new Error('a function at $' + hex4(0x9fea + c.a) + ' ($AFD5): not handled');\n write(0x55, to & 0xff); write(0x56, to >> 8);\n c.y = c.a; c.push(0xaf); c.push(0xe2); c.pc = to;\n return false;\n };\n H[0xafe3] = c => { const t = read(0x0d); if (t & 0x80) throw new BasicError('?TYPE MISMATCH ERROR'); c.n = 1 & t >> 7; c.v = 1 & t >> 6; c.z = c.a & t ? 0 : 1; };\n // VAL's own ($B7B0), past LEN's start ($B782: A the string's length, $22/$23 its characters):\n // none, the FAC 0 ($B8F7); else the text pointer kept at $71/$72 and moved to the string, a 0\n // put past its end ($24/$25) for the while, and FIN; then the byte and the pointer back\n H[0xb7b0] = c => {\n if (!c.a) { write(FAC_EXP, 0); write(0x66, 0); c.a = 0; c.z = 1; c.n = 0; return; }\n const from = read(0x22) | read(0x23) << 8, end = from + c.a;\n write(0x71, read(0x7a)); write(0x72, read(0x7b));\n setTxt(from); write(0x24, end & 0xff); write(0x25, end >> 8 & 0xff);\n const kept = read(end); write(end, 0);\n H[0x79](c); H[0xbcf3](c);\n write(end, kept);\n Object.assign(c, { a: kept, x: read(0x71), y: read(0x72) }); nz(c, c.y);\n setTxt(c.x | c.y << 8);\n };\n // TI$ set ($A9E0, the string evaluated): FREFAC, six characters or ILLEGAL QUANTITY; the FAC 0,\n // then for each pair a character added ($AA1D), ten times, the next added and six times (twice\n // over, then $BAED, unless 0): the time in jiffies over ten, ten times again, QINT, and the\n // clock set (SETTIM, $FFDB) from $65, $64 and $63. A character is a digit for the ROM if it is\n // \"0\" or more, CHRGOT entered past its colon test ($0080); a space goes on to CHRGET itself.\n H[0xa9e0] = c => {\n H[0xb6a6](c);\n if (c.a !== 6) throw new BasicError('?ILLEGAL QUANTITY ERROR');\n write(FAC_EXP, 0); write(0x66, 0);\n const character = y => {\n c.a = read((read(0x22) | read(0x23) << 8) + y);\n if (c.a === 0x20) H[0x73](c); else c.c = c.a >= 0x30 ? 0 : 1;\n if (c.c) throw new BasicError('?ILLEGAL QUANTITY ERROR');\n arith(() => f.addDigit((c.a - 0x30) & 0xff));\n };\n for (let y = 0; y < 6; y += 2) {\n write(0x71, y); character(y); arith(() => f.mul10());\n write(0x71, y + 1); character(y + 1);\n const { a } = f.movaf(); if (a) arith(() => f.addDoubled(a + 1));\n }\n arith(() => f.mul10()); f.qint();\n Object.assign(c, { x: read(0x64), y: read(0x63), a: read(0x65) });\n return cpu.hooks.get(0xffdb)(c);\n };\n // FOUT's digits ($BE68, Y the table's place, $BF16 on): the 32-bit whole number in $62 to $65\n // counted down (or up) by each power until it passes 0, the count a digit, to $00FF on at $71+1\n // (a point after the $5D'th); to Y $24, or $3C (TI$'s). Then ($BEC4) the zeros at the end let go,\n // and a point there, an exponent from $5E, and a 0 after\n const digits = c => {\n let x = 0x80, y = c.y, cy = 0;\n for (;;) {\n do {\n let sum = 0; cy = 0;\n for (let k = 3; k >= 0; k--) { sum = read(0x62 + k) + read(0xbf16 + y + k) + cy; write(0x62 + k, sum); cy = sum >> 8; }\n x = (x + 1) & 0xff;\n } while (cy ? x & 0x80 : !(x & 0x80));\n let a = x;\n if (cy) { const t = (a ^ 0xff) + 0x0a + 1; a = t & 0xff; cy = t >> 8; }\n a = (a + 0x2f + cy) & 0xff;\n y = (y + 4) & 0xff; write(0x47, y);\n let at = (read(0x71) + 1) & 0xff;\n write(0xff + at, a & 0x7f);\n write(0x5d, read(0x5d) - 1);\n if (!read(0x5d)) { at = (at + 1) & 0xff; write(0xff + at, 0x2e); }\n write(0x71, at);\n x = (a ^ 0xff) & 0x80;\n if (y === 0x24 || y === 0x3c) break;\n }\n let at = read(0x71), ch;\n do { ch = read(0xff + at); at = (at - 1) & 0xff; } while (ch === 0x30);\n if (ch !== 0x2e) at = (at + 1) & 0xff;\n let e = read(0x5e);\n if (e) {\n let sign = 0x2b; if (e & 0x80) { e = (0 - e) & 0xff; sign = 0x2d; }\n write(0x101 + at, sign); write(0x100 + at, 0x45);\n write(0x103 + at, 0x30 + e % 10); write(0x102 + at, 0x30 + Math.floor(e / 10)); write(0x104 + at, 0);\n } else write(0x100 + at, 0);\n Object.assign(c, { a: 0, y: 1, z: 0, n: 0 });\n };\n H[0xbe68] = digits;\n // GETSPA ($B4F4): A bytes of the strings' space, down from FRETOP ($33), FRESPC ($35) too, X/Y\n // their address; below STREND ($31), the strings collected first ($0F the flag), then OUT OF\n // MEMORY\n H[0xb4f4] = c => {\n const len = c.a;\n write(0x0f, read(0x0f) >> 1);\n for (;;) {\n const at = r16(0x33) - len;\n if (at >= r16(0x31) && at >= 0) { w16(0x33, at); w16(0x35, at); Object.assign(c, { a: len, x: at & 0xff, y: at >> 8 }); return; }\n if (read(0x0f) & 0x80) throw new BasicError('?OUT OF MEMORY ERROR');\n H[0xb526](c); write(0x0f, 0x80);\n }\n };\n // STRINI ($B475: $50/$51 the descriptor's at $64/$65 kept; $B47D): a string of A bytes made\n // room for, its descriptor in the FAC's $61 to $63\n H[0xb47d] = c => { H[0xb4f4](c); write(0x62, c.x); write(0x63, c.y); write(0x61, c.a); };\n H[0xb475] = c => { write(0x50, read(0x64)); write(0x51, read(0x65)); return H[0xb47d](c); };\n // MOVSTR ($B688): A bytes from X/Y to FRESPC ($35), and FRESPC on past them\n H[0xb688] = c => {\n write(0x22, c.x); write(0x23, c.y);\n const from = c.x | c.y << 8, to = r16(0x35), len = c.a;\n for (let k = len - 1; k >= 0; k--) write(to + k, read(from + k));\n w16(0x35, to + len);\n };\n // PUTNEW ($B4CA): the FAC's descriptor ($61 to $63) pushed on the temporary ones (TEMPPT, $16;\n // full at $22, FORMULA TOO COMPLEX), its address at $64/$65, LASTPT ($17) it, $0D a string\n H[0xb4ca] = c => {\n const x = read(0x16);\n if (x === 0x22) throw new BasicError('?FORMULA TOO COMPLEX ERROR');\n write(x, read(0x61)); write(x + 1, read(0x62)); write(x + 2, read(0x63));\n write(0x64, x); write(0x65, 0); write(0x70, 0); write(0x0d, 0xff); write(0x17, x); write(0x16, x + 3);\n Object.assign(c, { x: x + 3, y: 0xff });\n };\n // STRLIT ($B487, the text at A/Y; $B46F at $00FF, FOUT's): to a 0 or a quote; copied into the\n // strings' space if it is in the zero page or the input buffer (page 0 or 2), else left where it\n // is; and PUTNEW\n H[0xb487] = c => {\n write(0x07, 0x22); write(0x08, 0x22);\n const from = c.a | c.y << 8;\n write(0x6f, c.a); write(0x70, c.y); write(0x62, c.a); write(0x63, c.y);\n let y = 0, quote = 0;\n for (; ; y++) { const ch = read(from + y); if (!ch) break; if (ch === 0x22) { quote = 1; break; } }\n write(0x61, y);\n const end = from + y + quote; write(0x71, end & 0xff); write(0x72, end >> 8 & 0xff);\n if (c.y === 0 || c.y === 2) { c.a = y; H[0xb475](c); Object.assign(c, { a: y, x: from & 0xff, y: from >> 8 }); H[0xb688](c); }\n return H[0xb4ca](c);\n };\n H[0xb46f] = c => { Object.assign(c, { a: 0xff, y: 0 }); return H[0xb487](c); };\n // TI$ ($AF48): the clock, as TI's, counted out to its six digits (hours, minutes, seconds; $5E\n // no exponent, $71 the text's start, a point after the sixth and let go), and a string of them\n H[0xaf48] = c => {\n clock(c);\n write(0x5e, 0); write(0x71, 0xff); write(0x5d, 6);\n c.y = 0x24; digits(c);\n return H[0xb46f](c);\n };\n // ($B248) ILLEGAL QUANTITY, as Blitz! jumps there\n H[0xb248] = () => { throw new BasicError('?ILLEGAL QUANTITY ERROR'); };\n // FRESTR ($B6A3): CHKSTR ($AD8F), a string or TYPE MISMATCH, then FREFAC\n H[0xb6a3] = c => { if (!(read(0x0d) & 0x80)) throw new BasicError('?TYPE MISMATCH ERROR'); return H[0xb6a6](c); };\n // ($E25A) a file's name, the string evaluated: FRESTR, and SETNAM ($FFBD) with it\n H[0xe25a] = c => { H[0xb6a3](c); c.x = read(0x22); c.y = read(0x23); return cpu.hooks.get(0xffbd)(c); };\n // GARBAG ($B526), the strings collected, as the ROM does it, byte for byte: the strings' bottom\n // (FRETOP, $33) at the top of memory (MEMSIZ, $37), then, over and over, the highest string\n // below it still to move found (its address $5F/$60, from STREND $31 up; its descriptor's\n // $4E/$4F, and $55 the step it was found with) among the temporary descriptors ($19 to TEMPPT,\n // $16, a step of $53 as it stands), the variables (VARTAB $2D to ARYTAB $2F, seven bytes each, a\n // string's two name bytes top bit clear then set) and the string arrays' elements (to STREND,\n // three bytes each, past each one's header), and moved up to just under the bottom (BLTUC,\n // $A3BF), its descriptor pointed there, and that the bottom; until none is left\n const r16 = a => read(a) | read(a + 1) << 8, w16 = (a, v) => { write(a, v & 0xff); write(a + 1, v >> 8 & 0xff); };\n // (one descriptor at ($22)+y ($B5C7): a string, below the bottom and above the best so far, the\n // best; then $22 on by the step, $53)\n const candidate = y => {\n const at = r16(0x22);\n if (read(at + y)) {\n const lo = read(at + y + 1), hi = read(at + y + 2);\n const below = hi < read(0x34) || (hi === read(0x34) && lo < read(0x33));\n const above = hi > read(0x60) || (hi === read(0x60) && lo >= read(0x5f));\n if (below && above) { write(0x5f, lo); write(0x60, hi); w16(0x4e, at); write(0x55, read(0x53)); }\n }\n w16(0x22, at + read(0x53));\n };\n // BLTUC ($A3BF): the bytes from $5F/$60 to $5A/$5B moved to end at $58/$59, from the top down,\n // a page at a time, those pointers left as the ROM's loop leaves them\n const bltuc = () => {\n const n = (r16(0x5a) - r16(0x5f)) & 0xffff;\n let y = n & 0xff, x = ((n >> 8) + 1) & 0xff;\n write(0x22, y);\n const copy = k => write(r16(0x58) + k, read(r16(0x5a) + k));\n if (y) { w16(0x5a, r16(0x5a) - y); w16(0x58, r16(0x58) - y); }\n for (let first = true; ; first = false) {\n if (!first || y) { do { y = (y - 1) & 0xff; if (y) copy(y); } while (y); copy(0); }\n write(0x5b, (read(0x5b) - 1) & 0xff); write(0x59, (read(0x59) - 1) & 0xff);\n x = (x - 1) & 0xff; if (!x) break;\n }\n };\n H[0xb526] = c => {\n let bottom = r16(0x37);\n for (;;) {\n w16(0x33, bottom); w16(0x4e, 0); w16(0x5f, r16(0x31));\n for (w16(0x22, 0x19); read(0x22) !== read(0x16);) candidate(0);\n write(0x53, 7);\n for (w16(0x22, r16(0x2d)); r16(0x22) !== r16(0x2f);) {\n const at = r16(0x22);\n if (!(read(at) & 0x80) && read(at + 1) & 0x80) candidate(2); else w16(0x22, at + 7);\n }\n w16(0x58, r16(0x2f));\n write(0x53, 3);\n while (r16(0x58) !== r16(0x31)) {\n const at = r16(0x58); w16(0x22, at);\n // (its length added with the carry the comparison with STREND left, clear below it)\n w16(0x58, at + r16(at + 2) + (at >= r16(0x31) ? 1 : 0));\n if (read(at) & 0x80 || !(read(at + 1) & 0x80)) continue;\n // (past its header: five bytes and two for each dimension, the ROM's sum carrying once only)\n const v = ((read(at + 4) << 1) & 0xff) + 5 + (read(at + 4) >> 7);\n w16(0x22, at + (v & 0xff) + (v >> 8));\n while (r16(0x22) !== r16(0x58)) candidate(0);\n }\n if (!r16(0x4e)) { Object.assign(c, { a: 0, x: read(0x23), y: 0, z: 1, n: 0 }); return; }\n const y = (read(0x55) & 4) >> 1; write(0x55, y);\n w16(0x5a, r16(0x5f) + read(r16(0x4e) + y));\n w16(0x58, r16(0x33));\n bltuc();\n write(r16(0x4e) + y + 1, read(0x58));\n write(0x59, (read(0x59) + 1) & 0xff);\n write(r16(0x4e) + y + 2, read(0x59));\n bottom = r16(0x58);\n }\n };\n for (const [a, f] of Object.entries(H)) cpu.hooks.set(+a, f);\n}\n\n// A BASIC error, as the ROM's routine gives it ($A43A, through the vector at $0300): the output\n// back to the screen (CLRCHN), a new line, ? and the message, ERROR, IN and the \"line\" (for\n// Blitz!'s code its program counter at the instruction that failed), then READY. False if the\n// message is not one of BASIC's.\nexport function printError({ cpu, write }, message, line) {\n const what = /^\\?(.*) ERROR$/.exec(message)?.[1];\n if (!ERRORS.includes(what)) return false;\n const out = ch => { cpu.a = ch; cpu.hooks.get(0xffd2)(cpu); };\n const text = s => { for (const ch of s) out(ch.charCodeAt(0)); };\n cpu.hooks.get(0xffcc)(cpu); write(0x13, 0);\n out(0x0d); out(0x3f); text(what); text(' ERROR');\n if (line !== undefined && line >> 8 !== 0xff) { text(' IN '); text(String(line)); }\n text('\\r\\nREADY.\\r\\n');\n write(0x9d, 0x80);\n return true;\n}\n\n// The evaluator on the original: the expression in BASIC's text at an address read\n// (basic-lang.js), made a function by the compiler's own code (basic-compile.js),\n// and worked out by BASIC's own rules (basic.js's), its variables read where BASIC keeps\n// them: its table from VARTAB ($2D) to ARYTAB ($2F), seven bytes each, two of name (a whole\n// number's both with the top bit set, a string's the second) and five of value (a number's five\n// bytes; a whole number's high and low; a string's length and where it is). RND is the ROM's\n// routine at $E097, called as the ROM's evaluator calls it. Each address's function is kept.\nexport function evaluateInMemory({ cpu, read, write, ram }) {\n const f = new Floats({ read, write }), made = new Map();\n const variable = n => {\n const kind = n.endsWith('%') ? '%' : n.endsWith('$') ? '$' : '', name = kind ? n.slice(0, -1) : n;\n const c1 = name.charCodeAt(0) | (kind === '%' ? 0x80 : 0), c2 = (name.charCodeAt(1) || 0) | (kind ? 0x80 : 0);\n const end = read(0x2f) | read(0x30) << 8;\n for (let at = read(0x2d) | read(0x2e) << 8; at < end; at += 7) {\n if (read(at) !== c1 || read(at + 1) !== c2) continue;\n const v = [2, 3, 4, 5, 6].map(k => read(at + k));\n if (kind === '%') return (v[0] << 8 | v[1]) << 16 >> 16;\n if (kind === '$') { let s = ''; const p = v[1] | v[2] << 8; for (let k = 0; k < v[0]; k++) s += String.fromCharCode(read(p + k)); return s; }\n return unpack(v);\n }\n throw new Error(`the variable ${n} not in BASIC's table: its making by PTRGET not handled`);\n };\n const b = Object.assign(Object.create(Basic.prototype), {\n get: variable,\n rnd: () => { cpu.hooks.get(0xe097)(cpu); return f.fac(); },\n });\n // (the text read from RAM, where a program's is: `ram`)\n return at => {\n const { e, end } = expression(ram, at);\n let fn = made.get(at); if (!fn) made.set(at, fn = evaluator(e));\n return { value: fn(b), end, place: e.k === 'str' ? e.at : undefined };\n };\n}\n", "// What Commodore BASIC does for a program, for a remake whose BASIC (or Blitz!'s code) is\n// compiled to JavaScript (basic-compile.js): its variables and arrays, its numbers printed as it\n// prints them, its strings as their bytes, its FOR and GOSUB on one stack, its DATA, and its\n// statements' calls into the KERNAL, made as the original makes them, through the engine, so\n// that they are the same events.\n//\n// const b = new Basic(engine, { data, quiet })\n// data where the program's DATA is in memory (Blitz!'s: each item its length and its text,\n// $FF at the end)\n// quiet BASIC's own interpreter, in the ROM, ran the program: its calls into the KERNAL are\n// the ROM's, and no events (GOLDFIELDS, the boot)\n//\n// Numbers are JavaScript's; a whole-number variable (%) floors what is stored, as BASIC does, and\n// BASIC's errors stop the remake with BASIC's own words. The rules for numbers (FOUT, VAL, RND,\n// the errors) are BASIC's, kept once for every layer in numbers.js.\n\nimport { fail, int16, fout, val, scanNumber, seedRandom, nextRandom, BasicError } from './numbers.js';\n\nexport class Basic {\n constructor(e, { data = 0, quiet = false } = {}) {\n this.e = e; this.data = this.dataStart = data; this.quiet = quiet;\n this.v = Object.create(null); this.arrays = Object.create(null); this.stack = [];\n this.channel = 0;\n }\n // where the operation is that may fail next, as Blitz!'s program counter has it then: BASIC's\n // error gives it as its line (the engine's `error`)\n here(at) { this.at = at; }\n // a variable's value, 0 or \"\" until it is set\n get(n) { return this.v[n] ?? (n.endsWith('$') ? '' : 0); }\n set(n, x) {\n if (n.endsWith('$')) { if (typeof x !== 'string') fail('TYPE MISMATCH'); if (x.length > 255) fail('STRING TOO LONG'); this.v[n] = x; return; }\n if (typeof x !== 'number') fail('TYPE MISMATCH');\n this.v[n] = n.endsWith('%') ? int16(x) : x;\n }\n clr() { this.v = Object.create(null); this.arrays = Object.create(null); this.stack = []; this.fns = null; }\n // RUN: every file closed (the KERNAL's CLALL), the variables cleared and DATA from its start,\n // the program run again to its DIMs and on from `back`\n run(back) { const m = this.e.mem; m[0x98] = 0; m[0x99] = 0; m[0x9a] = 3; this.clr(); this.data = this.dataStart; this.datum = 0; this.resume = back; }\n\n // arrays: DIM's sizes are the last index of each dimension\n dim(n, sizes) { if (this.arrays[n]) fail('REDIM\\'D ARRAY'); const dims = sizes.map(s => int16(s) + 1), size = dims.reduce((a, b) => a * b, 1); this.arrays[n] = { dims, data: new Array(size).fill(n.endsWith('$') ? '' : 0) }; }\n place(n, i) {\n const a = this.arrays[n] ?? (this.dim(n, i.map(() => 10)), this.arrays[n]);\n if (i.length !== a.dims.length) fail('BAD SUBSCRIPT');\n let k = 0; for (let d = 0; d < i.length; d++) { const x = int16(i[d]); if (x < 0 || x >= a.dims[d]) fail('BAD SUBSCRIPT'); k = k * a.dims[d] + x; }\n return [a, k];\n }\n elem(n, i) { const [a, k] = this.place(n, i); return a.data[k]; }\n setElem(n, i, x) {\n const [a, k] = this.place(n, i);\n if (n.endsWith('$') !== (typeof x === 'string')) fail('TYPE MISMATCH');\n a.data[k] = n.endsWith('%') ? int16(x) : x;\n }\n\n // operators: comparisons give -1 or 0, AND, OR and NOT work on whole numbers of 16 bits\n add(a, b) { if (typeof a !== typeof b) fail('TYPE MISMATCH'); if (typeof a === 'string' && a.length + b.length > 255) fail('STRING TOO LONG'); return a + b; }\n num(a) { if (typeof a !== 'number') fail('TYPE MISMATCH'); return a; }\n cmp(a, b, o) {\n if (typeof a !== typeof b) fail('TYPE MISMATCH');\n const c = a < b ? -1 : a > b ? 1 : 0;\n return ({ '=': c === 0, '<>': c !== 0, '<': c < 0, '>': c > 0, '<=': c <= 0, '>=': c >= 0 })[o] ? -1 : 0;\n }\n and(a, b) { return int16(this.num(a)) & int16(this.num(b)); }\n or(a, b) { return int16(this.num(a)) | int16(this.num(b)); }\n not(a) { return ~int16(this.num(a)); }\n div(a, b) { if (this.num(b) === 0) fail('DIVISION BY ZERO'); return this.num(a) / b; }\n\n pow(a, b) { a = this.num(a); b = this.num(b); if (a < 0 && b !== Math.floor(b)) fail('ILLEGAL QUANTITY'); return a ** b; }\n\n // functions\n int(x) { return Math.floor(this.num(x)); }\n abs(x) { return Math.abs(this.num(x)); }\n sqr(x) { if (this.num(x) < 0) fail('ILLEGAL QUANTITY'); return Math.sqrt(x); }\n log(x) { if (this.num(x) <= 0) fail('ILLEGAL QUANTITY'); return Math.log(x); }\n exp(x) { return Math.exp(this.num(x)); }\n sin(x) { return Math.sin(this.num(x)); }\n cos(x) { return Math.cos(this.num(x)); }\n tan(x) { return Math.tan(this.num(x)); }\n atn(x) { return Math.atan(this.num(x)); }\n len(s) { if (typeof s !== 'string') fail('TYPE MISMATCH'); return s.length; }\n val(s) { if (typeof s !== 'string') fail('TYPE MISMATCH'); return val(s); }\n rnd() { return this.random(); }\n fre() { return 0; }\n usr() { fail('UNDEF\\'D FUNCTION'); }\n sgn(x) { return Math.sign(this.num(x)); }\n chr(x) { const n = int16(x); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); return String.fromCharCode(n); }\n asc(s) { if (!s.length) fail('ILLEGAL QUANTITY'); return s.charCodeAt(0); }\n str(x) { return fout(this.num(x)); }\n left(s, n) { n = int16(n); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); return s.slice(0, n); }\n right(s, n) { n = int16(n); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); return n ? s.slice(-n) : ''; }\n mid(s, from, n = 255) { from = int16(from); n = int16(n); if (from < 1 || from > 255 || n < 0 || n > 255) fail('ILLEGAL QUANTITY'); return s.substr(from - 1, n); }\n peek(a) { a = Math.floor(this.num(a)); if (a < 0 || a > 0xffff) fail('ILLEGAL QUANTITY'); return this.e.read(a); }\n // RND: the seed's numbers, the same on the original (basic-rom.js's RND draws them too)\n // (kept on the engine, one run of them for the boot and the game, as the ROM's is one)\n random() { const e = this.e; e.randomState = nextRandom(e.randomState ?? seedRandom(e.title.seed ?? 0x11)); return e.randomState / 2 ** 32; }\n // TI, the clock at $A0 to $A2; TI$ as its hours, minutes and seconds\n // (a program's read of the clock takes the interrupts first, as a poll of GETIN does, so that a\n // wait it counts out moves on, the same on the original)\n // (but only every so many reads, the title's `reads`, and not after a poll of GETIN has taken\n // them since the last read)\n ti() {\n const e = this.e, m = e.mem;\n if (!e.clock && !this.quiet) {\n if (e.polledSince) { e.polledSince = false; e.reads = 0; }\n else if ((e.reads = (e.reads ?? 0) + 1) >= (e.routines.reads ?? 1)) { e.reads = 0; e.routines.poll(e); }\n }\n return m[0xa0] * 65536 + m[0xa1] * 256 + m[0xa2];\n }\n tis() { const t = Math.floor(this.ti() / 60); return [Math.floor(t / 3600) % 24, Math.floor(t / 60) % 60, t % 60].map(n => String(n).padStart(2, '0')).join(''); }\n // TI$ set: through the KERNAL's SETTIM, as the original sets it (A the clock's low byte, Y its high)\n setTis(s) { if (!/^\\d{6}$/.test(s)) fail('ILLEGAL QUANTITY'); const t = ((+s.slice(0, 2) * 60 + +s.slice(2, 4)) * 60 + +s.slice(4)) * 60, e = this.e; e.a = t & 0xff; e.x = t >> 8 & 0xff; e.y = t >> 16 & 0xff; this.call('settim'); }\n st() { return this.e.mem[0x90]; }\n poke(a, v) { a = Math.floor(this.num(a)); v = Math.floor(this.num(v)); if (a < 0 || a > 0xffff || v < 0 || v > 255) fail('ILLEGAL QUANTITY'); this.e.write(a, v); }\n\n // the time a statement took on the original, in its cycles, for the page's clock\n cost(n) { const e = this.e; e.cycles += n; e.delay += n / 1022.727; }\n // SYS, and the statements that go through the KERNAL's files: the engine's\n sys(at, text, step) { return this.e.routines.sys(this.e, Math.floor(this.num(at)), text, step); }\n undef() { fail('UNDEF\\'D STATEMENT'); }\n // READ from DATA in BASIC's own text (`items`, basic-lang.js `dataItems`): the next item, a\n // string as it is, a number as FIN reads it, anything else in it a SYNTAX ERROR IN the DATA's\n // line, as BASIC gives it; RESTORE, from the first again\n readText(string) {\n const item = this.items[this.datum ?? 0];\n if (!item) fail('OUT OF DATA');\n this.datum = (this.datum ?? 0) + 1;\n if (string) return item.text;\n const t = item.text.replace(/ /g, '');\n if (item.quoted || !/^[+-]?(\\d+\\.?\\d*|\\.\\d*)?(E[+-]?\\d*)?$/.test(t)) { const err = new BasicError('?SYNTAX ERROR'); err.basicLine = item.line; throw err; }\n return val(t);\n }\n restore() { this.datum = 0; this.data = this.dataStart; }\n // DEF FN and FN: a function of one variable, which while it is worked out holds the argument,\n // and then its own value again, as BASIC's FN does; one not defined, UNDEF'D FUNCTION; DEF only\n // in a program, not typed at once (ILLEGAL DIRECT)\n def(n, p, f) { if (this.e.mem[0x3a] === 0xff) fail('ILLEGAL DIRECT'); (this.fns ??= Object.create(null))[n] = { p, f }; }\n fn(n, x) {\n const d = this.fns?.[n];\n if (!d) fail('UNDEF\\'D FUNCTION');\n const was = this.v[d.p], arg = this.num(x);\n this.set(d.p, arg);\n try { return d.f(this); } finally { if (was === undefined) delete this.v[d.p]; else this.v[d.p] = was; }\n }\n failWith(what) { fail(what); }\n statement(k, args, into, step) {\n const f = this.e.routines['basic-' + k];\n if (!f) throw new Error(k.toUpperCase() + ' is not handled');\n return f(this.e, args, into, step);\n }\n pos() { return this.e.mem[0xd3] % 40; }\n\n // FOR and GOSUB on one stack, as BASIC keeps them: a FOR of a variable already looping drops\n // that loop and what is above it; NEXT drops the loops above its own; RETURN, everything above\n // its GOSUB\n for(n, to, step, next) {\n const k = this.stack.findLastIndex(f => f.for === n);\n if (k >= 0) this.stack.length = k;\n this.stack.push({ for: n, to: this.num(to), step: this.num(step), next });\n }\n next(n) {\n const k = n ? this.stack.findLastIndex(f => f.for === n) : this.stack.findLastIndex(f => f.for !== undefined);\n if (k < 0 || (n === null && this.stack.slice(k + 1).some(f => f.gosub !== undefined))) fail('NEXT WITHOUT FOR');\n this.stack.length = k + 1;\n const f = this.stack[k], x = this.get(f.for) + f.step;\n this.set(f.for, x);\n if (f.step >= 0 ? x <= f.to : x >= f.to) return f.next;\n this.stack.length = k;\n return null;\n }\n gosub(back) { this.stack.push({ gosub: back }); }\n ret() { const k = this.stack.findLastIndex(f => f.gosub !== undefined); if (k < 0) fail('RETURN WITHOUT GOSUB'); const back = this.stack[k].gosub; this.stack.length = k; return back; }\n on(x) { const k = Math.floor(this.num(x)); if (k < 0 || k > 255) fail('ILLEGAL QUANTITY'); return k; }\n\n // READ, from DATA as Blitz! keeps it\n read(string) {\n if (this.items) return this.readText(string);\n const m = this.e.mem, n = m[this.data];\n if (n & 0x80) fail('OUT OF DATA');\n const s = String.fromCharCode(...m.subarray(this.data + 1, this.data + 1 + n));\n this.data += 1 + n;\n return string ? s : val(s);\n }\n\n // the KERNAL's calls, through the engine: CHROUT a byte at a time, GETIN\n out(ch) { const e = this.e; e.a = ch; this.call('chrout'); }\n call(name) { const e = this.e; if (this.quiet) e.inside++; try { e.routines[name](e, [], null); } finally { if (this.quiet) e.inside--; } }\n // PRINT: a number written as FOUT writes it, then a step right on the screen or a space to a\n // file; a string as it is\n print(x) {\n if (typeof x === 'number') { for (const c of fout(x)) this.out(c.charCodeAt(0)); this.out(this.e.mem[0x13] ? 0x20 : 0x1d); }\n else for (let k = 0; k < x.length; k++) this.out(x.charCodeAt(k));\n }\n // a new line: a carriage return, and a line feed after it to a file numbered from 128\n newline() { this.out(0x0d); if (this.e.mem[0x13] & 0x80) this.out(0x0a); }\n\n // files, through the KERNAL: OPEN's parameters (the file, the device, 1 if not given, the\n // secondary address, 0, or 255 below device 3, and the name) as BASIC sets them, then OPEN;\n // CLOSE; PRINT# and INPUT#, the output's or the input's file, which $13 notes for PRINT\n open([la, fa = 1, sa, name = '']) {\n const m = this.e.mem;\n m[0xb8] = int16(la) & 0xff; m[0xba] = int16(fa) & 0xff; m[0xb9] = sa === undefined ? (m[0xba] < 3 ? 0xff : 0) : int16(sa) & 0xff;\n // (a name through SETNAM, as Blitz!'s OPEN gives it, from a place of the remake's own)\n for (let k = 0; k < name.length; k++) m[0x200 + k] = name.charCodeAt(k);\n if (name.length) { Object.assign(this.e, { a: name.length, x: 0x00, y: 0x02 }); this.call('setnam'); }\n else m[0xb7] = 0;\n this.call('open');\n if (this.e.c) fail(['', 'TOO MANY FILES', 'FILE OPEN', 'FILE NOT OPEN'][this.e.a] ?? 'DEVICE NOT PRESENT');\n }\n close(la) { this.e.a = int16(la) & 0xff; this.call('close'); }\n output(n) { this.e.mem[0x13] = int16(n) & 0xff; this.e.x = this.e.mem[0x13]; this.call('chkout'); }\n input(n) { this.e.mem[0x13] = int16(n) & 0xff; this.e.x = this.e.mem[0x13]; this.call('chkin'); this.line = null; }\n clrchn() { this.call('clrchn'); this.e.mem[0x13] = 0; }\n // WAIT: whether the place's bits, flipped by `xor`, meet the mask yet, as the ROM's loop reads\n // them ($B840); a key pressed on the page goes into the KERNAL's buffer meanwhile, as the\n // keyboard puts it there\n wait(at, mask, xor = 0) {\n const e = this.e, m = e.mem;\n if (!m[0xc6] && e.keys.length) { const k = e.keys.shift(); if (k >= 0) { m[0x277] = k; m[0xc6] = 1; } }\n return ((this.peek(at) ^ int16(xor)) & int16(mask)) !== 0;\n }\n // INPUT from a file (Microsoft's GETAGN and INLOOP): a line read with CHRIN to its carriage\n // return, the first an INPUT# reads read again while it is empty, a later one empty its items\n // empty; a read timed out (ST bit 1), the INPUT given up, its variables as they were\n // (`given up`); then its items, each to a comma: a string quoted to its quote, or to a comma\n // or a colon; a number as FIN reads it, a comma, a colon or the line's end after it, or\n // ?FILE DATA ERROR\n readLine(first) {\n for (;;) {\n let s = '';\n for (;;) { this.call('chrin'); if (this.e.a === 0x0d) break; s += String.fromCharCode(this.e.a); if (s.length > 88) fail('STRING TOO LONG'); }\n if (this.e.mem[0x90] & 2) { this.givenUp = true; return ''; }\n if (s.length || !first) return s;\n }\n }\n item(string, first) {\n if (first) this.givenUp = false;\n if (first || this.line === null || this.linePos >= this.line.length) { this.line = this.readLine(first); this.linePos = 0; }\n if (this.givenUp) return undefined;\n const s = this.line; let k = this.linePos;\n while (s[k] === ' ') k++;\n let v;\n if (string && s[k] === '\"') { const end = s.indexOf('\"', k + 1); v = s.slice(k + 1, end < 0 ? s.length : end); k = end < 0 ? s.length : end + 1; while (s[k] === ' ') k++; }\n else if (string) { let end = k; while (end < s.length && s[end] !== ',' && s[end] !== ':') end++; v = s.slice(k, end); k = end; }\n else { const n = scanNumber(s, k); v = n.text; k = n.end; }\n if (k < s.length && s[k] !== ',' && s[k] !== ':') fail('FILE DATA');\n if (s[k] === ',') k++;\n this.linePos = k;\n return string ? v : val(v);\n }\n // the end of an INPUT: from a file, the input back to the keyboard (Blitz!'s $1AAA)\n inputDone() {\n if (this.e.mem[0x13]) { this.call('clrchn'); this.e.mem[0x13] = 0; return; }\n throw new Error('INPUT from the keyboard is not handled');\n }\n // GET#'s character: GETIN from the file CHKIN chose, \"\" for none\n getFrom() { this.call('getin'); return this.e.a ? String.fromCharCode(this.e.a) : ''; }\n // `,`: on to the next column of ten\n comma() { const c = this.e.mem[0xd3] % 40; let n = 10 - c % 10; while (n--) this.out(this.e.mem[0x13] ? 0x20 : 0x1d); }\n spc(n) { n = int16(n); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); while (n-- > 0) this.out(this.e.mem[0x13] ? 0x20 : 0x1d); }\n tab(n) { n = int16(n); if (n < 0 || n > 255) fail('ILLEGAL QUANTITY'); let k = n - this.e.mem[0xd3] % 40; while (k-- > 0) this.out(0x1d); }\n // GET: the key from GETIN, or \"\" with none; Blitz!'s calls CLRCHN after each, as its handler\n // does ($16CD), and BASIC's, in the ROM, does not\n // (the run stops for a key as GETIN returns, as the original does, its CLRCHN still to come:\n // null, and the step runs again for the rest)\n key() {\n if (this.got === undefined) {\n this.e.mem[0x13] = 0; this.call('getin'); this.got = this.e.a;\n if (this.e.polled && !this.quiet) return null;\n }\n const k = this.got; this.got = undefined;\n if (!this.quiet) this.call('clrchn');\n return k ? String.fromCharCode(k) : '';\n }\n}\n\n", "// A Commodore 64 (machine.js) in a browser page: the keys as the C64's matrix, the arrows as the\n// joystick and the cursor keys, Escape as RUN/STOP, Control the Commodore key (and fire), Tab\n// CTRL; a gamepad (an 8BitDo, or any in the browser's standard mapping) as the joystick too; the\n// frame painted on a canvas doubled; and the machine run 50 frames a second, keeping up with the\n// clock, two frames at most at a time.\n//\n// const keys = keyboard(m, { ignore, onKey, log }) ignore(e): a key the page keeps (a pane's)\n// keys.press(column, row, frames) a key held for so many frames (RUN/STOP)\n// const draw = painter(canvas) draw(m.vic.frame)\n// pace(m, after) the frames run; after() each animation frame\nimport { MATRIX, SHIFTED, JOYSTICK, CURSOR, MODIFIERS } from './keys.js';\nimport { PALETTE, WIDTH, HEIGHT } from './vic.js';\n\nconst PAD_DEAD = 0.4; // a stick pushed less far than this is at rest (the dead zone)\n\nexport function keyboard(m, { ignore = () => false, onKey = () => {}, log = false } = {}) {\n // (a letter by the key it is, not the character the browser makes of it: in the C64's first\n // character set, capitals and graphics, a letter is a letter, Shift or Caps Lock or not, and\n // Option with it is its graphic, the C64's shifted letter; in the second, small letters and\n // capitals, Shift is a capital, as on the C64)\n const upper = () => !((m.vic?.r[0x18] ?? 0x15) & 2);\n // (a key let go within two frames of going down is held to the end of them: the KERNAL scans\n // the keyboard once a frame, and a tap shorter than that, which a real key never is, would\n // never be seen)\n const down = new Map(), held = [], pressed = new Map(), withCbm = new Set();\n let frame = 0;\n const release = (key, shift) => {\n const since = frame - (pressed.get(key) ?? -9);\n if (since >= 2) { m.key(key[0], key[1], false); if (shift) m.key(1, 7, false); return; }\n held.push([key[0], key[1], 2 - since]); if (shift) held.push([1, 7, 2 - since]);\n };\n window.addEventListener('keydown', e => {\n if (ignore(e)) return;\n onKey(e);\n if (e.metaKey || e.repeat) return;\n if (MODIFIERS[e.key]) { m.key(...MODIFIERS[e.key], true); e.preventDefault(); }\n if (JOYSTICK[e.key]) { m.joystick |= JOYSTICK[e.key]; const cur = CURSOR[e.key]; if (cur) { if (cur[2]) m.key(1, 7, true); m.key(cur[0], cur[1], true); } e.preventDefault(); return; }\n const letter = /^Key([A-Z])$/.exec(e.code)?.[1]?.toLowerCase();\n const shifted = letter ? null : SHIFTED[e.key], key = letter ? MATRIX[letter] : shifted ? MATRIX[shifted] : MATRIX[e.key] || MATRIX[e.key.toLowerCase()];\n if (!key) { if (MODIFIERS[e.key]) e.preventDefault(); return; }\n // (the left shift: a letter's graphic, a shifted sign, and shift with a function key, F2, F4, F6\n // and F8 being shift with F1, F3, F5 and F7 on the 64)\n if (letter ? (upper() ? e.altKey : e.shiftKey) : shifted || (e.key.length === 1 && e.key !== e.key.toLowerCase() && !/[0-9]/.test(e.key)) || (e.shiftKey && /^F[1357]$/.test(e.key))) m.key(1, 7, true);\n // (Control held, as the event says, the Commodore key down with the key, if Control's own\n // keydown has not put it there, and let go with it)\n const [cc, cr] = MODIFIERS.Control, cbm = e.ctrlKey && !(m.keys[cc] & 1 << cr) ? MODIFIERS.Control : null;\n if (cbm) { m.key(...cbm, true); pressed.set(cbm, frame); }\n m.key(key[0], key[1], true); down.set(e.code, key); pressed.set(key, frame); if (cbm) withCbm.add(e.code);\n if (log) console.log('key', JSON.stringify(e.key), '-> column', key[0], 'row', key[1]);\n e.preventDefault();\n });\n window.addEventListener('keyup', e => {\n if (MODIFIERS[e.key]) m.key(...MODIFIERS[e.key], false);\n if (JOYSTICK[e.key]) { m.joystick &= ~JOYSTICK[e.key]; const cur = CURSOR[e.key]; if (cur) { m.key(cur[0], cur[1], false); if (cur[2]) m.key(1, 7, false); } return; }\n const key = down.get(e.code);\n if (key) { release(key, true); if (withCbm.delete(e.code)) release(MODIFIERS.Control, false); down.delete(e.code); } else m.key(1, 7, false);\n });\n // the page left (another window, another tab, Cmd-Tab): the browser sends no keyup for what was\n // held, so everything is let go, the keys, the joystick and fire, or a key (CTRL by Tab, Shift's\n // fire) would stay down and every key after it be read wrongly\n const letGo = () => { m.keys.fill(0); m.joystick = 0; down.clear(); held.length = 0; pressed.clear(); withCbm.clear(); padBits = 0; padStop = false; };\n // a gamepad, read each frame in the browser's standard mapping: the D-pad or the left stick\n // (pushed past PAD_DEAD) the joystick in port 2, A or B its fire, Start RUN/STOP; added to what\n // the keys hold, and let go with the pad\n let padBits = 0, padStop = false;\n const readPads = () => {\n if (typeof navigator === 'undefined' || typeof navigator.getGamepads !== 'function') return;\n let bits = 0, stop = false;\n for (const p of navigator.getGamepads()) {\n if (!p || !p.connected) continue;\n const b = i => !!p.buttons[i]?.pressed, x = p.axes[0] ?? 0, y = p.axes[1] ?? 0;\n if (b(12) || y < -PAD_DEAD) bits |= 1;\n if (b(13) || y > PAD_DEAD) bits |= 2;\n if (b(14) || x < -PAD_DEAD) bits |= 4;\n if (b(15) || x > PAD_DEAD) bits |= 8;\n if (b(0) || b(1)) bits |= 16;\n if (b(9)) stop = true;\n }\n m.joystick = (m.joystick & ~padBits) | bits; padBits = bits;\n if (stop !== padStop) { m.key(7, 7, stop); padStop = stop; }\n };\n window.addEventListener('blur', letGo);\n document.addEventListener('visibilitychange', () => { if (document.hidden) letGo(); });\n return {\n // a key held for so many frames, then let go (frame() lets them go)\n press(column, row, frames = 3) { m.key(column, row, true); held.push([column, row, frames]); },\n frame() { frame++; readPads(); for (let i = held.length - 1; i >= 0; i--) if (--held[i][2] <= 0) { m.key(held[i][0], held[i][1], false); held.splice(i, 1); } },\n };\n}\n\nexport function painter(canvas) {\n const ctx = canvas.getContext('2d');\n canvas.width = WIDTH * 2; canvas.height = HEIGHT * 2;\n const rgba = new Uint8ClampedArray(WIDTH * 2 * HEIGHT * 2 * 4), image = new ImageData(rgba, WIDTH * 2, HEIGHT * 2);\n return f => {\n for (let y = 0; y < HEIGHT; y++) for (let x = 0; x < WIDTH; x++) {\n const [r, g, b] = PALETTE[f[y * WIDTH + x]];\n for (let dy = 0; dy < 2; dy++) { let o = (((y * 2 + dy) * WIDTH * 2) + x * 2) * 4; for (let dx = 0; dx < 2; dx++) { rgba[o++] = r; rgba[o++] = g; rgba[o++] = b; rgba[o++] = 255; } }\n }\n ctx.putImageData(image, 0, 0);\n };\n}\n\n// the C64's 50 frames a second, kept up with the clock (two at most at a time, so a tab left in\n// the background does not run on and on when it comes back); each(frame) after each one run\nexport function pace(m, after, each = () => {}) {\n let frames = 0;\n const started = performance.now();\n function tick() {\n const due = Math.min(2, Math.floor((performance.now() - started) / 20) - frames);\n for (let i = 0; i < due; i++) { m.runFrame(); frames++; each(frames); }\n after(frames);\n requestAnimationFrame(tick);\n }\n tick();\n}\n", "// The browser's keys as the C64's keyboard matrix, column then row, and the joystick in port 2\n// on the arrow keys with the fire button on the left control key or shift.\nexport const MATRIX = {\n Backspace: [0, 0], Delete: [0, 0], Enter: [0, 1], F7: [0, 3], F1: [0, 4], F3: [0, 5], F5: [0, 6],\n '3': [1, 0], w: [1, 1], a: [1, 2], '4': [1, 3], z: [1, 4], s: [1, 5], e: [1, 6],\n '5': [2, 0], r: [2, 1], d: [2, 2], '6': [2, 3], c: [2, 4], f: [2, 5], t: [2, 6], x: [2, 7],\n '7': [3, 0], y: [3, 1], g: [3, 2], '8': [3, 3], b: [3, 4], h: [3, 5], u: [3, 6], v: [3, 7],\n '9': [4, 0], i: [4, 1], j: [4, 2], '0': [4, 3], m: [4, 4], k: [4, 5], o: [4, 6], n: [4, 7],\n '+': [5, 0], p: [5, 1], l: [5, 2], '-': [5, 3], '.': [5, 4], ':': [5, 5], '@': [5, 6], ',': [5, 7],\n '\u00A3': [6, 0], '*': [6, 1], ';': [6, 2], Home: [6, 3], '=': [6, 5], '^': [6, 6], '/': [6, 7],\n '1': [7, 0], _: [7, 1], '2': [7, 3], ' ': [7, 4], q: [7, 6], Escape: [7, 7],\n};\n// keys that need shift on the C64: the shifted character (or function key) and its unshifted key\nexport const SHIFTED = { '!': '1', '\"': '2', '#': '3', '$': '4', '%': '5', '&': '6', \"'\": '7', '(': '8', ')': '9', '?': '/', '<': ',', '>': '.', '[': ':', ']': ';',\n F2: 'F1', F4: 'F3', F6: 'F5', F8: 'F7' }; // (F2, F4, F6 and F8 are shift with F1, F3, F5 and F7 on the 64)\n// the C64's own modifier keys, where VICE puts them: Control the Commodore key (and the\n// joystick's fire too), Tab CTRL\nexport const MODIFIERS = { Control: [7, 5], Tab: [7, 2] };\nexport const JOYSTICK = { ArrowUp: 1, ArrowDown: 2, ArrowLeft: 4, ArrowRight: 8, Control: 16, Shift: 16, Alt: 16 };\n// the arrow keys are also the cursor keys: down and right, and with shift, up and left\nexport const CURSOR = { ArrowDown: [0, 7, 0], ArrowRight: [0, 2, 0], ArrowUp: [0, 7, 1], ArrowLeft: [0, 2, 1] };\n", "// The VIC-II, drawn a raster line at a time into a frame of 384 by 272: the 320 by 200 screen\n// with the border around it. Text in the standard, multicolor and extended modes, bitmaps in\n// hi-res and multicolor, the eight sprites with their expansion, priority and multicolor, and\n// the raster interrupt. The VIC-II reads memory in the 16K bank CIA2 selects, and sees the\n// character ROM at $1000 in the first and third banks.\nexport const PALETTE = [[0, 0, 0], [255, 255, 255], [136, 0, 0], [170, 255, 238], [204, 68, 204], [0, 204, 85], [0, 0, 170], [238, 238, 119],\n [221, 136, 85], [102, 68, 0], [255, 119, 119], [51, 51, 51], [119, 119, 119], [170, 255, 102], [0, 136, 255], [187, 187, 187]];\n\nexport const WIDTH = 384, HEIGHT = 272, LEFT = 32, TOP = 35; // where the 320 by 200 screen sits in the frame\nconst FIRST_LINE = 16, LAST_LINE = 287; // the raster lines of the frame's 272, out of 312\n\nexport class VIC {\n constructor(m) {\n this.m = m; this.r = new Uint8Array(0x40); this.r[0x11] = 0x1b; this.r[0x16] = 0xc8; this.r[0x18] = 0x14;\n this.frame = new Uint8Array(WIDTH * HEIGHT); // a color a pixel\n this.rasterIrq = false; this.spriteHits = 0; this.spriteBackground = 0; this.inside = [0, WIDTH - 1];\n this.priority = new Uint8Array(WIDTH); // this line: 1 where the background's foreground is\n }\n read(r) {\n if (r === 0x11) return (this.r[0x11] & 0x7f) | ((this.m.line >> 1) & 0x80);\n if (r === 0x12) return this.m.line & 0xff;\n if (r === 0x19) return this.r[0x19] | 0x70;\n if (r === 0x1e) { const v = this.spriteHits; this.spriteHits = 0; return v; }\n if (r === 0x1f) { const v = this.spriteBackground; this.spriteBackground = 0; return v; }\n if (r >= 0x20 && r < 0x2f) return this.r[r] | 0xf0;\n return this.r[r];\n }\n write(r, v) {\n if (r === 0x19) { this.r[0x19] &= ~(v & 0x0f); return; } // acknowledged by writing the bit\n this.r[r] = v;\n }\n irq() {\n const line = this.m.line, target = this.r[0x12] | (this.r[0x11] & 0x80) << 1;\n if (line === target && !this.rasterIrq) { this.rasterIrq = true; this.r[0x19] |= 1; }\n if (line !== target) this.rasterIrq = false;\n if (this.r[0x19] & this.r[0x1a] & 0x0f) { this.r[0x19] |= 0x80; return true; }\n return false;\n }\n // the VIC-II's view of memory\n bank() { return (~this.m.cia2.pra & 3) << 14; }\n fetch(a) { const b = this.bank(), full = b | (a & 0x3fff); if ((full & 0x7000) === 0x1000 && !(b & 0x4000)) return this.m.chargen[full & 0xfff]; return this.m.ram[full]; }\n\n // the raster line `y` of the frame, into the pixels\n line(y) {\n if (y < FIRST_LINE || y > LAST_LINE) return;\n const py = y - FIRST_LINE, out = this.frame, row = py * WIDTH, r = this.r;\n const border = r[0x20] & 15, bg = r[0x21] & 15;\n const den = r[0x11] & 0x10, rsel = r[0x11] & 8, csel = r[0x16] & 8;\n const top = rsel ? 51 : 55, bottom = rsel ? 250 : 246, left = csel ? 24 : 31, right = csel ? 343 : 334;\n const prio = this.priority; prio.fill(0);\n for (let x = 0; x < WIDTH; x++) out[row + x] = border;\n if (!den || y < top || y > bottom) { this.sprites(y, row, true); return; }\n const yscroll = r[0x11] & 7, xscroll = r[0x16] & 7, bitmap = r[0x11] & 0x20, ecm = r[0x11] & 0x40, mcm = r[0x16] & 0x10;\n const screenBase = ((r[0x18] >> 4) & 15) << 10, charBase = ((r[0x18] >> 1) & 7) << 11, bitmapBase = (r[0x18] & 8) << 10;\n const sy = y - 48 - yscroll; // the line within the 200 of the screen: with the usual scroll of 3, the first is raster 51\n if (sy < 0 || sy >= 200) { this.sprites(y, row, false); return; }\n const cy = sy >> 3, ly = sy & 7;\n for (let cx = 0; cx < 40; cx++) {\n const cell = cy * 40 + cx, code = this.fetch(screenBase + cell), color = this.m.color[cell] & 15;\n let bits, colors;\n if (bitmap) {\n bits = this.fetch(bitmapBase + cell * 8 + ly);\n colors = mcm ? [bg, code >> 4, code & 15, color] : [code & 15, code >> 4];\n } else {\n bits = this.fetch(charBase + ((ecm ? code & 0x3f : code) << 3) + ly);\n if (ecm) colors = [r[0x21 + (code >> 6)] & 15, color];\n else if (mcm && color & 8) colors = [bg, r[0x22] & 15, r[0x23] & 15, color & 7];\n else colors = [bg, color];\n }\n const multi = colors.length === 4 && (bitmap ? true : true);\n const x0 = LEFT + xscroll + cx * 8;\n if (multi && (bitmap || (mcm && (color & 8)))) {\n for (let k = 0; k < 4; k++) { const pair = (bits >> (6 - k * 2)) & 3, c = colors[pair]; const x = x0 + k * 2; if (x >= 0 && x + 1 < WIDTH) { out[row + x] = c; out[row + x + 1] = c; if (pair >= 2) { prio[x] = 1; prio[x + 1] = 1; } } }\n } else {\n for (let k = 0; k < 8; k++) { const set = (bits >> (7 - k)) & 1, x = x0 + k; if (x >= 0 && x < WIDTH) { out[row + x] = set ? colors[1] : colors[0]; if (set) prio[x] = 1; } }\n }\n }\n // the side borders over the screen's edge, and the whole border row outside it; the border over\n // the sprites too, as the 64's is (they show in it only where a program opens it)\n for (let x = 0; x < LEFT + left - 24; x++) out[row + x] = border;\n for (let x = LEFT + right - 24 + 1; x < WIDTH; x++) out[row + x] = border;\n this.inside = [LEFT + left - 24, LEFT + right - 24];\n this.sprites(y, row, false);\n }\n\n // the sprites on raster line `y`: each is 24 by 21 at its position, doubled when expanded,\n // its pixels from the 63 bytes its pointer names, over or under the background by priority. A\n // sprite shows from the line after its Y: the VIC-II reads its first line's data on line Y and\n // shows it on the next (as VICE shows it, held against it on Subway Arts' curtains)\n sprites(y, row, borderOnly) {\n const r = this.r, enabled = r[0x15];\n if (!enabled) return;\n const screenBase = ((r[0x18] >> 4) & 15) << 10, out = this.frame, prio = this.priority;\n const drawn = new Uint8Array(WIDTH); // which sprite drew each pixel, plus one\n for (let s = 7; s >= 0; s--) {\n if (!(enabled & (1 << s))) continue;\n const sx = r[s * 2] | ((r[0x10] >> s) & 1) << 8, sy = r[s * 2 + 1], yx = r[0x17] & (1 << s), xx = r[0x1d] & (1 << s);\n const height = yx ? 42 : 21;\n const ry = y - sy - 1; // the sprite is placed by raster line, from the one after its Y\n if (ry < 0 || ry >= height) continue;\n const line = yx ? ry >> 1 : ry, pointer = this.fetch(screenBase + 0x3f8 + s), data = pointer << 6;\n const multi = r[0x1c] & (1 << s), behind = r[0x1b] & (1 << s), color = r[0x27 + s] & 15;\n const px0 = LEFT + sx - 24;\n for (let byte = 0; byte < 3; byte++) {\n const bits = this.fetch(data + line * 3 + byte);\n if (multi) {\n for (let k = 0; k < 4; k++) { const pair = (bits >> (6 - k * 2)) & 3; if (!pair) continue; const c = pair === 1 ? r[0x25] & 15 : pair === 2 ? color : r[0x26] & 15; const base = (byte * 8 + k * 2) * (xx ? 2 : 1); for (let d = 0; d < (xx ? 4 : 2); d++) this.spritePixel(row, px0 + base + d, c, s, behind, drawn, borderOnly); }\n } else {\n for (let k = 0; k < 8; k++) { if (!((bits >> (7 - k)) & 1)) continue; const base = (byte * 8 + k) * (xx ? 2 : 1); for (let d = 0; d < (xx ? 2 : 1); d++) this.spritePixel(row, px0 + base + d, color, s, behind, drawn, borderOnly); }\n }\n }\n }\n }\n spritePixel(row, x, c, s, behind, drawn, borderOnly) {\n if (x < 0 || x >= WIDTH) return;\n if (drawn[x]) { this.spriteHits |= (1 << s) | (1 << (drawn[x] - 1)); }\n drawn[x] = s + 1;\n if (this.priority[x]) { this.spriteBackground |= 1 << s; if (behind) return; }\n if (borderOnly || x < this.inside[0] || x > this.inside[1]) return;\n this.frame[row + x] = c;\n }\n}\n", "// Writing a Commodore 1541 disk image, a .d64, as the 1541 itself would leave it, so that it loads\n// on Moonbase's C64, in VICE and on a real 64 (by an SD2IEC or the like). 35 tracks of 256-byte\n// sectors, 21 a track on the outer tracks and fewer further in, 174,848 bytes. Track 18 holds the\n// BAM and the disk's name in sector 0 and the directory from sector 1; each file is a chain of\n// sectors, each starting with the track and sector of the next, or 0 and the index of its last\n// byte. Files are laid down from track 17 outward and from 19 inward, as the 1541 does, ten\n// sectors apart on a track, the directory three apart.\n//\n// make({ name: 'CRAYON', id: 'MB', files: [{ name: 'CRAYON', data, type: 'PRG' }] })\n// data the file's bytes; for a program, its load address first, as a .prg has it\n// a Uint8Array of 174,848 bytes\n// add(image, files) files added to a disk that has some, theirs left where they are (below)\n// read(image) a disk read: { name, id, files: [{ name, type, locked, closed, blocks, body, address and raw\n// (a program: its load address, and its bytes with it) }] }; each body a Uint8Array\n// petsciiName(bytes) a name as the 1541 keeps it, as text: shifted letters $C1 to $DA as capitals, the $A0\n// padding gone\nexport const SECTORS = [...Array(17).fill(21), ...Array(7).fill(19), ...Array(6).fill(18), ...Array(5).fill(17)];\nconst TYPES = { DEL: 0, SEQ: 1, PRG: 2, USR: 3, REL: 4 };\nconst offset = (t, s) => (SECTORS.slice(0, t - 1).reduce((a, b) => a + b, 0) + s) * 256;\n\n// a name as the 1541 keeps it: 16 bytes of PETSCII, the letters as capitals, padded with $A0\nconst name16 = text => {\n const out = new Uint8Array(16).fill(0xa0);\n [...String(text).toUpperCase()].slice(0, 16).forEach((c, i) => { out[i] = c.charCodeAt(0) & 0xff; });\n return out;\n};\n\nexport function make({ name = 'MOONBASE', id = 'MB', files = [] } = {}) {\n const image = new Uint8Array(174848), used = SECTORS.map(n => new Array(n).fill(false));\n const take = (t, s) => { used[t - 1][s] = true; return offset(t, s); };\n take(18, 0);\n\n // the sectors for a file: the tracks nearest the directory first, ten sectors apart on each\n const ORDER = [];\n for (let d = 1; d <= 17; d++) { if (18 - d >= 1) ORDER.push(18 - d); if (18 + d <= 35) ORDER.push(18 + d); }\n const free = () => {\n for (const t of ORDER) {\n const n = SECTORS[t - 1], start = used[t - 1].lastTaken ?? -10;\n for (let k = 0; k < n; k++) { const s = (start + 10 + k) % n; if (!used[t - 1][s]) { used[t - 1][s] = true; used[t - 1].lastTaken = s; return [t, s]; } }\n }\n throw new Error('the disk is full');\n };\n\n // the files' bodies, sector by sector\n const entries = files.map(f => {\n const data = f.data instanceof Uint8Array ? f.data : Uint8Array.from(f.data);\n const chunks = Math.max(1, Math.ceil(data.length / 254)), places = Array.from({ length: chunks }, free);\n places.forEach(([t, s], i) => {\n const at = take(t, s), part = data.subarray(i * 254, (i + 1) * 254);\n if (i + 1 < chunks) { image[at] = places[i + 1][0]; image[at + 1] = places[i + 1][1]; }\n else { image[at] = 0; image[at + 1] = part.length + 1; }\n image.set(part, at + 2);\n });\n return { name: name16(f.name), type: 0x80 | (TYPES[f.type ?? 'PRG'] ?? 2), first: places[0], blocks: chunks };\n });\n\n // the directory: eight entries a sector, on track 18 from sector 1, three apart\n const dirSectors = [];\n for (let i = 0, s = 1; i < Math.max(1, Math.ceil(entries.length / 8)); i++, s = (s + 3) % 19) {\n while (used[17][s]) s = (s + 1) % 19;\n if (dirSectors.length >= 18) throw new Error('the directory is full: 144 files');\n take(18, s); dirSectors.push(s);\n }\n dirSectors.forEach((s, i) => {\n const at = offset(18, s);\n if (i + 1 < dirSectors.length) { image[at] = 18; image[at + 1] = dirSectors[i + 1]; } else { image[at] = 0; image[at + 1] = 0xff; }\n entries.slice(i * 8, i * 8 + 8).forEach((e, k) => {\n const p = at + k * 32;\n image[p + 2] = e.type; image[p + 3] = e.first[0]; image[p + 4] = e.first[1];\n image.set(e.name, p + 5);\n image[p + 30] = e.blocks & 0xff; image[p + 31] = e.blocks >> 8;\n });\n });\n\n // the BAM: the directory's first sector, the format's mark, each track's free count and map\n const bam = offset(18, 0);\n image[bam] = 18; image[bam + 1] = dirSectors[0]; image[bam + 2] = 0x41;\n for (let t = 1; t <= 35; t++) {\n const map = used[t - 1].map(u => !u), at = bam + 4 * t;\n image[at] = map.filter(Boolean).length;\n for (let s = 0; s < map.length; s++) if (map[s]) image[at + 1 + (s >> 3)] |= 1 << (s & 7);\n }\n image.set(name16(name), bam + 0x90);\n image[bam + 0xa0] = image[bam + 0xa1] = 0xa0;\n image[bam + 0xa2] = String(id).charCodeAt(0) || 0x30; image[bam + 0xa3] = String(id).charCodeAt(1) || 0x30;\n image[bam + 0xa4] = 0xa0; image[bam + 0xa5] = 0x32; image[bam + 0xa6] = 0x41;\n image.fill(0xa0, bam + 0xa7, bam + 0xab);\n return image;\n}\n\n// Files added to a disk that already has some, as a 1541 SAVEs them: the disk's own files left in\n// their sectors (a game may read them by track and sector), a file of the same name replaced and\n// its sectors freed, the new ones laid in free sectors as the BAM has them and entered in the\n// directory's first empty entry (a new directory sector where none is empty).\n//\n// add(image, [{ name, data }]) a new image; the one given is not changed\nexport function add(image, files) {\n const out = Uint8Array.from(image), bam = offset(18, 0);\n const isFree = (t, s) => !!(out[bam + 4 * t + 1 + (s >> 3)] & 1 << (s & 7));\n const mark = (t, s, free) => {\n const at = bam + 4 * t + 1 + (s >> 3), was = isFree(t, s);\n if (free) out[at] |= 1 << (s & 7); else out[at] &= ~(1 << (s & 7));\n out[bam + 4 * t] += free && !was ? 1 : !free && was ? -1 : 0;\n };\n const ORDER = [];\n for (let d = 1; d <= 17; d++) { if (18 - d >= 1) ORDER.push(18 - d); if (18 + d <= 35) ORDER.push(18 + d); }\n const last = {};\n const take = () => {\n for (const t of ORDER) {\n const n = SECTORS[t - 1];\n for (let k = 0; k < n; k++) { const s = ((last[t] ?? -10) + 10 + k) % n; if (isFree(t, s)) { mark(t, s, false); last[t] = s; return [t, s]; } }\n }\n throw new Error('the disk is full');\n };\n // the directory's entries, by where each is\n const entries = () => {\n const list = [];\n for (let [t, s] = [out[bam], out[bam + 1]], n = 0; t && n < 18; n++) {\n const at = offset(t, s);\n for (let k = 0; k < 8; k++) list.push(at + k * 32);\n [t, s] = [out[at], out[at + 1]];\n }\n return list;\n };\n for (const f of files) {\n const name = name16(f.name), data = f.data instanceof Uint8Array ? f.data : Uint8Array.from(f.data);\n // (one of the same name: its sectors freed, its entry emptied)\n for (const e of entries()) {\n if (!(out[e + 2] & 7) || !name.every((b, i) => out[e + 5 + i] === b)) continue;\n for (let [t, s] = [out[e + 3], out[e + 4]], n = 0; t && n < 683; n++) { const at = offset(t, s); mark(t, s, true); [t, s] = [out[at], out[at + 1]]; }\n out[e + 2] = 0;\n }\n const chunks = Math.max(1, Math.ceil(data.length / 254)), places = Array.from({ length: chunks }, take);\n places.forEach(([t, s], i) => {\n const at = offset(t, s), part = data.subarray(i * 254, (i + 1) * 254);\n out.fill(0, at, at + 256);\n if (i + 1 < chunks) { out[at] = places[i + 1][0]; out[at + 1] = places[i + 1][1]; } else { out[at] = 0; out[at + 1] = part.length + 1; }\n out.set(part, at + 2);\n });\n let e = entries().find(e => !(out[e + 2] & 7) && !out[e + 2]);\n if (e === undefined) {\n // (a new directory sector, on track 18, linked after the last)\n const list = entries(), lastSector = list[list.length - 1] - 7 * 32;\n let s = 1; while (s < 19 && !isFree(18, s)) s++;\n if (s >= 19) throw new Error('the directory is full');\n mark(18, s, false);\n const at = offset(18, s); out.fill(0, at, at + 256); out[at + 1] = 0xff;\n out[lastSector] = 18; out[lastSector + 1] = s;\n e = at;\n }\n out.fill(0, e + 2, e + 32);\n out[e + 2] = 0x80 | (TYPES[f.type ?? 'PRG'] ?? 2); out[e + 3] = places[0][0]; out[e + 4] = places[0][1];\n out.set(name, e + 5);\n out[e + 30] = chunks & 0xff; out[e + 31] = chunks >> 8;\n }\n return out;\n}\n\n// Reading a disk: the BAM's sector names the disk, and the directory's chain from track 18, sector 1, eight\n// 32-byte entries a sector, each a file's type, its first sector and its name; a file's sectors follow each\n// other by their first two bytes, the last one's second byte the index of its last byte.\nconst NAMES = ['DEL', 'SEQ', 'PRG', 'USR', 'REL'];\nexport const petsciiName = bytes => String.fromCharCode(...[...bytes].filter(b => b !== 0xa0).map(b => (b >= 0xc1 && b <= 0xda ? b - 0x80 : b))).trim();\n\nexport function read(image) {\n if (image.length !== 174848 && image.length !== 175531) throw new Error('a .d64 is 174,848 bytes, and this one is ' + image.length);\n const sector = (t, s) => image.subarray(offset(t, s), offset(t, s) + 256);\n const chain = (t, s) => {\n const parts = [];\n while (t) { const b = sector(t, s); [t, s] = [b[0], b[1]]; parts.push(b.subarray(2, t ? 256 : s + 1)); }\n const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n parts.reduce((at, p) => (out.set(p, at), at + p.length), 0);\n return out;\n };\n const bam = sector(18, 0);\n const name = petsciiName(bam.subarray(0x90, 0xa0)), id = String.fromCharCode(bam[0xa2], bam[0xa3]);\n const files = [];\n for (let [t, s] = [bam[0], bam[1]]; t; ) {\n const b = sector(t, s);\n for (let i = 0; i < 8; i++) {\n const e = b.subarray(i * 32, (i + 1) * 32);\n if (!e[2]) continue;\n const type = NAMES[e[2] & 7] || '?', body = chain(e[3], e[4]);\n const file = { name: petsciiName(e.subarray(5, 21)), type, locked: !!(e[2] & 0x40), closed: !!(e[2] & 0x80), blocks: e[30] | e[31] << 8, body };\n if (type === 'PRG' && body.length >= 2) { file.address = body[0] | body[1] << 8; file.body = body.subarray(2); file.raw = body; }\n files.push(file);\n }\n [t, s] = [b[0], b[1]];\n }\n return { name, id, files };\n}\n", "// A Commodore 1541 as far as the games use it: the disk image itself, read a sector at a time;\n// the directory, searched with the drive's own wildcards; the command channel, with the memory\n// commands M-W, M-R and M-E, the block read U1 and the buffer pointer B-P; LOAD\"$\", the\n// directory as a BASIC program; files opened by name\n// and read a byte at a time; and the drive's memory, since Zoopak reads the directory through it\n// and then pokes a picture's track and sector into the two places the drive keeps its last\n// file's, so that LOAD\"*\", which on a 1541 loads the last file without a directory search,\n// fetches that picture. The KERNAL's bus routines, LISTEN, SECOND, CIOUT, UNLSN, TALK, TKSA,\n// ACPTR and UNTLK, are answered here by the machine's hooks, so the KERNAL's own OPEN, CHRIN\n// and CLOSE work on device 8 without the serial bus being modelled.\n\nimport { add } from './d64.js';\n\nconst SECTORS = [...Array(17).fill(21), ...Array(7).fill(19), ...Array(6).fill(18), ...Array(5).fill(17)];\nconst TYPES = ['DEL', 'SEQ', 'PRG', 'USR', 'REL'];\nconst OK = '00, OK,00,00\\r', NOT_FOUND = '62,FILE NOT FOUND,00,00\\r', SYNTAX = '31,SYNTAX ERROR,00,00\\r';\nconst bytes = s => Uint8Array.from(s, c => c.charCodeAt(0));\nconst upper = b => (b >= 0xc1 && b <= 0xda ? b - 0x80 : b); // shifted letters as unshifted\n\nexport class Drive {\n constructor(image) {\n this.image = image;\n this.mem = new Uint8Array(0x800); // the drive's RAM: $0200 the command buffer, $0300 to $07FF the four buffers\n this.saved = new Map(); // files saved this session, by name, as raw bytes; they shadow the disk\n this.keep = null; // (name, raw): told of each file saved, to keep it (saves.js)\n this.channels = new Map(); // open channels by secondary address 0 to 15\n this.listening = false; this.talking = false; this.channel = 0; this.opening = null;\n this.status = bytes(OK); this.reply = null; this.pos = 0;\n this.channels.set(15, { command: [] });\n }\n\n // the disk\n sector(t, s, image = this.image) { const n = SECTORS.slice(0, t - 1).reduce((a, b) => a + b, 0) + s; return image.subarray(n * 256, (n + 1) * 256); }\n chain(t, s) {\n const parts = []; let n = 0;\n while (t && n++ < 800) { const b = this.sector(t, s); [t, s] = [b[0], b[1]]; parts.push(b.subarray(2, t ? 256 : s + 1)); }\n const out = new Uint8Array(parts.reduce((a, p) => a + p.length, 0)); let at = 0;\n for (const p of parts) { out.set(p, at); at += p.length; }\n return out;\n }\n directory() {\n const bam = this.sector(18, 0), files = [];\n for (let [t, s] = [bam[0], bam[1]], n = 0; t && n++ < 40; ) {\n const b = this.sector(t, s);\n for (let i = 0; i < 8; i++) {\n const e = b.subarray(i * 32, (i + 1) * 32);\n if (!e[2]) continue;\n files.push({ name: Array.from(e.subarray(5, 21)).filter(c => c !== 0xa0).map(upper), type: TYPES[e[2] & 7] || '?', track: e[3], sector: e[4] });\n }\n [t, s] = [b[0], b[1]];\n }\n return files;\n }\n // the files a name can find: not DEL's, which the 1541's search passes over (a directory's art,\n // drawn in DEL entries' names, so that none of them loads)\n loadable() { return this.directory().filter(f => f.type !== 'DEL'); }\n // a name as the drive matches it: the drive prefix dropped, '*' ending the comparison, '?' any character\n static matches(pattern, name) {\n for (let i = 0; i < pattern.length; i++) {\n if (pattern[i] === 0x2a) return true;\n if (i >= name.length) return false;\n if (pattern[i] !== 0x3f && upper(pattern[i]) !== name[i]) return false;\n }\n return pattern.length === name.length;\n }\n static strip(name) { let n = Array.from(name).map(upper); if (n[0] === 0x40) n = n.slice(1); if (n[1] === 0x3a) n = n.slice(2); return n; }\n find(name) {\n name = Drive.strip(name);\n for (const [k, raw] of this.saved) if (Drive.matches(name, Array.from(bytes(k)))) return { raw, saved: true };\n for (const f of this.loadable()) if (Drive.matches(name, f.name)) return { ...f, raw: this.chain(f.track, f.sector) };\n return undefined;\n }\n // LOAD\"$\": the directory as the 1541 makes it, a BASIC program at $0401: the header line, the\n // disk's name reversed in quotes with its ID and DOS type; a line for each entry, its blocks the\n // line's number, its name in quotes as it is, its type (* if not closed, < if locked); and the\n // blocks free. BASIC's LOAD links its lines after. The files saved this session are listed as a\n // 1541 would have them, the disk read as if they were on it (d64.js `add`)\n listing() {\n const image = this.saved.size ? add(this.image, [...this.saved].map(([name, data]) => ({ name, data }))) : this.image;\n const sector = (t, s) => this.sector(t, s, image);\n const bam = sector(18, 0), out = [0x01, 0x04];\n const line = (n, text) => out.push(0x01, 0x01, n & 255, n >> 8, ...text, 0);\n line(0, [0x12, 0x22, ...bam.subarray(0x90, 0xa0), 0x22, 0x20, bam[0xa2], bam[0xa3], 0x20, bam[0xa5], bam[0xa6]]);\n for (let [t, s] = [bam[0], bam[1]], k = 0; t && k++ < 40; ) {\n const b = sector(t, s);\n for (let i = 0; i < 8; i++) {\n const e = b.subarray(i * 32, (i + 1) * 32);\n if (!e[2]) continue;\n const blocks = e[30] | e[31] << 8, raw = Array.from(e.subarray(5, 21)), end = raw.indexOf(0xa0), name = end < 0 ? raw : raw.slice(0, end);\n const pad = blocks < 10 ? 3 : blocks < 100 ? 2 : 1;\n line(blocks, [...Array(pad).fill(0x20), 0x22, ...name, 0x22, ...Array(16 - name.length).fill(0x20), e[2] & 0x80 ? 0x20 : 0x2a, ...bytes(TYPES[e[2] & 7] || '???'), e[2] & 0x40 ? 0x3c : 0x20]);\n }\n [t, s] = [b[0], b[1]];\n }\n let free = 0; for (let t = 1; t <= 35; t++) if (t !== 18) free += bam[4 * t];\n line(free, [...bytes('BLOCKS FREE.'), ...Array(13).fill(0x20)]);\n out.push(0, 0);\n return Uint8Array.from(out);\n }\n // the drive keeps its last file's track and sector at $7E and $026F, and LOAD\"*\" starts there\n remember(f) { if (f && f.track) { this.mem[0x7e] = f.track; this.mem[0x26e] = 0; this.mem[0x26f] = f.sector; } }\n load(name) {\n name = Drive.strip(name);\n let f;\n if (name[0] === 0x24) { this.status = bytes(OK); return this.listing(); }\n if (name.length === 1 && name[0] === 0x2a) f = this.mem[0x7e] ? { raw: this.chain(this.mem[0x7e], this.mem[0x26f]) } : { ...this.loadable()[0], raw: null };\n else f = this.find(name);\n if (f && !f.raw) f.raw = this.chain(f.track, f.sector);\n this.remember(f); this.status = bytes(f ? OK : NOT_FOUND);\n return f && f.raw;\n }\n save(name, raw) { this.store(String.fromCharCode(...Drive.strip(name)), raw); this.status = bytes(OK); }\n store(name, raw) { this.saved.set(name, raw); this.keep?.(name, raw); }\n\n // the bus, as the KERNAL's routines present it\n listen(device) { this.listening = device === 8; return this.listening; }\n talk(device) { this.talking = device === 8; return this.talking; }\n second(sa) {\n if (!this.listening) return;\n const ch = sa & 15, kind = sa & 0xf0;\n if (kind === 0xf0) this.opening = { ch, name: [] };\n else if (kind === 0xe0) this.close(ch);\n else this.channel = ch;\n }\n tksa(sa) { if (this.talking) { this.channel = sa & 15; this.pos = 0; } }\n ciout(b) {\n if (!this.listening) return;\n if (this.opening) { this.opening.name.push(b); return; }\n const c = this.channels.get(this.channel);\n if (!c) return;\n if (c.command) c.command.push(b);\n else if (c.write) c.write.push(b);\n else if (c.buffer) { c.buffer[c.pos] = b; c.pos = (c.pos + 1) & 0xff; }\n }\n unlsn() {\n if (this.opening) { this.open(this.opening.ch, this.opening.name); this.opening = null; }\n else if (this.channel === 15) { const c = this.channels.get(15); if (c.command.length) { this.execute(Uint8Array.from(c.command)); c.command = []; } }\n this.listening = false;\n }\n untlk() { this.talking = false; }\n // the next byte for the talker, and whether it is the last; nothing when the channel is empty\n acptr() {\n const c = this.channels.get(this.channel);\n if (this.channel === 15) {\n const data = this.reply || this.status;\n if (this.pos >= data.length) { this.reply = null; this.pos = 0; return null; }\n const byte = data[this.pos++], eoi = this.pos >= data.length;\n if (eoi) { if (this.reply) this.reply = null; else this.status = bytes(OK); this.pos = 0; }\n return { byte, eoi };\n }\n if (!c) return null;\n if (c.buffer) { const byte = c.buffer[c.pos]; c.pos = (c.pos + 1) & 0xff; return { byte, eoi: c.pos === 0 }; }\n if (!c.data || c.pos >= c.data.length) return null;\n return { byte: c.data[c.pos++], eoi: c.pos >= c.data.length };\n }\n\n // a file opened on a channel: '#' a buffer, else a name with its type and mode after commas\n open(ch, name) {\n if (ch === 15) { if (name.length) this.execute(Uint8Array.from(name)); return; }\n if (name[0] === 0x23) { this.channels.set(ch, { buffer: new Uint8Array(256), pos: 0 }); this.status = bytes(OK); return; }\n const parts = []; let cur = [];\n for (const b of name) { if (b === 0x2c) { parts.push(cur); cur = []; } else cur.push(b); }\n parts.push(cur);\n // ,W writes; and channel 1 always, SAVE's, as channel 0 always reads, LOAD's\n const mode = ch === 1 || ch !== 0 && parts.slice(1).some(p => p[0] === 0x57) ? 'W' : 'R';\n if (mode === 'W') { this.channels.set(ch, { write: [], name: String.fromCharCode(...Drive.strip(parts[0])) }); this.status = bytes(OK); return; }\n // (a file to read as LOAD finds it: \"*\" the last file, as a 1541 has it)\n const raw = this.load(parts[0]);\n this.channels.set(ch, { data: raw ?? new Uint8Array(0), pos: 0 });\n }\n close(ch) {\n const c = this.channels.get(ch);\n if (c && c.write) this.store(c.name, Uint8Array.from(c.write));\n if (ch !== 15) this.channels.delete(ch);\n }\n\n // a command on channel 15\n execute(cmd) {\n this.mem.set(cmd.subarray(0, 0x2a), 0x200); // the command buffer, where M-E code runs from\n const text = String.fromCharCode(...cmd);\n this.status = bytes(OK); this.reply = null;\n if (text.startsWith('M-W')) { const at = cmd[3] | cmd[4] << 8, n = cmd[5]; for (let i = 0; i < n && 6 + i < cmd.length; i++) this.mem[(at + i) & 0x7ff] = cmd[6 + i]; return; }\n if (text.startsWith('M-R')) { const at = cmd[3] | cmd[4] << 8, n = cmd.length > 5 ? cmd[5] || 256 : 1; this.reply = this.mem.slice(at & 0x7ff, (at & 0x7ff) + n); this.pos = 0; return; }\n if (text.startsWith('M-E')) {\n // the one program the games send: LDX #track, LDY #sector, STX $06, STY $07, LDA #$80 (read),\n // STA $00, and wait, which reads a sector into the drive's buffer 0 at $0300\n const code = cmd.subarray(5);\n for (let i = 0; i + 8 <= code.length; i++)\n if (code[i] === 0xa2 && code[i + 2] === 0xa0 && code[i + 4] === 0x86 && code[i + 5] === 0x06 && code[i + 6] === 0x84 && code[i + 7] === 0x07) {\n const t = code[i + 1], s = code[i + 3];\n if (t >= 1 && t <= 35 && s < SECTORS[t - 1]) this.mem.set(this.sector(t, s), 0x300);\n return;\n }\n return;\n }\n const m = /^(U1|UA|B-R|B-P)[: ]?\\s*(.*)$/.exec(text.replace(/\\r$/, ''));\n if (m) {\n const n = m[2].split(/[\\s,]+/).filter(Boolean).map(Number), c = this.channels.get(n[0]);\n if (!c || !c.buffer) { this.status = bytes('70,NO CHANNEL,00,00\\r'); return; }\n if (m[1] === 'B-P') { c.pos = n[1] & 0xff; return; }\n const [, , t, s] = n;\n if (t >= 1 && t <= 35 && s < SECTORS[t - 1]) { c.buffer.set(this.sector(t, s)); c.pos = 0; }\n else this.status = bytes('66,ILLEGAL TRACK OR SECTOR,' + String(t).padStart(2, '0') + ',' + String(s).padStart(2, '0') + '\\r');\n return;\n }\n if (/^I/.test(text)) return;\n this.status = bytes(SYNTAX);\n }\n}\n", "// The KERNAL's screen editor, moonbase's own: what CHROUT does with a character for the screen,\n// as the Commodore 64's KERNAL does it, keeping its working storage as it keeps it, so that a game\n// that reads it (Goldfields' TEXT/CODE reads the table of lines) finds what it would. Shared by\n// moonbase's KERNAL (kernal.js), for the remake and the original alike.\n//\n// const ed = editor({ read, write, keyRow })\n// ed.chrout(ch) a character to the screen ($E716)\n// ed.clear() the screen cleared, its lines made single ($E544); ed.home() ($E566)\n// ed.setLine() the pointers set from the row and the column ($E56C), as PLOT ends\n// ed.clearLine(x) a row cleared ($E9FF)\n// ed.begin(), ed.input() the keyboard's line, as CHRIN reads it ($F157, $E632): a character,\n// or null while it waits for a key\n//\n// The screen is lines of 40 columns, and a logical line one or two of them. Its storage:\n// $D1/$D2 where the cursor's logical line starts on the screen; $F3/$F4 the same in colour\n// $D3 the cursor's column in its logical line (0 to 79); $D5 its last column (39 or 79)\n// $D6 the cursor's row; $D9 to $F2 a byte a row, the high byte of the row's place (its low\n// two bits, with $0288 the page) and its top bit set if the row starts a logical line\n// $C7 reverse on; $D4 quote mode; $D8 inserts to come; $0286 the colour; $CD the blink's count\n// A row's low byte of place is 40 times it, as the KERNAL's table at $ECF0 has it.\nconst COLOURS = [0x90, 0x05, 0x1c, 0x9f, 0x9c, 0x1e, 0x1f, 0x9e, 0x81, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b];\n\nexport function editor({ read: r, write: w, keyRow = () => 0xff }) {\n const W = (a, v) => w(a, v & 0xff);\n const low = x => (x * 40) & 0xff;\n // ($E9F0) the line pointer for row X: its low byte, and its high from the table and $0288\n const linePointer = x => { W(0xd1, low(x)); W(0xd2, (r(0xd9 + x) & 3) | r(0x288)); };\n // ($EA24) the colour pointer from the line pointer\n const colourPointer = () => { W(0xf3, r(0xd1)); W(0xf4, (r(0xd2) & 3) | 0xd8); };\n const pnt = () => r(0xd1) | r(0xd2) << 8, user = () => r(0xf3) | r(0xf4) << 8;\n // ($E9FF) row X cleared to spaces, in the cursor's colour ($0286, as $E4DA puts it)\n function clearLine(x) {\n linePointer(x); colourPointer();\n for (let y = 39; y >= 0; y--) { w(user() + y, r(0x286)); w(pnt() + y, 0x20); }\n }\n // ($E56C) the pointers from the row and the column: back to the logical line's first row, the\n // column counted on from it; the line's last column from the rows that go on from it\n function setLine() {\n let x = r(0xd6), a = r(0xd3);\n while (!(r(0xd9 + x) & 0x80)) { a = (a + 40) & 0xff; W(0xd3, a); x--; if (x < 0) break; }\n linePointer(x & 0xff);\n let max = 0x27; x++;\n while (!(r(0xd9 + x) & 0x80)) { max += 40; x++; if (x > 0x7f) break; }\n W(0xd5, max);\n colourPointer();\n }\n // ($E544) the screen cleared: every row a logical line of its own, the table's end marked, the\n // rows cleared from the bottom; then home ($E566)\n function clear() {\n let y = r(0x288) | 0x80, a = 0;\n for (let x = 0; x < 0x1a; x++) { W(0xd9 + x, y); a += 40; if (a > 255) { a &= 0xff; y++; } }\n W(0xd9 + 0x1a, 0xff);\n for (let x = 0x18; x >= 0; x--) clearLine(x);\n home();\n }\n function home() { W(0xd3, 0); W(0xd6, 0); setLine(); }\n // ($E8EA) the screen scrolled up a row: each row moved up from the one below, the table's\n // links moved with them, the last row cleared; again while the first row goes on from above;\n // and with CTRL held a moment's wait. (The cursor's row, the input's row and $02A5 a row up.)\n function scroll() {\n const kept = [0xac, 0xad, 0xae, 0xaf].map(r);\n for (;;) {\n W(0xd6, r(0xd6) - 1); W(0xc9, r(0xc9) - 1); W(0x2a5, r(0x2a5) - 1);\n let x;\n for (x = 0; x < 0x18; x++) { linePointer(x); moveLine(low(x + 1), r(0xda + x)); }\n linePointer(x);\n clearLine(0x18);\n for (let k = 0; k < 0x18; k++) W(0xd9 + k, (r(0xd9 + k) & 0x7f) | (r(0xda + k) & 0x80));\n W(0xf1, r(0xf1) | 0x80);\n if (r(0xd9) & 0x80) break;\n }\n W(0xd6, r(0xd6) + 1); W(0x2a5, r(0x2a5) + 1);\n if (keyRow(0x7f) === 0xfb) W(0xc6, 0); // CTRL held: the KERNAL waits a moment, and empties the keyboard's buffer\n [0xac, 0xad, 0xae, 0xaf].forEach((a, k) => W(a, kept[k]));\n }\n // ($E9C8) a row copied to the line pointer's, from the row whose low byte is `from` and whose\n // table entry is `entry`\n function moveLine(from, entry) {\n const src = from | ((entry & 3) | r(0x288)) << 8, srcColour = from | ((entry & 3) | 0xd8) << 8;\n W(0xac, from); W(0xad, src >> 8); colourPointer(); W(0xae, from); W(0xaf, srcColour >> 8);\n for (let y = 0x27; y >= 0; y--) { w(pnt() + y, r(src + y)); w(user() + y, r(srcColour + y)); }\n }\n // ($E965) a row opened below the logical line, for it to grow into: the rows below moved down,\n // or the screen scrolled first if the line is at the bottom\n function openLine(from = r(0xd6) + 1) {\n let x = from;\n while (!(r(0xd9 + x) & 0x80)) x++;\n W(0x2a5, x);\n if (x > 0x18) { scroll(); x = r(0x2a5) - 1; W(0xd6, r(0xd6) - 1); return grow(x); }\n const kept = [0xac, 0xad, 0xae, 0xaf].map(r);\n for (let k = 0x18; k > r(0x2a5); k--) { linePointer(k); moveLine(low(k - 1), r(0xd8 + k)); }\n linePointer(Math.max(r(0x2a5), 0));\n clearLine(r(0x2a5));\n for (let k = 0x17; k >= r(0x2a5) && k > 0; k--) W(0xda + k, (r(0xda + k) & 0x7f) | (r(0xd9 + k) & 0x80));\n grow(r(0x2a5));\n [0xac, 0xad, 0xae, 0xaf].forEach((a, k) => W(a, kept[k]));\n }\n // ($E6DA) the logical line made two rows: the cursor's row's link cleared, the next row's\n // marked its own start, the line's last column 40 more, and the pointers from its first row\n function grow(x) {\n W(0xd9 + x, r(0xd9 + x) & 0x7f);\n W(0xd9 + x + 1, r(0xd9 + x + 1) | 0x80);\n W(0xd5, r(0xd5) + 40);\n let k = x; while (!(r(0xd9 + k) & 0x80) && k > 0) k--;\n linePointer(k);\n }\n // ($E87C) on to the next logical line's first row, scrolling at the bottom; ($E891) RETURN, which\n // ends inserts, reverse and quote mode too\n function nextLine() {\n W(0xc9, r(0xc9) >> 1);\n let x = r(0xd6);\n // (the scroll comes back with X its row, $D6, from where the search goes on: $E956)\n do { x++; if (x === 0x19) { scroll(); x = r(0xd6); } } while (!(r(0xd9 + x) & 0x80));\n W(0xd6, x); setLine();\n }\n function carriageReturn() { W(0xd8, 0); W(0xc7, 0); W(0xd4, 0); W(0xd3, 0); nextLine(); }\n // ($E8B3) at the end of a row (column 39 or 79), on to the next row; ($E8A1) at the start of one\n // (column 0 or 40), back to the row before\n function rowEndForward() { for (const end of [0x27, 0x4f]) if (r(0xd3) === end) { if (r(0xd6) !== 0x19) W(0xd6, r(0xd6) + 1); return; } }\n function rowStartBack() { for (const start of [0x00, 0x28]) if (r(0xd3) === start) { W(0xd6, r(0xd6) - 1); return; } }\n // ($EA13) a screen code at the cursor, in colour X, the blink's count 2\n function put(code, colour) { W(0xcd, 2); colourPointer(); w(pnt() + r(0xd3), code); w(user() + r(0xd3), colour); }\n // ($E6B6) the cursor one on: past the line's end, the line grows (to two rows) or a new line\n // (with AUTODN, $0292, set, as while keys wait to be shown, a line opened below: the search for\n // the next line's start from the row the cursor was on, plus one, as $E6CA jumps to $E967 with X\n // as $E8B3 left it, past the LDX $D6 at $E965)\n function advance() {\n const row = r(0xd6);\n rowEndForward();\n W(0xd3, r(0xd3) + 1);\n if (r(0xd5) >= r(0xd3)) return;\n if (r(0xd5) === 0x4f) { W(0xd6, r(0xd6) - 1); nextLine(); W(0xd3, 0); return; }\n if (r(0x292)) return openLine(row + 1);\n let x = r(0xd6);\n if (x >= 0x19) { scroll(); W(0xd6, r(0xd6) - 1); x = r(0xd6); }\n grow(x);\n }\n // a character, quote mode and inserts as the KERNAL keeps them\n function show(code) {\n if (r(0xc7)) code |= 0x80;\n if (r(0xd8)) W(0xd8, r(0xd8) - 1);\n put(code, r(0x286));\n advance();\n }\n function done() { if (r(0xd8)) W(0xd4, r(0xd4) >> 1); }\n // ($E701) back to the end of the logical line before, or nowhere at the top\n function backLine() {\n const x = r(0xd6);\n if (!x) { W(0xd3, 0); return false; }\n W(0xd6, x - 1); setLine(); W(0xd3, r(0xd5)); return true;\n }\n function chrout(ch) {\n W(0xd7, ch); W(0xd0, 0);\n if (ch & 0x80) return shifted(ch);\n if (ch === 0x0d) { carriageReturn(); return done(); }\n if (ch >= 0x20) {\n let code = ch < 0x60 ? ch & 0x3f : ch & 0xdf;\n if (ch === 0x22) W(0xd4, r(0xd4) ^ 1);\n show(code); return done();\n }\n if (r(0xd8)) { show(ch | 0x80); return done(); }\n if (ch === 0x14) { // DEL\n if (r(0xd3) === 0) { if (!backLine()) return done(); }\n else {\n rowStartBack(); W(0xd3, r(0xd3) - 1); colourPointer();\n for (let y = r(0xd3); y + 1 !== r(0xd5) + 1 && y < r(0xd5); y++) { w(pnt() + y, r(pnt() + y + 1)); w(user() + y, r(user() + y + 1)); }\n }\n w(pnt() + r(0xd5), 0x20); w(user() + r(0xd5), r(0x286));\n return done();\n }\n if (r(0xd4)) { show(ch | 0x80); return done(); }\n if (ch === 0x12) W(0xc7, 0x12);\n if (ch === 0x13) home();\n if (ch === 0x1d) { // cursor right\n const y = r(0xd3) + 1; rowEndForward(); W(0xd3, y);\n if (y - 1 >= r(0xd5)) { W(0xd6, r(0xd6) - 1); nextLine(); W(0xd3, 0); }\n return done();\n }\n if (ch === 0x11) { // cursor down\n let y = r(0xd3) + 40; W(0xd6, r(0xd6) + 1);\n if (y > r(0xd5)) { W(0xd6, r(0xd6) - 1); do { y -= 40; if (y >= 0) W(0xd3, y); } while (y > 0 && y >= 40); nextLine(); }\n else W(0xd3, y);\n return done();\n }\n const colour = COLOURS.indexOf(ch); if (colour >= 0) W(0x286, colour);\n if (ch === 0x0e) w(0xd018, r(0xd018) | 2);\n if (ch === 0x08) W(0x291, 0x80); if (ch === 0x09) W(0x291, 0);\n return done();\n }\n function shifted(ch) {\n ch &= 0x7f; if (ch === 0x7f) ch = 0x5e;\n if (ch >= 0x20) { show(ch | 0x40); return done(); }\n if (ch === 0x0d) { carriageReturn(); return done(); }\n if (r(0xd4) || (ch !== 0x14 && r(0xd8))) { show(ch | 0x40 | 0x80); return done(); }\n if (ch === 0x14) { // INST\n let y = r(0xd5);\n if (r(pnt() + y) === 0x20 && y !== r(0xd3)) { /* room at the end */ }\n else if (y === 0x4f) return done();\n else openLine();\n y = r(0xd5); colourPointer();\n for (; y > r(0xd3); y--) { w(pnt() + y, r(pnt() + y - 1)); w(user() + y, r(user() + y - 1)); }\n w(pnt() + y, 0x20); w(user() + y, r(0x286)); W(0xd8, r(0xd8) + 1);\n return done();\n }\n if (ch === 0x11) { // cursor up\n const x = r(0xd6);\n if (x) { W(0xd6, x - 1); const y = r(0xd3) - 40; if (y >= 0) W(0xd3, y); else setLine(); }\n return done();\n }\n if (ch === 0x12) W(0xc7, 0);\n if (ch === 0x1d) { // cursor left\n if (r(0xd3) === 0) backLine(); else { rowStartBack(); W(0xd3, r(0xd3) - 1); }\n return done();\n }\n if (ch === 0x13) { clear(); return done(); }\n const colour = COLOURS.indexOf(ch | 0x80); if (colour >= 0) W(0x286, colour);\n if (ch === 0x0e) w(0xd018, r(0xd018) & ~2);\n return done();\n }\n // The line typed at the keyboard, as CHRIN gives it ($E632): while no line is being read ($D0\n // 0), each key in the buffer shown as CHROUT shows it ($E5CA), the cursor's character put back\n // first if it shows, and SHIFT-RUN/STOP putting LOAD and RUN in the buffer; at RETURN, the\n // logical line the cursor is on read back from the screen ($E602): to its last character that\n // is not a space, from its start, or from where the input began if that was on this line (a\n // prompt's place, $C9/$CA, which CHRIN's caller sets: `begin`). Then a character a call, each\n // screen code made a character again ($E63A), quote mode followed, and RETURN at the end.\n // Gives the character, or null while it waits for a key.\n function begin() { W(0xca, r(0xd3)); W(0xc9, r(0xd6)); }\n function take() { const k = r(0x277); for (let i = 0; i < r(0xc6) - 1; i++) W(0x277 + i, r(0x278 + i)); W(0xc6, r(0xc6) - 1); return k; }\n function input() {\n if (!r(0xd0)) {\n for (;;) {\n const n = r(0xc6); W(0xcc, n); W(0x292, n);\n if (!n) return null;\n if (r(0xcf)) { W(0xcf, 0); W(0xcd, 2); colourPointer(); w(pnt() + r(0xd3), r(0xce)); w(user() + r(0xd3), r(0x287)); }\n const k = take();\n if (k === 0x83) { W(0xc6, 9); [0x4c, 0x4f, 0x41, 0x44, 0x0d, 0x52, 0x55, 0x4e, 0x0d].forEach((v, i) => W(0x277 + i, v)); continue; }\n if (k !== 0x0d) { chrout(k); continue; }\n // RETURN: the line's end, its last character that is not a space, and where to read from\n let y = r(0xd5); W(0xd0, y);\n while (r(pnt() + y) === 0x20 && --y) ;\n W(0xc8, y + 1); W(0x292, 0); W(0xd3, 0); W(0xd4, 0);\n if (!(r(0xc9) & 0x80)) {\n let x = r(0xd6);\n if (x !== r(0xc9)) { while (!(r(0xd9 + x) & 0x80) && x) x--; linePointer(x); }\n if (x === r(0xc9)) { W(0xd3, r(0xca)); if (r(0xca) >= r(0xc8)) return end(); }\n }\n break;\n }\n }\n // a character of the line from the screen: its screen code made a character again, the top\n // bit of a reversed one kept in quote mode\n const y = r(0xd3), s = r(pnt() + y);\n let a = s & 0x3f;\n if (s & 0x40) a |= 0x80;\n if (!((s & 0x80) && r(0xd4)) && !(s & 0x20)) a |= 0x40;\n W(0xd3, y + 1);\n if (a === 0x22) W(0xd4, r(0xd4) ^ 1);\n if (y === r(0xc8)) return end();\n W(0xd7, a); // (the character given kept, as $E674 keeps it)\n return a === 0xde ? 0xff : a;\n }\n // the line's end: RETURN, shown only if the input is the screen or the output is not\n function end() { W(0xd0, 0); if (r(0x99) === 3 || r(0x9a) !== 3) chrout(0x0d); W(0xd7, 0x0d); return 0x0d; }\n\n return { chrout, clear, home, setLine, clearLine, scroll, linePointer, colourPointer, begin, input };\n}\n", "// A character's eight bytes (its rows, the left dot the top bit) as a 32-bit FNV-1a hash: how\n// glyph-hashes.js keeps the 64's characters, and how a cell of a picture is recognised as one of\n// them.\nexport function glyphHash(rows) {\n let h = 0x811c9dc5;\n for (let i = 0; i < 8; i++) { h ^= rows[i]; h = Math.imul(h, 0x01000193) >>> 0; }\n return h;\n}\n", "// The 64's 512 characters as hashes: the character ROM's first set (screen codes 0 to 255, the last 128\n// reversed), then its second, each a 32-bit FNV-1a hash of its eight bytes (glyph-hash.js).\n// Generated from Commodore's character ROM; numbers only, no character can be drawn from them.\n// Not edited by hand.\nexport const GLYPH_HASHES = Uint32Array.of(\n 0xa63acec9, 0xcfb72db7, 0xc1892941, 0xd80b2795, 0x1b055853, 0x733925ed, 0xb76faaf3, 0x94217edd,\n 0xe71b097b, 0xcc9f3afd, 0xb1af50c7, 0x6f9d9a15, 0x61fb6d9b, 0x464b312c, 0x85f6570b, 0x96070b83,\n 0xb876df6d, 0xbdd92233, 0x5295e507, 0x32cadce7, 0x4dd2b86b, 0xe0a58b69, 0xb909704f, 0x0a4ca684,\n 0x090b885d, 0x391a859f, 0x1efef677, 0x3b8708c5, 0x2401ada1, 0xd655d051, 0xb19651ef, 0xeb166297,\n 0x9be17165, 0xccb1980d, 0x760cedb3, 0x63e18eff, 0x0294278d, 0xa3ebed65, 0x49817fb1, 0xf278feff,\n 0x987ef385, 0x52c0c411, 0x99e73ab0, 0xbed544ab, 0x730351a5, 0x93a47d1b, 0x63033875, 0x2dc56d46,\n 0xf5f3b30b, 0xbe43f89b, 0xae016c73, 0x52bd07e1, 0xb6f6f3fe, 0xff3909cd, 0x557295c7, 0xade16941,\n 0xf0fb1a01, 0x0161eb3b, 0x64320035, 0x8445ba4d, 0x710653c5, 0x0c491265, 0xd1adc673, 0xb34aabed,\n 0xb700ca17, 0x22397953, 0x3c19df65, 0xb700ca17, 0xbe9abf9b, 0xfe689467, 0xc712d72b, 0x0ff37de5,\n 0xefec4d45, 0x931ca24d, 0x62103ab3, 0xfa82e19d, 0x49efc6bb, 0xa706e569, 0xcc6ef1e5, 0x084b2e8b,\n 0xa637d02d, 0xf466251d, 0xfd160a47, 0xfbed4f22, 0x1e3ba9e5, 0x03bc99db, 0x937537f9, 0x8c73847d,\n 0x1df09969, 0x5d6969e5, 0x05f85cb4, 0xee667567, 0xa3db00e5, 0x3c19df65, 0xd5bf523e, 0xf607d477,\n 0x9be17165, 0x99f161e5, 0xb4512201, 0xe802ca7a, 0x4ce28808, 0x58e31265, 0xb2c0a219, 0x461f842d,\n 0x1d055413, 0xd33f53e4, 0x461f842d, 0xc051b967, 0x581deaa1, 0x1e2ddc7f, 0x36f8d78d, 0x4c4ff03b,\n 0xa300624f, 0x4c42987f, 0x34dd1f8f, 0x6a2e9b65, 0x58e31265, 0xf5528fe5, 0x7e413aad, 0x2505bf8b,\n 0x292df97c, 0x02147f26, 0xcaefc185, 0x6044a0a5, 0x940b4261, 0x099fd55d, 0xe0455ea5, 0x9c81d7e1,\n 0xd4b39b79, 0xdc8da58b, 0x538ca0cd, 0xfc193485, 0x0d506237, 0x64e1ab41, 0x64f248cb, 0xd27b4ccd,\n 0xf43f3a73, 0xd240f335, 0x9ae62617, 0x432d4101, 0xf2c122cf, 0xc379e674, 0x84d795e3, 0xb34cb6f7,\n 0xd3fcf7ad, 0xd6841827, 0x112d3413, 0x9c712aff, 0xc43b5f63, 0xa22875e5, 0x1fb4d0cf, 0x20c02064,\n 0xbf7a9239, 0x9d5ca57f, 0xf0de6067, 0xbb7ae8dd, 0xc45b03c9, 0xe2b4e829, 0x426d54d7, 0xa759948f,\n 0x6cae0a5d, 0xeae53e95, 0x8f14b49b, 0xaf792ac7, 0x9a0280a1, 0x5f6a9421, 0x0f9d9745, 0x30f21787,\n 0xc87f5d8d, 0xf48ead51, 0x5b0c5cb8, 0x27bf827b, 0xf389198d, 0x24c7045b, 0x038932bd, 0xf4b2cc5e,\n 0xdcb56f9f, 0x353848ef, 0xe4e4cf5f, 0xf2a5976d, 0xd84a1f36, 0x8f42ce19, 0xe6e0319f, 0xcc9d583d,\n 0x6061d50d, 0x74a966cf, 0x618c4ead, 0x31c82d45, 0xc7adac99, 0x581a4af1, 0x798d5a93, 0xd29d4d6d,\n 0xe319f30f, 0xdbab8ea3, 0x5383376d, 0xe319f30f, 0xdf630227, 0xa95eb15f, 0xcd40fc97, 0xd6d6ff3d,\n 0xe9c4fd6d, 0x1df55185, 0x1ba82113, 0x5d3b77b5, 0x26170287, 0xe26129c9, 0xc075e735, 0xbc1077b7,\n 0x74c89f8d, 0xe8063525, 0xcea2193f, 0xf8fc836a, 0x12c5d25d, 0x9a04a2db, 0x8702da71, 0xcd17a8c5,\n 0xdab3d03d, 0xd23a719d, 0x4f6b1528, 0xf706ca4f, 0xcfd5ec5d, 0x5383376d, 0xd9381ec2, 0xc813957f,\n 0x6cae0a5d, 0x40a3e13d, 0x84bf99c1, 0x35f2d172, 0xcdaea310, 0x6ac9fbdd, 0xf6f39359, 0x3b0bc5c5,\n 0x929224ef, 0xa650b140, 0x3b0bc5c5, 0x24bfc80f, 0x6905c661, 0xe6460697, 0x67b30275, 0xe75cdb87,\n 0xe444ee97, 0xb889e2d7, 0x3f4d1217, 0x1f6cbaad, 0x6ac9fbdd, 0xf2c9775d, 0x273093e5, 0xac1d7c37,\n 0x7eec1c74, 0x83a3362e, 0x78676dcd, 0x3158389d, 0xedfde341, 0xa33c8f45, 0x255796fd, 0x21af5301,\n 0xa63acec9, 0x673c3eb9, 0xca581dfd, 0x9d3e9be5, 0x33baa295, 0x2d1fe45d, 0xcc4cbbd5, 0x285415f7,\n 0xe6493f87, 0xab3ae759, 0x72d77a37, 0xae73670b, 0x7674dbb1, 0xed13a8c7, 0x57ca9f29, 0xd280ad53,\n 0xf4a4184d, 0x9254bcd5, 0x9dd85cef, 0x6199a3dd, 0xb581d065, 0xab4edadb, 0x2a68d62f, 0x734fcf38,\n 0x766f48fd, 0x982b9639, 0x32bbe4f9, 0x3b8708c5, 0x2401ada1, 0xd655d051, 0xb19651ef, 0xeb166297,\n 0x9be17165, 0xccb1980d, 0x760cedb3, 0x63e18eff, 0x0294278d, 0xa3ebed65, 0x49817fb1, 0xf278feff,\n 0x987ef385, 0x52c0c411, 0x99e73ab0, 0xbed544ab, 0x730351a5, 0x93a47d1b, 0x63033875, 0x2dc56d46,\n 0xf5f3b30b, 0xbe43f89b, 0xae016c73, 0x52bd07e1, 0xb6f6f3fe, 0xff3909cd, 0x557295c7, 0xade16941,\n 0xf0fb1a01, 0x0161eb3b, 0x64320035, 0x8445ba4d, 0x710653c5, 0x0c491265, 0xd1adc673, 0xb34aabed,\n 0xb700ca17, 0xcfb72db7, 0xc1892941, 0xd80b2795, 0x1b055853, 0x733925ed, 0xb76faaf3, 0x94217edd,\n 0xe71b097b, 0xcc9f3afd, 0xb1af50c7, 0x6f9d9a15, 0x61fb6d9b, 0x464b312c, 0x85f6570b, 0x96070b83,\n 0xb876df6d, 0xbdd92233, 0x5295e507, 0x32cadce7, 0x4dd2b86b, 0xe0a58b69, 0xb909704f, 0x0a4ca684,\n 0x090b885d, 0x391a859f, 0x1efef677, 0xee667567, 0xa3db00e5, 0x3c19df65, 0xf6f39359, 0x9fa87cb9,\n 0x9be17165, 0x99f161e5, 0xb4512201, 0xe802ca7a, 0x4ce28808, 0x58e31265, 0xb2c0a219, 0x461f842d,\n 0x1d055413, 0x3f02d529, 0x461f842d, 0xc051b967, 0x581deaa1, 0x1e2ddc7f, 0x36f8d78d, 0x4c4ff03b,\n 0xa300624f, 0x4c42987f, 0x34dd1f8f, 0x6a2e9b65, 0x58e31265, 0xf5528fe5, 0x7e413aad, 0x2505bf8b,\n 0x292df97c, 0x02147f26, 0xef56af2f, 0x6044a0a5, 0x940b4261, 0x099fd55d, 0xe0455ea5, 0x9c81d7e1,\n 0xd4b39b79, 0x714f19f9, 0xab5825e9, 0x2e72d0e5, 0xefc916bd, 0xf026a62d, 0x7999cad1, 0xd1c47a1b,\n 0xab98cd3f, 0x4ab842e1, 0x8225944b, 0x7d050287, 0x00942f29, 0xbba2f25b, 0xfebe3ab9, 0xbfcf382f,\n 0x8ef2c8cd, 0x9bc42519, 0xc873ae67, 0x4eadea0d, 0xbeea2dd5, 0x9f665097, 0x7c4d047b, 0x850c239c,\n 0x42907bdd, 0x2b960839, 0xed57b699, 0xbb7ae8dd, 0xc45b03c9, 0xe2b4e829, 0x426d54d7, 0xa759948f,\n 0x6cae0a5d, 0xeae53e95, 0x8f14b49b, 0xaf792ac7, 0x9a0280a1, 0x5f6a9421, 0x0f9d9745, 0x30f21787,\n 0xc87f5d8d, 0xf48ead51, 0x5b0c5cb8, 0x27bf827b, 0xf389198d, 0x24c7045b, 0x038932bd, 0xf4b2cc5e,\n 0xdcb56f9f, 0x353848ef, 0xe4e4cf5f, 0xf2a5976d, 0xd84a1f36, 0x8f42ce19, 0xe6e0319f, 0xcc9d583d,\n 0x6061d50d, 0x74a966cf, 0x618c4ead, 0x31c82d45, 0xc7adac99, 0x581a4af1, 0x798d5a93, 0xd29d4d6d,\n 0xe319f30f, 0xdc8da58b, 0x538ca0cd, 0xfc193485, 0x0d506237, 0x64e1ab41, 0x64f248cb, 0xd27b4ccd,\n 0xf43f3a73, 0xd240f335, 0x9ae62617, 0x432d4101, 0xf2c122cf, 0xc379e674, 0x84d795e3, 0xb34cb6f7,\n 0xd3fcf7ad, 0xd6841827, 0x112d3413, 0x9c712aff, 0xc43b5f63, 0xa22875e5, 0x1fb4d0cf, 0x20c02064,\n 0xbf7a9239, 0x9d5ca57f, 0xf0de6067, 0xf706ca4f, 0xcfd5ec5d, 0x5383376d, 0xb2c0a219, 0xd4d06f39,\n 0x6cae0a5d, 0x40a3e13d, 0x84bf99c1, 0x35f2d172, 0xcdaea310, 0x6ac9fbdd, 0xf6f39359, 0x3b0bc5c5,\n 0x929224ef, 0x402c8be1, 0x3b0bc5c5, 0x24bfc80f, 0x6905c661, 0xe6460697, 0x67b30275, 0xe75cdb87,\n 0xe444ee97, 0xb889e2d7, 0x3f4d1217, 0x1f6cbaad, 0x6ac9fbdd, 0xf2c9775d, 0x273093e5, 0xac1d7c37,\n 0x7eec1c74, 0x83a3362e, 0x86ee680f, 0x3158389d, 0xedfde341, 0xa33c8f45, 0x255796fd, 0x21af5301,\n);\n", "// The Commodore 64's KERNAL as far as Zoopak calls it, in JavaScript, at the addresses it calls\n// it: the remake's counterpart of @moonbase-machines/apple2e/rom.js, without Commodore's ROM. Each routine\n// takes what the KERNAL took in the registers and the zero page, and leaves what it left there.\n//\n// install({ cpu, read, write, drive, loaded, call, log })\n// cpu a stand-in for the processor: its registers, and `hooks`, which this fills\n// read, write memory as the processor sees it, the I/O page at $D000 by the 6510's port\n// drive the serial bus (printer.js `bus`): a 1541 (drive.js), its files by\n// name, its command channel and its memory, and a printer, device 4, if it is on\n// loaded told of each LOAD: the name, and where the file went\n// call runs the game's own code at an address, to its return: a routine the KERNAL calls\n// through a vector the game has pointed at it (Tell-A-Tale's keyboard decode)\n// held the key held down on the page, as the keyboard's matrix shows it to the KERNAL's\n// scan ({ code, shift }, matrixOf), or none\n//\n// Text out (CHROUT) is the screen editor's part the games use: a character at the cursor, in the\n// colour at $0286 and reversed while $C7 says so; RETURN, CLR and HOME, the cursor keys, RVS ON\n// and OFF, DEL, the colours and the two character sets. A control code it has no use for is\n// nothing, as on the machine. The screen is where $0288 says, the colours at $D800.\nimport { editor } from './editor.js';\n\nexport const VIC = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x37, 0x00, 0x00, 0x00, 0x08, 0x00,\n 0x14, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x06, 0x01, 0x02, 0x03, 0x04, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x4c]; // $D000 to $D02E, as CINT sets them\nexport const VECTORS = [0xea31, 0xfe66, 0xfe47, 0xf34a, 0xf291, 0xf20e, 0xf250, 0xf333, 0xf157, 0xf1ca, 0xf6ed, 0xf13e, 0xf32f, 0xfe66, 0xf4a5, 0xf5ed]; // $0314 on, as RESTOR puts them\nconst COLOURS = { 0x90: 0, 0x05: 1, 0x1c: 2, 0x9f: 3, 0x9c: 4, 0x1e: 5, 0x1f: 6, 0x9e: 7, 0x81: 8, 0x95: 9, 0x96: 10, 0x97: 11, 0x98: 12, 0x99: 13, 0x9a: 14, 0x9b: 15 };\n\n// a PETSCII character as the screen code that shows it\nexport function screenCode(p) {\n if (p >= 0x20 && p < 0x40) return p;\n if (p >= 0x40 && p < 0x60) return p - 0x40;\n if (p >= 0x60 && p < 0x80) return p - 0x20;\n if (p >= 0xa0 && p < 0xc0) return p - 0x40;\n if (p >= 0xc0 && p < 0xff) return p - 0x80;\n return p === 0xff ? 0x5e : 0x20;\n}\n\n// The KERNAL's keyboard tables, which a game reads in the ROM: where each of the four is ($EB79:\n// unshifted, shifted, Commodore key, CTRL), the character of each key of the keyboard's matrix\n// unshifted (Find Me looks a character up in it, for the key to hold down), shifted (BASIC\n// typed with the shift keys), with the Commodore key (the keycaps' left graphics) and with CTRL\n// (the colours, RVS ON and OFF, and the control codes). `kernalByte` gives the byte at an address\n// of the ROM, or undefined where it is not these. (They are the ROM's own bytes.)\nconst UNSHIFTED = [\n 0x14, 0x0d, 0x1d, 0x88, 0x85, 0x86, 0x87, 0x11, // DEL, RETURN, cursor right, F7, F1, F3, F5, cursor down\n 0x33, 0x57, 0x41, 0x34, 0x5a, 0x53, 0x45, 0x01, // 3 W A 4 Z S E, left shift\n 0x35, 0x52, 0x44, 0x36, 0x43, 0x46, 0x54, 0x58, // 5 R D 6 C F T X\n 0x37, 0x59, 0x47, 0x38, 0x42, 0x48, 0x55, 0x56, // 7 Y G 8 B H U V\n 0x39, 0x49, 0x4a, 0x30, 0x4d, 0x4b, 0x4f, 0x4e, // 9 I J 0 M K O N\n 0x2b, 0x50, 0x4c, 0x2d, 0x2e, 0x3a, 0x40, 0x2c, // + P L - . : @ ,\n 0x5c, 0x2a, 0x3b, 0x13, 0x01, 0x3d, 0x5e, 0x2f, // pound * ; HOME, right shift, = up-arrow /\n 0x31, 0x5f, 0x04, 0x32, 0x20, 0x02, 0x51, 0x03, // 1, left arrow, CTRL, 2, space, Commodore key, Q, RUN/STOP\n];\n// and with a shift key down: the second character of each key, a letter's graphic\nconst SHIFTED = [\n 0x94, 0x8d, 0x9d, 0x8c, 0x89, 0x8a, 0x8b, 0x91, // INST, shift RETURN, cursor left, F8, F2, F4, F6, cursor up\n 0x23, 0xd7, 0xc1, 0x24, 0xda, 0xd3, 0xc5, 0x01, // # and the graphics of W A, $, Z S E, left shift\n 0x25, 0xd2, 0xc4, 0x26, 0xc3, 0xc6, 0xd4, 0xd8, // % R D & C F T X\n 0x27, 0xd9, 0xc7, 0x28, 0xc2, 0xc8, 0xd5, 0xd6, // ' Y G ( B H U V\n 0x29, 0xc9, 0xca, 0x30, 0xcd, 0xcb, 0xcf, 0xce, // ) I J 0 M K O N\n 0xdb, 0xd0, 0xcc, 0xdd, 0x3e, 0x5b, 0xba, 0x3c, // + P L - > [ @ <\n 0xa9, 0xc0, 0x5d, 0x93, 0x01, 0x3d, 0xde, 0x3f, // pound * ] CLR, right shift, = pi ?\n 0x21, 0x5f, 0x04, 0x22, 0xa0, 0x02, 0xd1, 0x83, // ! left arrow, CTRL, \" shift space, Commodore key, Q, LOAD and RUN\n];\n// with the Commodore key down: a letter's other graphic, the left one on its keycap; the digits\n// 1 to 8 the second eight colours\nconst COMMODORE = [\n 0x94, 0x8d, 0x9d, 0x8c, 0x89, 0x8a, 0x8b, 0x91, // INST, shift RETURN, cursor left, F8, F2, F4, F6, cursor up\n 0x96, 0xb3, 0xb0, 0x97, 0xad, 0xae, 0xb1, 0x01, // light red, the graphics of W A, dark grey, Z S E, left shift\n 0x98, 0xb2, 0xac, 0x99, 0xbc, 0xbb, 0xa3, 0xbd, // grey, R D, light green, C F T X\n 0x9a, 0xb7, 0xa5, 0x9b, 0xbf, 0xb4, 0xb8, 0xbe, // light blue, Y G, light grey, B H U V\n 0x29, 0xa2, 0xb5, 0x30, 0xa7, 0xa1, 0xb9, 0xaa, // ) I J 0 M K O N\n 0xa6, 0xaf, 0xb6, 0xdc, 0x3e, 0x5b, 0xa4, 0x3c, // + P L - > [ @ <\n 0xa8, 0xdf, 0x5d, 0x93, 0x01, 0x3d, 0xde, 0x3f, // pound * ] CLR, right shift, = pi ?\n 0x81, 0x5f, 0x04, 0x95, 0xa0, 0x02, 0xab, 0x83, // orange, left arrow, CTRL, brown, shift space, Commodore key, Q, LOAD and RUN\n];\n// with CTRL down: the digits 1 to 8 the first eight colours, 9 and 0 RVS ON and OFF, the letters\n// their control codes (A 1 to Z 26); $FF where a key gives nothing\nconst CTRL = [\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // DEL, RETURN, cursor right, F7, F1, F3, F5, cursor down: nothing\n 0x1c, 0x17, 0x01, 0x9f, 0x1a, 0x13, 0x05, 0xff, // red, W A, cyan, Z S, white (E), left shift\n 0x9c, 0x12, 0x04, 0x1e, 0x03, 0x06, 0x14, 0x18, // purple, R (RVS ON) D, green, C F T X\n 0x1f, 0x19, 0x07, 0x9e, 0x02, 0x08, 0x15, 0x16, // blue, Y G, yellow, B H U V\n 0x12, 0x09, 0x0a, 0x92, 0x0d, 0x0b, 0x0f, 0x0e, // RVS ON (9), I J, RVS OFF (0), M K O N\n 0xff, 0x10, 0x0c, 0xff, 0xff, 0x1b, 0x00, 0xff, // + P L - . : @ ,\n 0x1c, 0xff, 0x1d, 0xff, 0xff, 0x1f, 0x1e, 0xff, // pound * ; HOME, right shift, = up-arrow /\n 0x90, 0x06, 0xff, 0x05, 0xff, 0xff, 0x11, 0xff, // black (1), left arrow, CTRL, white (2), space, Commodore key, Q, RUN/STOP\n];\nconst DECODE = [UNSHIFTED, SHIFTED, COMMODORE, CTRL]; // the tables at $EB81, $EBC2, $EC03 and $EC78\nconst TABLES = [0xeb81, 0xebc2, 0xec03, 0xec78];\nexport const KEY_TABLES = [0xeb79, 0xecb9]; // the addresses they take, the four and where they are\nexport function kernalByte(at) {\n if (at >= 0xeb79 && at < 0xeb81) return TABLES[(at - 0xeb79) >> 1] >> ((at & 1) ? 0 : 8) & 0xff;\n const t = TABLES.findIndex(f => at >= f && at <= f + 0x40), code = at - TABLES[t];\n const v = t < 0 ? undefined : code === 0x40 ? 0xff : DECODE[t][code];\n if (v === undefined && at >= KEY_TABLES[0] && at < KEY_TABLES[1]) throw new Error(`the KERNAL's byte at $${at.toString(16).toUpperCase()}: not handled`);\n return v;\n}\n\n// A character as the key of the matrix that types it, and the shift with it: the cursor keys,\n// RETURN, DEL and the keys of the unshifted table; or null (a character typed only into the buffer)\nexport function matrixOf(p) {\n const shifted = { 0x9d: 2, 0x91: 7 };\n if (shifted[p] !== undefined) return { code: shifted[p], shift: 1 };\n const code = UNSHIFTED.indexOf(p);\n return code < 0 || [0x01, 0x02, 0x03, 0x04].includes(p) ? null : { code, shift: 0 };\n}\n\nexport function install({ cpu: c, read, write, drive, loaded = () => {}, call, held = () => null, log = () => {} }) {\n const z = a => read(a), zw = (a, v) => write(a, v & 0xff);\n // the screen editor, as the KERNAL's (editor.js): CHROUT's characters for the screen,\n // the screen cleared, the pointers set; its scroll reads the keyboard's CTRL row as the KERNAL's does\n const ed = editor({ read, write, keyRow: column => { write(0xdc00, column); const v = read(0xdc01); write(0xdc00, 0x7f); return v; } });\n const chrout = ch => ed.chrout(ch), clear = () => ed.clear();\n let typing = false;\n const status = v => zw(0x90, v);\n // Files, as the KERNAL keeps them: a table of up to ten, each its logical number ($0259), its\n // device ($0263) and its secondary address ($026D), how many at $98; the input's device at $99\n // and the output's at $9A. Device 8 is the drive, through the bus; the keyboard (0) and the\n // screen (3) are the KERNAL's own. Any other device on the bus (4 on) is not there: its LISTEN\n // or TALK leaves the status $80, DEVICE NOT PRESENT, and CHKOUT or CHKIN to it fails (5) and\n // leaves the output on the screen, as Goldfields' check for a printer finds ($3EB3).\n const files = () => z(0x98), entry = la => { for (let k = 0; k < files(); k++) if (z(0x259 + k) === la) return k; return -1; };\n const open = () => {\n const la = z(0xb8), fa = z(0xba), sa = z(0xb9);\n if (entry(la) >= 0) { c.a = 2; c.c = 1; return; } // FILE OPEN\n if (files() >= 10) { c.a = 1; c.c = 1; return; } // TOO MANY FILES\n const k = files(); zw(0x259 + k, la); zw(0x263 + k, fa); zw(0x26d + k, sa | 0x60); zw(0x98, k + 1);\n if (fa >= 4) {\n status(0);\n if (z(0xb7)) {\n if (!drive.listen(fa)) { status(0x80); c.a = 5; c.c = 1; return; }\n drive.second((sa | 0x60) | 0xf0); const at = z(0xbb) | z(0xbc) << 8; for (let i = 0; i < z(0xb7); i++) drive.ciout(read(at + i)); drive.unlsn();\n }\n }\n c.c = 0;\n };\n const close = () => {\n const k = entry(c.a); if (k < 0) { c.c = 0; return; }\n const fa = z(0x263 + k), sa = z(0x26d + k);\n if (fa >= 4) { const there = drive.listen(fa); status(there ? 0 : 0x80); if (there) { drive.second((sa & 0xef) | 0xe0); drive.unlsn(); } }\n for (let i = k; i < files() - 1; i++) { zw(0x259 + i, z(0x25a + i)); zw(0x263 + i, z(0x264 + i)); zw(0x26d + i, z(0x26e + i)); }\n zw(0x98, files() - 1); c.c = 0;\n };\n const channel = output => {\n const k = entry(c.x); if (k < 0) { c.a = 3; c.c = 1; return; } // FILE NOT OPEN\n const fa = z(0x263 + k), sa = z(0x26d + k);\n if (fa >= 4) {\n const there = output ? drive.listen(fa) : drive.talk(fa); status(there ? 0 : 0x80);\n if (!there) { c.a = 5; c.c = 1; return; }\n if (output) drive.second(sa); else drive.tksa(sa);\n }\n zw(output ? 0x9a : 0x99, fa); c.c = 0;\n };\n const clrchn = () => { if (z(0x9a) >= 4) drive.unlsn(); if (z(0x99) >= 4) drive.untlk(); zw(0x9a, 3); zw(0x99, 0); };\n const hooks = {\n 0xffd2: () => { if (z(0x9a) >= 4) drive.ciout(c.a); else chrout(c.a); c.c = 0; }, // CHROUT: to the screen, or a device on the bus (the drive's file, the printer)\n 0xffc0: open, 0xffc3: close, 0xffc6: () => channel(false), 0xffc9: () => channel(true), // OPEN, CLOSE, CHKIN, CHKOUT\n 0xffe7: () => { clrchn(); zw(0x98, 0); }, // CLALL\n // CHRIN: from the keyboard, the line typed, a character a call (the screen editor's, its\n // place begun once a call and not again while it waits for keys: `typing`); else a byte from\n // the file on the drive, its status as it ends (none read once it is set: CHKIN clears it)\n 0xffcf: () => {\n if (z(0x99) === 0) {\n if (!typing) { ed.begin(); typing = true; }\n const ch = ed.input();\n if (ch === null) return 'wait';\n typing = false; c.a = ch; c.c = 0; return;\n }\n if (z(0x99) !== 8) throw new Error('CHRIN from device ' + z(0x99) + ': not handled');\n // ($F1AD) with the status already set, a RETURN and no read; else ACPTR's byte\n if (z(0x90)) { c.a = 0x0d; c.c = 0; return; }\n const r = drive.acptr(); if (r) { c.a = r.byte; if (r.eoi) status(z(0x90) | 0x40); } else { c.a = 0x0d; status(z(0x90) | 0x42); } c.c = 0;\n },\n 0xfff0: () => { if (c.c) { c.x = z(0xd6); c.y = z(0xd3); } else { zw(0xd6, c.x); zw(0xd3, c.y); ed.setLine(); } }, // PLOT\n 0xffcc: clrchn, 0xff90: () => { zw(0x9d, c.a); }, // CLRCHN, SETMSG\n 0xffe1: () => { c.z = 0; }, // STOP: not pressed\n 0xffb7: () => { c.a = z(0x90); c.nz(c.a); }, // READST\n 0xffba: () => { zw(0xb8, c.a); zw(0xba, c.x); zw(0xb9, c.y); }, // SETLFS\n 0xffbd: () => { zw(0xb7, c.a); zw(0xbb, c.x); zw(0xbc, c.y); }, // SETNAM\n // LOAD: the file the name says from device 8, where it says or at X and Y; the end in X and Y\n 0xffd5: () => {\n const n = z(0xb7), from = z(0xbb) | z(0xbc) << 8, name = Uint8Array.from({ length: n }, (_, i) => z(from + i)), sa = z(0xb9);\n const raw = z(0xba) === 8 ? drive.load(name) : null;\n if (!raw || raw.length < 2 || c.a !== 0) { c.a = raw ? 4 : 4; c.c = 1; status(0x42); log('LOAD', String.fromCharCode(...name), 'not found'); return; }\n const at = sa === 0 ? c.x | c.y << 8 : raw[0] | raw[1] << 8, body = raw.subarray(2);\n for (let i = 0; i < body.length; i++) write(at + i, body[i]);\n const end = at + body.length;\n zw(0xae, end); zw(0xaf, end >> 8); status(0); c.x = end & 0xff; c.y = end >> 8; c.c = 0; c.a = 0;\n loaded(String.fromCharCode(...name), at, end - 1);\n },\n // SAVE: from the address in the zero page at A to the one in X and Y\n 0xffd8: () => {\n const n = z(0xb7), at = z(0xbb) | z(0xbc) << 8, name = Uint8Array.from({ length: n }, (_, i) => z(at + i));\n const from = z(c.a) | z(c.a + 1) << 8, to = c.x | c.y << 8, body = new Uint8Array(to - from + 2);\n body[0] = from & 0xff; body[1] = from >> 8; for (let i = from; i < to; i++) body[i - from + 2] = read(i);\n drive.save(name, body); c.c = 0; c.a = 0;\n },\n // the serial bus, answered by the drive as the machine's hooks answer it\n 0xffb1: () => status(drive.listen(c.a) ? 0 : 0x80), 0xffb4: () => status(drive.talk(c.a) ? 0 : 0x80),\n 0xff93: () => drive.second(c.a), 0xff96: () => drive.tksa(c.a), 0xffa8: () => drive.ciout(c.a),\n 0xffae: () => drive.unlsn(), 0xffab: () => drive.untlk(),\n 0xffa5: () => { const r = drive.acptr(); if (r) { c.a = r.byte; if (r.eoi) status(z(0x90) | 0x40); } else { c.a = 0x0d; status(z(0x90) | 0x42); } c.c = 0; },\n // the clock at $A0 to $A2, which only the interrupt moves (UDTIM, a sixtieth of a second, and\n // round again after 24 hours), and the keyboard's row with STOP, read as it moves: no key\n 0xffdb: () => { zw(0xa2, c.a); zw(0xa1, c.x); zw(0xa0, c.y); }, 0xffde: () => { c.a = z(0xa2); c.x = z(0xa1); c.y = z(0xa0); },\n 0xffea: () => {\n let t = (z(0xa0) << 16 | z(0xa1) << 8 | z(0xa2)) + 1;\n if (t >= 0x4f1a01) t = 0;\n zw(0xa0, t >> 16); zw(0xa1, t >> 8); zw(0xa2, t); zw(0x91, read(0xdc01));\n },\n // CINT, as MENU calls it within the ROM ($FF5B): the VIC set up, the screen cleared\n 0xff5b: () => { VIC.forEach((v, i) => write(0xd000 + i, v)); zw(0x286, z(0x286) || 14); zw(0x288, z(0x288) || 4); zw(0xc7, 0); clear(); },\n // RESTOR ($FD15): the KERNAL's vectors back to its own\n 0xfd15: () => VECTORS.forEach((v, i) => { zw(0x314 + 2 * i, v); zw(0x315 + 2 * i, v >> 8); }),\n };\n // The keyboard read (SCNKEY, $EA87), from the key it found down: its code in the matrix at $CB\n // and the shift keys at $028D, as the KERNAL's decode takes them on from $EADD (where MENU's\n // interrupt sends a cursor key it holds down for the joystick or the last key, $02). The key\n // goes into the buffer when it is new, or held long enough to repeat (the cursor keys, space\n // and DEL repeat, after 16 interrupts and then every 4). A key held on the page is down in the\n // matrix (`held`); keys typed by a program go into the buffer, as the machine's typing does\n // (machine.js).\n // (or the game's own decode, where it has pointed $028F)\n const decode = () => {\n const own = z(0x28f) | z(0x290) << 8;\n if (own !== 0xeb48) { call(own); return; }\n const code = z(0xcb), shift = z(0x28d);\n // (the table as the KERNAL's decode chooses it, $EB48: SHIFT the shifted, the Commodore key its\n // own, CTRL with or without the others CTRL's; the Commodore key and SHIFT together switch the\n // character set, once a press, unless $0291 locks it, and decode with the table before)\n let table;\n if (shift === 3) { switchSets(shift); table = Math.max(0, TABLES.indexOf(z(0xf5) | z(0xf6) << 8)); }\n else { table = shift * 2 >= 8 ? 3 : shift; zw(0xf5, TABLES[table]); zw(0xf6, TABLES[table] >> 8); }\n const key = code === 0x40 ? 0xff : DECODE[table][code];\n const put = () => {\n zw(0xc5, code); zw(0x28e, shift);\n if (key !== 0xff && z(0xc6) < z(0x289)) { zw(0x277 + z(0xc6), key); zw(0xc6, z(0xc6) + 1); }\n };\n if (code !== z(0xc5)) { zw(0x28c, 0x10); put(); return; } // a new key: in at once, its repeat 16 interrupts on\n const k = key & 0x7f, mode = z(0x28a);\n if (!(mode & 0x80)) { // only these keys repeat, unless all do ($028A)\n if (mode & 0x40) return; // (or none)\n if (k === 0x7f) { put(); return; }\n if (![0x14, 0x20, 0x1d, 0x11].includes(k)) return;\n }\n if (z(0x28c)) { zw(0x28c, z(0x28c) - 1); if (z(0x28c)) return; }\n zw(0x28b, z(0x28b) - 1); if (z(0x28b)) return;\n zw(0x28b, 4);\n if (z(0xc6)) return; // a repeat only into an empty buffer\n put();\n };\n // the scan: the key held down, decoded; or none (keys typed by a program come only through the\n // buffer), which goes past the decode and its vector, and only notes that none is down\n const scnkey = () => {\n const h = held(), shift = h?.shift ?? 0; zw(0x28d, shift); zw(0xcb, h?.code ?? 0x40);\n if (h && h.code !== null) decode(); else { switchSets(shift); zw(0xc5, 0x40); zw(0x28e, shift); }\n };\n // the Commodore key and SHIFT pressed together: the other character set, as $D018 has it\n const switchSets = shift => { if (shift === 3 && z(0x28e) !== 3 && !(z(0x291) & 0x80)) write(0xd018, read(0xd018) ^ 2); };\n hooks[0xeadd] = decode;\n // The interrupt's own routine ($EA31, where $0314 points first): the clock, the cursor's blink\n // (only while BASIC takes a line: $CC is 0), the cassette's motor off, the keyboard; and its end,\n // which a game's own routine goes on to: $EA7B the keyboard read, $EA7E the CIA's interrupt\n // answered, $EA81 the registers back and RTI, which are the remake's to put back\n // ($EA34 the same without the clock, where Goldfields' boot points $0314 while it loads)\n hooks[0xea31] = () => { hooks[0xffea](); hooks[0xea34](); };\n hooks[0xea34] = () => {\n // the cursor's blink, while $CC is 0: every 20 interrupts ($CD) the character at the cursor\n // reversed, it and its colour kept ($CE, $0287) while it is ($CF), and put back after\n if (!z(0xcc)) {\n zw(0xcd, z(0xcd) - 1);\n if (!z(0xcd)) {\n zw(0xcd, 20);\n const y = z(0xd3), at = (z(0xd1) | z(0xd2) << 8) + y, colour = 0xd800 + ((z(0xd1) | z(0xd2) << 8) & 0x3ff) + y;\n const was = z(0xcf) & 1; zw(0xcf, z(0xcf) >> 1);\n let x = z(0x287), a = read(at);\n if (!was) { zw(0xcf, z(0xcf) + 1); zw(0xce, a); zw(0x287, read(colour)); x = z(0x286); a = z(0xce); }\n write(at, a ^ 0x80); write(colour, x);\n }\n }\n if (z(1) & 0x10) { zw(0xc0, 0); zw(1, z(1) | 0x20); } else if (!z(0xc0)) zw(1, z(1) & 0x1f);\n scnkey();\n };\n hooks[0xea7b] = scnkey;\n for (const a of [0xea7e, 0xea81]) hooks[a] = () => {};\n // Two of BASIC's routines, which Tell-A-Tale calls to write a number: a whole number in $62 and\n // $63 into the floating point accumulator (FLOATC, $BC49, X the exponent: $90 for 16 bits, C set\n // for positive), and the accumulator as text (FOUT, entered at $BDDF): its sign at $00FF+Y (Y as\n // FLOATC leaves it, 0), its digits after, a 0 at the end, and its address in A and Y. Another\n // number than a whole one is not handled: it stops the remake.\n hooks[0xbc49] = () => {\n if (c.x !== 0x90 || !c.c) throw new Error('FLOATC with another exponent or sign: not handled');\n let mant = z(0x62) << 24 | z(0x63) << 16, exp = c.x;\n if (!mant) exp = 0; else while (!(mant & 0x80000000)) { mant = (mant << 1) >>> 0; exp--; }\n zw(0x61, exp); zw(0x62, mant >>> 24); zw(0x63, mant >>> 16); zw(0x64, 0); zw(0x65, 0); zw(0x66, 0); zw(0x70, 0); c.y = 0;\n };\n hooks[0xbddf] = () => {\n const exp = z(0x61), mant = (z(0x62) << 24 | z(0x63) << 16 | z(0x64) << 8 | z(0x65)) >>> 0, shift = 0xa0 - exp;\n if (exp && (shift < 0 || shift > 32 || mant % 2 ** shift)) throw new Error('FOUT of a number not whole: not handled');\n const n = exp ? mant / 2 ** shift : 0, sign = z(0x66) & 0x80 ? 0x2d : 0x20, text = String(n);\n write(0xff + c.y, sign); zw(0x66, sign);\n for (let i = 0; i < text.length; i++) write(0x100 + c.y + i, text.charCodeAt(i));\n write(0x100 + c.y + text.length, 0);\n c.a = 0x00; c.y = 0x01; c.x = 0;\n };\n // two of OPEN's and CLOSE's own steps for a file on the drive, which MENU's fast loader calls\n // within the ROM: the secondary address and name sent ($F3D5), and the file closed ($F642)\n hooks[0xf3d5] = () => {\n if (z(0xb9) & 0x80 || !z(0xb7)) { c.c = 0; return; }\n status(drive.listen(z(0xba)) ? 0 : 0x80); drive.second(z(0xb9) | 0xf0);\n const at = z(0xbb) | z(0xbc) << 8; for (let i = 0; i < z(0xb7); i++) drive.ciout(z(at + i));\n drive.unlsn(); c.c = z(0x90) & 0x80 ? 1 : 0;\n };\n hooks[0xf642] = () => { if (z(0xb9) & 0x80) return; const there = drive.listen(z(0xba)); status(there ? 0 : 0x80); if (there) { drive.second((z(0xb9) & 0xef) | 0xe0); drive.unlsn(); } c.c = 0; };\n // and the routines the vectors lead to, which a game's own routine hands on to (MENU's CHROUT\n // ends JMP $F1CA): the same\n Object.assign(hooks, { 0xf1ca: hooks[0xffd2], 0xf4a5: hooks[0xffd5], 0xf5ed: hooks[0xffd8] });\n for (const [a, f] of Object.entries(hooks)) c.hooks.set(+a, f);\n}\n", "// A Commodore 64, as far as the games use it: 64K of RAM with the KERNAL, BASIC and character\n// ROMs banked over it by the 6510's port, the VIC-II's text and bitmap modes and sprites drawn\n// a raster line at a time, its raster interrupt, the two CIAs' timers and the keyboard and\n// joystick through the first, the SID's registers, and the 1541 in drive.js, answered when the\n// KERNAL is asked to load or save and at the KERNAL's serial bus routines, so that the games'\n// own talking to the drive works too. PAL: 312 lines of 63 cycles, 985,248 cycles a second.\nimport { CPU } from '@moonbase-machines/mos6502/cpu.js';\nimport { VIC } from './vic.js';\nimport { Drive } from './drive.js';\nimport { Printer, bus } from './printer.js';\nimport { install as standIn } from './rom.js';\n\nconst LINES = 312, CYCLES_PER_LINE = 63, DISPLAY_START = 15; // (the cycle of a line its first character is fetched at)\n\nexport class C64 {\n constructor(game, roms, { log = () => {}, printer = new Printer({ on: false }) } = {}) {\n this.game = game; this.log = log;\n this.ram = new Uint8Array(0x10000);\n this.kernal = roms.kernal; this.basic = roms.basic; this.chargen = roms.chargen;\n this.color = new Uint8Array(0x400);\n this.port = 0x37; this.portDir = 0x2f;\n this.cia1 = new CIA(); this.cia2 = new CIA();\n this.sid = new Uint8Array(0x20); this.sidWrites = []; // [cycle, register, value] since the last frame\n this.vic = new VIC(this);\n this.keys = new Uint8Array(8); // the keyboard matrix, a bit a key, set while held\n this.joystick = 0; // port 2: up 1, down 2, left 4, right 8, fire 16\n this.drive = new Drive(Uint8Array.from(atob(game.image), c => c.charCodeAt(0)));\n this.printer = printer; // device 4, on the bus if switched on (printer.js)\n this.halted = false; this.frame = 0; this.line = 0;\n this.cpu = new CPU(this, { nmos: true, writeBack: true }); // the 6510 is an NMOS 6502, undocumented NOPs and all, and its read-modify-writes write twice\n // the KERNAL's LOAD, once the name and device are set, and its SAVE; on Commodore's ROMs with\n // their vectors ($0330, $0332) as the KERNAL sets them, its own code instead, on the bus\n // below: its messages (SEARCHING FOR, LOADING, VERIFYING, SAVING) and VERIFY as it does them.\n // A game's own loader at the vector (Zoopak's) is answered here.\n const own = (vector, at) => !roms.standIn && this.read16(vector) === at;\n this.cpu.hooks.set(0xf49e, () => own(0x330, 0xf4a5) ? false : this.load());\n this.cpu.hooks.set(0xf5dd, () => own(0x332, 0xf5ed) ? false : this.save());\n // the serial bus, at the routines the KERNAL's jump table leads to; the status at $90 says\n // whether the device answered, and bit 6 marks the last byte of a file\n const d = this.bus = bus(this.drive, this.printer), st = this.ram;\n // (a device not there adds DEVICE NOT PRESENT to the status, as the KERNAL's $FE1C does; one\n // that answers leaves it as it was: a VERIFY's mismatch, bit 4, kept through the CLOSE after)\n this.cpu.hooks.set(0xed0c, c => { if (!d.listen(c.a)) st[0x90] |= 0x80; return true; });\n this.cpu.hooks.set(0xed09, c => { if (!d.talk(c.a)) st[0x90] |= 0x80; return true; });\n this.cpu.hooks.set(0xedb9, c => { d.second(c.a); return true; });\n this.cpu.hooks.set(0xedc7, c => { d.tksa(c.a); return true; });\n // (CIOUT ends CLC, as Commodore's does: BASIC's CHROUT, $E10C, takes a carry set as an error)\n this.cpu.hooks.set(0xeddd, c => { d.ciout(c.a); c.c = 0; return true; });\n this.cpu.hooks.set(0xedfe, () => { d.unlsn(); return true; });\n this.cpu.hooks.set(0xedef, () => { d.untlk(); return true; });\n this.cpu.hooks.set(0xee13, c => { const r = d.acptr(); if (r) { c.a = r.byte; if (r.eoi) st[0x90] |= 0x40; } else { c.a = 0x0d; st[0x90] |= 0x42; } c.c = 0; return true; });\n // Commodore's ROMs, or moonbase's in their place (rom.js)\n if (roms.standIn) standIn(this);\n this.reset();\n }\n\n reset() { this.port = 0x37; this.portDir = 0x2f; this.cpu.pc = this.read16(0xfffc); this.cpu.sp = 0xfd; this.cpu.i = 1; }\n read16(a) { return this.read(a) | this.read(a + 1) << 8; }\n\n // what the CPU sees, by the port's LORAM, HIRAM and CHAREN bits\n read(a) {\n if (a === 0) return this.portDir;\n if (a === 1) return (this.port & this.portDir) | (~this.portDir & 0x17) & 0xff | 0x10; // the cassette sense reads high\n const p = this.port & 7;\n if (a >= 0xe000) return p & 2 ? this.rom(this.kernal, a) : this.ram[a];\n if (a >= 0xd000 && a < 0xe000) { if (p & 3 && p & 4) return this.io(a); if (p & 3) return this.chargen[a - 0xd000]; return this.ram[a]; }\n if (a >= 0xa000 && a < 0xc000) return (p & 3) === 3 ? this.rom(this.basic, a) : this.ram[a];\n return this.ram[a];\n }\n // a ROM's byte; in moonbase's stand-in only those it has (rom.js), another stops the machine\n rom(r, a) {\n const i = a - (r === this.kernal ? 0xe000 : 0xa000);\n if (r.known && !r.known[i]) throw new Error(`the ${r === this.kernal ? 'KERNAL' : 'BASIC'} ROM at $${a.toString(16).toUpperCase()}: not handled`);\n return r[i];\n }\n write(a, v) {\n if (a === 0) { this.portDir = v; return; }\n if (a === 1) { this.port = v; return; }\n const p = this.port & 7;\n if (a >= 0xd000 && a < 0xe000 && (p & 3) && (p & 4)) { this.ioWrite(a, v); return; }\n this.ram[a] = v; // a write under a ROM goes to the RAM beneath\n }\n\n // the I/O page: the VIC-II at $D000, the SID at $D400, color RAM at $D800, the CIAs at $DC00 and $DD00\n io(a) {\n if (a < 0xd400) return this.vic.read(a & 0x3f);\n if (a < 0xd800) return (a & 0x1f) === 0x1b ? Math.random() * 256 | 0 : (a & 0x1f) === 0x1c ? 0 : this.sid[a & 0x1f]; // OSC3 reads noise, ENV3 nothing\n if (a < 0xdc00) return this.color[a - 0xd800] | 0xf0;\n if (a < 0xdd00) return this.cia1.read(a & 0xf, this);\n if (a < 0xde00) return this.cia2.read(a & 0xf, this);\n return 0xff;\n }\n ioWrite(a, v) {\n if (a < 0xd400) this.vic.write(a & 0x3f, v);\n else if (a < 0xd800) { this.sid[a & 0x1f] = v; this.sidWrites.push([this.cpu.cycles, a & 0x1f, v]); }\n else if (a < 0xdc00) this.color[a - 0xd800] = v & 15;\n else if (a < 0xdd00) this.cia1.write(a & 0xf, v);\n else if (a < 0xde00) this.cia2.write(a & 0xf, v);\n }\n\n // the keyboard matrix as CIA1 scans it: port A selects columns, low; port B reads rows, low\n // for a key held; the joystick in port 2 pulls port A's low bits, in port 1 port B's\n keyboardRows(columns) {\n let rows = 0xff;\n for (let c = 0; c < 8; c++) if (!(columns & (1 << c))) rows &= ~this.keys[c];\n return rows & 0xff;\n }\n\n // the KERNAL's LOAD: the name at ($BB) of $B7 bytes, the device in $BA, the secondary address\n // in $B9, and the address to load at in X and Y when the secondary address is 0. The file goes\n // into memory, the end goes to $AE/$AF and X/Y, and carry clear says it worked.\n load() {\n const c = this.cpu, nameBytes = this.ram.subarray(this.ram[0xbb] | this.ram[0xbc] << 8, (this.ram[0xbb] | this.ram[0xbc] << 8) + this.ram[0xb7]), device = this.ram[0xba], sa = this.ram[0xb9];\n const name = String.fromCharCode(...nameBytes);\n if (device !== 8) { c.a = 5; c.c = 1; return; } // DEVICE NOT PRESENT\n const raw = this.drive.load(nameBytes);\n if (!raw || raw.length < 2 || c.a !== 0) { this.log('LOAD ' + JSON.stringify(name) + (raw ? ' verify' : ' not found')); c.a = 4; c.c = 1; this.ram[0x90] = 0x42; return; }\n const at = sa === 0 ? c.x | c.y << 8 : raw[0] | raw[1] << 8, body = raw.subarray(2);\n for (let i = 0; i < body.length; i++) this.write(at + i, body[i]);\n const end = at + body.length;\n this.ram[0xae] = end & 0xff; this.ram[0xaf] = end >> 8; this.ram[0x90] = 0;\n c.x = end & 0xff; c.y = end >> 8; c.c = 0; c.a = 0;\n this.log('LOAD', JSON.stringify(name), '$' + at.toString(16), body.length + ' bytes');\n }\n // SAVE: the start address is in the zero page at A, the end in X and Y\n save() {\n const c = this.cpu, name = this.pstringAt(this.ram[0xbb] | this.ram[0xbc] << 8, this.ram[0xb7]);\n const from = this.ram[c.a] | this.ram[c.a + 1] << 8, to = c.x | c.y << 8;\n const body = new Uint8Array(to - from + 2); body[0] = from & 0xff; body[1] = from >> 8;\n for (let i = from; i < to; i++) body[i - from + 2] = this.read(i);\n this.drive.save(this.ram.subarray(this.ram[0xbb] | this.ram[0xbc] << 8, (this.ram[0xbb] | this.ram[0xbc] << 8) + this.ram[0xb7]), body);\n this.log('SAVE', JSON.stringify(name), body.length + ' bytes'); c.c = 0; c.a = 0;\n }\n pstringAt(a, n) { let s = ''; for (let i = 0; i < n; i++) s += String.fromCharCode(this.ram[a + i]); return s; }\n\n // a key held or released, by its place in the matrix: column 0 to 7 and row 0 to 7\n key(column, row, down) { if (down) this.keys[column] |= 1 << row; else this.keys[column] &= ~(1 << row); }\n // type a line as if at the keyboard, through the KERNAL's buffer at $0277, once BASIC is ready\n type(text) { const n = Math.min(10, text.length); for (let i = 0; i < n; i++) this.ram[0x277 + i] = text.charCodeAt(i); this.ram[0xc6] = n; return text.slice(n); }\n\n // one raster line: the CPU's cycles, the CIAs' timers, the VIC-II's line, and any interrupt. The\n // line is drawn with the registers and memory as they are where its display starts, cycle 15,\n // as the VIC-II takes them: a register written later in the line (a demo's raster split, after\n // its wait) shows from the next line, as the 64 shows the left of the screen (held to VICE on\n // Subway Arts' $D016 at line $42)\n runLine() {\n const until = this.cpu.cycles + CYCLES_PER_LINE, display = this.cpu.cycles + DISPLAY_START;\n let drawn = false;\n while (this.cpu.cycles < until && !this.halted) {\n if (!drawn && this.cpu.cycles >= display) { this.vic.line(this.line); drawn = true; }\n const before = this.cpu.cycles;\n const pc = this.cpu.pc;\n if ((this.port & 2) === 0 && pc >= 0xe000 && !this.cpu.hooks.has(pc)) { /* RAM under the KERNAL: fine, it runs */ }\n this.cpu.step();\n const spent = this.cpu.cycles - before;\n if (this.cia1.tick(spent) && (this.cia1.icr & 0x80)) this.cpu.irq();\n // (NMI on its edge, as the 6502 takes it: once as CIA 2's line goes active, not again until\n // it has gone inactive, its flags read, and active again; a demo that leaves it active,\n // unacknowledged, is not interrupted for ever after, which is how RESTORE is locked out)\n this.cia2.tick(spent);\n const nmi = (this.cia2.icr & 0x80) !== 0;\n if (nmi && !this.nmiLine) this.cpu.nmi();\n this.nmiLine = nmi;\n }\n if (!drawn) this.vic.line(this.line);\n if (this.vic.irq()) this.cpu.irq();\n this.line = (this.line + 1) % LINES;\n if (this.line === 0) this.frame++;\n }\n runFrame() { for (let i = 0; i < LINES; i++) this.runLine(); }\n}\n\n// A 6526 CIA: two timers counting cycles, an interrupt when one runs out, and two ports.\nclass CIA {\n constructor() { this.ta = 0xffff; this.taLatch = 0xffff; this.tb = 0xffff; this.tbLatch = 0xffff; this.cra = 0; this.crb = 0; this.icr = 0; this.mask = 0; this.pra = 0xff; this.prb = 0xff; this.ddra = 0; this.ddrb = 0; this.tod = 0; }\n read(r, m) {\n switch (r) {\n case 0: return m && this === m.cia1 ? (this.pra | ~this.ddra) & ~(m.joystick) & 0xff : (this.pra | ~this.ddra) & 0xff;\n case 1: return m && this === m.cia1 ? m.keyboardRows(this.pra | ~this.ddra) & (this.prb | ~this.ddrb) : (this.prb | ~this.ddrb) & 0xff;\n case 2: return this.ddra; case 3: return this.ddrb;\n case 4: return this.ta & 0xff; case 5: return this.ta >> 8; case 6: return this.tb & 0xff; case 7: return this.tb >> 8;\n case 8: return 0; case 9: return 0; case 10: return 0; case 11: return 0;\n case 13: { const v = this.icr; this.icr = 0; return v; }\n case 14: return this.cra; case 15: return this.crb;\n }\n return 0;\n }\n write(r, v) {\n switch (r) {\n case 0: this.pra = v; break; case 1: this.prb = v; break; case 2: this.ddra = v; break; case 3: this.ddrb = v; break;\n case 4: this.taLatch = (this.taLatch & 0xff00) | v; break; case 5: this.taLatch = (this.taLatch & 0xff) | v << 8; if (!(this.cra & 1)) this.ta = this.taLatch; break;\n case 6: this.tbLatch = (this.tbLatch & 0xff00) | v; break; case 7: this.tbLatch = (this.tbLatch & 0xff) | v << 8; if (!(this.crb & 1)) this.tb = this.tbLatch; break;\n case 13: if (v & 0x80) this.mask |= v & 0x1f; else this.mask &= ~v; break;\n case 14: this.cra = v; if (v & 0x10) this.ta = this.taLatch; break;\n case 15: this.crb = v; if (v & 0x10) this.tb = this.tbLatch; break;\n }\n }\n // the timers by `cycles`; true when an enabled interrupt is raised\n tick(cycles) {\n let raised = false;\n if (this.cra & 1) {\n this.ta -= cycles;\n while (this.ta < 0) { this.ta += this.taLatch + 1; this.icr |= 1; if (this.cra & 8) { this.cra &= ~1; this.ta = this.taLatch; } if ((this.crb & 0x60) === 0x40 && this.crb & 1) { if (--this.tb < 0) { this.tb = this.tbLatch; this.icr |= 2; } } }\n }\n if (this.crb & 1 && (this.crb & 0x60) === 0) { this.tb -= cycles; while (this.tb < 0) { this.tb += this.tbLatch + 1; this.icr |= 2; if (this.crb & 8) { this.crb &= ~1; this.tb = this.tbLatch; } } }\n if (this.icr & this.mask & 0x1f) { this.icr |= 0x80; raised = true; }\n return raised;\n }\n}\n", "import { cpu as m } from '@moonbase-machines/mos6502';\nexport const { CPU, CYCLES } = m;", "// A printer on the Commodore 64's serial bus, device 4, as the games print to it: OPEN 4,4 (or\n// 4,4,7 for small letters), PRINT# and CLOSE. It keeps what it is sent as lines of characters, in\n// the mode it was in for each (capitals and graphics, or small letters and capitals), for a page\n// to show as a sheet of paper (`paper`). It is not on the bus unless it is switched on, as the\n// machines were sold: with it off, a game finds DEVICE NOT PRESENT, as Goldfields does.\n//\n// The bus (`bus`) puts it beside the drive: LISTEN, SECOND, CIOUT and UNLISTEN go to every device,\n// and each takes them only while it is the one listening; TALK and the rest, and LOAD and SAVE,\n// are the drive's alone.\nimport { screenCode } from './kernal.js';\n\nexport const WIDTH = 80; // the characters a line holds, as Commodore's printers had\n\nexport class Printer {\n constructor({ on = true } = {}) {\n this.on = on;\n this.listening = false; this.lower = false; this.wide = false; this.reverse = false;\n this.lines = []; this.line = [];\n this.changed = () => {}; // called when a line is finished, for a page to draw it\n }\n listen(device) { this.listening = this.on && device === 4; return this.listening; }\n talk() { return false; }\n // the secondary address: 7 is small letters and capitals, the rest capitals and graphics\n second(sa) { if (this.listening) this.lower = (sa & 15) === 7; }\n tksa() {}\n ciout(b) {\n if (!this.listening) return;\n switch (b) {\n case 13: this.feed(); return; // a new line\n case 10: return;\n case 17: this.lower = true; return; // small letters and capitals\n case 145: this.lower = false; return; // capitals and graphics\n case 14: this.wide = true; return; // double width\n case 15: this.wide = false; return;\n case 18: this.reverse = true; return; // reversed\n case 146: this.reverse = false; return;\n case 29: b = 32; break; // (cursor right: a space)\n }\n if ((b & 0x7f) < 32) return; // the other controls\n if (this.line.length >= WIDTH) this.feed();\n this.line.push({ code: b, lower: this.lower, wide: this.wide, reverse: this.reverse });\n }\n feed() { this.lines.push(this.line); this.line = []; this.wide = false; this.reverse = false; this.changed(); }\n unlsn() { this.listening = false; }\n untlk() {}\n acptr() { return null; }\n tear() { this.lines = []; this.line = []; this.changed(); } // the paper torn off\n}\n\n// the drive and the printer on one bus, as the KERNAL's serial routines reach them\nexport function bus(drive, printer) {\n const all = [drive, printer];\n return {\n drive, printer,\n listen: d => all.map(x => x.listen(d)).some(Boolean),\n talk: d => drive.talk(d),\n second: sa => all.forEach(x => x.second(sa)),\n tksa: sa => drive.tksa(sa),\n ciout: b => all.forEach(x => x.ciout(b)),\n unlsn: () => all.forEach(x => x.unlsn()),\n untlk: () => drive.untlk(),\n acptr: () => drive.acptr(),\n load: name => drive.load(name),\n save: (name, raw) => drive.save(name, raw),\n find: name => drive.find(name),\n };\n}\n\n// The sheet: what the printer has printed, drawn on a canvas in the 64's own characters (the\n// character ROM, `chargen`), black on continuous paper with its feed holes down both sides\nexport function paper(canvas, printer, chargen, { scale = 2 } = {}) {\n // (a line a character and a half high, as a printer spaces them)\n const margin = 24, cell = 8 * scale, line = cell * 1.5, rows = Math.max(12, printer.lines.length + 2);\n canvas.width = (WIDTH * 8 + margin * 2) * scale / 2 * 2; canvas.height = rows * line + cell;\n const g = canvas.getContext('2d'), w = canvas.width;\n g.fillStyle = '#fbfaf3'; g.fillRect(0, 0, w, canvas.height);\n for (let r = 0; r < rows; r += 6) { g.fillStyle = '#e6f0e2'; g.fillRect(margin * scale / 2, r * line + cell / 2, w - margin * scale, line * 3); } // the green bars\n g.fillStyle = '#d9d6c8';\n for (let y = cell / 2; y < canvas.height; y += cell * 2) for (const x of [margin * scale / 4, w - margin * scale / 4]) { g.beginPath(); g.arc(x, y, scale * 2.5, 0, Math.PI * 2); g.fill(); }\n const lines = [...printer.lines, printer.line], dot = scale;\n lines.forEach((chars, r) => {\n let x = margin * scale / 2 + cell / 2;\n for (const c of chars) {\n const sc = screenCode(c.code), base = (c.lower ? 0x800 : 0) + sc * 8, wide = c.wide ? 2 : 1;\n for (let py = 0; py < 8; py++) {\n const bits = chargen ? chargen[base + py] : 0;\n for (let px = 0; px < 8; px++) {\n const on = (bits >> (7 - px) & 1) ^ (c.reverse ? 1 : 0);\n if (on) { g.fillStyle = '#26241f'; g.fillRect(x + px * dot * wide, r * line + cell / 2 + py * dot, dot * wide, dot); }\n }\n }\n x += cell * wide;\n }\n });\n}\n", "// The Commodore 64's ROMs in JavaScript, since the ROMs are Commodore's own: the original's\n// counterpart of @moonbase-machines/apple2e/rom.js for the Apple. The games run as they are, their own\n// bytes on the 6510; where one calls into the KERNAL or BASIC, the routine is answered here, at\n// its address, as the remake's KERNAL answers it (kernal.js), and the machine goes on as the\n// ROM's would have left it. A routine not here stops the machine and says where, as the remake\n// does.\n//\n// const roms = standIn() the three ROMs' places, for new C64(game, roms)\n// install(machine) the routines, on the machine's processor\n//\n// What the ROM images hold is only what a game reads as data, each byte with its reason: the\n// processor's three vectors, the KERNAL's keyboard tables (kernal.js `kernalByte`), and three\n// bytes Zoopak's code reads with BIT only to skip the two bytes after it (BIT $AE91, $FBB1 and\n// $FFA9), whose top two bits the flags take. Any other byte read stops the machine too. The\n// character set is moonbase's own 5 by 7 font (@moonbase-machines/charset/font.js), the Apple's: a game\n// that draws in its own characters (Zoopak's, from RAM) is not touched by it.\n//\n// The titles it runs, each held to the remake and to Commodore's ROMs, are `STANDS_IN`: Zoopak,\n// and Goldfields, whose Blitz! code calls BASIC's ROM as its library (basic-rom.js); and Crayon\n// on the 64, Moonbase's own, held to Commodore's ROMs.\nimport { install as kernal, kernalByte, VIC, VECTORS } from './kernal.js';\nimport { CONSTANTS } from './float.js';\nimport { chargen } from '@moonbase-machines/charset/chargen.js';\nimport { install as basicRom, printError, evaluateInMemory } from './basic-rom.js';\nimport { lines, direct, crunch, store, list, program as programLines, dataItems } from './basic-lang.js';\nimport { instantiate, evaluator } from './basic-compile.js';\nimport { Basic } from './basic.js';\nimport { BasicError, ERRORS, val, scanNumber } from './numbers.js';\n\nexport const STANDS_IN = ['zoopak', 'goldfields', 'crayon64', 'crayon64-studio'];\n\nconst BYTES = {\n 0xfffa: 0x43, 0xfffb: 0xfe, // NMI: $FE43\n 0xfffc: 0xe2, 0xfffd: 0xfc, // RESET: $FCE2, the cold start\n 0xfffe: 0x48, 0xffff: 0xff, // IRQ and BRK: $FF48\n 0xae91: 0xbc, 0xfbb1: 0x8d, 0xffa9: 0xdd, // read by BIT only: N set, and V for $FFA9\n};\n\n// a ROM's 8K and which of its bytes are here; reading one that is not stops the machine\nfunction image(from) {\n const bytes = new Uint8Array(0x2000), known = new Uint8Array(0x2000);\n for (let a = from; a < from + 0x2000; a++) {\n let v = BYTES[a];\n if (v === undefined && from === 0xe000) try { v = kernalByte(a); } catch { v = undefined; }\n // (BASIC's constants, which its arithmetic reads from the ROM: float.js)\n for (const [at, bytes] of Object.entries(CONSTANTS)) if (a >= +at && a < +at + bytes.length) v = bytes[a - at];\n if (v !== undefined) { bytes[a - from] = v; known[a - from] = 1; }\n }\n return Object.assign(bytes, { known, from });\n}\nexport function standIn() {\n return { kernal: image(0xe000), basic: image(0xa000), chargen: chargen(), standIn: true };\n}\n\n// The keyboard's matrix as the KERNAL's scan finds it: the first key held that is not a shift\n// key, as its code (column * 8 + row), and the shift keys down as $028D has them (1 SHIFT, 2 the\n// Commodore key, 4 CTRL)\nconst SHIFTS = { 0x0f: 1, 0x34: 1, 0x3d: 2, 0x3a: 4 };\nfunction held(m) {\n let code = null, shift = 0;\n for (let column = 0; column < 8; column++) for (let row = 0; row < 8; row++) {\n if (!(m.keys[column] & 1 << row)) continue;\n const k = column * 8 + row;\n if (SHIFTS[k]) shift |= SHIFTS[k]; else if (code === null) code = k;\n }\n return code === null && !shift ? null : { code, shift }; // (code null: only shift keys down)\n}\n\nexport function install(m) {\n const c = m.cpu, r = a => m.read(a), w = (a, v) => m.write(a, v & 0xff);\n // (CHRGET and CHRGOT, $0073 and $0079, BASIC's in RAM, answered as its ROM's are, whatever is banked)\n const banked = pc => (pc >= 0xe000 && m.port & 2) || (pc >= 0xa000 && pc < 0xc000 && (m.port & 3) === 3) || pc === 0x73 || pc === 0x79;\n const vector = a => r(a) | r(a + 1) << 8;\n // a routine the game's own code calls, run to its return: the keyboard decode a game has\n // pointed $028F at (Tell-A-Tale's)\n const call = at => {\n const back = c.pc, sp = c.sp;\n c.push((back - 1) >> 8); c.push((back - 1) & 0xff); c.pc = at;\n for (let guard = 0; guard < 1e6 && !(c.pc === back && c.sp === sp); guard++) c.step();\n };\n const before = new Set(c.hooks.keys());\n kernal({ cpu: c, read: r, write: w, drive: m.bus, call, held: () => held(m), log: m.log });\n // and what the remake's KERNAL leaves to the remake: GETIN, the next key in the keyboard's\n // buffer ($0277, $C6 of them), or 0, or from the drive when the input is a file on it, as CHRIN\n // reads it; SCNKEY\n // ($FF9F, and $EA87 itself), the interrupt's keyboard read; SCREEN and IOBASE, the screen's size and the I/O's place\n c.hooks.set(0xffe4, () => {\n if (r(0x99) >= 4) return c.hooks.get(0xf157)(c); // (from a file, CHRIN's own way: $F14A on to $F166)\n const n = r(0xc6);\n if (!n) { c.a = 0; c.nz(0); c.c = 0; return; }\n c.a = r(0x277); for (let i = 0; i < n - 1; i++) w(0x277 + i, r(0x278 + i)); w(0xc6, n - 1); c.nz(c.a); c.c = 0;\n });\n c.hooks.set(0xff9f, c.hooks.get(0xea7b));\n c.hooks.set(0xea87, c.hooks.get(0xea7b)); // (and SCNKEY at its own address, past the jump table)\n c.hooks.set(0xffed, () => { c.x = 40; c.y = 25; });\n c.hooks.set(0xfff3, () => { c.x = 0x00; c.y = 0xdc; });\n // The jump table's routines that go through a vector in RAM ($031A to $0333), as the KERNAL's\n // own do (CHROUT, $FFD2, is JMP ($0326)): the routine at the vector's own place, and the table's\n // entry on through the vector, to it or to a game's own routine there (Zoopak's MENU points\n // CHROUT at its own, which draws on its screen and ends JMP $F1CA). But LOAD and SAVE go to the\n // machine's own, at $F49E and $F5DD (machine.js), before their vectors, as with\n // Commodore's ROM: the drive is answered at the KERNAL's routines, not on the serial bus's\n // wires, so a game's own fast loader at the vector (Zoopak's, at $C20C) is gone past.\n const VECTORED = { 0xffc0: [0x31a, 0xf34a], 0xffc3: [0x31c, 0xf291], 0xffc6: [0x31e, 0xf20e], 0xffc9: [0x320, 0xf250], 0xffcc: [0x322, 0xf333],\n 0xffcf: [0x324, 0xf157], 0xffd2: [0x326, 0xf1ca], 0xffe1: [0x328, 0xf6ed], 0xffe4: [0x32a, 0xf13e], 0xffe7: [0x32c, 0xf32f] };\n for (const [entry, [via, own]] of Object.entries(VECTORED).map(([e, v]) => [+e, v])) {\n c.hooks.set(own, c.hooks.get(entry));\n c.hooks.set(entry, () => { c.pc = vector(via); return false; });\n }\n c.hooks.set(0xffd5, () => { w(0xc3, c.x); w(0xc4, c.y); c.pc = 0xf49e; return false; });\n c.hooks.set(0xffd8, () => { c.pc = 0xf5dd; return false; });\n // BASIC's ROM: the routines a program's machine code calls (basic-rom.js), an\n // expression's value from the program being run (its compiled parameters)\n basicRom({ cpu: c, read: r, write: w, chrout: c.hooks.get(0xf1ca),\n // (the program RUN has compiled, the boot, its own compiled parameters; any other text, a\n // program BASIC is not running (Blitz!'s GAME), read from memory and its variables there)\n evaluate: at => {\n const p = program?.params?.[at];\n if (!p) return inMemory(at);\n const [end, f, place] = p;\n return { value: f(basic), end, place };\n } });\n const inMemory = evaluateInMemory({ cpu: c, read: r, write: w, ram: m.ram });\n\n const ours = [...c.hooks.keys()].filter(a => !before.has(a));\n // the return from an interrupt, as the KERNAL's ends ($EA81): Y, X and A back, and RTI\n const exit = () => { c.y = c.pull(); c.x = c.pull(); c.a = c.pull(); c.p = c.pull(); c.pc = c.pull() | c.pull() << 8; };\n const set = (a, f) => c.hooks.set(a, f);\n // CINT ($FF5B), as the KERNAL's goes on after the screen: it waits for the raster's line 0\n // ($D012), takes PAL or NTSC from the VIC's raster interrupt flag ($D019, kept at $02A6), sets\n // CIA 1's timer A for it ($4025 or $4295 cycles, a sixtieth of a second) and starts it, with its\n // interrupt on, and lets the serial bus's clock line go. The VIC is read as the KERNAL reads\n // it, so that a machine that counts its reads counts the same.\n { const screen = c.hooks.get(0xff5b);\n c.hooks.set(0xff5b, () => {\n screen(c);\n for (let guard = 0; guard < 1e5 && r(0xd012) !== 0; guard++);\n w(0x2a6, r(0xd019) & 1);\n const timer = r(0x2a6) ? 0x4025 : 0x4295;\n w(0xdc04, timer); w(0xdc05, timer >> 8);\n w(0xdc0d, 0x81); w(0xdc0e, (r(0xdc0e) & 0x80) | 0x11);\n // and the serial bus's clock line let go ($EE8E): CIA 2's port read back, its bit 4 set\n w(0xdd00, r(0xdd00) | 0x10);\n }); }\n // The interrupt's own routine and its ends, which a game's routine jumps on to: the work (the\n // remake's), the CIA's interrupt answered ($DC0D read), and the return\n for (const a of [0xea31, 0xea34, 0xea7b, 0xea7e]) { const f = c.hooks.get(a); set(a, () => { f(c); r(0xdc0d); exit(); return false; }); }\n set(0xea81, () => { exit(); return false; });\n // the way in: A, X and Y kept, and on through $0316 for BRK or $0314 for an interrupt ($FF48)\n set(0xff48, () => { c.push(c.a); c.push(c.x); c.push(c.y); c.pc = vector(r(0x104 + c.sp) & 0x10 ? 0x316 : 0x314); return false; });\n // NMI, the RESTORE key: on through $0318 ($FE43), whose own routine ($FE47) answers CIA 2 and returns\n set(0xfe43, () => { c.i = 1; c.pc = vector(0x318); return false; });\n set(0xfe47, () => { r(0xdd0d); c.p = c.pull(); c.pc = c.pull() | c.pull() << 8; return false; });\n // the cold start ($FCE2), and BASIC ready for a command (`ready`, at $A480)\n set(0xfce2, () => { coldStart(); c.i = 0; c.pc = 0xa480; return false; });\n set(0xa480, () => ready());\n // where BASIC's LOAD comes back to, when the file loaded has not taken the stack: READY again\n set(0xe178, () => {\n // (a program, loaded at BASIC's start, has its variables after it, as a LOAD from the keyboard sets them)\n if (!r(0xb9)) { w(0x2d, r(0xae)); w(0x2e, r(0xaf)); }\n print('\\rREADY.\\r'); c.sp = 0xff; c.pc = 0xa480; return false;\n });\n // RUN ($A871) and BASIC going on to its next statement ($A7AE), where SYS's machine code and\n // GET's GETIN come back to\n set(0xa871, () => { run(); c.pc = 0xa7ae; return false; });\n set(0xa7ae, () => go());\n // CLR as RUN's own start calls it ($A659: the text pointer at the program's start, and CLEARC,\n // the variables and arrays after its end ($2D), the strings down from the top, $37) and LINKPRG\n // ($A533: each line's link set to the next, from TXTTAB, to the line whose link's high byte is\n // 0), as a cruncher calls them at its end, over the program it has unpacked, before $A7AE runs\n // it: the program read afresh each time, so that $A7AE starts it at its first line\n set(0xa659, () => {\n w(0x2f, r(0x2d)); w(0x30, r(0x2e)); w(0x31, r(0x2d)); w(0x32, r(0x2e)); w(0x33, r(0x37)); w(0x34, r(0x38));\n run(); cont = null; return true;\n });\n set(0xa533, () => {\n for (let at = r(0x2b) | r(0x2c) << 8, k = 0; r(at + 1) && k < 0x10000; k++) {\n let end = at + 4; while (r(end)) end++;\n w(at, (end + 1) & 0xff); w(at + 1, (end + 1) >> 8); at = end + 1;\n }\n if (basic) compile();\n return true;\n });\n // BASIC's errors, as its ROM has them: X the error's number, $A437 on through the vector at\n // $0300 (to $E38B, unless a program has moved it), there to $A43A for an error (X under $80) or\n // READY ($A474) for none; and $A43A the message, IN the line (CURLIN, $39), and READY\n set(0xa437, () => { c.pc = r(0x300) | r(0x301) << 8; return false; });\n set(0xe38b, () => { c.pc = c.x & 0x80 ? 0xa474 : 0xa43a; return false; });\n set(0xa43a, () => { printError(fromRom, '?' + ERRORS[c.x - 1] + ' ERROR', r(0x39) | r(0x3a) << 8); c.sp = 0xff; c.pc = 0xa480; return false; });\n // (the KERNAL's routines, CLRCHN and CHROUT, called as the ROM's error routine calls them: a JSR\n // from it, at $A447, through the jump table and the vector a program may have moved, run on the\n // processor until it returns there)\n const jsr = (at, from) => {\n const sp = c.sp, ret = from + 2, pc = c.pc;\n c.push(ret >> 8); c.push(ret & 0xff); c.pc = at;\n for (let k = 0; k < 1e6 && !(c.pc === ret + 1 && c.sp === sp); k++) c.step();\n c.pc = pc;\n };\n const fromRom = { cpu: { get a() { return c.a; }, set a(v) { c.a = v; }, hooks: { get: at => () => jsr(at, 0xa447) } }, write: w };\n set(0xa474, () => { print('\\rREADY.\\r'); c.sp = 0xff; c.pc = 0xa480; return false; });\n // each of these only while its ROM is in; under it, the RAM's own code runs\n // (and a routine that returns from its caller too, `'return'`, has its caller's return address\n // pulled before its own RTS: basic-rom.js's $E206). An error in a routine the machine code has\n // called goes on as the ROM's does, above; in one a statement of the program has called\n // (`inStatement`, go() below), to the statement's own.\n for (const a of [...ours, 0xa437, 0xe38b, 0xa43a, 0xa474, 0xea81, 0xff48, 0xfe43, 0xfe47, 0xfce2, 0xa480, 0xe178, 0xa871, 0xa7ae, 0xa659, 0xa533]) {\n const f = c.hooks.get(a);\n c.hooks.set(a, cpu => {\n if (!banked(cpu.pc)) return false;\n let result;\n try { result = f(cpu); }\n catch (err) {\n const word = err instanceof BasicError && !inStatement && /^\\?(.*) ERROR$/.exec(err.message)?.[1];\n if (!ERRORS.includes(word)) throw err;\n cpu.x = ERRORS.indexOf(word) + 1; cpu.pc = 0xa437; return false;\n }\n if (result === 'return') { cpu.pull(); cpu.pull(); return true; }\n return result;\n });\n }\n\n const chrout = ch => { const { a, x, y } = c; c.a = ch; c.hooks.get(0xf1ca)(c); Object.assign(c, { a, x, y }); };\n const print = s => { for (const ch of s) chrout(ch.charCodeAt(0)); };\n\n // The machine as the KERNAL and BASIC start it: the I/O (the CIAs, CIA 1's timer A the\n // interrupt sixty times a second, the VIC through CINT), the RAM's first pages cleared and\n // the KERNAL's own variables and vectors set, and the screen cleared with the light blue cursor\n function coldStart() {\n c.i = 1; c.sp = 0xff; m.port = 0x37; m.portDir = 0x2f;\n for (let a = 2; a < 0x400; a++) if (a < 0x100 || a >= 0x200) m.ram[a] = 0;\n w(0xdc0d, 0x7f); w(0xdd0d, 0x7f); w(0xdc00, 0x7f); w(0xdc02, 0xff); w(0xdc03, 0x00);\n w(0xdc0e, 0x08); w(0xdc0f, 0x08); w(0xdd0e, 0x08); w(0xdd0f, 0x08); // the timers stopped, one-shot\n w(0xdd00, 0x07); w(0xdd02, 0x3f);\n w(0xdc04, 0x25); w(0xdc05, 0x40); w(0xdc0d, 0x81); w(0xdc0e, 0x11); // timer A: $4025 cycles, its interrupt on, started\n w(0x282, 0x08); w(0x284, 0xa0); w(0x283, 0x00); w(0x281, 0x00); // the memory BASIC has, $0800 to $A000\n w(0x288, 0x04); w(0x286, 0x0e); w(0x289, 0x0a); w(0x28b, 0x04); w(0x28c, 0x0a); w(0x28a, 0x00);\n w(0x28f, 0x48); w(0x290, 0xeb); // the keyboard's decode, the KERNAL's own ($EB48)\n w(0xf5, 0x81); w(0xf6, 0xeb); // its table, the unshifted ($EB81)\n w(0x2a6, 0x01); // PAL\n w(0x9a, 0x03); w(0x99, 0x00); w(0x9d, 0x80); w(0xcc, 0x01); w(0xcd, 0x14);\n // BASIC's pointers, as it starts with no program (NEW): its text at $0801, the variables and\n // arrays after its empty end, the strings down from the top of its memory, $A000\n const word = (at, v) => { w(at, v); w(at + 1, v >> 8); };\n word(0x2b, 0x0801); word(0x2d, 0x0803); word(0x2f, 0x0803); word(0x31, 0x0803); word(0x33, 0xa000); word(0x37, 0xa000);\n // and its two jumps in RAM: its functions' (JMPER, $54, which a program sets the address of,\n // Blitz!'s calls to the floating point), and USR's ($0310, to ILLEGAL QUANTITY until it is set)\n w(0x54, 0x4c); w(0x310, 0x4c); word(0x311, 0xb248);\n // the rest of BASIC's start ($E453, $E3BF): its vectors (the error's, the main loop's, the\n // tokeniser's, the lister's, a statement's and an expression's routines), the conversions'\n // ($03 and $05: a number to a whole one, and back), CHRGET and CHRGOT in RAM (INC $7A; BNE;\n // INC $7B; LDA $EA60; CMP #$3A; BCS; CMP #$20; BEQ $73; SEC; SBC #$30; SEC; SBC #$D0; RTS, and\n // RND's first seed after them), the garbage collector's step, the fill byte, the input device,\n // the temporary strings' stack empty ($16 at $19), and two bytes of the stack\n [0xe38b, 0xa483, 0xa57c, 0xa71a, 0xa7e4, 0xae86].forEach((v, i) => word(0x300 + 2 * i, v));\n word(0x03, 0xb1aa); word(0x05, 0xb391);\n [0xe6, 0x7a, 0xd0, 0x02, 0xe6, 0x7b, 0xad, 0x60, 0xea, 0xc9, 0x3a, 0xb0, 0x0a, 0xc9, 0x20, 0xf0, 0xef, 0x38, 0xe9, 0x30, 0x38, 0xe9, 0xd0, 0x60,\n 0x80, 0x4f, 0xc7, 0x52, 0x58].forEach((v, i) => w(0x73 + i, v));\n w(0x53, 0x03); w(0x68, 0); w(0x13, 0); w(0x18, 0); w(0x1fd, 1); w(0x1fc, 1); w(0x16, 0x19);\n m.ram[0x800] = 0; m.ram[0x801] = 0; m.ram[0x802] = 0;\n VECTORS.forEach((v, i) => { w(0x314 + 2 * i, v); w(0x315 + 2 * i, v >> 8); });\n VIC.forEach((v, i) => w(0xd000 + i, v));\n c.hooks.get(0xff5b)(c); // CINT: the VIC and the screen\n print('\\rREADY.\\r');\n }\n\n // BASIC's main loop ($A480): a line typed read into the buffer at $0200, as INLIN reads it\n // ($A560: CHRIN's characters, the screen editor's line, to RETURN; past 88, STRING TOO LONG;\n // then a RETURN printed), and carried out. An empty line is read again. A line with a number\n // goes into the program in its place (its number as LINGET reads it, the rest tokenized as\n // CRUNCH tokenizes it: basic-lang.js), the variables cleared, and the next line read.\n // Any other runs at once (direct mode, `direct` below), and READY. Two keep their ways:\n // LOAD\"name\",device[,1], with the KERNAL's own messages, the file loaded\n // as the KERNAL's LOAD loads it, and back as BASIC's LOAD comes back, through the stack, which a\n // file loaded over it (Zoopak's) takes to its own start; and RUN, by $A871.\n let typed = [];\n function ready() {\n for (;;) {\n if (c.hooks.get(0xf157)(c) === 'wait') return 'wait'; // (CHRIN's own routine, past its jump-table entry and vector)\n if (c.a === 0x0d) break;\n typed.push(c.a);\n if (typed.length >= 0x59) { typed = []; c.x = 0x17; c.pc = 0xa437; return false; }\n }\n const text = typed; typed = [];\n text.forEach((ch, i) => w(0x200 + i, ch)); w(0x200 + text.length, 0);\n chrout(0x0d);\n let i = 0;\n while (text[i] === 0x20) i++;\n if (i === text.length) return 'wait';\n w(0x3a, 0xff);\n // a line for the program: its number ($A96B, LINGET: digits, spaces passed over, past 63999\n // a SYNTAX ERROR), its text tokenized, put in its place, and the variables cleared\n if (text[i] >= 0x30 && text[i] <= 0x39) {\n let n = 0;\n for (; i < text.length && (text[i] === 0x20 || text[i] >= 0x30 && text[i] <= 0x39); i++) {\n if (text[i] === 0x20) continue;\n if (n >= 6400) { c.x = 0x0b; c.pc = 0xa437; return false; }\n n = n * 10 + text[i] - 0x30;\n }\n const end = store(m.ram, r(0x2b) | r(0x2c) << 8, n, crunch(text.slice(i)));\n for (const at of [0x2d, 0x2f, 0x31]) { w(at, end); w(at + 1, end >> 8); }\n w(0x33, r(0x37)); w(0x34, r(0x38));\n basic?.clr(); cont = null;\n return 'wait';\n }\n const command = String.fromCharCode(...text.slice(i)).trim();\n if (command === 'RUN') { c.pc = 0xa871; return false; }\n const load = /^LOAD\"([^\"]*)\"(?:,(\\d+))?(?:,(\\d+))?$/.exec(command);\n if (load) {\n const [, name, device = '1', secondary = '0'] = load;\n for (let i = 0; i < name.length; i++) w(0x200 + i, name.charCodeAt(i));\n w(0xb7, name.length); w(0xbb, 0x00); w(0xbc, 0x02); w(0xba, +device); w(0xb9, +secondary); w(0xb8, 1);\n // (the KERNAL's messages, each its return first: \\rSEARCHING FOR name, \\rLOADING)\n print('\\rSEARCHING FOR ' + name);\n c.a = 0; c.x = 0x01; c.y = 0x08; // (where a file with secondary address 0 goes: $0801)\n // the stack as BASIC's LOAD has it, its return to BASIC ($E178) at $01F8, then the load\n c.sp = 0xf7; w(0x1f8, 0x77); w(0x1f9, 0xe1);\n m.load();\n if (c.c) { print('\\r?FILE NOT FOUND ERROR'); c.sp = 0xff; print('\\rREADY.\\r'); return 'wait'; }\n // (LOADING once the file is found; the registers LOAD leaves, its end, kept for BASIC)\n const { a, x, y } = c; print('\\rLOADING'); Object.assign(c, { a, x, y, c: 0 });\n return true; // as the KERNAL's LOAD returns: RTS, to wherever $01F8 now says\n }\n // direct mode: the line tokenized in the buffer, as CRUNCH leaves it, and run after the\n // program's statements\n crunch(text.slice(i)).forEach((b, k) => w(0x200 + k, b));\n return runDirect();\n }\n\n // A program run (RUN): the BASIC program in memory, at TXTTAB ($2B), read (basic-lang.js)\n // and compiled (basic-compile.js) as the remake's are, and its statements carried out\n // by the remake's BASIC (basic.js), on `engine`, this machine as that BASIC asks for one:\n // its memory, the registers it calls the KERNAL with, and the KERNAL's routines by name,\n // answered here. GET and SYS go through the processor, as BASIC's own do: GET calls GETIN at\n // $FFE4, SYS jumps to the machine code; both come back to $A7AE,\n // and the program goes on. LOAD from a program loads, and runs the program again from its start,\n // its variables kept, or the program it has loaded (GAME, over the boot). An error is BASIC's\n // message (basic-rom.js) and READY.\n let program = null, basic = null, statements = [], getting = null, inStatement = false;\n // each step's line, for CURLIN ($39) as it runs and an error's IN (direct mode's $FFFF: none),\n // and where CONT goes on, the step after a STOP or END, until the program is changed\n let lineOf = [], cont = null, waiting = null, paced = -1, budget = 0;\n const DIRECT = 0x10000; // the label the direct statements start at\n const YIELD = Symbol('the processor goes on');\n const routine = at => e => { Object.assign(c, { a: e.a, x: e.x, y: e.y }); c.hooks.get(at)(c); Object.assign(e, { a: c.a, x: c.x, y: c.y, c: c.c, z: c.z, n: c.n, v: c.v }); };\n const engine = {\n get mem() { return m.ram; }, read: r, write: w,\n a: 0, x: 0, y: 0, c: 0, z: 0, n: 0, v: 0, pc: 0, ended: false, idle: 0, polled: false, inside: 0, keys: [], delay: 0, cycles: 0,\n title: { seed: 0x11 },\n routines: {\n chrout: routine(0xf1ca), chrin: routine(0xf157), getin: routine(0xf13e), clrchn: routine(0xf333), chkin: routine(0xf20e), chkout: routine(0xf250),\n open: routine(0xf34a), close: routine(0xf291), setnam: routine(0xffbd), settim: routine(0xffdb), setlfs: routine(0xffba),\n load: e => { Object.assign(c, { a: e.a, x: e.x, y: e.y }); m.load(); Object.assign(e, { a: c.a, x: c.x, y: c.y, c: c.c }); },\n // SYS: BASIC's text pointer at the text after it, its address at $14 as GETADR leaves it,\n // and on through SYS's own ($E130, basic-rom.js), which keeps the registers, back to $A7AE\n sys: (e, at, text) => {\n w(0x7a, text); w(0x7b, text >> 8); w(0x14, at); w(0x15, at >> 8);\n c.push((0xa7ae - 1) >> 8); c.push((0xa7ae - 1) & 0xff); c.pc = 0xe130;\n return YIELD;\n },\n // LOAD in a program\n 'basic-load': (e, [name, device = 1, sa = 0]) => {\n for (let k = 0; k < name.length; k++) w(0x200 + k, name.charCodeAt(k));\n w(0xb7, name.length); w(0xbb, 0x00); w(0xbc, 0x02); w(0xba, device); w(0xb9, sa); w(0xb8, 0);\n Object.assign(e, { a: 0, x: 0x01, y: 0x08 });\n e.routines.load(e);\n if (e.c) throw new BasicError('?FILE NOT FOUND ERROR');\n if (!sa) compile(); else e.pc = 0;\n },\n },\n };\n function compile(all = lines(m.ram, r(0x2b) | r(0x2c) << 8)) {\n program = instantiate(all, { name: 'program', source: 'BASIC\\'s text in memory', mem: m.ram, cost: 0, render: () => '' });\n lineOf = []; let line = 0xffff, start = 0;\n for (const s of all) { if (s.label !== undefined) { line = s.line ?? 0xffff; if (s.label === DIRECT) start = lineOf.length; } else lineOf.push(line); }\n statements = all.filter(s => s.label === undefined);\n if (basic) basic.items = dataItems(m.ram, r(0x2b) | r(0x2c) << 8); // (DATA, as READ reads it)\n engine.pc = 0; engine.ended = false;\n return start;\n }\n function run() { basic = new Basic(engine, { quiet: true }); engine.basic = basic; compile(); }\n // INPUT from the keyboard (Microsoft's INPUT, QINLIN and INLOOP): not in direct mode; the\n // prompt and \"? \", a line read as the main loop reads one (CHRIN, the screen editor's), and\n // its items taken in turn: a string quoted to its closing quote, or to a comma or a colon; a\n // number as FIN reads it, which a comma, a colon or the line's end must follow, or\n // \"?REDO FROM START\" and the INPUT again; a line run out before the variables, \"?? \" and\n // another; items left, \"?EXTRA IGNORED\"; an empty line, the program ended, as END ends it.\n // While a line is read, the run waits here (`inputting`).\n let inputting = null;\n function input(st, k) {\n if (lineOf[k] === 0xffff) throw new BasicError('?ILLEGAL DIRECT ERROR');\n if (!inputting) {\n inputting = { k, n: 0, text: null, at: 0, typed: [] };\n if (st.prompt !== null) for (const ch of st.prompt) chrout(ch.charCodeAt(0));\n print('? ');\n }\n const s = inputting;\n for (;;) {\n if (s.text === null) {\n // a line, to RETURN\n for (;;) {\n if (c.hooks.get(0xf157)(c) === 'wait') { engine.pc = k; c.pc = 0xa7ae; return 'wait'; }\n if (c.a === 0x0d) break;\n s.typed.push(c.a);\n if (s.typed.length >= 0x59) { inputting = null; throw new BasicError('?STRING TOO LONG ERROR'); }\n }\n chrout(0x0d);\n s.text = s.typed; s.typed = []; s.at = 0; s.fresh = true;\n if (!s.text.length && s.n === 0) { inputting = null; engine.ended = true; engine.pc = k + 1; return undefined; }\n }\n const t = s.text, skip = () => { while (t[s.at] === 0x20) s.at++; };\n if (s.n === st.targets.length) {\n if (s.at < t.length) print('?EXTRA IGNORED\\r');\n inputting = null; engine.pc = k + 1; return undefined;\n }\n // this variable's item, or the line run out: another\n // (a line just read is read from, empty or not: an empty one gives 0, or \"\")\n if (s.n > 0 && !s.fresh && (s.at >= t.length || t[s.at] === 0x3a)) { print('?? '); s.text = null; continue; }\n if (!s.fresh && t[s.at] === 0x2c) s.at++; // past the comma (a new line's first comma is an empty item)\n s.fresh = false;\n skip();\n const target = st.targets[s.n], string = target.n.endsWith('$');\n let value;\n if (string) {\n let v = '';\n if (t[s.at] === 0x22) { s.at++; while (s.at < t.length && t[s.at] !== 0x22) v += String.fromCharCode(t[s.at++]); if (t[s.at] === 0x22) s.at++; skip(); }\n else while (s.at < t.length && t[s.at] !== 0x2c && t[s.at] !== 0x3a) v += String.fromCharCode(t[s.at++]);\n value = v;\n } else {\n const n = scanNumber(String.fromCharCode(...t), s.at);\n s.at = n.end; value = val(n.text);\n }\n if (s.at < t.length && t[s.at] !== 0x2c && t[s.at] !== 0x3a) { print('?REDO FROM START\\r'); inputting = null; return input(st, k); }\n if (target.k === 'elem') basic.setElem(target.n, target.i.map(e => evaluator(e)(basic)), value); else basic.set(target.n, value);\n s.n++;\n }\n }\n function breakIn(line) { print('\\rBREAK'); if (line !== undefined && line >> 8 !== 0xff) print(' IN ' + line); }\n // A line run at once (direct mode): its statements after the program's (basic-lang.js\n // `direct`), on the variables the program left, or a BASIC of its own the first time; READY at\n // its end, as at the program's\n function runDirect() {\n if (!basic) { basic = new Basic(engine, { quiet: true }); engine.basic = basic; }\n const all = direct(m.ram, r(0x2b) | r(0x2c) << 8, 0x200);\n all[all.findIndex(s => s.label === 'direct')].label = DIRECT;\n engine.pc = compile(all);\n c.pc = 0xa7ae; return false;\n }\n // LIST ($A69C): from the first line at the first number or after, each a RETURN, then (past\n // the last number, the RETURN printed first, as the ROM prints it, and no more) its number, a\n // space and its text as LIST gives it (basic-lang.js `list`); NEW ($A642): no program, and\n // the variables cleared\n engine.routines['basic-list'] = (e, [from, to]) => {\n for (const l of programLines(m.ram, r(0x2b) | r(0x2c) << 8)) {\n if (l.n < from) continue;\n chrout(0x0d);\n if (l.n > to) break;\n print(l.n + ' '); list(l.bytes).forEach(ch => chrout(ch));\n }\n };\n engine.routines['basic-new'] = e => {\n const at = r(0x2b) | r(0x2c) << 8; w(at, 0); w(at + 1, 0);\n for (const v of [0x2d, 0x2f, 0x31]) { w(v, at + 2); w(v + 1, (at + 2) >> 8); }\n w(0x33, r(0x37)); w(0x34, r(0x38));\n basic?.clr(); cont = null; e.ended = true;\n };\n // SAVE ($E156) and VERIFY ($E165): the program, TXTTAB to VARTAB, to the drive's file, or held\n // to it; in direct mode the KERNAL's messages (SAVING, SEARCHING FOR, VERIFYING), and after a\n // VERIFY, BASIC's OK, or ?VERIFY ERROR where a byte differs. Device 8 only: the tape is not\n // moonbase's.\n const file = (name, device) => {\n if (device !== 8) { if (device === 1) throw new Error('the tape is not handled'); throw new BasicError('?DEVICE NOT PRESENT ERROR'); }\n if (!name.length) throw new BasicError('?MISSING FILE NAME ERROR');\n return Uint8Array.from(name, ch => ch.charCodeAt(0));\n };\n const directMode = () => r(0x3a) === 0xff;\n engine.routines['basic-save'] = (e, [name = '', device = 1]) => {\n const n = file(name, device), from = r(0x2b) | r(0x2c) << 8, to = r(0x2d) | r(0x2e) << 8;\n if (directMode()) print('\\rSAVING ' + name);\n const body = new Uint8Array(to - from + 2); body[0] = from & 0xff; body[1] = from >> 8;\n for (let a = from; a < to; a++) body[a - from + 2] = r(a);\n m.drive.save(n, body);\n };\n engine.routines['basic-verify'] = (e, [name = '', device = 1, sa = 0]) => {\n const n = file(name, device);\n if (directMode()) print('\\rSEARCHING FOR ' + name);\n const raw = m.drive.load(n);\n if (!raw || raw.length < 2) throw new BasicError('?FILE NOT FOUND ERROR');\n if (directMode()) print('\\rVERIFYING');\n const at = sa ? raw[0] | raw[1] << 8 : r(0x2b) | r(0x2c) << 8;\n for (let k = 2; k < raw.length; k++) if (r(at + k - 2) !== raw[k]) throw new BasicError('?VERIFY ERROR');\n print('\\rOK\\r');\n };\n engine.routines['basic-cont'] = e => { if (cont === null) throw new BasicError('?CAN\\'T CONTINUE ERROR'); e.pc = cont; };\n function go() {\n if (getting) {\n const { k, t } = getting; getting = null;\n const ch = c.a, s = ch ? String.fromCharCode(ch) : '';\n basic.set(t.n, t.n.endsWith('$') ? s : (ch ? Number(s) || 0 : 0));\n engine.pc = k + 1;\n }\n for (let i = 0; i < 100000; i++) {\n // (so many statements a frame where the page asks, m.basicPace, as a C64's BASIC takes its\n // time: a wait on the clock, or a FOR counted out for a pause, as long as on the machine)\n if (m.basicPace) { if (m.frame !== paced) { paced = m.frame; budget = m.basicPace; } if (budget-- <= 0) return 'wait'; }\n const k = engine.pc;\n if (engine.ended || k >= program.steps.length) {\n // (an END or STOP in the program leaves CONT the step after it)\n if (engine.ended && /^(end|stop)$/.test(statements[k - 1]?.k) && lineOf[k - 1] !== 0xffff) cont = k;\n // (STOP: BREAK, and IN its line in a program, as BASIC's error path prints it, $A469)\n if (engine.ended && statements[k - 1]?.k === 'stop') breakIn(lineOf[k - 1]);\n print('\\rREADY.\\r'); c.sp = 0xff; c.pc = 0xa480; return false;\n }\n const st = statements[k];\n if (lineOf[k] !== undefined) { w(0x39, lineOf[k]); w(0x3a, lineOf[k] >> 8); }\n // GET: GETIN through the processor, from BASIC's ROM\n // the RUN/STOP key, as BASIC's ISCNTC looks before each statement: BREAK IN the line\n if (r(0x91) === 0x7f && waiting !== k) { w(0xc6, 0); cont = k; breakIn(lineOf[k]); print('\\rREADY.\\r'); c.sp = 0xff; c.pc = 0xa480; return false; }\n waiting = null;\n if (st.k === 'input-keys') { const r1 = input(st, k); if (r1 !== undefined) return r1; continue; }\n if (st.k === 'get') { w(0x13, 0); getting = { k, t: st.t }; c.push((0xa7ae - 1) >> 8); c.push((0xa7ae - 1) & 0xff); c.pc = 0xffe4; return false; }\n engine.pc = k + 1;\n let result;\n try { inStatement = true; result = program.run[k](engine, program.steps); }\n catch (err) {\n if (!(err instanceof BasicError) || !printError(fromRom, err.message, err.basicLine ?? lineOf[k] ?? basic.at)) throw err;\n c.sp = 0xff; c.pc = 0xa480; return false;\n }\n finally { inStatement = false; }\n if (result === YIELD) return false;\n // WAIT, its bits not come: again on the next frame, as the ROM's loop ($B82D) goes on round,\n // RUN/STOP not looked at\n if (st.k === 'wait' && engine.pc === k) { waiting = k; c.pc = 0xa7ae; return 'wait'; }\n }\n return 'wait';\n }\n}\n\n", "import { chargen as m } from '@moonbase-machines/charset';\nexport const { chargen } = m;", "// A Commodore 64's frame painted from memory and the chips' registers, by the VIC-II as the\n// emulator draws it (vic.js), for a remake: its memory, its I/O page's bytes ($D000 to\n// $DFFF as the remake keeps them: the VIC's registers, the colours, CIA 2's bank) and the\n// character ROM, which a text screen in the ROM's own characters needs. And `splits`, where a\n// game's raster interrupt changes the VIC's registers partway down (Find Me's two character\n// sets): each line's interrupt's writes, from the line after, and the last's from the top.\nimport { VIC } from './vic.js';\n\nexport function paint(mem, chip, chargen, vic, splits) {\n const m = { ram: mem, chargen: chargen ?? new Uint8Array(0x1000), color: chip.subarray(0x800, 0xc00), cia2: { pra: chip[0xd00] }, line: 0 };\n vic ??= new VIC(m);\n vic.m = m;\n vic.r.set(chip.subarray(0, 0x40));\n const at = splits?.size ? [...splits].sort((a, b) => a[0] - b[0]) : [];\n // (a split's $100 is CIA 2's first port, the VIC's bank)\n const set = (r, v) => { if (r === 0x100) m.cia2.pra = v; else vic.r[r] = v; };\n if (at.length) for (const [r, v] of at.at(-1)[1]) set(r, v);\n for (let y = 0, k = 0; y < 312; y++) {\n while (k < at.length && at[k][0] < y) { for (const [r, v] of at[k][1]) set(r, v); k++; }\n m.line = y; vic.line(y);\n }\n return vic.frame;\n}\n", "// A picture of what the VIC-II shows, for a tool: a 64's memory and the chips' registers painted as the VIC-II\n// paints them (paint.js, vic.js), a part of the screen cropped and its colours the 64's own (PALETTE), as rows of\n// [r, g, b] (for @moonbase-machines/files/png.js: png, sheet). The screen's dots: a hi-res dot one pixel, a\n// multicolour dot two wide, as the VIC-II makes them; `scale` repeats each pixel across and down.\n//\n// rows({ mem, chip, chargen, crop: [x, y, width, height], scale })\n// mem the 64K the VIC-II reads (in the bank CIA 2's port gives, chip[0xd00])\n// chip the I/O page from $D000, 4K: the VIC-II's registers at 0 to $3F, colour memory at $800, CIA 2's\n// port A at $D00 (registers.chip() makes one from names)\n// chargen the character ROM, where text in the ROM's own characters is shown; none, zeros\n// crop a part of the 320 by 200 screen, from its top left; the whole of it unless given\n// chip({ registers, color, bank }) an I/O page: registers as { 0x11: 0x1b, ... }, colour memory's bytes from\n// $D800, and the VIC-II's bank ($0000, $4000, $8000 or $C000)\nimport { paint } from './paint.js';\nimport { PALETTE, LEFT, TOP, WIDTH } from './vic.js';\n\nexport function chip({ registers = {}, color = [], bank = 0 } = {}) {\n const page = new Uint8Array(0x1000);\n for (const [r, v] of Object.entries(registers)) page[+r] = v;\n page.set(color.slice(0, 0x400), 0x800);\n page[0xd00] = 3 - (bank >> 14); // (CIA 2's port A, its two low bits the bank turned over)\n return page;\n}\n\nexport function rows({ mem, chip: io, chargen, crop = [0, 0, 320, 200], scale = 1 }) {\n const frame = paint(mem, io, chargen), [cx, cy, w, h] = crop, out = [];\n for (let y = 0; y < h; y++) {\n const row = [];\n for (let x = 0; x < w; x++) { const c = PALETTE[frame[(TOP + cy + y) * WIDTH + LEFT + cx + x]]; for (let s = 0; s < scale; s++) row.push(c); }\n for (let s = 0; s < scale; s++) out.push(row);\n }\n return out;\n}\n", "// What a Commodore 64 game SAVEs to its disk, kept on the player's disk (`disk`, opened before the machine\n// starts: { list(), read(name), write(name, bytes) }), each file by its name as the 1541 has it, its raw\n// bytes, the load address first: put back in the drive (drive.js `saved`, which shadows the disk's own\n// files) when the game starts again, and each file saved written there as it is saved.\n//\n// keepDrive(drive, disk)\nexport function keepDrive(drive, disk) {\n for (const f of disk.list()) drive.saved.set(f.name, disk.read(f.name));\n drive.keep = (name, raw) => disk.write(name, raw);\n}\n", "// The SID, as far as a square-wave era of school software used it: three voices, each an\n// oscillator at a 16-bit frequency with a triangle, sawtooth, pulse or noise wave, gated by an\n// attack, decay, sustain and release envelope, mixed under the master volume. Ring modulation,\n// sync and the filter are not here. The machine keeps each register write with its cycle, and\n// `render` turns a frame's writes into samples at the sound card's rate.\nconst CLOCK = 985248;\nconst ATTACK = [2, 8, 16, 24, 38, 56, 68, 80, 100, 250, 500, 800, 1000, 3000, 5000, 8000]; // ms\nconst DECAY = [6, 24, 48, 72, 114, 168, 204, 240, 300, 750, 1500, 2400, 3000, 9000, 15000, 24000];\n\nexport class SID {\n constructor(rate) {\n this.rate = rate; this.r = new Uint8Array(0x20);\n this.v = [0, 1, 2].map(() => ({ phase: 0, env: 0, stage: 'off', noise: 0x7ffff8, noiseOut: 0 }));\n }\n write(reg, val) {\n const prev = this.r[reg]; this.r[reg] = val;\n if (reg % 7 === 4 && reg < 21) { const v = this.v[(reg / 7) | 0]; if ((val & 1) && !(prev & 1)) v.stage = 'attack'; else if (!(val & 1) && (prev & 1)) v.stage = 'release'; }\n }\n // `n` samples, with the writes in `events` as [sampleIndex, reg, val] applied in order\n render(n, events) {\n const out = new Float32Array(n);\n let e = 0;\n for (let i = 0; i < n; i++) {\n while (e < events.length && events[e][0] <= i) { this.write(events[e][1], events[e][2]); e++; }\n let mix = 0;\n for (let k = 0; k < 3; k++) {\n const b = k * 7, v = this.v[k], r = this.r;\n const freq = r[b] | r[b + 1] << 8, ctrl = r[b + 4];\n // the envelope, in levels of 0 to 1 per sample\n const a = ATTACK[r[b + 5] >> 4] / 1000 * this.rate, d = DECAY[r[b + 5] & 15] / 1000 * this.rate, sus = (r[b + 6] >> 4) / 15, rel = DECAY[r[b + 6] & 15] / 1000 * this.rate;\n if (v.stage === 'attack') { v.env += 1 / Math.max(1, a); if (v.env >= 1) { v.env = 1; v.stage = 'decay'; } }\n else if (v.stage === 'decay') { v.env -= (1 - sus) / Math.max(1, d) * 3; if (v.env <= sus) { v.env = sus; v.stage = 'sustain'; } }\n else if (v.stage === 'release') { v.env -= 1 / Math.max(1, rel) * 3; if (v.env <= 0) { v.env = 0; v.stage = 'off'; } }\n if (v.env <= 0 && v.stage !== 'attack') continue;\n // the oscillator: a 24-bit accumulator, as the chip's, stepped by the frequency\n const step = freq * CLOCK / 16777216 / this.rate; // cycles of the wave per sample\n const before = v.phase; v.phase = (v.phase + step) % 1;\n let wave = 0;\n if (ctrl & 0x10) wave += v.phase < 0.5 ? v.phase * 4 - 1 : 3 - v.phase * 4; // triangle\n if (ctrl & 0x20) wave += v.phase * 2 - 1; // sawtooth\n if (ctrl & 0x40) { const pw = (r[b + 2] | (r[b + 3] & 15) << 8) / 4096; wave += v.phase < pw ? 1 : -1; } // pulse\n if (ctrl & 0x80) { if (v.phase < before) { const bit = ((v.noise >> 22) ^ (v.noise >> 17)) & 1; v.noise = ((v.noise << 1) | bit) & 0x7fffff; v.noiseOut = (((v.noise >> 22) & 1) << 7 | ((v.noise >> 20) & 1) << 6 | ((v.noise >> 16) & 1) << 5 | ((v.noise >> 13) & 1) << 4 | ((v.noise >> 11) & 1) << 3 | ((v.noise >> 7) & 1) << 2 | ((v.noise >> 4) & 1) << 1 | ((v.noise >> 2) & 1)) / 128 - 1; } wave += v.noiseOut; }\n mix += wave * v.env;\n }\n out[i] = mix * (this.r[0x18] & 15) / 15 * 0.2;\n }\n return out;\n }\n}\n", "// How a C64 game starts, in a page and in tests that start every game as the page does: which\n// ROMs it runs on, a player page's ?roms=<choice> (/play/<slug>/original/, in the preview),\n// (none), moonbase moonbase's, characters and all (rom.js): the default, as moonbase.au\n// has it\n// commodore Commodore's, where this machine has them: a flag, off unless asked for,\n// kept as everyone else keeps them, to compare\n// moonbase-petscii moonbase's, with Commodore's character ROM, where this machine has it\n//\n// await c64Roms(choice, load) the roms for new C64(game, roms), or null where Commodore's\n// are asked for and cannot be had; load(name) gives a ROM's\n// bytes (<name>.bin), or throws where it is not there\n// typed(m, game) what is typed once BASIC is ready: LOAD\"<start>\",8,1,\n// and RUN for a BASIC program, one loaded at $0801 (ZOOPAK\n// loads over the stack and starts itself, and a RUN typed\n// after it would reach its menu as a stray RETURN)\nimport { standIn } from './rom.js';\n\nexport const ROM_CHOICES = [null, 'commodore', 'moonbase-petscii'];\n\nexport async function c64Roms(choice, load) {\n if (choice !== 'commodore' && choice !== 'moonbase-petscii') return standIn();\n try {\n if (choice === 'moonbase-petscii') return { ...standIn(), chargen: await load('chargen') };\n return { kernal: await load('kernal'), basic: await load('basic'), chargen: await load('chargen') };\n } catch {\n return null;\n }\n}\n\nexport function typed(m, game) {\n const raw = m.drive.find(Uint8Array.from(game.start, c => c.charCodeAt(0)))?.raw;\n return 'LOAD\"' + game.start + '\",8,1\\r' + (raw && (raw[0] | raw[1] << 8) === 0x801 ? 'RUN\\r' : '');\n}\n"],
|
|
5
|
+
"mappings": "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AY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UACpF,UAAY,UAAY,UAAY,UAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,SAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,SAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WACpF,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,UAAY,SAAY,WAAY,WACpF,UAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,UAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UAAY,WACpF,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,UACpF,UAAY,SAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,UAAY,WAAY,UAAY,SAAY,WACpF,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,UAAY,UAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,UAAY,UAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,UAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,WAAY,UAAY,UAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WACpF,WAAY,WAAY,UAAY,UAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,SAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,SAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UACpF,UAAY,UAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,UAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UAAY,WACpF,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,UACpF,UAAY,SAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,QAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,UAAY,WAAY,UAAY,SAAY,WACpF,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UAAY,UACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,UAAY,WAAY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",
|
|
6
|
+
"names": ["basic_compile_exports", "__export", "compile", "evaluator", "instantiate", "basic_lang_exports", "__export", "TOKENS", "crunch", "dataItems", "direct", "expression", "lines", "list", "program", "store", "numbers_exports", "__export", "BasicError", "ERRORS", "fail", "fout", "int16", "nextRandom", "scanNumber", "seedRandom", "val", "float_exports", "__export", "ARG", "ARGOV", "ARISGN", "BITS", "CONSTANTS", "FAC", "FACOV", "FloatError", "Floats", "RESHO", "pack", "setFac", "unpack", "words", "ns", "n", "a", "ex", "f", "m", "memory", "x", "b", "v", "at", "e", "i", "ov", "c", "overflow", "b1", "s", "memMore", "more", "y", "neg", "k", "fac", "mb", "fb", "borrow", "d", "ey", "minus", "low", "lowByte", "sum", "diff", "signed", "top", "keep", "md", "r", "last", "bits", "bit", "p", "carry", "q", "by", "e2", "sign", "from", "tooBig", "z", "odd", "buf", "step", "ch", "hi", "t", "BasicError", "ERRORS", "fail", "what", "page", "floats", "Floats", "a", "v", "at", "bytes", "CONSTANTS", "fout", "b", "pack", "s", "val", "m", "n", "scanNumber", "k", "text", "sp", "digits", "int16", "seedRandom", "seed", "nextRandom", "syntax", "detail", "BasicError", "TOKENS", "T", "t", "k", "FUNCTIONS", "BINARY", "reader", "mem", "at", "r", "b", "letter", "digit", "name", "n", "c", "primary", "m", "from", "s", "take", "e", "expr", "a", "args", "i", "min", "op", "dataItems", "items", "l", "program", "q", "REM_TOKEN", "DATA_TOKEN", "text", "quoted", "direct", "out", "lines", "numbers", "statement", "expression", "order", "line", "next", "one", "err", "word", "say", "x", "target", "v", "printItems", "b2", "number", "fail", "p", "prompt", "targets", "go", "to", "step", "RESLST", "PRINT_TOKEN", "crunch", "buf", "dores", "stuff", "copy", "end", "ch", "y", "count", "found", "d", "list", "bytes", "quote", "txttab", "store", "hex", "v", "w", "q", "s", "here", "js", "a", "c", "store", "t", "isString", "compile", "statements", "name", "source", "mem", "cost", "render", "labels", "steps", "step", "to", "k", "params", "body", "go", "at", "x", "expression", "out", "end", "place", "b", "instantiate", "options", "text", "evaluator", "basic_list_exports", "__export", "listing", "petscii_exports", "__export", "CONTROLS", "bytes", "text", "NAMES", "n", "b", "t", "lower", "out", "k", "c", "end", "name", "v", "listing", "bytes", "lower", "lines", "at", "number", "end", "text", "list", "basic_rom_exports", "__export", "evaluateInMemory", "install", "printError", "basic_exports", "__export", "Basic", "Basic", "e", "data", "quiet", "at", "n", "x", "fail", "int16", "back", "m", "sizes", "dims", "s", "size", "a", "b", "i", "k", "d", "o", "c", "val", "fout", "from", "nextRandom", "seedRandom", "t", "v", "text", "step", "string", "item", "err", "BasicError", "p", "f", "was", "arg", "what", "args", "into", "to", "next", "ch", "name", "la", "fa", "sa", "mask", "xor", "first", "end", "scanNumber", "hex4", "n", "FAC_EXP", "FUNCTIONS", "install", "cpu", "read", "write", "evaluate", "chrout", "c", "txt", "setTxt", "a", "syntax", "BasicError", "chrgot", "v", "chkcom", "last", "frm", "number", "at", "value", "end", "place", "setFac", "whole", "lo", "hi", "getbyt", "out", "ch", "H", "x", "k", "t", "carry", "y", "flag", "below", "top", "compare", "kept", "base", "size", "index", "product", "start", "length", "f", "Floats", "call", "from", "r", "arith", "g", "err", "FloatError", "ERRORS", "ay", "nz", "floating", "run", "regs", "A", "randomState", "nextRandom", "seedRandom", "next", "digit", "power", "e", "clock", "freed", "len", "to", "character", "digits", "cy", "sum", "sign", "r16", "w16", "quote", "candidate", "above", "bltuc", "copy", "first", "bottom", "printError", "message", "line", "what", "text", "s", "evaluateInMemory", "ram", "made", "variable", "kind", "name", "c1", "c2", "p", "unpack", "b", "Basic", "expression", "fn", "evaluator", "browser_exports", "__export", "keyboard", "pace", "painter", "keys_exports", "__export", "CURSOR", "JOYSTICK", "MATRIX", "MODIFIERS", "SHIFTED", "vic_exports", "__export", "HEIGHT", "LEFT", "PALETTE", "TOP", "VIC", "WIDTH", "FIRST_LINE", "LAST_LINE", "m", "r", "v", "line", "target", "a", "b", "full", "y", "py", "out", "row", "border", "bg", "den", "rsel", "csel", "top", "bottom", "left", "right", "prio", "x", "yscroll", "xscroll", "bitmap", "ecm", "mcm", "screenBase", "charBase", "bitmapBase", "sy", "cy", "ly", "cx", "cell", "code", "color", "bits", "colors", "multi", "x0", "pair", "c", "set", "borderOnly", "enabled", "drawn", "s", "sx", "yx", "xx", "height", "ry", "pointer", "data", "behind", "px0", "byte", "k", "base", "d", "PAD_DEAD", "keyboard", "m", "ignore", "onKey", "log", "upper", "down", "held", "pressed", "withCbm", "frame", "release", "key", "shift", "since", "e", "MODIFIERS", "JOYSTICK", "cur", "CURSOR", "letter", "shifted", "SHIFTED", "MATRIX", "cc", "cr", "cbm", "letGo", "padBits", "padStop", "readPads", "bits", "stop", "p", "b", "i", "x", "y", "column", "row", "frames", "painter", "canvas", "ctx", "WIDTH", "HEIGHT", "rgba", "image", "r", "g", "PALETTE", "dy", "o", "dx", "pace", "after", "each", "started", "tick", "due", "d64_exports", "__export", "SECTORS", "add", "make", "petsciiName", "read", "TYPES", "offset", "t", "s", "a", "b", "name16", "text", "out", "c", "i", "name", "id", "files", "image", "used", "n", "take", "ORDER", "free", "start", "k", "entries", "f", "data", "chunks", "places", "at", "part", "dirSectors", "e", "p", "bam", "map", "u", "isFree", "mark", "was", "d", "last", "list", "lastSector", "NAMES", "bytes", "sector", "chain", "parts", "type", "body", "file", "drive_exports", "__export", "Drive", "SECTORS", "TYPES", "OK", "NOT_FOUND", "SYNTAX", "bytes", "s", "c", "upper", "b", "Drive", "_Drive", "image", "n", "a", "parts", "out", "p", "at", "bam", "files", "t", "i", "e", "f", "pattern", "name", "k", "raw", "add", "data", "sector", "line", "text", "blocks", "end", "pad", "free", "device", "sa", "ch", "kind", "byte", "eoi", "cur", "cmd", "code", "m", "editor_exports", "__export", "editor", "COLOURS", "r", "w", "keyRow", "W", "a", "v", "low", "x", "linePointer", "colourPointer", "pnt", "user", "clearLine", "y", "setLine", "max", "clear", "home", "scroll", "kept", "moveLine", "k", "from", "entry", "src", "srcColour", "openLine", "grow", "nextLine", "carriageReturn", "rowEndForward", "end", "rowStartBack", "start", "put", "code", "colour", "advance", "row", "show", "done", "backLine", "chrout", "ch", "shifted", "begin", "take", "i", "input", "n", "s", "glyph_hash_exports", "__export", "glyphHash", "rows", "h", "i", "glyph_hashes_exports", "__export", "GLYPH_HASHES", "kernal_exports", "__export", "KEY_TABLES", "VECTORS", "VIC", "install", "kernalByte", "matrixOf", "screenCode", "VIC", "VECTORS", "screenCode", "p", "UNSHIFTED", "SHIFTED", "COMMODORE", "CTRL", "DECODE", "TABLES", "KEY_TABLES", "kernalByte", "at", "code", "v", "matrixOf", "shifted", "install", "c", "read", "write", "drive", "loaded", "call", "held", "log", "z", "a", "zw", "ed", "editor", "column", "chrout", "ch", "clear", "typing", "status", "files", "entry", "la", "k", "open", "fa", "sa", "i", "close", "there", "channel", "output", "clrchn", "hooks", "r", "n", "from", "name", "_", "raw", "body", "end", "to", "t", "VIC", "VECTORS", "decode", "own", "shift", "table", "switchSets", "key", "put", "mode", "scnkey", "h", "y", "colour", "was", "x", "mant", "exp", "sign", "text", "f", "machine_exports", "__export", "C64", "m", "CPU", "CYCLES", "printer_exports", "__export", "Printer", "WIDTH", "bus", "paper", "WIDTH", "Printer", "on", "device", "sa", "b", "bus", "drive", "printer", "all", "d", "x", "name", "raw", "paper", "canvas", "chargen", "scale", "cell", "line", "rows", "g", "w", "r", "y", "lines", "dot", "chars", "c", "sc", "screenCode", "base", "wide", "py", "bits", "px", "rom_exports", "__export", "STANDS_IN", "install", "standIn", "m", "chargen", "STANDS_IN", "BYTES", "image", "from", "bytes", "known", "a", "v", "kernalByte", "at", "CONSTANTS", "standIn", "chargen", "SHIFTS", "held", "m", "code", "shift", "column", "row", "k", "install", "c", "r", "w", "banked", "pc", "vector", "call", "back", "sp", "guard", "before", "n", "i", "VECTORED", "entry", "via", "own", "e", "p", "program", "inMemory", "end", "f", "place", "basic", "evaluateInMemory", "ours", "exit", "set", "screen", "timer", "coldStart", "ready", "print", "run", "go", "cont", "compile", "printError", "fromRom", "ERRORS", "jsr", "ret", "cpu", "result", "err", "word", "BasicError", "inStatement", "chrout", "ch", "x", "y", "s", "VECTORS", "VIC", "typed", "text", "store", "crunch", "command", "load", "name", "device", "secondary", "b", "runDirect", "statements", "getting", "lineOf", "waiting", "paced", "budget", "DIRECT", "YIELD", "routine", "engine", "sa", "all", "lines", "instantiate", "line", "start", "dataItems", "Basic", "inputting", "input", "st", "t", "skip", "target", "string", "value", "scanNumber", "val", "evaluator", "breakIn", "direct", "to", "l", "list", "file", "directMode", "body", "raw", "r1", "LINES", "CYCLES_PER_LINE", "DISPLAY_START", "C64", "game", "roms", "log", "printer", "Printer", "CIA", "VIC", "Drive", "c", "CPU", "own", "vector", "at", "d", "bus", "st", "r", "install", "a", "p", "i", "v", "columns", "rows", "nameBytes", "device", "sa", "name", "raw", "body", "end", "from", "to", "n", "column", "row", "down", "text", "until", "display", "drawn", "before", "pc", "spent", "nmi", "m", "cycles", "raised", "paint_exports", "__export", "paint", "paint", "mem", "chip", "chargen", "vic", "splits", "m", "VIC", "at", "a", "b", "set", "v", "y", "k", "r", "picture_exports", "__export", "chip", "rows", "chip", "registers", "color", "bank", "page", "r", "v", "rows", "mem", "io", "chargen", "crop", "scale", "frame", "paint", "cx", "cy", "w", "out", "y", "row", "x", "c", "PALETTE", "TOP", "WIDTH", "LEFT", "s", "saves_exports", "__export", "keepDrive", "drive", "disk", "f", "name", "raw", "sid_exports", "__export", "SID", "ATTACK", "DECAY", "SID", "rate", "reg", "val", "prev", "v", "n", "events", "out", "e", "i", "mix", "k", "b", "r", "freq", "ctrl", "a", "d", "sus", "rel", "step", "before", "wave", "pw", "bit", "start_exports", "__export", "ROM_CHOICES", "c64Roms", "typed", "ROM_CHOICES", "c64Roms", "choice", "load", "standIn", "typed", "m", "game", "raw", "c"]
|
|
7
7
|
}
|