@moonbase-machines/player 0.12.0 → 0.13.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 +3 -1
- package/audio.js +11 -3
- package/data.js +16 -1
- package/dist/moonbase-player.js +20 -14
- package/dist/moonbase-player.js.map +4 -4
- package/engines/original.js +35 -24
- package/engines/scenes.js +5 -1
- package/keys.js +18 -0
- package/package.json +6 -6
- package/play.js +11 -2
- package/test/play.test.js +20 -1
package/dist/moonbase-player.js
CHANGED
|
@@ -1,32 +1,38 @@
|
|
|
1
|
-
/*! @moonbase-machines/player 0.
|
|
2
|
-
var
|
|
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(
|
|
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
|
|
1
|
+
/*! @moonbase-machines/player 0.13.0: MIT, (c) 2026 Mark Wharton (its LICENSE) */
|
|
2
|
+
var Ii=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 W=(s,t)=>{for(var e in t)Ii(s,e,{get:t[e],enumerable:!0})};var $s={};W($s,{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(y=>parseInt(y,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?Ni(t[3]):0)+2&65535;return/^L[0-9A-F]{4}$/.test(t.at(-1))&&(e&65280)!==(n&65280)?2:1}var Mi,Vt,Ni,Yt=B(()=>{Mi=/"(?:[^"\\]|\\.)*"|\S+/g;Vt=s=>s.match(Mi).map(t=>t.startsWith('"')?{string:JSON.parse(t)}:t);Ni=s=>/^\d+$/.test(s)||/^\$[0-9A-F]{2}(\[[xy]\])?$/i.test(s)||/^\(\$/.test(s)?2:3});import{cpu as Pi}from"@moonbase-machines/mos6502";var Mo,ge,js=B(()=>{({CPU:Mo,CYCLES:ge}=Pi)});var Is={};W(Is,{Engine:()=>Lt,label16:()=>At});function Ls(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 Cs,Di,Os,As,Ui,Ts,Rs,At,Lt,we=B(()=>{Yt();js();Cs={left:!0},Di=new Set(["if","goto","call","return","compare","test","asm","push","pull"]),Os=s=>Di.has(s.words[0])||/^(=|\+=|-=|&=|\|=|\^=|<<=|>>=|rotate)$/.test(s.words[1]),As=1020.484;Ui=new Set([234,169,162,160,165,166,164,173,174,172,24,56]),Ts=s=>s.words[0]==="if"&&s.words.length===6,Rs=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),Cs}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/As}cost(t,e){let n=t[e],i=this.mem;if(n.at===null)return 0;let o=ge[i[n.at]]+(Ts(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+Ls(i[c.at])+(Ts(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&&Ui.has(i[l]);l+=Ls(i[l]))f+=ge[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:Rs(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:Rs(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&&Os(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:!Os(t))&&(this.pc=e,this.visiting!==void 0)){this.startVisit(e);return}return n}catch(n){if(n===Cs){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/As}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 Ps={};W(Ps,{GIVES:()=>gt,POLLS:()=>Bi,TAKES:()=>pt,WAITS:()=>zi,describe:()=>G,nothing:()=>ye,result:()=>st});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)),Ns[s]&&i)for(let[f,l]of Object.entries(Ns[s]))c[f]=i(l);if(Ms[s]&&o)for(let[f,l]of Object.entries(Ms[s]))c[f]=o(l);return n!==void 0&&(c.words=n),c}function st(s,t){let e={result:s};for(let n of gt[s])e[n]=t[n];return e}var pt,Ms,Ns,gt,ye,Bi,zi,kt=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"},Ms={colour:{shape:3605},"card-frame":{x:16504,high:16505,y:16506,width:16507,height:16508}},Ns={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"},ye=(s,t)=>s==="beep"&&t===0,Bi=new Set(["read-key","blink-key"]),zi=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 Ds={};W(Ds,{helpers:()=>ke});function ke(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 be=B(()=>{kt()});import{objects as qi}from"@moonbase-machines/vector";var Us,zo,Bs,Jt,_t=B(()=>{({carry:Us,decode:zo,put:Bs,tables:Jt}=qi)});var zs={};W(zs,{pictures:()=>Tt,shapes:()=>Ki,windows:()=>Wi});import{pictures as Fi}from"@moonbase-machines/vector";var Tt,Ki,Wi,Xt=B(()=>{({pictures:Tt,shapes:Ki,windows:Wi}=Fi)});import{font as Hi}from"@moonbase-machines/vector";var Wo,Ho,Gt,qs,Fs,rt,Rt=B(()=>{({GLYPHS:Wo,WIDTHS:Ho,dots:Gt,start:qs,useFont:Fs,width:rt}=Hi)});import{draw as Vi}from"@moonbase-machines/vector";var Jo,Ks,_o,Xo,Ws,Go,ve,Zo,Qo,Hs=B(()=>{({crossings:Jo,draw:Ks,fill:_o,inside:Xo,line:Ws,outline:Go,screen:ve,spans:Zo,under:Qo}=Vi)});var Ys={};W(Ys,{LAYOUT:()=>wt,PANELS:()=>It,layout:()=>Mt,resolve:()=>bt,textLayout:()=>Nt,textPage:()=>yt,textPen:()=>Pt,word:()=>Vs});function Vs(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 y=qs(c.map(w=>w.ch),e.spacing,e.x,e.centre),b=[];for(let w of c){let O=rt(w.ch);b.push({ch:w.ch,x:y,ink:w.ink}),y+=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:b}),e.x=y}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 y=s[g];if(y===`
|
|
4
|
+
`){l(!0);continue}if(y==="{"){let b=s.indexOf("}",g),[w,O]=s.slice(g+1,b).split(":"),a=(O??"").split(",").map(u=>parseInt(u,16));switch(g=b,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(y)}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(y=>parseInt(y,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 y=0;y<(g[1]||256);y++)o(String.fromCharCode(g[0]&127));break}continue}o(h)}return i(!1),e}var wt,ot,lt,It,bt,Pt,yt,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)=>Vs(t,n.split(",").map(i=>parseInt(i,16))));Pt=()=>({x:0,y:0,margin:0,centre:!1,inverse:!1}),yt=()=>Array.from({length:24},()=>Array.from({length:40},()=>({ch:" ",inverse:!1})))});var Js={};W(Js,{Raster:()=>Ut});var Ut,Se=B(()=>{Hs();_t();Rt();Dt();Ut=class{constructor(){this.dots=ve(15),this.kept=null}keepScreen(){this.screenKept={dots:this.dots,kept:this.kept},this.dots=ve(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){Ks(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 Ws(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)))}),Bs(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=rt(t);if(t.charCodeAt(0)<32){for(let g=0;g<Math.min(9,h);g++)for(let y=0;y<l;y++)for(let b=0;b<c;b++)this.set(e+y,n+g*c+b,o);return l}let m=new Set(Gt(t).map(([g,y])=>g+","+y));for(let g=0;g<Math.min(9,h);g++)for(let y=0;y<l+f;y++)for(let b=0;b<c;b++)this.set(e+y,n+g*c+b,m.has(y+","+g)?i:o);return l}}});import{mli as Yi}from"@moonbase-machines/apple2e";var _s,Ee,Zt,$e=B(()=>{({BLOCK:_s,CLOCK:Ee,Files:Zt}=Yi)});var Qs={};W(Qs,{codeFiles:()=>Bt,pictureShapes:()=>Ji,vectorRoutines:()=>je});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===nt.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 Xs(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 Gs(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 Zs(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 je(s){let t=s.map.vars,e=a=>t.zero+a;Fs(s.font);let n=a=>{if(a.a<2)return;let u=Gs(s)?.get(a.objectTable)?.find(d=>d.number===a.a);u&&(a.c=Us(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:yt()};let c=(a,u)=>Gs(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=rt(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 A=u.top;A<u.top+u.rows;A++)i.span(d,u.left,u.right,A);u.caps.forEach(([A,L,M],j)=>{(!a||a===j+1)&&(o.x=A,o.y=L,f(String.fromCharCode(M&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 A=c(a,u);A&&i.object(A,d,E,v)};s.model={raster:i,pen:o,cap:f,keyPanel:l,print:m,put:g};let y=(a,u)=>(d,E,v)=>{let{fixed:A,rest:L}=dt(d,a,E),M=L.map(j=>typeof j=="object"?j.string:j).join(" ");d.emit(G(a,A,d,L.length?M:void 0,j=>d.mem[e(j)])),L=L.map(j=>typeof j=="object"?j.string:j),u?.(d,A,L)},b=!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 A=[nt.left,nt.right,nt.down,nt.up];v===128&&u.waitingOn!==E&&l(0);let L=Qt(u,E,a,[],void 0,M=>{if(a==="ask-escape"&&M===nt.escape)return u.a=u.flags(27),u.x=155,u.c=1,u.asked=null,!0;if(u.asked===null){let j=-1,$=M;return v===128?(j=A.indexOf(M),$=219+j,j>=0&&l(j+1)):v>=177&&v<186?M>=49&&M<=(v&127)&&(j=M-49):($=M&95,$>=65&&$<=(v&95&127)&&(j=$-65,$|=128)),j>=0&&(u.asked={place:j,key:$},a==="ask-mode"&&Xs(u,u.askHooks?.chose?.(j))),!1}return M===nt.return?(u.x=u.asked.place,u.y=2*u.x,u.a=u.asked.key,u.c=b&&u.a>=193?1:0,!0):((M===nt.delete||M===nt.left)&&(a==="ask-mode"&&Xs(u,u.askHooks?.undo?.(u.asked.place)),v===128&&l(0),u.asked=null),!1)});return L!=="wait"&&(u.mem[t.layout]=34,u.emit(st(a,u))),L},O={show:y("show",a=>{s.text.showing=!1,a.mem[49181]=128}),"text-screen":a=>{Object.assign(s.text,{showing:!0,page:yt()}),a.mem[49181]=0,a.inside++,a.emit({step:"text-screen"}),a.inside--},picture:y("picture",(a,u,[d])=>{let E=Zs(s)?.get(d.toUpperCase().replace(/_/g," "));E&&i.picture(E)}),box:y("box",a=>i.box(a.mem[t.layout],a.a,a.x,a.y)),panel:y("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,A)=>"{"+v+":"+A.split(",").map(L=>L.startsWith("$")?a.mem[parseInt(L.slice(1),16)].toString(16):L).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:y("objects",a=>{a.objectTable=a.x|a.y<<8}),object:y("object",a=>{h(a,"whole"),n(a)}),"object-keep":y("object-keep",a=>{h(a,"keep"),n(a)}),"object-mode":y("object-mode",a=>h(a,"clear")),"key-at":y("key-at",a=>{o.x=a.x,o.y=a.y,f(String.fromCharCode(a.a&127))}),key:y("key",a=>f(String.fromCharCode(a.a&127))),"white-lines":y("white-lines",a=>i.whiteLines(a.y)),"fill-rows":y("fill-rows",a=>i.rows(a.a,a.x,a.y,a.c)),span:y("span",a=>i.span(a.a,a.x,a.y,a.mem[e(2)])),dot:y("dot",a=>{i.set(a.x,a.y,a.a),a.a=a.x%7<<4|a.a&15}),line:y("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:y("rectangle",a=>i.rectangle(a.a,a.x,a.y,a.mem[e(14)]+1,a.mem[e(15)])),"rectangle-outline":y("rectangle-outline",a=>i.outline(a.a,a.x,a.y,a.mem[e(14)]+1,a.mem[e(15)]+1)),flash:y("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(st("read-dot",a))},"key-panel":y("key-panel",a=>l(a.a)),"keep-span":y("keep-span"),"put-span":y("put-span"),"invert-span":y("invert-span"),button:y("button"),beep:(a,u)=>{dt(a,"beep",u),ye("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,A,L]=u.map(Number);for(let M=A;M>=v;M--)for(let j=d;j<=E;j++)i.set(j,M+L,i.get(j,M));a.inside++,a.emit({step:"shift-down",left:d,right:E,top:v,bottom:A,by:L}),a.inside--},part:y("part"),wait:(a,u,d)=>Qt(a,d,"wait",[],void 0,E=>E===nt.space&&(a.a=32,a.c=0,!0)),"wait-erase":(a,u,d)=>Qt(a,d,"wait-erase",[],void 0,E=>E===nt.space),"wait-or-escape":(a,u,d)=>{let E=Qt(a,d,"wait-or-escape",[],void 0,v=>(v===nt.space||v===nt.escape)&&(a.c=v===nt.escape?1:0,a.a=v,!0));return E!=="wait"&&a.emit(st("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:A}=s.map.seed;a.mem[A]===255&&s.seed!==void 0&&(a.mem[v]=s.seed&255,a.mem[v+1]=s.seed>>8);let L=a.mem[v]|a.mem[v+1]<<8;L=L*259&65535,a.mem[v]=L&255,a.mem[v+1]=L>>8,a.mem[A]=E;let M=E?Math.floor(65535/E):65535;a.a=Math.floor(L/M)&255,a.c=0,a.emit(st("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(st("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(st("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(A=>A.name==="PROB"+a.a);v&&a.mem.set(v.bytes,v.origin),a.problem=E(ke(a,O))}if(!a.problem.next().done)return"wait";a.problem=null,a.c=0,a.mem[t.repeats]=a.repeats,a.emit(st("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===nt.menu&&s.menu&&a.leave(...s.menu),a.a=a.flags(E&127),a.c=E===nt.escape?1:0,a.emit(st("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 nt,Ji,te=B(()=>{kt();be();_t();Xt();Rt();Se();$e();Dt();nt={escape:27,space:32,return:13,delete:127,left:8,right:21,down:10,up:11,menu:5};Ji=(s,t)=>Zs(s)?.get(t.toUpperCase().replace(/_/g," "))});var en={};W(en,{INLINE:()=>ut,KERNAL:()=>_i,section:()=>tn,sectionName:()=>Oe});function tn(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 Oe(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=tn(s,t,o);if(c.length&&c.mark===n)return e+":"+o}return e}var Ce,ut,_i,Ae=B(()=>{Ce=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:Ce(7),copy:Ce(8),prodos:Ce(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}}};_i={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 Xi}from"@moonbase-machines/apple2e";var sn,nn=B(()=>{({install:sn}=Xi)});import{kernal as Gi}from"@moonbase-machines/c64";var ee,rn,on,an,cn,ln,ya,Le=B(()=>{({KEY_TABLES:ee,VECTORS:rn,VIC:on,install:an,kernalByte:cn,matrixOf:ln,screenCode:ya}=Gi)});import{drive as Zi}from"@moonbase-machines/c64";var se,Te=B(()=>{({Drive:se}=Zi)});var fn={};W(fn,{Printer:()=>Re,WIDTH:()=>tr,bus:()=>Ie,paper:()=>er});import{printer as Qi}from"@moonbase-machines/c64";var Re,tr,Ie,er,Me=B(()=>{({Printer:Re,WIDTH:tr,bus:Ie,paper:er}=Qi)});import{basic as sr}from"@moonbase-machines/c64";var hn,pn=B(()=>{({Basic:hn}=sr)});import{numbers as nr}from"@moonbase-machines/c64";var dn,Ca,Oa,Aa,La,Ta,Ra,Ia,Ma,un=B(()=>{({BasicError:dn,ERRORS:Ca,fail:Oa,fout:Aa,int16:La,nextRandom:Ta,scanNumber:Ra,seedRandom:Ia,val:Ma}=nr)});import{basicRom as ir}from"@moonbase-machines/c64";var Da,mn,xn,gn=B(()=>{({evaluateInMemory:Da,install:mn,printError:xn}=ir)});import{disasm as rr}from"@moonbase-machines/mos6502";var wn,yn,za,ht,kn,bn=B(()=>{({OPS:wn,SIZE:yn,disassemble:za,hex:ht,operand:kn}=rr)});import{inline as or}from"@moonbase-machines/vector";var vn,Ka,Wa,Ha,Sn=B(()=>{({INLINE:vn,name:Ka,sound:Wa,text:Ha}=or)});var En={};W(En,{lift:()=>Ne,readers:()=>ne,script:()=>Pe});function Ne(s,t,e,n,i=new Set,o=ar){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=wn[s[u]];if(d.name==="???"){h.set(O,{line:".byte $"+ht(s[u],2)+" ; not an instruction",end:O+1});break}let E=yn[d.mode],v=s[u+1]|s[u+2]<<8,A=s.subarray(u,u+E),L=(d.name+" "+kn(d.mode,A,O)).trim(),M=O+E,j=!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],C=c[$]?.(s,M-t),R=["A","X","Y"].map(T=>a[T]===void 0?"":T+"="+a[T]).filter(Boolean).join(" ");L=$+(C?" "+C.words:"")+(R&&!C?" ; "+R:""),C&&(M+=C.length);for(let T in a)delete a[T]}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)):L+=" ; into PART0"+(n[v]?", "+n[v]:""),j=!0;else if(d.name==="JMP"||d.name==="RTS"||d.name==="RTI"||d.name==="BRK")j=!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 C=[];for(let R=v-t;R+1<s.length&&C.length<64&&!(C.length&&i.has(t+R));R+=2){let T=s[R]|s[R+1]<<8;if(!g(T))break;C.push(T)}L+=" ; a table of "+C.length+" addresses";for(let R of C)f.add(R),m.push(R);break}h.set(O,{line:L,end:M,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:j});for(let $=O+1;$<M;$++)l.add($);if(j)break;O=M}}let y=[],b=null;for(let O of[...h.keys()].sort((a,u)=>a-u))b!==null&&O!==b&&y.push(""),f.has(O)&&y.push("L"+ht(O,4)+":"),y.push(ht(O,4)+" "+h.get(O).line),b=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:y.join(`
|
|
6
|
+
`),left:w,reached:l.size,size:s.length,lines:h,targets:f}}function Pe({lines:s,targets:t,left:e},n,i,{stops:o=new Set,selfModified:c=!1,memory:h=!1,moved:f=[]}={}){let l=(j,$=4)=>"$"+ht(j,$),m=new Set(f);if(c)for(let j of s.values())/^(STA|STX|STY|INC|DEC|ASL|LSR|ROL|ROR)$/.test(j.op)&&/^(abs|abx|aby)$/.test(j.mode)&&m.add(j.value);let g=null,y=()=>g!==null&&(h||m.has(g+1)||m.has(g+2)),b=j=>{let $=j.value;if(y()&&j.mode==="imm"&&(h||m.has(g+1)))return l(g+1);if(y()&&/^(abs|abx|aby)$/.test(j.mode))return"["+l(g+1)+"]"+(j.mode==="abs"?"":"["+j.mode.at(-1)+"]");switch(j.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=j=>"L"+ht(j,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=(j,$)=>j+2+($.value<<24>>24)&65535,d=[...s.keys()].sort((j,$)=>j-$),E=[],v=j=>["JMP","RTS","RTI"].includes(j.op);t=new Set(t),d.forEach((j,$)=>{let C=s.get(j);C.op&&!v(C)&&$+1<d.length&&C.end!==d[$+1]&&s.has(C.end)&&t.add(C.end)});let A=[],L=()=>{for(let[j,$,C]of A)E.push(ht(j,4)+" "+$+" = "+C);A=[]},M=null;for(let j=0;j<d.length;j++){let $=d[j],C=s.get($),R=s.get(d[j+1]),T=F=>E.push(ht($,4)+" "+F);if(g=$,M&&M.op&&!v(M)&&M.end!==$&&s.has(M.end)&&(L(),E.push(ht(M.pc,4)+" goto "+w(M.end))),M={...C,pc:d[j]},t.has($)&&(L(),E.push(w($)+":")),!C.op){L(),T("asm "+C.line);continue}let z=C.op.at(-1).toLowerCase();if(C.call){let[F,...X]=C.call.name.split(" "),q=pt[F]||"",D=Object.fromEntries(A.map(([,it,xt])=>[it,xt]));A=A.filter(([,it])=>!q.includes(it)),L();let Q=[...X,...[...q].map(it=>D[it]??it)];F==="objects"&&D.x!==void 0&&D.y!==void 0&&Q.splice(X.length,2,l(D.x|D.y<<8)),(F==="key-at"||F==="key")&&(Q[0]=D.a!==void 0?JSON.stringify(String.fromCharCode(D.a&127)):Q[0]),T([F,...Q,C.call.words??""].join(" ").trim());continue}switch(C.op){case"LDA":case"LDX":case"LDY":if(C.mode==="imm"&&!y()){A=A.filter(([,F])=>F!==z),A.push([$,z,C.value]);break}if(C.mode==="aby"||C.mode==="abx"){let[F,X,q,D]=[1,2,3,4].map(K=>s.get(d[j+K]));if(F?.op==="STA"&&X?.op==="LDA"&&X.value===C.value+1&&q?.op==="STA"&&D?.op==="JMP"&&F.value===d[j+4]+1&&q.value===d[j+4]+2){L(),T("goto ["+l(C.value)+" "+C.mode.at(-1)+"]"),j+=4,M=null;break}}L(),T(z+" = "+b(C));break;case"STA":case"STX":case"STY":L(),T(b(C)+" = "+z);break;case"TAX":case"TAY":case"TXA":case"TYA":L(),T(C.op[2].toLowerCase()+" = "+C.op[1].toLowerCase());break;case"INX":case"INY":case"DEX":case"DEY":L(),T(z+(C.op[0]==="I"?" += 1":" -= 1"));break;case"INC":case"DEC":L(),T(b(C)+(C.op==="INC"?" += 1":" -= 1"));break;case"CLC":case"SEC":L(),T("carry = "+(C.op==="SEC"?1:0));break;case"ADC":L(),T("a += "+b(C)+" + carry");break;case"SBC":L(),T("a -= "+b(C)+" + borrow");break;case"AND":L(),T("a &= "+b(C));break;case"ORA":L(),T("a |= "+b(C));break;case"EOR":L(),T("a ^= "+b(C));break;case"ASL":case"LSR":case"ROL":case"ROR":L(),T(b(C)+" "+{ASL:"<<= 1",LSR:">>= 1",ROL:"rotate left",ROR:"rotate right"}[C.op]);break;case"BIT":L(),T("test "+b(C));break;case"CMP":case"CPX":case"CPY":{L();let F=C.op==="CMP"?"a":C.op[2].toLowerCase();R&&a[R.op]&&!t.has(d[j+1])?(T("if "+F+" "+a[R.op]+" "+b(C)+" goto "+w(u(d[j+1],R))),j++,M={...R,pc:d[j]}):T("compare "+F+" "+b(C));break}case"JMP":if(L(),C.mode==="abs"&&y()){T("goto ("+l($+1)+")");break}T(C.mode==="abs"?C.value>=i&&C.value<i+n.length?"goto "+w(C.value):"goto-engine "+l(C.value):"goto ("+l(C.value)+")");break;case"JSR":if(L(),y()){T("call ("+l($+1)+")");break}T(C.value>=i&&C.value<i+n.length?"call "+w(C.value):"call-engine "+l(C.value));break;case"RTS":L(),T("return");break;case"PHA":case"PLA":case"PHP":case"PLP":L(),T({PHA:"push a",PLA:"pull a",PHP:"push flags",PLP:"pull flags"}[C.op]);break;case"NOP":break;default:if(O[C.op]){L(),T("if "+O[C.op]+" goto "+w(u($,C)));break}L(),T("asm "+C.line)}}L();for(let[j,$]of e){let C=0;for(;C<$&&!(C&&o.has(j+C))&&!o.has(j);)C++;if(!C)continue;let R=[];for(let T=0;T<C;T+=16)R.push("data "+l(j+T)+" "+Array.from(n.subarray(j-i+T,j-i+Math.min(C,T+16)),z=>ht(z,2)).join(" "));E.push("",...R)}return E.join(`
|
|
7
7
|
`)+`
|
|
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=`
|
|
8
|
+
`}var ne,ar,De=B(()=>{bn();Sn();kt();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}}])),ar=ne(vn)});var jn={};W(jn,{cardRoutines:()=>Ue});function $n(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 Ue(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 k=S&63;if(x===void 0&&(k===17||k===18))return r.raster=r.clock?Math.floor(r.cycles/63)%312:((r.raster??0)+1)%312,k===18?r.raster&255:f[17]&127|r.raster>>1&128;if(x===void 0&&k===25)return r.vicFlags??112;if(x===void 0)return f[k];if(f[k]=x,r.splitLine!==void 0&&k!==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(k,x)}k===26&&!(x&1)&&s.splits?.clear();return}if(S<2048){let k=1024|S&31;if(x===void 0)return f[k];f[k]=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 k=S&15;if(x===void 0)return l[k]?l[k](s.seed??17):k<2?255:k===13?0:f[3072|k];f[3072|k]=x;return}if(x===void 0)return f[S];if(f[S]=x,(S&15)===0&&r.splitLine!==void 0){let k=r.clock?r.clock.splits??=new Map:s.splits??=new Map;(k.get(r.splitLine)??k.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 y(r,p,x){if(e&&p>=57344){if(x===void 0)return cn(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 b=null,w={hooks:new Map,cycles:0,a:0,x:0,y:0,z:0,c:0,n:0,v:0,read:r=>b.mem[r],write:(r,p)=>{b.mem[r]=p&255},nz(r){this.n=r>>7&1,this.z=r?0:1}},O=0;e?an({cpu:w,read:r=>b.read(r),write:(r,p)=>b.write(r,p),drive:s.bus??=Ie(s.drive??=new se(Uint8Array.from(atob(s.disk.image),r=>r.charCodeAt(0))),s.printer??=new Re({on:!1})),held:()=>{let r=b?.clock?.held;return r?.up&&(b.clock.held=null),r&&(r.seen=!0),r??null},call:r=>{I(b,r,"the keyboard read"),Object.assign(w,{a:b.a,x:b.x,y:b.y,c:b.c,z:b.z,n:b.n,v:b.v})},loaded:(r,p,x)=>{(s.files64??=[]).push({name:r,from:p,to:x});let S=s.fileScripts?.[r];if(S){let k={script:S,from:p,to:x};u.splice(0,1/0,...u.filter(N=>N.from<k.from||N.to>k.to),k)}}}):sn({cpu:w,game:s.disk,sw:{lcRead:0},io:r=>y(b,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=>b.clicks.push(b.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));b=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,k=x(w);if(k==="wait")return"wait";if(r.delay+=(w.cycles-S+6)/Ee*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}),k==="return")return k;if(k===!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 k of Object.keys(S.labels))if(/^L[0-9A-F]{4}$/.test(k)){let N=parseInt(k.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),k=(s.fileScripts?.[x.name]??x.name)+"@"+ct(p),N=Ne(S,x.from,[p],t.routines,new Set,ne(ut));return r.sources[k]=Pe(N,S,x.from,{selfModified:!0}),d=null,u.push({script:k,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)`),k},A=new Set(Object.values(s.fileScripts??{})),L=(r,p)=>e?r.filter(x=>!A.has(x)||u.some(S=>S.script===x&&S.from<=p&&p<=S.to)):r,M=(r,p)=>{let x=L(E(r,p),p);!x.length&&e&&v(r,p)&&(x=L(E(r,p),p));let S=u.findLast(N=>x.includes(N.script)&&N.from<=p&&p<=N.to),k=x.length>1?S?.script:x[0];if(!k)throw new Error("no script has $"+ct(p));return[k,"L"+ct(p)]},j=(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,C=(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)},T=new Set(["town","restart","escape"]),z=(r,p,x,S)=>{if(p?.at==null)return S.map(N=>parseInt(N,16));let k=[];for(let N=0;N<x;N++)k.push(r.mem[p.at+3+N&65535]);return k},F=r=>r.map(p=>p.toString(16)).join(" "),X=r=>(t.unplaced?.includes(r.step)&&(delete r.x,delete r.y),r),q={chrout:[806,61898],chrin:[804,61783],getin:[810,61758],save:[818,62957]},D=(r,p)=>(x,S,k)=>{$n(x,r,S),C(x,X(G(r,[],x,void 0,void 0,H=>x.mem[H])),$(k));let N=e&&q[r],U=N&&x.mem[N[0]]|x.mem[N[0]+1]<<8;if(N&&U!==N[1]){let[H,tt]=M(x,U);x.callInside(H,tt,et=>{gt[r]&&et.emit(st(r,{a:et.a,x:et.x,y:et.y,c:et.c}))},k?.at==null?void 0:k.at+2&65535);return}let P=a(x,p);if(P==="wait")return"wait";if(P?.to!==void 0)return x.stackPage(),x.stack.push({name:x.name,pc:x.pc,inside:!0,ret:k?.at==null?void 0:k.at+2&65535}),x.inside++,K["goto-engine"](x,["$"+ct(P.to)],k);gt[r]&&e&&x.emit(st(r,{a:x.a,x:x.x,y:x.y,c:x.c}))},K={prodos:(r,p,x)=>{let S=z(r,x,3,p),[k,N,U]=S,P=N|U<<8;C(r,G("prodos",[],r,F(S)),$(x));let H={read:et=>r.mem[et],write:(et,ft)=>{r.mem[et]=ft&255}};if(k===202){let et=r.mem[P+1],ft=n.open.get(et),J=r.mem[P+2]|r.mem[P+3]<<8,xe=ft?Math.min(r.mem[P+4]|r.mem[P+5]<<8,ft.f.body.length-ft.at):0,Ss=ft&&s.fileScripts?.[Oe(t,jt=>r.mem[jt],ft.f.path,ft.at)];if(Ss&&xe){let jt={script:Ss,from:J,to:J+xe-1};u.splice(0,1/0,...u.filter(Es=>Es.from<jt.from||Es.to>jt.to),jt)}r.delay+=Math.ceil(xe/512)*_s/Ee*1e3}let tt=n.call(k,P,H);r.cycles+=6,tt===null&&(tt=1),r.a=tt==="quit"?0:tt,r.c=r.a?1:0,r.z=r.a?0:1,tt==="quit"&&(r.ended=!0)},stirred:r=>{for(let p of t.stir.counts)r.mem[p]=s.seed&255},hposn:D("hposn",62481),hlin:D("hlin",62778),hcolor:D("hcolor",63216),"clear-page":D("clear-page",62452),pause:D("pause",64680),home:D("home",64600),outport:D("outport",65173),"call-engine":(r,[p],x)=>{let S=parseInt(p.slice(1),16);if(j(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[k,N]=M(r,S);r.stack.push({name:r.name,pc:r.pc,ret:x?.at==null?void 0:x.at+2&65535}),r.enter(k,N)},"goto-engine":(r,[p],x)=>{let S=parseInt(p.slice(1),16),k=t.routines[S];if(k){if(T.has(k))return K[k](r,[],x);let N=e&&r.stack.at(-1)?.rom;N&&r.inside++;let U;try{U=K[k](r,[],x)}finally{N&&r.inside--}let P=r.stack.at(-1);if(P?.inside){let H=P.done;P.done=tt=>{H?.(tt),R(tt)}}else R(r);return U}if(j(r,S)){if(a(r,S)==="wait")return"wait";e&&it.has(S)&&xt(r),R(r);return}if(!e&&r.mem[S]===76&&!E(r,S).length)return K["goto-engine"](r,["$"+ct(r.mem[S+1]|r.mem[S+2]<<8)],x);r.enter(...M(r,S))}};e&&s.basic&&(K.sys=(r,p,x,S)=>{r.mem[122]=x&255,r.mem[123]=x>>8;let k=r.mem;Object.assign(r,{a:k[780],x:k[781],y:k[782],c:k[783]&1,z:k[783]>>1&1,n:k[783]>>7});let N=H=>{k[780]=H.a,k[781]=H.x,k[782]=H.y,k[783]=H.c|H.z<<1|(H.i??0)<<2|(H.d??0)<<3|H.v<<6|H.n<<7};if(j(r,p)){let H=a(r,p);return N(r),H}let[U,P]=M(r,p);r.stack.push({name:r.name,pc:r.pc,rom:!0,after:N}),r.enter(U,P)},K["basic-load"]=(r,[p,x=1,S=0])=>{let k=r.mem;for(let U=0;U<p.length;U++)k[512+U]=p.charCodeAt(U);Object.assign(k,{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){Q(r,N[0]),r.enter(N[0]);return}r.pc=0},mn({cpu:w,read:r=>b.read(r),write:(r,p)=>b.write(r,p),evaluate:r=>{let p=b.sources[b.basic.script]?.params?.[r];if(!p)throw new Error("no parameter compiled at $"+ct(r));let[x,S,k]=p;return{value:S(b.basic),end:x,place:k}}})),e&&s.basic&&(K.error=(r,p)=>!(p instanceof dn)||!r.basic?!1:(b=r,xn({cpu:w,write:(x,S)=>{r.mem[x]=S}},p.message,r.basic.at)));let Q=(r,p)=>{r.basic=new hn(r,s.basic[p]),r.basic.script=p};for(let[r,p]of Object.entries(t.routines).map(([x,S])=>[+x,S]))!K[p]&&r>=53248&&(K[p]=D(p,r)),!(K[p]||r>=48896)&&(K[p]=(x,S,k)=>{if($n(x,p,S),T.has(p)&&x.inside){for(let J of x.stack)J.inside&&(delete J.inside,delete J.done);x.inside=0}let N=k?.at!=null?x.mem[k.at+1&65535]|x.mem[k.at+2&65535]<<8:null,U=$(k),P=t.routines[N]===p?N:parseInt(Object.entries(t.routines).find(([,J])=>J===p)[0]);p==="read-key"&&(x.mem[t.seed]=s.seed&255,x.mem[t.seed+1]=s.seed>>8);let H=ut[p]&&k?.at!=null?ut[p](J=>x.mem[J&65535],k.at+3).value:void 0;C(x,G(p,[],{a:x.a,x:x.x,y:x.y,c:x.c},H,void 0,J=>x.mem[J]),U);let[tt,et]=M(x,P);if(p==="escape"&&k?.at!=null&&x.stack.push({name:x.name,pc:x.pc,ret:k.at+2&65535}),T.has(p)){x.enter(tt,et),x.entered=P;return}let ft=J=>{J.mem[t.seed]=s.seed&255,J.mem[t.seed+1]=s.seed>>8};x.callInside(tt,et,J=>{p==="read-key"&&ft(J),gt[p]&&!U&&J.emit(st(p,{a:J.a,x:J.x,y:J.y,c:J.c}))},k?.at==null?void 0:k.at+2&65535)});K.elsewhere=(r,p)=>{let x=parseInt(p.slice(1),16),S=u.findLast(k=>k.from<=x&&x<=k.to);return S!==void 0&&S.script!==r.name&&/^L[0-9A-F]{4}$/.test(p)},K.timed=!0,K.polls=t.polls,K.reads=t.reads,e&&(K.getin=r=>{!r.clock&&!r.i&&(K.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(st("getin",{a:p}))});let it=new Set([59953,60027,60030,60033]);K.poll=r=>{K.interrupt(r),f[26]&1&&K.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&&(K.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{j(r,x)?a(r,x):(r.i=1,I(r,x,"the interrupt routine",k=>k.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 I(r,p,x,S){let k=!1;r.callInside(...M(r,p),()=>{k=!0}),S?.(r);for(let N=0;!k;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 K.inline=(r,p)=>ut[p.words[0]]?ut[p.words[0]](x=>r.mem[x&65535],p.at+3).length:0,K.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),K.interrupt(r));let U=Math.floor(r.cycles/63)%312,P=r.clock.line??U,H=f[18]|(f[17]&128)<<1;r.clock.line=U,U<P&&(s.splits=r.clock.splits??new Map,r.clock.splits=new Map),f[26]&1&&(P<=U?P<H&&H<=U:H>P||H<=U)&&K.interrupt(r,!0)}let x=p.start??p.at,S=x!=null&&r.inside===0?t.routines[x]:void 0,k=r.entered===x;if(r.entered=null,S&&!k&&!$(p)){C(r,G(S,[],{a:r.a,x:r.x,y:r.y,c:r.c},void 0,void 0,P=>r.mem[P]));let U=r.stack.at(-1);U?.name!==void 0&&!U.inside&&(U.inside=!0,U.done=P=>{gt[S]&&P.emit(st(S,{a:P.a,x:P.x,y:P.y,c:P.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"}},K.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}),on.forEach((p,x)=>{f[x]=p}),f[3328]=151,rn.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,k=>k.charCodeAt(0))).raw;r.mem.set(S.subarray(2),x)}r.io=(p,x)=>y(r,p,x),s.basic&&(Object.assign(r.mem,{205:2,206:32,207:0,647:254}),Q(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)=>y(r,p,x)},K}var ct,Be=B(()=>{kt();Ae();$e();nn();Le();Te();Me();pn();un();gn();De();ct=s=>s.toString(16).toUpperCase().padStart(4,"0")});var Cn={};W(Cn,{blank:()=>lr,placed:()=>fr,started:()=>ze,units:()=>hr});import{prodos as cr}from"@moonbase-machines/apple2e";var lr,fr,ze,hr,qe=B(()=>{({blank:lr,placed:fr,started:ze,units:hr}=cr)});var An={};W(An,{loadTitle:()=>Fe,makeEngine:()=>Ke,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 Fe(s,{data:t,scenes:e=!1,fixed:n=!1}={}){s=new URL(s);let i=await re(s);if(!On[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 Ke(s,t){let e={...s.disk?.kind==="prodos"?ze(s.disk):{},...s.memory},n=new Lt({routines:On[s.engine](s),scripts:t,start:s.start,label:s.startLabel,memory:e});return n.title=s,n}var On,ie,oe=B(()=>{we();te();Be();qe();On={vector:je,card:Ue};ie=async s=>(await import(s.href)).default});var Dn={};W(Dn,{code:()=>Ve,named:()=>ae,typing:()=>Ye});function Ve(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?mr:ur)[s.key]??(s.key.length===1?(e?s.key.toUpperCase():s.key).charCodeAt(0):void 0)}function ae(s,t){if(t==="c64"&&s in He)return He[s];let e=Pn[s]??s.charCodeAt(0);return t==="c64"?xr[e]??e:e}function Ye(s,t){if(!Array.isArray(s)||!s.length)throw new Error("a demonstration is a list of steps, each { key } or { type }");return s.map(e=>{let[n,...i]=Object.keys(e??{});if(i.length||!["key","type"].includes(n)||typeof e[n]!="string"||!e[n])throw new Error("a step is { key: name } or { type: text }: "+JSON.stringify(e));if(n==="type")return t==="c64"?e.type.toUpperCase():e.type;if(e.key==="none"||!(e.key in Pn||t==="c64"&&e.key in He))throw new Error(`no key named ${e.key} for a ${t} game`);return String.fromCharCode(ae(e.key,t))}).join("")}var ur,mr,Pn,xr,He,ce=B(()=>{ur={ArrowLeft:8,ArrowRight:21,ArrowDown:10,ArrowUp:11,Enter:13,Backspace:127,Delete:127,Escape:27,Tab:9," ":32},mr={ArrowLeft:157,ArrowRight:29,ArrowDown:17,ArrowUp:145,Enter:13,Backspace:20,Delete:20,Escape:3," ":32},Pn={space:32,return:13,escape:27,delete:127,left:8,right:21,down:10,up:11,"control-e":5,"control-t":20,none:-1},xr={8:157,21:29,10:17,11:145,127:20,27:3},He={f1:133,f2:137,f3:134,f4:138,f5:135,f6:139,f7:136,f8:140,home:19,clr:147,inst:148,del:20,stop:3,pound:92,arrow:95}});var Bn={};W(Bn,{Speaker:()=>mt});var gr,mt,le=B(()=>{gr=`
|
|
9
9
|
class SpeakerProcessor extends AudioWorkletProcessor {
|
|
10
|
-
constructor() {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(); this.queue = []; this.at = 0; this.level = 0; this.queued = 0;
|
|
12
|
+
this.port.onmessage = e => {
|
|
13
|
+
this.queue.push(e.data); this.queued += e.data.length;
|
|
14
|
+
while (this.queued > sampleRate / 4 && this.queue.length > 1) { this.queued -= this.queue[0].length - this.at; this.queue.shift(); this.at = 0; }
|
|
15
|
+
};
|
|
16
|
+
}
|
|
11
17
|
process(inputs, outputs) {
|
|
12
18
|
const out = outputs[0][0];
|
|
13
19
|
for (let i = 0; i < out.length; i++) {
|
|
14
20
|
while (this.queue.length && this.at >= this.queue[0].length) { this.queue.shift(); this.at = 0; }
|
|
15
|
-
if (this.queue.length) this.level = this.queue[0][this.at++];
|
|
21
|
+
if (this.queue.length) { this.level = this.queue[0][this.at++]; this.queued--; }
|
|
16
22
|
out[i] = this.level;
|
|
17
23
|
}
|
|
18
24
|
return true;
|
|
19
25
|
}
|
|
20
26
|
}
|
|
21
27
|
registerProcessor('speaker', SpeakerProcessor);
|
|
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=
|
|
28
|
+
`,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([gr],{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])}}});import{pace as wr}from"@moonbase-machines/mos6502";var yc,Ge,zn=B(()=>{({HITCH:yc,pace:Ge}=wr)});var qn={};W(qn,{Machine:()=>kr});import{machine as yr}from"@moonbase-machines/apple2e";var kr,Fn=B(()=>{({Machine:kr}=yr)});var Kn={};W(Kn,{COLORS:()=>vr,colors:()=>Ze,paint:()=>Sr,paintHires:()=>Qe,paintText:()=>fe,rowStart:()=>Er,screen:()=>$r,textRow:()=>jr});import{screen as br}from"@moonbase-machines/apple2e";var vr,Ze,Sr,Qe,fe,Er,$r,jr,he=B(()=>{({COLORS:vr,colors:Ze,paint:Sr,paintHires:Qe,paintText:fe,rowStart:Er,screen:$r,textRow:jr}=br)});var Wn={};W(Wn,{bounds:()=>Or,document:()=>Ar,elements:()=>ts});import{svg as Cr}from"@moonbase-machines/vector";var Or,Ar,ts,es=B(()=>{({bounds:Or,document:Ar,elements:ts}=Cr)});var Hn={};W(Hn,{C64:()=>Tr});import{machine as Lr}from"@moonbase-machines/c64";var Tr,Vn=B(()=>{({C64:Tr}=Lr)});var Yn={};W(Yn,{keyboard:()=>Ir,pace:()=>Mr,painter:()=>Nr});import{browser as Rr}from"@moonbase-machines/c64";var Ir,Mr,Nr,Jn=B(()=>{({keyboard:Ir,pace:Mr,painter:Nr}=Rr)});var _n={};W(_n,{SID:()=>ss});import{sid as Pr}from"@moonbase-machines/c64";var ss,ns=B(()=>{({SID:ss}=Pr)});var Xn={};W(Xn,{ROM_CHOICES:()=>Ur,c64Roms:()=>Br,typed:()=>zr});import{start as Dr}from"@moonbase-machines/c64";var Ur,Br,zr,Gn=B(()=>{({ROM_CHOICES:Ur,c64Roms:Br,typed:zr}=Dr)});var Zn={};W(Zn,{SECTORS:()=>Fr,add:()=>Kr,make:()=>Wr,petsciiName:()=>Hr,read:()=>Vr});import{d64 as qr}from"@moonbase-machines/c64";var Fr,Kr,Wr,Hr,Vr,Qn=B(()=>{({SECTORS:Fr,add:Kr,make:Wr,petsciiName:Hr,read:Vr}=qr)});var is={};W(is,{play:()=>Jr});async function Jr(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"?Xr(s,{canvas:t,layer:n,speaker:new mt}):_r(s,{canvas:t,ctx:e,layer:n,speaker:new mt})}async function _r({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:y},{elements:b}]=await Promise.all([Promise.resolve().then(()=>(Fn(),qn)),Promise.resolve().then(()=>(qe(),Cn)),Promise.resolve().then(()=>(he(),Kn)),Promise.resolve().then(()=>(Xt(),zs)),Promise.resolve().then(()=>(es(),Wn))]),w=i(Yr),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 z=>[z,await e.image(z)])))))}catch{a=null}let d=new l(O,{log:(...z)=>console.log(...z),...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 A(){let z=(F,X)=>{t:for(let q=16384;q<32768-F.length;q++){for(let D=0;D<F.length;D++)if(F[D]!==null&&X[q+D]!==F[D])continue t;return q}return-1};for(let F of[d.aux,d.main]){let X=z([32,null,null,32,null,null,238,null,null,76],F),q=z([162,0,160,224,24,96],F),D=z([141,null,null,142,null,null,140,null,null,173,null,null,201,128,240],F);if(!(X<0||q<0||D<0)){d.cpu.hooks.set(X,K=>(K.read16(96)===57344&&(h.insertAdjacentHTML("beforeend",b(y(Q=>d.read(Q),57344),{background:v})),d.marking=1),!1)),d.cpu.hooks.set(q,()=>(d.marking=0,!1)),d.cpu.hooks.set(D,K=>(K.a!==128&&(v=K.a&15),h.innerHTML="",d.owner.fill(0),!1)),E=!0;return}}}let L=new Uint8ClampedArray(560*384*4),M=new ImageData(L,560,384),j=new Uint8Array(26880),$="",C=()=>{d.halted||d.runCycles(17030)};function R(){let z=`text ${d.sw.text} page2 ${d.sw.page2} hires ${d.sw.hires} dhires ${d.sw.dhires}`;z!==$&&(console.log("screen:",z,"at pc $"+d.cpu.pc.toString(16),"cycles",d.cpu.cycles),$=z),f.feed(T?d.clicks:[],d.cpu.cycles),d.clicks.length=0,E||A();let F=d.sw.text;g(d,L,{cols:j,owner:w.value&&h.innerHTML?d.owner:null}),c.putImageData(M,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."}o.addEventListener("pointerdown",()=>o.focus());let T=!0;return{run(){o.focus(),Ge(C,60,{after:R})},press(z){console.log("key",z,"at pc $"+d.cpu.pc.toString(16)),d.press(z)},start(){f.start()},sound(z){T=z},engine:d}}async function Xr(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:y},{SID:b},{c64Roms:w,typed:O},{add:a}]=await Promise.all([Promise.resolve().then(()=>(Vn(),Hn)),Promise.resolve().then(()=>(Jn(),Yn)),Promise.resolve().then(()=>(ns(),_n)),Promise.resolve().then(()=>(Gn(),Xn)),Promise.resolve().then(()=>(Qn(),Zn))]),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:(...q)=>console.log(...q),printer:l});o.drive(d.drive);let E=q=>Uint8Array.from(atob(q),D=>D.charCodeAt(0));for(let[q,D]of Object.entries(h??{}))d.drive.saved.set(q,E(D));e.style.display="none";let v=y(t),A=null,L=0,M=!0,j=null,$=()=>{j=null},C={keydown:[],keyup:[]},R=g(d,{log:!0,listen:(q,D)=>C[q].push(D)}),T=0,z=null,F=q=>{if(T=q,d.runFrame(),R.frame(),n.node&&M){z||(z=new b(n.rate));let D=Math.round(19656/985248*n.rate),K=d.cpu.cycles-19656,Q=z.render(D,d.sidWrites.map(([it,xt,I])=>[Math.floor((it-K)/19656*D),xt,I]));n.node.port.postMessage(Q,[Q.buffer])}d.sidWrites.length=0};function X(){T>=120&&A===null&&!L&&(A=O(d,i),L=1),j!==null&&d.joystick&&$(),d.ram[198]||(A!==null?(A=d.type(A),A.length||(A=null)):j!==null&&L&&(j=d.type(j),j.length||(j=null))),v(d.vic.frame),f.textContent=d.halted?"The game has stopped: "+d.halted+".":"Running."}return{run(){t.focus(),Ge(F,50,{after:X})},press(q){d.type(String.fromCharCode(q))},key(q){q.type==="keydown"&&!q.repeat&&$();for(let D of C[q.type])D(q)},demonstrate(q){j=Ye(q,"c64")},start(){n.start()},sound(q){M=q},engine:d,diskImage:()=>a(d.drive.image,[...d.drive.saved].map(([q,D])=>({name:q,data:D})))}}var Yr,rs=B(()=>{le();ce();zn();Yr={name:"vectors",type:"boolean",default:!1,owner:"person",words:"Draw the pictures as vectors"}});import{rom as Gr}from"@moonbase-machines/c64";var Ic,ti,ei=B(()=>{({install:Ic,standIn:ti}=Gr)});import{colors as Zr}from"@moonbase-machines/apple2e";var si,Pc,at,ni=B(()=>{({COLORS:si,NAMES:Pc,rgb:at}=Zr)});import{font as Qr}from"@moonbase-machines/charset";var os,ii=B(()=>{({FONT:os}=Qr)});var ri={};W(ri,{View:()=>qt});var to,V,Y,pe,eo,as,so,qt,cs=B(()=>{ni();Xt();_t();te();es();Rt();Dt();ii();he();to="http://www.w3.org/2000/svg",V=s=>s*4,Y=s=>s*2,pe='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',eo='ui-monospace, Menlo, Consolas, "Liberation Mono", monospace',as=["[","\\","]","^"],so={"[":"\u2190","\\":"\u2192","]":"\u2193","^":"\u2191"},qt=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 y of Tt(Uint8Array.from(atob(g.data),b=>b.charCodeAt(0))))this.pictures.set(y.name,y.shapes);let h=i.title.map;this.vars=h.vars;let f={...so,...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=yt(),this.rect(0,0,140,192,15,this.layer)}el(t,e={},n){let i=document.createElementNS(to,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=yt(),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=os[n.charCodeAt(0)-32]??os[0],g="";for(let y=0;y<5;y++)for(let b=0;b<7;b++)m[y]>>b&1&&(g+=`M${h+2+y*2} ${f+b*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":eo,"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=Ze(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,y)=>{let b="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:b},this.svg)),this.el("g",{"clip-path":`url(#${b})`},y)},h=(m,g)=>this.items.filter(y=>y!==o?.item&&y.top<=115&&y.bottom>=19&&y.left<=g&&y.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,y,b)=>{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(y-g)},this.el("clipPath",{id:w},this.svg)),this.el("g",{"clip-path":`url(#${w})`},b)},f=(g,y)=>this.items.filter(b=>b!==c?.item&&b.top<=y&&b.bottom>=g&&b.left<=e&&b.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 y of f(n,n+o-1))g.append(y.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=ts(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(b=>b.number===t);if(!f)return;let l=f.rows.map(b=>b.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 y=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,y,{covers:c,left:e,right:m}),o&&(this.kept=y),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,y)=>{let b=c.x+y,w=c.y+m;if(g!==void 0&&b>=t&&b<=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]=si[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=rt(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 y of f)g+=rt(y)+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":pe,"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(y=>y.ch.charCodeAt(0)>=32);if(c.length){let y=Math.min(...c.map(O=>O.x)),b=Math.max(...c.map(O=>O.x+rt(O.ch)))-1,w=Math.min(9,e.height??9)*(i?2:1);this.add(n,n+w-1,this.rect(y,n,b-y+1,w,e.paper,null),{left:y,right:b})}let h=this.el("g",{"font-family":pe,"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 y=this.el("text",{y:Y(n+(i?15:7)),"data-x":V(f.x),"data-width":V(f.width)},h);for(let b of f.chars){let w=this.el("tspan",{fill:at(b.ink??e.ink)},y);w.textContent=this.modern(b.ch)}f=null};for(let y of e.chars){if(y.ch.charCodeAt(0)<=32){g();continue}f??={x:y.x,width:0,chars:[]},f.chars.push(y),f.width=y.x+rt(y.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 y=rt(g.ch),b=g.ink??o;h!==void 0&&this.rect(n,i,y,9*l,h,t);let w=m.get(b)??"";for(let[O,a]of Gt(g.ch))w+=`M${V(n+O)} ${Y(i+a*l)}h4v${2*l}h-4z`;m.set(b,w),n+=y+1}for(let[g,y]of m)y&&this.el("path",{d:y,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":pe,"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+=rt(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+=rt(" ")+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":pe,"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)as.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(as[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(as[t.asked.place],[58,74,66,66][t.asked.place],[62,62,71,53][t.asked.place],this.prompt,!1)}}}}});var oi={};W(oi,{CardView:()=>Ft});function io(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 ro(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 no,Ft,ls=B(()=>{he();no="http://www.w3.org/2000/svg",Ft=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(no,"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)fe(i.data,t,t,!1,[0,24]);else{let o=e.page2?16384:8192;Qe(i.data,t.subarray(o,o+8192)),e.mixed&&fe(i.data,t,t,!1,[20,24])}this.banded=this.insetOn&&!!this.inset&&io(i.data,this.inset),this.banded&&ro(i.data,this.inset),n.putImageData(i,0,0),this.image.setAttribute("href",this.canvas.toDataURL())}}});import{paint as oo}from"@moonbase-machines/c64";var ai,ci=B(()=>{({paint:ai}=oo)});import{vic as ao}from"@moonbase-machines/c64";var Kt,tl,fs,el,sl,Wt,li=B(()=>{({HEIGHT:Kt,LEFT:tl,PALETTE:fs,TOP:el,VIC:sl,WIDTH:Wt}=ao)});var fi={};W(fi,{C64View:()=>Ht});var co,Ht,hs=B(()=>{ci();li();co="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(co,"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=ai(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]=fs[e[o]];i.data.set([c,h,f,255],o*4)}n.putImageData(i,0,0),this.svg.style.background=`rgb(${fs[e[0]].join(",")})`,this.image.setAttribute("href",this.canvas.toDataURL())}}});var de={};W(de,{play:()=>ho});async function ho(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",y=t.viewSteps??{},b=s.chargen=l?s.roms?.chargen??ti().chargen:null;s.printer&&(t.printer=s.printer),t.disk=h.data,l&&h.drive(t.drive=new se(Uint8Array.from(atob(n.image),I=>I.charCodeAt(0))));let w=Ke(t,e);t.files&&h.keep(t.files);let O=[],a=[],u=g==="vector"?s.setting(lo):{value:!1,on(){return this}},d=null,E=()=>{m.replaceChildren();let I=g==="c64"?new Ht(m,{engine:w,chargen:b}):g==="card"?new Ft(m,{engine:w,inset:s.mini?t.inset:null}):new qt(m,{disk:n,volume:Object.keys(n.volumes)[0],engine:w,extra:y});return I.oldStyle=u.value,d?.(I),I},v=E();if(w.on(I=>O.push(v.snapshot({...I}))),t.inset&&s.mini){let I=s.setting(fo),{top:r,bottom:p,view:[x,S]}=t.inset,k=document.createElement("div");k.className="mini",k.hidden=!0,Object.assign(k.style,{left:`${x/5.6}%`,top:`${r/3.84}%`,width:`${(S-x)/5.6}%`,height:`${(p-r+1)/3.84}%`}),m.parentElement.append(k);let N=await s.mini(k,{memory:()=>w.mem});d=P=>{P.insetOn=!!I.value;let H=P.prompts.bind(P);P.prompts=()=>{H(),k.hidden=!(I.value&&P.banded)}},d(v);let U=()=>{v.insetOn=!!I.value,N.mode(I.value),v.prompts()};I.on(U),U()}u.on(()=>{v=E();for(let I of a)v.apply(I);v.prompts()});let A=w.timed?new mt:null,L=!0,M=()=>{l||A?.feed(L?w.clicks:[],w.cycles),w.clicks.length=0},j=t.map?.vars??{sound:0,soundOn:0},$=null,C=(I,r,p)=>{if(!L||!(w.mem[j.sound]&j.soundOn))return;$??=new AudioContext;let x=$.createOscillator(),S=$.createGain(),k=$.currentTime;x.type="square",x.frequency.setValueAtTime(I,k),x.frequency.linearRampToValueAtTime(r,k+p/1e3),S.gain.setValueAtTime(.06,k),S.gain.linearRampToValueAtTime(0,k+p/1e3),x.connect(S).connect($.destination),x.start(k),x.stop(k+p/1e3)},R=I=>16e3/(I+8),T={sound:220,beep:60,"flash-box":60,flash:250,object:30,"object-keep":30},z=!1,F=!1,X=I=>new Promise(r=>setTimeout(r,I));async function q(){if(!z){z=!0;try{for(;;){let I=w.run();if(M(),I==="pace"){for(let r of O.splice(0))a.push(r),v.apply(r);v.prompts(),!F&&s.pace()&&await X(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),!F){if(r.step==="sound"){let[p,x]=r.words.split(" ").map(S=>parseInt(S,16));C(R(x),R(p),180)}r.step==="beep"&&C(R(r.a&31)*2,R(r.a&31)*2,50),s.pace()&&(T[r.step]&&await X(T[r.step]*s.pace()),r.step==="pause"&&await X(r.ms*s.pace()))}}if(v.prompts(),o.textContent=I==="end"?"The end.":"Waiting for a key.",!w.keys.length||I==="end")break}}catch(I){c(I)}z=!1}}let D=I=>{w.press(I),$?.resume(),A?.start(),l||q()},K=()=>w.waitingOn?.words?.[0]==="tick",Q=null,it=null;m.addEventListener("click",I=>{let r=I.target.closest(".key")?.dataset.key;r&&D(+r)});function xt(){w.sid=[],w.clock={irq:0,ahead:[],since:0};let I=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(A?.node&&L){I??=new ss(A.rate),r??=performance.now();let S=Math.floor((performance.now()-r)/1e3*A.rate)-p,k=Math.floor(A.rate/4);if(S>k&&(p+=S-k,S=k),S>0){let N=I.render(S,w.sid.map(([,U,P])=>[0,U,P]));p+=S,A.node.port.postMessage(N,[N.buffer])}}w.sid.length=0},1e3/60)}return setInterval(()=>{if(!K()||z||w.keys.length)return;let I=it??Q??-1;it=null,D(I)},100),{engine:w,press:D,run(){m.focus(),l?xt():q()},key(I,r){if(I.type==="keyup"){Q=null;let x=w.clock?.held;x?.key===I.key&&(x.seen?w.clock.held=null:x.up=!0);return}if(r===void 0)return;if(I.preventDefault(),K()){it=Q=r;return}let p=l&&!I.ctrlKey&&ln(r);if(p){I.repeat||(w.clock.held={...p,key:I.key},$?.resume(),A?.start());return}I.repeat||D(r)},keys(I){if(l)w.clock.ahead.push(...I);else for(let r of I)D(r)},start(){$?.resume(),A?.start()},sound(I){L=I},quick(I){F=I},route({route:I,name:r,keys:{expand:p,give:x,petscii:S,pollsAt:k}}){if(t.seed=I.seed,I.printer&&t.printer){t.printer.on=!0;let P=f("printer");P&&(P.checked=!0)}o.textContent="Playing the route "+r+".";let N={press:P=>w.press(P),also:P=>{let H=w.mem,tt=et=>{H[198]<10&&(H[631+H[198]]=et,H[198]++)};w.keys.length&&tt(w.keys.shift()),tt(P)}},U=()=>{let P;do w.delay=0,P=w.run();while(P==="pace");if(l)O.length=0;else for(let H of O.splice(0))a.push(H),v.apply(H)};U();for(let[P,[H]]of p(I.keys).entries())x(N,H,l?S:void 0),w.polls=k(I,P+1)??void 0,U();w.polls=void 0,v.prompts()}}}var lo,fo,ue=B(()=>{oe();le();ns();Le();ei();Te();cs();ls();hs();lo={name:"old-style",type:"boolean",default:!1,owner:"person",words:"Old style text"},fo={name:"mini",type:["","live","pictures"],default:"",owner:"person",words:"Mini view",labels:["Off","Live","Pictures"]}});var ui={};W(ui,{play:()=>mo});oe();var Nn={};W(Nn,{savesFor:()=>We});import{saves as pr}from"@moonbase-machines/apple2e";var{driveFiles:Ln,keepSaves:Tn,onDisks:Rn,withSaves:In}=pr;import{saves as dr}from"@moonbase-machines/c64";var{keepDrive:Mn}=dr;function We(s,t){return{data:In(s,t),keep:e=>Tn(s,e,t),drive:e=>Mn(e,t),disks:e=>Rn(s,e,t),driveFiles:(e,n)=>Ln(e,n,s)}}ce();var Un={};W(Un,{KEYS_MARKUP:()=>Xe,paperBox:()=>Je,phoneKeys:()=>_e});function Je({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 _e(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 Xe='<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 hi={prodos:[280,192],dos33:[280,192],c64:[384,272]},pi={original:()=>Promise.resolve().then(()=>(rs(),is)),card:()=>Promise.resolve().then(()=>(ue(),de)),vector:()=>Promise.resolve().then(()=>(ue(),de))},po={name:"sound",type:"boolean",default:!0,owner:"person",words:"Sound"},uo={name:"printer",type:"boolean",default:!0,owner:"person",words:"Printer"},di={name:"fixed",type:"boolean",default:!1,owner:"person",words:"Bugs fixed",title:"The game with its bugs fixed: it starts again"};async function mo(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>${Xe}<span class="settings"></span><button id="disk" type="button" hidden>Download the disk</button></p>`,n.append(Je(h.printer));let f=w=>n.querySelector("#"+w),l=n.querySelector(".stage"),m=f("status"),g=n.querySelector(".options .settings"),y=w=>{m.textContent="The game stopped: "+w.message,m.className="error",console.error(w)},b=(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,A)=>`<option value="${v}">${w.labels[A]}</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(di),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 Fe(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(T=>{R.onload=R.onerror=T})}i.failed=R=>{m.textContent="A file was not kept: "+R.message,m.className="error"};let[A,L]=s.screen??u?.screen??hi[v]??hi.prodos;xo(l,n,A,L);let M={way:t,slug:e,title:u,scripts:d,game:E,folder:O,data:a,stage:l,status:m,fail:y,disk:i,preview:c,words:h,fixed:w,$:f,setting:b,saves:E?We(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:T}=await Promise.resolve().then(()=>(Me(),fn)),z=b(uo),F=M.printer=new R({on:z.value});z.on(D=>{F.on=D});let X=f("paper"),q=f("paper-box");F.changed=()=>{q.hidden=!F.lines.length,F.lines.length&&T(X,F,M.chargen)},f("tear").addEventListener("click",()=>F.tear()),f("print-paper").addEventListener("click",()=>window.print())}t==="remake"&&u?.fixed&&b(di).on(()=>location.reload());let $=await(t==="original"?await pi.original():u.own??await pi[u.engine]()).play(M);if(!$)return;if($.sound){let R=b(po,{first:!0});$.sound(R.value),R.on(T=>$.sound(T))}let C=R=>{let T=Ve(R,v),z=R.type==="keydown";if(z&&T!==void 0&&!R.repeat&&s.claim?.(T)){R.preventDefault();return}if(z&&$.start?.(),$.key){$.key(R,T);return}!z||T===void 0||R.repeat||!$.press||(R.preventDefault(),$.press(T))};if(addEventListener("keydown",C),addEventListener("keyup",C),l.addEventListener("pointerdown",()=>$.start?.()),_e(n,l),s.downloadDisk&&$.diskImage){let R=f("disk"),T=a.pathname.split("/").pop().replace(/\.json$/,"");R.hidden=!1,R.addEventListener("click",()=>{let z=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([$.diskImage()],{type:"application/octet-stream"})),download:T+".d64"});z.click(),URL.revokeObjectURL(z.href)})}if($.demonstrate)for(let R of E?.demonstrations??[]){let T=Object.assign(document.createElement("button"),{type:"button",textContent:R.name});T.addEventListener("click",()=>{$.start?.(),$.demonstrate(R.steps)}),f("disk").before(T)}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(T=>ae(T,v));if($.keys)$.keys(R);else for(let T of R)$.press?.(T)}}catch(w){y(w)}}function xo(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)}ce();var gi={};W(gi,{check:()=>vt,describe:()=>St,settingsStore:()=>ms});var mi={};W(mi,{bytesText:()=>us,openDisk:()=>ps,programDisk:()=>wo,textBytes:()=>ds,titleDisk:()=>go});async function ps(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 go=s=>`title/${s}`,wo=s=>`program/${s}`,ds=s=>new TextEncoder().encode(s),us=s=>s?new TextDecoder().decode(s):null;var xi="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 ms({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(us(m.read(xi))??"{}")}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(xi,ds(JSON.stringify(g.kept)))},offered:l=>!n.includes(l.name)&&!(l.name in e)}}var Ei={};W(Ei,{provider:()=>bo,settingsDisk:()=>Si});var bi={};W(bi,{ACCOUNT:()=>ki,DB:()=>wi,KEY:()=>yi,STORE:()=>me,VERSION:()=>yo,local:()=>gs});var wi="moonbase",yo=1,me="files",yi=["account","disk","name"],ki="local",ko=()=>new Promise((s,t)=>{let e=indexedDB.open(wi,1);e.onupgradeneeded=()=>e.result.createObjectStore(me,{keyPath:yi}),e.onsuccess=()=>s(e.result),e.onerror=()=>t(e.error)}),xs=s=>new Promise((t,e)=>{s.onsuccess=()=>t(s.result),s.onerror=()=>e(s.error)});async function gs({account:s=ki}={}){let t=await ko(),e=n=>t.transaction(me,n).objectStore(me);return{kept:!0,where:"this browser",load:async n=>(await xs(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)=>xs(e("readwrite").put({account:s,disk:n,...i})),delete:(n,i)=>xs(e("readwrite").delete([s,n,i]))}}var vi={};W(vi,{memory:()=>ws});function ws({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 bo({backend:s,visit:t,fixed:e={},hidden:n=[]}={}){if(!s)try{s=await gs()}catch{s=ws({kept:!1})}let i=c=>ps(c,{backend:s}),o=ms({disks:{person:await i(Si("person"))},visit:t,fixed:e,hidden:n});return{disk:i,settings:o}}var Si=s=>`settings/${s}`;rs();ue();le();var Oi={};W(Oi,{modal:()=>ys,modalOpen:()=>So});var Et=[],$i=!1,vo=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=Ci(t.box),n=e.indexOf(document.activeElement);e.length&&(s.preventDefault(),e[(n+(s.shiftKey?e.length-1:1))%e.length].focus())}s.stopPropagation()}},Ci=s=>[...s.querySelectorAll('button:not(:disabled), input:not([type=hidden]):not([type=file]):not([hidden]), select:not([hidden]), [tabindex="0"]')],ji=s=>s.querySelector("input:not([type=file]), select:not([hidden])")??s.querySelector(".default")??Ci(s)[0];function ys({within:s=document.body,className:t="",content:e,cancel:n=null}){$i||(document.addEventListener("keydown",vo,!0),$i=!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)?ji(l.box):c)?.focus?.({preventScroll:!0})}};return Et.push(f),ji(o)?.focus({preventScroll:!0}),f}var So=()=>Et.length>0;var Li={};W(Li,{dialogs:()=>Eo});function Eo({within:s,className:t=""}={}){function e(c,h,f,{aside:l=[]}={}){return new Promise(m=>{let g=document.createElement("div");g.className="disk";let y=document.createElement("h2");y.textContent=c;let b=document.createElement("p");b.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)},b.append(u)}if(b.lastChild?.classList.add("default"),l.length){let O=document.createElement("span");O.className="aside",O.append(...l),b.prepend(O)}g.append(y,...h,b);let w=ys({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,...Ai(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}),y=v=>Object.assign(document.createElement("button"),{type:"button",textContent:v}),b=y("File\u2026"),w=y("Download"),O=y("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,...Ai(c)],[["Cancel",null],["Open",()=>l.value||null]],{aside:[b,w,O]}),d=()=>l.closest(".modal").querySelector(".default").click();b.onclick=()=>g.click(),g.onchange=async()=>{let v=g.files[0],A=v.name.slice(0,v.name.length-(h&&v.name.endsWith(h)?h.length:0));c.read(A)&&!await e(`Replace "${A}"?`,[],[["Cancel",!1],["Replace",!0]])||(c.write(A,new Uint8Array(await v.arrayBuffer())),a(),l.value=A,d())},w.onclick=()=>{let v=l.value;if(!v)return;let A=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([c.read(v)],{type:f})),download:v+h});A.click(),setTimeout(()=>URL.revokeObjectURL(A.href),1e3)},O.onclick=async()=>{let v=l.value;v&&await e(`Delete "${v}"?`,[$o("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 $o=s=>Object.assign(document.createElement("p"),{className:"note",textContent:s});function Ai(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]}hs();ls();Be();Ae();var Ri={};W(Ri,{compile:()=>To});Yt();var _=(s,t=2)=>"0x"+s.toString(16).padStart(t,"0"),ks=49152,bs=49407,jo=s=>s>=ks&&s<=bs;function vs(s){if(s.through!==void 0)return{js:`(e.mem[${_(s.through)}] | e.mem[${_(s.through+1)}] << 8) + e.y & 0xffff`,io:!0};if(s.pair!==void 0)return{js:`e.mem[${_(s.pair)} + e.x & 0xff] | e.mem[${_(s.pair)} + e.x + 1 & 0xff] << 8`,io:!0};if(s.via!==void 0)return{js:`(e.mem[${_(s.via,4)}] | e.mem[${_(s.via+1,4)}] << 8)${s.index?" + e."+s.index+" & 0xffff":""}`,io:!0};if(!s.index)return{js:_(s.at,4),io:jo(s.at)};let t=s.at<=bs&&s.at+255>=ks;return{js:s.at+255>65535?`(${_(s.at,4)} + e.${s.index}) & 0xffff`:`${_(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=vs(e);return t&&e.through!==void 0?{js:`e.read(e.ix(e.mem[${_(e.through)}] | e.mem[${_(e.through+1)}] << 8, e.y))`,io:!0}:t&&e.via!==void 0&&e.index?{js:`e.read(e.ix(e.mem[${_(e.via,4)}] | e.mem[${_(e.via+1,4)}] << 8, e.${e.index}))`,io:!0}:t&&e.index&&!e.zp?{js:n.io?`e.read(e.ix(${_(e.at,4)}, e.${e.index}))`:`e.mem[e.ix(${_(e.at,4)}, e.${e.index})]`,io:n.io}:{js:n.io?`e.read(${n.js})`:`e.mem[${n.js}]`,io:n.io}}function Co(s,t){let e=Z(s);if(e.reg)return{js:`e.${e.reg} = ${t}`};let n=vs(e);return{js:n.io?`e.write(${n.js}, ${t})`:`e.mem[${n.js}] = ${t}`,io:n.io}}function Ti(s){let t=Z(s);if(t.reg)return{pre:"",read:"e."+t.reg,write:n=>`e.${t.reg} = ${n}`};let e=vs(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 Oo={zero:"e.z",carry:"e.c",negative:"e.n",overflow:"e.v"},Ao={"==":"e.z","!=":"!e.z",">=":"e.c","<":"!e.c"};function Lo(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=Co(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=Ti(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=Ti(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 y=$t(l[2]);return{js:`e.compare(e.${l[0]}, ${y.js}); if (${Ao[l[1]]})`,kind:"branch",to:f,io:y.io}}let m=l[0]==="not",g=Oo[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(${_(parseInt(e[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:e[1].startsWith("[")?{js:`return e.jumpTable(${_(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(${_(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 To(s,t,{io:e=[49152,49407]}={}){[ks,bs]=e;let{steps:n,labels:i,data:o}=Ct(s,t),c=n.map((m,g)=>Lo(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 y=c.slice(m,g).some(u=>u.kind==="branch"&&i[u.to]===m),b=[];for(let u=m;u<g;u++){if((u===m||c[u-1].kind==="branch")&&c[u].kind!=="routine"){let A=u;for(;A<g-1&&c[A].kind!=="branch";)A++;b.push(`e.time(s, ${u}, ${A});`)}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 A=i[d.to],L=Ot(n[u]),M=L===1?"e.cycles++":`e.cycles += ${L}`;v+=A===void 0?` { ${M}; e.pc = e.label('${d.to}'); return; }`:A===m&&y?` { ${M}; continue; }`:` { ${M}; e.pc = ${A}; return; }`}d.kind==="end"&&(v=`e.pc = ${u+1}; `+v),b.push(v?`${v.padEnd(48)} // ${E}`:`// ${E}`)}c[g-1].kind!=="end"&&c[g-1].kind!=="routine"&&g!==m+1&&b.push(`e.pc = ${g};`);let w=f[m]?` // ${f[m]}
|
|
29
|
+
`:"",O=b.length===1&&/^return (.*?);( +\/\/ .*)$/.exec(b[0]);if(O){l.push(`${w} ${`${m}: (e, s) => ${O[1]},`.padEnd(60)}${O[2].trim()?" "+O[2].trim():""}`);continue}let a=y?["for (;;) {",...b.map(u=>" "+u)," break;","}"]:b;l.push(`${w} ${m}: (e, s) => {
|
|
24
30
|
${a.map(u=>" "+u).join(`
|
|
25
31
|
`)}
|
|
26
32
|
},`)}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
|
-
[${
|
|
33
|
+
[${_(m.at,4)}, [${m.bytes.map(g=>_(g)).join(", ")}]],`).join("")}
|
|
28
34
|
],`,` steps: [${n.map(m=>`
|
|
29
|
-
[${m.at===null?"null":
|
|
35
|
+
[${m.at===null?"null":_(m.at,4)}, ${+m.where.split(":").at(-1)}, ${JSON.stringify(m.text)}],`).join("")}
|
|
30
36
|
],`," run: {",...l," },","};",""].join(`
|
|
31
|
-
`)}
|
|
37
|
+
`)}we();kt();Dt();De();oe();be();Se();Yt();te();cs();export{Bn as audio,Li as diskDialogs,mi as diskDisk,bi as diskLocal,vi as diskMemory,is as enginesOriginal,de as enginesScenes,Dn as keys,Oi as modal,Un as parts,ui as play,Ei as provider,fi as remakeC64View,jn as remakeCard,oi as remakeCardView,en as remakeCards,Ri as remakeCompile,Is as remakeEngine,Ps as remakeEvents,Ys as remakeLayout,En as remakeLift,An as remakeLoad,Ds as remakeProblems,Js as remakeRaster,$s as remakeScript,Qs as remakeVector,ri as remakeView,Nn as saves,gi as settings};
|
|
32
38
|
//# sourceMappingURL=moonbase-player.js.map
|