@moonbase-machines/player 0.10.0 → 0.12.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/README.md +23 -8
- package/bin/moonbase-play.mjs +18 -7
- package/disk/disk.js +5 -7
- package/dist/moonbase-player.js +16 -16
- package/dist/moonbase-player.js.map +4 -4
- package/engines/original.js +10 -8
- package/engines/scenes.js +29 -31
- package/index.js +2 -0
- package/package.json +6 -6
- package/play.js +59 -50
- package/provider.js +27 -0
- package/remake/README.md +138 -0
- package/settings.js +82 -0
- package/test/play.test.js +76 -2
package/dist/moonbase-player.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/*! @moonbase-machines/player 0.
|
|
2
|
-
var
|
|
3
|
-
`).forEach((o,c)=>{let f=o.replace(/^\s+|\s+$/g,"");if(!f||f.startsWith(";"))return;let l=e+":"+(c+1),d;if(d=/^(L[0-9A-F]{4}|[A-Za-z_][\w-]*):$/.exec(f)){n[d[1]]=t.length;return}if(d=/^data \$([0-9A-F]+)((?: [0-9A-F]{2})+)$/i.exec(f)){r.push({at:parseInt(d[1],16),bytes:d[2].trim().split(" ").map(w=>parseInt(w,16))});return}d=/^([0-9A-F]{4})\s+(.*)$/.exec(f);let g=d?parseInt(d[1],16):null,k=d?d[2]:f;t.push({at:g,words:We(k),text:k,where:l,index:t.length})}),{steps:t,labels:n,data:r}}function Q(s){if(typeof s!="string")return{string:s.string};if(/^-?\d+$/.test(s))return{number:+s};if(/^[axy]$/.test(s)||s==="carry"||s==="borrow")return{reg:s};let e;if(e=/^\$([0-9A-F]+)(?:\[([xy])\])?$/i.exec(s))return{at:parseInt(e[1],16),index:e[2],zp:e[1].length<=2};if(e=/^\(\$([0-9A-F]{2})\)\[y\]$/i.exec(s))return{through:parseInt(e[1],16)};if(e=/^\(\$([0-9A-F]{2})\[x\]\)$/i.exec(s))return{pair:parseInt(e[1],16)};if(e=/^\[\$([0-9A-F]{4})\](?:\[([xy])\])?$/i.exec(s))return{via:parseInt(e[1],16),index:e[2]};throw new Error("not an operand: "+s)}function $e(s){if(s.at===null)return 1;let e=s.words,t=parseInt(e.at(-1).slice(1),16),n=s.at+(e.length===6?yi(e[3]):0)+2&65535;return/^L[0-9A-F]{4}$/.test(e.at(-1))&&(t&65280)!==(n&65280)?2:1}var wi,We,yi,He=U(()=>{wi=/"(?:[^"\\]|\\.)*"|\S+/g;We=s=>s.match(wi).map(e=>e.startsWith('"')?{string:JSON.parse(e)}:e);yi=s=>/^\d+$/.test(s)||/^\$[0-9A-F]{2}(\[[xy]\])?$/i.test(s)||/^\(\$/.test(s)?2:3});import{cpu as bi}from"@moonbase-machines/mos6502";var uo,pt,ks=U(()=>{({CPU:uo,CYCLES:pt}=bi)});var $s={};F($s,{Engine:()=>Ce,label16:()=>je});function vs(s){if(s===32)return 3;if(s===0||s===64||s===96)return 1;let e=s>>2&7,t=s&3;return t===1?e===3||e===6||e===7?3:2:e===0?t===2||(s&224)>=160?2:1:e===2||e===6?t===0||t===2?1:2:e===4?2:e===3||e===7?3:2}var ws,vi,ys,bs,Si,Ss,Es,je,Ce,ut=U(()=>{He();ks();ws={left:!0},vi=new Set(["if","goto","call","return","compare","test","asm","push","pull"]),ys=s=>vi.has(s.words[0])||/^(=|\+=|-=|&=|\|=|\^=|<<=|>>=|rotate)$/.test(s.words[1]),bs=1020.484;Si=new Set([234,169,162,160,165,166,164,173,174,172,24,56]),Ss=s=>s.words[0]==="if"&&s.words.length===6,Es=s=>s?.at==null?void 0:s.at+2&65535,je=s=>"L"+s.toString(16).toUpperCase().padStart(4,"0"),Ce=class{constructor({routines:e,scripts:t,start:n,label:r,memory:o={}}){this.routines=e,this.sources=t,this.mem=new Uint8Array(65536);for(let[c,f]of Object.entries(o))this.mem[c]=f;this.a=0,this.x=0,this.y=0,this.n=0,this.z=0,this.c=0,this.v=0,this.d=0,this.stack=[],this.keys=[],this.listeners=[],this.takers=[],this.ended=!1,this.timed=!!e.timed,this.cycles=0,this.clicks=[],this.delay=0,this.programs={},e.setup?.(this),this.enter(n,r,!0)}on(e){this.listeners.push(e)}emit(e){this.inside&&(e.inside=!0);for(let t of this.listeners)t(e)}inside=0;press(e){this.keys.push(e)}key(){let e=this.keys.shift();if(e!==void 0)for(let t of this.takers)t(e);return e}onKey(e){return this.takers.push(e),()=>{this.takers=this.takers.filter(t=>t!==e)}}enter(e,t,n=!1){let r=this.script(e);if(n)for(let o of r.data)this.mem.set(o.bytes,o.at);this.program=r,this.name=e,this.pc=t===void 0?0:this.label(t)}script(e){if(this.programs[e])return this.programs[e];let t=this.sources[e];if(t===void 0)throw new Error("no script "+e);let n=this.programs[e]=typeof t=="string"?Ee(t,e):{labels:t.labels,data:t.data.map(([r,o])=>({at:r,bytes:o})),steps:t.steps.map(([r,o,c],f)=>({at:r,text:c,where:e+":"+o,run:t.run[f],words:We(c),index:f}))};for(let[r,o]of Object.entries(n.labels)){let c=/^L[0-9A-F]{4}$/.test(r)?parseInt(r.slice(1),16):null;c!==null&&n.steps[o]?.at>c&&(n.steps[o].start=c),c!==null&&n.steps[o]?.at===c&&(n.steps[o].entered=!0)}return n}callInside(e,t,n,r){this.stack.push({name:this.name,pc:this.pc,inside:!0,done:n,ret:r}),this.inside++,this.enter(e,t)}leave(e,t){throw this.stack=[],this.problem=null,this.waitingOn=null,this.visited=null,this.enter(e,t),ws}visit(e){this.visiting=e}startVisit(e){let[t,n]=this.title.visit[this.visiting];this.visiting=void 0,this.visited||(this.visited={name:this.name,pc:e,stack:this.stack,problem:this.problem,waitingOn:this.waitingOn,asked:this.asked,askMode:this.askMode,regs:[this.a,this.x,this.y,this.n,this.z,this.c,this.v]},this.title.raster?.keepScreen(),this.inside++,this.emit({step:"keep-screen"}),this.inside--,this.routines.show(this,[],null)),this.stack=[{visit:!0}],this.problem=null,this.waitingOn=null,this.asked=null,this.a=2,this.c=0,this.enter(t,n)}endVisit(){let e=this.visited;this.visited=null,this.title.raster?.putScreen(),this.inside++,this.emit({step:"put-screen"}),this.inside--,this.routines.show(this,[],null),this.enter(e.name),Object.assign(this,{pc:e.pc,stack:e.stack,problem:e.problem,waitingOn:e.waitingOn,asked:e.asked,askMode:e.askMode}),[this.a,this.x,this.y,this.n,this.z,this.c,this.v]=e.regs}label(e){let t=this.program.labels[e];if(t===void 0)throw new Error(this.name+": no label "+e);return t}place(e){if(e.through!==void 0)return(this.mem[e.through]|this.mem[e.through+1]<<8)+this.y&65535;if(e.pair!==void 0){let t=e.pair+this.x&255;return this.mem[t]|this.mem[t+1&255]<<8}return e.via!==void 0?(this.mem[e.via]|this.mem[e.via+1]<<8)+(e.index?this[e.index]:0)&65535:e.at+(e.index?this[e.index]:0)&65535}read(e){return this.io&&this.ioAt(e)?this.io(e)&255:this.mem[e]}write(e,t){this.io&&this.ioAt(e)?this.io(e,t&255):this.mem[e]=t}ioAt(e){return(e&65280)===49152}get(e){return e.number!==void 0?e.number&255:e.reg==="carry"?this.c:e.reg?this[e.reg]:this.read(this.place(e))}load(e){return this.timed&&(e.index&&!e.zp||e.through!==void 0)&&((e.through!==void 0?this.mem[e.through]|this.mem[e.through+1]<<8:e.via!==void 0?this.mem[e.via]|this.mem[e.via+1]<<8:e.at)&255)+this[e.index??"y"]>255&&this.cycles++,this.get(e)}ix(e,t){return this.timed&&(e&255)+t>255&&this.cycles++,e+t&65535}set(e,t){if(t&=255,e.reg){this[e.reg]=t;return}this.write(this.place(e),t)}flags(e){return this.n=e>>7&1,this.z=e===0?1:0,e}compare(e,t){let n=e-t&511;this.c=e>=t?1:0,this.flags(n&255)}time(e,t,n){if(!this.timed)return;let r=e[t].cycles;if(r===void 0){r=0;for(let o=t;o<=n;o++)r+=this.cost(e,o);e[t].cycles=r}this.cycles+=r,this.delay+=r/bs}cost(e,t){let n=e[t],r=this.mem;if(n.at===null)return 0;let o=pt[r[n.at]]+(Ss(n)?2:0),c=!n.entered&&!["return","goto"].includes(e[t-1]?.words[0])?e[t-1]:null;if(n.start!==void 0||c&&c.at!==null){let f=n.start??c.at+vs(r[c.at])+(Ss(c)?2:0)+(this.routines.inline?.(this,c)??0);if(f<n.at&&n.at-f<=9){let l=0,d=f;for(;d<n.at&&Si.has(r[d]);d+=vs(r[d]))l+=pt[r[d]];d===n.at&&(o+=l)}}return o}add(e){if(this.d){let r=(this.a&15)+(e&15)+this.c,o=(this.a>>4)+(e>>4);r>9&&(r-=10,o++),this.z=(this.a+e+this.c&255)===0?1:0,this.n=o&8?1:0,this.v=~(this.a^e)&(this.a^o<<4)&128?1:0,o>9?(o-=10,this.c=1):this.c=0,this.a=(o<<4|r)&255;return}let t=this.a,n=t+e+this.c;this.v=~(t^e)&(t^n)&128?1:0,this.c=n>255?1:0,this.a=this.flags(n&255)}sub(e){if(!this.d)return this.add(e^255);let t=(this.a&15)-(e&15)-(1-this.c),n=(this.a>>4)-(e>>4);t<0&&(t+=10,n--);let r=this.a-e-(1-this.c);this.z=(r&255)===0?1:0,this.n=r&128?1:0,this.v=(this.a^e)&(this.a^r)&128?1:0,this.c=r>=0?1:0,n<0&&(n+=10),this.a=(n<<4|t)&255}shift(e,t,n){let r=t?(e<<1|(n?this.c:0))&255:e>>1|(n&&this.c?128:0);return this.c=t?e>>7:e&1,this.flags(r)}test(e){this.n=e>>7&1,this.v=e>>6&1,this.z=(e&this.a)===0?1:0}jump(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["goto-engine"](this,["$"+e.slice(1)],t);this.pc=this.label(e)}jumpThrough(e,t){let n=je(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[n]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+n.slice(1)],t);this.pc=this.label(n)}jumpTable(e,t){this.pc=this.label(je(this.mem[e+t]|this.mem[e+t+1]<<8))}call(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["call-engine"](this,["$"+e.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:Es(t)}),this.pc=this.label(e)}callThrough(e,t){let n=je(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[n]===void 0&&this.routines["call-engine"])return this.routines["call-engine"](this,["$"+n.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:Es(t)}),this.pc=this.label(n)}ret(e){let t=this.stack.pop();if(!t)throw new Error("return with nothing called");if(t.visit){this.endVisit();return}let n=this.pulled;if(t.a!==void 0&&this.stack.at(-1)?.a!==void 0){let r=this.stack.pop().a,o=(r<<8|t.a)+1&65535,c=je(o);if(n?.ret!==void 0&&o>n.ret&&o-n.ret<=256){this.pulled=null,n.name!==this.name&&this.enter(n.name),this.pc=n.pc,n.inside&&(this.inside--,n.done?.(this));return}if(n?.ret!==void 0&&o<=n.ret&&n.ret-o<=32&&this.script(n.name).labels[c]!==void 0){this.pulled=null,n.name!==this.name&&this.enter(n.name),this.pc=this.label(c),n.inside&&(this.again=this.again?.ret===n.ret?{...this.again,n:this.again.n+1}:{ret:n.ret,done:n.done,n:1});return}if(this.program.labels[c]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+c.slice(1)],e);this.pc=this.label(c);return}if(n&&this.stack.length<n.depth&&(this.pulled=null,n.inside&&n.ret!==void 0&&this.inside--),t.name!==this.name&&this.enter(t.name),this.pc=t.pc,t.inside&&(this.inside--,t.done?.(this)),this.again&&t.ret===this.again.ret){let r=this.again;this.again=null,this.inside-=r.n,r.done?.(this)}t.after?.(this)}push(e){this.stack.push(e?{a:this.a}:{flags:[this.n,this.z,this.c,this.v]})}pull(e){let t=this.stack.at(-1);if(t&&t.name!==void 0){let r=t.ret===void 0?0:t.half?t.ret>>8:t.ret&255;t.half?(this.stack.pop(),t.depth=this.stack.length,this.pulled=t,t.inside&&t.ret===void 0&&this.inside--):t.half=!0,e&&(this.a=this.flags(r));return}let n=this.stack.pop();e?this.a=this.flags(n.a):[this.n,this.z,this.c,this.v]=n.flags}sp(){return 255-this.stack.reduce((e,t)=>e+(t.name===void 0||t.half?1:2),0)&255}stackPage(){let e=this.sp();(this.stacks??=new Map).set(e,this.stack.map(n=>({...n})));let t=255;for(let n of this.stack){let r=n.ret??0;n.name===void 0?this.mem[256+t--]=n.a??(n.flags?n.flags[0]<<7|n.flags[3]<<6|48|n.flags[1]<<1|n.flags[2]:0):(this.mem[256+t--]=r>>8,n.half||(this.mem[256+t--]=r&255))}return e}asm(e){if(e==="TSX"&&(this.x=this.flags(this.stackPage())),e==="TXS"){let t=this.stacks?.get(this.x);this.stack=t?t.map(n=>({...n})):[],this.visited=null,this.inside=this.stack.filter(n=>n.inside).length}e==="CLV"&&(this.v=0),e==="SED"&&(this.d=1),e==="CLD"&&(this.d=0),e==="SEI"&&(this.i=1),e==="CLI"&&(this.i=0)}run(e=1e7){this.pacing||(this.idle=0),this.pacing=!1,this.delay??=0;for(let t=0;t<e;t++){if(this.ended)return"end";let n=this.program.steps[this.pc];if(!n)throw new Error(this.name+": ran off the end");if(this.routines.before?.(this,n)==="wait"||this.exec(n)==="wait")return"idle";if(this.polled)return this.polled=!1,"idle";if(this.delay>=16)return this.pacing=!0,"pace"}return"steps"}exec(e){let t=this.pc;this.pc++;try{this.called=!1,!e.run&&ys(e)&&this.time(this.program.steps,t,t);let n=e.run?e.run(this,this.program.steps):this.interpret(e);if(n==="wait"&&(e.run?this.called:!ys(e))&&(this.pc=t,this.visiting!==void 0)){this.startVisit(t);return}return n}catch(n){if(n===ws){this.inside=0;return}if(this.routines.error?.(this,n)){this.ended=!0;return}throw n.message=e.where+" ("+e.text+"): "+n.message,n}}interpret(e){let t=e.words,[n,r]=t;if(r==="="&&t.length===3){let o=Q(n),c=this.load(Q(t[2]));if(o.reg==="carry"){this.c=c&1;return}this.set(o,c),o.reg&&this.flags(c);return}if(r==="+="||r==="-="){let o=Q(n),c=t.length===3?this.get(Q(t[2])):this.load(Q(t[2]));if(t.length===3){let f=this.get(o)+(r==="+="?c:-c)&255;this.set(o,f),this.flags(f);return}r==="+="?this.add(c):this.sub(c);return}if(r==="&="||r==="|="||r==="^="){let o=this.load(Q(t[2]));this.a=this.flags(r==="&="?this.a&o:r==="|="?this.a|o:this.a^o);return}if(r==="<<="||r===">>="||r==="rotate"){let o=Q(n);this.set(o,this.shift(this.get(o),r==="<<="||t[2]==="left",r==="rotate"));return}switch(n){case"if":return this.branch(t,e);case"goto":return t[1].startsWith("(")?this.jumpThrough(parseInt(t[1].slice(2,-1),16),e):t[1].startsWith("[")?this.jumpTable(parseInt(t[1].slice(2),16),this[t[2][0]]):this.jump(t[1],e);case"call":return t[1].startsWith("(")?this.callThrough(parseInt(t[1].slice(2,-1),16),e):this.call(t[1],e);case"return":return this.ret(e);case"compare":this.compare(this[t[1]],this.load(Q(t[2])));return;case"test":this.test(this.get(Q(t[1])));return;case"asm":if(t[1]==="RTI")return this.ret(e);this.asm(t[1]);return;case"push":this.push(t[1]==="a");return;case"pull":this.pull(t[1]==="a");return}return this.routine(n,t.slice(1),e)}routine(e,t,n){let r=this.routines[e];if(!r)throw new Error("no routine "+e);if(this.called=!0,n&&this.timed&&n.at!==null){let o=this.cost(this.program.steps,n.index);this.cycles+=o,this.delay+=o/bs}return r(this,t,n)}branch(e,t){let n=e.at(-1),r=e.slice(1,-2),o;if(r.length===3&&/^[axy]$/.test(r[0]))this.compare(this[r[0]],this.load(Q(r[2]))),o={"==":this.z,"!=":!this.z,">=":this.c,"<":!this.c}[r[1]];else{let c=r[0]==="not",f=c?r[1]:r[0],l={zero:this.z,carry:this.c,negative:this.n,overflow:this.v}[f];if(l===void 0)throw new Error("no flag "+f);o=c?!l:!!l}o&&(this.cycles+=$e(t),this.pc=this.label(n))}}});var Os={};F(Os,{GIVES:()=>xe,POLLS:()=>Ei,TAKES:()=>de,WAITS:()=>$i,describe:()=>G,nothing:()=>mt,result:()=>ee});function G(s,e,t,n,r,o){let c={step:s};e.length&&(c.n=e.map(Number));let f=de[s];if(s==="objects")c.table="$"+(t.x|t.y<<8).toString(16).toUpperCase().padStart(4,"0");else if(s.startsWith("object")&&t.a<2)c.a=t.a;else if(f)for(let l of f)c[l]=t[l];if((s==="key-at"||s==="key")&&c.a!==void 0&&(c.a=String.fromCharCode(c.a&127)),Cs[s]&&r)for(let[l,d]of Object.entries(Cs[s]))c[l]=r(d);if(js[s]&&o)for(let[l,d]of Object.entries(js[s]))c[l]=o(d);return n!==void 0&&(c.words=n),c}function ee(s,e){let t={result:s};for(let n of xe[s])t[n]=e[n];return t}var de,js,Cs,xe,mt,Ei,$i,we=U(()=>{de={box:"axy",object:"axy","object-keep":"axy","object-mode":"axy",objects:"xy",span:"axy",random:"a",beep:"a","key-at":"axy",key:"a",multiply:"ax",divide:"axy",ask:"a","ask-mode":"a","ask-escape":"a",rectangle:"axy","read-dot":"xy",problem:"a",dot:"axy","fill-rows":"axy",part:"a","rectangle-outline":"axy","key-panel":"a","keep-span":"xy","put-span":"xy","white-lines":"y","invert-span":"xy",label:"a","flip-box":"a","flash-box":"a",path:"ax",jump:"a",cell:"axy","cell-box":"axy",pair:"a",piece:"axy",colour:"a",tick:"",print:"axyc",arrow:"a",unpack:"y","load-picture":"a","action-cards":"a","return-key":"a","space-key":"a","wipe-rows":"a","wipe-columns":"a","text-card":"a","fill-left":"a","put-object":"axy","draw-room-objects":"yc",take:"y",drop:"y",effect:"a",outport:"a",cout:"a",char:"a",message:"xy",describe:"axy",chrout:"a",plot:"xyc",close:"a",chkin:"x",chkout:"x",setlfs:"axy",setnam:"axy",load:"axy",save:"axy",listen:"a",second:"a",ciout:"a",talk:"a",tksa:"a",setmsg:"a",tone:"xy","load-objects":"axy",hposn:"axy",hlin:"axy",hcolor:"x",pause:"a","bag-put":"a"},js={colour:{shape:3605},"card-frame":{x:16504,high:16505,y:16506,width:16507,height:16508}},Cs={line:{x0:0,x1:1,y0:2,y1:3,color:17},piece:{color:17},rectangle:{width:14,height:15},"rectangle-outline":{width:14,height:15}};xe={random:"a",ask:"ax","ask-mode":"ax","ask-escape":"axc","wait-or-escape":"c",problem:"c","read-key":"a","read-dot":"a",multiply:"ax",divide:"ax","blink-key":"a","which-box":"xy",tick:"a","choose-action":"a",take:"a",drop:"a","show-bag":"a","bag-choose":"a",getin:"a",acptr:"a",readst:"a",load:"cxy",chrin:"a"},mt=(s,e)=>s==="beep"&&e===0,Ei=new Set(["read-key","blink-key"]),$i=new Set(["wait","wait-erase","wait-or-escape","ask","ask-mode","ask-escape","which-box","tick","choose-action","take","drop","show-bag","bag-choose"])});var Ls={};F(Ls,{helpers:()=>xt});function xt(s,e){let t=s.title.map.vars.zero;function*n(f,...l){let d={words:[f]},g=l.map(k=>typeof k=="string"&&f==="text"?{string:k}:typeof k=="number"?String(k):k);for(;;){if(e[f](s,g,d)!=="wait")return{a:s.a,x:s.x,y:s.y,c:s.c};yield"wait"}}let r=(f,l=0,d,g)=>{s.a=l&255,d!==void 0&&(s.x=d&255),g!==void 0&&(s.y=g&255),s.title.paint?.[f]?.(s.title.model,s),s.emit(G(f,[],s,void 0,k=>s.mem[k+t],k=>s.mem[k]))};function*o(f="wait"){let l={words:[f]};for(;;){let d=s.key();if(d===5&&s.title?.menu&&s.leave(...s.title.menu),s.title?.visit?.[d]){s.visit(d),s.waitingOn=l,yield"wait";continue}if(d!==void 0)return s.waitingOn=null,d;s.waitingOn=l,yield"wait"}}function*c(f){s.inside++;try{return yield*f}finally{s.inside--}}return{e:s,mem:s.mem,call:n,drawn:r,key:o,inside:c}}var gt=U(()=>{we()});import{objects as ji}from"@moonbase-machines/vector";var As,yo,Rs,Ve,Ye=U(()=>{({carry:As,decode:yo,put:Rs,tables:Ve}=ji)});var Ts={};F(Ts,{pictures:()=>Oe,shapes:()=>Oi,windows:()=>Li});import{pictures as Ci}from"@moonbase-machines/vector";var Oe,Oi,Li,_e=U(()=>{({pictures:Oe,shapes:Oi,windows:Li}=Ci)});import{font as Ai}from"@moonbase-machines/vector";var Eo,$o,Xe,Is,Ms,ie,Le=U(()=>{({GLYPHS:Eo,WIDTHS:$o,dots:Xe,start:Is,useFont:Ms,width:ie}=Ai)});import{draw as Ri}from"@moonbase-machines/vector";var Oo,Ps,Lo,Ao,Ns,Ro,kt,To,Io,Ds=U(()=>{({crossings:Oo,draw:Ps,fill:Lo,inside:Ao,line:Ns,outline:Ro,screen:kt,spans:To,under:Io}=Ri)});var Bs={};F(Bs,{LAYOUT:()=>ge,PANELS:()=>Ae,layout:()=>Re,resolve:()=>ye,textLayout:()=>Te,textPage:()=>ke,textPen:()=>Ie,word:()=>Us});function Us(s,[e,t,n,r]){let o=e|t<<8,c=r===255?n:s[n|r<<8];for(;c-- >0;)o+=s[o]+1;let f="";for(let l=1;l<=s[o];l++)f+=String.fromCharCode(s[o+l]&127);return f}function Re(s,e){let t=e,n=[];t.tall=!1,t.margin=t.x;let r=9,o=!1,c=[],f=t.ink,l=!1,d=k=>{if(c.length){let w=Is(c.map(j=>j.ch),t.spacing,t.x,t.centre),x=[];for(let j of c){let O=ie(j.ch);x.push({ch:j.ch,x:w,ink:j.ink}),w+=j.ch.charCodeAt(0)<32?O:O+t.spacing}n.push({top:t.y,tall:t.tall,height:r,paper:t.paper,ink:t.ink,chars:x}),t.x=w}c=[],k&&(t.y+=(t.tall?2*r:r)+t.gap,t.x=t.margin)},g=k=>c.push({ch:o&&k>="0"&&k<="9"?String.fromCharCode(128+k.charCodeAt(0)-48):k,ink:l?f:void 0});for(let k=0;k<s.length;k++){let w=s[k];if(w===`
|
|
4
|
-
`){
|
|
5
|
-
`){r(!0);continue}if(f==="{"){let l=s.indexOf("}",c),[d,g]=s.slice(c+1,l).split(":"),k=(g??"").split(",").map(w=>parseInt(w,16));switch(c=l,parseInt(d,16)){case 0:r(!1),e.x=e.margin=k[0];break;case 1:r(!1),k[0]<192&&(e.y=k[0]);break;case 7:e.centre=!0;break;case 8:e.centre=!1;break;case 13:e.inverse=!0;break;case 14:e.inverse=!1;break;case 15:for(let w=0;w<(k[1]||256);w++)o(String.fromCharCode(k[0]&127));break}continue}o(f)}return r(!1),t}var ge,re,le,Ae,ye,Ie,ke,Me=U(()=>{Le();ge={65:[116,116,174],50:[116,116,160],49:[130,130,174],34:[130,130,160],17:[158,158,174]},re=(s,e,t,n,r)=>({layout:s,rows:e,fill:10,paper:10,ink:0,gap:t,y:n,more:r}),le=(s,e,t,n)=>({layout:s,rows:e,fill:5,paper:5,ink:15,gap:t,y:n}),Ae={1:re(50,[116,159],7,128),2:re(50,[116,159],33,135),3:re(34,[130,159],5,135),4:re(34,[130,159],19,142),5:le(34,[160,189],5,166),6:le(34,[160,189],19,172),7:re(65,[116,173],5,121),8:re(65,[116,173],6,128),9:re(65,[116,173],7,134),10:re(65,[116,173],47,142),11:re(50,[116,159],5,121),12:re(49,[130,173],5,135),13:re(49,[130,173],7,142),14:re(49,[130,173],33,149),15:re(17,[158,173],5,163,[174]),16:le(50,[160,189],19,172),17:le(66,[160,189],19,172),18:le(50,[160,189],5,166),19:le(66,[160,189],5,166),20:le(35,[160,189],0,163),21:le(51,[160,189],0,163),22:le(67,[160,189],0,163),23:le(49,[174,189],5,179),24:le(65,[174,189],5,179)};ye=(s,e)=>s.replace(/\{6:([0-9a-f,]+)\}/g,(t,n)=>Us(e,n.split(",").map(r=>parseInt(r,16))));Ie=()=>({x:0,y:0,margin:0,centre:!1,inverse:!1}),ke=()=>Array.from({length:24},()=>Array.from({length:40},()=>({ch:" ",inverse:!1})))});var zs={};F(zs,{Raster:()=>Pe});var Pe,wt=U(()=>{Ds();Ye();Le();Me();Pe=class{constructor(){this.dots=kt(15),this.kept=null}keepScreen(){this.screenKept={dots:this.dots,kept:this.kept},this.dots=kt(0)}putScreen(){this.screenKept&&({dots:this.dots,kept:this.kept}=this.screenKept),this.screenKept=null}scroll(){for(let e=19;e<=115;e++){let t=this.dots[e],n=[];for(let r of t)n.push(r>>3&1,r>>2&1,r>>1&1,r&1);for(let r=14;r<518;r++)n[r]=n[r+28];for(let r=0;r<140;r++)t[r]=n[4*r]<<3|n[4*r+1]<<2|n[4*r+2]<<1|n[4*r+3]}}set(e,t,n){e>=0&&e<140&&t>=0&&t<192&&(this.dots[t][e]=n&15)}get(e,t){return e>=0&&e<140&&t>=0&&t<192?this.dots[t][e]:0}span(e,t,n,r){for(let o=t;o<=n;o++)this.set(o,r,e)}rows(e,t,n,r){for(let o=n;o<n+t;o++)this.span(e,0,139,o),r&&(this.set(0,o,15),this.set(139,o,15))}whiteLines(e){this.span(15,0,139,e),this.span(15,0,139,e+1)}box(e,t,n,r){let[o,c,f]=ge[e]??ge[50];if(t!==128){this.span(0,1,138,1),this.span(0,1,138,o-1);for(let l=2;l<o-1;l++)this.set(1,l,0),this.set(138,l,0),this.span(t,2,137,l)}n!==128&&(this.whiteLines(c),this.rows(n,f-c-2,c+2,!0)),r!==128&&(this.whiteLines(f),this.rows(r,190-f-2,f+2,!0))}panel(e,t,n){this.whiteLines(e),this.rows(n,t-e-1,e+2,!0)}picture(e){Ps(e,this.dots)}rectangle(e,t,n,r,o){for(let c=n;c<n+o;c++)this.span(e,t,t+r-1,c)}outline(e,t,n,r,o){this.span(e,t,t+r-1,n),this.span(e,t,t+r-1,n+o-1);for(let c=n;c<n+o;c++)this.set(t,c,e),this.set(t+r-1,c,e)}line(e,t,n,r,o){for(let[c,f]of Ns(t,n,r,o))this.set(c,f,e)}object(e,t,n,r){r==="keep"&&(this.kept={x:t,y:n,rows:e.rows.map((o,c)=>o.map((f,l)=>this.get(t+l,n+c)))}),Rs(this.dots,e,t,n,r==="whole")}restore(){let e=this.kept;e&&e.rows.forEach((t,n)=>t.forEach((r,o)=>this.set(e.x+o,e.y+n,r)))}glyph(e,t,n,r,o,c=1,f=9,l=0){let d=ie(e);if(e.charCodeAt(0)<32){for(let k=0;k<Math.min(9,f);k++)for(let w=0;w<d;w++)for(let x=0;x<c;x++)this.set(t+w,n+k*c+x,o);return d}let g=new Set(Xe(e).map(([k,w])=>k+","+w));for(let k=0;k<Math.min(9,f);k++)for(let w=0;w<d+l;w++)for(let x=0;x<c;x++)this.set(t+w,n+k*c+x,g.has(w+","+k)?r:o);return d}}});import{mli as Ti}from"@moonbase-machines/apple2e";var Fs,yt,Je,bt=U(()=>{({BLOCK:Fs,CLOCK:yt,Files:Je}=Ti)});var Hs={};F(Hs,{codeFiles:()=>Ne,pictureShapes:()=>Ii,vectorRoutines:()=>vt});function Ne(s,e){let t=s?.loads??{};return Object.entries(e).filter(([n])=>/^(PART|PROB)\d$/.test(n)).map(([n,r])=>({name:n,bytes:Uint8Array.from(atob(r.data),o=>o.charCodeAt(0)),origin:t[n]??t[n.slice(0,-1)]??r.aux}))}function pe(s,e,t){let n=de[e]||"",r=[],o=0;e==="panel"&&r.push(t[o++]);let c={a:s.a,x:s.x,y:s.y};if(e==="objects"&&t[0]?.startsWith?.("$")){let f=parseInt(t[o++].slice(1),16);c.x=f&255,c.y=f>>8}else for(let f of n){let l=t[o++];l===void 0||l===f||(c[f]=typeof l=="object"?l.string.charCodeAt(0)|128:l.startsWith("$")?s.mem[parseInt(l.slice(1),16)]:+l)}return s.a=c.a&255,s.x=c.x&255,s.y=c.y&255,{fixed:r,rest:t.slice(o)}}function Ge(s,e,t,n,r,o){for(s.waitingOn!==e&&(s.emit(G(t,n,s,r)),s.waitingOn=e,s.asked=null);;){let c=s.key();if(c===void 0)return"wait";if(c===te.menu&&s.title.menu&&s.leave(...s.title.menu),s.title.visit?.[c])return s.visit(c),"wait";if(o(c)){s.waitingOn=null;return}}}function qs(s,e){if(e){s.inside++;try{for(let t=e.next();!t.done;t=e.next())if(t.value==="wait")throw new Error("a choice drawn inside the ask cannot wait")}finally{s.inside--}}}function Ks(s){if(s.objectTables||!s.disk)return s.objectTables;let e=Ne(s.map,Object.values(s.disk.volumes)[0]);return s.objectTables=new Map(Ve(e,s.map.objects).map(t=>[t.address,t.objects]))}function Ws(s){if(s.pictureShapes||!s.disk)return s.pictureShapes;let e=Object.values(s.disk.volumes)[0],t=new Map;for(let[n,r]of Object.entries(e))if(/^PICS\d$/.test(n))for(let o of Oe(Uint8Array.from(atob(r.data),c=>c.charCodeAt(0))))t.set(o.name,o.shapes);return s.pictureShapes=t}function vt(s){let e=s.map.vars,t=a=>e.zero+a;Ms(s.font);let n=a=>{if(a.a<2)return;let p=Ks(s)?.get(a.objectTable)?.find(m=>m.number===a.a);p&&(a.c=As(p,a.x),a.mem[t(2)]=a.y+p.height&255)},r=s.raster??=new Pe,o=s.pen??={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10};s.text??={showing:!1,pen:Ie(),page:ke()};let c=(a,p)=>Ks(s)?.get(a.objectTable)?.find(m=>m.number===p),f=(a,p)=>{if(a.a<2)return r.restore();let m=c(a,a.a);m&&r.object(m,a.x,a.y,p)},l=a=>{let p=ie(a),m=o.x,y=(p<4?4-p:0)+1;r.rectangle(1,m,o.y-2,Math.max(4,p)+4,11),r.outline(13,m,o.y-2,Math.max(4,p)+4,11),r.glyph(a,m+1+y,o.y,15,1,1,8),o.x=m+1+y+p+1+2},d=a=>{let p=s.map.keyPanel;if(!p)return;let m=r.get(2,2),{x:y,y:E}=o;for(let L=p.top;L<p.top+p.rows;L++)r.span(m,p.left,p.right,L);p.caps.forEach(([L,C,M],S)=>{(!a||a===S+1)&&(o.x=L,o.y=C,l(String.fromCharCode(M&127)))}),Object.assign(o,{x:y,y:E})},g=(a,p)=>{for(let m of Re(ye(p,a.mem),o))for(let y of m.chars)r.glyph(y.ch,y.x,m.top,y.ink??m.ink,m.paper,m.tall?2:1,m.height,o.spacing)},k=(a,p,m,y,E)=>{let L=c(a,p);L&&r.object(L,m,y,E)};s.model={raster:r,pen:o,cap:l,keyPanel:d,print:g,put:k};let w=(a,p)=>(m,y,E)=>{let{fixed:L,rest:C}=pe(m,a,y),M=C.map(S=>typeof S=="object"?S.string:S).join(" ");m.emit(G(a,L,m,C.length?M:void 0,S=>m.mem[t(S)])),C=C.map(S=>typeof S=="object"?S.string:S),p?.(m,L,C)},x=!s.map.askClearsCarry,j=a=>(p,m,y)=>{p.waitingOn!==y&&pe(p,a,m);let E=p.waitingOn===y?p.askMode:p.a;p.askMode=E;let L=[te.left,te.right,te.down,te.up];E===128&&p.waitingOn!==y&&d(0);let C=Ge(p,y,a,[],void 0,M=>{if(a==="ask-escape"&&M===te.escape)return p.a=p.flags(27),p.x=155,p.c=1,p.asked=null,!0;if(p.asked===null){let S=-1,A=M;return E===128?(S=L.indexOf(M),A=219+S,S>=0&&d(S+1)):E>=177&&E<186?M>=49&&M<=(E&127)&&(S=M-49):(A=M&95,A>=65&&A<=(E&95&127)&&(S=A-65,A|=128)),S>=0&&(p.asked={place:S,key:A},a==="ask-mode"&&qs(p,p.askHooks?.chose?.(S))),!1}return M===te.return?(p.x=p.asked.place,p.y=2*p.x,p.a=p.asked.key,p.c=x&&p.a>=193?1:0,!0):((M===te.delete||M===te.left)&&(a==="ask-mode"&&qs(p,p.askHooks?.undo?.(p.asked.place)),E===128&&d(0),p.asked=null),!1)});return C!=="wait"&&(p.mem[e.layout]=34,p.emit(ee(a,p))),C},O={show:w("show",a=>{s.text.showing=!1,a.mem[49181]=128}),"text-screen":a=>{Object.assign(s.text,{showing:!0,page:ke()}),a.mem[49181]=0,a.inside++,a.emit({step:"text-screen"}),a.inside--},picture:w("picture",(a,p,[m])=>{let y=Ws(s)?.get(m.toUpperCase().replace(/_/g," "));y&&r.picture(y)}),box:w("box",a=>r.box(a.mem[e.layout],a.a,a.x,a.y)),panel:w("panel",(a,[p])=>{let m=Ae[p];if(m){a.mem[e.layout]=m.layout,r.panel(m.rows[0],m.rows[1],m.fill);for(let y of m.more??[])r.whiteLines(y);Object.assign(o,{paper:m.paper,ink:m.ink,centre:!0,spacing:1,gap:m.gap,y:m.y})}}),text:(a,p)=>{let m=p[0].string.replace(/\{([0-9a-f]+):([^}]*)\}/g,(y,E,L)=>"{"+E+":"+L.split(",").map(C=>C.startsWith("$")?a.mem[parseInt(C.slice(1),16)].toString(16):C).join(",")+"}").replace(/\{\$([0-9A-Fa-f]{4})\}/g,(y,E)=>String.fromCharCode(a.mem[parseInt(E,16)]&127));if(a.emit(G("text",[],a,m)),s.text.showing){for(let y of Te(ye(m,a.mem),s.text.pen))s.text.page[y.row]?.[y.col]&&(s.text.page[y.row][y.col]={ch:y.ch,inverse:y.inverse});return}g(a,m)},objects:w("objects",a=>{a.objectTable=a.x|a.y<<8}),object:w("object",a=>{f(a,"whole"),n(a)}),"object-keep":w("object-keep",a=>{f(a,"keep"),n(a)}),"object-mode":w("object-mode",a=>f(a,"clear")),"key-at":w("key-at",a=>{o.x=a.x,o.y=a.y,l(String.fromCharCode(a.a&127))}),key:w("key",a=>l(String.fromCharCode(a.a&127))),"white-lines":w("white-lines",a=>r.whiteLines(a.y)),"fill-rows":w("fill-rows",a=>r.rows(a.a,a.x,a.y,a.c)),span:w("span",a=>r.span(a.a,a.x,a.y,a.mem[t(2)])),dot:w("dot",a=>{r.set(a.x,a.y,a.a),a.a=a.x%7<<4|a.a&15}),line:w("line",a=>r.line(a.mem[t(17)],a.mem[t(0)],a.mem[t(2)],a.mem[t(1)],a.mem[t(3)])),rectangle:w("rectangle",a=>r.rectangle(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)])),"rectangle-outline":w("rectangle-outline",a=>r.outline(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)]+1)),flash:w("flash"),"read-dot":(a,p)=>{pe(a,"read-dot",p),a.emit(G("read-dot",[],a)),a.a=a.flags(r.get(a.x,a.y)),a.emit(ee("read-dot",a))},"key-panel":w("key-panel",a=>d(a.a)),"keep-span":w("keep-span"),"put-span":w("put-span"),"invert-span":w("invert-span"),button:w("button"),beep:(a,p)=>{pe(a,"beep",p),mt("beep",a.a)||a.emit(G("beep",[],a))},sound:(a,p)=>a.emit(G("sound",[],a,p.map(m=>m.startsWith("$")?a.mem[parseInt(m.slice(1),16)].toString(16):m).join(" "))),scroll:a=>{r.scroll(),a.inside++,a.emit({step:"scroll"}),a.inside--},"shift-down":(a,p)=>{let[m,y,E,L,C]=p.map(Number);for(let M=L;M>=E;M--)for(let S=m;S<=y;S++)r.set(S,M+C,r.get(S,M));a.inside++,a.emit({step:"shift-down",left:m,right:y,top:E,bottom:L,by:C}),a.inside--},part:w("part"),wait:(a,p,m)=>Ge(a,m,"wait",[],void 0,y=>y===te.space&&(a.a=32,a.c=0,!0)),"wait-erase":(a,p,m)=>Ge(a,m,"wait-erase",[],void 0,y=>y===te.space),"wait-or-escape":(a,p,m)=>{let y=Ge(a,m,"wait-or-escape",[],void 0,E=>(E===te.space||E===te.escape)&&(a.c=E===te.escape?1:0,a.a=E,!0));return y!=="wait"&&a.emit(ee("wait-or-escape",a)),y},ask:j("ask"),"ask-mode":j("ask-mode"),"ask-escape":j("ask-escape"),random:(a,p)=>{let{fixed:m}=pe(a,"random",p);a.emit(G("random",m,a));let y=a.a,{at:E,used:L}=s.map.seed;a.mem[L]===255&&s.seed!==void 0&&(a.mem[E]=s.seed&255,a.mem[E+1]=s.seed>>8);let C=a.mem[E]|a.mem[E+1]<<8;C=C*259&65535,a.mem[E]=C&255,a.mem[E+1]=C>>8,a.mem[L]=y;let M=y?Math.floor(65535/y):65535;a.a=Math.floor(C/M)&255,a.c=0,a.emit(ee("random",a))},multiply:(a,p)=>{pe(a,"multiply",p),a.emit(G("multiply",[],a));let m=a.a*a.x;a.a=m&255,a.x=m>>8,a.emit(ee("multiply",a))},divide:(a,p)=>{pe(a,"divide",p),a.emit(G("divide",[],a));let m=a.x|a.y<<8,y=a.a||1;a.a=Math.floor(m/y)&255,a.x=m%y,a.emit(ee("divide",a))},problem:(a,p,m)=>{if(!a.problem){pe(a,"problem",p),a.emit(G("problem",[],a)),a.mem[e.practice]=a.c?128:0,a.repeats=a.mem[e.repeats],s.map.countInX&&a.c&&(a.mem[e.repeats]=a.x);let y=s.problems?.[a.a];if(!y)throw new Error("problem "+a.a+" is not written yet");let E=s.disk&&Ne(s.map,Object.values(s.disk.volumes)[0]).find(L=>L.name==="PROB"+a.a);E&&a.mem.set(E.bytes,E.origin),a.problem=y(xt(a,O))}if(!a.problem.next().done)return"wait";a.problem=null,a.c=0,a.mem[e.repeats]=a.repeats,a.emit(ee("problem",a))},"read-key":(a,p,m)=>{a.waitingOn!==m&&(a.waitingOn=m,a.asked=null);let y=a.key();if(y===void 0)return"wait";if(s.visit?.[y])return a.visit(y),"wait";a.waitingOn=null,y===te.menu&&s.menu&&a.leave(...s.menu),a.a=a.flags(y&127),a.c=y===te.escape?1:0,a.emit(ee("read-key",a))},splash:(a,p,m)=>{if(a.waitingOn!==m&&(a.inside++,a.emit({step:"splash"}),a.inside--,a.waitingOn=m),a.key()===void 0)return"wait";a.waitingOn=null},"clear-screen":a=>{for(let p of r.dots)p.fill(0);a.inside++,a.emit({step:"clear-screen"}),a.inside--},pause:(a,[p])=>{a.x=0,a.y=0,a.flags(0),a.inside++,a.emit({step:"pause",ms:+p}),a.inside--},quit:a=>{a.ended=!0},unwritten:(a,[p])=>{throw new Error("not written yet: "+(p?.string??p))},"goto-engine":(a,[p])=>{let m=s.entries?.[p];if(!m)throw new Error("no script for "+p);a.enter(...m)},"call-engine":(a,[p])=>{let m=s.entries?.[p];if(!m)throw new Error("no script for "+p);a.stack.push({name:a.name,pc:a.pc}),a.enter(...m)},"load-part":a=>{let p=Object.keys(s.disk?.volumes??{})[0]?.toUpperCase();if(s.files?.out?.has(p)){a.a=a.flags(69),a.c=1;return}a.stack=[],a.enter("part"+a.a,void 0,!0)},"write-settings":a=>{let p=s.files??=new Je(s.disk),m=Object.keys(s.disk.volumes)[0].toUpperCase(),y=p.out?.has(m)?69:p.disks[m]==="protected"?43:0;a.a=a.flags(y),a.c=y?1:0}};return O}var te,Ii,Ze=U(()=>{we();gt();Ye();_e();Le();wt();bt();Me();te={escape:27,space:32,return:13,delete:127,left:8,right:21,down:10,up:11,menu:5};Ii=(s,e)=>Ws(s)?.get(e.toUpperCase().replace(/_/g," "))});var Ys={};F(Ys,{INLINE:()=>ue,KERNAL:()=>Mi,section:()=>Vs,sectionName:()=>Et});function Vs(s,e,t){let{lengths:n,marks:r}=s.sections,o=c=>e(c+t)|e(c+t+1)<<8;return{mark:o(r),length:o(n)}}function Et(s,e,t,n){let r=s.sections;if(!r||t!==r.file)return t;for(let o=0;o<r.count;o+=2){let c=Vs(s,e,o);if(c.length&&c.mark===n)return t+":"+o}return t}var St,ue,Mi,$t=U(()=>{St=s=>(e,t)=>{let n=[];for(let r=0;r<s;r++)n.push(e(t+r).toString(16));return{length:s,value:n.join(" ")}},ue={fill:St(7),copy:St(8),prodos:St(3),"boot-say":(s,e)=>ue.say(s,e),say(s,e){let t="",n=e;for(let r=0;r<1024;r++){let o=s(n++);if(!o)break;t+=String.fromCharCode((o^128)&127)}return{length:n-e,value:t}},print(s,e){let t="",n=e;for(let r=0;r<256;r++){let o=s(n++);if(!o)break;t+=String.fromCharCode(o&127)}return{length:n-e,value:t}}};Mi={65490:"chrout",65508:"getin",65520:"plot",65484:"clrchn",65505:"stop",65463:"readst",65466:"setlfs",65469:"setnam",65493:"load",65496:"save",65457:"listen",65427:"second",65448:"ciout",65454:"unlsn",65460:"talk",65430:"tksa",65445:"acptr",65451:"untlk",65499:"settim",65502:"rdtim",65424:"setmsg"}});import{rom as Pi}from"@moonbase-machines/apple2e";var _s,Xs=U(()=>{({install:_s}=Pi)});import{kernal as Ni}from"@moonbase-machines/c64";var Qe,Js,Gs,Zs,Qs,en,Qo,jt=U(()=>{({KEY_TABLES:Qe,VECTORS:Js,VIC:Gs,install:Zs,kernalByte:Qs,matrixOf:en,screenCode:Qo}=Ni)});import{drive as Di}from"@moonbase-machines/c64";var et,Ct=U(()=>{({Drive:et}=Di)});var tn={};F(tn,{Printer:()=>Ot,WIDTH:()=>Bi,bus:()=>Lt,paper:()=>zi});import{printer as Ui}from"@moonbase-machines/c64";var Ot,Bi,Lt,zi,At=U(()=>{({Printer:Ot,WIDTH:Bi,bus:Lt,paper:zi}=Ui)});import{basic as Fi}from"@moonbase-machines/c64";var sn,nn=U(()=>{({Basic:sn}=Fi)});import{numbers as qi}from"@moonbase-machines/c64";var rn,aa,ca,la,fa,ha,da,pa,ua,on=U(()=>{({BasicError:rn,ERRORS:aa,fail:ca,fout:la,int16:fa,nextRandom:ha,scanNumber:da,seedRandom:pa,val:ua}=qi)});import{basicRom as Ki}from"@moonbase-machines/c64";var ga,an,cn,ln=U(()=>{({evaluateInMemory:ga,install:an,printError:cn}=Ki)});import{disasm as Wi}from"@moonbase-machines/mos6502";var fn,hn,ya,fe,dn,pn=U(()=>{({OPS:fn,SIZE:hn,disassemble:ya,hex:fe,operand:dn}=Wi)});import{inline as Hi}from"@moonbase-machines/vector";var un,Sa,Ea,$a,mn=U(()=>{({INLINE:un,name:Sa,sound:Ea,text:$a}=Hi)});var xn={};F(xn,{lift:()=>Rt,readers:()=>tt,script:()=>Tt});function Rt(s,e,t,n,r=new Set,o=Vi){let c=o,f=new Map,l=new Set(t),d=new Set,g=[...t],k=O=>O>=e&&O<e+s.length;for(;g.length;){let O=g.pop(),a={};for(;k(O)&&!f.has(O);){d.add(O);let p=O-e,m=fn[s[p]];if(m.name==="???"){f.set(O,{line:".byte $"+fe(s[p],2)+" ; not an instruction",end:O+1});break}let y=hn[m.mode],E=s[p+1]|s[p+2]<<8,L=s.subarray(p,p+y),C=(m.name+" "+dn(m.mode,L,O)).trim(),M=O+y,S=!1;if(m.mode==="imm"&&"LDA LDX LDY".includes(m.name)?a[m.name[2]]=s[p+1]:(m.name.startsWith("T")||m.name.startsWith("IN")||m.name.startsWith("DE")||m.name.startsWith("LD")||m.name==="PLA")&&delete a[m.name.at(-1)],m.name==="JSR"&&n[E]){let A=n[E],$=c[A]?.(s,M-e),R=["A","X","Y"].map(T=>a[T]===void 0?"":T+"="+a[T]).filter(Boolean).join(" ");C=A+($?" "+$.words:"")+(R&&!$?" ; "+R:""),$&&(M+=$.length);for(let T in a)delete a[T]}else if(m.name==="JSR"){k(E)&&(l.add(E),g.push(E));for(let A in a)delete a[A]}else if(m.name==="JMP"&&m.mode==="abs")k(E)?(l.add(E),g.push(E)):C+=" ; into PART0"+(n[E]?", "+n[E]:""),S=!0;else if(m.name==="JMP"||m.name==="RTS"||m.name==="RTI"||m.name==="BRK")S=!0;else if(m.mode==="rel"){let A=O+2+(s[p+1]<<24>>24)&65535;l.add(A),g.push(A)}if((m.mode==="abx"||m.mode==="aby")&&m.name==="LDA"&&k(E))for(let A=p+3;A<p+12&&A+2<s.length;A++){if(s[A]!==s[p]||(s[A+1]|s[A+2]<<8)!==E+1)continue;let $=[];for(let R=E-e;R+1<s.length&&$.length<64&&!($.length&&r.has(e+R));R+=2){let T=s[R]|s[R+1]<<8;if(!k(T))break;$.push(T)}C+=" ; a table of "+$.length+" addresses";for(let R of $)l.add(R),g.push(R);break}f.set(O,{line:C,end:M,op:m.name,mode:m.mode,value:y===2?s[p+1]:E,call:m.name==="JSR"&&n[E]?{name:n[E],words:c[n[E]]?.(s,O+3-e)?.words}:null,stop:S});for(let A=O+1;A<M;A++)d.add(A);if(S)break;O=M}}let w=[],x=null;for(let O of[...f.keys()].sort((a,p)=>a-p))x!==null&&O!==x&&w.push(""),l.has(O)&&w.push("L"+fe(O,4)+":"),w.push(fe(O,4)+" "+f.get(O).line),x=f.get(O).end;let j=[];for(let O=e;O<e+s.length;){if(d.has(O)){O++;continue}let a=O;for(;O<e+s.length&&!d.has(O);)O++;j.push([a,O-a])}return{listing:w.join(`
|
|
6
|
-
`),left:
|
|
1
|
+
/*! @moonbase-machines/player 0.12.0: MIT, (c) 2026 Mark Wharton (its LICENSE) */
|
|
2
|
+
var Ci=Object.defineProperty;var B=(s,t,e)=>()=>{if(e)throw e[0];try{return s&&(t=s(s=0)),t}catch(n){throw e=[n],n}};var z=(s,t)=>{for(var e in t)Ci(s,e,{get:t[e],enumerable:!0})};var bs={};z(bs,{branchTaken:()=>Ot,operand:()=>Z,parse:()=>Ct,words:()=>Vt});function Ct(s,t="script"){let e=[],n={},i=[];return s.split(`
|
|
3
|
+
`).forEach((o,c)=>{let h=o.replace(/^\s+|\s+$/g,"");if(!h||h.startsWith(";"))return;let f=t+":"+(c+1),l;if(l=/^(L[0-9A-F]{4}|[A-Za-z_][\w-]*):$/.exec(h)){n[l[1]]=e.length;return}if(l=/^data \$([0-9A-F]+)((?: [0-9A-F]{2})+)$/i.exec(h)){i.push({at:parseInt(l[1],16),bytes:l[2].trim().split(" ").map(k=>parseInt(k,16))});return}l=/^([0-9A-F]{4})\s+(.*)$/.exec(h);let m=l?parseInt(l[1],16):null,g=l?l[2]:h;e.push({at:m,words:Vt(g),text:g,where:f,index:e.length})}),{steps:e,labels:n,data:i}}function Z(s){if(typeof s!="string")return{string:s.string};if(/^-?\d+$/.test(s))return{number:+s};if(/^[axy]$/.test(s)||s==="carry"||s==="borrow")return{reg:s};let t;if(t=/^\$([0-9A-F]+)(?:\[([xy])\])?$/i.exec(s))return{at:parseInt(t[1],16),index:t[2],zp:t[1].length<=2};if(t=/^\(\$([0-9A-F]{2})\)\[y\]$/i.exec(s))return{through:parseInt(t[1],16)};if(t=/^\(\$([0-9A-F]{2})\[x\]\)$/i.exec(s))return{pair:parseInt(t[1],16)};if(t=/^\[\$([0-9A-F]{4})\](?:\[([xy])\])?$/i.exec(s))return{via:parseInt(t[1],16),index:t[2]};throw new Error("not an operand: "+s)}function Ot(s){if(s.at===null)return 1;let t=s.words,e=parseInt(t.at(-1).slice(1),16),n=s.at+(t.length===6?Ai(t[3]):0)+2&65535;return/^L[0-9A-F]{4}$/.test(t.at(-1))&&(e&65280)!==(n&65280)?2:1}var Oi,Vt,Ai,Yt=B(()=>{Oi=/"(?:[^"\\]|\\.)*"|\S+/g;Vt=s=>s.match(Oi).map(t=>t.startsWith('"')?{string:JSON.parse(t)}:t);Ai=s=>/^\d+$/.test(s)||/^\$[0-9A-F]{2}(\[[xy]\])?$/i.test(s)||/^\(\$/.test(s)?2:3});import{cpu as Li}from"@moonbase-machines/mos6502";var Oo,me,vs=B(()=>{({CPU:Oo,CYCLES:me}=Li)});var As={};z(As,{Engine:()=>Lt,label16:()=>At});function js(s){if(s===32)return 3;if(s===0||s===64||s===96)return 1;let t=s>>2&7,e=s&3;return e===1?t===3||t===6||t===7?3:2:t===0?e===2||(s&224)>=160?2:1:t===2||t===6?e===0||e===2?1:2:t===4?2:t===3||t===7?3:2}var Ss,Ti,Es,$s,Ri,Cs,Os,At,Lt,xe=B(()=>{Yt();vs();Ss={left:!0},Ti=new Set(["if","goto","call","return","compare","test","asm","push","pull"]),Es=s=>Ti.has(s.words[0])||/^(=|\+=|-=|&=|\|=|\^=|<<=|>>=|rotate)$/.test(s.words[1]),$s=1020.484;Ri=new Set([234,169,162,160,165,166,164,173,174,172,24,56]),Cs=s=>s.words[0]==="if"&&s.words.length===6,Os=s=>s?.at==null?void 0:s.at+2&65535,At=s=>"L"+s.toString(16).toUpperCase().padStart(4,"0"),Lt=class{constructor({routines:t,scripts:e,start:n,label:i,memory:o={}}){this.routines=t,this.sources=e,this.mem=new Uint8Array(65536);for(let[c,h]of Object.entries(o))this.mem[c]=h;this.a=0,this.x=0,this.y=0,this.n=0,this.z=0,this.c=0,this.v=0,this.d=0,this.stack=[],this.keys=[],this.listeners=[],this.takers=[],this.ended=!1,this.timed=!!t.timed,this.cycles=0,this.clicks=[],this.delay=0,this.programs={},t.setup?.(this),this.enter(n,i,!0)}on(t){this.listeners.push(t)}emit(t){this.inside&&(t.inside=!0);for(let e of this.listeners)e(t)}inside=0;press(t){this.keys.push(t)}key(){let t=this.keys.shift();if(t!==void 0)for(let e of this.takers)e(t);return t}onKey(t){return this.takers.push(t),()=>{this.takers=this.takers.filter(e=>e!==t)}}enter(t,e,n=!1){let i=this.script(t);if(n)for(let o of i.data)this.mem.set(o.bytes,o.at);this.program=i,this.name=t,this.pc=e===void 0?0:this.label(e)}script(t){if(this.programs[t])return this.programs[t];let e=this.sources[t];if(e===void 0)throw new Error("no script "+t);let n=this.programs[t]=typeof e=="string"?Ct(e,t):{labels:e.labels,data:e.data.map(([i,o])=>({at:i,bytes:o})),steps:e.steps.map(([i,o,c],h)=>({at:i,text:c,where:t+":"+o,run:e.run[h],words:Vt(c),index:h}))};for(let[i,o]of Object.entries(n.labels)){let c=/^L[0-9A-F]{4}$/.test(i)?parseInt(i.slice(1),16):null;c!==null&&n.steps[o]?.at>c&&(n.steps[o].start=c),c!==null&&n.steps[o]?.at===c&&(n.steps[o].entered=!0)}return n}callInside(t,e,n,i){this.stack.push({name:this.name,pc:this.pc,inside:!0,done:n,ret:i}),this.inside++,this.enter(t,e)}leave(t,e){throw this.stack=[],this.problem=null,this.waitingOn=null,this.visited=null,this.enter(t,e),Ss}visit(t){this.visiting=t}startVisit(t){let[e,n]=this.title.visit[this.visiting];this.visiting=void 0,this.visited||(this.visited={name:this.name,pc:t,stack:this.stack,problem:this.problem,waitingOn:this.waitingOn,asked:this.asked,askMode:this.askMode,regs:[this.a,this.x,this.y,this.n,this.z,this.c,this.v]},this.title.raster?.keepScreen(),this.inside++,this.emit({step:"keep-screen"}),this.inside--,this.routines.show(this,[],null)),this.stack=[{visit:!0}],this.problem=null,this.waitingOn=null,this.asked=null,this.a=2,this.c=0,this.enter(e,n)}endVisit(){let t=this.visited;this.visited=null,this.title.raster?.putScreen(),this.inside++,this.emit({step:"put-screen"}),this.inside--,this.routines.show(this,[],null),this.enter(t.name),Object.assign(this,{pc:t.pc,stack:t.stack,problem:t.problem,waitingOn:t.waitingOn,asked:t.asked,askMode:t.askMode}),[this.a,this.x,this.y,this.n,this.z,this.c,this.v]=t.regs}label(t){let e=this.program.labels[t];if(e===void 0)throw new Error(this.name+": no label "+t);return e}place(t){if(t.through!==void 0)return(this.mem[t.through]|this.mem[t.through+1]<<8)+this.y&65535;if(t.pair!==void 0){let e=t.pair+this.x&255;return this.mem[e]|this.mem[e+1&255]<<8}return t.via!==void 0?(this.mem[t.via]|this.mem[t.via+1]<<8)+(t.index?this[t.index]:0)&65535:t.at+(t.index?this[t.index]:0)&65535}read(t){return this.io&&this.ioAt(t)?this.io(t)&255:this.mem[t]}write(t,e){this.io&&this.ioAt(t)?this.io(t,e&255):this.mem[t]=e}ioAt(t){return(t&65280)===49152}get(t){return t.number!==void 0?t.number&255:t.reg==="carry"?this.c:t.reg?this[t.reg]:this.read(this.place(t))}load(t){return this.timed&&(t.index&&!t.zp||t.through!==void 0)&&((t.through!==void 0?this.mem[t.through]|this.mem[t.through+1]<<8:t.via!==void 0?this.mem[t.via]|this.mem[t.via+1]<<8:t.at)&255)+this[t.index??"y"]>255&&this.cycles++,this.get(t)}ix(t,e){return this.timed&&(t&255)+e>255&&this.cycles++,t+e&65535}set(t,e){if(e&=255,t.reg){this[t.reg]=e;return}this.write(this.place(t),e)}flags(t){return this.n=t>>7&1,this.z=t===0?1:0,t}compare(t,e){let n=t-e&511;this.c=t>=e?1:0,this.flags(n&255)}time(t,e,n){if(!this.timed)return;let i=t[e].cycles;if(i===void 0){i=0;for(let o=e;o<=n;o++)i+=this.cost(t,o);t[e].cycles=i}this.cycles+=i,this.delay+=i/$s}cost(t,e){let n=t[e],i=this.mem;if(n.at===null)return 0;let o=me[i[n.at]]+(Cs(n)?2:0),c=!n.entered&&!["return","goto"].includes(t[e-1]?.words[0])?t[e-1]:null;if(n.start!==void 0||c&&c.at!==null){let h=n.start??c.at+js(i[c.at])+(Cs(c)?2:0)+(this.routines.inline?.(this,c)??0);if(h<n.at&&n.at-h<=9){let f=0,l=h;for(;l<n.at&&Ri.has(i[l]);l+=js(i[l]))f+=me[i[l]];l===n.at&&(o+=f)}}return o}add(t){if(this.d){let i=(this.a&15)+(t&15)+this.c,o=(this.a>>4)+(t>>4);i>9&&(i-=10,o++),this.z=(this.a+t+this.c&255)===0?1:0,this.n=o&8?1:0,this.v=~(this.a^t)&(this.a^o<<4)&128?1:0,o>9?(o-=10,this.c=1):this.c=0,this.a=(o<<4|i)&255;return}let e=this.a,n=e+t+this.c;this.v=~(e^t)&(e^n)&128?1:0,this.c=n>255?1:0,this.a=this.flags(n&255)}sub(t){if(!this.d)return this.add(t^255);let e=(this.a&15)-(t&15)-(1-this.c),n=(this.a>>4)-(t>>4);e<0&&(e+=10,n--);let i=this.a-t-(1-this.c);this.z=(i&255)===0?1:0,this.n=i&128?1:0,this.v=(this.a^t)&(this.a^i)&128?1:0,this.c=i>=0?1:0,n<0&&(n+=10),this.a=(n<<4|e)&255}shift(t,e,n){let i=e?(t<<1|(n?this.c:0))&255:t>>1|(n&&this.c?128:0);return this.c=e?t>>7:t&1,this.flags(i)}test(t){this.n=t>>7&1,this.v=t>>6&1,this.z=(t&this.a)===0?1:0}jump(t,e){if(this.routines.elsewhere?.(this,t))return this.routines["goto-engine"](this,["$"+t.slice(1)],e);this.pc=this.label(t)}jumpThrough(t,e){let n=At(this.mem[t]|this.mem[t+1]<<8);if(this.program.labels[n]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+n.slice(1)],e);this.pc=this.label(n)}jumpTable(t,e){this.pc=this.label(At(this.mem[t+e]|this.mem[t+e+1]<<8))}call(t,e){if(this.routines.elsewhere?.(this,t))return this.routines["call-engine"](this,["$"+t.slice(1)],e);this.stack.push({name:this.name,pc:this.pc,ret:Os(e)}),this.pc=this.label(t)}callThrough(t,e){let n=At(this.mem[t]|this.mem[t+1]<<8);if(this.program.labels[n]===void 0&&this.routines["call-engine"])return this.routines["call-engine"](this,["$"+n.slice(1)],e);this.stack.push({name:this.name,pc:this.pc,ret:Os(e)}),this.pc=this.label(n)}ret(t){let e=this.stack.pop();if(!e)throw new Error("return with nothing called");if(e.visit){this.endVisit();return}let n=this.pulled;if(e.a!==void 0&&this.stack.at(-1)?.a!==void 0){let i=this.stack.pop().a,o=(i<<8|e.a)+1&65535,c=At(o);if(n?.ret!==void 0&&o>n.ret&&o-n.ret<=256){this.pulled=null,n.name!==this.name&&this.enter(n.name),this.pc=n.pc,n.inside&&(this.inside--,n.done?.(this));return}if(n?.ret!==void 0&&o<=n.ret&&n.ret-o<=32&&this.script(n.name).labels[c]!==void 0){this.pulled=null,n.name!==this.name&&this.enter(n.name),this.pc=this.label(c),n.inside&&(this.again=this.again?.ret===n.ret?{...this.again,n:this.again.n+1}:{ret:n.ret,done:n.done,n:1});return}if(this.program.labels[c]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+c.slice(1)],t);this.pc=this.label(c);return}if(n&&this.stack.length<n.depth&&(this.pulled=null,n.inside&&n.ret!==void 0&&this.inside--),e.name!==this.name&&this.enter(e.name),this.pc=e.pc,e.inside&&(this.inside--,e.done?.(this)),this.again&&e.ret===this.again.ret){let i=this.again;this.again=null,this.inside-=i.n,i.done?.(this)}e.after?.(this)}push(t){this.stack.push(t?{a:this.a}:{flags:[this.n,this.z,this.c,this.v]})}pull(t){let e=this.stack.at(-1);if(e&&e.name!==void 0){let i=e.ret===void 0?0:e.half?e.ret>>8:e.ret&255;e.half?(this.stack.pop(),e.depth=this.stack.length,this.pulled=e,e.inside&&e.ret===void 0&&this.inside--):e.half=!0,t&&(this.a=this.flags(i));return}let n=this.stack.pop();t?this.a=this.flags(n.a):[this.n,this.z,this.c,this.v]=n.flags}sp(){return 255-this.stack.reduce((t,e)=>t+(e.name===void 0||e.half?1:2),0)&255}stackPage(){let t=this.sp();(this.stacks??=new Map).set(t,this.stack.map(n=>({...n})));let e=255;for(let n of this.stack){let i=n.ret??0;n.name===void 0?this.mem[256+e--]=n.a??(n.flags?n.flags[0]<<7|n.flags[3]<<6|48|n.flags[1]<<1|n.flags[2]:0):(this.mem[256+e--]=i>>8,n.half||(this.mem[256+e--]=i&255))}return t}asm(t){if(t==="TSX"&&(this.x=this.flags(this.stackPage())),t==="TXS"){let e=this.stacks?.get(this.x);this.stack=e?e.map(n=>({...n})):[],this.visited=null,this.inside=this.stack.filter(n=>n.inside).length}t==="CLV"&&(this.v=0),t==="SED"&&(this.d=1),t==="CLD"&&(this.d=0),t==="SEI"&&(this.i=1),t==="CLI"&&(this.i=0)}run(t=1e7){this.pacing||(this.idle=0),this.pacing=!1,this.delay??=0;for(let e=0;e<t;e++){if(this.ended)return"end";let n=this.program.steps[this.pc];if(!n)throw new Error(this.name+": ran off the end");if(this.routines.before?.(this,n)==="wait"||this.exec(n)==="wait")return"idle";if(this.polled)return this.polled=!1,"idle";if(this.delay>=16)return this.pacing=!0,"pace"}return"steps"}exec(t){let e=this.pc;this.pc++;try{this.called=!1,!t.run&&Es(t)&&this.time(this.program.steps,e,e);let n=t.run?t.run(this,this.program.steps):this.interpret(t);if(n==="wait"&&(t.run?this.called:!Es(t))&&(this.pc=e,this.visiting!==void 0)){this.startVisit(e);return}return n}catch(n){if(n===Ss){this.inside=0;return}if(this.routines.error?.(this,n)){this.ended=!0;return}throw n.message=t.where+" ("+t.text+"): "+n.message,n}}interpret(t){let e=t.words,[n,i]=e;if(i==="="&&e.length===3){let o=Z(n),c=this.load(Z(e[2]));if(o.reg==="carry"){this.c=c&1;return}this.set(o,c),o.reg&&this.flags(c);return}if(i==="+="||i==="-="){let o=Z(n),c=e.length===3?this.get(Z(e[2])):this.load(Z(e[2]));if(e.length===3){let h=this.get(o)+(i==="+="?c:-c)&255;this.set(o,h),this.flags(h);return}i==="+="?this.add(c):this.sub(c);return}if(i==="&="||i==="|="||i==="^="){let o=this.load(Z(e[2]));this.a=this.flags(i==="&="?this.a&o:i==="|="?this.a|o:this.a^o);return}if(i==="<<="||i===">>="||i==="rotate"){let o=Z(n);this.set(o,this.shift(this.get(o),i==="<<="||e[2]==="left",i==="rotate"));return}switch(n){case"if":return this.branch(e,t);case"goto":return e[1].startsWith("(")?this.jumpThrough(parseInt(e[1].slice(2,-1),16),t):e[1].startsWith("[")?this.jumpTable(parseInt(e[1].slice(2),16),this[e[2][0]]):this.jump(e[1],t);case"call":return e[1].startsWith("(")?this.callThrough(parseInt(e[1].slice(2,-1),16),t):this.call(e[1],t);case"return":return this.ret(t);case"compare":this.compare(this[e[1]],this.load(Z(e[2])));return;case"test":this.test(this.get(Z(e[1])));return;case"asm":if(e[1]==="RTI")return this.ret(t);this.asm(e[1]);return;case"push":this.push(e[1]==="a");return;case"pull":this.pull(e[1]==="a");return}return this.routine(n,e.slice(1),t)}routine(t,e,n){let i=this.routines[t];if(!i)throw new Error("no routine "+t);if(this.called=!0,n&&this.timed&&n.at!==null){let o=this.cost(this.program.steps,n.index);this.cycles+=o,this.delay+=o/$s}return i(this,e,n)}branch(t,e){let n=t.at(-1),i=t.slice(1,-2),o;if(i.length===3&&/^[axy]$/.test(i[0]))this.compare(this[i[0]],this.load(Z(i[2]))),o={"==":this.z,"!=":!this.z,">=":this.c,"<":!this.c}[i[1]];else{let c=i[0]==="not",h=c?i[1]:i[0],f={zero:this.z,carry:this.c,negative:this.n,overflow:this.v}[h];if(f===void 0)throw new Error("no flag "+h);o=c?!f:!!f}o&&(this.cycles+=Ot(e),this.pc=this.label(n))}}});var Rs={};z(Rs,{GIVES:()=>gt,POLLS:()=>Ii,TAKES:()=>pt,WAITS:()=>Mi,describe:()=>G,nothing:()=>ge,result:()=>et});function G(s,t,e,n,i,o){let c={step:s};t.length&&(c.n=t.map(Number));let h=pt[s];if(s==="objects")c.table="$"+(e.x|e.y<<8).toString(16).toUpperCase().padStart(4,"0");else if(s.startsWith("object")&&e.a<2)c.a=e.a;else if(h)for(let f of h)c[f]=e[f];if((s==="key-at"||s==="key")&&c.a!==void 0&&(c.a=String.fromCharCode(c.a&127)),Ts[s]&&i)for(let[f,l]of Object.entries(Ts[s]))c[f]=i(l);if(Ls[s]&&o)for(let[f,l]of Object.entries(Ls[s]))c[f]=o(l);return n!==void 0&&(c.words=n),c}function et(s,t){let e={result:s};for(let n of gt[s])e[n]=t[n];return e}var pt,Ls,Ts,gt,ge,Ii,Mi,yt=B(()=>{pt={box:"axy",object:"axy","object-keep":"axy","object-mode":"axy",objects:"xy",span:"axy",random:"a",beep:"a","key-at":"axy",key:"a",multiply:"ax",divide:"axy",ask:"a","ask-mode":"a","ask-escape":"a",rectangle:"axy","read-dot":"xy",problem:"a",dot:"axy","fill-rows":"axy",part:"a","rectangle-outline":"axy","key-panel":"a","keep-span":"xy","put-span":"xy","white-lines":"y","invert-span":"xy",label:"a","flip-box":"a","flash-box":"a",path:"ax",jump:"a",cell:"axy","cell-box":"axy",pair:"a",piece:"axy",colour:"a",tick:"",print:"axyc",arrow:"a",unpack:"y","load-picture":"a","action-cards":"a","return-key":"a","space-key":"a","wipe-rows":"a","wipe-columns":"a","text-card":"a","fill-left":"a","put-object":"axy","draw-room-objects":"yc",take:"y",drop:"y",effect:"a",outport:"a",cout:"a",char:"a",message:"xy",describe:"axy",chrout:"a",plot:"xyc",close:"a",chkin:"x",chkout:"x",setlfs:"axy",setnam:"axy",load:"axy",save:"axy",listen:"a",second:"a",ciout:"a",talk:"a",tksa:"a",setmsg:"a",tone:"xy","load-objects":"axy",hposn:"axy",hlin:"axy",hcolor:"x",pause:"a","bag-put":"a"},Ls={colour:{shape:3605},"card-frame":{x:16504,high:16505,y:16506,width:16507,height:16508}},Ts={line:{x0:0,x1:1,y0:2,y1:3,color:17},piece:{color:17},rectangle:{width:14,height:15},"rectangle-outline":{width:14,height:15}};gt={random:"a",ask:"ax","ask-mode":"ax","ask-escape":"axc","wait-or-escape":"c",problem:"c","read-key":"a","read-dot":"a",multiply:"ax",divide:"ax","blink-key":"a","which-box":"xy",tick:"a","choose-action":"a",take:"a",drop:"a","show-bag":"a","bag-choose":"a",getin:"a",acptr:"a",readst:"a",load:"cxy",chrin:"a"},ge=(s,t)=>s==="beep"&&t===0,Ii=new Set(["read-key","blink-key"]),Mi=new Set(["wait","wait-erase","wait-or-escape","ask","ask-mode","ask-escape","which-box","tick","choose-action","take","drop","show-bag","bag-choose"])});var Is={};z(Is,{helpers:()=>we});function we(s,t){let e=s.title.map.vars.zero;function*n(h,...f){let l={words:[h]},m=f.map(g=>typeof g=="string"&&h==="text"?{string:g}:typeof g=="number"?String(g):g);for(;;){if(t[h](s,m,l)!=="wait")return{a:s.a,x:s.x,y:s.y,c:s.c};yield"wait"}}let i=(h,f=0,l,m)=>{s.a=f&255,l!==void 0&&(s.x=l&255),m!==void 0&&(s.y=m&255),s.title.paint?.[h]?.(s.title.model,s),s.emit(G(h,[],s,void 0,g=>s.mem[g+e],g=>s.mem[g]))};function*o(h="wait"){let f={words:[h]};for(;;){let l=s.key();if(l===5&&s.title?.menu&&s.leave(...s.title.menu),s.title?.visit?.[l]){s.visit(l),s.waitingOn=f,yield"wait";continue}if(l!==void 0)return s.waitingOn=null,l;s.waitingOn=f,yield"wait"}}function*c(h){s.inside++;try{return yield*h}finally{s.inside--}}return{e:s,mem:s.mem,call:n,drawn:i,key:o,inside:c}}var ke=B(()=>{yt()});import{objects as Ni}from"@moonbase-machines/vector";var Ms,Mo,Ns,Jt,_t=B(()=>{({carry:Ms,decode:Mo,put:Ns,tables:Jt}=Ni)});var Ps={};z(Ps,{pictures:()=>Tt,shapes:()=>Di,windows:()=>Ui});import{pictures as Pi}from"@moonbase-machines/vector";var Tt,Di,Ui,Xt=B(()=>{({pictures:Tt,shapes:Di,windows:Ui}=Pi)});import{font as Bi}from"@moonbase-machines/vector";var Uo,Bo,Gt,Ds,Us,it,Rt=B(()=>{({GLYPHS:Uo,WIDTHS:Bo,dots:Gt,start:Ds,useFont:Us,width:it}=Bi)});import{draw as zi}from"@moonbase-machines/vector";var qo,Bs,Ko,Wo,zs,Ho,ye,Vo,Yo,Fs=B(()=>{({crossings:qo,draw:Bs,fill:Ko,inside:Wo,line:zs,outline:Ho,screen:ye,spans:Vo,under:Yo}=zi)});var Ks={};z(Ks,{LAYOUT:()=>wt,PANELS:()=>It,layout:()=>Mt,resolve:()=>bt,textLayout:()=>Nt,textPage:()=>kt,textPen:()=>Pt,word:()=>qs});function qs(s,[t,e,n,i]){let o=t|e<<8,c=i===255?n:s[n|i<<8];for(;c-- >0;)o+=s[o]+1;let h="";for(let f=1;f<=s[o];f++)h+=String.fromCharCode(s[o+f]&127);return h}function Mt(s,t){let e=t,n=[];e.tall=!1,e.margin=e.x;let i=9,o=!1,c=[],h=e.ink,f=!1,l=g=>{if(c.length){let k=Ds(c.map(w=>w.ch),e.spacing,e.x,e.centre),y=[];for(let w of c){let O=it(w.ch);y.push({ch:w.ch,x:k,ink:w.ink}),k+=w.ch.charCodeAt(0)<32?O:O+e.spacing}n.push({top:e.y,tall:e.tall,height:i,paper:e.paper,ink:e.ink,chars:y}),e.x=k}c=[],g&&(e.y+=(e.tall?2*i:i)+e.gap,e.x=e.margin)},m=g=>c.push({ch:o&&g>="0"&&g<="9"?String.fromCharCode(128+g.charCodeAt(0)-48):g,ink:f?h:void 0});for(let g=0;g<s.length;g++){let k=s[g];if(k===`
|
|
4
|
+
`){l(!0);continue}if(k==="{"){let y=s.indexOf("}",g),[w,O]=s.slice(g+1,y).split(":"),a=(O??"").split(",").map(u=>parseInt(u,16));switch(g=y,parseInt(w,16)){case 0:e.x=e.margin=a[0];break;case 1:a[0]<192?e.y=a[0]:i=a[0]-192;break;case 2:e.spacing=a[0];break;case 3:e.gap=a[0];break;case 4:e.ink=h=a[0],f=!0;break;case 5:e.paper=a[0];break;case 7:e.centre=!0;break;case 8:e.centre=!1;break;case 9:e.tall=!0;break;case 10:e.tall=!1;break;case 13:h=0,f=!0;break;case 14:h=1,f=!0;break;case 16:o=!0;break;case 17:o=!1;break;case 15:for(let u=0;u<(a[1]||256);u++)m(String.fromCharCode(a[0]&127));break}continue}m(k)}return l(!1),n}function Nt(s,t){let e=[];t.inverse=!1;let n=[],i=c=>{let h=t.centre?40-n.length>>1:t.x;n.forEach((f,l)=>e.push({row:t.y,col:h+l,ch:f.ch,inverse:f.inverse})),n.length&&(t.x=h+n.length),n=[],c&&(t.y++,t.x=t.margin)},o=c=>n.push({ch:t.inverse?c.toUpperCase():c,inverse:t.inverse});for(let c=0;c<s.length;c++){let h=s[c];if(h===`
|
|
5
|
+
`){i(!0);continue}if(h==="{"){let f=s.indexOf("}",c),[l,m]=s.slice(c+1,f).split(":"),g=(m??"").split(",").map(k=>parseInt(k,16));switch(c=f,parseInt(l,16)){case 0:i(!1),t.x=t.margin=g[0];break;case 1:i(!1),g[0]<192&&(t.y=g[0]);break;case 7:t.centre=!0;break;case 8:t.centre=!1;break;case 13:t.inverse=!0;break;case 14:t.inverse=!1;break;case 15:for(let k=0;k<(g[1]||256);k++)o(String.fromCharCode(g[0]&127));break}continue}o(h)}return i(!1),e}var wt,ot,lt,It,bt,Pt,kt,Dt=B(()=>{Rt();wt={65:[116,116,174],50:[116,116,160],49:[130,130,174],34:[130,130,160],17:[158,158,174]},ot=(s,t,e,n,i)=>({layout:s,rows:t,fill:10,paper:10,ink:0,gap:e,y:n,more:i}),lt=(s,t,e,n)=>({layout:s,rows:t,fill:5,paper:5,ink:15,gap:e,y:n}),It={1:ot(50,[116,159],7,128),2:ot(50,[116,159],33,135),3:ot(34,[130,159],5,135),4:ot(34,[130,159],19,142),5:lt(34,[160,189],5,166),6:lt(34,[160,189],19,172),7:ot(65,[116,173],5,121),8:ot(65,[116,173],6,128),9:ot(65,[116,173],7,134),10:ot(65,[116,173],47,142),11:ot(50,[116,159],5,121),12:ot(49,[130,173],5,135),13:ot(49,[130,173],7,142),14:ot(49,[130,173],33,149),15:ot(17,[158,173],5,163,[174]),16:lt(50,[160,189],19,172),17:lt(66,[160,189],19,172),18:lt(50,[160,189],5,166),19:lt(66,[160,189],5,166),20:lt(35,[160,189],0,163),21:lt(51,[160,189],0,163),22:lt(67,[160,189],0,163),23:lt(49,[174,189],5,179),24:lt(65,[174,189],5,179)};bt=(s,t)=>s.replace(/\{6:([0-9a-f,]+)\}/g,(e,n)=>qs(t,n.split(",").map(i=>parseInt(i,16))));Pt=()=>({x:0,y:0,margin:0,centre:!1,inverse:!1}),kt=()=>Array.from({length:24},()=>Array.from({length:40},()=>({ch:" ",inverse:!1})))});var Ws={};z(Ws,{Raster:()=>Ut});var Ut,be=B(()=>{Fs();_t();Rt();Dt();Ut=class{constructor(){this.dots=ye(15),this.kept=null}keepScreen(){this.screenKept={dots:this.dots,kept:this.kept},this.dots=ye(0)}putScreen(){this.screenKept&&({dots:this.dots,kept:this.kept}=this.screenKept),this.screenKept=null}scroll(){for(let t=19;t<=115;t++){let e=this.dots[t],n=[];for(let i of e)n.push(i>>3&1,i>>2&1,i>>1&1,i&1);for(let i=14;i<518;i++)n[i]=n[i+28];for(let i=0;i<140;i++)e[i]=n[4*i]<<3|n[4*i+1]<<2|n[4*i+2]<<1|n[4*i+3]}}set(t,e,n){t>=0&&t<140&&e>=0&&e<192&&(this.dots[e][t]=n&15)}get(t,e){return t>=0&&t<140&&e>=0&&e<192?this.dots[e][t]:0}span(t,e,n,i){for(let o=e;o<=n;o++)this.set(o,i,t)}rows(t,e,n,i){for(let o=n;o<n+e;o++)this.span(t,0,139,o),i&&(this.set(0,o,15),this.set(139,o,15))}whiteLines(t){this.span(15,0,139,t),this.span(15,0,139,t+1)}box(t,e,n,i){let[o,c,h]=wt[t]??wt[50];if(e!==128){this.span(0,1,138,1),this.span(0,1,138,o-1);for(let f=2;f<o-1;f++)this.set(1,f,0),this.set(138,f,0),this.span(e,2,137,f)}n!==128&&(this.whiteLines(c),this.rows(n,h-c-2,c+2,!0)),i!==128&&(this.whiteLines(h),this.rows(i,190-h-2,h+2,!0))}panel(t,e,n){this.whiteLines(t),this.rows(n,e-t-1,t+2,!0)}picture(t){Bs(t,this.dots)}rectangle(t,e,n,i,o){for(let c=n;c<n+o;c++)this.span(t,e,e+i-1,c)}outline(t,e,n,i,o){this.span(t,e,e+i-1,n),this.span(t,e,e+i-1,n+o-1);for(let c=n;c<n+o;c++)this.set(e,c,t),this.set(e+i-1,c,t)}line(t,e,n,i,o){for(let[c,h]of zs(e,n,i,o))this.set(c,h,t)}object(t,e,n,i){i==="keep"&&(this.kept={x:e,y:n,rows:t.rows.map((o,c)=>o.map((h,f)=>this.get(e+f,n+c)))}),Ns(this.dots,t,e,n,i==="whole")}restore(){let t=this.kept;t&&t.rows.forEach((e,n)=>e.forEach((i,o)=>this.set(t.x+o,t.y+n,i)))}glyph(t,e,n,i,o,c=1,h=9,f=0){let l=it(t);if(t.charCodeAt(0)<32){for(let g=0;g<Math.min(9,h);g++)for(let k=0;k<l;k++)for(let y=0;y<c;y++)this.set(e+k,n+g*c+y,o);return l}let m=new Set(Gt(t).map(([g,k])=>g+","+k));for(let g=0;g<Math.min(9,h);g++)for(let k=0;k<l+f;k++)for(let y=0;y<c;y++)this.set(e+k,n+g*c+y,m.has(k+","+g)?i:o);return l}}});import{mli as Fi}from"@moonbase-machines/apple2e";var Hs,ve,Zt,Se=B(()=>{({BLOCK:Hs,CLOCK:ve,Files:Zt}=Fi)});var _s={};z(_s,{codeFiles:()=>Bt,pictureShapes:()=>qi,vectorRoutines:()=>Ee});function Bt(s,t){let e=s?.loads??{};return Object.entries(t).filter(([n])=>/^(PART|PROB)\d$/.test(n)).map(([n,i])=>({name:n,bytes:Uint8Array.from(atob(i.data),o=>o.charCodeAt(0)),origin:e[n]??e[n.slice(0,-1)]??i.aux}))}function dt(s,t,e){let n=pt[t]||"",i=[],o=0;t==="panel"&&i.push(e[o++]);let c={a:s.a,x:s.x,y:s.y};if(t==="objects"&&e[0]?.startsWith?.("$")){let h=parseInt(e[o++].slice(1),16);c.x=h&255,c.y=h>>8}else for(let h of n){let f=e[o++];f===void 0||f===h||(c[h]=typeof f=="object"?f.string.charCodeAt(0)|128:f.startsWith("$")?s.mem[parseInt(f.slice(1),16)]:+f)}return s.a=c.a&255,s.x=c.x&255,s.y=c.y&255,{fixed:i,rest:e.slice(o)}}function Qt(s,t,e,n,i,o){for(s.waitingOn!==t&&(s.emit(G(e,n,s,i)),s.waitingOn=t,s.asked=null);;){let c=s.key();if(c===void 0)return"wait";if(c===st.menu&&s.title.menu&&s.leave(...s.title.menu),s.title.visit?.[c])return s.visit(c),"wait";if(o(c)){s.waitingOn=null;return}}}function Vs(s,t){if(t){s.inside++;try{for(let e=t.next();!e.done;e=t.next())if(e.value==="wait")throw new Error("a choice drawn inside the ask cannot wait")}finally{s.inside--}}}function Ys(s){if(s.objectTables||!s.disk)return s.objectTables;let t=Bt(s.map,Object.values(s.disk.volumes)[0]);return s.objectTables=new Map(Jt(t,s.map.objects).map(e=>[e.address,e.objects]))}function Js(s){if(s.pictureShapes||!s.disk)return s.pictureShapes;let t=Object.values(s.disk.volumes)[0],e=new Map;for(let[n,i]of Object.entries(t))if(/^PICS\d$/.test(n))for(let o of Tt(Uint8Array.from(atob(i.data),c=>c.charCodeAt(0))))e.set(o.name,o.shapes);return s.pictureShapes=e}function Ee(s){let t=s.map.vars,e=a=>t.zero+a;Us(s.font);let n=a=>{if(a.a<2)return;let u=Ys(s)?.get(a.objectTable)?.find(d=>d.number===a.a);u&&(a.c=Ms(u,a.x),a.mem[e(2)]=a.y+u.height&255)},i=s.raster??=new Ut,o=s.pen??={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10};s.text??={showing:!1,pen:Pt(),page:kt()};let c=(a,u)=>Ys(s)?.get(a.objectTable)?.find(d=>d.number===u),h=(a,u)=>{if(a.a<2)return i.restore();let d=c(a,a.a);d&&i.object(d,a.x,a.y,u)},f=a=>{let u=it(a),d=o.x,E=(u<4?4-u:0)+1;i.rectangle(1,d,o.y-2,Math.max(4,u)+4,11),i.outline(13,d,o.y-2,Math.max(4,u)+4,11),i.glyph(a,d+1+E,o.y,15,1,1,8),o.x=d+1+E+u+1+2},l=a=>{let u=s.map.keyPanel;if(!u)return;let d=i.get(2,2),{x:E,y:v}=o;for(let L=u.top;L<u.top+u.rows;L++)i.span(d,u.left,u.right,L);u.caps.forEach(([L,T,I],C)=>{(!a||a===C+1)&&(o.x=L,o.y=T,f(String.fromCharCode(I&127)))}),Object.assign(o,{x:E,y:v})},m=(a,u)=>{for(let d of Mt(bt(u,a.mem),o))for(let E of d.chars)i.glyph(E.ch,E.x,d.top,E.ink??d.ink,d.paper,d.tall?2:1,d.height,o.spacing)},g=(a,u,d,E,v)=>{let L=c(a,u);L&&i.object(L,d,E,v)};s.model={raster:i,pen:o,cap:f,keyPanel:l,print:m,put:g};let k=(a,u)=>(d,E,v)=>{let{fixed:L,rest:T}=dt(d,a,E),I=T.map(C=>typeof C=="object"?C.string:C).join(" ");d.emit(G(a,L,d,T.length?I:void 0,C=>d.mem[e(C)])),T=T.map(C=>typeof C=="object"?C.string:C),u?.(d,L,T)},y=!s.map.askClearsCarry,w=a=>(u,d,E)=>{u.waitingOn!==E&&dt(u,a,d);let v=u.waitingOn===E?u.askMode:u.a;u.askMode=v;let L=[st.left,st.right,st.down,st.up];v===128&&u.waitingOn!==E&&l(0);let T=Qt(u,E,a,[],void 0,I=>{if(a==="ask-escape"&&I===st.escape)return u.a=u.flags(27),u.x=155,u.c=1,u.asked=null,!0;if(u.asked===null){let C=-1,$=I;return v===128?(C=L.indexOf(I),$=219+C,C>=0&&l(C+1)):v>=177&&v<186?I>=49&&I<=(v&127)&&(C=I-49):($=I&95,$>=65&&$<=(v&95&127)&&(C=$-65,$|=128)),C>=0&&(u.asked={place:C,key:$},a==="ask-mode"&&Vs(u,u.askHooks?.chose?.(C))),!1}return I===st.return?(u.x=u.asked.place,u.y=2*u.x,u.a=u.asked.key,u.c=y&&u.a>=193?1:0,!0):((I===st.delete||I===st.left)&&(a==="ask-mode"&&Vs(u,u.askHooks?.undo?.(u.asked.place)),v===128&&l(0),u.asked=null),!1)});return T!=="wait"&&(u.mem[t.layout]=34,u.emit(et(a,u))),T},O={show:k("show",a=>{s.text.showing=!1,a.mem[49181]=128}),"text-screen":a=>{Object.assign(s.text,{showing:!0,page:kt()}),a.mem[49181]=0,a.inside++,a.emit({step:"text-screen"}),a.inside--},picture:k("picture",(a,u,[d])=>{let E=Js(s)?.get(d.toUpperCase().replace(/_/g," "));E&&i.picture(E)}),box:k("box",a=>i.box(a.mem[t.layout],a.a,a.x,a.y)),panel:k("panel",(a,[u])=>{let d=It[u];if(d){a.mem[t.layout]=d.layout,i.panel(d.rows[0],d.rows[1],d.fill);for(let E of d.more??[])i.whiteLines(E);Object.assign(o,{paper:d.paper,ink:d.ink,centre:!0,spacing:1,gap:d.gap,y:d.y})}}),text:(a,u)=>{let d=u[0].string.replace(/\{([0-9a-f]+):([^}]*)\}/g,(E,v,L)=>"{"+v+":"+L.split(",").map(T=>T.startsWith("$")?a.mem[parseInt(T.slice(1),16)].toString(16):T).join(",")+"}").replace(/\{\$([0-9A-Fa-f]{4})\}/g,(E,v)=>String.fromCharCode(a.mem[parseInt(v,16)]&127));if(a.emit(G("text",[],a,d)),s.text.showing){for(let E of Nt(bt(d,a.mem),s.text.pen))s.text.page[E.row]?.[E.col]&&(s.text.page[E.row][E.col]={ch:E.ch,inverse:E.inverse});return}m(a,d)},objects:k("objects",a=>{a.objectTable=a.x|a.y<<8}),object:k("object",a=>{h(a,"whole"),n(a)}),"object-keep":k("object-keep",a=>{h(a,"keep"),n(a)}),"object-mode":k("object-mode",a=>h(a,"clear")),"key-at":k("key-at",a=>{o.x=a.x,o.y=a.y,f(String.fromCharCode(a.a&127))}),key:k("key",a=>f(String.fromCharCode(a.a&127))),"white-lines":k("white-lines",a=>i.whiteLines(a.y)),"fill-rows":k("fill-rows",a=>i.rows(a.a,a.x,a.y,a.c)),span:k("span",a=>i.span(a.a,a.x,a.y,a.mem[e(2)])),dot:k("dot",a=>{i.set(a.x,a.y,a.a),a.a=a.x%7<<4|a.a&15}),line:k("line",a=>i.line(a.mem[e(17)],a.mem[e(0)],a.mem[e(2)],a.mem[e(1)],a.mem[e(3)])),rectangle:k("rectangle",a=>i.rectangle(a.a,a.x,a.y,a.mem[e(14)]+1,a.mem[e(15)])),"rectangle-outline":k("rectangle-outline",a=>i.outline(a.a,a.x,a.y,a.mem[e(14)]+1,a.mem[e(15)]+1)),flash:k("flash"),"read-dot":(a,u)=>{dt(a,"read-dot",u),a.emit(G("read-dot",[],a)),a.a=a.flags(i.get(a.x,a.y)),a.emit(et("read-dot",a))},"key-panel":k("key-panel",a=>l(a.a)),"keep-span":k("keep-span"),"put-span":k("put-span"),"invert-span":k("invert-span"),button:k("button"),beep:(a,u)=>{dt(a,"beep",u),ge("beep",a.a)||a.emit(G("beep",[],a))},sound:(a,u)=>a.emit(G("sound",[],a,u.map(d=>d.startsWith("$")?a.mem[parseInt(d.slice(1),16)].toString(16):d).join(" "))),scroll:a=>{i.scroll(),a.inside++,a.emit({step:"scroll"}),a.inside--},"shift-down":(a,u)=>{let[d,E,v,L,T]=u.map(Number);for(let I=L;I>=v;I--)for(let C=d;C<=E;C++)i.set(C,I+T,i.get(C,I));a.inside++,a.emit({step:"shift-down",left:d,right:E,top:v,bottom:L,by:T}),a.inside--},part:k("part"),wait:(a,u,d)=>Qt(a,d,"wait",[],void 0,E=>E===st.space&&(a.a=32,a.c=0,!0)),"wait-erase":(a,u,d)=>Qt(a,d,"wait-erase",[],void 0,E=>E===st.space),"wait-or-escape":(a,u,d)=>{let E=Qt(a,d,"wait-or-escape",[],void 0,v=>(v===st.space||v===st.escape)&&(a.c=v===st.escape?1:0,a.a=v,!0));return E!=="wait"&&a.emit(et("wait-or-escape",a)),E},ask:w("ask"),"ask-mode":w("ask-mode"),"ask-escape":w("ask-escape"),random:(a,u)=>{let{fixed:d}=dt(a,"random",u);a.emit(G("random",d,a));let E=a.a,{at:v,used:L}=s.map.seed;a.mem[L]===255&&s.seed!==void 0&&(a.mem[v]=s.seed&255,a.mem[v+1]=s.seed>>8);let T=a.mem[v]|a.mem[v+1]<<8;T=T*259&65535,a.mem[v]=T&255,a.mem[v+1]=T>>8,a.mem[L]=E;let I=E?Math.floor(65535/E):65535;a.a=Math.floor(T/I)&255,a.c=0,a.emit(et("random",a))},multiply:(a,u)=>{dt(a,"multiply",u),a.emit(G("multiply",[],a));let d=a.a*a.x;a.a=d&255,a.x=d>>8,a.emit(et("multiply",a))},divide:(a,u)=>{dt(a,"divide",u),a.emit(G("divide",[],a));let d=a.x|a.y<<8,E=a.a||1;a.a=Math.floor(d/E)&255,a.x=d%E,a.emit(et("divide",a))},problem:(a,u,d)=>{if(!a.problem){dt(a,"problem",u),a.emit(G("problem",[],a)),a.mem[t.practice]=a.c?128:0,a.repeats=a.mem[t.repeats],s.map.countInX&&a.c&&(a.mem[t.repeats]=a.x);let E=s.problems?.[a.a];if(!E)throw new Error("problem "+a.a+" is not written yet");let v=s.disk&&Bt(s.map,Object.values(s.disk.volumes)[0]).find(L=>L.name==="PROB"+a.a);v&&a.mem.set(v.bytes,v.origin),a.problem=E(we(a,O))}if(!a.problem.next().done)return"wait";a.problem=null,a.c=0,a.mem[t.repeats]=a.repeats,a.emit(et("problem",a))},"read-key":(a,u,d)=>{a.waitingOn!==d&&(a.waitingOn=d,a.asked=null);let E=a.key();if(E===void 0)return"wait";if(s.visit?.[E])return a.visit(E),"wait";a.waitingOn=null,E===st.menu&&s.menu&&a.leave(...s.menu),a.a=a.flags(E&127),a.c=E===st.escape?1:0,a.emit(et("read-key",a))},splash:(a,u,d)=>{if(a.waitingOn!==d&&(a.inside++,a.emit({step:"splash"}),a.inside--,a.waitingOn=d),a.key()===void 0)return"wait";a.waitingOn=null},"clear-screen":a=>{for(let u of i.dots)u.fill(0);a.inside++,a.emit({step:"clear-screen"}),a.inside--},pause:(a,[u])=>{a.x=0,a.y=0,a.flags(0),a.inside++,a.emit({step:"pause",ms:+u}),a.inside--},quit:a=>{a.ended=!0},unwritten:(a,[u])=>{throw new Error("not written yet: "+(u?.string??u))},"goto-engine":(a,[u])=>{let d=s.entries?.[u];if(!d)throw new Error("no script for "+u);a.enter(...d)},"call-engine":(a,[u])=>{let d=s.entries?.[u];if(!d)throw new Error("no script for "+u);a.stack.push({name:a.name,pc:a.pc}),a.enter(...d)},"load-part":a=>{let u=Object.keys(s.disk?.volumes??{})[0]?.toUpperCase();if(s.files?.out?.has(u)){a.a=a.flags(69),a.c=1;return}a.stack=[],a.enter("part"+a.a,void 0,!0)},"write-settings":a=>{let u=s.files??=new Zt(s.disk),d=Object.keys(s.disk.volumes)[0].toUpperCase(),E=u.out?.has(d)?69:u.disks[d]==="protected"?43:0;a.a=a.flags(E),a.c=E?1:0}};return O}var st,qi,te=B(()=>{yt();ke();_t();Xt();Rt();be();Se();Dt();st={escape:27,space:32,return:13,delete:127,left:8,right:21,down:10,up:11,menu:5};qi=(s,t)=>Js(s)?.get(t.toUpperCase().replace(/_/g," "))});var Gs={};z(Gs,{INLINE:()=>ut,KERNAL:()=>Ki,section:()=>Xs,sectionName:()=>je});function Xs(s,t,e){let{lengths:n,marks:i}=s.sections,o=c=>t(c+e)|t(c+e+1)<<8;return{mark:o(i),length:o(n)}}function je(s,t,e,n){let i=s.sections;if(!i||e!==i.file)return e;for(let o=0;o<i.count;o+=2){let c=Xs(s,t,o);if(c.length&&c.mark===n)return e+":"+o}return e}var $e,ut,Ki,Ce=B(()=>{$e=s=>(t,e)=>{let n=[];for(let i=0;i<s;i++)n.push(t(e+i).toString(16));return{length:s,value:n.join(" ")}},ut={fill:$e(7),copy:$e(8),prodos:$e(3),"boot-say":(s,t)=>ut.say(s,t),say(s,t){let e="",n=t;for(let i=0;i<1024;i++){let o=s(n++);if(!o)break;e+=String.fromCharCode((o^128)&127)}return{length:n-t,value:e}},print(s,t){let e="",n=t;for(let i=0;i<256;i++){let o=s(n++);if(!o)break;e+=String.fromCharCode(o&127)}return{length:n-t,value:e}}};Ki={65490:"chrout",65508:"getin",65520:"plot",65484:"clrchn",65505:"stop",65463:"readst",65466:"setlfs",65469:"setnam",65493:"load",65496:"save",65457:"listen",65427:"second",65448:"ciout",65454:"unlsn",65460:"talk",65430:"tksa",65445:"acptr",65451:"untlk",65499:"settim",65502:"rdtim",65424:"setmsg"}});import{rom as Wi}from"@moonbase-machines/apple2e";var Zs,Qs=B(()=>{({install:Zs}=Wi)});import{kernal as Hi}from"@moonbase-machines/c64";var ee,tn,en,sn,nn,rn,da,Oe=B(()=>{({KEY_TABLES:ee,VECTORS:tn,VIC:en,install:sn,kernalByte:nn,matrixOf:rn,screenCode:da}=Hi)});import{drive as Vi}from"@moonbase-machines/c64";var se,Ae=B(()=>{({Drive:se}=Vi)});var on={};z(on,{Printer:()=>Le,WIDTH:()=>Ji,bus:()=>Te,paper:()=>_i});import{printer as Yi}from"@moonbase-machines/c64";var Le,Ji,Te,_i,Re=B(()=>{({Printer:Le,WIDTH:Ji,bus:Te,paper:_i}=Yi)});import{basic as Xi}from"@moonbase-machines/c64";var an,cn=B(()=>{({Basic:an}=Xi)});import{numbers as Gi}from"@moonbase-machines/c64";var ln,ba,va,Sa,Ea,$a,ja,Ca,Oa,fn=B(()=>{({BasicError:ln,ERRORS:ba,fail:va,fout:Sa,int16:Ea,nextRandom:$a,scanNumber:ja,seedRandom:Ca,val:Oa}=Gi)});import{basicRom as Zi}from"@moonbase-machines/c64";var Ta,hn,pn,dn=B(()=>{({evaluateInMemory:Ta,install:hn,printError:pn}=Zi)});import{disasm as Qi}from"@moonbase-machines/mos6502";var un,mn,Ma,ht,xn,gn=B(()=>{({OPS:un,SIZE:mn,disassemble:Ma,hex:ht,operand:xn}=Qi)});import{inline as tr}from"@moonbase-machines/vector";var wn,Da,Ua,Ba,kn=B(()=>{({INLINE:wn,name:Da,sound:Ua,text:Ba}=tr)});var yn={};z(yn,{lift:()=>Ie,readers:()=>ne,script:()=>Me});function Ie(s,t,e,n,i=new Set,o=er){let c=o,h=new Map,f=new Set(e),l=new Set,m=[...e],g=O=>O>=t&&O<t+s.length;for(;m.length;){let O=m.pop(),a={};for(;g(O)&&!h.has(O);){l.add(O);let u=O-t,d=un[s[u]];if(d.name==="???"){h.set(O,{line:".byte $"+ht(s[u],2)+" ; not an instruction",end:O+1});break}let E=mn[d.mode],v=s[u+1]|s[u+2]<<8,L=s.subarray(u,u+E),T=(d.name+" "+xn(d.mode,L,O)).trim(),I=O+E,C=!1;if(d.mode==="imm"&&"LDA LDX LDY".includes(d.name)?a[d.name[2]]=s[u+1]:(d.name.startsWith("T")||d.name.startsWith("IN")||d.name.startsWith("DE")||d.name.startsWith("LD")||d.name==="PLA")&&delete a[d.name.at(-1)],d.name==="JSR"&&n[v]){let $=n[v],j=c[$]?.(s,I-t),R=["A","X","Y"].map(A=>a[A]===void 0?"":A+"="+a[A]).filter(Boolean).join(" ");T=$+(j?" "+j.words:"")+(R&&!j?" ; "+R:""),j&&(I+=j.length);for(let A in a)delete a[A]}else if(d.name==="JSR"){g(v)&&(f.add(v),m.push(v));for(let $ in a)delete a[$]}else if(d.name==="JMP"&&d.mode==="abs")g(v)?(f.add(v),m.push(v)):T+=" ; into PART0"+(n[v]?", "+n[v]:""),C=!0;else if(d.name==="JMP"||d.name==="RTS"||d.name==="RTI"||d.name==="BRK")C=!0;else if(d.mode==="rel"){let $=O+2+(s[u+1]<<24>>24)&65535;f.add($),m.push($)}if((d.mode==="abx"||d.mode==="aby")&&d.name==="LDA"&&g(v))for(let $=u+3;$<u+12&&$+2<s.length;$++){if(s[$]!==s[u]||(s[$+1]|s[$+2]<<8)!==v+1)continue;let j=[];for(let R=v-t;R+1<s.length&&j.length<64&&!(j.length&&i.has(t+R));R+=2){let A=s[R]|s[R+1]<<8;if(!g(A))break;j.push(A)}T+=" ; a table of "+j.length+" addresses";for(let R of j)f.add(R),m.push(R);break}h.set(O,{line:T,end:I,op:d.name,mode:d.mode,value:E===2?s[u+1]:v,call:d.name==="JSR"&&n[v]?{name:n[v],words:c[n[v]]?.(s,O+3-t)?.words}:null,stop:C});for(let $=O+1;$<I;$++)l.add($);if(C)break;O=I}}let k=[],y=null;for(let O of[...h.keys()].sort((a,u)=>a-u))y!==null&&O!==y&&k.push(""),f.has(O)&&k.push("L"+ht(O,4)+":"),k.push(ht(O,4)+" "+h.get(O).line),y=h.get(O).end;let w=[];for(let O=t;O<t+s.length;){if(l.has(O)){O++;continue}let a=O;for(;O<t+s.length&&!l.has(O);)O++;w.push([a,O-a])}return{listing:k.join(`
|
|
6
|
+
`),left:w,reached:l.size,size:s.length,lines:h,targets:f}}function Me({lines:s,targets:t,left:e},n,i,{stops:o=new Set,selfModified:c=!1,memory:h=!1,moved:f=[]}={}){let l=(C,$=4)=>"$"+ht(C,$),m=new Set(f);if(c)for(let C of s.values())/^(STA|STX|STY|INC|DEC|ASL|LSR|ROL|ROR)$/.test(C.op)&&/^(abs|abx|aby)$/.test(C.mode)&&m.add(C.value);let g=null,k=()=>g!==null&&(h||m.has(g+1)||m.has(g+2)),y=C=>{let $=C.value;if(k()&&C.mode==="imm"&&(h||m.has(g+1)))return l(g+1);if(k()&&/^(abs|abx|aby)$/.test(C.mode))return"["+l(g+1)+"]"+(C.mode==="abs"?"":"["+C.mode.at(-1)+"]");switch(C.mode){case"imm":return String($);case"zp":return l($,2);case"zpx":return l($,2)+"[x]";case"zpy":return l($,2)+"[y]";case"abs":return l($);case"abx":return l($)+"[x]";case"aby":return l($)+"[y]";case"izy":return"("+l($,2)+")[y]";case"izx":return"("+l($,2)+"[x])";case"acc":return"a";default:return"?"}},w=C=>"L"+ht(C,4),O={BEQ:"zero",BNE:"not zero",BCS:"carry",BCC:"not carry",BMI:"negative",BPL:"not negative",BVS:"overflow",BVC:"not overflow"},a={BEQ:"==",BNE:"!=",BCS:">=",BCC:"<"},u=(C,$)=>C+2+($.value<<24>>24)&65535,d=[...s.keys()].sort((C,$)=>C-$),E=[],v=C=>["JMP","RTS","RTI"].includes(C.op);t=new Set(t),d.forEach((C,$)=>{let j=s.get(C);j.op&&!v(j)&&$+1<d.length&&j.end!==d[$+1]&&s.has(j.end)&&t.add(j.end)});let L=[],T=()=>{for(let[C,$,j]of L)E.push(ht(C,4)+" "+$+" = "+j);L=[]},I=null;for(let C=0;C<d.length;C++){let $=d[C],j=s.get($),R=s.get(d[C+1]),A=P=>E.push(ht($,4)+" "+P);if(g=$,I&&I.op&&!v(I)&&I.end!==$&&s.has(I.end)&&(T(),E.push(ht(I.pc,4)+" goto "+w(I.end))),I={...j,pc:d[C]},t.has($)&&(T(),E.push(w($)+":")),!j.op){T(),A("asm "+j.line);continue}let F=j.op.at(-1).toLowerCase();if(j.call){let[P,...W]=j.call.name.split(" "),J=pt[P]||"",H=Object.fromEntries(L.map(([,nt,xt])=>[nt,xt]));L=L.filter(([,nt])=>!J.includes(nt)),T();let rt=[...W,...[...J].map(nt=>H[nt]??nt)];P==="objects"&&H.x!==void 0&&H.y!==void 0&&rt.splice(W.length,2,l(H.x|H.y<<8)),(P==="key-at"||P==="key")&&(rt[0]=H.a!==void 0?JSON.stringify(String.fromCharCode(H.a&127)):rt[0]),A([P,...rt,j.call.words??""].join(" ").trim());continue}switch(j.op){case"LDA":case"LDX":case"LDY":if(j.mode==="imm"&&!k()){L=L.filter(([,P])=>P!==F),L.push([$,F,j.value]);break}if(j.mode==="aby"||j.mode==="abx"){let[P,W,J,H]=[1,2,3,4].map(q=>s.get(d[C+q]));if(P?.op==="STA"&&W?.op==="LDA"&&W.value===j.value+1&&J?.op==="STA"&&H?.op==="JMP"&&P.value===d[C+4]+1&&J.value===d[C+4]+2){T(),A("goto ["+l(j.value)+" "+j.mode.at(-1)+"]"),C+=4,I=null;break}}T(),A(F+" = "+y(j));break;case"STA":case"STX":case"STY":T(),A(y(j)+" = "+F);break;case"TAX":case"TAY":case"TXA":case"TYA":T(),A(j.op[2].toLowerCase()+" = "+j.op[1].toLowerCase());break;case"INX":case"INY":case"DEX":case"DEY":T(),A(F+(j.op[0]==="I"?" += 1":" -= 1"));break;case"INC":case"DEC":T(),A(y(j)+(j.op==="INC"?" += 1":" -= 1"));break;case"CLC":case"SEC":T(),A("carry = "+(j.op==="SEC"?1:0));break;case"ADC":T(),A("a += "+y(j)+" + carry");break;case"SBC":T(),A("a -= "+y(j)+" + borrow");break;case"AND":T(),A("a &= "+y(j));break;case"ORA":T(),A("a |= "+y(j));break;case"EOR":T(),A("a ^= "+y(j));break;case"ASL":case"LSR":case"ROL":case"ROR":T(),A(y(j)+" "+{ASL:"<<= 1",LSR:">>= 1",ROL:"rotate left",ROR:"rotate right"}[j.op]);break;case"BIT":T(),A("test "+y(j));break;case"CMP":case"CPX":case"CPY":{T();let P=j.op==="CMP"?"a":j.op[2].toLowerCase();R&&a[R.op]&&!t.has(d[C+1])?(A("if "+P+" "+a[R.op]+" "+y(j)+" goto "+w(u(d[C+1],R))),C++,I={...R,pc:d[C]}):A("compare "+P+" "+y(j));break}case"JMP":if(T(),j.mode==="abs"&&k()){A("goto ("+l($+1)+")");break}A(j.mode==="abs"?j.value>=i&&j.value<i+n.length?"goto "+w(j.value):"goto-engine "+l(j.value):"goto ("+l(j.value)+")");break;case"JSR":if(T(),k()){A("call ("+l($+1)+")");break}A(j.value>=i&&j.value<i+n.length?"call "+w(j.value):"call-engine "+l(j.value));break;case"RTS":T(),A("return");break;case"PHA":case"PLA":case"PHP":case"PLP":T(),A({PHA:"push a",PLA:"pull a",PHP:"push flags",PLP:"pull flags"}[j.op]);break;case"NOP":break;default:if(O[j.op]){T(),A("if "+O[j.op]+" goto "+w(u($,j)));break}T(),A("asm "+j.line)}}T();for(let[C,$]of e){let j=0;for(;j<$&&!(j&&o.has(C+j))&&!o.has(C);)j++;if(!j)continue;let R=[];for(let A=0;A<j;A+=16)R.push("data "+l(C+A)+" "+Array.from(n.subarray(C-i+A,C-i+Math.min(j,A+16)),F=>ht(F,2)).join(" "));E.push("",...R)}return E.join(`
|
|
7
7
|
`)+`
|
|
8
|
-
`}var tt,Vi,It=U(()=>{pn();mn();we();tt=s=>Object.fromEntries(Object.entries(s).map(([e,t])=>[e,(n,r)=>{let o=t(c=>n[c],r);return{length:o.length,words:e==="text"||e==="print"||e==="say"?JSON.stringify(o.value):o.value}}])),Vi=tt(un)});var kn={};F(kn,{cardRoutines:()=>Mt});function gn(s,e,t){let n=de[e]||"",r=0,o=null;for(let c of n){let f=t[r++];if(f===void 0||f===c||typeof f=="object")continue;let l=f.startsWith("$")?s.mem[parseInt(f.slice(1),16)]:+f;c==="c"?s.c=l&1:(s[c]=l&255,o!=="a"&&(o=c))}return o&&s.flags(s[o]),t.slice(r)}function Mt(s){let e=s.map,t=s.disk.kind==="c64",n=t?null:s.files??=new Je(s.disk),r=s.screen??={text:1,mixed:0,page2:0,hires:0},o=0,c={bank:2,read:0,aside:new Uint8Array(4096)},f=(i,h)=>{if(h===c.bank)return;let u=i.mem.slice(53248,57344);i.mem.set(c.aside,53248),c.aside=u,c.bank=h},l=s.chip=new Uint8Array(4096),d={4:i=>i&255,5:i=>i>>8&255,8:i=>i*7&255,9:i=>i*13&255};function g(i,h,u){let v=h&4095;if(v<1024){let b=v&63;if(u===void 0&&(b===17||b===18))return i.raster=i.clock?Math.floor(i.cycles/63)%312:((i.raster??0)+1)%312,b===18?i.raster&255:l[17]&127|i.raster>>1&128;if(u===void 0&&b===25)return i.vicFlags??112;if(u===void 0)return l[b];if(l[b]=u,i.splitLine!==void 0&&b!==25){let I=i.clock?i.clock.splits??=new Map:s.splits??=new Map;(I.get(i.splitLine)??I.set(i.splitLine,new Map).get(i.splitLine)).set(b,u)}b===26&&!(u&1)&&s.splits?.clear();return}if(v<2048){let b=1024|v&31;if(u===void 0)return l[b];l[b]=u,i.sid?.push([i.cycles,v&31,u]);return}if(v<3072){if(u===void 0)return l[v]|240;l[v]=u&15;return}if(v<3328){let b=v&15;if(u===void 0)return d[b]?d[b](s.seed??17):b<2?255:b===13?0:l[3072|b];l[3072|b]=u;return}if(u===void 0)return l[v];if(l[v]=u,(v&15)===0&&i.splitLine!==void 0){let b=i.clock?i.clock.splits??=new Map:s.splits??=new Map;(b.get(i.splitLine)??b.set(i.splitLine,new Map).get(i.splitLine)).set(256,u)}}let k=i=>(i.mem[1]&3)!==0&&(i.mem[1]&4)!==0;function w(i,h,u){if(t&&h>=57344){if(u===void 0)return Qs(h);i.mem[h]=u;return}if(t)return g(i,h,u);if((h&65520)===49280){let v=h&15;return f(i,v&8?1:2),c.read=(v&1)===(v>>1&1)?1:0,0}if(h>=49232&&h<=49239){let v=["text","mixed","page2","hires"][h-49232>>1];return r[v]=h&1,0}if(h===49152&&u===void 0){if(!(o&128)){let v=i.key();v!==void 0&&v>=0&&(o=v|128)}return++i.idle>2e3&&(i.polled=!0),o}if(h===49168){let v=o;return!(o&128)&&++i.idle>2e3&&(i.polled=!0),o&=127,v}return h===49200&&i.clicks.push(i.cycles),0}let x=null,j={hooks:new Map,cycles:0,a:0,x:0,y:0,z:0,c:0,n:0,v:0,read:i=>x.mem[i],write:(i,h)=>{x.mem[i]=h&255},nz(i){this.n=i>>7&1,this.z=i?0:1}},O=0;t?Zs({cpu:j,read:i=>x.read(i),write:(i,h)=>x.write(i,h),drive:s.bus??=Lt(s.drive??=new et(Uint8Array.from(atob(s.disk.image),i=>i.charCodeAt(0))),s.printer??=new Ot({on:!1})),held:()=>{let i=x?.clock?.held;return i?.up&&(x.clock.held=null),i&&(i.seen=!0),i??null},call:i=>{Ke(x,i,"the keyboard read"),Object.assign(j,{a:x.a,x:x.x,y:x.y,c:x.c,z:x.z,n:x.n,v:x.v})},loaded:(i,h,u)=>{(s.files64??=[]).push({name:i,from:h,to:u});let v=s.fileScripts?.[i];if(v){let b={script:v,from:h,to:u};p.splice(0,1/0,...p.filter(I=>I.from<b.from||I.to>b.to),b)}}}):_s({cpu:j,game:s.disk,sw:{lcRead:0},io:i=>w(x,i),file:i=>n.file(i),get files(){return n.files},put:(i,h)=>n.put(i,h),remove:i=>n.remove(i),clicks:{push:i=>x.clicks.push(x.cycles+i-O)},log(){},halted:!1});let a=(i,h)=>{let u=j.hooks.get(h);if(!u&&t&&h>=40960&&h<49152)throw new Error("a BASIC program, calling BASIC's ROM at $"+ce(h)+": not written yet in the remake");if(!u)throw new Error("no ROM routine at $"+ce(h));x=i,Object.assign(j,{a:i.a,x:i.x,y:i.y,c:i.c,z:i.z,n:i.n,v:i.v,pc:h,sp:i.sp()-2&255});let v=O=j.cycles,b=u(j);if(b==="wait")return"wait";if(i.delay+=(j.cycles-v+6)/yt*1e3,i.cycles+=j.cycles-v+6,Object.assign(i,{a:j.a&255,x:j.x&255,y:j.y&255,c:j.c,z:j.z,n:j.n}),b==="return")return b;if(b===!1&&j.pc!==h)return{to:j.pc}},p=[],m=null,y=(i,h)=>{if(!m){m=new Map;for(let u of Object.keys(i.sources)){let v=i.script(u);for(let b of Object.keys(v.labels))if(/^L[0-9A-F]{4}$/.test(b)){let I=parseInt(b.slice(1),16);(m.get(I)??m.set(I,[]).get(I)).push(u)}}}return m.get(h)??[]},E=(i,h)=>{let u=s.files64?.findLast(D=>D.from<=h&&h<=D.to)??(h>=512&&h<40960?{name:"MEMORY",from:512,to:40959}:null);if(!u)return null;let v=i.mem.slice(u.from,u.to+1),b=(s.fileScripts?.[u.name]??u.name)+"@"+ce(h),I=Rt(v,u.from,[h],e.routines,new Set,tt(ue));return i.sources[b]=Tt(I,v,u.from,{selfModified:!0}),m=null,p.push({script:b,from:u.from,to:u.to}),(s.liftedAtNeed??=[]).push(u.name+" $"+ce(h)),console.warn(`lifted at need: ${u.name} from $${ce(h)} (an entry for its scene's lift)`),b},L=new Set(Object.values(s.fileScripts??{})),C=(i,h)=>t?i.filter(u=>!L.has(u)||p.some(v=>v.script===u&&v.from<=h&&h<=v.to)):i,M=(i,h)=>{let u=C(y(i,h),h);!u.length&&t&&E(i,h)&&(u=C(y(i,h),h));let v=p.findLast(I=>u.includes(I.script)&&I.from<=h&&h<=I.to),b=u.length>1?v?.script:u[0];if(!b)throw new Error("no script has $"+ce(h));return[b,"L"+ce(h)]},S=(i,h)=>t?h>=57344?(i.mem[1]&2)!==0:h>=40960&&h<49152?(i.mem[1]&3)===3:h===115||h===121:h>=53248?!(c.read&&y(i,h).length):j.hooks.has(h)&&!y(i,h).length,A=i=>e.stir&&i?.at>=e.stir.from&&i.at<=e.stir.to,$=(i,h,u)=>{u&&i.inside++,i.emit(h),u&&i.inside--},R=i=>{let h=i.stack.pop();h.name!==i.name&&i.enter(h.name),i.pc=h.pc,h.inside&&(i.inside--,h.done?.(i)),h.after?.(i)},T=new Set(["town","restart","escape"]),N=(i,h,u,v)=>{if(h?.at==null)return v.map(I=>parseInt(I,16));let b=[];for(let I=0;I<u;I++)b.push(i.mem[h.at+3+I&65535]);return b},P=i=>i.map(h=>h.toString(16)).join(" "),W=i=>(e.unplaced?.includes(i.step)&&(delete i.x,delete i.y),i),_={chrout:[806,61898],chrin:[804,61783],getin:[810,61758],save:[818,62957]},K=(i,h)=>(u,v,b)=>{gn(u,i,v),$(u,W(G(i,[],u,void 0,void 0,q=>u.mem[q])),A(b));let I=t&&_[i],D=I&&u.mem[I[0]]|u.mem[I[0]+1]<<8;if(I&&D!==I[1]){let[q,Y]=M(u,D);u.callInside(q,Y,Z=>{xe[i]&&Z.emit(ee(i,{a:Z.a,x:Z.x,y:Z.y,c:Z.c}))},b?.at==null?void 0:b.at+2&65535);return}let z=a(u,h);if(z==="wait")return"wait";if(z?.to!==void 0)return u.stackPage(),u.stack.push({name:u.name,pc:u.pc,inside:!0,ret:b?.at==null?void 0:b.at+2&65535}),u.inside++,B["goto-engine"](u,["$"+ce(z.to)],b);xe[i]&&t&&u.emit(ee(i,{a:u.a,x:u.x,y:u.y,c:u.c}))},B={prodos:(i,h,u)=>{let v=N(i,u,3,h),[b,I,D]=v,z=I|D<<8;$(i,G("prodos",[],i,P(v)),A(u));let q={read:Z=>i.mem[Z],write:(Z,ae)=>{i.mem[Z]=ae&255}};if(b===202){let Z=i.mem[z+1],ae=n.open.get(Z),X=i.mem[z+2]|i.mem[z+3]<<8,dt=ae?Math.min(i.mem[z+4]|i.mem[z+5]<<8,ae.f.body.length-ae.at):0,ms=ae&&s.fileScripts?.[Et(e,Se=>i.mem[Se],ae.f.path,ae.at)];if(ms&&dt){let Se={script:ms,from:X,to:X+dt-1};p.splice(0,1/0,...p.filter(xs=>xs.from<Se.from||xs.to>Se.to),Se)}i.delay+=Math.ceil(dt/512)*Fs/yt*1e3}let Y=n.call(b,z,q);i.cycles+=6,Y===null&&(Y=1),i.a=Y==="quit"?0:Y,i.c=i.a?1:0,i.z=i.a?0:1,Y==="quit"&&(i.ended=!0)},stirred:i=>{for(let h of e.stir.counts)i.mem[h]=s.seed&255},hposn:K("hposn",62481),hlin:K("hlin",62778),hcolor:K("hcolor",63216),"clear-page":K("clear-page",62452),pause:K("pause",64680),home:K("home",64600),outport:K("outport",65173),"call-engine":(i,[h],u)=>{let v=parseInt(h.slice(1),16);if(S(i,v)){let D=a(i,v);if(D==="return"){R(i);return}return D}if(!t&&i.mem[v]===96){i.cycles+=6;return}let[b,I]=M(i,v);i.stack.push({name:i.name,pc:i.pc,ret:u?.at==null?void 0:u.at+2&65535}),i.enter(b,I)},"goto-engine":(i,[h],u)=>{let v=parseInt(h.slice(1),16),b=e.routines[v];if(b){if(T.has(b))return B[b](i,[],u);let I=t&&i.stack.at(-1)?.rom;I&&i.inside++;let D;try{D=B[b](i,[],u)}finally{I&&i.inside--}let z=i.stack.at(-1);if(z?.inside){let q=z.done;z.done=Y=>{q?.(Y),R(Y)}}else R(i);return D}if(S(i,v)){if(a(i,v)==="wait")return"wait";t&&ne.has(v)&&he(i),R(i);return}if(!t&&i.mem[v]===76&&!y(i,v).length)return B["goto-engine"](i,["$"+ce(i.mem[v+1]|i.mem[v+2]<<8)],u);i.enter(...M(i,v))}};t&&s.basic&&(B.sys=(i,h,u,v)=>{i.mem[122]=u&255,i.mem[123]=u>>8;let b=i.mem;Object.assign(i,{a:b[780],x:b[781],y:b[782],c:b[783]&1,z:b[783]>>1&1,n:b[783]>>7});let I=q=>{b[780]=q.a,b[781]=q.x,b[782]=q.y,b[783]=q.c|q.z<<1|(q.i??0)<<2|(q.d??0)<<3|q.v<<6|q.n<<7};if(S(i,h)){let q=a(i,h);return I(i),q}let[D,z]=M(i,h);i.stack.push({name:i.name,pc:i.pc,rom:!0,after:I}),i.enter(D,z)},B["basic-load"]=(i,[h,u=1,v=0])=>{let b=i.mem;for(let D=0;D<h.length;D++)b[512+D]=h.charCodeAt(D);Object.assign(b,{183:h.length,187:0,188:2,186:u,185:v,184:0}),Object.assign(i,{a:0,x:1,y:8}),i.basic.call("load");let I=Object.entries(s.basic).find(([,D])=>D.file===h);if(v===0&&I){se(i,I[0]),i.enter(I[0]);return}i.pc=0},an({cpu:j,read:i=>x.read(i),write:(i,h)=>x.write(i,h),evaluate:i=>{let h=x.sources[x.basic.script]?.params?.[i];if(!h)throw new Error("no parameter compiled at $"+ce(i));let[u,v,b]=h;return{value:v(x.basic),end:u,place:b}}})),t&&s.basic&&(B.error=(i,h)=>!(h instanceof rn)||!i.basic?!1:(x=i,cn({cpu:j,write:(u,v)=>{i.mem[u]=v}},h.message,i.basic.at)));let se=(i,h)=>{i.basic=new sn(i,s.basic[h]),i.basic.script=h};for(let[i,h]of Object.entries(e.routines).map(([u,v])=>[+u,v]))!B[h]&&i>=53248&&(B[h]=K(h,i)),!(B[h]||i>=48896)&&(B[h]=(u,v,b)=>{if(gn(u,h,v),T.has(h)&&u.inside){for(let X of u.stack)X.inside&&(delete X.inside,delete X.done);u.inside=0}let I=b?.at!=null?u.mem[b.at+1&65535]|u.mem[b.at+2&65535]<<8:null,D=A(b),z=e.routines[I]===h?I:parseInt(Object.entries(e.routines).find(([,X])=>X===h)[0]);h==="read-key"&&(u.mem[e.seed]=s.seed&255,u.mem[e.seed+1]=s.seed>>8);let q=ue[h]&&b?.at!=null?ue[h](X=>u.mem[X&65535],b.at+3).value:void 0;$(u,G(h,[],{a:u.a,x:u.x,y:u.y,c:u.c},q,void 0,X=>u.mem[X]),D);let[Y,Z]=M(u,z);if(h==="escape"&&b?.at!=null&&u.stack.push({name:u.name,pc:u.pc,ret:b.at+2&65535}),T.has(h)){u.enter(Y,Z),u.entered=z;return}let ae=X=>{X.mem[e.seed]=s.seed&255,X.mem[e.seed+1]=s.seed>>8};u.callInside(Y,Z,X=>{h==="read-key"&&ae(X),xe[h]&&!D&&X.emit(ee(h,{a:X.a,x:X.x,y:X.y,c:X.c}))},b?.at==null?void 0:b.at+2&65535)});B.elsewhere=(i,h)=>{let u=parseInt(h.slice(1),16),v=p.findLast(b=>b.from<=u&&u<=b.to);return v!==void 0&&v.script!==i.name&&/^L[0-9A-F]{4}$/.test(h)},B.timed=!0,B.polls=e.polls,B.reads=e.reads,t&&(B.getin=i=>{!i.clock&&!i.i&&(B.poll(i),i.polledSince=!0);let h;if(i.mem[198]?(h=i.mem[631],i.mem.copyWithin(631,632,631+i.mem[198]),i.mem[198]--):h=i.key(),i.c=0,h===void 0||h<0){i.a=i.flags(0),++i.idle>(i.polls??e.polls??200)&&!i.clock&&(i.polled=!0);return}i.a=i.flags(h),i.idle=0,i.emit(ee("getin",{a:h}))});let ne=new Set([59953,60027,60030,60033]);B.poll=i=>{B.interrupt(i),l[26]&1&&B.interrupt(i,!0)};let he=i=>{for(let h of["y","x","a"]){let u=i.stack.pop();if(u?.a===void 0||u.name!==void 0)throw new Error("the end of an interrupt with its registers not on the stack");i[h]=u.a}};t&&(B.interrupt=(i,h=!1)=>{if(i.i)return;let u=i.mem[788]|i.mem[789]<<8,v={a:i.a,x:i.x,y:i.y,n:i.n,z:i.z,c:i.c,v:i.v,d:i.d};i.vicFlags=h?241:112,h&&(i.splitLine=l[18]|(l[17]&128)<<1);try{S(i,u)?a(i,u):(i.i=1,Ke(i,u,"the interrupt routine",b=>b.stack.push({a:v.a},{a:v.x},{a:v.y})))}finally{Object.assign(i,v),i.i=0,i.vicFlags=i.splitLine=void 0}});function Ke(i,h,u,v){let b=!1;i.callInside(...M(i,h),()=>{b=!0}),v?.(i);for(let I=0;!b;I++){if(I>1e6)throw new Error(u+" at $"+ce(h)+" runs on without end");if(i.exec(i.program.steps[i.pc])==="wait")throw new Error(u+" at $"+ce(h)+" waits")}}return B.inline=(i,h)=>ue[h.words[0]]?ue[h.words[0]](u=>i.mem[u&65535],h.at+3).length:0,B.before=(i,h)=>{if(t&&i.clock&&!i.i){i.cycles>=i.clock.irq&&(i.clock.irq=Math.max(i.clock.irq+16421,i.cycles),B.interrupt(i));let D=Math.floor(i.cycles/63)%312,z=i.clock.line??D,q=l[18]|(l[17]&128)<<1;i.clock.line=D,D<z&&(s.splits=i.clock.splits??new Map,i.clock.splits=new Map),l[26]&1&&(z<=D?z<q&&q<=D:q>z||q<=D)&&B.interrupt(i,!0)}let u=h.start??h.at,v=u!=null&&i.inside===0?e.routines[u]:void 0,b=i.entered===u;if(i.entered=null,v&&!b&&!A(h)){$(i,G(v,[],{a:i.a,x:i.x,y:i.y,c:i.c},void 0,void 0,z=>i.mem[z]));let D=i.stack.at(-1);D?.name!==void 0&&!D.inside&&(D.inside=!0,D.done=z=>{xe[v]&&z.emit(ee(v,{a:z.a,x:z.x,y:z.y,c:z.c}))},i.inside++)}if(e.ticks?.find(D=>D.at===h.at&&i.name===s.fileScripts?.[D.scene])){if(i.ticking===h){i.ticking=null,i.keys[0]===-1&&i.keys.shift();return}return i.emit({step:"tick"}),i.ticking=h,"wait"}},B.setup=i=>{if(t){if(!s.io||s.io[0]>53248||s.io[1]<Qe[1]-1)throw new Error("a Commodore 64 title's io must cover $D000 to the KERNAL's keyboard tables");i.ioAt=h=>h>=53248&&h<=57343&&k(i)||h>=Qe[0]&&h<Qe[1]&&(i.mem[1]&2)!==0,Object.assign(i.mem,{0:47,1:55,153:0,154:3,185:1,186:8,648:4,646:14}),Object.assign(i.mem,{197:64,203:64,204:1,649:10,650:0,651:4,652:16,655:72,656:235}),Gs.forEach((h,u)=>{l[u]=h}),l[3328]=151,Js.forEach((h,u)=>{i.mem[788+2*u]=h&255,i.mem[789+2*u]=h>>8});for(let h=0;h<1e3;h++)i.mem[1024+h]=32,l[2048+h]=14;for(let[h,u]of Object.entries(s.load??{})){let v=s.drive.find(Uint8Array.from(h,b=>b.charCodeAt(0))).raw;i.mem.set(v.subarray(2),u)}i.io=(h,u)=>w(i,h,u),s.basic&&(Object.assign(i.mem,{205:2,206:32,207:0,647:254}),se(i,s.start));return}for(let[h,u]of Object.entries(s.load??{}))i.mem.set(n.file("/"+n.volumes[0]+"/"+h).body,u);if(s.disk.kind==="dos33"){for(let h=0;h<24;h++)i.mem.fill(160,1024+(h&7)*128+(h>>3)*40,1024+(h&7)*128+(h>>3)*40+40);for(let[h,u,v]of s.disk.loads)v&&f(i,v),i.mem.set(n.file(h).body,u);f(i,1),c.read=1,Object.assign(i.mem,{32:0,33:40,34:16,35:24,50:255}),i.delay=2500}i.io=(h,u)=>w(i,h,u)},B}var ce,Pt=U(()=>{we();$t();bt();Xs();jt();Ct();At();nn();on();ln();It();ce=s=>s.toString(16).toUpperCase().padStart(4,"0")});var wn={};F(wn,{blank:()=>_i,placed:()=>Xi,started:()=>Nt,units:()=>Ji});import{prodos as Yi}from"@moonbase-machines/apple2e";var _i,Xi,Nt,Ji,Dt=U(()=>{({blank:_i,placed:Xi,started:Nt,units:Ji}=Yi)});var bn={};F(bn,{loadTitle:()=>Ut,makeEngine:()=>Bt,read:()=>De,titleOf:()=>nt});async function De(s,e){if(s.protocol==="file:"){let n=globalThis.process.getBuiltinModule("node:fs").readFileSync(s,"utf8");return e==="json"?JSON.parse(n):n}let t=await fetch(s);if(!t.ok)throw new Error(`${s.pathname}: ${t.status}`);return e==="json"?t.json():t.text()}async function nt(s){s=new URL(s);let e={...await st(new URL("title.js",s))};for(let t of e.modules??[])e[t]=await st(new URL(t+".js",s));return e.view&&(e.viewSteps=await st(new URL("view.js",s))),e}async function Ut(s,{data:e,scenes:t=!1,fixed:n=!1}={}){s=new URL(s);let r=await nt(s);if(!yn[r.engine])return r.own=await import(new URL(r.engine+".js",s).href),{title:r,scripts:{},disk:null,folder:s};let o=Object.fromEntries(await Promise.all(r.scripts.map(async f=>[f,t?await De(new URL(f+".scene",s),"text"):await st(new URL(`compiled/${n&&r.fixed?.[f]||f}.js`,s))]))),c=await De(new URL(e),"json");return{title:r,scripts:o,disk:c,folder:s}}function Bt(s,e){let t={...s.disk?.kind==="prodos"?Nt(s.disk):{},...s.memory},n=new Ce({routines:yn[s.engine](s),scripts:e,start:s.start,label:s.startLabel,memory:t});return n.title=s,n}var yn,st,it=U(()=>{ut();Ze();Pt();Dt();yn={vector:vt,card:Mt};st=async s=>(await import(s.href)).default});var Nn={};F(Nn,{Speaker:()=>me});var cr,me,ot=U(()=>{cr=`
|
|
8
|
+
`}var ne,er,Ne=B(()=>{gn();kn();yt();ne=s=>Object.fromEntries(Object.entries(s).map(([t,e])=>[t,(n,i)=>{let o=e(c=>n[c],i);return{length:o.length,words:t==="text"||t==="print"||t==="say"?JSON.stringify(o.value):o.value}}])),er=ne(wn)});var vn={};z(vn,{cardRoutines:()=>Pe});function bn(s,t,e){let n=pt[t]||"",i=0,o=null;for(let c of n){let h=e[i++];if(h===void 0||h===c||typeof h=="object")continue;let f=h.startsWith("$")?s.mem[parseInt(h.slice(1),16)]:+h;c==="c"?s.c=f&1:(s[c]=f&255,o!=="a"&&(o=c))}return o&&s.flags(s[o]),e.slice(i)}function Pe(s){let t=s.map,e=s.disk.kind==="c64",n=e?null:s.files??=new Zt(s.disk),i=s.screen??={text:1,mixed:0,page2:0,hires:0},o=0,c={bank:2,read:0,aside:new Uint8Array(4096)},h=(r,p)=>{if(p===c.bank)return;let x=r.mem.slice(53248,57344);r.mem.set(c.aside,53248),c.aside=x,c.bank=p},f=s.chip=new Uint8Array(4096),l={4:r=>r&255,5:r=>r>>8&255,8:r=>r*7&255,9:r=>r*13&255};function m(r,p,x){let S=p&4095;if(S<1024){let b=S&63;if(x===void 0&&(b===17||b===18))return r.raster=r.clock?Math.floor(r.cycles/63)%312:((r.raster??0)+1)%312,b===18?r.raster&255:f[17]&127|r.raster>>1&128;if(x===void 0&&b===25)return r.vicFlags??112;if(x===void 0)return f[b];if(f[b]=x,r.splitLine!==void 0&&b!==25){let N=r.clock?r.clock.splits??=new Map:s.splits??=new Map;(N.get(r.splitLine)??N.set(r.splitLine,new Map).get(r.splitLine)).set(b,x)}b===26&&!(x&1)&&s.splits?.clear();return}if(S<2048){let b=1024|S&31;if(x===void 0)return f[b];f[b]=x,r.sid?.push([r.cycles,S&31,x]);return}if(S<3072){if(x===void 0)return f[S]|240;f[S]=x&15;return}if(S<3328){let b=S&15;if(x===void 0)return l[b]?l[b](s.seed??17):b<2?255:b===13?0:f[3072|b];f[3072|b]=x;return}if(x===void 0)return f[S];if(f[S]=x,(S&15)===0&&r.splitLine!==void 0){let b=r.clock?r.clock.splits??=new Map:s.splits??=new Map;(b.get(r.splitLine)??b.set(r.splitLine,new Map).get(r.splitLine)).set(256,x)}}let g=r=>(r.mem[1]&3)!==0&&(r.mem[1]&4)!==0;function k(r,p,x){if(e&&p>=57344){if(x===void 0)return nn(p);r.mem[p]=x;return}if(e)return m(r,p,x);if((p&65520)===49280){let S=p&15;return h(r,S&8?1:2),c.read=(S&1)===(S>>1&1)?1:0,0}if(p>=49232&&p<=49239){let S=["text","mixed","page2","hires"][p-49232>>1];return i[S]=p&1,0}if(p===49152&&x===void 0){if(!(o&128)){let S=r.key();S!==void 0&&S>=0&&(o=S|128)}return++r.idle>2e3&&(r.polled=!0),o}if(p===49168){let S=o;return!(o&128)&&++r.idle>2e3&&(r.polled=!0),o&=127,S}return p===49200&&r.clicks.push(r.cycles),0}let y=null,w={hooks:new Map,cycles:0,a:0,x:0,y:0,z:0,c:0,n:0,v:0,read:r=>y.mem[r],write:(r,p)=>{y.mem[r]=p&255},nz(r){this.n=r>>7&1,this.z=r?0:1}},O=0;e?sn({cpu:w,read:r=>y.read(r),write:(r,p)=>y.write(r,p),drive:s.bus??=Te(s.drive??=new se(Uint8Array.from(atob(s.disk.image),r=>r.charCodeAt(0))),s.printer??=new Le({on:!1})),held:()=>{let r=y?.clock?.held;return r?.up&&(y.clock.held=null),r&&(r.seen=!0),r??null},call:r=>{M(y,r,"the keyboard read"),Object.assign(w,{a:y.a,x:y.x,y:y.y,c:y.c,z:y.z,n:y.n,v:y.v})},loaded:(r,p,x)=>{(s.files64??=[]).push({name:r,from:p,to:x});let S=s.fileScripts?.[r];if(S){let b={script:S,from:p,to:x};u.splice(0,1/0,...u.filter(N=>N.from<b.from||N.to>b.to),b)}}}):Zs({cpu:w,game:s.disk,sw:{lcRead:0},io:r=>k(y,r),file:r=>n.file(r),get files(){return n.files},put:(r,p)=>n.put(r,p),remove:r=>n.remove(r),clicks:{push:r=>y.clicks.push(y.cycles+r-O)},log(){},halted:!1});let a=(r,p)=>{let x=w.hooks.get(p);if(!x&&e&&p>=40960&&p<49152)throw new Error("a BASIC program, calling BASIC's ROM at $"+ct(p)+": not written yet in the remake");if(!x)throw new Error("no ROM routine at $"+ct(p));y=r,Object.assign(w,{a:r.a,x:r.x,y:r.y,c:r.c,z:r.z,n:r.n,v:r.v,pc:p,sp:r.sp()-2&255});let S=O=w.cycles,b=x(w);if(b==="wait")return"wait";if(r.delay+=(w.cycles-S+6)/ve*1e3,r.cycles+=w.cycles-S+6,Object.assign(r,{a:w.a&255,x:w.x&255,y:w.y&255,c:w.c,z:w.z,n:w.n}),b==="return")return b;if(b===!1&&w.pc!==p)return{to:w.pc}},u=[],d=null,E=(r,p)=>{if(!d){d=new Map;for(let x of Object.keys(r.sources)){let S=r.script(x);for(let b of Object.keys(S.labels))if(/^L[0-9A-F]{4}$/.test(b)){let N=parseInt(b.slice(1),16);(d.get(N)??d.set(N,[]).get(N)).push(x)}}}return d.get(p)??[]},v=(r,p)=>{let x=s.files64?.findLast(U=>U.from<=p&&p<=U.to)??(p>=512&&p<40960?{name:"MEMORY",from:512,to:40959}:null);if(!x)return null;let S=r.mem.slice(x.from,x.to+1),b=(s.fileScripts?.[x.name]??x.name)+"@"+ct(p),N=Ie(S,x.from,[p],t.routines,new Set,ne(ut));return r.sources[b]=Me(N,S,x.from,{selfModified:!0}),d=null,u.push({script:b,from:x.from,to:x.to}),(s.liftedAtNeed??=[]).push(x.name+" $"+ct(p)),console.warn(`lifted at need: ${x.name} from $${ct(p)} (an entry for its scene's lift)`),b},L=new Set(Object.values(s.fileScripts??{})),T=(r,p)=>e?r.filter(x=>!L.has(x)||u.some(S=>S.script===x&&S.from<=p&&p<=S.to)):r,I=(r,p)=>{let x=T(E(r,p),p);!x.length&&e&&v(r,p)&&(x=T(E(r,p),p));let S=u.findLast(N=>x.includes(N.script)&&N.from<=p&&p<=N.to),b=x.length>1?S?.script:x[0];if(!b)throw new Error("no script has $"+ct(p));return[b,"L"+ct(p)]},C=(r,p)=>e?p>=57344?(r.mem[1]&2)!==0:p>=40960&&p<49152?(r.mem[1]&3)===3:p===115||p===121:p>=53248?!(c.read&&E(r,p).length):w.hooks.has(p)&&!E(r,p).length,$=r=>t.stir&&r?.at>=t.stir.from&&r.at<=t.stir.to,j=(r,p,x)=>{x&&r.inside++,r.emit(p),x&&r.inside--},R=r=>{let p=r.stack.pop();p.name!==r.name&&r.enter(p.name),r.pc=p.pc,p.inside&&(r.inside--,p.done?.(r)),p.after?.(r)},A=new Set(["town","restart","escape"]),F=(r,p,x,S)=>{if(p?.at==null)return S.map(N=>parseInt(N,16));let b=[];for(let N=0;N<x;N++)b.push(r.mem[p.at+3+N&65535]);return b},P=r=>r.map(p=>p.toString(16)).join(" "),W=r=>(t.unplaced?.includes(r.step)&&(delete r.x,delete r.y),r),J={chrout:[806,61898],chrin:[804,61783],getin:[810,61758],save:[818,62957]},H=(r,p)=>(x,S,b)=>{bn(x,r,S),j(x,W(G(r,[],x,void 0,void 0,K=>x.mem[K])),$(b));let N=e&&J[r],U=N&&x.mem[N[0]]|x.mem[N[0]+1]<<8;if(N&&U!==N[1]){let[K,Q]=I(x,U);x.callInside(K,Q,tt=>{gt[r]&&tt.emit(et(r,{a:tt.a,x:tt.x,y:tt.y,c:tt.c}))},b?.at==null?void 0:b.at+2&65535);return}let D=a(x,p);if(D==="wait")return"wait";if(D?.to!==void 0)return x.stackPage(),x.stack.push({name:x.name,pc:x.pc,inside:!0,ret:b?.at==null?void 0:b.at+2&65535}),x.inside++,q["goto-engine"](x,["$"+ct(D.to)],b);gt[r]&&e&&x.emit(et(r,{a:x.a,x:x.x,y:x.y,c:x.c}))},q={prodos:(r,p,x)=>{let S=F(r,x,3,p),[b,N,U]=S,D=N|U<<8;j(r,G("prodos",[],r,P(S)),$(x));let K={read:tt=>r.mem[tt],write:(tt,ft)=>{r.mem[tt]=ft&255}};if(b===202){let tt=r.mem[D+1],ft=n.open.get(tt),_=r.mem[D+2]|r.mem[D+3]<<8,ue=ft?Math.min(r.mem[D+4]|r.mem[D+5]<<8,ft.f.body.length-ft.at):0,ks=ft&&s.fileScripts?.[je(t,jt=>r.mem[jt],ft.f.path,ft.at)];if(ks&&ue){let jt={script:ks,from:_,to:_+ue-1};u.splice(0,1/0,...u.filter(ys=>ys.from<jt.from||ys.to>jt.to),jt)}r.delay+=Math.ceil(ue/512)*Hs/ve*1e3}let Q=n.call(b,D,K);r.cycles+=6,Q===null&&(Q=1),r.a=Q==="quit"?0:Q,r.c=r.a?1:0,r.z=r.a?0:1,Q==="quit"&&(r.ended=!0)},stirred:r=>{for(let p of t.stir.counts)r.mem[p]=s.seed&255},hposn:H("hposn",62481),hlin:H("hlin",62778),hcolor:H("hcolor",63216),"clear-page":H("clear-page",62452),pause:H("pause",64680),home:H("home",64600),outport:H("outport",65173),"call-engine":(r,[p],x)=>{let S=parseInt(p.slice(1),16);if(C(r,S)){let U=a(r,S);if(U==="return"){R(r);return}return U}if(!e&&r.mem[S]===96){r.cycles+=6;return}let[b,N]=I(r,S);r.stack.push({name:r.name,pc:r.pc,ret:x?.at==null?void 0:x.at+2&65535}),r.enter(b,N)},"goto-engine":(r,[p],x)=>{let S=parseInt(p.slice(1),16),b=t.routines[S];if(b){if(A.has(b))return q[b](r,[],x);let N=e&&r.stack.at(-1)?.rom;N&&r.inside++;let U;try{U=q[b](r,[],x)}finally{N&&r.inside--}let D=r.stack.at(-1);if(D?.inside){let K=D.done;D.done=Q=>{K?.(Q),R(Q)}}else R(r);return U}if(C(r,S)){if(a(r,S)==="wait")return"wait";e&&nt.has(S)&&xt(r),R(r);return}if(!e&&r.mem[S]===76&&!E(r,S).length)return q["goto-engine"](r,["$"+ct(r.mem[S+1]|r.mem[S+2]<<8)],x);r.enter(...I(r,S))}};e&&s.basic&&(q.sys=(r,p,x,S)=>{r.mem[122]=x&255,r.mem[123]=x>>8;let b=r.mem;Object.assign(r,{a:b[780],x:b[781],y:b[782],c:b[783]&1,z:b[783]>>1&1,n:b[783]>>7});let N=K=>{b[780]=K.a,b[781]=K.x,b[782]=K.y,b[783]=K.c|K.z<<1|(K.i??0)<<2|(K.d??0)<<3|K.v<<6|K.n<<7};if(C(r,p)){let K=a(r,p);return N(r),K}let[U,D]=I(r,p);r.stack.push({name:r.name,pc:r.pc,rom:!0,after:N}),r.enter(U,D)},q["basic-load"]=(r,[p,x=1,S=0])=>{let b=r.mem;for(let U=0;U<p.length;U++)b[512+U]=p.charCodeAt(U);Object.assign(b,{183:p.length,187:0,188:2,186:x,185:S,184:0}),Object.assign(r,{a:0,x:1,y:8}),r.basic.call("load");let N=Object.entries(s.basic).find(([,U])=>U.file===p);if(S===0&&N){rt(r,N[0]),r.enter(N[0]);return}r.pc=0},hn({cpu:w,read:r=>y.read(r),write:(r,p)=>y.write(r,p),evaluate:r=>{let p=y.sources[y.basic.script]?.params?.[r];if(!p)throw new Error("no parameter compiled at $"+ct(r));let[x,S,b]=p;return{value:S(y.basic),end:x,place:b}}})),e&&s.basic&&(q.error=(r,p)=>!(p instanceof ln)||!r.basic?!1:(y=r,pn({cpu:w,write:(x,S)=>{r.mem[x]=S}},p.message,r.basic.at)));let rt=(r,p)=>{r.basic=new an(r,s.basic[p]),r.basic.script=p};for(let[r,p]of Object.entries(t.routines).map(([x,S])=>[+x,S]))!q[p]&&r>=53248&&(q[p]=H(p,r)),!(q[p]||r>=48896)&&(q[p]=(x,S,b)=>{if(bn(x,p,S),A.has(p)&&x.inside){for(let _ of x.stack)_.inside&&(delete _.inside,delete _.done);x.inside=0}let N=b?.at!=null?x.mem[b.at+1&65535]|x.mem[b.at+2&65535]<<8:null,U=$(b),D=t.routines[N]===p?N:parseInt(Object.entries(t.routines).find(([,_])=>_===p)[0]);p==="read-key"&&(x.mem[t.seed]=s.seed&255,x.mem[t.seed+1]=s.seed>>8);let K=ut[p]&&b?.at!=null?ut[p](_=>x.mem[_&65535],b.at+3).value:void 0;j(x,G(p,[],{a:x.a,x:x.x,y:x.y,c:x.c},K,void 0,_=>x.mem[_]),U);let[Q,tt]=I(x,D);if(p==="escape"&&b?.at!=null&&x.stack.push({name:x.name,pc:x.pc,ret:b.at+2&65535}),A.has(p)){x.enter(Q,tt),x.entered=D;return}let ft=_=>{_.mem[t.seed]=s.seed&255,_.mem[t.seed+1]=s.seed>>8};x.callInside(Q,tt,_=>{p==="read-key"&&ft(_),gt[p]&&!U&&_.emit(et(p,{a:_.a,x:_.x,y:_.y,c:_.c}))},b?.at==null?void 0:b.at+2&65535)});q.elsewhere=(r,p)=>{let x=parseInt(p.slice(1),16),S=u.findLast(b=>b.from<=x&&x<=b.to);return S!==void 0&&S.script!==r.name&&/^L[0-9A-F]{4}$/.test(p)},q.timed=!0,q.polls=t.polls,q.reads=t.reads,e&&(q.getin=r=>{!r.clock&&!r.i&&(q.poll(r),r.polledSince=!0);let p;if(r.mem[198]?(p=r.mem[631],r.mem.copyWithin(631,632,631+r.mem[198]),r.mem[198]--):p=r.key(),r.c=0,p===void 0||p<0){r.a=r.flags(0),++r.idle>(r.polls??t.polls??200)&&!r.clock&&(r.polled=!0);return}r.a=r.flags(p),r.idle=0,r.emit(et("getin",{a:p}))});let nt=new Set([59953,60027,60030,60033]);q.poll=r=>{q.interrupt(r),f[26]&1&&q.interrupt(r,!0)};let xt=r=>{for(let p of["y","x","a"]){let x=r.stack.pop();if(x?.a===void 0||x.name!==void 0)throw new Error("the end of an interrupt with its registers not on the stack");r[p]=x.a}};e&&(q.interrupt=(r,p=!1)=>{if(r.i)return;let x=r.mem[788]|r.mem[789]<<8,S={a:r.a,x:r.x,y:r.y,n:r.n,z:r.z,c:r.c,v:r.v,d:r.d};r.vicFlags=p?241:112,p&&(r.splitLine=f[18]|(f[17]&128)<<1);try{C(r,x)?a(r,x):(r.i=1,M(r,x,"the interrupt routine",b=>b.stack.push({a:S.a},{a:S.x},{a:S.y})))}finally{Object.assign(r,S),r.i=0,r.vicFlags=r.splitLine=void 0}});function M(r,p,x,S){let b=!1;r.callInside(...I(r,p),()=>{b=!0}),S?.(r);for(let N=0;!b;N++){if(N>1e6)throw new Error(x+" at $"+ct(p)+" runs on without end");if(r.exec(r.program.steps[r.pc])==="wait")throw new Error(x+" at $"+ct(p)+" waits")}}return q.inline=(r,p)=>ut[p.words[0]]?ut[p.words[0]](x=>r.mem[x&65535],p.at+3).length:0,q.before=(r,p)=>{if(e&&r.clock&&!r.i){r.cycles>=r.clock.irq&&(r.clock.irq=Math.max(r.clock.irq+16421,r.cycles),q.interrupt(r));let U=Math.floor(r.cycles/63)%312,D=r.clock.line??U,K=f[18]|(f[17]&128)<<1;r.clock.line=U,U<D&&(s.splits=r.clock.splits??new Map,r.clock.splits=new Map),f[26]&1&&(D<=U?D<K&&K<=U:K>D||K<=U)&&q.interrupt(r,!0)}let x=p.start??p.at,S=x!=null&&r.inside===0?t.routines[x]:void 0,b=r.entered===x;if(r.entered=null,S&&!b&&!$(p)){j(r,G(S,[],{a:r.a,x:r.x,y:r.y,c:r.c},void 0,void 0,D=>r.mem[D]));let U=r.stack.at(-1);U?.name!==void 0&&!U.inside&&(U.inside=!0,U.done=D=>{gt[S]&&D.emit(et(S,{a:D.a,x:D.x,y:D.y,c:D.c}))},r.inside++)}if(t.ticks?.find(U=>U.at===p.at&&r.name===s.fileScripts?.[U.scene])){if(r.ticking===p){r.ticking=null,r.keys[0]===-1&&r.keys.shift();return}return r.emit({step:"tick"}),r.ticking=p,"wait"}},q.setup=r=>{if(e){if(!s.io||s.io[0]>53248||s.io[1]<ee[1]-1)throw new Error("a Commodore 64 title's io must cover $D000 to the KERNAL's keyboard tables");r.ioAt=p=>p>=53248&&p<=57343&&g(r)||p>=ee[0]&&p<ee[1]&&(r.mem[1]&2)!==0,Object.assign(r.mem,{0:47,1:55,153:0,154:3,185:1,186:8,648:4,646:14}),Object.assign(r.mem,{197:64,203:64,204:1,649:10,650:0,651:4,652:16,655:72,656:235}),en.forEach((p,x)=>{f[x]=p}),f[3328]=151,tn.forEach((p,x)=>{r.mem[788+2*x]=p&255,r.mem[789+2*x]=p>>8});for(let p=0;p<1e3;p++)r.mem[1024+p]=32,f[2048+p]=14;for(let[p,x]of Object.entries(s.load??{})){let S=s.drive.find(Uint8Array.from(p,b=>b.charCodeAt(0))).raw;r.mem.set(S.subarray(2),x)}r.io=(p,x)=>k(r,p,x),s.basic&&(Object.assign(r.mem,{205:2,206:32,207:0,647:254}),rt(r,s.start));return}for(let[p,x]of Object.entries(s.load??{}))r.mem.set(n.file("/"+n.volumes[0]+"/"+p).body,x);if(s.disk.kind==="dos33"){for(let p=0;p<24;p++)r.mem.fill(160,1024+(p&7)*128+(p>>3)*40,1024+(p&7)*128+(p>>3)*40+40);for(let[p,x,S]of s.disk.loads)S&&h(r,S),r.mem.set(n.file(p).body,x);h(r,1),c.read=1,Object.assign(r.mem,{32:0,33:40,34:16,35:24,50:255}),r.delay=2500}r.io=(p,x)=>k(r,p,x)},q}var ct,De=B(()=>{yt();Ce();Se();Qs();Oe();Ae();Re();cn();fn();dn();Ne();ct=s=>s.toString(16).toUpperCase().padStart(4,"0")});var Sn={};z(Sn,{blank:()=>nr,placed:()=>ir,started:()=>Ue,units:()=>rr});import{prodos as sr}from"@moonbase-machines/apple2e";var nr,ir,Ue,rr,Be=B(()=>{({blank:nr,placed:ir,started:Ue,units:rr}=sr)});var $n={};z($n,{loadTitle:()=>ze,makeEngine:()=>Fe,read:()=>zt,titleOf:()=>re});async function zt(s,t){if(s.protocol==="file:"){let n=globalThis.process.getBuiltinModule("node:fs").readFileSync(s,"utf8");return t==="json"?JSON.parse(n):n}let e=await fetch(s);if(!e.ok)throw new Error(`${s.pathname}: ${e.status}`);return t==="json"?e.json():e.text()}async function re(s){s=new URL(s);let t={...await ie(new URL("title.js",s))};for(let e of t.modules??[])t[e]=await ie(new URL(e+".js",s));return t.view&&(t.viewSteps=await ie(new URL("view.js",s))),t}async function ze(s,{data:t,scenes:e=!1,fixed:n=!1}={}){s=new URL(s);let i=await re(s);if(!En[i.engine])return i.own=await import(new URL(i.engine+".js",s).href),{title:i,scripts:{},disk:null,folder:s};let o=Object.fromEntries(await Promise.all(i.scripts.map(async h=>[h,e?await zt(new URL(h+".scene",s),"text"):await ie(new URL(`compiled/${n&&i.fixed?.[h]||h}.js`,s))]))),c=await zt(new URL(t),"json");return{title:i,scripts:o,disk:c,folder:s}}function Fe(s,t){let e={...s.disk?.kind==="prodos"?Ue(s.disk):{},...s.memory},n=new Lt({routines:En[s.engine](s),scripts:t,start:s.start,label:s.startLabel,memory:e});return n.title=s,n}var En,ie,oe=B(()=>{xe();te();De();Be();En={vector:Ee,card:Pe};ie=async s=>(await import(s.href)).default});var Mn={};z(Mn,{Speaker:()=>mt});var pr,mt,ae=B(()=>{pr=`
|
|
9
9
|
class SpeakerProcessor extends AudioWorkletProcessor {
|
|
10
10
|
constructor() { super(); this.queue = []; this.at = 0; this.level = 0; this.port.onmessage = e => this.queue.push(e.data); }
|
|
11
11
|
process(inputs, outputs) {
|
|
@@ -19,14 +19,14 @@ class SpeakerProcessor extends AudioWorkletProcessor {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
registerProcessor('speaker', SpeakerProcessor);
|
|
22
|
-
`,me=class{constructor(){this.context=null,this.node=null,this.level=0,this.from=null}async start(){this.context||(this.context=new AudioContext,await this.context.audioWorklet.addModule(URL.createObjectURL(new Blob([cr],{type:"text/javascript"}))),this.node=new AudioWorkletNode(this.context,"speaker"),this.node.connect(this.context.destination),this.rate=this.context.sampleRate,this.context.state!=="running"&&await this.context.resume())}feed(e,t){if(!this.node)return;this.from===null&&(this.from=t);let n=1020484/this.rate,r=Math.floor((t-this.from)/n);if(r<=0)return;let o=new Float32Array(r),c=0;for(let f=0;f<r;f++){let l=this.from+(f+1)*n;for(;c<e.length&&e[c]<=l;)this.level=this.level?0:.25,c++;o[f]=this.level}this.from+=r*n,this.node.port.postMessage(o,[o.buffer])}}});var Dn={};F(Dn,{Machine:()=>fr});import{machine as lr}from"@moonbase-machines/apple2e";var fr,Un=U(()=>{({Machine:fr}=lr)});var Bn={};F(Bn,{COLORS:()=>dr,colors:()=>Gt,paint:()=>pr,paintHires:()=>Zt,paintText:()=>at,rowStart:()=>ur,screen:()=>mr,textRow:()=>xr});import{screen as hr}from"@moonbase-machines/apple2e";var dr,Gt,pr,Zt,at,ur,mr,xr,ct=U(()=>{({COLORS:dr,colors:Gt,paint:pr,paintHires:Zt,paintText:at,rowStart:ur,screen:mr,textRow:xr}=hr)});var zn={};F(zn,{bounds:()=>kr,document:()=>wr,elements:()=>Qt});import{svg as gr}from"@moonbase-machines/vector";var kr,wr,Qt,es=U(()=>{({bounds:kr,document:wr,elements:Qt}=gr)});var Fn={};F(Fn,{C64:()=>br});import{machine as yr}from"@moonbase-machines/c64";var br,qn=U(()=>{({C64:br}=yr)});var Kn={};F(Kn,{keyboard:()=>Sr,pace:()=>Er,painter:()=>$r});import{browser as vr}from"@moonbase-machines/c64";var Sr,Er,$r,Wn=U(()=>{({keyboard:Sr,pace:Er,painter:$r}=vr)});var Hn={};F(Hn,{SID:()=>ts});import{sid as jr}from"@moonbase-machines/c64";var ts,ss=U(()=>{({SID:ts}=jr)});var Vn={};F(Vn,{ROM_CHOICES:()=>Or,c64Roms:()=>Lr,typed:()=>Ar});import{start as Cr}from"@moonbase-machines/c64";var Or,Lr,Ar,Yn=U(()=>{({ROM_CHOICES:Or,c64Roms:Lr,typed:Ar}=Cr)});var _n={};F(_n,{SECTORS:()=>Tr,add:()=>Ir,make:()=>Mr,petsciiName:()=>Pr,read:()=>Nr});import{d64 as Rr}from"@moonbase-machines/c64";var Tr,Ir,Mr,Pr,Nr,Xn=U(()=>{({SECTORS:Tr,add:Ir,make:Mr,petsciiName:Pr,read:Nr}=Rr)});var ns={};F(ns,{play:()=>Dr});async function Dr(s){s.stage.innerHTML='<svg id="vector" viewBox="0 0 140 192" preserveAspectRatio="none"></svg><canvas id="screen" width="560" height="384" tabindex="0"></canvas>';let e=s.stage.querySelector("canvas"),t=e.getContext("2d"),n=s.stage.querySelector("#vector");return s.game.kind==="c64"?Br(s,{canvas:e,layer:n,speaker:new me}):Ur(s,{canvas:e,ctx:t,layer:n,speaker:new me})}async function Ur({game:s,saves:e,roms:t,status:n,control:r,$:o},{canvas:c,ctx:f,layer:l,speaker:d}){let[{Machine:g},{placed:k},{screen:w},{shapes:x},{elements:j}]=await Promise.all([Promise.resolve().then(()=>(Un(),Dn)),Promise.resolve().then(()=>(Dt(),wn)),Promise.resolve().then(()=>(ct(),Bn)),Promise.resolve().then(()=>(_e(),Ts)),Promise.resolve().then(()=>(es(),zn))]);r('<label><input type="checkbox" id="vectors"> Draw the pictures as vectors</label>');let O=o("vectors"),a=e.data,p=null,m=null;if(t?.apple)try{p=t.apple,m=e.disks(k(a,new Map(await Promise.all(s.images.map(async N=>[N,await t.image(N)])))))}catch{p=null}let y=new g(a,{log:(...N)=>console.log(...N),...p?{roms:p,disks:m}:{}});console.log(p?"line 1: Apple's ROMs, the disks booted":"line 2: moonbase's machine"),e.keep(p?e.driveFiles(y,m):y.disk),y.diskTime=!0;let E=!1,L=0;function C(){let N=(P,W)=>{e:for(let _=16384;_<32768-P.length;_++){for(let K=0;K<P.length;K++)if(P[K]!==null&&W[_+K]!==P[K])continue e;return _}return-1};for(let P of[y.aux,y.main]){let W=N([32,null,null,32,null,null,238,null,null,76],P),_=N([162,0,160,224,24,96],P),K=N([141,null,null,142,null,null,140,null,null,173,null,null,201,128,240],P);if(!(W<0||_<0||K<0)){y.cpu.hooks.set(W,B=>(B.read16(96)===57344&&(l.insertAdjacentHTML("beforeend",j(x(se=>y.read(se),57344),{background:L})),y.marking=1),!1)),y.cpu.hooks.set(_,()=>(y.marking=0,!1)),y.cpu.hooks.set(K,B=>(B.a!==128&&(L=B.a&15),l.innerHTML="",y.owner.fill(0),!1)),E=!0;return}}}let M=new Uint8ClampedArray(560*384*4),S=new ImageData(M,560,384),A=new Uint8Array(26880),$="";function R(){y.halted||y.runCycles(17030);let N=`text ${y.sw.text} page2 ${y.sw.page2} hires ${y.sw.hires} dhires ${y.sw.dhires}`;N!==$&&(console.log("screen:",N,"at pc $"+y.cpu.pc.toString(16),"cycles",y.cpu.cycles),$=N),d.feed(T?y.clicks:[],y.cpu.cycles),y.clicks.length=0,E||C();let P=y.sw.text;w(y,M,{cols:A,owner:O.checked&&l.innerHTML?y.owner:null}),f.putImageData(S,0,0),l.style.visibility=O.checked&&!P?"visible":"hidden",n.textContent=y.halted?"The game has stopped: "+y.halted+".":y.idle>2e3?"Waiting for a key.":"Running.",requestAnimationFrame(R)}c.addEventListener("pointerdown",()=>c.focus());let T=!0;return{run(){c.focus(),R()},press(N){console.log("key",N,"at pc $"+y.cpu.pc.toString(16)),y.press(N)},start(){d.start()},sound(N){T=N},soundOn:!0,engine:y}}async function Br(s,{canvas:e,layer:t,speaker:n}){let{game:r,saves:o,roms:c,studies:f,status:l,printer:d}=s,[{C64:g},{keyboard:k,painter:w},{SID:x},{c64Roms:j,typed:O},{add:a}]=await Promise.all([Promise.resolve().then(()=>(qn(),Fn)),Promise.resolve().then(()=>(Wn(),Kn)),Promise.resolve().then(()=>(ss(),Hn)),Promise.resolve().then(()=>(Yn(),Vn)),Promise.resolve().then(()=>(Xn(),_n))]),p=await j(c?.choice??null,c?.load);if(!p)return l.textContent="Commodore's ROMs, asked for, are not here.",null;s.chargen=p.chargen;let m=new g(r,p,{log:(...P)=>console.log(...P),printer:d});o.drive(m.drive);let y=P=>Uint8Array.from(atob(P),W=>W.charCodeAt(0));for(let[P,W]of Object.entries(f??{}))m.drive.saved.set(P,y(W));t.style.display="none";let E=w(e),L=null,C=0,M=!0,S={keydown:[],keyup:[]},A=k(m,{log:!0,listen:(P,W)=>S[P].push(W)}),$=0,R=null,T=performance.now();function N(){let P=Math.min(2,Math.floor((performance.now()-T)/20)-$);for(let W=0;W<P;W++){if(m.runFrame(),$++,A.frame(),n.node&&M){R||(R=new x(n.rate));let _=Math.round(19656/985248*n.rate),K=m.cpu.cycles-19656,B=R.render(_,m.sidWrites.map(([se,ne,he])=>[Math.floor((se-K)/19656*_),ne,he]));n.node.port.postMessage(B,[B.buffer])}m.sidWrites.length=0}$>=120&&L===null&&!C&&(L=O(m,r),C=1),L!==null&&!m.ram[198]&&(L=m.type(L),L.length||(L=null)),E(m.vic.frame),l.textContent=m.halted?"The game has stopped: "+m.halted+".":"Running.",requestAnimationFrame(N)}return{run(){e.focus(),N()},press(P){m.type(String.fromCharCode(P))},key(P){for(let W of S[P.type])W(P)},start(){n.start()},sound(P){M=P},soundOn:!0,engine:m,diskImage:()=>a(m.drive.image,[...m.drive.saved].map(([P,W])=>({name:P,data:W})))}}var is=U(()=>{ot()});import{rom as zr}from"@moonbase-machines/c64";var fc,Jn,Gn=U(()=>{({install:fc,standIn:Jn}=zr)});import{colors as Fr}from"@moonbase-machines/apple2e";var Zn,pc,oe,Qn=U(()=>{({COLORS:Zn,NAMES:pc,rgb:oe}=Fr)});import{font as qr}from"@moonbase-machines/charset";var rs,ei=U(()=>{({FONT:rs}=qr)});var ti={};F(ti,{View:()=>Ue});var Kr,H,V,lt,Wr,os,Hr,Ue,as=U(()=>{Qn();_e();Ye();Ze();es();Le();Me();ei();ct();Kr="http://www.w3.org/2000/svg",H=s=>s*4,V=s=>s*2,lt='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',Wr='ui-monospace, Menlo, Consolas, "Liberation Mono", monospace',os=["[","\\","]","^"],Hr={"[":"\u2190","\\":"\u2192","]":"\u2193","^":"\u2191"},Ue=class{constructor(e,{disk:t,volume:n,engine:r,extra:o={},press:c}){this.svg=e,this.engine=r,this.extra=o,this.press=c,e.setAttribute("viewBox","0 0 560 384"),this.disk=t.volumes[n],this.pictures=new Map;for(let[g,k]of Object.entries(t.volumes[n]))if(/^PICS\d$/.test(g))for(let w of Oe(Uint8Array.from(atob(k.data),x=>x.charCodeAt(0))))this.pictures.set(w.name,w.shapes);let f=r.title.map;this.vars=f.vars;let l={...Hr,...f.modern};for(let g=0;g<10;g++)l[String.fromCharCode(128+g)]=String(g);let d=new RegExp("["+Object.keys(l).map(g=>"\\"+g).join("")+"]","g");this.modern=g=>g.replace(d,k=>l[k]),this.tables=new Map(Ve(Ne(f,t.volumes[n]),f.objects).map(g=>[g.address,g.objects])),this.items=[],this.pen={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10},this.window={color:0,bottom:116},this.shapes=[],this.spaceBar=null,this.layer=this.el("g"),e.append(this.layer),this.textScreen=this.el("g",{display:"none"}),e.append(this.textScreen),this.prompt=this.el("g"),e.append(this.prompt),this.textPen=Ie(),this.textCells=ke(),this.rect(0,0,140,192,15,this.layer)}el(e,t={},n){let r=document.createElementNS(Kr,e);for(let[o,c]of Object.entries(t))r.setAttribute(o,c);return n?.append(r),r}rect(e,t,n,r,o,c=this.layer){return this.el("rect",{x:H(e),y:V(t),width:H(n),height:V(r),fill:oe(o),"shape-rendering":"crispEdges"},c)}add(e,t,n,{covers:r=!0,left:o=0,right:c=139}={}){return r&&(this.items=this.items.filter(f=>f.top>=e&&f.bottom<=t&&f.left>=o&&f.right<=c?(f.el.remove(),!1):!0)),this.items.push({top:e,bottom:t,left:o,right:c,el:n}),this.layer.append(n),n}remove(e){e.remove(),this.items=this.items.filter(t=>t.el!==e)}fill(e,t,n,r=!0){let o=this.el("g");this.rect(0,e,140,t-e+1,n,o),r&&(this.rect(0,e,1,t-e+1,15,o),this.rect(139,e,1,t-e+1,15,o)),this.add(e,t,o)}whiteLines(e){this.add(e,e+1,this.rect(0,e,140,2,15,null))}snapshot(e){let t=this.engine.mem;return e.layout=t[this.vars.layout],e.difficulty=t[this.vars.difficulty],e.step==="text"&&(e.words=ye(e.words,t)),e.step==="span"&&(e.row=t[this.vars.zero+2]),e}apply(e){this.difficulty=e.difficulty,this.spaceBar?.erase&&!this.waiting()&&(this.fill(this.spaceBar.y,this.spaceBar.y+10,5),this.spaceBar.el.remove(),this.spaceBar=null);let t=this.extra[e.step]??(typeof this[e.step]=="function"?this[e.step]:void 0);t&&t.call(this,e)}waiting(){return this.engine.waitingOn}"text-screen"(){this.textCells=ke(),this.textScreen.replaceChildren(),this.rect(0,0,140,192,0,this.textScreen),this.textScreen.setAttribute("display","inline"),this.layer.setAttribute("display","none")}show(){this.textScreen.setAttribute("display","none"),this.layer.setAttribute("display","inline")}textCell(e,t,n,r){this.textCells[e][t].el?.remove();let c=this.el("g",{"data-cell":e*40+t},this.textScreen),f=t*14,l=e*16,d=r?"#000":"#fff";if(r&&this.el("rect",{x:f,y:l,width:14,height:16,fill:"#fff","shape-rendering":"crispEdges"},c),this.oldStyle){let g=rs[n.charCodeAt(0)-32]??rs[0],k="";for(let w=0;w<5;w++)for(let x=0;x<7;x++)g[w]>>x&1&&(k+=`M${f+2+w*2} ${l+x*2}h2v2h-2z`);k&&this.el("path",{d:k,fill:d},c)}else if(n!==" "){let g=this.el("text",{x:f+7,y:l+12,fill:d,"font-family":Wr,"font-size":15,"text-anchor":"middle"},c);g.textContent=n}this.textCells[e][t]={ch:n,inverse:r,el:c}}splash(){let e=this.disk.TITLE;if(!e)return;let t=Uint8Array.from(atob(e.data),o=>o.charCodeAt(0)),n=Gt(t.subarray(0,8192),t.subarray(8192)),r=[];for(let o=0;o<192;o++)r.push(Array.from(n.subarray(o*140,o*140+140)));this.clear(),this.add(0,191,this.el("image",{href:this.image(r),x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))}"clear-screen"(){this.clear(),this.add(0,191,this.rect(0,0,140,192,0,null))}clear(){for(let e of this.items)e.el.remove();this.items=[]}"keep-screen"(){this.kept={items:this.items,pen:{...this.pen},window:{...this.window},shapes:this.shapes,spaceBar:this.spaceBar};for(let e of this.items)e.el.remove();this.items=[],this.spaceBar=null,this["clear-screen"]()}"put-screen"(){if(!this.kept)return;this.clear();let e=this.kept;this.kept=null;for(let t of e.items)this.layer.append(t.el);Object.assign(this,{items:e.items,pen:e.pen,window:e.window,shapes:e.shapes,spaceBar:e.spaceBar})}box({a:e,x:t,y:n,layout:r}){let[o,c,f]=ge[r]??ge[50];if(e!==128&&t!==128&&n!==128){for(let l of this.items)l.el.remove();this.items=[]}if(e!==128){let l=this.el("g");this.rect(1,1,138,o-1,e,l),this.el("rect",{x:H(1)+2,y:V(1)+1,width:H(138)-4,height:V(o-2)-2,fill:"none",stroke:"black","stroke-width":4},l),this.add(1,o-1,l,{left:1,right:138}),this.window={color:e,bottom:o},this.shapes=[]}t!==128&&(this.whiteLines(c),this.fill(c+2,f-1,t)),n!==128&&(this.whiteLines(f),this.fill(f+2,189,n))}panel({n:[e]}){let t=Ae[e];if(t){this.whiteLines(t.rows[0]),this.fill(t.rows[0]+2,t.rows[1],t.fill);for(let n of t.more??[])this.whiteLines(n);Object.assign(this.pen,{paper:t.paper,ink:t.ink,centre:!0,spacing:1,gap:t.gap,y:t.y})}}scroll(){let o=this.scrolling,c=(g,k,w)=>{let x="scroll-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:H(g),y:V(19)-1,width:H(k-g),height:V(97)+1},this.el("clipPath",{id:x},this.svg)),this.el("g",{"clip-path":`url(#${x})`},w)},f=(g,k)=>this.items.filter(w=>w!==o?.item&&w.top<=115&&w.bottom>=19&&w.left<=k&&w.right>=g);if(o?.item.el.isConnected&&this.items.at(-1)===o.item){let g=c(129.5,136.5,this.el("g",{transform:`translate(${H(7*o.n)} 0)`},o.moved));for(let k of f(129.5,129.5+7))g.append(k.el.cloneNode(!0));o.n++,o.moved.setAttribute("transform",`translate(${H(-7*o.n)} 0)`);return}let l=c(3.5,129.5),d=this.el("g",{transform:`translate(${H(-7)} 0)`},l);this.rect(3.5,19,1120,97,this.window.color,d);for(let g of f(3.5,139))d.append(g.el.cloneNode(!0));this.add(19,115,l,{left:4,right:129}),this.scrolling={item:this.items.at(-1),moved:d,n:1}}"shift-down"({left:e,right:t,top:n,bottom:r,by:o}){let c=this.shifting,f=(k,w,x)=>{let j="shift-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:H(e),y:V(k),width:H(t-e+1),height:V(w-k)},this.el("clipPath",{id:j},this.svg)),this.el("g",{"clip-path":`url(#${j})`},x)},l=(k,w)=>this.items.filter(x=>x!==c?.item&&x.top<=w&&x.bottom>=k&&x.left<=t&&x.right>=e);if(c?.item.el.isConnected&&this.items.at(-1)===c.item){let k=f(n,n+o,this.el("g",{transform:`translate(0 ${V(-o*c.n)})`},c.moved));for(let w of l(n,n+o-1))k.append(w.el.cloneNode(!0));c.n++,c.moved.setAttribute("transform",`translate(0 ${V(o*c.n)})`);return}let d=f(n+o,r+o+1),g=this.el("g",{transform:`translate(0 ${V(o)})`},d);this.rect(e,n-o*60,t-e+1,r-n+1+o*61,this.window.color,g);for(let k of l(n,r))g.append(k.el.cloneNode(!0));this.add(n+o,r+o,d,{left:e,right:t}),this.shifting={item:this.items.at(-1),moved:g,n:1}}paint(e,t,n,r){this.hide(t,n,r,r);let o=this.painted;if(o?.el.isConnected&&o.color===e&&o.left===t&&o.right===n&&o.bottom===r-1){o.bottom=r,o.el.setAttribute("height",V(r-o.top+1));let f=this.items.find(l=>l.el===o.el);this.items=this.items.filter(l=>l!==f&&l.top>=o.top&&l.bottom<=r&&l.left>=t&&l.right<=n?(l.el.remove(),!1):!0),f&&(f.bottom=r);return}let c=this.add(r,r,this.rect(t,r,n-t+1,1,e,null),{left:t,right:n});this.painted={el:c,color:e,left:t,right:n,top:r,bottom:r}}span({a:e,x:t,y:n,row:r}){this.paint(e&15,t,n,r)}dot({a:e,x:t,y:n}){this.paint(e&15,t,t,n)}"white-lines"({y:e}){this.whiteLines(e)}"fill-rows"({a:e,x:t,y:n}){this.fill(n,n+t-1,e)}picture({words:e}){let t=this.pictures.get(e.toUpperCase().replace(/_/g," "));if(!t)return;let n="window-"+this.window.bottom;this.clips??=new Set,this.clips.has(n)||(this.clips.add(n),this.el("rect",{x:0,y:0,width:H(140),height:V(this.window.bottom)},this.el("clipPath",{id:n},this.svg)));let r=this.el("g",{"clip-path":`url(#${n})`}),o=this.el("g",{transform:"scale(4 2)"},r);o.innerHTML=Qt(t,{crisp:!1}),this.add(1,this.window.bottom-1,r,{covers:!1,left:1,right:138}),this.shapes=this.shapes.concat(t),this.picturesShapes=t}objects({table:e}){this.table=parseInt(e.slice(1),16)}object({a:e,x:t,y:n},r="whole"){let o=r==="keep",c=r==="whole",f=this.tables.get(this.table);if(e<2){this.kept?.isConnected&&this.remove(this.kept),this.kept=null;return}let l=f?.find(x=>x.number===e);if(!l)return;let d=l.rows.map(x=>x.map(j=>!c&&j===l.clear?void 0:j)),g=t+l.width-1,k=n+l.height-1;c&&this.hide(t,g,n,k);let w=this.el("image",{href:this.image(d),x:H(t),y:V(n),width:H(l.width),height:V(l.height),preserveAspectRatio:"none",style:"image-rendering: pixelated"});this.add(n,k,w,{covers:c,left:t,right:g}),o&&(this.kept=w),c&&(this.items.at(-1).whole={x:t,y:n,rows:d})}hide(e,t,n,r){for(let o of[...this.items]){let c=o.whole;if(!c||c.x>t||c.x+c.rows[0].length-1<e||c.y>r||c.y+c.rows.length-1<n)continue;let f=!1,l=c.rows.map((d,g)=>d.map((k,w)=>{let x=c.x+w,j=c.y+g;if(k!==void 0&&x>=e&&x<=t&&j>=n&&j<=r){f=!0;return}return k}));if(f){if(l.every(d=>d.every(g=>g===void 0))){this.remove(o.el);continue}o.el.setAttribute("href",this.image(l)),c.rows=l}}}image(e){let t=document.createElement("canvas");t.width=e[0].length,t.height=e.length;let n=t.getContext("2d"),r=n.createImageData(t.width,t.height);return e.forEach((o,c)=>o.forEach((f,l)=>{if(f===void 0)return;let[d,g,k]=Zn[f];r.data.set([d,g,k,255],(c*t.width+l)*4)})),n.putImageData(r,0,0),t.toDataURL()}"object-keep"(e){this.object(e,"keep")}"object-mode"(e){this.object(e,"clear")}"key-at"({a:e,x:t,y:n}){this.pen.x=t,this.pen.y=n,this.key({a:e})}key({a:e}){let t=ie(e);this.cap(e,this.pen.x,this.pen.y,this.layer,!0,void 0,Math.max(4,t)+4),this.pen.x+=1+(t<4?4-t:0)+1+t+3}cap(e,t,n,r,o,c,f){let l={"\r":"RETURN","\x7F":"DELETE"}[e]??e,d=f??(l.length>1?32:7),g=this.el("g",c!==void 0?{class:"key","data-key":c}:{});if(this.el("rect",{x:H(t),y:V(n-2),width:H(d),height:V(11),rx:3,fill:oe(1),stroke:oe(13),"stroke-width":3},g),this.oldStyle){let k=0;for(let w of l)k+=ie(w)+1;this.glyphs(g,l,t+Math.max(1,Math.round((d-k+1)/2)),n,15)}else{let k=this.el("text",{x:H(t+d/2),y:V(n+7),fill:oe(15),"font-family":lt,"font-size":l.length>1?13:16,"font-weight":600,"text-anchor":"middle"},g);k.textContent=this.modern(l)}return o?(this.add(n-2,n+8,g,{covers:!1,left:t,right:t+d}),this.items.at(-1).cap=!0):r.append(g),g}text({words:e}){if(this.textScreen.getAttribute("display")!=="none"){for(let t of Te(e,this.textPen))this.textCells[t.row]?.[t.col]&&this.textCell(t.row,t.col,t.ch,t.inverse);return}for(let t of Re(e,this.pen)){let{top:n,tall:r}=t,o=r?32:19,c=t.chars.filter(w=>w.ch.charCodeAt(0)>=32);if(c.length){let w=Math.min(...c.map(O=>O.x)),x=Math.max(...c.map(O=>O.x+ie(O.ch)))-1,j=Math.min(9,t.height??9)*(r?2:1);this.add(n,n+j-1,this.rect(w,n,x-w+1,j,t.paper,null),{left:w,right:x})}let f=this.el("g",{"font-family":lt,"font-size":o,"font-weight":r?700:500}),l=null,d=139,g=0,k=()=>{if(!l)return;if(d=Math.min(d,l.x),g=Math.max(g,l.x+l.width),this.oldStyle){this.glyphs(f,l.chars,l.x,n,t.ink,r,t.paper),l=null;return}let w=this.el("text",{y:V(n+(r?15:7)),"data-x":H(l.x),"data-width":H(l.width)},f);for(let x of l.chars){let j=this.el("tspan",{fill:oe(x.ink??t.ink)},w);j.textContent=this.modern(x.ch)}l=null};for(let w of t.chars){if(w.ch.charCodeAt(0)<=32){k();continue}l??={x:w.x,width:0,chars:[]},l.chars.push(w),l.width=w.x+ie(w.ch)-l.x}k(),f.childNodes.length&&(this.add(n,n+(r?16:8),f,{covers:!1,left:d,right:g}),this.fit(f))}}fit(e){for(let t of e.querySelectorAll("text[data-width]")){let n=t.getComputedTextLength();n>0&&t.setAttribute("transform",`translate(${t.dataset.x} 0) scale(${t.dataset.width/n} 1)`)}}glyphs(e,t,n,r,o,c=!1,f){let l=typeof t=="string"?[...t].map(k=>({ch:k})):t,d=c?2:1,g=new Map;for(let k of l){let w=ie(k.ch),x=k.ink??o;f!==void 0&&this.rect(n,r,w,9*d,f,e);let j=g.get(x)??"";for(let[O,a]of Xe(k.ch))j+=`M${H(n+O)} ${V(r+a*d)}h4v${2*d}h-4z`;g.set(x,j),n+=w+1}for(let[k,w]of g)w&&this.el("path",{d:w,fill:oe(k)},e);return n}write(e,t,n,r,o=15){if(this.oldStyle)return this.glyphs(e,t,n,r,o);let c=this.el("g",{"font-family":lt,"font-size":19,"font-weight":500,fill:oe(o)},e);for(let f of t.split(" ")){if(f){let l=0;for(let g of f)l+=ie(g)+1;let d=this.el("text",{y:V(r+7),"data-x":H(n),"data-width":H(l-1)},c);d.textContent=this.modern(f),n+=l}n+=ie(" ")+1}return this.fit(c),n}line({x0:e,x1:t,y0:n,y1:r,color:o}){this.add(Math.min(n,r),Math.max(n,r),this.el("line",{x1:H(e+.5),y1:V(n+.5),x2:H(t+.5),y2:V(r+.5),stroke:oe(o),"stroke-width":3,"stroke-linecap":"round"}),{covers:!1,left:Math.min(e,t),right:Math.max(e,t)})}rectangle({a:e,x:t,y:n,width:r,height:o}){this.solid(e,t,n,r+1,o)}"rectangle-outline"({a:e,x:t,y:n,width:r,height:o}){let c=r+1,f=o+1;this.add(n,n+f-1,this.el("rect",{x:H(t)+2,y:V(n)+1,width:H(c)-4,height:V(f)-2,fill:"none",stroke:oe(e),"stroke-width":3}),{covers:!1,left:t,right:t+c-1})}solid(e,t,n,r,o){this.add(n,n+o-1,this.rect(t,n,r,o,e,null),{left:t,right:t+r-1})}prompts(){this.prompt.replaceChildren();let e=this.engine,t=e.waitingOn;if(!t)return;let n=t.words?.[0]??t.name;if(n==="wait"||n==="wait-erase"||n==="wait-or-escape"){let r=(e.mem[this.vars.layout]&15)===1?178:170,o=this.el("g",{class:"key","data-key":32},this.prompt);if(this.el("rect",{x:H(46),y:V(r),width:H(47),height:V(11),rx:4,fill:oe(1),stroke:oe(13),"stroke-width":3},o),this.oldStyle)this.glyphs(o,"SPACE BAR",48,r+2,15);else{let c=this.el("text",{x:H(69.5),y:V(r+8),fill:oe(15),"font-family":lt,"font-size":15,"font-weight":600,"text-anchor":"middle"},o);c.textContent="SPACE BAR"}this.spaceBar={y:r,erase:n==="wait-erase",el:o}}else if(n==="ask"||n==="ask-mode"||n==="ask-escape"){this.rect(1,162,138,28,5,this.prompt);let r=e.askMode,o=[];if(r===128)os.forEach((f,l)=>o.push([f,[8,21,10,11][l]]));else if(r>=177&&r<186)for(let f=49;f<=(r&127);f++)o.push([String.fromCharCode(f),f]);else for(let f=65;f<=(r&95);f++)o.push([String.fromCharCode(f),f]);let c=(f,l,d)=>this.write(this.prompt,f,l,d);if(e.asked===null)c("Press",4,166),o.forEach(([f,l],d)=>{d===o.length-1&&r!==128&&o.length>1&&c("or",31+10*d,166),this.cap(f,31+10*d+(d===o.length-1&&r!==128&&o.length>1?10:0),166,this.prompt,!1,l)}),r===128&&[[58,62],[74,62],[66,71],[66,53]].forEach(([f,l],d)=>this.cap(os[d],f,l,this.prompt,!1,o[d][1]));else{let[f]=o[e.asked.place];this.cap(f,31+10*e.asked.place,166,this.prompt,!1),c("Press",4,179),this.cap("\r",31,179,this.prompt,!1,13),c("or",67,179),this.cap("\x7F",78,179,this.prompt,!1,127),r===128&&this.cap(os[e.asked.place],[58,74,66,66][e.asked.place],[62,62,71,53][e.asked.place],this.prompt,!1)}}}}});var si={};F(si,{CardView:()=>Be});function Yr(s,{top:e}){for(let t=0;t<e;t++)for(let n=0;n<560;n++){let r=(t*560+n)*4;if(s[r]<200||s[r+1]<200||s[r+2]<200)return!1}return!0}function _r(s,{top:e,bottom:t,move:[n,r],by:o}){for(let c=e;c<=t;c++){let f=c*560*4;s.copyWithin(f+(n+o)*4,f+n*4,f+r*4),o<0?s.fill(255,f+(r+o)*4,f+r*4):s.fill(255,f+n*4,f+(n+o)*4)}}var Vr,Be,cs=U(()=>{ct();Vr="http://www.w3.org/2000/svg",Be=class{constructor(e,{engine:t,inset:n=null}){this.svg=e,this.engine=t,this.inset=n,this.insetOn=!1,this.banded=!1,e.setAttribute("viewBox","0 0 560 384"),this.canvas=document.createElement("canvas"),this.canvas.width=560,this.canvas.height=384,this.image=document.createElementNS(Vr,"image");for(let[r,o]of Object.entries({x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(r,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine.mem,t=this.engine.title.screen,n=this.canvas.getContext("2d"),r=n.createImageData(560,384);if(t.text)at(r.data,e,e,!1,[0,24]);else{let o=t.page2?16384:8192;Zt(r.data,e.subarray(o,o+8192)),t.mixed&&at(r.data,e,e,!1,[20,24])}this.banded=this.insetOn&&!!this.inset&&Yr(r.data,this.inset),this.banded&&_r(r.data,this.inset),n.putImageData(r,0,0),this.image.setAttribute("href",this.canvas.toDataURL())}}});import{paint as Xr}from"@moonbase-machines/c64";var ni,ii=U(()=>{({paint:ni}=Xr)});import{vic as Jr}from"@moonbase-machines/c64";var ze,Rc,ls,Tc,Ic,Fe,ri=U(()=>{({HEIGHT:ze,LEFT:Rc,PALETTE:ls,TOP:Tc,VIC:Ic,WIDTH:Fe}=Jr)});var oi={};F(oi,{C64View:()=>qe});var Gr,qe,fs=U(()=>{ii();ri();Gr="http://www.w3.org/2000/svg",qe=class{constructor(e,{engine:t,chargen:n}){this.svg=e,this.engine=t,this.chargen=n,e.setAttribute("viewBox",`0 0 ${Fe*2} ${ze*2}`),this.canvas=document.createElement("canvas"),this.canvas.width=Fe,this.canvas.height=ze,this.image=document.createElementNS(Gr,"image");for(let[r,o]of Object.entries({x:0,y:0,width:Fe*2,height:ze*2,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(r,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine,t=ni(e.mem,e.title.chip,this.chargen,this.vic,e.title.splits),n=this.canvas.getContext("2d"),r=n.createImageData(Fe,ze);for(let o=0;o<t.length;o++){let[c,f,l]=ls[t[o]];r.data.set([c,f,l,255],o*4)}n.putImageData(r,0,0),this.svg.style.background=`rgb(${ls[t[0]].join(",")})`,this.image.setAttribute("href",this.canvas.toDataURL())}}});var ft={};F(ft,{play:()=>Zr});async function Zr(s){let{title:e,scripts:t,game:n,stage:r,status:o,fail:c,saves:f,$:l}=s,d=n.kind==="c64";r.innerHTML=`<svg id="screen" preserveAspectRatio="xMidYMid meet" tabindex="0" aria-label="The game's screen"></svg>`,s.control('<label><input type="checkbox" id="old-style"> Old style text</label>');let g=l("screen"),k=e.viewSteps??{},w=s.chargen=d?s.roms?.chargen??Jn().chargen:null;s.printer&&(e.printer=s.printer),e.disk=f.data,d&&f.drive(e.drive=new et(Uint8Array.from(atob(n.image),i=>i.charCodeAt(0))));let x=Bt(e,t);e.files&&f.keep(e.files);let j=[],O=l("old-style"),a=[],p={get(){try{return localStorage.getItem("remake-old-style")==="1"}catch{return!1}},set(i){try{localStorage.setItem("remake-old-style",i?"1":"0")}catch{}}};O.checked=p.get()||new URLSearchParams(location.search).has("old-style");let m=null,y=()=>{g.replaceChildren();let i=d?new qe(g,{engine:x,chargen:w}):e.engine==="card"?new Be(g,{engine:x,inset:s.mini?e.inset:null}):new Ue(g,{disk:n,volume:Object.keys(n.volumes)[0],engine:x,extra:k});return i.oldStyle=O.checked,m?.(i),i},E=y();x.on(i=>j.push(E.snapshot({...i})));let L=l("mini");if(e.inset&&s.mini){L.parentElement.hidden=!1;try{L.value=localStorage.getItem("remake-mini")??""}catch{}let{top:i,bottom:h,view:[u,v]}=e.inset,b=document.createElement("div");b.className="mini",b.hidden=!0,Object.assign(b.style,{left:`${u/5.6}%`,top:`${i/3.84}%`,width:`${(v-u)/5.6}%`,height:`${(h-i+1)/3.84}%`}),g.parentElement.append(b);let I=await s.mini(b,{memory:()=>x.mem});m=z=>{z.insetOn=!!L.value;let q=z.prompts.bind(z);z.prompts=()=>{q(),b.hidden=!(L.value&&z.banded)}},m(E);let D=()=>{E.insetOn=!!L.value,I.mode(L.value),E.prompts()};L.addEventListener("change",()=>{try{localStorage.setItem("remake-mini",L.value)}catch{}D()}),D()}O.addEventListener("change",()=>{p.set(O.checked),E=y();for(let i of a)E.apply(i);E.prompts()});let C=x.timed?new me:null,M=!!C,S=()=>{d||C?.feed(M?x.clicks:[],x.cycles),x.clicks.length=0},A=e.map?.vars??{sound:0,soundOn:0},$=null,R=(i,h,u)=>{if(!(x.mem[A.sound]&A.soundOn))return;$??=new AudioContext;let v=$.createOscillator(),b=$.createGain(),I=$.currentTime;v.type="square",v.frequency.setValueAtTime(i,I),v.frequency.linearRampToValueAtTime(h,I+u/1e3),b.gain.setValueAtTime(.06,I),b.gain.linearRampToValueAtTime(0,I+u/1e3),v.connect(b).connect($.destination),v.start(I),v.stop(I+u/1e3)},T=i=>16e3/(i+8),N={sound:220,beep:60,"flash-box":60,flash:250,object:30,"object-keep":30},P=!1,W=!1,_=i=>new Promise(h=>setTimeout(h,i));async function K(){if(!P){P=!0;try{for(;;){let i=x.run();if(S(),i==="pace"){for(let h of j.splice(0))a.push(h),E.apply(h);E.prompts(),!W&&s.pace()&&await _(x.delay*s.pace()),x.delay=0;continue}for(x.delay=0;j.length;){let h=j.shift();if(a.push(h),E.apply(h),!W){if(h.step==="sound"){let[u,v]=h.words.split(" ").map(b=>parseInt(b,16));R(T(v),T(u),180)}h.step==="beep"&&R(T(h.a&31)*2,T(h.a&31)*2,50),s.pace()&&(N[h.step]&&await _(N[h.step]*s.pace()),h.step==="pause"&&await _(h.ms*s.pace()))}}if(E.prompts(),o.textContent=i==="end"?"The end.":"Waiting for a key.",!x.keys.length||i==="end")break}}catch(i){c(i)}P=!1}}let B=i=>{x.press(i),$?.resume(),C?.start(),d||K()},se=()=>x.waitingOn?.words?.[0]==="tick",ne=null,he=null;g.addEventListener("click",i=>{let h=i.target.closest(".key")?.dataset.key;h&&B(+h)});function Ke(){x.sid=[],x.clock={irq:0,ahead:[],since:0};let i=null,h=null,u=0,v=!1;o.textContent="Playing.",setInterval(()=>{if(x.delay-=1e3/60,!v&&!x.ended&&x.delay<16){x.delay=Math.max(0,x.delay),x.clock.ahead.length&&x.idle>(x.routines.polls??200)&&!x.keys.length&&++x.clock.since>120&&(x.press(x.clock.ahead.shift()),x.clock.since=0);try{x.run(),j.length=0,E.prompts()}catch(b){v=!0,c(b)}x.ended&&(o.textContent="The end.")}if(C?.node&&M){i??=new ts(C.rate),h??=performance.now();let b=Math.floor((performance.now()-h)/1e3*C.rate)-u;if(b>0){let I=i.render(b,x.sid.map(([,D,z])=>[0,D,z]));u+=b,C.node.port.postMessage(I,[I.buffer])}}x.sid.length=0},1e3/60)}return setInterval(()=>{if(!se()||P||x.keys.length)return;let i=he??ne??-1;he=null,B(i)},100),{engine:x,press:B,run(){g.focus(),d?Ke():K()},key(i,h){if(i.type==="keyup"){ne=null;let v=x.clock?.held;v?.key===i.key&&(v.seen?x.clock.held=null:v.up=!0);return}if(h===void 0)return;if(i.preventDefault(),se()){he=ne=h;return}let u=d&&!i.ctrlKey&&en(h);if(u){i.repeat||(x.clock.held={...u,key:i.key},$?.resume(),C?.start());return}i.repeat||B(h)},keys(i){if(d)x.clock.ahead.push(...i);else for(let h of i)B(h)},start(){$?.resume(),C?.start()},sound(i){C?M=i:x.mem[A.sound]=i?A.soundOn:0},soundOn:!!C,quick(i){W=i},route({route:i,name:h,keys:{expand:u,give:v,petscii:b,pollsAt:I}}){e.seed=i.seed,i.printer&&e.printer&&(e.printer.on=!0,l("printer").checked=!0),o.textContent="Playing the route "+h+".";let D={press:q=>x.press(q),also:q=>{let Y=x.mem,Z=ae=>{Y[198]<10&&(Y[631+Y[198]]=ae,Y[198]++)};x.keys.length&&Z(x.keys.shift()),Z(q)}},z=()=>{let q;do x.delay=0,q=x.run();while(q==="pace");if(d)j.length=0;else for(let Y of j.splice(0))a.push(Y),E.apply(Y)};z();for(let[q,[Y]]of u(i.keys).entries())v(D,Y,d?b:void 0),x.polls=I(i,q+1)??void 0,z();x.polls=void 0,E.prompts()}}}var ht=U(()=>{it();ot();ss();jt();Gn();Ct();as();cs();fs()});var li={};F(li,{play:()=>Qr});it();var Cn={};F(Cn,{bytesText:()=>tr,openDisk:()=>Kt,programDisk:()=>Qi,textBytes:()=>er,titleDisk:()=>Wt});var $n={};F($n,{ACCOUNT:()=>En,DB:()=>vn,KEY:()=>Sn,STORE:()=>rt,VERSION:()=>Gi,local:()=>Ft});var vn="moonbase",Gi=1,rt="files",Sn=["account","disk","name"],En="local",Zi=()=>new Promise((s,e)=>{let t=indexedDB.open(vn,1);t.onupgradeneeded=()=>t.result.createObjectStore(rt,{keyPath:Sn}),t.onsuccess=()=>s(t.result),t.onerror=()=>e(t.error)}),zt=s=>new Promise((e,t)=>{s.onsuccess=()=>e(s.result),s.onerror=()=>t(s.error)});async function Ft({account:s=En}={}){let e=await Zi(),t=n=>e.transaction(rt,n).objectStore(rt);return{kept:!0,where:"this browser",load:async n=>(await zt(t("readonly").getAll(IDBKeyRange.bound([s,n],[s,n,[]])))).map(({name:r,bytes:o,meta:c,modified:f})=>({name:r,bytes:o,meta:c,modified:f})),put:(n,r)=>zt(t("readwrite").put({account:s,disk:n,...r})),delete:(n,r)=>zt(t("readwrite").delete([s,n,r]))}}var jn={};F(jn,{memory:()=>qt});function qt({kept:s=!0}={}){let e=new Map,t=n=>e.get(n)??e.set(n,new Map).get(n);return{kept:s,load:async n=>[...t(n).values()].map(r=>({...r,bytes:Uint8Array.from(r.bytes)})),put:async(n,r)=>{t(n).set(r.name,{...r,bytes:Uint8Array.from(r.bytes)})},delete:async(n,r)=>{t(n).delete(r)}}}async function Kt(s,{backend:e}={}){if(!e)try{e=await Ft()}catch{e=qt({kept:!1})}let t=new Map((await e.load(s)).map(c=>[c.name,c])),n=Promise.resolve(),r=c=>{let f=n.then(c);return n=f.catch(l=>o.failed?.(l)),f.catch(()=>{}),f},o={name:s,kept:e.kept,where:e.where??null,failed:null,list:()=>[...t.values()].sort((c,f)=>f.modified-c.modified).map(({name:c,bytes:f,meta:l,modified:d})=>({name:c,size:f.length,modified:d,meta:l})),read:c=>t.get(c)?.bytes??null,write(c,f,l={}){let d={name:c,bytes:Uint8Array.from(f),meta:l,modified:Date.now()};return t.set(c,d),r(()=>e.put(s,d))},remove(c){return t.delete(c),r(()=>e.delete(s,c))},written:()=>n};return o}var Wt=s=>`title/${s}`,Qi=s=>`program/${s}`,er=s=>new TextEncoder().encode(s),tr=s=>s?new TextDecoder().decode(s):null;var In={};F(In,{savesFor:()=>Ht});import{saves as sr}from"@moonbase-machines/apple2e";var{driveFiles:On,keepSaves:Ln,onDisks:An,withSaves:Rn}=sr;import{saves as nr}from"@moonbase-machines/c64";var{keepDrive:Tn}=nr;function Ht(s,e){return{data:Rn(s,e),keep:t=>Ln(s,t,e),drive:t=>Tn(t,e),disks:t=>An(s,t,e),driveFiles:(t,n)=>On(t,n,s)}}var Mn={};F(Mn,{code:()=>Vt,named:()=>Yt});var ir={ArrowLeft:8,ArrowRight:21,ArrowDown:10,ArrowUp:11,Enter:13,Backspace:127,Delete:127,Escape:27,Tab:9," ":32},rr={ArrowLeft:157,ArrowRight:29,ArrowDown:17,ArrowUp:145,Enter:13,Backspace:20,Delete:20,Escape:3," ":32},or={space:32,return:13,escape:27,delete:127,left:8,right:21,down:10,up:11,"control-e":5,"control-t":20,none:-1},ar={8:157,21:29,10:17,11:145,127:20,27:3};function Vt(s,e){if(!e||s.metaKey||s.altKey)return;let t=e==="c64";return s.ctrlKey?/^[a-z]$/i.test(s.key)?s.key.toUpperCase().charCodeAt(0)&31:void 0:(t?rr:ir)[s.key]??(s.key.length===1?(t?s.key.toUpperCase():s.key).charCodeAt(0):void 0)}function Yt(s,e){let t=or[s]??s.charCodeAt(0);return e==="c64"?ar[t]??t:t}var Pn={};F(Pn,{KEYS_MARKUP:()=>Jt,paperBox:()=>_t,phoneKeys:()=>Xt});function _t({line:s,print:e,tear:t}){let n=document.createElement("div");return n.id="paper-box",n.hidden=!0,n.innerHTML='<p><span></span> <button id="print-paper" type="button"></button> <button id="tear" type="button"></button></p><canvas id="paper"></canvas>',n.querySelector("span").textContent=s,n.querySelector("#print-paper").textContent=e,n.querySelector("#tear").textContent=t,n}function Xt(s,e){let t=s.querySelector("#keyboard"),n=s.querySelector("#keys-box");if(!t||!n||!matchMedia("(pointer: coarse)").matches)return;t.hidden=!1,t.addEventListener("click",()=>n.focus()),e.addEventListener("click",()=>n.focus());let r=!1;n.addEventListener("keydown",o=>{r=o.key==="Unidentified"}),n.addEventListener("input",()=>{if(r)for(let o of n.value)for(let c of["keydown","keyup"])window.dispatchEvent(new KeyboardEvent(c,{key:o}));n.value=""})}var Jt='<button type="button" id="keyboard" class="full" hidden>Keyboard</button><input id="keys-box" class="keys-box" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" aria-label="Keys for the game">';var ai={prodos:[280,192],dos33:[280,192],c64:[384,272]},ci={original:()=>Promise.resolve().then(()=>(is(),ns)),card:()=>Promise.resolve().then(()=>(ht(),ft)),vector:()=>Promise.resolve().then(()=>(ht(),ft))};async function Qr(s){let{way:e="remake",slug:t,root:n,preview:r=!1,words:o}=s;n.classList.add("player",e),t&&n.classList.add(t),n.innerHTML=`<div class="stage"></div><p class="options"><span id="status">Loading.</span>${Jt}<label hidden><input type="checkbox" id="sound" checked> Sound</label><label hidden><input type="checkbox" id="printer" checked> Printer</label><label hidden title="The game with its bugs fixed: it starts again"><input type="checkbox" id="fixed"> Bugs fixed</label><label hidden>Mini view <select id="mini"><option value="">Off</option><option value="live">Live</option><option value="pictures">Pictures</option></select></label><button id="disk" type="button" hidden>Download the disk</button></p>`,n.append(_t(o.printer));let c=k=>n.querySelector("#"+k),f=n.querySelector(".stage"),l=c("status"),d=c("sound"),g=k=>{l.textContent="The game stopped: "+k.message,l.className="error",console.error(k)};try{let k=new URLSearchParams(location.search).has("fixed"),w=s.title?new URL(s.title):null,x=new URL(s.data),j=null,O={},a=null;e==="remake"?{title:j,scripts:O,disk:a}=await Ut(w,{data:x,fixed:k}):w&&(j=await nt(w)),!a&&/\.json$/.test(x.pathname)&&(a=await De(x,"json"));let p=a?.kind;if(j?.style&&!document.querySelector(`link[data-title="${j.slug}"]`)){let R=Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL(j.style,w).href});R.dataset.title=j.slug,document.head.append(R),await new Promise(T=>{R.onload=R.onerror=T})}let m=s.disk??await Kt(Wt(t),{backend:s.backend});m.failed=R=>{l.textContent="A file was not kept: "+R.message,l.className="error"};let[y,E]=s.screen??j?.screen??ai[p]??ai.prodos;eo(f,n,y,E);let L=null,C={way:e,slug:t,title:j,scripts:O,game:a,folder:w,data:x,stage:f,status:l,fail:g,disk:m,preview:r,words:o,fixed:k,$:c,saves:a?Ht(a,m):null,roms:s.roms,studies:s.studies,mini:s.mini??null,chargen:null,pace:()=>{let R=s.pace;return typeof R=="function"?R():R??1},control(R){c("printer").parentElement.insertAdjacentHTML("beforebegin",R)},sounding(R){d.checked=R}};if(p==="c64"){let{Printer:R,paper:T}=await Promise.resolve().then(()=>(At(),tn)),N=c("printer"),P=c("paper"),W=c("paper-box");try{N.checked=localStorage.getItem("printer")!=="0"}catch{}N.parentElement.hidden=!1,L=C.printer=new R({on:N.checked}),N.addEventListener("change",()=>{L.on=N.checked;try{localStorage.setItem("printer",N.checked?"1":"0")}catch{}}),L.changed=()=>{W.hidden=!L.lines.length,L.lines.length&&T(P,L,C.chargen)},c("tear").addEventListener("click",()=>L.tear()),c("print-paper").addEventListener("click",()=>window.print())}if(e==="remake"&&j?.fixed){let R=c("fixed");R.checked=k,R.parentElement.hidden=!1,R.addEventListener("change",()=>{let T=new URL(location.href);R.checked?T.searchParams.set("fixed",""):T.searchParams.delete("fixed"),location.href=T.href.replace("fixed=&","fixed&").replace(/fixed=$/,"fixed")})}let S=await(e==="original"?await ci.original():j.own??await ci[j.engine]()).play(C);if(!S)return;S.sound&&(d.parentElement.hidden=!1,d.checked=S.soundOn??!0,d.addEventListener("change",()=>S.sound(d.checked)));let A=R=>{let T=Vt(R,p),N=R.type==="keydown";if(N&&T!==void 0&&!R.repeat&&s.claim?.(T)){R.preventDefault();return}if(N&&S.start?.(),S.key){S.key(R,T);return}!N||T===void 0||R.repeat||!S.press||(R.preventDefault(),S.press(T))};if(addEventListener("keydown",A),addEventListener("keyup",A),f.addEventListener("pointerdown",()=>S.start?.()),Xt(n,f),s.downloadDisk&&S.diskImage){let R=c("disk"),T=x.pathname.split("/").pop().replace(/\.json$/,"");R.hidden=!1,R.addEventListener("click",()=>{let N=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([S.diskImage()],{type:"application/octet-stream"})),download:T+".d64"});N.click(),URL.revokeObjectURL(N.href)})}if(s.watch?.({engine:S.engine,press:R=>{S.start?.(),S.press?.(R)},quick:R=>S.quick?.(R)}),s.route){if(!S.route)throw new Error("a route cannot be played on the "+e);await S.route(s.route)}S.run();let $=new URLSearchParams(location.search).get("keys");if($){let R=$.split(",").map(T=>Yt(T,p));if(S.keys)S.keys(R);else for(let T of R)S.press?.(T)}}catch(k){g(k)}}function eo(s,e,t,n){let r=()=>{let o=window.devicePixelRatio||1,c=parseFloat(getComputedStyle(e).paddingLeft)*2,f=e.clientWidth-c,l=document.documentElement.clientWidth-16,d=parseFloat(getComputedStyle(s).maxHeight),g=Math.ceil(f*o/t-.01);t*g/o>l&&(g=Math.max(1,Math.floor(l*o/t))),d&&n*g/o>d&&(g=Math.max(1,Math.floor(d*o/n)));let k=t*g/o;Object.assign(s.style,{width:k+"px",height:n*g/o+"px",aspectRatio:"auto",marginLeft:(f-k)/2+"px"}),e.style.setProperty("--scale",g/o)};r(),addEventListener("resize",r)}is();ht();ot();var pi={};F(pi,{modal:()=>hs,modalOpen:()=>so});var be=[],fi=!1,to=s=>{let e=be.at(-1);if(e){if(s.key==="Escape")s.preventDefault(),e.cancel();else if(s.key==="Enter"&&!(s.target instanceof HTMLButtonElement)&&s.target.tagName!=="TEXTAREA"){let t=e.box.querySelector(".default:not(:disabled)");t&&(s.preventDefault(),t.click())}else if(s.key==="Tab"){let t=di(e.box),n=t.indexOf(document.activeElement);t.length&&(s.preventDefault(),t[(n+(s.shiftKey?t.length-1:1))%t.length].focus())}s.stopPropagation()}},di=s=>[...s.querySelectorAll('button:not(:disabled), input:not([type=hidden]):not([type=file]):not([hidden]), select:not([hidden]), [tabindex="0"]')],hi=s=>s.querySelector("input:not([type=file]), select:not([hidden])")??s.querySelector(".default")??di(s)[0];function hs({within:s=document.body,className:e="",content:t,cancel:n=null}){fi||(document.addEventListener("keydown",to,!0),fi=!0);let r=document.createElement("div");r.className="modal-layer"+(s===document.body?" page":"");let o=document.createElement("div");o.className="modal "+e,o.setAttribute("role","dialog"),o.setAttribute("aria-modal","true"),o.append(t),r.append(o);let c=document.activeElement,f=[...s.children].filter(d=>!d.inert);for(let d of f)d.inert=!0;s.append(r);let l={box:o,cancel:()=>(n??l.close)(),close(){r.remove(),be.splice(be.indexOf(l),1);for(let g of f)g.inert=!1;let d=be.at(-1);(d&&!d.box.contains(c)?hi(d.box):c)?.focus?.({preventScroll:!0})}};return be.push(l),hi(o)?.focus({preventScroll:!0}),l}var so=()=>be.length>0;var mi={};F(mi,{dialogs:()=>no});function no({within:s,className:e=""}={}){function t(c,f,l,{aside:d=[]}={}){return new Promise(g=>{let k=document.createElement("div");k.className="disk";let w=document.createElement("h2");w.textContent=c;let x=document.createElement("p");x.className="buttons";for(let[O,a]of l){let p=Object.assign(document.createElement("button"),{type:"button",textContent:O});p.onclick=async()=>{j.close(),g(typeof a=="function"?await a():a)},x.append(p)}if(x.lastChild?.classList.add("default"),d.length){let O=document.createElement("span");O.className="aside",O.append(...d),x.prepend(O)}k.append(w,...f,x);let j=hs({within:s,className:e,content:k,cancel:()=>{j.close(),g(null)}})})}let n=c=>t(c,[],[["OK",null]]);async function r(c,{suggested:f=""}={}){let l=Object.assign(document.createElement("input"),{value:f,maxLength:31});setTimeout(()=>l.select());let d=document.createElement("label");d.append("Save as ",l);let g=await t("Save",[d,...ui(c)],[["Cancel",null],["Save",()=>l.value.trim()||null]]);return!g||c.read(g)&&!await t(`Replace "${g}"?`,[],[["Cancel",!1],["Replace",!0]])?null:g}async function o(c,{file:{extension:f="",type:l="application/octet-stream"}={}}={}){let d=Object.assign(document.createElement("select"),{size:6}),g=document.createElement("p");g.className="note";let k=Object.assign(document.createElement("input"),{type:"file",accept:[f,l].filter(Boolean).join(","),hidden:!0}),w=E=>Object.assign(document.createElement("button"),{type:"button",textContent:E}),x=w("File\u2026"),j=w("Download"),O=w("Delete"),a=()=>{d.replaceChildren(...c.list().map(E=>new Option(`${E.name} \xB7 ${new Date(E.modified).toLocaleString()}`,E.name))),d.selectedIndex=d.options.length?0:-1,d.hidden=!d.options.length,g.textContent=d.options.length?"On your disk:":"Nothing saved on your disk yet.",O.disabled=j.disabled=!d.options.length};a();let p=t("Open",[g,d,k,...ui(c)],[["Cancel",null],["Open",()=>d.value||null]],{aside:[x,j,O]}),m=()=>d.closest(".modal").querySelector(".default").click();x.onclick=()=>k.click(),k.onchange=async()=>{let E=k.files[0],L=E.name.slice(0,E.name.length-(f&&E.name.endsWith(f)?f.length:0));c.read(L)&&!await t(`Replace "${L}"?`,[],[["Cancel",!1],["Replace",!0]])||(c.write(L,new Uint8Array(await E.arrayBuffer())),a(),d.value=L,m())},j.onclick=()=>{let E=d.value;if(!E)return;let L=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([c.read(E)],{type:l})),download:E+f});L.click(),setTimeout(()=>URL.revokeObjectURL(L.href),1e3)},O.onclick=async()=>{let E=d.value;E&&await t(`Delete "${E}"?`,[io("It is gone from your disk for good.")],[["Delete",!0],["Cancel",!1]])&&(await c.remove(E),a(),d.focus())},d.ondblclick=m;let y=await p;return y?{name:y,bytes:c.read(y)}:null}return{saveAs:r,openFrom:o,ask:t,tell:n}}var io=s=>Object.assign(document.createElement("p"),{className:"note",textContent:s});function ui(s){if(s.kept)return[];let e=document.createElement("p");return e.className="note",e.textContent="This browser is not keeping files: download a game to keep it.",[e]}fs();cs();Pt();$t();var gi={};F(gi,{compile:()=>fo});He();var J=(s,e=2)=>"0x"+s.toString(16).padStart(e,"0"),ds=49152,ps=49407,ro=s=>s>=ds&&s<=ps;function us(s){if(s.through!==void 0)return{js:`(e.mem[${J(s.through)}] | e.mem[${J(s.through+1)}] << 8) + e.y & 0xffff`,io:!0};if(s.pair!==void 0)return{js:`e.mem[${J(s.pair)} + e.x & 0xff] | e.mem[${J(s.pair)} + e.x + 1 & 0xff] << 8`,io:!0};if(s.via!==void 0)return{js:`(e.mem[${J(s.via,4)}] | e.mem[${J(s.via+1,4)}] << 8)${s.index?" + e."+s.index+" & 0xffff":""}`,io:!0};if(!s.index)return{js:J(s.at,4),io:ro(s.at)};let e=s.at<=ps&&s.at+255>=ds;return{js:s.at+255>65535?`(${J(s.at,4)} + e.${s.index}) & 0xffff`:`${J(s.at,4)} + e.${s.index}`,io:e}}function ve(s,e=!0){let t=Q(s);if(t.number!==void 0)return{js:String(t.number&255)};if(t.reg==="carry")return{js:"e.c"};if(t.reg)return{js:"e."+t.reg};let n=us(t);return e&&t.through!==void 0?{js:`e.read(e.ix(e.mem[${J(t.through)}] | e.mem[${J(t.through+1)}] << 8, e.y))`,io:!0}:e&&t.via!==void 0&&t.index?{js:`e.read(e.ix(e.mem[${J(t.via,4)}] | e.mem[${J(t.via+1,4)}] << 8, e.${t.index}))`,io:!0}:e&&t.index&&!t.zp?{js:n.io?`e.read(e.ix(${J(t.at,4)}, e.${t.index}))`:`e.mem[e.ix(${J(t.at,4)}, e.${t.index})]`,io:n.io}:{js:n.io?`e.read(${n.js})`:`e.mem[${n.js}]`,io:n.io}}function oo(s,e){let t=Q(s);if(t.reg)return{js:`e.${t.reg} = ${e}`};let n=us(t);return{js:n.io?`e.write(${n.js}, ${e})`:`e.mem[${n.js}] = ${e}`,io:n.io}}function xi(s){let e=Q(s);if(e.reg)return{pre:"",read:"e."+e.reg,write:n=>`e.${e.reg} = ${n}`};let t=us(e);return t.io?{pre:`const at = ${t.js}; `,read:"e.read(at)",write:n=>`e.write(at, ${n})`,io:!0}:{pre:"",read:`e.mem[${t.js}]`,write:n=>`e.mem[${t.js}] = ${n}`}}var ao={zero:"e.z",carry:"e.c",negative:"e.n",overflow:"e.v"},co={"==":"e.z","!=":"!e.z",">=":"e.c","<":"!e.c"};function lo(s,e){let t=s.words,[n,r]=t,o=`s[${e}]`,c=(...l)=>({js:l.map(d=>d.js??d).join(""),kind:l.some(d=>d.io)?"io":"compute"});if(r==="="&&t.length===3){let l=ve(t[2]),d=Q(n);if(d.reg==="carry")return c("e.c = ",l," & 1;");if(d.reg)return c(`e.${d.reg} = e.flags(`,l,");");let g=oo(n,l.js);return{js:g.js+";",kind:l.io||g.io?"io":"compute"}}if(r==="+="||r==="-="){let l=ve(t[2]);if(t.length===3){let d=xi(n);return{js:`${d.pre}${d.write(`e.flags(${d.read} ${r[0]} ${l.js} & 0xff)`)};`,kind:d.io||l.io?"io":"compute"}}return{js:r==="+="?`e.add(${l.js});`:`e.sub(${l.js});`,kind:l.io?"io":"compute"}}if(r==="&="||r==="|="||r==="^="){let l=ve(t[2]);return c(`e.a = e.flags(e.a ${r[0]} `,l,");")}if(r==="<<="||r===">>="||r==="rotate"){let l=xi(n),d=r==="<<="||t[2]==="left";return{js:`${l.pre}${l.write(`e.shift(${l.read}, ${d}, ${r==="rotate"})`)};`,kind:l.io?"io":"compute"}}switch(n){case"if":{let l=t.at(-1),d=t.slice(1,-2);if(d.length===3&&/^[axy]$/.test(d[0])){let w=ve(d[2]);return{js:`e.compare(e.${d[0]}, ${w.js}); if (${co[d[1]]})`,kind:"branch",to:l,io:w.io}}let g=d[0]==="not",k=ao[g?d[1]:d[0]];if(!k)throw new Error(s.where+": no flag "+d.join(" "));return{js:`if (${g?"!":""}${k})`,kind:"branch",to:l}}case"goto":return t[1].startsWith("(")?{js:`return e.jumpThrough(${J(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:t[1].startsWith("[")?{js:`return e.jumpTable(${J(parseInt(t[1].slice(2),16),4)}, e.${t[2][0]});`,kind:"end"}:{js:`return e.jump('${t[1]}', ${o});`,kind:"end"};case"call":return t[1].startsWith("(")?{js:`return e.callThrough(${J(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:{js:`return e.call('${t[1]}', ${o});`,kind:"end"};case"return":return{js:`return e.ret(${o});`,kind:"end"};case"compare":return c(`e.compare(e.${t[1]}, `,ve(t[2]),");");case"test":return c("e.test(",ve(t[1]),");");case"push":return{js:`e.push(${t[1]==="a"});`,kind:"compute"};case"pull":return{js:`e.pull(${t[1]==="a"});`,kind:"compute"};case"asm":return t[1]==="RTI"?{js:`return e.ret(${o});`,kind:"end"}:{js:["TSX","TXS","CLV","SED","CLD","SEI","CLI"].includes(t[1])?`e.asm('${t[1]}');`:"",kind:"compute"}}let f=t.slice(1).map(l=>typeof l=="string"?`'${l}'`:`{ string: ${JSON.stringify(l.string)} }`).join(", ");return{js:`return e.routine('${n}', [${f}], ${o});`,kind:"routine"}}function fo(s,e,{io:t=[49152,49407]}={}){[ds,ps]=t;let{steps:n,labels:r,data:o}=Ee(s,e),c=n.map((g,k)=>lo(g,k)),f=new Set([0,...Object.values(r)]);c.forEach((g,k)=>{(g.kind==="routine"||g.kind==="io"||g.io)&&f.add(k),(g.kind!=="compute"&&g.kind!=="branch"||g.io)&&f.add(k+1)});let l=Object.fromEntries(Object.entries(r).map(([g,k])=>[k,g])),d=[];for(let g=0;g<n.length;g++){if(!f.has(g))continue;let k=g+1;for(;k<n.length&&!f.has(k);)k++;let w=c.slice(g,k).some(p=>p.kind==="branch"&&r[p.to]===g),x=[];for(let p=g;p<k;p++){if((p===g||c[p-1].kind==="branch")&&c[p].kind!=="routine"){let L=p;for(;L<k-1&&c[L].kind!=="branch";)L++;x.push(`e.time(s, ${p}, ${L});`)}let m=c[p],y=n[p].at===null?n[p].text:n[p].at.toString(16).toUpperCase().padStart(4,"0")+" "+n[p].text,E=m.js;if(m.kind==="branch"){let L=r[m.to],C=$e(n[p]),M=C===1?"e.cycles++":`e.cycles += ${C}`;E+=L===void 0?` { ${M}; e.pc = e.label('${m.to}'); return; }`:L===g&&w?` { ${M}; continue; }`:` { ${M}; e.pc = ${L}; return; }`}m.kind==="end"&&(E=`e.pc = ${p+1}; `+E),x.push(E?`${E.padEnd(48)} // ${y}`:`// ${y}`)}c[k-1].kind!=="end"&&c[k-1].kind!=="routine"&&k!==g+1&&x.push(`e.pc = ${k};`);let j=l[g]?` // ${l[g]}
|
|
23
|
-
`:"",O=
|
|
24
|
-
${a.map(
|
|
22
|
+
`,mt=class{constructor(){this.context=null,this.node=null,this.level=0,this.from=null}async start(){this.context||(this.context=new AudioContext,await this.context.audioWorklet.addModule(URL.createObjectURL(new Blob([pr],{type:"text/javascript"}))),this.node=new AudioWorkletNode(this.context,"speaker"),this.node.connect(this.context.destination),this.rate=this.context.sampleRate,this.context.state!=="running"&&await this.context.resume())}feed(t,e){if(!this.node)return;this.from===null&&(this.from=e);let n=1020484/this.rate,i=Math.floor((e-this.from)/n);if(i<=0)return;let o=new Float32Array(i),c=0;for(let h=0;h<i;h++){let f=this.from+(h+1)*n;for(;c<t.length&&t[c]<=f;)this.level=this.level?0:.25,c++;o[h]=this.level}this.from+=i*n,this.node.port.postMessage(o,[o.buffer])}}});var Nn={};z(Nn,{Machine:()=>ur});import{machine as dr}from"@moonbase-machines/apple2e";var ur,Pn=B(()=>{({Machine:ur}=dr)});var Dn={};z(Dn,{COLORS:()=>xr,colors:()=>Je,paint:()=>gr,paintHires:()=>_e,paintText:()=>ce,rowStart:()=>wr,screen:()=>kr,textRow:()=>yr});import{screen as mr}from"@moonbase-machines/apple2e";var xr,Je,gr,_e,ce,wr,kr,yr,le=B(()=>{({COLORS:xr,colors:Je,paint:gr,paintHires:_e,paintText:ce,rowStart:wr,screen:kr,textRow:yr}=mr)});var Un={};z(Un,{bounds:()=>vr,document:()=>Sr,elements:()=>Xe});import{svg as br}from"@moonbase-machines/vector";var vr,Sr,Xe,Ge=B(()=>{({bounds:vr,document:Sr,elements:Xe}=br)});var Bn={};z(Bn,{C64:()=>$r});import{machine as Er}from"@moonbase-machines/c64";var $r,zn=B(()=>{({C64:$r}=Er)});var Fn={};z(Fn,{keyboard:()=>Cr,pace:()=>Or,painter:()=>Ar});import{browser as jr}from"@moonbase-machines/c64";var Cr,Or,Ar,qn=B(()=>{({keyboard:Cr,pace:Or,painter:Ar}=jr)});var Kn={};z(Kn,{SID:()=>Ze});import{sid as Lr}from"@moonbase-machines/c64";var Ze,Qe=B(()=>{({SID:Ze}=Lr)});var Wn={};z(Wn,{ROM_CHOICES:()=>Rr,c64Roms:()=>Ir,typed:()=>Mr});import{start as Tr}from"@moonbase-machines/c64";var Rr,Ir,Mr,Hn=B(()=>{({ROM_CHOICES:Rr,c64Roms:Ir,typed:Mr}=Tr)});var Vn={};z(Vn,{SECTORS:()=>Pr,add:()=>Dr,make:()=>Ur,petsciiName:()=>Br,read:()=>zr});import{d64 as Nr}from"@moonbase-machines/c64";var Pr,Dr,Ur,Br,zr,Yn=B(()=>{({SECTORS:Pr,add:Dr,make:Ur,petsciiName:Br,read:zr}=Nr)});var ts={};z(ts,{play:()=>qr});async function qr(s){s.stage.innerHTML='<svg id="vector" viewBox="0 0 140 192" preserveAspectRatio="none"></svg><canvas id="screen" width="560" height="384" tabindex="0"></canvas>';let t=s.stage.querySelector("canvas"),e=t.getContext("2d"),n=s.stage.querySelector("#vector");return s.game.kind==="c64"?Wr(s,{canvas:t,layer:n,speaker:new mt}):Kr(s,{canvas:t,ctx:e,layer:n,speaker:new mt})}async function Kr({game:s,saves:t,roms:e,status:n,setting:i},{canvas:o,ctx:c,layer:h,speaker:f}){let[{Machine:l},{placed:m},{screen:g},{shapes:k},{elements:y}]=await Promise.all([Promise.resolve().then(()=>(Pn(),Nn)),Promise.resolve().then(()=>(Be(),Sn)),Promise.resolve().then(()=>(le(),Dn)),Promise.resolve().then(()=>(Xt(),Ps)),Promise.resolve().then(()=>(Ge(),Un))]),w=i(Fr),O=t.data,a=null,u=null;if(e?.apple)try{a=e.apple,u=t.disks(m(O,new Map(await Promise.all(s.images.map(async A=>[A,await e.image(A)])))))}catch{a=null}let d=new l(O,{log:(...A)=>console.log(...A),...a?{roms:a,disks:u}:{}});console.log(a?"line 1: Apple's ROMs, the disks booted":"line 2: moonbase's machine"),t.keep(a?t.driveFiles(d,u):d.disk),d.diskTime=!0;let E=!1,v=0;function L(){let A=(F,P)=>{t:for(let W=16384;W<32768-F.length;W++){for(let J=0;J<F.length;J++)if(F[J]!==null&&P[W+J]!==F[J])continue t;return W}return-1};for(let F of[d.aux,d.main]){let P=A([32,null,null,32,null,null,238,null,null,76],F),W=A([162,0,160,224,24,96],F),J=A([141,null,null,142,null,null,140,null,null,173,null,null,201,128,240],F);if(!(P<0||W<0||J<0)){d.cpu.hooks.set(P,H=>(H.read16(96)===57344&&(h.insertAdjacentHTML("beforeend",y(k(q=>d.read(q),57344),{background:v})),d.marking=1),!1)),d.cpu.hooks.set(W,()=>(d.marking=0,!1)),d.cpu.hooks.set(J,H=>(H.a!==128&&(v=H.a&15),h.innerHTML="",d.owner.fill(0),!1)),E=!0;return}}}let T=new Uint8ClampedArray(560*384*4),I=new ImageData(T,560,384),C=new Uint8Array(26880),$="";function j(){d.halted||d.runCycles(17030);let A=`text ${d.sw.text} page2 ${d.sw.page2} hires ${d.sw.hires} dhires ${d.sw.dhires}`;A!==$&&(console.log("screen:",A,"at pc $"+d.cpu.pc.toString(16),"cycles",d.cpu.cycles),$=A),f.feed(R?d.clicks:[],d.cpu.cycles),d.clicks.length=0,E||L();let F=d.sw.text;g(d,T,{cols:C,owner:w.value&&h.innerHTML?d.owner:null}),c.putImageData(I,0,0),h.style.visibility=w.value&&!F?"visible":"hidden",n.textContent=d.halted?"The game has stopped: "+d.halted+".":d.idle>2e3?"Waiting for a key.":"Running.",requestAnimationFrame(j)}o.addEventListener("pointerdown",()=>o.focus());let R=!0;return{run(){o.focus(),j()},press(A){console.log("key",A,"at pc $"+d.cpu.pc.toString(16)),d.press(A)},start(){f.start()},sound(A){R=A},engine:d}}async function Wr(s,{canvas:t,layer:e,speaker:n}){let{game:i,saves:o,roms:c,studies:h,status:f,printer:l}=s,[{C64:m},{keyboard:g,painter:k},{SID:y},{c64Roms:w,typed:O},{add:a}]=await Promise.all([Promise.resolve().then(()=>(zn(),Bn)),Promise.resolve().then(()=>(qn(),Fn)),Promise.resolve().then(()=>(Qe(),Kn)),Promise.resolve().then(()=>(Hn(),Wn)),Promise.resolve().then(()=>(Yn(),Vn))]),u=await w(c?.choice??null,c?.load);if(!u)return f.textContent="Commodore's ROMs, asked for, are not here.",null;s.chargen=u.chargen;let d=new m(i,u,{log:(...P)=>console.log(...P),printer:l});o.drive(d.drive);let E=P=>Uint8Array.from(atob(P),W=>W.charCodeAt(0));for(let[P,W]of Object.entries(h??{}))d.drive.saved.set(P,E(W));e.style.display="none";let v=k(t),L=null,T=0,I=!0,C={keydown:[],keyup:[]},$=g(d,{log:!0,listen:(P,W)=>C[P].push(W)}),j=0,R=null,A=performance.now();function F(){let P=Math.min(2,Math.floor((performance.now()-A)/20)-j);for(let W=0;W<P;W++){if(d.runFrame(),j++,$.frame(),n.node&&I){R||(R=new y(n.rate));let J=Math.round(19656/985248*n.rate),H=d.cpu.cycles-19656,q=R.render(J,d.sidWrites.map(([rt,nt,xt])=>[Math.floor((rt-H)/19656*J),nt,xt]));n.node.port.postMessage(q,[q.buffer])}d.sidWrites.length=0}j>=120&&L===null&&!T&&(L=O(d,i),T=1),L!==null&&!d.ram[198]&&(L=d.type(L),L.length||(L=null)),v(d.vic.frame),f.textContent=d.halted?"The game has stopped: "+d.halted+".":"Running.",requestAnimationFrame(F)}return{run(){t.focus(),F()},press(P){d.type(String.fromCharCode(P))},key(P){for(let W of C[P.type])W(P)},start(){n.start()},sound(P){I=P},engine:d,diskImage:()=>a(d.drive.image,[...d.drive.saved].map(([P,W])=>({name:P,data:W})))}}var Fr,es=B(()=>{ae();Fr={name:"vectors",type:"boolean",default:!1,owner:"person",words:"Draw the pictures as vectors"}});import{rom as Hr}from"@moonbase-machines/c64";var vc,Jn,_n=B(()=>{({install:vc,standIn:Jn}=Hr)});import{colors as Vr}from"@moonbase-machines/apple2e";var Xn,$c,at,Gn=B(()=>{({COLORS:Xn,NAMES:$c,rgb:at}=Vr)});import{font as Yr}from"@moonbase-machines/charset";var ss,Zn=B(()=>{({FONT:ss}=Yr)});var Qn={};z(Qn,{View:()=>Ft});var Jr,V,Y,fe,_r,ns,Xr,Ft,is=B(()=>{Gn();Xt();_t();te();Ge();Rt();Dt();Zn();le();Jr="http://www.w3.org/2000/svg",V=s=>s*4,Y=s=>s*2,fe='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',_r='ui-monospace, Menlo, Consolas, "Liberation Mono", monospace',ns=["[","\\","]","^"],Xr={"[":"\u2190","\\":"\u2192","]":"\u2193","^":"\u2191"},Ft=class{constructor(t,{disk:e,volume:n,engine:i,extra:o={},press:c}){this.svg=t,this.engine=i,this.extra=o,this.press=c,t.setAttribute("viewBox","0 0 560 384"),this.disk=e.volumes[n],this.pictures=new Map;for(let[m,g]of Object.entries(e.volumes[n]))if(/^PICS\d$/.test(m))for(let k of Tt(Uint8Array.from(atob(g.data),y=>y.charCodeAt(0))))this.pictures.set(k.name,k.shapes);let h=i.title.map;this.vars=h.vars;let f={...Xr,...h.modern};for(let m=0;m<10;m++)f[String.fromCharCode(128+m)]=String(m);let l=new RegExp("["+Object.keys(f).map(m=>"\\"+m).join("")+"]","g");this.modern=m=>m.replace(l,g=>f[g]),this.tables=new Map(Jt(Bt(h,e.volumes[n]),h.objects).map(m=>[m.address,m.objects])),this.items=[],this.pen={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10},this.window={color:0,bottom:116},this.shapes=[],this.spaceBar=null,this.layer=this.el("g"),t.append(this.layer),this.textScreen=this.el("g",{display:"none"}),t.append(this.textScreen),this.prompt=this.el("g"),t.append(this.prompt),this.textPen=Pt(),this.textCells=kt(),this.rect(0,0,140,192,15,this.layer)}el(t,e={},n){let i=document.createElementNS(Jr,t);for(let[o,c]of Object.entries(e))i.setAttribute(o,c);return n?.append(i),i}rect(t,e,n,i,o,c=this.layer){return this.el("rect",{x:V(t),y:Y(e),width:V(n),height:Y(i),fill:at(o),"shape-rendering":"crispEdges"},c)}add(t,e,n,{covers:i=!0,left:o=0,right:c=139}={}){return i&&(this.items=this.items.filter(h=>h.top>=t&&h.bottom<=e&&h.left>=o&&h.right<=c?(h.el.remove(),!1):!0)),this.items.push({top:t,bottom:e,left:o,right:c,el:n}),this.layer.append(n),n}remove(t){t.remove(),this.items=this.items.filter(e=>e.el!==t)}fill(t,e,n,i=!0){let o=this.el("g");this.rect(0,t,140,e-t+1,n,o),i&&(this.rect(0,t,1,e-t+1,15,o),this.rect(139,t,1,e-t+1,15,o)),this.add(t,e,o)}whiteLines(t){this.add(t,t+1,this.rect(0,t,140,2,15,null))}snapshot(t){let e=this.engine.mem;return t.layout=e[this.vars.layout],t.difficulty=e[this.vars.difficulty],t.step==="text"&&(t.words=bt(t.words,e)),t.step==="span"&&(t.row=e[this.vars.zero+2]),t}apply(t){this.difficulty=t.difficulty,this.spaceBar?.erase&&!this.waiting()&&(this.fill(this.spaceBar.y,this.spaceBar.y+10,5),this.spaceBar.el.remove(),this.spaceBar=null);let e=this.extra[t.step]??(typeof this[t.step]=="function"?this[t.step]:void 0);e&&e.call(this,t)}waiting(){return this.engine.waitingOn}"text-screen"(){this.textCells=kt(),this.textScreen.replaceChildren(),this.rect(0,0,140,192,0,this.textScreen),this.textScreen.setAttribute("display","inline"),this.layer.setAttribute("display","none")}show(){this.textScreen.setAttribute("display","none"),this.layer.setAttribute("display","inline")}textCell(t,e,n,i){this.textCells[t][e].el?.remove();let c=this.el("g",{"data-cell":t*40+e},this.textScreen),h=e*14,f=t*16,l=i?"#000":"#fff";if(i&&this.el("rect",{x:h,y:f,width:14,height:16,fill:"#fff","shape-rendering":"crispEdges"},c),this.oldStyle){let m=ss[n.charCodeAt(0)-32]??ss[0],g="";for(let k=0;k<5;k++)for(let y=0;y<7;y++)m[k]>>y&1&&(g+=`M${h+2+k*2} ${f+y*2}h2v2h-2z`);g&&this.el("path",{d:g,fill:l},c)}else if(n!==" "){let m=this.el("text",{x:h+7,y:f+12,fill:l,"font-family":_r,"font-size":15,"text-anchor":"middle"},c);m.textContent=n}this.textCells[t][e]={ch:n,inverse:i,el:c}}splash(){let t=this.disk.TITLE;if(!t)return;let e=Uint8Array.from(atob(t.data),o=>o.charCodeAt(0)),n=Je(e.subarray(0,8192),e.subarray(8192)),i=[];for(let o=0;o<192;o++)i.push(Array.from(n.subarray(o*140,o*140+140)));this.clear(),this.add(0,191,this.el("image",{href:this.image(i),x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))}"clear-screen"(){this.clear(),this.add(0,191,this.rect(0,0,140,192,0,null))}clear(){for(let t of this.items)t.el.remove();this.items=[]}"keep-screen"(){this.kept={items:this.items,pen:{...this.pen},window:{...this.window},shapes:this.shapes,spaceBar:this.spaceBar};for(let t of this.items)t.el.remove();this.items=[],this.spaceBar=null,this["clear-screen"]()}"put-screen"(){if(!this.kept)return;this.clear();let t=this.kept;this.kept=null;for(let e of t.items)this.layer.append(e.el);Object.assign(this,{items:t.items,pen:t.pen,window:t.window,shapes:t.shapes,spaceBar:t.spaceBar})}box({a:t,x:e,y:n,layout:i}){let[o,c,h]=wt[i]??wt[50];if(t!==128&&e!==128&&n!==128){for(let f of this.items)f.el.remove();this.items=[]}if(t!==128){let f=this.el("g");this.rect(1,1,138,o-1,t,f),this.el("rect",{x:V(1)+2,y:Y(1)+1,width:V(138)-4,height:Y(o-2)-2,fill:"none",stroke:"black","stroke-width":4},f),this.add(1,o-1,f,{left:1,right:138}),this.window={color:t,bottom:o},this.shapes=[]}e!==128&&(this.whiteLines(c),this.fill(c+2,h-1,e)),n!==128&&(this.whiteLines(h),this.fill(h+2,189,n))}panel({n:[t]}){let e=It[t];if(e){this.whiteLines(e.rows[0]),this.fill(e.rows[0]+2,e.rows[1],e.fill);for(let n of e.more??[])this.whiteLines(n);Object.assign(this.pen,{paper:e.paper,ink:e.ink,centre:!0,spacing:1,gap:e.gap,y:e.y})}}scroll(){let o=this.scrolling,c=(m,g,k)=>{let y="scroll-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:V(m),y:Y(19)-1,width:V(g-m),height:Y(97)+1},this.el("clipPath",{id:y},this.svg)),this.el("g",{"clip-path":`url(#${y})`},k)},h=(m,g)=>this.items.filter(k=>k!==o?.item&&k.top<=115&&k.bottom>=19&&k.left<=g&&k.right>=m);if(o?.item.el.isConnected&&this.items.at(-1)===o.item){let m=c(129.5,136.5,this.el("g",{transform:`translate(${V(7*o.n)} 0)`},o.moved));for(let g of h(129.5,129.5+7))m.append(g.el.cloneNode(!0));o.n++,o.moved.setAttribute("transform",`translate(${V(-7*o.n)} 0)`);return}let f=c(3.5,129.5),l=this.el("g",{transform:`translate(${V(-7)} 0)`},f);this.rect(3.5,19,1120,97,this.window.color,l);for(let m of h(3.5,139))l.append(m.el.cloneNode(!0));this.add(19,115,f,{left:4,right:129}),this.scrolling={item:this.items.at(-1),moved:l,n:1}}"shift-down"({left:t,right:e,top:n,bottom:i,by:o}){let c=this.shifting,h=(g,k,y)=>{let w="shift-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:V(t),y:Y(g),width:V(e-t+1),height:Y(k-g)},this.el("clipPath",{id:w},this.svg)),this.el("g",{"clip-path":`url(#${w})`},y)},f=(g,k)=>this.items.filter(y=>y!==c?.item&&y.top<=k&&y.bottom>=g&&y.left<=e&&y.right>=t);if(c?.item.el.isConnected&&this.items.at(-1)===c.item){let g=h(n,n+o,this.el("g",{transform:`translate(0 ${Y(-o*c.n)})`},c.moved));for(let k of f(n,n+o-1))g.append(k.el.cloneNode(!0));c.n++,c.moved.setAttribute("transform",`translate(0 ${Y(o*c.n)})`);return}let l=h(n+o,i+o+1),m=this.el("g",{transform:`translate(0 ${Y(o)})`},l);this.rect(t,n-o*60,e-t+1,i-n+1+o*61,this.window.color,m);for(let g of f(n,i))m.append(g.el.cloneNode(!0));this.add(n+o,i+o,l,{left:t,right:e}),this.shifting={item:this.items.at(-1),moved:m,n:1}}paint(t,e,n,i){this.hide(e,n,i,i);let o=this.painted;if(o?.el.isConnected&&o.color===t&&o.left===e&&o.right===n&&o.bottom===i-1){o.bottom=i,o.el.setAttribute("height",Y(i-o.top+1));let h=this.items.find(f=>f.el===o.el);this.items=this.items.filter(f=>f!==h&&f.top>=o.top&&f.bottom<=i&&f.left>=e&&f.right<=n?(f.el.remove(),!1):!0),h&&(h.bottom=i);return}let c=this.add(i,i,this.rect(e,i,n-e+1,1,t,null),{left:e,right:n});this.painted={el:c,color:t,left:e,right:n,top:i,bottom:i}}span({a:t,x:e,y:n,row:i}){this.paint(t&15,e,n,i)}dot({a:t,x:e,y:n}){this.paint(t&15,e,e,n)}"white-lines"({y:t}){this.whiteLines(t)}"fill-rows"({a:t,x:e,y:n}){this.fill(n,n+e-1,t)}picture({words:t}){let e=this.pictures.get(t.toUpperCase().replace(/_/g," "));if(!e)return;let n="window-"+this.window.bottom;this.clips??=new Set,this.clips.has(n)||(this.clips.add(n),this.el("rect",{x:0,y:0,width:V(140),height:Y(this.window.bottom)},this.el("clipPath",{id:n},this.svg)));let i=this.el("g",{"clip-path":`url(#${n})`}),o=this.el("g",{transform:"scale(4 2)"},i);o.innerHTML=Xe(e,{crisp:!1}),this.add(1,this.window.bottom-1,i,{covers:!1,left:1,right:138}),this.shapes=this.shapes.concat(e),this.picturesShapes=e}objects({table:t}){this.table=parseInt(t.slice(1),16)}object({a:t,x:e,y:n},i="whole"){let o=i==="keep",c=i==="whole",h=this.tables.get(this.table);if(t<2){this.kept?.isConnected&&this.remove(this.kept),this.kept=null;return}let f=h?.find(y=>y.number===t);if(!f)return;let l=f.rows.map(y=>y.map(w=>!c&&w===f.clear?void 0:w)),m=e+f.width-1,g=n+f.height-1;c&&this.hide(e,m,n,g);let k=this.el("image",{href:this.image(l),x:V(e),y:Y(n),width:V(f.width),height:Y(f.height),preserveAspectRatio:"none",style:"image-rendering: pixelated"});this.add(n,g,k,{covers:c,left:e,right:m}),o&&(this.kept=k),c&&(this.items.at(-1).whole={x:e,y:n,rows:l})}hide(t,e,n,i){for(let o of[...this.items]){let c=o.whole;if(!c||c.x>e||c.x+c.rows[0].length-1<t||c.y>i||c.y+c.rows.length-1<n)continue;let h=!1,f=c.rows.map((l,m)=>l.map((g,k)=>{let y=c.x+k,w=c.y+m;if(g!==void 0&&y>=t&&y<=e&&w>=n&&w<=i){h=!0;return}return g}));if(h){if(f.every(l=>l.every(m=>m===void 0))){this.remove(o.el);continue}o.el.setAttribute("href",this.image(f)),c.rows=f}}}image(t){let e=document.createElement("canvas");e.width=t[0].length,e.height=t.length;let n=e.getContext("2d"),i=n.createImageData(e.width,e.height);return t.forEach((o,c)=>o.forEach((h,f)=>{if(h===void 0)return;let[l,m,g]=Xn[h];i.data.set([l,m,g,255],(c*e.width+f)*4)})),n.putImageData(i,0,0),e.toDataURL()}"object-keep"(t){this.object(t,"keep")}"object-mode"(t){this.object(t,"clear")}"key-at"({a:t,x:e,y:n}){this.pen.x=e,this.pen.y=n,this.key({a:t})}key({a:t}){let e=it(t);this.cap(t,this.pen.x,this.pen.y,this.layer,!0,void 0,Math.max(4,e)+4),this.pen.x+=1+(e<4?4-e:0)+1+e+3}cap(t,e,n,i,o,c,h){let f={"\r":"RETURN","\x7F":"DELETE"}[t]??t,l=h??(f.length>1?32:7),m=this.el("g",c!==void 0?{class:"key","data-key":c}:{});if(this.el("rect",{x:V(e),y:Y(n-2),width:V(l),height:Y(11),rx:3,fill:at(1),stroke:at(13),"stroke-width":3},m),this.oldStyle){let g=0;for(let k of f)g+=it(k)+1;this.glyphs(m,f,e+Math.max(1,Math.round((l-g+1)/2)),n,15)}else{let g=this.el("text",{x:V(e+l/2),y:Y(n+7),fill:at(15),"font-family":fe,"font-size":f.length>1?13:16,"font-weight":600,"text-anchor":"middle"},m);g.textContent=this.modern(f)}return o?(this.add(n-2,n+8,m,{covers:!1,left:e,right:e+l}),this.items.at(-1).cap=!0):i.append(m),m}text({words:t}){if(this.textScreen.getAttribute("display")!=="none"){for(let e of Nt(t,this.textPen))this.textCells[e.row]?.[e.col]&&this.textCell(e.row,e.col,e.ch,e.inverse);return}for(let e of Mt(t,this.pen)){let{top:n,tall:i}=e,o=i?32:19,c=e.chars.filter(k=>k.ch.charCodeAt(0)>=32);if(c.length){let k=Math.min(...c.map(O=>O.x)),y=Math.max(...c.map(O=>O.x+it(O.ch)))-1,w=Math.min(9,e.height??9)*(i?2:1);this.add(n,n+w-1,this.rect(k,n,y-k+1,w,e.paper,null),{left:k,right:y})}let h=this.el("g",{"font-family":fe,"font-size":o,"font-weight":i?700:500}),f=null,l=139,m=0,g=()=>{if(!f)return;if(l=Math.min(l,f.x),m=Math.max(m,f.x+f.width),this.oldStyle){this.glyphs(h,f.chars,f.x,n,e.ink,i,e.paper),f=null;return}let k=this.el("text",{y:Y(n+(i?15:7)),"data-x":V(f.x),"data-width":V(f.width)},h);for(let y of f.chars){let w=this.el("tspan",{fill:at(y.ink??e.ink)},k);w.textContent=this.modern(y.ch)}f=null};for(let k of e.chars){if(k.ch.charCodeAt(0)<=32){g();continue}f??={x:k.x,width:0,chars:[]},f.chars.push(k),f.width=k.x+it(k.ch)-f.x}g(),h.childNodes.length&&(this.add(n,n+(i?16:8),h,{covers:!1,left:l,right:m}),this.fit(h))}}fit(t){for(let e of t.querySelectorAll("text[data-width]")){let n=e.getComputedTextLength();n>0&&e.setAttribute("transform",`translate(${e.dataset.x} 0) scale(${e.dataset.width/n} 1)`)}}glyphs(t,e,n,i,o,c=!1,h){let f=typeof e=="string"?[...e].map(g=>({ch:g})):e,l=c?2:1,m=new Map;for(let g of f){let k=it(g.ch),y=g.ink??o;h!==void 0&&this.rect(n,i,k,9*l,h,t);let w=m.get(y)??"";for(let[O,a]of Gt(g.ch))w+=`M${V(n+O)} ${Y(i+a*l)}h4v${2*l}h-4z`;m.set(y,w),n+=k+1}for(let[g,k]of m)k&&this.el("path",{d:k,fill:at(g)},t);return n}write(t,e,n,i,o=15){if(this.oldStyle)return this.glyphs(t,e,n,i,o);let c=this.el("g",{"font-family":fe,"font-size":19,"font-weight":500,fill:at(o)},t);for(let h of e.split(" ")){if(h){let f=0;for(let m of h)f+=it(m)+1;let l=this.el("text",{y:Y(i+7),"data-x":V(n),"data-width":V(f-1)},c);l.textContent=this.modern(h),n+=f}n+=it(" ")+1}return this.fit(c),n}line({x0:t,x1:e,y0:n,y1:i,color:o}){this.add(Math.min(n,i),Math.max(n,i),this.el("line",{x1:V(t+.5),y1:Y(n+.5),x2:V(e+.5),y2:Y(i+.5),stroke:at(o),"stroke-width":3,"stroke-linecap":"round"}),{covers:!1,left:Math.min(t,e),right:Math.max(t,e)})}rectangle({a:t,x:e,y:n,width:i,height:o}){this.solid(t,e,n,i+1,o)}"rectangle-outline"({a:t,x:e,y:n,width:i,height:o}){let c=i+1,h=o+1;this.add(n,n+h-1,this.el("rect",{x:V(e)+2,y:Y(n)+1,width:V(c)-4,height:Y(h)-2,fill:"none",stroke:at(t),"stroke-width":3}),{covers:!1,left:e,right:e+c-1})}solid(t,e,n,i,o){this.add(n,n+o-1,this.rect(e,n,i,o,t,null),{left:e,right:e+i-1})}prompts(){this.prompt.replaceChildren();let t=this.engine,e=t.waitingOn;if(!e)return;let n=e.words?.[0]??e.name;if(n==="wait"||n==="wait-erase"||n==="wait-or-escape"){let i=(t.mem[this.vars.layout]&15)===1?178:170,o=this.el("g",{class:"key","data-key":32},this.prompt);if(this.el("rect",{x:V(46),y:Y(i),width:V(47),height:Y(11),rx:4,fill:at(1),stroke:at(13),"stroke-width":3},o),this.oldStyle)this.glyphs(o,"SPACE BAR",48,i+2,15);else{let c=this.el("text",{x:V(69.5),y:Y(i+8),fill:at(15),"font-family":fe,"font-size":15,"font-weight":600,"text-anchor":"middle"},o);c.textContent="SPACE BAR"}this.spaceBar={y:i,erase:n==="wait-erase",el:o}}else if(n==="ask"||n==="ask-mode"||n==="ask-escape"){this.rect(1,162,138,28,5,this.prompt);let i=t.askMode,o=[];if(i===128)ns.forEach((h,f)=>o.push([h,[8,21,10,11][f]]));else if(i>=177&&i<186)for(let h=49;h<=(i&127);h++)o.push([String.fromCharCode(h),h]);else for(let h=65;h<=(i&95);h++)o.push([String.fromCharCode(h),h]);let c=(h,f,l)=>this.write(this.prompt,h,f,l);if(t.asked===null)c("Press",4,166),o.forEach(([h,f],l)=>{l===o.length-1&&i!==128&&o.length>1&&c("or",31+10*l,166),this.cap(h,31+10*l+(l===o.length-1&&i!==128&&o.length>1?10:0),166,this.prompt,!1,f)}),i===128&&[[58,62],[74,62],[66,71],[66,53]].forEach(([h,f],l)=>this.cap(ns[l],h,f,this.prompt,!1,o[l][1]));else{let[h]=o[t.asked.place];this.cap(h,31+10*t.asked.place,166,this.prompt,!1),c("Press",4,179),this.cap("\r",31,179,this.prompt,!1,13),c("or",67,179),this.cap("\x7F",78,179,this.prompt,!1,127),i===128&&this.cap(ns[t.asked.place],[58,74,66,66][t.asked.place],[62,62,71,53][t.asked.place],this.prompt,!1)}}}}});var ti={};z(ti,{CardView:()=>qt});function Zr(s,{top:t}){for(let e=0;e<t;e++)for(let n=0;n<560;n++){let i=(e*560+n)*4;if(s[i]<200||s[i+1]<200||s[i+2]<200)return!1}return!0}function Qr(s,{top:t,bottom:e,move:[n,i],by:o}){for(let c=t;c<=e;c++){let h=c*560*4;s.copyWithin(h+(n+o)*4,h+n*4,h+i*4),o<0?s.fill(255,h+(i+o)*4,h+i*4):s.fill(255,h+n*4,h+(n+o)*4)}}var Gr,qt,rs=B(()=>{le();Gr="http://www.w3.org/2000/svg",qt=class{constructor(t,{engine:e,inset:n=null}){this.svg=t,this.engine=e,this.inset=n,this.insetOn=!1,this.banded=!1,t.setAttribute("viewBox","0 0 560 384"),this.canvas=document.createElement("canvas"),this.canvas.width=560,this.canvas.height=384,this.image=document.createElementNS(Gr,"image");for(let[i,o]of Object.entries({x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(i,o);t.append(this.image)}snapshot(t){return t}apply(){}prompts(){let t=this.engine.mem,e=this.engine.title.screen,n=this.canvas.getContext("2d"),i=n.createImageData(560,384);if(e.text)ce(i.data,t,t,!1,[0,24]);else{let o=e.page2?16384:8192;_e(i.data,t.subarray(o,o+8192)),e.mixed&&ce(i.data,t,t,!1,[20,24])}this.banded=this.insetOn&&!!this.inset&&Zr(i.data,this.inset),this.banded&&Qr(i.data,this.inset),n.putImageData(i,0,0),this.image.setAttribute("href",this.canvas.toDataURL())}}});import{paint as to}from"@moonbase-machines/c64";var ei,si=B(()=>{({paint:ei}=to)});import{vic as eo}from"@moonbase-machines/c64";var Kt,Kc,os,Wc,Hc,Wt,ni=B(()=>{({HEIGHT:Kt,LEFT:Kc,PALETTE:os,TOP:Wc,VIC:Hc,WIDTH:Wt}=eo)});var ii={};z(ii,{C64View:()=>Ht});var so,Ht,as=B(()=>{si();ni();so="http://www.w3.org/2000/svg",Ht=class{constructor(t,{engine:e,chargen:n}){this.svg=t,this.engine=e,this.chargen=n,t.setAttribute("viewBox",`0 0 ${Wt*2} ${Kt*2}`),this.canvas=document.createElement("canvas"),this.canvas.width=Wt,this.canvas.height=Kt,this.image=document.createElementNS(so,"image");for(let[i,o]of Object.entries({x:0,y:0,width:Wt*2,height:Kt*2,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(i,o);t.append(this.image)}snapshot(t){return t}apply(){}prompts(){let t=this.engine,e=ei(t.mem,t.title.chip,this.chargen,this.vic,t.title.splits),n=this.canvas.getContext("2d"),i=n.createImageData(Wt,Kt);for(let o=0;o<e.length;o++){let[c,h,f]=os[e[o]];i.data.set([c,h,f,255],o*4)}n.putImageData(i,0,0),this.svg.style.background=`rgb(${os[e[0]].join(",")})`,this.image.setAttribute("href",this.canvas.toDataURL())}}});var he={};z(he,{play:()=>ro});async function ro(s){let{title:t,scripts:e,game:n,stage:i,status:o,fail:c,saves:h,$:f}=s,l=n.kind==="c64";i.innerHTML=`<svg id="screen" preserveAspectRatio="xMidYMid meet" tabindex="0" aria-label="The game's screen"></svg>`;let m=f("screen"),g=l?"c64":t.engine==="card"?"card":"vector",k=t.viewSteps??{},y=s.chargen=l?s.roms?.chargen??Jn().chargen:null;s.printer&&(t.printer=s.printer),t.disk=h.data,l&&h.drive(t.drive=new se(Uint8Array.from(atob(n.image),M=>M.charCodeAt(0))));let w=Fe(t,e);t.files&&h.keep(t.files);let O=[],a=[],u=g==="vector"?s.setting(no):{value:!1,on(){return this}},d=null,E=()=>{m.replaceChildren();let M=g==="c64"?new Ht(m,{engine:w,chargen:y}):g==="card"?new qt(m,{engine:w,inset:s.mini?t.inset:null}):new Ft(m,{disk:n,volume:Object.keys(n.volumes)[0],engine:w,extra:k});return M.oldStyle=u.value,d?.(M),M},v=E();if(w.on(M=>O.push(v.snapshot({...M}))),t.inset&&s.mini){let M=s.setting(io),{top:r,bottom:p,view:[x,S]}=t.inset,b=document.createElement("div");b.className="mini",b.hidden=!0,Object.assign(b.style,{left:`${x/5.6}%`,top:`${r/3.84}%`,width:`${(S-x)/5.6}%`,height:`${(p-r+1)/3.84}%`}),m.parentElement.append(b);let N=await s.mini(b,{memory:()=>w.mem});d=D=>{D.insetOn=!!M.value;let K=D.prompts.bind(D);D.prompts=()=>{K(),b.hidden=!(M.value&&D.banded)}},d(v);let U=()=>{v.insetOn=!!M.value,N.mode(M.value),v.prompts()};M.on(U),U()}u.on(()=>{v=E();for(let M of a)v.apply(M);v.prompts()});let L=w.timed?new mt:null,T=!0,I=()=>{l||L?.feed(T?w.clicks:[],w.cycles),w.clicks.length=0},C=t.map?.vars??{sound:0,soundOn:0},$=null,j=(M,r,p)=>{if(!T||!(w.mem[C.sound]&C.soundOn))return;$??=new AudioContext;let x=$.createOscillator(),S=$.createGain(),b=$.currentTime;x.type="square",x.frequency.setValueAtTime(M,b),x.frequency.linearRampToValueAtTime(r,b+p/1e3),S.gain.setValueAtTime(.06,b),S.gain.linearRampToValueAtTime(0,b+p/1e3),x.connect(S).connect($.destination),x.start(b),x.stop(b+p/1e3)},R=M=>16e3/(M+8),A={sound:220,beep:60,"flash-box":60,flash:250,object:30,"object-keep":30},F=!1,P=!1,W=M=>new Promise(r=>setTimeout(r,M));async function J(){if(!F){F=!0;try{for(;;){let M=w.run();if(I(),M==="pace"){for(let r of O.splice(0))a.push(r),v.apply(r);v.prompts(),!P&&s.pace()&&await W(w.delay*s.pace()),w.delay=0;continue}for(w.delay=0;O.length;){let r=O.shift();if(a.push(r),v.apply(r),!P){if(r.step==="sound"){let[p,x]=r.words.split(" ").map(S=>parseInt(S,16));j(R(x),R(p),180)}r.step==="beep"&&j(R(r.a&31)*2,R(r.a&31)*2,50),s.pace()&&(A[r.step]&&await W(A[r.step]*s.pace()),r.step==="pause"&&await W(r.ms*s.pace()))}}if(v.prompts(),o.textContent=M==="end"?"The end.":"Waiting for a key.",!w.keys.length||M==="end")break}}catch(M){c(M)}F=!1}}let H=M=>{w.press(M),$?.resume(),L?.start(),l||J()},q=()=>w.waitingOn?.words?.[0]==="tick",rt=null,nt=null;m.addEventListener("click",M=>{let r=M.target.closest(".key")?.dataset.key;r&&H(+r)});function xt(){w.sid=[],w.clock={irq:0,ahead:[],since:0};let M=null,r=null,p=0,x=!1;o.textContent="Playing.",setInterval(()=>{if(w.delay-=1e3/60,!x&&!w.ended&&w.delay<16){w.delay=Math.max(0,w.delay),w.clock.ahead.length&&w.idle>(w.routines.polls??200)&&!w.keys.length&&++w.clock.since>120&&(w.press(w.clock.ahead.shift()),w.clock.since=0);try{w.run(),O.length=0,v.prompts()}catch(S){x=!0,c(S)}w.ended&&(o.textContent="The end.")}if(L?.node&&T){M??=new Ze(L.rate),r??=performance.now();let S=Math.floor((performance.now()-r)/1e3*L.rate)-p;if(S>0){let b=M.render(S,w.sid.map(([,N,U])=>[0,N,U]));p+=S,L.node.port.postMessage(b,[b.buffer])}}w.sid.length=0},1e3/60)}return setInterval(()=>{if(!q()||F||w.keys.length)return;let M=nt??rt??-1;nt=null,H(M)},100),{engine:w,press:H,run(){m.focus(),l?xt():J()},key(M,r){if(M.type==="keyup"){rt=null;let x=w.clock?.held;x?.key===M.key&&(x.seen?w.clock.held=null:x.up=!0);return}if(r===void 0)return;if(M.preventDefault(),q()){nt=rt=r;return}let p=l&&!M.ctrlKey&&rn(r);if(p){M.repeat||(w.clock.held={...p,key:M.key},$?.resume(),L?.start());return}M.repeat||H(r)},keys(M){if(l)w.clock.ahead.push(...M);else for(let r of M)H(r)},start(){$?.resume(),L?.start()},sound(M){T=M},quick(M){P=M},route({route:M,name:r,keys:{expand:p,give:x,petscii:S,pollsAt:b}}){if(t.seed=M.seed,M.printer&&t.printer){t.printer.on=!0;let D=f("printer");D&&(D.checked=!0)}o.textContent="Playing the route "+r+".";let N={press:D=>w.press(D),also:D=>{let K=w.mem,Q=tt=>{K[198]<10&&(K[631+K[198]]=tt,K[198]++)};w.keys.length&&Q(w.keys.shift()),Q(D)}},U=()=>{let D;do w.delay=0,D=w.run();while(D==="pace");if(l)O.length=0;else for(let K of O.splice(0))a.push(K),v.apply(K)};U();for(let[D,[K]]of p(M.keys).entries())x(N,K,l?S:void 0),w.polls=b(M,D+1)??void 0,U();w.polls=void 0,v.prompts()}}}var no,io,pe=B(()=>{oe();ae();Qe();Oe();_n();Ae();is();rs();as();no={name:"old-style",type:"boolean",default:!1,owner:"person",words:"Old style text"},io={name:"mini",type:["","live","pictures"],default:"",owner:"person",words:"Mini view",labels:["Off","Live","Pictures"]}});var ci={};z(ci,{play:()=>co});oe();var Tn={};z(Tn,{savesFor:()=>qe});import{saves as or}from"@moonbase-machines/apple2e";var{driveFiles:jn,keepSaves:Cn,onDisks:On,withSaves:An}=or;import{saves as ar}from"@moonbase-machines/c64";var{keepDrive:Ln}=ar;function qe(s,t){return{data:An(s,t),keep:e=>Cn(s,e,t),drive:e=>Ln(e,t),disks:e=>On(s,e,t),driveFiles:(e,n)=>jn(e,n,s)}}var Rn={};z(Rn,{code:()=>Ke,named:()=>We});var cr={ArrowLeft:8,ArrowRight:21,ArrowDown:10,ArrowUp:11,Enter:13,Backspace:127,Delete:127,Escape:27,Tab:9," ":32},lr={ArrowLeft:157,ArrowRight:29,ArrowDown:17,ArrowUp:145,Enter:13,Backspace:20,Delete:20,Escape:3," ":32},fr={space:32,return:13,escape:27,delete:127,left:8,right:21,down:10,up:11,"control-e":5,"control-t":20,none:-1},hr={8:157,21:29,10:17,11:145,127:20,27:3};function Ke(s,t){if(!t||s.metaKey||s.altKey)return;let e=t==="c64";return s.ctrlKey?/^[a-z]$/i.test(s.key)?s.key.toUpperCase().charCodeAt(0)&31:void 0:(e?lr:cr)[s.key]??(s.key.length===1?(e?s.key.toUpperCase():s.key).charCodeAt(0):void 0)}function We(s,t){let e=fr[s]??s.charCodeAt(0);return t==="c64"?hr[e]??e:e}var In={};z(In,{KEYS_MARKUP:()=>Ye,paperBox:()=>He,phoneKeys:()=>Ve});function He({line:s,print:t,tear:e}){let n=document.createElement("div");return n.id="paper-box",n.hidden=!0,n.innerHTML='<p><span></span> <button id="print-paper" type="button"></button> <button id="tear" type="button"></button></p><canvas id="paper"></canvas>',n.querySelector("span").textContent=s,n.querySelector("#print-paper").textContent=t,n.querySelector("#tear").textContent=e,n}function Ve(s,t){let e=s.querySelector("#keyboard"),n=s.querySelector("#keys-box");if(!e||!n||!matchMedia("(pointer: coarse)").matches)return;e.hidden=!1,e.addEventListener("click",()=>n.focus()),t.addEventListener("click",()=>n.focus());let i=!1;n.addEventListener("keydown",o=>{i=o.key==="Unidentified"}),n.addEventListener("input",()=>{if(i)for(let o of n.value)for(let c of["keydown","keyup"])window.dispatchEvent(new KeyboardEvent(c,{key:o}));n.value=""})}var Ye='<button type="button" id="keyboard" class="full" hidden>Keyboard</button><input id="keys-box" class="keys-box" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" aria-label="Keys for the game">';var ri={prodos:[280,192],dos33:[280,192],c64:[384,272]},oi={original:()=>Promise.resolve().then(()=>(es(),ts)),card:()=>Promise.resolve().then(()=>(pe(),he)),vector:()=>Promise.resolve().then(()=>(pe(),he))},oo={name:"sound",type:"boolean",default:!0,owner:"person",words:"Sound"},ao={name:"printer",type:"boolean",default:!0,owner:"person",words:"Printer"},ai={name:"fixed",type:"boolean",default:!1,owner:"person",words:"Bugs fixed",title:"The game with its bugs fixed: it starts again"};async function co(s){let{way:t="remake",slug:e,root:n,disk:i,settings:o,preview:c=!1,words:h}=s;n.classList.add("player",t),e&&n.classList.add(e),n.innerHTML=`<div class="stage"></div><p class="options"><span id="status">Loading.</span>${Ye}<span class="settings"></span><button id="disk" type="button" hidden>Download the disk</button></p>`,n.append(He(h.printer));let f=w=>n.querySelector("#"+w),l=n.querySelector(".stage"),m=f("status"),g=n.querySelector(".options .settings"),k=w=>{m.textContent="The game stopped: "+w.message,m.className="error",console.error(w)},y=(w,{first:O=!1}={})=>{let a={value:o.get(w),told:[],on(v){return this.told.push(v),this}};if(!o.offered(w))return a;let u=document.createElement("label"),d=Array.isArray(w.type);w.title&&(u.title=w.title);let E=d?Object.assign(document.createElement("select"),{innerHTML:w.type.map((v,L)=>`<option value="${v}">${w.labels[L]}</option>`).join("")}):Object.assign(document.createElement("input"),{type:"checkbox"});return E.id=w.name,d?(E.value=a.value,u.append(w.words+" ",E)):(E.checked=a.value,u.append(E," "+w.words)),E.addEventListener("change",()=>{a.value=d?E.value:E.checked,o.set(w,a.value);for(let v of a.told)v(a.value)}),g[O?"prepend":"append"](u),a};try{if(!i||!o)throw new Error("the page gives the player its disk and its settings");let w=o.get(ai),O=s.title?new URL(s.title):null,a=new URL(s.data),u=null,d={},E=null;t==="remake"?{title:u,scripts:d,disk:E}=await ze(O,{data:a,fixed:w}):O&&(u=await re(O)),!E&&/\.json$/.test(a.pathname)&&(E=await zt(a,"json"));let v=E?.kind;if(u?.style&&!document.querySelector(`link[data-title="${u.slug}"]`)){let R=Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL(u.style,O).href});R.dataset.title=u.slug,document.head.append(R),await new Promise(A=>{R.onload=R.onerror=A})}i.failed=R=>{m.textContent="A file was not kept: "+R.message,m.className="error"};let[L,T]=s.screen??u?.screen??ri[v]??ri.prodos;lo(l,n,L,T);let I={way:t,slug:e,title:u,scripts:d,game:E,folder:O,data:a,stage:l,status:m,fail:k,disk:i,preview:c,words:h,fixed:w,$:f,setting:y,saves:E?qe(E,i):null,roms:s.roms,studies:s.studies,mini:s.mini??null,chargen:null,pace:()=>{let R=s.pace;return typeof R=="function"?R():R??1},control(R){g.insertAdjacentHTML("afterend",R)}};if(v==="c64"){let{Printer:R,paper:A}=await Promise.resolve().then(()=>(Re(),on)),F=y(ao),P=I.printer=new R({on:F.value});F.on(H=>{P.on=H});let W=f("paper"),J=f("paper-box");P.changed=()=>{J.hidden=!P.lines.length,P.lines.length&&A(W,P,I.chargen)},f("tear").addEventListener("click",()=>P.tear()),f("print-paper").addEventListener("click",()=>window.print())}t==="remake"&&u?.fixed&&y(ai).on(()=>location.reload());let $=await(t==="original"?await oi.original():u.own??await oi[u.engine]()).play(I);if(!$)return;if($.sound){let R=y(oo,{first:!0});$.sound(R.value),R.on(A=>$.sound(A))}let j=R=>{let A=Ke(R,v),F=R.type==="keydown";if(F&&A!==void 0&&!R.repeat&&s.claim?.(A)){R.preventDefault();return}if(F&&$.start?.(),$.key){$.key(R,A);return}!F||A===void 0||R.repeat||!$.press||(R.preventDefault(),$.press(A))};if(addEventListener("keydown",j),addEventListener("keyup",j),l.addEventListener("pointerdown",()=>$.start?.()),Ve(n,l),s.downloadDisk&&$.diskImage){let R=f("disk"),A=a.pathname.split("/").pop().replace(/\.json$/,"");R.hidden=!1,R.addEventListener("click",()=>{let F=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([$.diskImage()],{type:"application/octet-stream"})),download:A+".d64"});F.click(),URL.revokeObjectURL(F.href)})}if(s.watch?.({engine:$.engine,press:R=>{$.start?.(),$.press?.(R)},quick:R=>$.quick?.(R)}),s.route){if(!$.route)throw new Error("a route cannot be played on the "+t);await $.route(s.route)}if($.run(),s.keys?.length){let R=s.keys.map(A=>We(A,v));if($.keys)$.keys(R);else for(let A of R)$.press?.(A)}}catch(w){k(w)}}function lo(s,t,e,n){let i=()=>{let o=window.devicePixelRatio||1,c=parseFloat(getComputedStyle(t).paddingLeft)*2,h=t.clientWidth-c,f=document.documentElement.clientWidth-16,l=parseFloat(getComputedStyle(s).maxHeight),m=Math.ceil(h*o/e-.01);e*m/o>f&&(m=Math.max(1,Math.floor(f*o/e))),l&&n*m/o>l&&(m=Math.max(1,Math.floor(l*o/n)));let g=e*m/o;Object.assign(s.style,{width:g+"px",height:n*m/o+"px",aspectRatio:"auto",marginLeft:(h-g)/2+"px"}),t.style.setProperty("--scale",m/o)};i(),addEventListener("resize",i)}var hi={};z(hi,{check:()=>vt,describe:()=>St,settingsStore:()=>hs});var li={};z(li,{bytesText:()=>fs,openDisk:()=>cs,programDisk:()=>ho,textBytes:()=>ls,titleDisk:()=>fo});async function cs(s,{backend:t}){if(!t)throw new Error("openDisk: a backend is the provider's to give (provider.js)");let e=new Map((await t.load(s)).map(c=>[c.name,c])),n=Promise.resolve(),i=c=>{let h=n.then(c);return n=h.catch(f=>o.failed?.(f)),h.catch(()=>{}),h},o={name:s,kept:t.kept,where:t.where??null,failed:null,list:()=>[...e.values()].sort((c,h)=>h.modified-c.modified).map(({name:c,bytes:h,meta:f,modified:l})=>({name:c,size:h.length,modified:l,meta:f})),read:c=>e.get(c)?.bytes??null,write(c,h,f={}){let l={name:c,bytes:Uint8Array.from(h),meta:f,modified:Date.now()};return e.set(c,l),i(()=>t.put(s,l))},remove(c){return e.delete(c),i(()=>t.delete(s,c))},written:()=>n};return o}var fo=s=>`title/${s}`,ho=s=>`program/${s}`,ls=s=>new TextEncoder().encode(s),fs=s=>s?new TextDecoder().decode(s):null;var fi="settings";function vt(s,t){if(Array.isArray(s))return s.includes(t);if(s==="boolean")return typeof t=="boolean";throw new Error("settings: no such type: "+JSON.stringify(s))}var St=s=>Array.isArray(s)?"one of "+s.map(t=>t===""?"nothing":t).join(", "):"on or off";function hs({disks:s,visit:t=()=>{},fixed:e={},hidden:n=[]}){let i=new Set,o=(l,m)=>{i.has(l)||(i.add(l),console.warn(m))},c=Object.fromEntries(Object.entries(s).map(([l,m])=>{let g=null;try{g=JSON.parse(fs(m.read(fi))??"{}")}catch{}return[l,{disk:m,kept:g&&typeof g=="object"&&!Array.isArray(g)?g:{}}]})),h=new Set,f=l=>{let m=c[l.owner];if(!m)throw new Error(`settings: no store for the owner ${l.owner} (${l.name})`);if(!h.has(l.name)&&(h.add(l.name),!vt(l.type,l.default)))throw new Error(`settings: ${l.name}'s default ${JSON.stringify(l.default)} is not ${St(l.type)}`);return m};return{get(l){let m=f(l);if(l.name in e){if(!vt(l.type,e[l.name]))throw new Error(`settings: ${l.name} fixed at ${JSON.stringify(e[l.name])}, not ${St(l.type)}`);return e[l.name]}let g=t(l);if(g!==void 0){if(vt(l.type,g))return g;o("visit "+l.name,`${l.name}: ${JSON.stringify(g)} for this visit refused: not ${St(l.type)}`)}if(l.name in m.kept){if(vt(l.type,m.kept[l.name]))return m.kept[l.name];o("kept "+l.name,`${l.name}: the kept ${JSON.stringify(m.kept[l.name])} is not ${St(l.type)}; its default used`)}return l.default},set(l,m){let g=f(l);if(!vt(l.type,m))throw new Error(`settings: ${l.name} cannot be ${JSON.stringify(m)}: not ${St(l.type)}`);return g.kept[l.name]=m,g.disk.write(fi,ls(JSON.stringify(g.kept)))},offered:l=>!n.includes(l.name)&&!(l.name in e)}}var wi={};z(wi,{provider:()=>mo,settingsDisk:()=>gi});var mi={};z(mi,{ACCOUNT:()=>ui,DB:()=>pi,KEY:()=>di,STORE:()=>de,VERSION:()=>po,local:()=>ds});var pi="moonbase",po=1,de="files",di=["account","disk","name"],ui="local",uo=()=>new Promise((s,t)=>{let e=indexedDB.open(pi,1);e.onupgradeneeded=()=>e.result.createObjectStore(de,{keyPath:di}),e.onsuccess=()=>s(e.result),e.onerror=()=>t(e.error)}),ps=s=>new Promise((t,e)=>{s.onsuccess=()=>t(s.result),s.onerror=()=>e(s.error)});async function ds({account:s=ui}={}){let t=await uo(),e=n=>t.transaction(de,n).objectStore(de);return{kept:!0,where:"this browser",load:async n=>(await ps(e("readonly").getAll(IDBKeyRange.bound([s,n],[s,n,[]])))).map(({name:i,bytes:o,meta:c,modified:h})=>({name:i,bytes:o,meta:c,modified:h})),put:(n,i)=>ps(e("readwrite").put({account:s,disk:n,...i})),delete:(n,i)=>ps(e("readwrite").delete([s,n,i]))}}var xi={};z(xi,{memory:()=>us});function us({kept:s=!0}={}){let t=new Map,e=n=>t.get(n)??t.set(n,new Map).get(n);return{kept:s,load:async n=>[...e(n).values()].map(i=>({...i,bytes:Uint8Array.from(i.bytes)})),put:async(n,i)=>{e(n).set(i.name,{...i,bytes:Uint8Array.from(i.bytes)})},delete:async(n,i)=>{e(n).delete(i)}}}async function mo({backend:s,visit:t,fixed:e={},hidden:n=[]}={}){if(!s)try{s=await ds()}catch{s=us({kept:!1})}let i=c=>cs(c,{backend:s}),o=hs({disks:{person:await i(gi("person"))},visit:t,fixed:e,hidden:n});return{disk:i,settings:o}}var gi=s=>`settings/${s}`;es();pe();ae();var vi={};z(vi,{modal:()=>ms,modalOpen:()=>go});var Et=[],ki=!1,xo=s=>{let t=Et.at(-1);if(t){if(s.key==="Escape")s.preventDefault(),t.cancel();else if(s.key==="Enter"&&!(s.target instanceof HTMLButtonElement)&&s.target.tagName!=="TEXTAREA"){let e=t.box.querySelector(".default:not(:disabled)");e&&(s.preventDefault(),e.click())}else if(s.key==="Tab"){let e=bi(t.box),n=e.indexOf(document.activeElement);e.length&&(s.preventDefault(),e[(n+(s.shiftKey?e.length-1:1))%e.length].focus())}s.stopPropagation()}},bi=s=>[...s.querySelectorAll('button:not(:disabled), input:not([type=hidden]):not([type=file]):not([hidden]), select:not([hidden]), [tabindex="0"]')],yi=s=>s.querySelector("input:not([type=file]), select:not([hidden])")??s.querySelector(".default")??bi(s)[0];function ms({within:s=document.body,className:t="",content:e,cancel:n=null}){ki||(document.addEventListener("keydown",xo,!0),ki=!0);let i=document.createElement("div");i.className="modal-layer"+(s===document.body?" page":"");let o=document.createElement("div");o.className="modal "+t,o.setAttribute("role","dialog"),o.setAttribute("aria-modal","true"),o.append(e),i.append(o);let c=document.activeElement,h=[...s.children].filter(l=>!l.inert);for(let l of h)l.inert=!0;s.append(i);let f={box:o,cancel:()=>(n??f.close)(),close(){i.remove(),Et.splice(Et.indexOf(f),1);for(let m of h)m.inert=!1;let l=Et.at(-1);(l&&!l.box.contains(c)?yi(l.box):c)?.focus?.({preventScroll:!0})}};return Et.push(f),yi(o)?.focus({preventScroll:!0}),f}var go=()=>Et.length>0;var Ei={};z(Ei,{dialogs:()=>wo});function wo({within:s,className:t=""}={}){function e(c,h,f,{aside:l=[]}={}){return new Promise(m=>{let g=document.createElement("div");g.className="disk";let k=document.createElement("h2");k.textContent=c;let y=document.createElement("p");y.className="buttons";for(let[O,a]of f){let u=Object.assign(document.createElement("button"),{type:"button",textContent:O});u.onclick=async()=>{w.close(),m(typeof a=="function"?await a():a)},y.append(u)}if(y.lastChild?.classList.add("default"),l.length){let O=document.createElement("span");O.className="aside",O.append(...l),y.prepend(O)}g.append(k,...h,y);let w=ms({within:s,className:t,content:g,cancel:()=>{w.close(),m(null)}})})}let n=c=>e(c,[],[["OK",null]]);async function i(c,{suggested:h=""}={}){let f=Object.assign(document.createElement("input"),{value:h,maxLength:31});setTimeout(()=>f.select());let l=document.createElement("label");l.append("Save as ",f);let m=await e("Save",[l,...Si(c)],[["Cancel",null],["Save",()=>f.value.trim()||null]]);return!m||c.read(m)&&!await e(`Replace "${m}"?`,[],[["Cancel",!1],["Replace",!0]])?null:m}async function o(c,{file:{extension:h="",type:f="application/octet-stream"}={}}={}){let l=Object.assign(document.createElement("select"),{size:6}),m=document.createElement("p");m.className="note";let g=Object.assign(document.createElement("input"),{type:"file",accept:[h,f].filter(Boolean).join(","),hidden:!0}),k=v=>Object.assign(document.createElement("button"),{type:"button",textContent:v}),y=k("File\u2026"),w=k("Download"),O=k("Delete"),a=()=>{l.replaceChildren(...c.list().map(v=>new Option(`${v.name} \xB7 ${new Date(v.modified).toLocaleString()}`,v.name))),l.selectedIndex=l.options.length?0:-1,l.hidden=!l.options.length,m.textContent=l.options.length?"On your disk:":"Nothing saved on your disk yet.",O.disabled=w.disabled=!l.options.length};a();let u=e("Open",[m,l,g,...Si(c)],[["Cancel",null],["Open",()=>l.value||null]],{aside:[y,w,O]}),d=()=>l.closest(".modal").querySelector(".default").click();y.onclick=()=>g.click(),g.onchange=async()=>{let v=g.files[0],L=v.name.slice(0,v.name.length-(h&&v.name.endsWith(h)?h.length:0));c.read(L)&&!await e(`Replace "${L}"?`,[],[["Cancel",!1],["Replace",!0]])||(c.write(L,new Uint8Array(await v.arrayBuffer())),a(),l.value=L,d())},w.onclick=()=>{let v=l.value;if(!v)return;let L=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([c.read(v)],{type:f})),download:v+h});L.click(),setTimeout(()=>URL.revokeObjectURL(L.href),1e3)},O.onclick=async()=>{let v=l.value;v&&await e(`Delete "${v}"?`,[ko("It is gone from your disk for good.")],[["Delete",!0],["Cancel",!1]])&&(await c.remove(v),a(),l.focus())},l.ondblclick=d;let E=await u;return E?{name:E,bytes:c.read(E)}:null}return{saveAs:i,openFrom:o,ask:e,tell:n}}var ko=s=>Object.assign(document.createElement("p"),{className:"note",textContent:s});function Si(s){if(s.kept)return[];let t=document.createElement("p");return t.className="note",t.textContent="This browser is not keeping files: download a game to keep it.",[t]}as();rs();De();Ce();var ji={};z(ji,{compile:()=>$o});Yt();var X=(s,t=2)=>"0x"+s.toString(16).padStart(t,"0"),xs=49152,gs=49407,yo=s=>s>=xs&&s<=gs;function ws(s){if(s.through!==void 0)return{js:`(e.mem[${X(s.through)}] | e.mem[${X(s.through+1)}] << 8) + e.y & 0xffff`,io:!0};if(s.pair!==void 0)return{js:`e.mem[${X(s.pair)} + e.x & 0xff] | e.mem[${X(s.pair)} + e.x + 1 & 0xff] << 8`,io:!0};if(s.via!==void 0)return{js:`(e.mem[${X(s.via,4)}] | e.mem[${X(s.via+1,4)}] << 8)${s.index?" + e."+s.index+" & 0xffff":""}`,io:!0};if(!s.index)return{js:X(s.at,4),io:yo(s.at)};let t=s.at<=gs&&s.at+255>=xs;return{js:s.at+255>65535?`(${X(s.at,4)} + e.${s.index}) & 0xffff`:`${X(s.at,4)} + e.${s.index}`,io:t}}function $t(s,t=!0){let e=Z(s);if(e.number!==void 0)return{js:String(e.number&255)};if(e.reg==="carry")return{js:"e.c"};if(e.reg)return{js:"e."+e.reg};let n=ws(e);return t&&e.through!==void 0?{js:`e.read(e.ix(e.mem[${X(e.through)}] | e.mem[${X(e.through+1)}] << 8, e.y))`,io:!0}:t&&e.via!==void 0&&e.index?{js:`e.read(e.ix(e.mem[${X(e.via,4)}] | e.mem[${X(e.via+1,4)}] << 8, e.${e.index}))`,io:!0}:t&&e.index&&!e.zp?{js:n.io?`e.read(e.ix(${X(e.at,4)}, e.${e.index}))`:`e.mem[e.ix(${X(e.at,4)}, e.${e.index})]`,io:n.io}:{js:n.io?`e.read(${n.js})`:`e.mem[${n.js}]`,io:n.io}}function bo(s,t){let e=Z(s);if(e.reg)return{js:`e.${e.reg} = ${t}`};let n=ws(e);return{js:n.io?`e.write(${n.js}, ${t})`:`e.mem[${n.js}] = ${t}`,io:n.io}}function $i(s){let t=Z(s);if(t.reg)return{pre:"",read:"e."+t.reg,write:n=>`e.${t.reg} = ${n}`};let e=ws(t);return e.io?{pre:`const at = ${e.js}; `,read:"e.read(at)",write:n=>`e.write(at, ${n})`,io:!0}:{pre:"",read:`e.mem[${e.js}]`,write:n=>`e.mem[${e.js}] = ${n}`}}var vo={zero:"e.z",carry:"e.c",negative:"e.n",overflow:"e.v"},So={"==":"e.z","!=":"!e.z",">=":"e.c","<":"!e.c"};function Eo(s,t){let e=s.words,[n,i]=e,o=`s[${t}]`,c=(...f)=>({js:f.map(l=>l.js??l).join(""),kind:f.some(l=>l.io)?"io":"compute"});if(i==="="&&e.length===3){let f=$t(e[2]),l=Z(n);if(l.reg==="carry")return c("e.c = ",f," & 1;");if(l.reg)return c(`e.${l.reg} = e.flags(`,f,");");let m=bo(n,f.js);return{js:m.js+";",kind:f.io||m.io?"io":"compute"}}if(i==="+="||i==="-="){let f=$t(e[2]);if(e.length===3){let l=$i(n);return{js:`${l.pre}${l.write(`e.flags(${l.read} ${i[0]} ${f.js} & 0xff)`)};`,kind:l.io||f.io?"io":"compute"}}return{js:i==="+="?`e.add(${f.js});`:`e.sub(${f.js});`,kind:f.io?"io":"compute"}}if(i==="&="||i==="|="||i==="^="){let f=$t(e[2]);return c(`e.a = e.flags(e.a ${i[0]} `,f,");")}if(i==="<<="||i===">>="||i==="rotate"){let f=$i(n),l=i==="<<="||e[2]==="left";return{js:`${f.pre}${f.write(`e.shift(${f.read}, ${l}, ${i==="rotate"})`)};`,kind:f.io?"io":"compute"}}switch(n){case"if":{let f=e.at(-1),l=e.slice(1,-2);if(l.length===3&&/^[axy]$/.test(l[0])){let k=$t(l[2]);return{js:`e.compare(e.${l[0]}, ${k.js}); if (${So[l[1]]})`,kind:"branch",to:f,io:k.io}}let m=l[0]==="not",g=vo[m?l[1]:l[0]];if(!g)throw new Error(s.where+": no flag "+l.join(" "));return{js:`if (${m?"!":""}${g})`,kind:"branch",to:f}}case"goto":return e[1].startsWith("(")?{js:`return e.jumpThrough(${X(parseInt(e[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:e[1].startsWith("[")?{js:`return e.jumpTable(${X(parseInt(e[1].slice(2),16),4)}, e.${e[2][0]});`,kind:"end"}:{js:`return e.jump('${e[1]}', ${o});`,kind:"end"};case"call":return e[1].startsWith("(")?{js:`return e.callThrough(${X(parseInt(e[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:{js:`return e.call('${e[1]}', ${o});`,kind:"end"};case"return":return{js:`return e.ret(${o});`,kind:"end"};case"compare":return c(`e.compare(e.${e[1]}, `,$t(e[2]),");");case"test":return c("e.test(",$t(e[1]),");");case"push":return{js:`e.push(${e[1]==="a"});`,kind:"compute"};case"pull":return{js:`e.pull(${e[1]==="a"});`,kind:"compute"};case"asm":return e[1]==="RTI"?{js:`return e.ret(${o});`,kind:"end"}:{js:["TSX","TXS","CLV","SED","CLD","SEI","CLI"].includes(e[1])?`e.asm('${e[1]}');`:"",kind:"compute"}}let h=e.slice(1).map(f=>typeof f=="string"?`'${f}'`:`{ string: ${JSON.stringify(f.string)} }`).join(", ");return{js:`return e.routine('${n}', [${h}], ${o});`,kind:"routine"}}function $o(s,t,{io:e=[49152,49407]}={}){[xs,gs]=e;let{steps:n,labels:i,data:o}=Ct(s,t),c=n.map((m,g)=>Eo(m,g)),h=new Set([0,...Object.values(i)]);c.forEach((m,g)=>{(m.kind==="routine"||m.kind==="io"||m.io)&&h.add(g),(m.kind!=="compute"&&m.kind!=="branch"||m.io)&&h.add(g+1)});let f=Object.fromEntries(Object.entries(i).map(([m,g])=>[g,m])),l=[];for(let m=0;m<n.length;m++){if(!h.has(m))continue;let g=m+1;for(;g<n.length&&!h.has(g);)g++;let k=c.slice(m,g).some(u=>u.kind==="branch"&&i[u.to]===m),y=[];for(let u=m;u<g;u++){if((u===m||c[u-1].kind==="branch")&&c[u].kind!=="routine"){let L=u;for(;L<g-1&&c[L].kind!=="branch";)L++;y.push(`e.time(s, ${u}, ${L});`)}let d=c[u],E=n[u].at===null?n[u].text:n[u].at.toString(16).toUpperCase().padStart(4,"0")+" "+n[u].text,v=d.js;if(d.kind==="branch"){let L=i[d.to],T=Ot(n[u]),I=T===1?"e.cycles++":`e.cycles += ${T}`;v+=L===void 0?` { ${I}; e.pc = e.label('${d.to}'); return; }`:L===m&&k?` { ${I}; continue; }`:` { ${I}; e.pc = ${L}; return; }`}d.kind==="end"&&(v=`e.pc = ${u+1}; `+v),y.push(v?`${v.padEnd(48)} // ${E}`:`// ${E}`)}c[g-1].kind!=="end"&&c[g-1].kind!=="routine"&&g!==m+1&&y.push(`e.pc = ${g};`);let w=f[m]?` // ${f[m]}
|
|
23
|
+
`:"",O=y.length===1&&/^return (.*?);( +\/\/ .*)$/.exec(y[0]);if(O){l.push(`${w} ${`${m}: (e, s) => ${O[1]},`.padEnd(60)}${O[2].trim()?" "+O[2].trim():""}`);continue}let a=k?["for (;;) {",...y.map(u=>" "+u)," break;","}"]:y;l.push(`${w} ${m}: (e, s) => {
|
|
24
|
+
${a.map(u=>" "+u).join(`
|
|
25
25
|
`)}
|
|
26
|
-
},`)}return[`// ${
|
|
27
|
-
[${
|
|
28
|
-
],`,` steps: [${n.map(
|
|
29
|
-
[${
|
|
30
|
-
],`," run: {",...
|
|
31
|
-
`)}
|
|
26
|
+
},`)}return[`// ${t}, compiled from ${t}.scene by moonbase-compile (@moonbase-machines/player/remake/compile.js): compiled`,"// again from the scene, never edited","export default {",` labels: ${JSON.stringify(i)},`,` data: [${o.map(m=>`
|
|
27
|
+
[${X(m.at,4)}, [${m.bytes.map(g=>X(g)).join(", ")}]],`).join("")}
|
|
28
|
+
],`,` steps: [${n.map(m=>`
|
|
29
|
+
[${m.at===null?"null":X(m.at,4)}, ${+m.where.split(":").at(-1)}, ${JSON.stringify(m.text)}],`).join("")}
|
|
30
|
+
],`," run: {",...l," },","};",""].join(`
|
|
31
|
+
`)}xe();yt();Dt();Ne();oe();ke();be();Yt();te();is();export{Mn as audio,Ei as diskDialogs,li as diskDisk,mi as diskLocal,xi as diskMemory,ts as enginesOriginal,he as enginesScenes,Rn as keys,vi as modal,In as parts,ci as play,wi as provider,ii as remakeC64View,vn as remakeCard,ti as remakeCardView,Gs as remakeCards,ji as remakeCompile,As as remakeEngine,Rs as remakeEvents,Ks as remakeLayout,yn as remakeLift,$n as remakeLoad,Is as remakeProblems,Ws as remakeRaster,bs as remakeScript,_s as remakeVector,Qn as remakeView,Tn as saves,hi as settings};
|
|
32
32
|
//# sourceMappingURL=moonbase-player.js.map
|