@moonbase-machines/player 0.9.0 → 0.9.1

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.
@@ -1,5 +1,5 @@
1
- /*! @moonbase-machines/player 0.9.0: MIT, (c) 2026 Mark Wharton (its LICENSE) */
2
- var Di=Object.defineProperty;var ne=(i,e,t)=>()=>{if(t)throw t[0];try{return i&&(e=i(i=0)),e}catch(s){throw t=[s],s}};var z=(i,e)=>{for(var t in e)Di(i,t,{get:e[t],enumerable:!0})};var Qt={};z(Qt,{Machine:()=>zi});import{machine as Ui}from"@moonbase-machines/apple2e";var zi,es=ne(()=>{({Machine:zi}=Ui)});var ts={};z(ts,{blank:()=>qi,placed:()=>Fi,started:()=>ht,units:()=>Wi});import{prodos as Ki}from"@moonbase-machines/apple2e";var qi,Fi,ht,Wi,dt=ne(()=>{({blank:qi,placed:Fi,started:ht,units:Wi}=Ki)});var ss={};z(ss,{driveFiles:()=>Yi,keepSaves:()=>pt,onDisks:()=>Vi,withSaves:()=>ut});import{saves as Hi}from"@moonbase-machines/apple2e";var Yi,pt,Vi,ut,mt=ne(()=>{({driveFiles:Yi,keepSaves:pt,onDisks:Vi,withSaves:ut}=Hi)});var is={};z(is,{COLORS:()=>Ji,colors:()=>xt,paint:()=>Xi,paintHires:()=>gt,paintText:()=>Je,rowStart:()=>Gi,screen:()=>Zi,textRow:()=>Qi});import{screen as _i}from"@moonbase-machines/apple2e";var Ji,xt,Xi,gt,Je,Gi,Zi,Qi,Xe=ne(()=>{({COLORS:Ji,colors:xt,paint:Xi,paintHires:gt,paintText:Je,rowStart:Gi,screen:Zi,textRow:Qi}=_i)});var ns={};z(ns,{pictures:()=>Ie,shapes:()=>tn,windows:()=>sn});import{pictures as en}from"@moonbase-machines/vector";var Ie,tn,sn,Ge=ne(()=>{({pictures:Ie,shapes:tn,windows:sn}=en)});var rs={};z(rs,{bounds:()=>rn,document:()=>on,elements:()=>kt});import{svg as nn}from"@moonbase-machines/vector";var rn,on,kt,wt=ne(()=>{({bounds:rn,document:on,elements:kt}=nn)});var os={};z(os,{C64:()=>cn});import{machine as an}from"@moonbase-machines/c64";var cn,as=ne(()=>{({C64:cn}=an)});var cs={};z(cs,{Printer:()=>Me,WIDTH:()=>fn,bus:()=>yt,paper:()=>bt});import{printer as ln}from"@moonbase-machines/c64";var Me,fn,yt,bt,Ze=ne(()=>{({Printer:Me,WIDTH:fn,bus:yt,paper:bt}=ln)});var ls={};z(ls,{HEIGHT:()=>Ee,LEFT:()=>dn,PALETTE:()=>Qe,TOP:()=>pn,VIC:()=>un,WIDTH:()=>je});import{vic as hn}from"@moonbase-machines/c64";var Ee,dn,Qe,pn,un,je,vt=ne(()=>{({HEIGHT:Ee,LEFT:dn,PALETTE:Qe,TOP:pn,VIC:un,WIDTH:je}=hn)});var fs={};z(fs,{keyboard:()=>xn,pace:()=>gn,painter:()=>kn});import{browser as mn}from"@moonbase-machines/c64";var xn,gn,kn,hs=ne(()=>{({keyboard:xn,pace:gn,painter:kn}=mn)});var ds={};z(ds,{SID:()=>St});import{sid as wn}from"@moonbase-machines/c64";var St,Et=ne(()=>{({SID:St}=wn)});var ps={};z(ps,{ROM_CHOICES:()=>bn,c64Roms:()=>vn,typed:()=>Sn});import{start as yn}from"@moonbase-machines/c64";var bn,vn,Sn,us=ne(()=>{({ROM_CHOICES:bn,c64Roms:vn,typed:Sn}=yn)});var ms={};z(ms,{SECTORS:()=>jn,add:()=>$n,make:()=>Cn,petsciiName:()=>On,read:()=>Ln});import{d64 as En}from"@moonbase-machines/c64";var jn,$n,Cn,On,Ln,xs=ne(()=>{({SECTORS:jn,add:$n,make:Cn,petsciiName:On,read:Ln}=En)});var gs={};z(gs,{keepDrive:()=>jt});import{saves as An}from"@moonbase-machines/c64";var jt,$t=ne(()=>{({keepDrive:jt}=An)});var ws={};z(ws,{play:()=>Tn});var Gt={};z(Gt,{Speaker:()=>we});var Bi=`
1
+ /*! @moonbase-machines/player 0.9.1: MIT, (c) 2026 Mark Wharton (its LICENSE) */
2
+ var Bn=Object.defineProperty;var ie=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(s){throw t=[s],s}};var U=(n,e)=>{for(var t in e)Bn(n,t,{get:e[t],enumerable:!0})};var Qt={};U(Qt,{Machine:()=>Kn});import{machine as zn}from"@moonbase-machines/apple2e";var Kn,es=ie(()=>{({Machine:Kn}=zn)});var ts={};U(ts,{blank:()=>Fn,placed:()=>Wn,started:()=>ht,units:()=>Hn});import{prodos as qn}from"@moonbase-machines/apple2e";var Fn,Wn,ht,Hn,dt=ie(()=>{({blank:Fn,placed:Wn,started:ht,units:Hn}=qn)});var ss={};U(ss,{driveFiles:()=>Vn,keepSaves:()=>pt,onDisks:()=>_n,withSaves:()=>ut});import{saves as Yn}from"@moonbase-machines/apple2e";var Vn,pt,_n,ut,mt=ie(()=>{({driveFiles:Vn,keepSaves:pt,onDisks:_n,withSaves:ut}=Yn)});var ns={};U(ns,{COLORS:()=>Xn,colors:()=>xt,paint:()=>Gn,paintHires:()=>gt,paintText:()=>Je,rowStart:()=>Zn,screen:()=>Qn,textRow:()=>ei});import{screen as Jn}from"@moonbase-machines/apple2e";var Xn,xt,Gn,gt,Je,Zn,Qn,ei,Xe=ie(()=>{({COLORS:Xn,colors:xt,paint:Gn,paintHires:gt,paintText:Je,rowStart:Zn,screen:Qn,textRow:ei}=Jn)});var is={};U(is,{pictures:()=>Ie,shapes:()=>si,windows:()=>ni});import{pictures as ti}from"@moonbase-machines/vector";var Ie,si,ni,Ge=ie(()=>{({pictures:Ie,shapes:si,windows:ni}=ti)});var rs={};U(rs,{bounds:()=>ri,document:()=>oi,elements:()=>kt});import{svg as ii}from"@moonbase-machines/vector";var ri,oi,kt,wt=ie(()=>{({bounds:ri,document:oi,elements:kt}=ii)});var os={};U(os,{C64:()=>ci});import{machine as ai}from"@moonbase-machines/c64";var ci,as=ie(()=>{({C64:ci}=ai)});var cs={};U(cs,{Printer:()=>Me,WIDTH:()=>fi,bus:()=>yt,paper:()=>bt});import{printer as li}from"@moonbase-machines/c64";var Me,fi,yt,bt,Ze=ie(()=>{({Printer:Me,WIDTH:fi,bus:yt,paper:bt}=li)});var ls={};U(ls,{HEIGHT:()=>Ee,LEFT:()=>di,PALETTE:()=>Qe,TOP:()=>pi,VIC:()=>ui,WIDTH:()=>je});import{vic as hi}from"@moonbase-machines/c64";var Ee,di,Qe,pi,ui,je,vt=ie(()=>{({HEIGHT:Ee,LEFT:di,PALETTE:Qe,TOP:pi,VIC:ui,WIDTH:je}=hi)});var fs={};U(fs,{keyboard:()=>xi,pace:()=>gi,painter:()=>ki});import{browser as mi}from"@moonbase-machines/c64";var xi,gi,ki,hs=ie(()=>{({keyboard:xi,pace:gi,painter:ki}=mi)});var ds={};U(ds,{SID:()=>St});import{sid as wi}from"@moonbase-machines/c64";var St,Et=ie(()=>{({SID:St}=wi)});var ps={};U(ps,{ROM_CHOICES:()=>bi,c64Roms:()=>vi,typed:()=>Si});import{start as yi}from"@moonbase-machines/c64";var bi,vi,Si,us=ie(()=>{({ROM_CHOICES:bi,c64Roms:vi,typed:Si}=yi)});var ms={};U(ms,{SECTORS:()=>ji,add:()=>$i,make:()=>Ci,petsciiName:()=>Oi,read:()=>Li});import{d64 as Ei}from"@moonbase-machines/c64";var ji,$i,Ci,Oi,Li,xs=ie(()=>{({SECTORS:ji,add:$i,make:Ci,petsciiName:Oi,read:Li}=Ei)});var gs={};U(gs,{keepDrive:()=>jt});import{saves as Ai}from"@moonbase-machines/c64";var jt,$t=ie(()=>{({keepDrive:jt}=Ai)});var ws={};U(ws,{play:()=>Ti});var Gt={};U(Gt,{Speaker:()=>we});var Un=`
3
3
  class SpeakerProcessor extends AudioWorkletProcessor {
4
4
  constructor() { super(); this.queue = []; this.at = 0; this.level = 0; this.port.onmessage = e => this.queue.push(e.data); }
5
5
  process(inputs, outputs) {
@@ -13,21 +13,21 @@ class SpeakerProcessor extends AudioWorkletProcessor {
13
13
  }
14
14
  }
15
15
  registerProcessor('speaker', SpeakerProcessor);
16
- `,we=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([Bi],{type:"text/javascript"}))),this.node=new AudioWorkletNode(this.context,"speaker"),this.node.connect(this.context.destination),this.rate=this.context.sampleRate,this.context.state!=="running"&&await this.context.resume())}feed(e,t){if(!this.node)return;this.from===null&&(this.from=t);let s=1020484/this.rate,n=Math.floor((t-this.from)/s);if(n<=0)return;let o=new Float32Array(n),c=0;for(let f=0;f<n;f++){let l=this.from+(f+1)*s;for(;c<e.length&&e[c]<=l;)this.level=this.level?0:.25,c++;o[f]=this.level}this.from+=n*s,this.node.port.postMessage(o,[o.buffer])}};var Zt={};z(Zt,{KEYS_MARKUP:()=>Re,paperBox:()=>Ae,phoneKeys:()=>Te});function Ae({line:i,print:e,tear:t}){let s=document.createElement("div");return s.id="paper-box",s.hidden=!0,s.innerHTML='<p><span></span> <button id="print-paper" type="button"></button> <button id="tear" type="button"></button></p><canvas id="paper"></canvas>',s.querySelector("span").textContent=i,s.querySelector("#print-paper").textContent=e,s.querySelector("#tear").textContent=t,s}function Te(i,e){let t=i.querySelector("#keyboard"),s=i.querySelector("#keys-box");if(!t||!s||!matchMedia("(pointer: coarse)").matches)return;t.hidden=!1,t.addEventListener("click",()=>s.focus()),e.addEventListener("click",()=>s.focus());let n=!1;s.addEventListener("keydown",o=>{n=o.key==="Unidentified"}),s.addEventListener("input",()=>{if(n)for(let o of s.value)for(let c of["keydown","keyup"])window.dispatchEvent(new KeyboardEvent(c,{key:o}));s.value=""})}var Re='<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">';async function Tn({data:i,root:e,disk:t,words:s,downloadDisk:n=!1,roms:o=null,studies:c=null}){e.classList.add("game"),e.innerHTML=`<div class="stage"><svg id="vector" viewBox="0 0 140 192" preserveAspectRatio="none"></svg><canvas id="screen" width="560" height="384" tabindex="0"></canvas></div>
17
- <p class="options"><span id="status">Loading.</span>${Re}<label><input type="checkbox" id="vectors"> Draw the pictures as vectors</label><label hidden><input type="checkbox" id="printer" checked> Printer</label><button id="disk" type="button" hidden>Download the disk</button></p>`,e.append(Ae(s.printer));let f=w=>e.querySelector("#"+w),l=f("screen"),p=l.getContext("2d");Te(e,l.parentElement);let u={name:new URL(i).pathname.split("/").pop().replace(/\.json$/,""),roms:o,studies:c,disk:t,downloadDisk:n,$:f,canvas:l,ctx:p,layer:f("vector"),status:f("status"),vectorToggle:f("vectors"),speaker:new we},k=await(await fetch(i)).json();k.kind==="c64"?await In(k,u):await Rn(k,u)}function ks(i,e,t){let s=i.parentElement,n=s.parentElement,o=()=>{let c=window.devicePixelRatio||1,f=parseFloat(getComputedStyle(n).paddingLeft)*2,l=n.clientWidth-f,p=document.documentElement.clientWidth-16,x=Math.ceil(l*c/e-.01);e*x/c>p&&(x=Math.max(1,Math.floor(p*c/e)));let u=e*x/c;Object.assign(s.style,{width:u+"px",height:t*x/c+"px",aspectRatio:"auto",marginLeft:(l-u)/2+"px"})};o(),addEventListener("resize",o)}async function Rn(i,{roms:e,disk:t,canvas:s,ctx:n,layer:o,status:c,vectorToggle:f,speaker:l}){let[{Machine:p},{placed:x},{withSaves:u,keepSaves:k,onDisks:w,driveFiles:L},{screen:T},{shapes:a},{elements:h}]=await Promise.all([Promise.resolve().then(()=>(es(),Qt)),Promise.resolve().then(()=>(dt(),ts)),Promise.resolve().then(()=>(mt(),ss)),Promise.resolve().then(()=>(Xe(),is)),Promise.resolve().then(()=>(Ge(),ns)),Promise.resolve().then(()=>(wt(),rs))]);ks(s,280,192);let g=u(i,t),j=null,$=null;if(e?.apple)try{j=e.apple,$=w(i,x(g,new Map(await Promise.all(i.images.map(async U=>[U,await e.image(U)])))),t)}catch{j=null}let C=new p(g,{log:(...U)=>console.log(...U),...j?{roms:j,disks:$}:{}});console.log(j?"line 1: Apple's ROMs, the disks booted":"line 2: moonbase's machine"),k(i,j?L(C,$,i):C.disk,t),C.diskTime=!0;let R=!1,M=0;function v(){let U=(q,F)=>{e:for(let D=16384;D<32768-q.length;D++){for(let J=0;J<q.length;J++)if(q[J]!==null&&F[D+J]!==q[J])continue e;return D}return-1};for(let q of[C.aux,C.main]){let F=U([32,null,null,32,null,null,238,null,null,76],q),D=U([162,0,160,224,24,96],q),J=U([141,null,null,142,null,null,140,null,null,173,null,null,201,128,240],q);if(!(F<0||D<0||J<0)){C.cpu.hooks.set(F,Z=>(Z.read16(96)===57344&&(o.insertAdjacentHTML("beforeend",h(a(fe=>C.read(fe),57344),{background:M})),C.marking=1),!1)),C.cpu.hooks.set(D,()=>(C.marking=0,!1)),C.cpu.hooks.set(J,Z=>(Z.a!==128&&(M=Z.a&15),o.innerHTML="",C.owner.fill(0),!1)),R=!0;return}}}let A={Escape:27,Enter:13,Backspace:127,Delete:127,ArrowLeft:8,ArrowRight:21,ArrowUp:11,ArrowDown:10,Tab:9};window.addEventListener("keydown",U=>{if(l.start(),U.metaKey||U.altKey||U.repeat)return;let q=U.ctrlKey?/^[a-z]$/i.test(U.key)?U.key.toUpperCase().charCodeAt(0)&31:void 0:A[U.key]??(U.key.length===1?U.key.charCodeAt(0):void 0);q!==void 0&&(console.log("key",JSON.stringify(U.key),"->",q,"at pc $"+C.cpu.pc.toString(16)),C.press(q),U.preventDefault())});let E=new Uint8ClampedArray(560*384*4),H=new ImageData(E,560,384),I=new Uint8Array(26880),K="";function _(){C.halted||C.runCycles(17030);let U=`text ${C.sw.text} page2 ${C.sw.page2} hires ${C.sw.hires} dhires ${C.sw.dhires}`;U!==K&&(console.log("screen:",U,"at pc $"+C.cpu.pc.toString(16),"cycles",C.cpu.cycles),K=U),l.feed(C.clicks,C.cpu.cycles),C.clicks.length=0,R||v();let q=C.sw.text;T(C,E,{cols:I,owner:f.checked&&o.innerHTML?C.owner:null}),n.putImageData(H,0,0),o.style.visibility=f.checked&&!q?"visible":"hidden",c.textContent=C.halted?"The game has stopped: "+C.halted+".":C.idle>2e3?"Waiting for a key.":"Running.",requestAnimationFrame(_)}s.addEventListener("pointerdown",()=>{l.start(),s.focus()}),s.focus(),_()}async function In(i,{name:e,roms:t,studies:s,disk:n,downloadDisk:o,$:c,canvas:f,layer:l,status:p,vectorToggle:x,speaker:u}){let[{C64:k},{Printer:w,paper:L},{WIDTH:T,HEIGHT:a},{keyboard:h,painter:g},{SID:j},{c64Roms:$,typed:C},{add:R},{keepDrive:M}]=await Promise.all([Promise.resolve().then(()=>(as(),os)),Promise.resolve().then(()=>(Ze(),cs)),Promise.resolve().then(()=>(vt(),ls)),Promise.resolve().then(()=>(hs(),fs)),Promise.resolve().then(()=>(Et(),ds)),Promise.resolve().then(()=>(us(),ps)),Promise.resolve().then(()=>(xs(),ms)),Promise.resolve().then(()=>($t(),gs))]);ks(f,T,a);let v=await $(t?.choice??null,t?.load);if(!v){p.textContent="Commodore's ROMs, asked for, are not here.";return}let A=c("printer"),E=c("paper"),H=c("paper-box");try{A.checked=localStorage.getItem("printer")!=="0"}catch{}A.parentElement.hidden=!1;let I=new w({on:A.checked});A.addEventListener("change",()=>{I.on=A.checked;try{localStorage.setItem("printer",A.checked?"1":"0")}catch{}}),I.changed=()=>{H.hidden=!I.lines.length,I.lines.length&&L(E,I,v.chargen)},c("tear").addEventListener("click",()=>I.tear()),c("print-paper").addEventListener("click",()=>window.print());let K=new k(i,v,{log:(...r)=>console.log(...r),printer:I});M(K.drive,n);let _=r=>Uint8Array.from(atob(r),d=>d.charCodeAt(0));for(let[r,d]of Object.entries(s??{}))K.drive.saved.set(r,_(d));if(o){let r=c("disk");r.hidden=!1,r.addEventListener("click",()=>{let d=R(K.drive.image,[...K.drive.saved].map(([S,b])=>({name:S,data:b}))),m=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([d],{type:"application/octet-stream"})),download:e+".d64"});m.click(),URL.revokeObjectURL(m.href)})}l.style.display="none",x.parentElement.style.display="none";let U=g(f),q=null,F=0,D=h(K,{onKey:()=>u.start(),log:!0}),J=0,Z=null,fe=performance.now();function he(){let r=Math.min(2,Math.floor((performance.now()-fe)/20)-J);for(let d=0;d<r;d++){if(K.runFrame(),J++,D.frame(),u.node){Z||(Z=new j(u.rate));let m=Math.round(19656/985248*u.rate),S=K.cpu.cycles-19656,b=Z.render(m,K.sidWrites.map(([y,O,P])=>[Math.floor((y-S)/19656*m),O,P]));u.node.port.postMessage(b,[b.buffer])}K.sidWrites.length=0}J>=120&&q===null&&!F&&(q=C(K,i),F=1),q!==null&&!K.ram[198]&&(q=K.type(q),q.length||(q=null)),U(K.vic.frame),p.textContent=K.halted?"The game has stopped: "+K.halted+".":"Running.",requestAnimationFrame(he)}f.focus(),he()}var Ss={};z(Ss,{modal:()=>Ct,modalOpen:()=>Pn});var $e=[],ys=!1,Mn=i=>{let e=$e.at(-1);if(e){if(i.key==="Escape")i.preventDefault(),e.cancel();else if(i.key==="Enter"&&!(i.target instanceof HTMLButtonElement)&&i.target.tagName!=="TEXTAREA"){let t=e.box.querySelector(".default:not(:disabled)");t&&(i.preventDefault(),t.click())}else if(i.key==="Tab"){let t=vs(e.box),s=t.indexOf(document.activeElement);t.length&&(i.preventDefault(),t[(s+(i.shiftKey?t.length-1:1))%t.length].focus())}i.stopPropagation()}},vs=i=>[...i.querySelectorAll('button:not(:disabled), input:not([type=hidden]):not([type=file]):not([hidden]), select:not([hidden]), [tabindex="0"]')],bs=i=>i.querySelector("input:not([type=file]), select:not([hidden])")??i.querySelector(".default")??vs(i)[0];function Ct({within:i=document.body,className:e="",content:t,cancel:s=null}){ys||(document.addEventListener("keydown",Mn,!0),ys=!0);let n=document.createElement("div");n.className="modal-layer"+(i===document.body?" page":"");let o=document.createElement("div");o.className="modal "+e,o.setAttribute("role","dialog"),o.setAttribute("aria-modal","true"),o.append(t),n.append(o);let c=document.activeElement,f=[...i.children].filter(p=>!p.inert);for(let p of f)p.inert=!0;i.append(n);let l={box:o,cancel:()=>(s??l.close)(),close(){n.remove(),$e.splice($e.indexOf(l),1);for(let x of f)x.inert=!1;let p=$e.at(-1);(p&&!p.box.contains(c)?bs(p.box):c)?.focus?.({preventScroll:!0})}};return $e.push(l),bs(o)?.focus({preventScroll:!0}),l}var Pn=()=>$e.length>0;var js={};z(js,{dialogs:()=>Nn});function Nn({within:i,className:e=""}={}){function t(c,f,l,{aside:p=[]}={}){return new Promise(x=>{let u=document.createElement("div");u.className="disk";let k=document.createElement("h2");k.textContent=c;let w=document.createElement("p");w.className="buttons";for(let[T,a]of l){let h=Object.assign(document.createElement("button"),{type:"button",textContent:T});h.onclick=async()=>{L.close(),x(typeof a=="function"?await a():a)},w.append(h)}if(w.lastChild?.classList.add("default"),p.length){let T=document.createElement("span");T.className="aside",T.append(...p),w.prepend(T)}u.append(k,...f,w);let L=Ct({within:i,className:e,content:u,cancel:()=>{L.close(),x(null)}})})}let s=c=>t(c,[],[["OK",null]]);async function n(c,{suggested:f=""}={}){let l=Object.assign(document.createElement("input"),{value:f,maxLength:31});setTimeout(()=>l.select());let p=document.createElement("label");p.append("Save as ",l);let x=await t("Save",[p,...Es(c)],[["Cancel",null],["Save",()=>l.value.trim()||null]]);return!x||c.read(x)&&!await t(`Replace "${x}"?`,[],[["Cancel",!1],["Replace",!0]])?null:x}async function o(c,{file:{extension:f="",type:l="application/octet-stream"}={}}={}){let p=Object.assign(document.createElement("select"),{size:6}),x=document.createElement("p");x.className="note";let u=Object.assign(document.createElement("input"),{type:"file",accept:[f,l].filter(Boolean).join(","),hidden:!0}),k=$=>Object.assign(document.createElement("button"),{type:"button",textContent:$}),w=k("File\u2026"),L=k("Download"),T=k("Delete"),a=()=>{p.replaceChildren(...c.list().map($=>new Option(`${$.name} \xB7 ${new Date($.modified).toLocaleString()}`,$.name))),p.selectedIndex=p.options.length?0:-1,p.hidden=!p.options.length,x.textContent=p.options.length?"On your disk:":"Nothing saved on your disk yet.",T.disabled=L.disabled=!p.options.length};a();let h=t("Open",[x,p,u,...Es(c)],[["Cancel",null],["Open",()=>p.value||null]],{aside:[w,L,T]}),g=()=>p.closest(".modal").querySelector(".default").click();w.onclick=()=>u.click(),u.onchange=async()=>{let $=u.files[0],C=$.name.slice(0,$.name.length-(f&&$.name.endsWith(f)?f.length:0));c.read(C)&&!await t(`Replace "${C}"?`,[],[["Cancel",!1],["Replace",!0]])||(c.write(C,new Uint8Array(await $.arrayBuffer())),a(),p.value=C,g())},L.onclick=()=>{let $=p.value;if(!$)return;let C=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([c.read($)],{type:l})),download:$+f});C.click(),setTimeout(()=>URL.revokeObjectURL(C.href),1e3)},T.onclick=async()=>{let $=p.value;$&&await t(`Delete "${$}"?`,[Dn("It is gone from your disk for good.")],[["Delete",!0],["Cancel",!1]])&&(await c.remove($),a(),p.focus())},p.ondblclick=g;let j=await h;return j?{name:j,bytes:c.read(j)}:null}return{saveAs:n,openFrom:o,ask:t,tell:s}}var Dn=i=>Object.assign(document.createElement("p"),{className:"note",textContent:i});function Es(i){if(i.kept)return[];let e=document.createElement("p");return e.className="note",e.textContent="This browser is not keeping files: download a game to keep it.",[e]}var Ts={};z(Ts,{bytesText:()=>Wn,openDisk:()=>zn,programDisk:()=>qn,textBytes:()=>Fn,titleDisk:()=>Kn});var Ls={};z(Ls,{ACCOUNT:()=>Os,DB:()=>$s,KEY:()=>Cs,STORE:()=>et,VERSION:()=>Bn,local:()=>Lt});var $s="moonbase",Bn=1,et="files",Cs=["account","disk","name"],Os="local",Un=()=>new Promise((i,e)=>{let t=indexedDB.open($s,1);t.onupgradeneeded=()=>t.result.createObjectStore(et,{keyPath:Cs}),t.onsuccess=()=>i(t.result),t.onerror=()=>e(t.error)}),Ot=i=>new Promise((e,t)=>{i.onsuccess=()=>e(i.result),i.onerror=()=>t(i.error)});async function Lt({account:i=Os}={}){let e=await Un(),t=s=>e.transaction(et,s).objectStore(et);return{kept:!0,load:async s=>(await Ot(t("readonly").getAll(IDBKeyRange.bound([i,s],[i,s,[]])))).map(({name:n,bytes:o,meta:c,modified:f})=>({name:n,bytes:o,meta:c,modified:f})),put:(s,n)=>Ot(t("readwrite").put({account:i,disk:s,...n})),delete:(s,n)=>Ot(t("readwrite").delete([i,s,n]))}}var As={};z(As,{memory:()=>At});function At({kept:i=!0}={}){let e=new Map,t=s=>e.get(s)??e.set(s,new Map).get(s);return{kept:i,load:async s=>[...t(s).values()].map(n=>({...n,bytes:Uint8Array.from(n.bytes)})),put:async(s,n)=>{t(s).set(n.name,{...n,bytes:Uint8Array.from(n.bytes)})},delete:async(s,n)=>{t(s).delete(n)}}}async function zn(i,{backend:e}={}){if(!e)try{e=await Lt()}catch{e=At({kept:!1})}let t=new Map((await e.load(i)).map(o=>[o.name,o])),s=Promise.resolve(),n=o=>s=s.then(o);return{name:i,kept:e.kept,list:()=>[...t.values()].sort((o,c)=>c.modified-o.modified).map(({name:o,bytes:c,meta:f,modified:l})=>({name:o,size:c.length,modified:l,meta:f})),read:o=>t.get(o)?.bytes??null,write(o,c,f={}){let l={name:o,bytes:Uint8Array.from(c),meta:f,modified:Date.now()};return t.set(o,l),n(()=>e.put(i,l))},remove(o){return t.delete(o),n(()=>e.delete(i,o))},written:()=>s}}var Kn=i=>`title/${i}`,qn=i=>`program/${i}`,Fn=i=>new TextEncoder().encode(i),Wn=i=>i?new TextDecoder().decode(i):null;var Is={};z(Is,{C64View:()=>Pe});import{paint as Hn}from"@moonbase-machines/c64";var{paint:Rs}=Hn;vt();var Yn="http://www.w3.org/2000/svg",Pe=class{constructor(e,{engine:t,chargen:s}){this.svg=e,this.engine=t,this.chargen=s,e.setAttribute("viewBox",`0 0 ${je*2} ${Ee*2}`),this.canvas=document.createElement("canvas"),this.canvas.width=je,this.canvas.height=Ee,this.image=document.createElementNS(Yn,"image");for(let[n,o]of Object.entries({x:0,y:0,width:je*2,height:Ee*2,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(n,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine,t=Rs(e.mem,e.title.chip,this.chargen,this.vic,e.title.splits),s=this.canvas.getContext("2d"),n=s.createImageData(je,Ee);for(let o=0;o<t.length;o++){let[c,f,l]=Qe[t[o]];n.data.set([c,f,l,255],o*4)}s.putImageData(n,0,0),this.svg.style.background=`rgb(${Qe[t[0]].join(",")})`,this.image.setAttribute("href",this.canvas.toDataURL())}};var Ms={};z(Ms,{CardView:()=>Ne});Xe();var Vn="http://www.w3.org/2000/svg",Ne=class{constructor(e,{engine:t,inset:s=null}){this.svg=e,this.engine=t,this.inset=s,this.insetOn=!1,this.banded=!1,e.setAttribute("viewBox","0 0 560 384"),this.canvas=document.createElement("canvas"),this.canvas.width=560,this.canvas.height=384,this.image=document.createElementNS(Vn,"image");for(let[n,o]of Object.entries({x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(n,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine.mem,t=this.engine.title.screen,s=this.canvas.getContext("2d"),n=s.createImageData(560,384);if(t.text)Je(n.data,e,e,!1,[0,24]);else{let o=t.page2?16384:8192;gt(n.data,e.subarray(o,o+8192)),t.mixed&&Je(n.data,e,e,!1,[20,24])}this.banded=this.insetOn&&!!this.inset&&_n(n.data,this.inset),this.banded&&Jn(n.data,this.inset),s.putImageData(n,0,0),this.image.setAttribute("href",this.canvas.toDataURL())}};function _n(i,{top:e}){for(let t=0;t<e;t++)for(let s=0;s<560;s++){let n=(t*560+s)*4;if(i[n]<200||i[n+1]<200||i[n+2]<200)return!1}return!0}function Jn(i,{top:e,bottom:t,move:[s,n],by:o}){for(let c=e;c<=t;c++){let f=c*560*4;i.copyWithin(f+(s+o)*4,f+s*4,f+n*4),o<0?i.fill(255,f+(n+o)*4,f+n*4):i.fill(255,f+s*4,f+(s+o)*4)}}var ii={};z(ii,{cardRoutines:()=>Dt});var Ds={};z(Ds,{GIVES:()=>ye,POLLS:()=>Xn,TAKES:()=>ue,WAITS:()=>Gn,describe:()=>Q,nothing:()=>Tt,result:()=>se});var ue={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"},Ps={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}};function Q(i,e,t,s,n,o){let c={step:i};e.length&&(c.n=e.map(Number));let f=ue[i];if(i==="objects")c.table="$"+(t.x|t.y<<8).toString(16).toUpperCase().padStart(4,"0");else if(i.startsWith("object")&&t.a<2)c.a=t.a;else if(f)for(let l of f)c[l]=t[l];if((i==="key-at"||i==="key")&&c.a!==void 0&&(c.a=String.fromCharCode(c.a&127)),Ns[i]&&n)for(let[l,p]of Object.entries(Ns[i]))c[l]=n(p);if(Ps[i]&&o)for(let[l,p]of Object.entries(Ps[i]))c[l]=o(p);return s!==void 0&&(c.words=s),c}var ye={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"},Tt=(i,e)=>i==="beep"&&e===0,Xn=new Set(["read-key","blink-key"]),Gn=new Set(["wait","wait-erase","wait-or-escape","ask","ask-mode","ask-escape","which-box","tick","choose-action","take","drop","show-bag","bag-choose"]);function se(i,e){let t={result:i};for(let s of ye[i])t[s]=e[s];return t}var Us={};z(Us,{INLINE:()=>me,KERNAL:()=>Zn,section:()=>Bs,sectionName:()=>It});var Rt=i=>(e,t)=>{let s=[];for(let n=0;n<i;n++)s.push(e(t+n).toString(16));return{length:i,value:s.join(" ")}},me={fill:Rt(7),copy:Rt(8),prodos:Rt(3),"boot-say":(i,e)=>me.say(i,e),say(i,e){let t="",s=e;for(let n=0;n<1024;n++){let o=i(s++);if(!o)break;t+=String.fromCharCode((o^128)&127)}return{length:s-e,value:t}},print(i,e){let t="",s=e;for(let n=0;n<256;n++){let o=i(s++);if(!o)break;t+=String.fromCharCode(o&127)}return{length:s-e,value:t}}};function Bs(i,e,t){let{lengths:s,marks:n}=i.sections,o=c=>e(c+t)|e(c+t+1)<<8;return{mark:o(n),length:o(s)}}function It(i,e,t,s){let n=i.sections;if(!n||t!==n.file)return t;for(let o=0;o<n.count;o+=2){let c=Bs(i,e,o);if(c.length&&c.mark===s)return t+":"+o}return t}var Zn={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{mli as Qn}from"@moonbase-machines/apple2e";var{BLOCK:zs,CLOCK:Mt,Files:tt}=Qn;import{rom as er}from"@moonbase-machines/apple2e";var{install:Ks}=er;import{kernal as tr}from"@moonbase-machines/c64";var{KEY_TABLES:st,VECTORS:qs,VIC:Fs,install:Ws,kernalByte:Hs,matrixOf:Ys,screenCode:ao}=tr;import{drive as sr}from"@moonbase-machines/c64";var{Drive:it}=sr;Ze();import{basic as ir}from"@moonbase-machines/c64";var{Basic:Vs}=ir;import{numbers as nr}from"@moonbase-machines/c64";var{BasicError:_s,ERRORS:mo,fail:xo,fout:go,int16:ko,nextRandom:wo,scanNumber:yo,seedRandom:bo,val:vo}=nr;import{basicRom as rr}from"@moonbase-machines/c64";var{evaluateInMemory:jo,install:Js,printError:Xs}=rr;var ti={};z(ti,{lift:()=>Pt,readers:()=>nt,script:()=>Nt});import{disasm as or}from"@moonbase-machines/mos6502";var{OPS:Gs,SIZE:Zs,disassemble:Oo,hex:le,operand:Qs}=or;import{inline as ar}from"@moonbase-machines/vector";var{INLINE:ei,name:To,sound:Ro,text:Io}=ar;var nt=i=>Object.fromEntries(Object.entries(i).map(([e,t])=>[e,(s,n)=>{let o=t(c=>s[c],n);return{length:o.length,words:e==="text"||e==="print"||e==="say"?JSON.stringify(o.value):o.value}}])),cr=nt(ei);function Pt(i,e,t,s,n=new Set,o=cr){let c=o,f=new Map,l=new Set(t),p=new Set,x=[...t],u=T=>T>=e&&T<e+i.length;for(;x.length;){let T=x.pop(),a={};for(;u(T)&&!f.has(T);){p.add(T);let h=T-e,g=Gs[i[h]];if(g.name==="???"){f.set(T,{line:".byte $"+le(i[h],2)+" ; not an instruction",end:T+1});break}let j=Zs[g.mode],$=i[h+1]|i[h+2]<<8,C=i.subarray(h,h+j),R=(g.name+" "+Qs(g.mode,C,T)).trim(),M=T+j,v=!1;if(g.mode==="imm"&&"LDA LDX LDY".includes(g.name)?a[g.name[2]]=i[h+1]:(g.name.startsWith("T")||g.name.startsWith("IN")||g.name.startsWith("DE")||g.name.startsWith("LD")||g.name==="PLA")&&delete a[g.name.at(-1)],g.name==="JSR"&&s[$]){let A=s[$],E=c[A]?.(i,M-e),H=["A","X","Y"].map(I=>a[I]===void 0?"":I+"="+a[I]).filter(Boolean).join(" ");R=A+(E?" "+E.words:"")+(H&&!E?" ; "+H:""),E&&(M+=E.length);for(let I in a)delete a[I]}else if(g.name==="JSR"){u($)&&(l.add($),x.push($));for(let A in a)delete a[A]}else if(g.name==="JMP"&&g.mode==="abs")u($)?(l.add($),x.push($)):R+=" ; into PART0"+(s[$]?", "+s[$]:""),v=!0;else if(g.name==="JMP"||g.name==="RTS"||g.name==="RTI"||g.name==="BRK")v=!0;else if(g.mode==="rel"){let A=T+2+(i[h+1]<<24>>24)&65535;l.add(A),x.push(A)}if((g.mode==="abx"||g.mode==="aby")&&g.name==="LDA"&&u($))for(let A=h+3;A<h+12&&A+2<i.length;A++){if(i[A]!==i[h]||(i[A+1]|i[A+2]<<8)!==$+1)continue;let E=[];for(let H=$-e;H+1<i.length&&E.length<64&&!(E.length&&n.has(e+H));H+=2){let I=i[H]|i[H+1]<<8;if(!u(I))break;E.push(I)}R+=" ; a table of "+E.length+" addresses";for(let H of E)l.add(H),x.push(H);break}f.set(T,{line:R,end:M,op:g.name,mode:g.mode,value:j===2?i[h+1]:$,call:g.name==="JSR"&&s[$]?{name:s[$],words:c[s[$]]?.(i,T+3-e)?.words}:null,stop:v});for(let A=T+1;A<M;A++)p.add(A);if(v)break;T=M}}let k=[],w=null;for(let T of[...f.keys()].sort((a,h)=>a-h))w!==null&&T!==w&&k.push(""),l.has(T)&&k.push("L"+le(T,4)+":"),k.push(le(T,4)+" "+f.get(T).line),w=f.get(T).end;let L=[];for(let T=e;T<e+i.length;){if(p.has(T)){T++;continue}let a=T;for(;T<e+i.length&&!p.has(T);)T++;L.push([a,T-a])}return{listing:k.join(`
18
- `),left:L,reached:p.size,size:i.length,lines:f,targets:l}}function Nt({lines:i,targets:e,left:t},s,n,{stops:o=new Set,selfModified:c=!1,memory:f=!1,moved:l=[]}={}){let p=(v,A=4)=>"$"+le(v,A),x=new Set(l);if(c)for(let v of i.values())/^(STA|STX|STY|INC|DEC|ASL|LSR|ROL|ROR)$/.test(v.op)&&/^(abs|abx|aby)$/.test(v.mode)&&x.add(v.value);let u=null,k=()=>u!==null&&(f||x.has(u+1)||x.has(u+2)),w=v=>{let A=v.value;if(k()&&v.mode==="imm"&&(f||x.has(u+1)))return p(u+1);if(k()&&/^(abs|abx|aby)$/.test(v.mode))return"["+p(u+1)+"]"+(v.mode==="abs"?"":"["+v.mode.at(-1)+"]");switch(v.mode){case"imm":return String(A);case"zp":return p(A,2);case"zpx":return p(A,2)+"[x]";case"zpy":return p(A,2)+"[y]";case"abs":return p(A);case"abx":return p(A)+"[x]";case"aby":return p(A)+"[y]";case"izy":return"("+p(A,2)+")[y]";case"izx":return"("+p(A,2)+"[x])";case"acc":return"a";default:return"?"}},L=v=>"L"+le(v,4),T={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:"<"},h=(v,A)=>v+2+(A.value<<24>>24)&65535,g=[...i.keys()].sort((v,A)=>v-A),j=[],$=v=>["JMP","RTS","RTI"].includes(v.op);e=new Set(e),g.forEach((v,A)=>{let E=i.get(v);E.op&&!$(E)&&A+1<g.length&&E.end!==g[A+1]&&i.has(E.end)&&e.add(E.end)});let C=[],R=()=>{for(let[v,A,E]of C)j.push(le(v,4)+" "+A+" = "+E);C=[]},M=null;for(let v=0;v<g.length;v++){let A=g[v],E=i.get(A),H=i.get(g[v+1]),I=_=>j.push(le(A,4)+" "+_);if(u=A,M&&M.op&&!$(M)&&M.end!==A&&i.has(M.end)&&(R(),j.push(le(M.pc,4)+" goto "+L(M.end))),M={...E,pc:g[v]},e.has(A)&&(R(),j.push(L(A)+":")),!E.op){R(),I("asm "+E.line);continue}let K=E.op.at(-1).toLowerCase();if(E.call){let[_,...U]=E.call.name.split(" "),q=ue[_]||"",F=Object.fromEntries(C.map(([,Z,fe])=>[Z,fe]));C=C.filter(([,Z])=>!q.includes(Z)),R();let J=[...U,...[...q].map(Z=>F[Z]??Z)];_==="objects"&&F.x!==void 0&&F.y!==void 0&&J.splice(U.length,2,p(F.x|F.y<<8)),(_==="key-at"||_==="key")&&(J[0]=F.a!==void 0?JSON.stringify(String.fromCharCode(F.a&127)):J[0]),I([_,...J,E.call.words??""].join(" ").trim());continue}switch(E.op){case"LDA":case"LDX":case"LDY":if(E.mode==="imm"&&!k()){C=C.filter(([,_])=>_!==K),C.push([A,K,E.value]);break}if(E.mode==="aby"||E.mode==="abx"){let[_,U,q,F]=[1,2,3,4].map(D=>i.get(g[v+D]));if(_?.op==="STA"&&U?.op==="LDA"&&U.value===E.value+1&&q?.op==="STA"&&F?.op==="JMP"&&_.value===g[v+4]+1&&q.value===g[v+4]+2){R(),I("goto ["+p(E.value)+" "+E.mode.at(-1)+"]"),v+=4,M=null;break}}R(),I(K+" = "+w(E));break;case"STA":case"STX":case"STY":R(),I(w(E)+" = "+K);break;case"TAX":case"TAY":case"TXA":case"TYA":R(),I(E.op[2].toLowerCase()+" = "+E.op[1].toLowerCase());break;case"INX":case"INY":case"DEX":case"DEY":R(),I(K+(E.op[0]==="I"?" += 1":" -= 1"));break;case"INC":case"DEC":R(),I(w(E)+(E.op==="INC"?" += 1":" -= 1"));break;case"CLC":case"SEC":R(),I("carry = "+(E.op==="SEC"?1:0));break;case"ADC":R(),I("a += "+w(E)+" + carry");break;case"SBC":R(),I("a -= "+w(E)+" + borrow");break;case"AND":R(),I("a &= "+w(E));break;case"ORA":R(),I("a |= "+w(E));break;case"EOR":R(),I("a ^= "+w(E));break;case"ASL":case"LSR":case"ROL":case"ROR":R(),I(w(E)+" "+{ASL:"<<= 1",LSR:">>= 1",ROL:"rotate left",ROR:"rotate right"}[E.op]);break;case"BIT":R(),I("test "+w(E));break;case"CMP":case"CPX":case"CPY":{R();let _=E.op==="CMP"?"a":E.op[2].toLowerCase();H&&a[H.op]&&!e.has(g[v+1])?(I("if "+_+" "+a[H.op]+" "+w(E)+" goto "+L(h(g[v+1],H))),v++,M={...H,pc:g[v]}):I("compare "+_+" "+w(E));break}case"JMP":if(R(),E.mode==="abs"&&k()){I("goto ("+p(A+1)+")");break}I(E.mode==="abs"?E.value>=n&&E.value<n+s.length?"goto "+L(E.value):"goto-engine "+p(E.value):"goto ("+p(E.value)+")");break;case"JSR":if(R(),k()){I("call ("+p(A+1)+")");break}I(E.value>=n&&E.value<n+s.length?"call "+L(E.value):"call-engine "+p(E.value));break;case"RTS":R(),I("return");break;case"PHA":case"PLA":case"PHP":case"PLP":R(),I({PHA:"push a",PLA:"pull a",PHP:"push flags",PLP:"pull flags"}[E.op]);break;case"NOP":break;default:if(T[E.op]){R(),I("if "+T[E.op]+" goto "+L(h(A,E)));break}R(),I("asm "+E.line)}}R();for(let[v,A]of t){let E=0;for(;E<A&&!(E&&o.has(v+E))&&!o.has(v);)E++;if(!E)continue;let H=[];for(let I=0;I<E;I+=16)H.push("data "+p(v+I)+" "+Array.from(s.subarray(v-n+I,v-n+Math.min(E,I+16)),K=>le(K,2)).join(" "));j.push("",...H)}return j.join(`
16
+ `,we=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([Un],{type:"text/javascript"}))),this.node=new AudioWorkletNode(this.context,"speaker"),this.node.connect(this.context.destination),this.rate=this.context.sampleRate,this.context.state!=="running"&&await this.context.resume())}feed(e,t){if(!this.node)return;this.from===null&&(this.from=t);let s=1020484/this.rate,i=Math.floor((t-this.from)/s);if(i<=0)return;let o=new Float32Array(i),c=0;for(let f=0;f<i;f++){let l=this.from+(f+1)*s;for(;c<e.length&&e[c]<=l;)this.level=this.level?0:.25,c++;o[f]=this.level}this.from+=i*s,this.node.port.postMessage(o,[o.buffer])}};var Zt={};U(Zt,{KEYS_MARKUP:()=>Re,paperBox:()=>Ae,phoneKeys:()=>Te});function Ae({line:n,print:e,tear:t}){let s=document.createElement("div");return s.id="paper-box",s.hidden=!0,s.innerHTML='<p><span></span> <button id="print-paper" type="button"></button> <button id="tear" type="button"></button></p><canvas id="paper"></canvas>',s.querySelector("span").textContent=n,s.querySelector("#print-paper").textContent=e,s.querySelector("#tear").textContent=t,s}function Te(n,e){let t=n.querySelector("#keyboard"),s=n.querySelector("#keys-box");if(!t||!s||!matchMedia("(pointer: coarse)").matches)return;t.hidden=!1,t.addEventListener("click",()=>s.focus()),e.addEventListener("click",()=>s.focus());let i=!1;s.addEventListener("keydown",o=>{i=o.key==="Unidentified"}),s.addEventListener("input",()=>{if(i)for(let o of s.value)for(let c of["keydown","keyup"])window.dispatchEvent(new KeyboardEvent(c,{key:o}));s.value=""})}var Re='<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">';async function Ti({data:n,root:e,disk:t,words:s,downloadDisk:i=!1,roms:o=null,studies:c=null}){e.classList.add("game"),e.innerHTML=`<div class="stage"><svg id="vector" viewBox="0 0 140 192" preserveAspectRatio="none"></svg><canvas id="screen" width="560" height="384" tabindex="0"></canvas></div>
17
+ <p class="options"><span id="status">Loading.</span>${Re}<label><input type="checkbox" id="vectors"> Draw the pictures as vectors</label><label hidden><input type="checkbox" id="printer" checked> Printer</label><button id="disk" type="button" hidden>Download the disk</button></p>`,e.append(Ae(s.printer));let f=w=>e.querySelector("#"+w),l=f("screen"),p=l.getContext("2d");Te(e,l.parentElement);let u={name:new URL(n).pathname.split("/").pop().replace(/\.json$/,""),roms:o,studies:c,disk:t,downloadDisk:i,$:f,canvas:l,ctx:p,layer:f("vector"),status:f("status"),vectorToggle:f("vectors"),speaker:new we},k=await(await fetch(n)).json();k.kind==="c64"?await Ii(k,u):await Ri(k,u)}function ks(n,e,t){let s=n.parentElement,i=s.parentElement,o=()=>{let c=window.devicePixelRatio||1,f=parseFloat(getComputedStyle(i).paddingLeft)*2,l=i.clientWidth-f,p=document.documentElement.clientWidth-16,x=Math.ceil(l*c/e-.01);e*x/c>p&&(x=Math.max(1,Math.floor(p*c/e)));let u=e*x/c;Object.assign(s.style,{width:u+"px",height:t*x/c+"px",aspectRatio:"auto",marginLeft:(l-u)/2+"px"})};o(),addEventListener("resize",o)}async function Ri(n,{roms:e,disk:t,canvas:s,ctx:i,layer:o,status:c,vectorToggle:f,speaker:l}){let[{Machine:p},{placed:x},{withSaves:u,keepSaves:k,onDisks:w,driveFiles:O},{screen:T},{shapes:a},{elements:h}]=await Promise.all([Promise.resolve().then(()=>(es(),Qt)),Promise.resolve().then(()=>(dt(),ts)),Promise.resolve().then(()=>(mt(),ss)),Promise.resolve().then(()=>(Xe(),ns)),Promise.resolve().then(()=>(Ge(),is)),Promise.resolve().then(()=>(wt(),rs))]);ks(s,280,192);let g=u(n,t),E=null,$=null;if(e?.apple)try{E=e.apple,$=w(n,x(g,new Map(await Promise.all(n.images.map(async B=>[B,await e.image(B)])))),t)}catch{E=null}let C=new p(g,{log:(...B)=>console.log(...B),...E?{roms:E,disks:$}:{}});console.log(E?"line 1: Apple's ROMs, the disks booted":"line 2: moonbase's machine"),k(n,E?O(C,$,n):C.disk,t),C.diskTime=!0;let R=!1,M=0;function S(){let B=(q,F)=>{e:for(let D=16384;D<32768-q.length;D++){for(let X=0;X<q.length;X++)if(q[X]!==null&&F[D+X]!==q[X])continue e;return D}return-1};for(let q of[C.aux,C.main]){let F=B([32,null,null,32,null,null,238,null,null,76],q),D=B([162,0,160,224,24,96],q),X=B([141,null,null,142,null,null,140,null,null,173,null,null,201,128,240],q);if(!(F<0||D<0||X<0)){C.cpu.hooks.set(F,Z=>(Z.read16(96)===57344&&(o.insertAdjacentHTML("beforeend",h(a(he=>C.read(he),57344),{background:M})),C.marking=1),!1)),C.cpu.hooks.set(D,()=>(C.marking=0,!1)),C.cpu.hooks.set(X,Z=>(Z.a!==128&&(M=Z.a&15),o.innerHTML="",C.owner.fill(0),!1)),R=!0;return}}}let A={Escape:27,Enter:13,Backspace:127,Delete:127,ArrowLeft:8,ArrowRight:21,ArrowUp:11,ArrowDown:10,Tab:9};window.addEventListener("keydown",B=>{if(l.start(),B.metaKey||B.altKey||B.repeat)return;let q=B.ctrlKey?/^[a-z]$/i.test(B.key)?B.key.toUpperCase().charCodeAt(0)&31:void 0:A[B.key]??(B.key.length===1?B.key.charCodeAt(0):void 0);q!==void 0&&(console.log("key",JSON.stringify(B.key),"->",q,"at pc $"+C.cpu.pc.toString(16)),C.press(q),B.preventDefault())});let j=new Uint8ClampedArray(560*384*4),H=new ImageData(j,560,384),I=new Uint8Array(26880),K="";function J(){C.halted||C.runCycles(17030);let B=`text ${C.sw.text} page2 ${C.sw.page2} hires ${C.sw.hires} dhires ${C.sw.dhires}`;B!==K&&(console.log("screen:",B,"at pc $"+C.cpu.pc.toString(16),"cycles",C.cpu.cycles),K=B),l.feed(C.clicks,C.cpu.cycles),C.clicks.length=0,R||S();let q=C.sw.text;T(C,j,{cols:I,owner:f.checked&&o.innerHTML?C.owner:null}),i.putImageData(H,0,0),o.style.visibility=f.checked&&!q?"visible":"hidden",c.textContent=C.halted?"The game has stopped: "+C.halted+".":C.idle>2e3?"Waiting for a key.":"Running.",requestAnimationFrame(J)}s.addEventListener("pointerdown",()=>{l.start(),s.focus()}),s.focus(),J()}async function Ii(n,{name:e,roms:t,studies:s,disk:i,downloadDisk:o,$:c,canvas:f,layer:l,status:p,vectorToggle:x,speaker:u}){let[{C64:k},{Printer:w,paper:O},{WIDTH:T,HEIGHT:a},{keyboard:h,painter:g},{SID:E},{c64Roms:$,typed:C},{add:R},{keepDrive:M}]=await Promise.all([Promise.resolve().then(()=>(as(),os)),Promise.resolve().then(()=>(Ze(),cs)),Promise.resolve().then(()=>(vt(),ls)),Promise.resolve().then(()=>(hs(),fs)),Promise.resolve().then(()=>(Et(),ds)),Promise.resolve().then(()=>(us(),ps)),Promise.resolve().then(()=>(xs(),ms)),Promise.resolve().then(()=>($t(),gs))]);ks(f,T,a);let S=await $(t?.choice??null,t?.load);if(!S){p.textContent="Commodore's ROMs, asked for, are not here.";return}let A=c("printer"),j=c("paper"),H=c("paper-box");try{A.checked=localStorage.getItem("printer")!=="0"}catch{}A.parentElement.hidden=!1;let I=new w({on:A.checked});A.addEventListener("change",()=>{I.on=A.checked;try{localStorage.setItem("printer",A.checked?"1":"0")}catch{}}),I.changed=()=>{H.hidden=!I.lines.length,I.lines.length&&O(j,I,S.chargen)},c("tear").addEventListener("click",()=>I.tear()),c("print-paper").addEventListener("click",()=>window.print());let K=new k(n,S,{log:(...r)=>console.log(...r),printer:I});M(K.drive,i);let J=r=>Uint8Array.from(atob(r),d=>d.charCodeAt(0));for(let[r,d]of Object.entries(s??{}))K.drive.saved.set(r,J(d));if(o){let r=c("disk");r.hidden=!1,r.addEventListener("click",()=>{let d=R(K.drive.image,[...K.drive.saved].map(([v,b])=>({name:v,data:b}))),m=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([d],{type:"application/octet-stream"})),download:e+".d64"});m.click(),URL.revokeObjectURL(m.href)})}l.style.display="none",x.parentElement.style.display="none";let B=g(f),q=null,F=0,D=h(K,{onKey:()=>u.start(),log:!0}),X=0,Z=null,he=performance.now();function de(){let r=Math.min(2,Math.floor((performance.now()-he)/20)-X);for(let d=0;d<r;d++){if(K.runFrame(),X++,D.frame(),u.node){Z||(Z=new E(u.rate));let m=Math.round(19656/985248*u.rate),v=K.cpu.cycles-19656,b=Z.render(m,K.sidWrites.map(([y,L,P])=>[Math.floor((y-v)/19656*m),L,P]));u.node.port.postMessage(b,[b.buffer])}K.sidWrites.length=0}X>=120&&q===null&&!F&&(q=C(K,n),F=1),q!==null&&!K.ram[198]&&(q=K.type(q),q.length||(q=null)),B(K.vic.frame),p.textContent=K.halted?"The game has stopped: "+K.halted+".":"Running.",requestAnimationFrame(de)}f.focus(),de()}var Ss={};U(Ss,{modal:()=>Ct,modalOpen:()=>Pi});var $e=[],ys=!1,Mi=n=>{let e=$e.at(-1);if(e){if(n.key==="Escape")n.preventDefault(),e.cancel();else if(n.key==="Enter"&&!(n.target instanceof HTMLButtonElement)&&n.target.tagName!=="TEXTAREA"){let t=e.box.querySelector(".default:not(:disabled)");t&&(n.preventDefault(),t.click())}else if(n.key==="Tab"){let t=vs(e.box),s=t.indexOf(document.activeElement);t.length&&(n.preventDefault(),t[(s+(n.shiftKey?t.length-1:1))%t.length].focus())}n.stopPropagation()}},vs=n=>[...n.querySelectorAll('button:not(:disabled), input:not([type=hidden]):not([type=file]):not([hidden]), select:not([hidden]), [tabindex="0"]')],bs=n=>n.querySelector("input:not([type=file]), select:not([hidden])")??n.querySelector(".default")??vs(n)[0];function Ct({within:n=document.body,className:e="",content:t,cancel:s=null}){ys||(document.addEventListener("keydown",Mi,!0),ys=!0);let i=document.createElement("div");i.className="modal-layer"+(n===document.body?" page":"");let o=document.createElement("div");o.className="modal "+e,o.setAttribute("role","dialog"),o.setAttribute("aria-modal","true"),o.append(t),i.append(o);let c=document.activeElement,f=[...n.children].filter(p=>!p.inert);for(let p of f)p.inert=!0;n.append(i);let l={box:o,cancel:()=>(s??l.close)(),close(){i.remove(),$e.splice($e.indexOf(l),1);for(let x of f)x.inert=!1;let p=$e.at(-1);(p&&!p.box.contains(c)?bs(p.box):c)?.focus?.({preventScroll:!0})}};return $e.push(l),bs(o)?.focus({preventScroll:!0}),l}var Pi=()=>$e.length>0;var js={};U(js,{dialogs:()=>Ni});function Ni({within:n,className:e=""}={}){function t(c,f,l,{aside:p=[]}={}){return new Promise(x=>{let u=document.createElement("div");u.className="disk";let k=document.createElement("h2");k.textContent=c;let w=document.createElement("p");w.className="buttons";for(let[T,a]of l){let h=Object.assign(document.createElement("button"),{type:"button",textContent:T});h.onclick=async()=>{O.close(),x(typeof a=="function"?await a():a)},w.append(h)}if(w.lastChild?.classList.add("default"),p.length){let T=document.createElement("span");T.className="aside",T.append(...p),w.prepend(T)}u.append(k,...f,w);let O=Ct({within:n,className:e,content:u,cancel:()=>{O.close(),x(null)}})})}let s=c=>t(c,[],[["OK",null]]);async function i(c,{suggested:f=""}={}){let l=Object.assign(document.createElement("input"),{value:f,maxLength:31});setTimeout(()=>l.select());let p=document.createElement("label");p.append("Save as ",l);let x=await t("Save",[p,...Es(c)],[["Cancel",null],["Save",()=>l.value.trim()||null]]);return!x||c.read(x)&&!await t(`Replace "${x}"?`,[],[["Cancel",!1],["Replace",!0]])?null:x}async function o(c,{file:{extension:f="",type:l="application/octet-stream"}={}}={}){let p=Object.assign(document.createElement("select"),{size:6}),x=document.createElement("p");x.className="note";let u=Object.assign(document.createElement("input"),{type:"file",accept:[f,l].filter(Boolean).join(","),hidden:!0}),k=$=>Object.assign(document.createElement("button"),{type:"button",textContent:$}),w=k("File\u2026"),O=k("Download"),T=k("Delete"),a=()=>{p.replaceChildren(...c.list().map($=>new Option(`${$.name} \xB7 ${new Date($.modified).toLocaleString()}`,$.name))),p.selectedIndex=p.options.length?0:-1,p.hidden=!p.options.length,x.textContent=p.options.length?"On your disk:":"Nothing saved on your disk yet.",T.disabled=O.disabled=!p.options.length};a();let h=t("Open",[x,p,u,...Es(c)],[["Cancel",null],["Open",()=>p.value||null]],{aside:[w,O,T]}),g=()=>p.closest(".modal").querySelector(".default").click();w.onclick=()=>u.click(),u.onchange=async()=>{let $=u.files[0],C=$.name.slice(0,$.name.length-(f&&$.name.endsWith(f)?f.length:0));c.read(C)&&!await t(`Replace "${C}"?`,[],[["Cancel",!1],["Replace",!0]])||(c.write(C,new Uint8Array(await $.arrayBuffer())),a(),p.value=C,g())},O.onclick=()=>{let $=p.value;if(!$)return;let C=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([c.read($)],{type:l})),download:$+f});C.click(),setTimeout(()=>URL.revokeObjectURL(C.href),1e3)},T.onclick=async()=>{let $=p.value;$&&await t(`Delete "${$}"?`,[Di("It is gone from your disk for good.")],[["Delete",!0],["Cancel",!1]])&&(await c.remove($),a(),p.focus())},p.ondblclick=g;let E=await h;return E?{name:E,bytes:c.read(E)}:null}return{saveAs:i,openFrom:o,ask:t,tell:s}}var Di=n=>Object.assign(document.createElement("p"),{className:"note",textContent:n});function Es(n){if(n.kept)return[];let e=document.createElement("p");return e.className="note",e.textContent="This browser is not keeping files: download a game to keep it.",[e]}var Ts={};U(Ts,{bytesText:()=>Wi,openDisk:()=>zi,programDisk:()=>qi,textBytes:()=>Fi,titleDisk:()=>Ki});var Ls={};U(Ls,{ACCOUNT:()=>Os,DB:()=>$s,KEY:()=>Cs,STORE:()=>et,VERSION:()=>Bi,local:()=>Lt});var $s="moonbase",Bi=1,et="files",Cs=["account","disk","name"],Os="local",Ui=()=>new Promise((n,e)=>{let t=indexedDB.open($s,1);t.onupgradeneeded=()=>t.result.createObjectStore(et,{keyPath:Cs}),t.onsuccess=()=>n(t.result),t.onerror=()=>e(t.error)}),Ot=n=>new Promise((e,t)=>{n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)});async function Lt({account:n=Os}={}){let e=await Ui(),t=s=>e.transaction(et,s).objectStore(et);return{kept:!0,load:async s=>(await Ot(t("readonly").getAll(IDBKeyRange.bound([n,s],[n,s,[]])))).map(({name:i,bytes:o,meta:c,modified:f})=>({name:i,bytes:o,meta:c,modified:f})),put:(s,i)=>Ot(t("readwrite").put({account:n,disk:s,...i})),delete:(s,i)=>Ot(t("readwrite").delete([n,s,i]))}}var As={};U(As,{memory:()=>At});function At({kept:n=!0}={}){let e=new Map,t=s=>e.get(s)??e.set(s,new Map).get(s);return{kept:n,load:async s=>[...t(s).values()].map(i=>({...i,bytes:Uint8Array.from(i.bytes)})),put:async(s,i)=>{t(s).set(i.name,{...i,bytes:Uint8Array.from(i.bytes)})},delete:async(s,i)=>{t(s).delete(i)}}}async function zi(n,{backend:e}={}){if(!e)try{e=await Lt()}catch{e=At({kept:!1})}let t=new Map((await e.load(n)).map(o=>[o.name,o])),s=Promise.resolve(),i=o=>s=s.then(o);return{name:n,kept:e.kept,list:()=>[...t.values()].sort((o,c)=>c.modified-o.modified).map(({name:o,bytes:c,meta:f,modified:l})=>({name:o,size:c.length,modified:l,meta:f})),read:o=>t.get(o)?.bytes??null,write(o,c,f={}){let l={name:o,bytes:Uint8Array.from(c),meta:f,modified:Date.now()};return t.set(o,l),i(()=>e.put(n,l))},remove(o){return t.delete(o),i(()=>e.delete(n,o))},written:()=>s}}var Ki=n=>`title/${n}`,qi=n=>`program/${n}`,Fi=n=>new TextEncoder().encode(n),Wi=n=>n?new TextDecoder().decode(n):null;var Is={};U(Is,{C64View:()=>Pe});import{paint as Hi}from"@moonbase-machines/c64";var{paint:Rs}=Hi;vt();var Yi="http://www.w3.org/2000/svg",Pe=class{constructor(e,{engine:t,chargen:s}){this.svg=e,this.engine=t,this.chargen=s,e.setAttribute("viewBox",`0 0 ${je*2} ${Ee*2}`),this.canvas=document.createElement("canvas"),this.canvas.width=je,this.canvas.height=Ee,this.image=document.createElementNS(Yi,"image");for(let[i,o]of Object.entries({x:0,y:0,width:je*2,height:Ee*2,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(i,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine,t=Rs(e.mem,e.title.chip,this.chargen,this.vic,e.title.splits),s=this.canvas.getContext("2d"),i=s.createImageData(je,Ee);for(let o=0;o<t.length;o++){let[c,f,l]=Qe[t[o]];i.data.set([c,f,l,255],o*4)}s.putImageData(i,0,0),this.svg.style.background=`rgb(${Qe[t[0]].join(",")})`,this.image.setAttribute("href",this.canvas.toDataURL())}};var Ms={};U(Ms,{CardView:()=>Ne});Xe();var Vi="http://www.w3.org/2000/svg",Ne=class{constructor(e,{engine:t,inset:s=null}){this.svg=e,this.engine=t,this.inset=s,this.insetOn=!1,this.banded=!1,e.setAttribute("viewBox","0 0 560 384"),this.canvas=document.createElement("canvas"),this.canvas.width=560,this.canvas.height=384,this.image=document.createElementNS(Vi,"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);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine.mem,t=this.engine.title.screen,s=this.canvas.getContext("2d"),i=s.createImageData(560,384);if(t.text)Je(i.data,e,e,!1,[0,24]);else{let o=t.page2?16384:8192;gt(i.data,e.subarray(o,o+8192)),t.mixed&&Je(i.data,e,e,!1,[20,24])}this.banded=this.insetOn&&!!this.inset&&_i(i.data,this.inset),this.banded&&Ji(i.data,this.inset),s.putImageData(i,0,0),this.image.setAttribute("href",this.canvas.toDataURL())}};function _i(n,{top:e}){for(let t=0;t<e;t++)for(let s=0;s<560;s++){let i=(t*560+s)*4;if(n[i]<200||n[i+1]<200||n[i+2]<200)return!1}return!0}function Ji(n,{top:e,bottom:t,move:[s,i],by:o}){for(let c=e;c<=t;c++){let f=c*560*4;n.copyWithin(f+(s+o)*4,f+s*4,f+i*4),o<0?n.fill(255,f+(i+o)*4,f+i*4):n.fill(255,f+s*4,f+(s+o)*4)}}var nn={};U(nn,{cardRoutines:()=>Dt});var Ds={};U(Ds,{GIVES:()=>ye,POLLS:()=>Xi,TAKES:()=>ue,WAITS:()=>Gi,describe:()=>Q,nothing:()=>Tt,result:()=>se});var ue={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"},Ps={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}};function Q(n,e,t,s,i,o){let c={step:n};e.length&&(c.n=e.map(Number));let f=ue[n];if(n==="objects")c.table="$"+(t.x|t.y<<8).toString(16).toUpperCase().padStart(4,"0");else if(n.startsWith("object")&&t.a<2)c.a=t.a;else if(f)for(let l of f)c[l]=t[l];if((n==="key-at"||n==="key")&&c.a!==void 0&&(c.a=String.fromCharCode(c.a&127)),Ns[n]&&i)for(let[l,p]of Object.entries(Ns[n]))c[l]=i(p);if(Ps[n]&&o)for(let[l,p]of Object.entries(Ps[n]))c[l]=o(p);return s!==void 0&&(c.words=s),c}var ye={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"},Tt=(n,e)=>n==="beep"&&e===0,Xi=new Set(["read-key","blink-key"]),Gi=new Set(["wait","wait-erase","wait-or-escape","ask","ask-mode","ask-escape","which-box","tick","choose-action","take","drop","show-bag","bag-choose"]);function se(n,e){let t={result:n};for(let s of ye[n])t[s]=e[s];return t}var Us={};U(Us,{INLINE:()=>me,KERNAL:()=>Zi,section:()=>Bs,sectionName:()=>It});var Rt=n=>(e,t)=>{let s=[];for(let i=0;i<n;i++)s.push(e(t+i).toString(16));return{length:n,value:s.join(" ")}},me={fill:Rt(7),copy:Rt(8),prodos:Rt(3),"boot-say":(n,e)=>me.say(n,e),say(n,e){let t="",s=e;for(let i=0;i<1024;i++){let o=n(s++);if(!o)break;t+=String.fromCharCode((o^128)&127)}return{length:s-e,value:t}},print(n,e){let t="",s=e;for(let i=0;i<256;i++){let o=n(s++);if(!o)break;t+=String.fromCharCode(o&127)}return{length:s-e,value:t}}};function Bs(n,e,t){let{lengths:s,marks:i}=n.sections,o=c=>e(c+t)|e(c+t+1)<<8;return{mark:o(i),length:o(s)}}function It(n,e,t,s){let i=n.sections;if(!i||t!==i.file)return t;for(let o=0;o<i.count;o+=2){let c=Bs(n,e,o);if(c.length&&c.mark===s)return t+":"+o}return t}var Zi={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{mli as Qi}from"@moonbase-machines/apple2e";var{BLOCK:zs,CLOCK:Mt,Files:tt}=Qi;import{rom as er}from"@moonbase-machines/apple2e";var{install:Ks}=er;import{kernal as tr}from"@moonbase-machines/c64";var{KEY_TABLES:st,VECTORS:qs,VIC:Fs,install:Ws,kernalByte:Hs,matrixOf:Ys,screenCode:ao}=tr;import{drive as sr}from"@moonbase-machines/c64";var{Drive:nt}=sr;Ze();import{basic as nr}from"@moonbase-machines/c64";var{Basic:Vs}=nr;import{numbers as ir}from"@moonbase-machines/c64";var{BasicError:_s,ERRORS:mo,fail:xo,fout:go,int16:ko,nextRandom:wo,scanNumber:yo,seedRandom:bo,val:vo}=ir;import{basicRom as rr}from"@moonbase-machines/c64";var{evaluateInMemory:jo,install:Js,printError:Xs}=rr;var tn={};U(tn,{lift:()=>Pt,readers:()=>it,script:()=>Nt});import{disasm as or}from"@moonbase-machines/mos6502";var{OPS:Gs,SIZE:Zs,disassemble:Oo,hex:fe,operand:Qs}=or;import{inline as ar}from"@moonbase-machines/vector";var{INLINE:en,name:To,sound:Ro,text:Io}=ar;var it=n=>Object.fromEntries(Object.entries(n).map(([e,t])=>[e,(s,i)=>{let o=t(c=>s[c],i);return{length:o.length,words:e==="text"||e==="print"||e==="say"?JSON.stringify(o.value):o.value}}])),cr=it(en);function Pt(n,e,t,s,i=new Set,o=cr){let c=o,f=new Map,l=new Set(t),p=new Set,x=[...t],u=T=>T>=e&&T<e+n.length;for(;x.length;){let T=x.pop(),a={};for(;u(T)&&!f.has(T);){p.add(T);let h=T-e,g=Gs[n[h]];if(g.name==="???"){f.set(T,{line:".byte $"+fe(n[h],2)+" ; not an instruction",end:T+1});break}let E=Zs[g.mode],$=n[h+1]|n[h+2]<<8,C=n.subarray(h,h+E),R=(g.name+" "+Qs(g.mode,C,T)).trim(),M=T+E,S=!1;if(g.mode==="imm"&&"LDA LDX LDY".includes(g.name)?a[g.name[2]]=n[h+1]:(g.name.startsWith("T")||g.name.startsWith("IN")||g.name.startsWith("DE")||g.name.startsWith("LD")||g.name==="PLA")&&delete a[g.name.at(-1)],g.name==="JSR"&&s[$]){let A=s[$],j=c[A]?.(n,M-e),H=["A","X","Y"].map(I=>a[I]===void 0?"":I+"="+a[I]).filter(Boolean).join(" ");R=A+(j?" "+j.words:"")+(H&&!j?" ; "+H:""),j&&(M+=j.length);for(let I in a)delete a[I]}else if(g.name==="JSR"){u($)&&(l.add($),x.push($));for(let A in a)delete a[A]}else if(g.name==="JMP"&&g.mode==="abs")u($)?(l.add($),x.push($)):R+=" ; into PART0"+(s[$]?", "+s[$]:""),S=!0;else if(g.name==="JMP"||g.name==="RTS"||g.name==="RTI"||g.name==="BRK")S=!0;else if(g.mode==="rel"){let A=T+2+(n[h+1]<<24>>24)&65535;l.add(A),x.push(A)}if((g.mode==="abx"||g.mode==="aby")&&g.name==="LDA"&&u($))for(let A=h+3;A<h+12&&A+2<n.length;A++){if(n[A]!==n[h]||(n[A+1]|n[A+2]<<8)!==$+1)continue;let j=[];for(let H=$-e;H+1<n.length&&j.length<64&&!(j.length&&i.has(e+H));H+=2){let I=n[H]|n[H+1]<<8;if(!u(I))break;j.push(I)}R+=" ; a table of "+j.length+" addresses";for(let H of j)l.add(H),x.push(H);break}f.set(T,{line:R,end:M,op:g.name,mode:g.mode,value:E===2?n[h+1]:$,call:g.name==="JSR"&&s[$]?{name:s[$],words:c[s[$]]?.(n,T+3-e)?.words}:null,stop:S});for(let A=T+1;A<M;A++)p.add(A);if(S)break;T=M}}let k=[],w=null;for(let T of[...f.keys()].sort((a,h)=>a-h))w!==null&&T!==w&&k.push(""),l.has(T)&&k.push("L"+fe(T,4)+":"),k.push(fe(T,4)+" "+f.get(T).line),w=f.get(T).end;let O=[];for(let T=e;T<e+n.length;){if(p.has(T)){T++;continue}let a=T;for(;T<e+n.length&&!p.has(T);)T++;O.push([a,T-a])}return{listing:k.join(`
18
+ `),left:O,reached:p.size,size:n.length,lines:f,targets:l}}function Nt({lines:n,targets:e,left:t},s,i,{stops:o=new Set,selfModified:c=!1,memory:f=!1,moved:l=[]}={}){let p=(S,A=4)=>"$"+fe(S,A),x=new Set(l);if(c)for(let S of n.values())/^(STA|STX|STY|INC|DEC|ASL|LSR|ROL|ROR)$/.test(S.op)&&/^(abs|abx|aby)$/.test(S.mode)&&x.add(S.value);let u=null,k=()=>u!==null&&(f||x.has(u+1)||x.has(u+2)),w=S=>{let A=S.value;if(k()&&S.mode==="imm"&&(f||x.has(u+1)))return p(u+1);if(k()&&/^(abs|abx|aby)$/.test(S.mode))return"["+p(u+1)+"]"+(S.mode==="abs"?"":"["+S.mode.at(-1)+"]");switch(S.mode){case"imm":return String(A);case"zp":return p(A,2);case"zpx":return p(A,2)+"[x]";case"zpy":return p(A,2)+"[y]";case"abs":return p(A);case"abx":return p(A)+"[x]";case"aby":return p(A)+"[y]";case"izy":return"("+p(A,2)+")[y]";case"izx":return"("+p(A,2)+"[x])";case"acc":return"a";default:return"?"}},O=S=>"L"+fe(S,4),T={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:"<"},h=(S,A)=>S+2+(A.value<<24>>24)&65535,g=[...n.keys()].sort((S,A)=>S-A),E=[],$=S=>["JMP","RTS","RTI"].includes(S.op);e=new Set(e),g.forEach((S,A)=>{let j=n.get(S);j.op&&!$(j)&&A+1<g.length&&j.end!==g[A+1]&&n.has(j.end)&&e.add(j.end)});let C=[],R=()=>{for(let[S,A,j]of C)E.push(fe(S,4)+" "+A+" = "+j);C=[]},M=null;for(let S=0;S<g.length;S++){let A=g[S],j=n.get(A),H=n.get(g[S+1]),I=J=>E.push(fe(A,4)+" "+J);if(u=A,M&&M.op&&!$(M)&&M.end!==A&&n.has(M.end)&&(R(),E.push(fe(M.pc,4)+" goto "+O(M.end))),M={...j,pc:g[S]},e.has(A)&&(R(),E.push(O(A)+":")),!j.op){R(),I("asm "+j.line);continue}let K=j.op.at(-1).toLowerCase();if(j.call){let[J,...B]=j.call.name.split(" "),q=ue[J]||"",F=Object.fromEntries(C.map(([,Z,he])=>[Z,he]));C=C.filter(([,Z])=>!q.includes(Z)),R();let X=[...B,...[...q].map(Z=>F[Z]??Z)];J==="objects"&&F.x!==void 0&&F.y!==void 0&&X.splice(B.length,2,p(F.x|F.y<<8)),(J==="key-at"||J==="key")&&(X[0]=F.a!==void 0?JSON.stringify(String.fromCharCode(F.a&127)):X[0]),I([J,...X,j.call.words??""].join(" ").trim());continue}switch(j.op){case"LDA":case"LDX":case"LDY":if(j.mode==="imm"&&!k()){C=C.filter(([,J])=>J!==K),C.push([A,K,j.value]);break}if(j.mode==="aby"||j.mode==="abx"){let[J,B,q,F]=[1,2,3,4].map(D=>n.get(g[S+D]));if(J?.op==="STA"&&B?.op==="LDA"&&B.value===j.value+1&&q?.op==="STA"&&F?.op==="JMP"&&J.value===g[S+4]+1&&q.value===g[S+4]+2){R(),I("goto ["+p(j.value)+" "+j.mode.at(-1)+"]"),S+=4,M=null;break}}R(),I(K+" = "+w(j));break;case"STA":case"STX":case"STY":R(),I(w(j)+" = "+K);break;case"TAX":case"TAY":case"TXA":case"TYA":R(),I(j.op[2].toLowerCase()+" = "+j.op[1].toLowerCase());break;case"INX":case"INY":case"DEX":case"DEY":R(),I(K+(j.op[0]==="I"?" += 1":" -= 1"));break;case"INC":case"DEC":R(),I(w(j)+(j.op==="INC"?" += 1":" -= 1"));break;case"CLC":case"SEC":R(),I("carry = "+(j.op==="SEC"?1:0));break;case"ADC":R(),I("a += "+w(j)+" + carry");break;case"SBC":R(),I("a -= "+w(j)+" + borrow");break;case"AND":R(),I("a &= "+w(j));break;case"ORA":R(),I("a |= "+w(j));break;case"EOR":R(),I("a ^= "+w(j));break;case"ASL":case"LSR":case"ROL":case"ROR":R(),I(w(j)+" "+{ASL:"<<= 1",LSR:">>= 1",ROL:"rotate left",ROR:"rotate right"}[j.op]);break;case"BIT":R(),I("test "+w(j));break;case"CMP":case"CPX":case"CPY":{R();let J=j.op==="CMP"?"a":j.op[2].toLowerCase();H&&a[H.op]&&!e.has(g[S+1])?(I("if "+J+" "+a[H.op]+" "+w(j)+" goto "+O(h(g[S+1],H))),S++,M={...H,pc:g[S]}):I("compare "+J+" "+w(j));break}case"JMP":if(R(),j.mode==="abs"&&k()){I("goto ("+p(A+1)+")");break}I(j.mode==="abs"?j.value>=i&&j.value<i+s.length?"goto "+O(j.value):"goto-engine "+p(j.value):"goto ("+p(j.value)+")");break;case"JSR":if(R(),k()){I("call ("+p(A+1)+")");break}I(j.value>=i&&j.value<i+s.length?"call "+O(j.value):"call-engine "+p(j.value));break;case"RTS":R(),I("return");break;case"PHA":case"PLA":case"PHP":case"PLP":R(),I({PHA:"push a",PLA:"pull a",PHP:"push flags",PLP:"pull flags"}[j.op]);break;case"NOP":break;default:if(T[j.op]){R(),I("if "+T[j.op]+" goto "+O(h(A,j)));break}R(),I("asm "+j.line)}}R();for(let[S,A]of t){let j=0;for(;j<A&&!(j&&o.has(S+j))&&!o.has(S);)j++;if(!j)continue;let H=[];for(let I=0;I<j;I+=16)H.push("data "+p(S+I)+" "+Array.from(s.subarray(S-i+I,S-i+Math.min(j,I+16)),K=>fe(K,2)).join(" "));E.push("",...H)}return E.join(`
19
19
  `)+`
20
- `}var de=i=>i.toString(16).toUpperCase().padStart(4,"0");function si(i,e,t){let s=ue[e]||"",n=0,o=null;for(let c of s){let f=t[n++];if(f===void 0||f===c||typeof f=="object")continue;let l=f.startsWith("$")?i.mem[parseInt(f.slice(1),16)]:+f;c==="c"?i.c=l&1:(i[c]=l&255,o!=="a"&&(o=c))}return o&&i.flags(i[o]),t.slice(n)}function Dt(i){let e=i.map,t=i.disk.kind==="c64",s=t?null:i.files??=new tt(i.disk),n=i.screen??={text:1,mixed:0,page2:0,hires:0},o=0,c={bank:2,read:0,aside:new Uint8Array(4096)},f=(r,d)=>{if(d===c.bank)return;let m=r.mem.slice(53248,57344);r.mem.set(c.aside,53248),c.aside=m,c.bank=d},l=i.chip=new Uint8Array(4096),p={4:r=>r&255,5:r=>r>>8&255,8:r=>r*7&255,9:r=>r*13&255};function x(r,d,m){let S=d&4095;if(S<1024){let b=S&63;if(m===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:l[17]&127|r.raster>>1&128;if(m===void 0&&b===25)return r.vicFlags??112;if(m===void 0)return l[b];if(l[b]=m,r.splitLine!==void 0&&b!==25){let y=r.clock?r.clock.splits??=new Map:i.splits??=new Map;(y.get(r.splitLine)??y.set(r.splitLine,new Map).get(r.splitLine)).set(b,m)}b===26&&!(m&1)&&i.splits?.clear();return}if(S<2048){let b=1024|S&31;if(m===void 0)return l[b];l[b]=m,r.sid?.push([r.cycles,S&31,m]);return}if(S<3072){if(m===void 0)return l[S]|240;l[S]=m&15;return}if(S<3328){let b=S&15;if(m===void 0)return p[b]?p[b](i.seed??17):b<2?255:b===13?0:l[3072|b];l[3072|b]=m;return}if(m===void 0)return l[S];if(l[S]=m,(S&15)===0&&r.splitLine!==void 0){let b=r.clock?r.clock.splits??=new Map:i.splits??=new Map;(b.get(r.splitLine)??b.set(r.splitLine,new Map).get(r.splitLine)).set(256,m)}}let u=r=>(r.mem[1]&3)!==0&&(r.mem[1]&4)!==0;function k(r,d,m){if(t&&d>=57344){if(m===void 0)return Hs(d);r.mem[d]=m;return}if(t)return x(r,d,m);if((d&65520)===49280){let S=d&15;return f(r,S&8?1:2),c.read=(S&1)===(S>>1&1)?1:0,0}if(d>=49232&&d<=49239){let S=["text","mixed","page2","hires"][d-49232>>1];return n[S]=d&1,0}if(d===49152&&m===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(d===49168){let S=o;return!(o&128)&&++r.idle>2e3&&(r.polled=!0),o&=127,S}return d===49200&&r.clicks.push(r.cycles),0}let w=null,L={hooks:new Map,cycles:0,a:0,x:0,y:0,z:0,c:0,n:0,v:0,read:r=>w.mem[r],write:(r,d)=>{w.mem[r]=d&255},nz(r){this.n=r>>7&1,this.z=r?0:1}},T=0;t?Ws({cpu:L,read:r=>w.read(r),write:(r,d)=>w.write(r,d),drive:i.bus??=yt(i.drive??=new it(Uint8Array.from(atob(i.disk.image),r=>r.charCodeAt(0))),i.printer??=new Me({on:!1})),held:()=>{let r=w?.clock?.held;return r?.up&&(w.clock.held=null),r&&(r.seen=!0),r??null},call:r=>{he(w,r,"the keyboard read"),Object.assign(L,{a:w.a,x:w.x,y:w.y,c:w.c,z:w.z,n:w.n,v:w.v})},loaded:(r,d,m)=>{(i.files64??=[]).push({name:r,from:d,to:m});let S=i.fileScripts?.[r];if(S){let b={script:S,from:d,to:m};h.splice(0,1/0,...h.filter(y=>y.from<b.from||y.to>b.to),b)}}}):Ks({cpu:L,game:i.disk,sw:{lcRead:0},io:r=>k(w,r),file:r=>s.file(r),get files(){return s.files},put:(r,d)=>s.put(r,d),remove:r=>s.remove(r),clicks:{push:r=>w.clicks.push(w.cycles+r-T)},log(){},halted:!1});let a=(r,d)=>{let m=L.hooks.get(d);if(!m&&t&&d>=40960&&d<49152)throw new Error("a BASIC program (Zoopak's NOTEBOOK or ZOOTIME): not written yet in the remake");if(!m)throw new Error("no ROM routine at $"+de(d));w=r,Object.assign(L,{a:r.a,x:r.x,y:r.y,c:r.c,z:r.z,n:r.n,v:r.v});let S=T=L.cycles,b=m(L);if(b==="wait")return"wait";if(r.delay+=(L.cycles-S+6)/Mt*1e3,r.cycles+=L.cycles-S+6,Object.assign(r,{a:L.a&255,x:L.x&255,y:L.y&255,c:L.c,z:L.z,n:L.n}),b==="return")return b},h=[],g=null,j=(r,d)=>{if(!g){g=new Map;for(let m of Object.keys(r.sources)){let S=r.script(m);for(let b of Object.keys(S.labels))if(/^L[0-9A-F]{4}$/.test(b)){let y=parseInt(b.slice(1),16);(g.get(y)??g.set(y,[]).get(y)).push(m)}}}return g.get(d)??[]},$=(r,d)=>{let m=i.files64?.findLast(O=>O.from<=d&&d<=O.to)??(d>=512&&d<40960?{name:"MEMORY",from:512,to:40959}:null);if(!m)return null;let S=r.mem.slice(m.from,m.to+1),b=(i.fileScripts?.[m.name]??m.name)+"@"+de(d),y=Pt(S,m.from,[d],e.routines,new Set,nt(me));return r.sources[b]=Nt(y,S,m.from,{selfModified:!0}),g=null,h.push({script:b,from:m.from,to:m.to}),(i.liftedAtNeed??=[]).push(m.name+" $"+de(d)),console.warn(`lifted at need: ${m.name} from $${de(d)} (an entry for its scene's lift)`),b},C=new Set(Object.values(i.fileScripts??{})),R=(r,d)=>t?r.filter(m=>!C.has(m)||h.some(S=>S.script===m&&S.from<=d&&d<=S.to)):r,M=(r,d)=>{let m=R(j(r,d),d);!m.length&&t&&$(r,d)&&(m=R(j(r,d),d));let S=h.findLast(y=>m.includes(y.script)&&y.from<=d&&d<=y.to),b=m.length>1?S?.script:m[0];if(!b)throw new Error("no script has $"+de(d));return[b,"L"+de(d)]},v=(r,d)=>t?d>=57344?(r.mem[1]&2)!==0:d>=40960&&d<49152?(r.mem[1]&3)===3:d===115||d===121:d>=53248&&!(c.read&&j(r,d).length),A=r=>e.stir&&r?.at>=e.stir.from&&r.at<=e.stir.to,E=(r,d,m)=>{m&&r.inside++,r.emit(d),m&&r.inside--},H=r=>{let d=r.stack.pop();d.name!==r.name&&r.enter(d.name),r.pc=d.pc,d.inside&&(r.inside--,d.done?.(r)),d.after?.(r)},I=new Set(["town","restart","escape"]),K=(r,d,m,S)=>{if(d?.at==null)return S.map(y=>parseInt(y,16));let b=[];for(let y=0;y<m;y++)b.push(r.mem[d.at+3+y&65535]);return b},_=r=>r.map(d=>d.toString(16)).join(" "),U=r=>(e.unplaced?.includes(r.step)&&(delete r.x,delete r.y),r),q={chrout:[806,61898],chrin:[804,61783],getin:[810,61758],save:[818,62957]},F=(r,d)=>(m,S,b)=>{si(m,r,S),E(m,U(Q(r,[],m,void 0,void 0,P=>m.mem[P])),A(b));let y=t&&q[r],O=y&&m.mem[y[0]]|m.mem[y[0]+1]<<8;if(y&&O!==y[1]){let[P,N]=M(m,O);m.callInside(P,N,B=>{ye[r]&&B.emit(se(r,{a:B.a,x:B.x,y:B.y,c:B.c}))},b?.at==null?void 0:b.at+2&65535);return}if(a(m,d)==="wait")return"wait";ye[r]&&t&&m.emit(se(r,{a:m.a,x:m.x,y:m.y,c:m.c}))},D={prodos:(r,d,m)=>{let S=K(r,m,3,d),[b,y,O]=S,P=y|O<<8;E(r,Q("prodos",[],r,_(S)),A(m));let N={read:X=>r.mem[X],write:(X,ee)=>{r.mem[X]=ee&255}};if(b===202){let X=r.mem[P+1],ee=s.open.get(X),W=r.mem[P+2]|r.mem[P+3]<<8,ge=ee?Math.min(r.mem[P+4]|r.mem[P+5]<<8,ee.f.body.length-ee.at):0,_e=ee&&i.fileScripts?.[It(e,ke=>r.mem[ke],ee.f.path,ee.at)];if(_e&&ge){let ke={script:_e,from:W,to:W+ge-1};h.splice(0,1/0,...h.filter(Le=>Le.from<ke.from||Le.to>ke.to),ke)}r.delay+=Math.ceil(ge/512)*zs/Mt*1e3}let B=s.call(b,P,N);r.cycles+=6,B===null&&(B=1),r.a=B==="quit"?0:B,r.c=r.a?1:0,r.z=r.a?0:1,B==="quit"&&(r.ended=!0)},stirred:r=>{for(let d of e.stir.counts)r.mem[d]=i.seed&255},hposn:F("hposn",62481),hlin:F("hlin",62778),hcolor:F("hcolor",63216),"clear-page":F("clear-page",62452),pause:F("pause",64680),home:F("home",64600),outport:F("outport",65173),"call-engine":(r,[d],m)=>{let S=parseInt(d.slice(1),16);if(v(r,S)){let O=a(r,S);if(O==="return"){H(r);return}return O}if(!t&&r.mem[S]===96){r.cycles+=6;return}let[b,y]=M(r,S);r.stack.push({name:r.name,pc:r.pc,ret:m?.at==null?void 0:m.at+2&65535}),r.enter(b,y)},"goto-engine":(r,[d],m)=>{let S=parseInt(d.slice(1),16),b=e.routines[S];if(b){if(I.has(b))return D[b](r,[],m);let y=t&&r.stack.at(-1)?.rom;y&&r.inside++;let O;try{O=D[b](r,[],m)}finally{y&&r.inside--}let P=r.stack.at(-1);if(P?.inside){let N=P.done;P.done=B=>{N?.(B),H(B)}}else H(r);return O}if(v(r,S)){if(a(r,S)==="wait")return"wait";t&&Z.has(S)&&fe(r),H(r);return}r.enter(...M(r,S))}};t&&i.basic&&(D.sys=(r,d,m,S)=>{r.mem[122]=m&255,r.mem[123]=m>>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 y=N=>{b[780]=N.a,b[781]=N.x,b[782]=N.y,b[783]=N.c|N.z<<1|(N.i??0)<<2|(N.d??0)<<3|N.v<<6|N.n<<7};if(v(r,d)){let N=a(r,d);return y(r),N}let[O,P]=M(r,d);r.stack.push({name:r.name,pc:r.pc,rom:!0,after:y}),r.enter(O,P)},D["basic-load"]=(r,[d,m=1,S=0])=>{let b=r.mem;for(let O=0;O<d.length;O++)b[512+O]=d.charCodeAt(O);Object.assign(b,{183:d.length,187:0,188:2,186:m,185:S,184:0}),Object.assign(r,{a:0,x:1,y:8}),r.basic.call("load");let y=Object.entries(i.basic).find(([,O])=>O.file===d);if(S===0&&y){J(r,y[0]),r.enter(y[0]);return}r.pc=0},Js({cpu:L,read:r=>w.read(r),write:(r,d)=>w.write(r,d),evaluate:r=>{let d=w.sources[w.basic.script]?.params?.[r];if(!d)throw new Error("no parameter compiled at $"+de(r));let[m,S,b]=d;return{value:S(w.basic),end:m,place:b}}})),t&&i.basic&&(D.error=(r,d)=>!(d instanceof _s)||!r.basic?!1:(w=r,Xs({cpu:L,write:(m,S)=>{r.mem[m]=S}},d.message,r.basic.at)));let J=(r,d)=>{r.basic=new Vs(r,i.basic[d]),r.basic.script=d};for(let[r,d]of Object.entries(e.routines).map(([m,S])=>[+m,S]))!D[d]&&r>=53248&&(D[d]=F(d,r)),!(D[d]||r>=48896)&&(D[d]=(m,S,b)=>{if(si(m,d,S),I.has(d)&&m.inside){for(let W of m.stack)W.inside&&(delete W.inside,delete W.done);m.inside=0}let y=b?.at!=null?m.mem[b.at+1&65535]|m.mem[b.at+2&65535]<<8:null,O=A(b),P=e.routines[y]===d?y:parseInt(Object.entries(e.routines).find(([,W])=>W===d)[0]);d==="read-key"&&(m.mem[e.seed]=i.seed&255,m.mem[e.seed+1]=i.seed>>8);let N=me[d]&&b?.at!=null?me[d](W=>m.mem[W&65535],b.at+3).value:void 0;E(m,Q(d,[],{a:m.a,x:m.x,y:m.y,c:m.c},N,void 0,W=>m.mem[W]),O);let[B,X]=M(m,P);if(d==="escape"&&b?.at!=null&&m.stack.push({name:m.name,pc:m.pc,ret:b.at+2&65535}),I.has(d)){m.enter(B,X),m.entered=P;return}let ee=W=>{W.mem[e.seed]=i.seed&255,W.mem[e.seed+1]=i.seed>>8};m.callInside(B,X,W=>{d==="read-key"&&ee(W),ye[d]&&!O&&W.emit(se(d,{a:W.a,x:W.x,y:W.y,c:W.c}))},b?.at==null?void 0:b.at+2&65535)});D.elsewhere=(r,d)=>{let m=parseInt(d.slice(1),16),S=h.findLast(b=>b.from<=m&&m<=b.to);return S!==void 0&&S.script!==r.name&&/^L[0-9A-F]{4}$/.test(d)},D.timed=!0,D.polls=e.polls,D.reads=e.reads,t&&(D.getin=r=>{!r.clock&&!r.i&&(D.poll(r),r.polledSince=!0);let d;if(r.mem[198]?(d=r.mem[631],r.mem.copyWithin(631,632,631+r.mem[198]),r.mem[198]--):d=r.key(),r.c=0,d===void 0||d<0){r.a=r.flags(0),++r.idle>(r.polls??e.polls??200)&&!r.clock&&(r.polled=!0);return}r.a=r.flags(d),r.idle=0,r.emit(se("getin",{a:d}))});let Z=new Set([59953,60027,60030,60033]);D.poll=r=>{D.interrupt(r),l[26]&1&&D.interrupt(r,!0)};let fe=r=>{for(let d of["y","x","a"]){let m=r.stack.pop();if(m?.a===void 0||m.name!==void 0)throw new Error("the end of an interrupt with its registers not on the stack");r[d]=m.a}};t&&(D.interrupt=(r,d=!1)=>{if(r.i)return;let m=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=d?241:112,d&&(r.splitLine=l[18]|(l[17]&128)<<1);try{v(r,m)?a(r,m):(r.i=1,he(r,m,"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 he(r,d,m,S){let b=!1;r.callInside(...M(r,d),()=>{b=!0}),S?.(r);for(let y=0;!b;y++){if(y>1e6)throw new Error(m+" at $"+de(d)+" runs on without end");if(r.exec(r.program.steps[r.pc])==="wait")throw new Error(m+" at $"+de(d)+" waits")}}return D.inline=(r,d)=>me[d.words[0]]?me[d.words[0]](m=>r.mem[m&65535],d.at+3).length:0,D.before=(r,d)=>{if(t&&r.clock&&!r.i){r.cycles>=r.clock.irq&&(r.clock.irq=Math.max(r.clock.irq+16421,r.cycles),D.interrupt(r));let O=Math.floor(r.cycles/63)%312,P=r.clock.line??O,N=l[18]|(l[17]&128)<<1;r.clock.line=O,O<P&&(i.splits=r.clock.splits??new Map,r.clock.splits=new Map),l[26]&1&&(P<=O?P<N&&N<=O:N>P||N<=O)&&D.interrupt(r,!0)}let m=d.start??d.at,S=m!=null&&r.inside===0?e.routines[m]:void 0,b=r.entered===m;if(r.entered=null,S&&!b&&!A(d)){E(r,Q(S,[],{a:r.a,x:r.x,y:r.y,c:r.c},void 0,void 0,P=>r.mem[P]));let O=r.stack.at(-1);O?.name!==void 0&&!O.inside&&(O.inside=!0,O.done=P=>{ye[S]&&P.emit(se(S,{a:P.a,x:P.x,y:P.y,c:P.c}))},r.inside++)}if(e.ticks?.find(O=>O.at===d.at&&r.name===i.fileScripts?.[O.scene])){if(r.ticking===d){r.ticking=null,r.keys[0]===-1&&r.keys.shift();return}return r.emit({step:"tick"}),r.ticking=d,"wait"}},D.setup=r=>{if(t){if(!i.io||i.io[0]>53248||i.io[1]<st[1]-1)throw new Error("a Commodore 64 title's io must cover $D000 to the KERNAL's keyboard tables");r.ioAt=d=>d>=53248&&d<=57343&&u(r)||d>=st[0]&&d<st[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}),Fs.forEach((d,m)=>{l[m]=d}),l[3328]=151,qs.forEach((d,m)=>{r.mem[788+2*m]=d&255,r.mem[789+2*m]=d>>8});for(let d=0;d<1e3;d++)r.mem[1024+d]=32,l[2048+d]=14;for(let[d,m]of Object.entries(i.load??{})){let S=i.drive.find(Uint8Array.from(d,b=>b.charCodeAt(0))).raw;r.mem.set(S.subarray(2),m)}r.io=(d,m)=>k(r,d,m),i.basic&&(Object.assign(r.mem,{205:2,206:32,207:0,647:254}),J(r,i.start));return}for(let[d,m]of Object.entries(i.load??{}))r.mem.set(s.file("/"+s.volumes[0]+"/"+d).body,m);if(i.disk.kind==="dos33"){for(let d=0;d<24;d++)r.mem.fill(160,1024+(d&7)*128+(d>>3)*40,1024+(d&7)*128+(d>>3)*40+40);for(let[d,m,S]of i.disk.loads)S&&f(r,S),r.mem.set(s.file(d).body,m);f(r,1),c.read=1,Object.assign(r.mem,{32:0,33:40,34:16,35:24,50:255}),r.delay=2500}r.io=(d,m)=>k(r,d,m)},D}var oi={};z(oi,{compile:()=>xr});var ni={};z(ni,{branchTaken:()=>Be,operand:()=>te,parse:()=>De,words:()=>rt});var lr=/"(?:[^"\\]|\\.)*"|\S+/g;function De(i,e="script"){let t=[],s={},n=[];return i.split(`
21
- `).forEach((o,c)=>{let f=o.replace(/^\s+|\s+$/g,"");if(!f||f.startsWith(";"))return;let l=e+":"+(c+1),p;if(p=/^(L[0-9A-F]{4}|[A-Za-z_][\w-]*):$/.exec(f)){s[p[1]]=t.length;return}if(p=/^data \$([0-9A-F]+)((?: [0-9A-F]{2})+)$/i.exec(f)){n.push({at:parseInt(p[1],16),bytes:p[2].trim().split(" ").map(k=>parseInt(k,16))});return}p=/^([0-9A-F]{4})\s+(.*)$/.exec(f);let x=p?parseInt(p[1],16):null,u=p?p[2]:f;t.push({at:x,words:rt(u),text:u,where:l,index:t.length})}),{steps:t,labels:s,data:n}}var rt=i=>i.match(lr).map(e=>e.startsWith('"')?{string:JSON.parse(e)}:e);function te(i){if(typeof i!="string")return{string:i.string};if(/^-?\d+$/.test(i))return{number:+i};if(/^[axy]$/.test(i)||i==="carry"||i==="borrow")return{reg:i};let e;if(e=/^\$([0-9A-F]+)(?:\[([xy])\])?$/i.exec(i))return{at:parseInt(e[1],16),index:e[2],zp:e[1].length<=2};if(e=/^\(\$([0-9A-F]{2})\)\[y\]$/i.exec(i))return{through:parseInt(e[1],16)};if(e=/^\(\$([0-9A-F]{2})\[x\]\)$/i.exec(i))return{pair:parseInt(e[1],16)};if(e=/^\[\$([0-9A-F]{4})\](?:\[([xy])\])?$/i.exec(i))return{via:parseInt(e[1],16),index:e[2]};throw new Error("not an operand: "+i)}var fr=i=>/^\d+$/.test(i)||/^\$[0-9A-F]{2}(\[[xy]\])?$/i.test(i)||/^\(\$/.test(i)?2:3;function Be(i){if(i.at===null)return 1;let e=i.words,t=parseInt(e.at(-1).slice(1),16),s=i.at+(e.length===6?fr(e[3]):0)+2&65535;return/^L[0-9A-F]{4}$/.test(e.at(-1))&&(t&65280)!==(s&65280)?2:1}var G=(i,e=2)=>"0x"+i.toString(16).padStart(e,"0"),Bt=49152,Ut=49407,hr=i=>i>=Bt&&i<=Ut;function zt(i){if(i.through!==void 0)return{js:`(e.mem[${G(i.through)}] | e.mem[${G(i.through+1)}] << 8) + e.y & 0xffff`,io:!0};if(i.pair!==void 0)return{js:`e.mem[${G(i.pair)} + e.x & 0xff] | e.mem[${G(i.pair)} + e.x + 1 & 0xff] << 8`,io:!0};if(i.via!==void 0)return{js:`(e.mem[${G(i.via,4)}] | e.mem[${G(i.via+1,4)}] << 8)${i.index?" + e."+i.index+" & 0xffff":""}`,io:!0};if(!i.index)return{js:G(i.at,4),io:hr(i.at)};let e=i.at<=Ut&&i.at+255>=Bt;return{js:i.at+255>65535?`(${G(i.at,4)} + e.${i.index}) & 0xffff`:`${G(i.at,4)} + e.${i.index}`,io:e}}function Ce(i,e=!0){let t=te(i);if(t.number!==void 0)return{js:String(t.number&255)};if(t.reg==="carry")return{js:"e.c"};if(t.reg)return{js:"e."+t.reg};let s=zt(t);return e&&t.through!==void 0?{js:`e.read(e.ix(e.mem[${G(t.through)}] | e.mem[${G(t.through+1)}] << 8, e.y))`,io:!0}:e&&t.via!==void 0&&t.index?{js:`e.read(e.ix(e.mem[${G(t.via,4)}] | e.mem[${G(t.via+1,4)}] << 8, e.${t.index}))`,io:!0}:e&&t.index&&!t.zp?{js:s.io?`e.read(e.ix(${G(t.at,4)}, e.${t.index}))`:`e.mem[e.ix(${G(t.at,4)}, e.${t.index})]`,io:s.io}:{js:s.io?`e.read(${s.js})`:`e.mem[${s.js}]`,io:s.io}}function dr(i,e){let t=te(i);if(t.reg)return{js:`e.${t.reg} = ${e}`};let s=zt(t);return{js:s.io?`e.write(${s.js}, ${e})`:`e.mem[${s.js}] = ${e}`,io:s.io}}function ri(i){let e=te(i);if(e.reg)return{pre:"",read:"e."+e.reg,write:s=>`e.${e.reg} = ${s}`};let t=zt(e);return t.io?{pre:`const at = ${t.js}; `,read:"e.read(at)",write:s=>`e.write(at, ${s})`,io:!0}:{pre:"",read:`e.mem[${t.js}]`,write:s=>`e.mem[${t.js}] = ${s}`}}var pr={zero:"e.z",carry:"e.c",negative:"e.n",overflow:"e.v"},ur={"==":"e.z","!=":"!e.z",">=":"e.c","<":"!e.c"};function mr(i,e){let t=i.words,[s,n]=t,o=`s[${e}]`,c=(...l)=>({js:l.map(p=>p.js??p).join(""),kind:l.some(p=>p.io)?"io":"compute"});if(n==="="&&t.length===3){let l=Ce(t[2]),p=te(s);if(p.reg==="carry")return c("e.c = ",l," & 1;");if(p.reg)return c(`e.${p.reg} = e.flags(`,l,");");let x=dr(s,l.js);return{js:x.js+";",kind:l.io||x.io?"io":"compute"}}if(n==="+="||n==="-="){let l=Ce(t[2]);if(t.length===3){let p=ri(s);return{js:`${p.pre}${p.write(`e.flags(${p.read} ${n[0]} ${l.js} & 0xff)`)};`,kind:p.io||l.io?"io":"compute"}}return{js:n==="+="?`e.add(${l.js});`:`e.sub(${l.js});`,kind:l.io?"io":"compute"}}if(n==="&="||n==="|="||n==="^="){let l=Ce(t[2]);return c(`e.a = e.flags(e.a ${n[0]} `,l,");")}if(n==="<<="||n===">>="||n==="rotate"){let l=ri(s),p=n==="<<="||t[2]==="left";return{js:`${l.pre}${l.write(`e.shift(${l.read}, ${p}, ${n==="rotate"})`)};`,kind:l.io?"io":"compute"}}switch(s){case"if":{let l=t.at(-1),p=t.slice(1,-2);if(p.length===3&&/^[axy]$/.test(p[0])){let k=Ce(p[2]);return{js:`e.compare(e.${p[0]}, ${k.js}); if (${ur[p[1]]})`,kind:"branch",to:l,io:k.io}}let x=p[0]==="not",u=pr[x?p[1]:p[0]];if(!u)throw new Error(i.where+": no flag "+p.join(" "));return{js:`if (${x?"!":""}${u})`,kind:"branch",to:l}}case"goto":return t[1].startsWith("(")?{js:`return e.jumpThrough(${G(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:t[1].startsWith("[")?{js:`return e.jumpTable(${G(parseInt(t[1].slice(2),16),4)}, e.${t[2][0]});`,kind:"end"}:{js:`return e.jump('${t[1]}', ${o});`,kind:"end"};case"call":return t[1].startsWith("(")?{js:`return e.callThrough(${G(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:{js:`return e.call('${t[1]}', ${o});`,kind:"end"};case"return":return{js:`return e.ret(${o});`,kind:"end"};case"compare":return c(`e.compare(e.${t[1]}, `,Ce(t[2]),");");case"test":return c("e.test(",Ce(t[1]),");");case"push":return{js:`e.push(${t[1]==="a"});`,kind:"compute"};case"pull":return{js:`e.pull(${t[1]==="a"});`,kind:"compute"};case"asm":return t[1]==="RTI"?{js:`return e.ret(${o});`,kind:"end"}:{js:["TSX","TXS","CLV","SED","CLD","SEI","CLI"].includes(t[1])?`e.asm('${t[1]}');`:"",kind:"compute"}}let f=t.slice(1).map(l=>typeof l=="string"?`'${l}'`:`{ string: ${JSON.stringify(l.string)} }`).join(", ");return{js:`return e.routine('${s}', [${f}], ${o});`,kind:"routine"}}function xr(i,e,{io:t=[49152,49407]}={}){[Bt,Ut]=t;let{steps:s,labels:n,data:o}=De(i,e),c=s.map((x,u)=>mr(x,u)),f=new Set([0,...Object.values(n)]);c.forEach((x,u)=>{(x.kind==="routine"||x.kind==="io"||x.io)&&f.add(u),(x.kind!=="compute"&&x.kind!=="branch"||x.io)&&f.add(u+1)});let l=Object.fromEntries(Object.entries(n).map(([x,u])=>[u,x])),p=[];for(let x=0;x<s.length;x++){if(!f.has(x))continue;let u=x+1;for(;u<s.length&&!f.has(u);)u++;let k=c.slice(x,u).some(h=>h.kind==="branch"&&n[h.to]===x),w=[];for(let h=x;h<u;h++){if((h===x||c[h-1].kind==="branch")&&c[h].kind!=="routine"){let C=h;for(;C<u-1&&c[C].kind!=="branch";)C++;w.push(`e.time(s, ${h}, ${C});`)}let g=c[h],j=s[h].at===null?s[h].text:s[h].at.toString(16).toUpperCase().padStart(4,"0")+" "+s[h].text,$=g.js;if(g.kind==="branch"){let C=n[g.to],R=Be(s[h]),M=R===1?"e.cycles++":`e.cycles += ${R}`;$+=C===void 0?` { ${M}; e.pc = e.label('${g.to}'); return; }`:C===x&&k?` { ${M}; continue; }`:` { ${M}; e.pc = ${C}; return; }`}g.kind==="end"&&($=`e.pc = ${h+1}; `+$),w.push($?`${$.padEnd(48)} // ${j}`:`// ${j}`)}c[u-1].kind!=="end"&&c[u-1].kind!=="routine"&&u!==x+1&&w.push(`e.pc = ${u};`);let L=l[x]?` // ${l[x]}
22
- `:"",T=w.length===1&&/^return (.*?);( +\/\/ .*)$/.exec(w[0]);if(T){p.push(`${L} ${`${x}: (e, s) => ${T[1]},`.padEnd(60)}${T[2].trim()?" "+T[2].trim():""}`);continue}let a=k?["for (;;) {",...w.map(h=>" "+h)," break;","}"]:w;p.push(`${L} ${x}: (e, s) => {
20
+ `}var ce=n=>n.toString(16).toUpperCase().padStart(4,"0");function sn(n,e,t){let s=ue[e]||"",i=0,o=null;for(let c of s){let f=t[i++];if(f===void 0||f===c||typeof f=="object")continue;let l=f.startsWith("$")?n.mem[parseInt(f.slice(1),16)]:+f;c==="c"?n.c=l&1:(n[c]=l&255,o!=="a"&&(o=c))}return o&&n.flags(n[o]),t.slice(i)}function Dt(n){let e=n.map,t=n.disk.kind==="c64",s=t?null:n.files??=new tt(n.disk),i=n.screen??={text:1,mixed:0,page2:0,hires:0},o=0,c={bank:2,read:0,aside:new Uint8Array(4096)},f=(r,d)=>{if(d===c.bank)return;let m=r.mem.slice(53248,57344);r.mem.set(c.aside,53248),c.aside=m,c.bank=d},l=n.chip=new Uint8Array(4096),p={4:r=>r&255,5:r=>r>>8&255,8:r=>r*7&255,9:r=>r*13&255};function x(r,d,m){let v=d&4095;if(v<1024){let b=v&63;if(m===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:l[17]&127|r.raster>>1&128;if(m===void 0&&b===25)return r.vicFlags??112;if(m===void 0)return l[b];if(l[b]=m,r.splitLine!==void 0&&b!==25){let y=r.clock?r.clock.splits??=new Map:n.splits??=new Map;(y.get(r.splitLine)??y.set(r.splitLine,new Map).get(r.splitLine)).set(b,m)}b===26&&!(m&1)&&n.splits?.clear();return}if(v<2048){let b=1024|v&31;if(m===void 0)return l[b];l[b]=m,r.sid?.push([r.cycles,v&31,m]);return}if(v<3072){if(m===void 0)return l[v]|240;l[v]=m&15;return}if(v<3328){let b=v&15;if(m===void 0)return p[b]?p[b](n.seed??17):b<2?255:b===13?0:l[3072|b];l[3072|b]=m;return}if(m===void 0)return l[v];if(l[v]=m,(v&15)===0&&r.splitLine!==void 0){let b=r.clock?r.clock.splits??=new Map:n.splits??=new Map;(b.get(r.splitLine)??b.set(r.splitLine,new Map).get(r.splitLine)).set(256,m)}}let u=r=>(r.mem[1]&3)!==0&&(r.mem[1]&4)!==0;function k(r,d,m){if(t&&d>=57344){if(m===void 0)return Hs(d);r.mem[d]=m;return}if(t)return x(r,d,m);if((d&65520)===49280){let v=d&15;return f(r,v&8?1:2),c.read=(v&1)===(v>>1&1)?1:0,0}if(d>=49232&&d<=49239){let v=["text","mixed","page2","hires"][d-49232>>1];return i[v]=d&1,0}if(d===49152&&m===void 0){if(!(o&128)){let v=r.key();v!==void 0&&v>=0&&(o=v|128)}return++r.idle>2e3&&(r.polled=!0),o}if(d===49168){let v=o;return!(o&128)&&++r.idle>2e3&&(r.polled=!0),o&=127,v}return d===49200&&r.clicks.push(r.cycles),0}let w=null,O={hooks:new Map,cycles:0,a:0,x:0,y:0,z:0,c:0,n:0,v:0,read:r=>w.mem[r],write:(r,d)=>{w.mem[r]=d&255},nz(r){this.n=r>>7&1,this.z=r?0:1}},T=0;t?Ws({cpu:O,read:r=>w.read(r),write:(r,d)=>w.write(r,d),drive:n.bus??=yt(n.drive??=new nt(Uint8Array.from(atob(n.disk.image),r=>r.charCodeAt(0))),n.printer??=new Me({on:!1})),held:()=>{let r=w?.clock?.held;return r?.up&&(w.clock.held=null),r&&(r.seen=!0),r??null},call:r=>{de(w,r,"the keyboard read"),Object.assign(O,{a:w.a,x:w.x,y:w.y,c:w.c,z:w.z,n:w.n,v:w.v})},loaded:(r,d,m)=>{(n.files64??=[]).push({name:r,from:d,to:m});let v=n.fileScripts?.[r];if(v){let b={script:v,from:d,to:m};h.splice(0,1/0,...h.filter(y=>y.from<b.from||y.to>b.to),b)}}}):Ks({cpu:O,game:n.disk,sw:{lcRead:0},io:r=>k(w,r),file:r=>s.file(r),get files(){return s.files},put:(r,d)=>s.put(r,d),remove:r=>s.remove(r),clicks:{push:r=>w.clicks.push(w.cycles+r-T)},log(){},halted:!1});let a=(r,d)=>{let m=O.hooks.get(d);if(!m&&t&&d>=40960&&d<49152)throw new Error("a BASIC program (Zoopak's NOTEBOOK or ZOOTIME): not written yet in the remake");if(!m)throw new Error("no ROM routine at $"+ce(d));w=r,Object.assign(O,{a:r.a,x:r.x,y:r.y,c:r.c,z:r.z,n:r.n,v:r.v,pc:d,sp:r.sp()-2&255});let v=T=O.cycles,b=m(O);if(b==="wait")return"wait";if(r.delay+=(O.cycles-v+6)/Mt*1e3,r.cycles+=O.cycles-v+6,Object.assign(r,{a:O.a&255,x:O.x&255,y:O.y&255,c:O.c,z:O.z,n:O.n}),b==="return")return b;if(b===!1&&O.pc!==d)return{to:O.pc}},h=[],g=null,E=(r,d)=>{if(!g){g=new Map;for(let m of Object.keys(r.sources)){let v=r.script(m);for(let b of Object.keys(v.labels))if(/^L[0-9A-F]{4}$/.test(b)){let y=parseInt(b.slice(1),16);(g.get(y)??g.set(y,[]).get(y)).push(m)}}}return g.get(d)??[]},$=(r,d)=>{let m=n.files64?.findLast(L=>L.from<=d&&d<=L.to)??(d>=512&&d<40960?{name:"MEMORY",from:512,to:40959}:null);if(!m)return null;let v=r.mem.slice(m.from,m.to+1),b=(n.fileScripts?.[m.name]??m.name)+"@"+ce(d),y=Pt(v,m.from,[d],e.routines,new Set,it(me));return r.sources[b]=Nt(y,v,m.from,{selfModified:!0}),g=null,h.push({script:b,from:m.from,to:m.to}),(n.liftedAtNeed??=[]).push(m.name+" $"+ce(d)),console.warn(`lifted at need: ${m.name} from $${ce(d)} (an entry for its scene's lift)`),b},C=new Set(Object.values(n.fileScripts??{})),R=(r,d)=>t?r.filter(m=>!C.has(m)||h.some(v=>v.script===m&&v.from<=d&&d<=v.to)):r,M=(r,d)=>{let m=R(E(r,d),d);!m.length&&t&&$(r,d)&&(m=R(E(r,d),d));let v=h.findLast(y=>m.includes(y.script)&&y.from<=d&&d<=y.to),b=m.length>1?v?.script:m[0];if(!b)throw new Error("no script has $"+ce(d));return[b,"L"+ce(d)]},S=(r,d)=>t?d>=57344?(r.mem[1]&2)!==0:d>=40960&&d<49152?(r.mem[1]&3)===3:d===115||d===121:d>=53248?!(c.read&&E(r,d).length):O.hooks.has(d)&&!E(r,d).length,A=r=>e.stir&&r?.at>=e.stir.from&&r.at<=e.stir.to,j=(r,d,m)=>{m&&r.inside++,r.emit(d),m&&r.inside--},H=r=>{let d=r.stack.pop();d.name!==r.name&&r.enter(d.name),r.pc=d.pc,d.inside&&(r.inside--,d.done?.(r)),d.after?.(r)},I=new Set(["town","restart","escape"]),K=(r,d,m,v)=>{if(d?.at==null)return v.map(y=>parseInt(y,16));let b=[];for(let y=0;y<m;y++)b.push(r.mem[d.at+3+y&65535]);return b},J=r=>r.map(d=>d.toString(16)).join(" "),B=r=>(e.unplaced?.includes(r.step)&&(delete r.x,delete r.y),r),q={chrout:[806,61898],chrin:[804,61783],getin:[810,61758],save:[818,62957]},F=(r,d)=>(m,v,b)=>{sn(m,r,v),j(m,B(Q(r,[],m,void 0,void 0,N=>m.mem[N])),A(b));let y=t&&q[r],L=y&&m.mem[y[0]]|m.mem[y[0]+1]<<8;if(y&&L!==y[1]){let[N,z]=M(m,L);m.callInside(N,z,V=>{ye[r]&&V.emit(se(r,{a:V.a,x:V.x,y:V.y,c:V.c}))},b?.at==null?void 0:b.at+2&65535);return}let P=a(m,d);if(P==="wait")return"wait";if(P?.to!==void 0)return m.stackPage(),m.stack.push({name:m.name,pc:m.pc,inside:!0,ret:b?.at==null?void 0:b.at+2&65535}),m.inside++,D["goto-engine"](m,["$"+ce(P.to)],b);ye[r]&&t&&m.emit(se(r,{a:m.a,x:m.x,y:m.y,c:m.c}))},D={prodos:(r,d,m)=>{let v=K(r,m,3,d),[b,y,L]=v,P=y|L<<8;j(r,Q("prodos",[],r,J(v)),A(m));let N={read:V=>r.mem[V],write:(V,ee)=>{r.mem[V]=ee&255}};if(b===202){let V=r.mem[P+1],ee=s.open.get(V),W=r.mem[P+2]|r.mem[P+3]<<8,ge=ee?Math.min(r.mem[P+4]|r.mem[P+5]<<8,ee.f.body.length-ee.at):0,_e=ee&&n.fileScripts?.[It(e,ke=>r.mem[ke],ee.f.path,ee.at)];if(_e&&ge){let ke={script:_e,from:W,to:W+ge-1};h.splice(0,1/0,...h.filter(Le=>Le.from<ke.from||Le.to>ke.to),ke)}r.delay+=Math.ceil(ge/512)*zs/Mt*1e3}let z=s.call(b,P,N);r.cycles+=6,z===null&&(z=1),r.a=z==="quit"?0:z,r.c=r.a?1:0,r.z=r.a?0:1,z==="quit"&&(r.ended=!0)},stirred:r=>{for(let d of e.stir.counts)r.mem[d]=n.seed&255},hposn:F("hposn",62481),hlin:F("hlin",62778),hcolor:F("hcolor",63216),"clear-page":F("clear-page",62452),pause:F("pause",64680),home:F("home",64600),outport:F("outport",65173),"call-engine":(r,[d],m)=>{let v=parseInt(d.slice(1),16);if(S(r,v)){let L=a(r,v);if(L==="return"){H(r);return}return L}if(!t&&r.mem[v]===96){r.cycles+=6;return}let[b,y]=M(r,v);r.stack.push({name:r.name,pc:r.pc,ret:m?.at==null?void 0:m.at+2&65535}),r.enter(b,y)},"goto-engine":(r,[d],m)=>{let v=parseInt(d.slice(1),16),b=e.routines[v];if(b){if(I.has(b))return D[b](r,[],m);let y=t&&r.stack.at(-1)?.rom;y&&r.inside++;let L;try{L=D[b](r,[],m)}finally{y&&r.inside--}let P=r.stack.at(-1);if(P?.inside){let N=P.done;P.done=z=>{N?.(z),H(z)}}else H(r);return L}if(S(r,v)){if(a(r,v)==="wait")return"wait";t&&Z.has(v)&&he(r),H(r);return}if(!t&&r.mem[v]===76&&!E(r,v).length)return D["goto-engine"](r,["$"+ce(r.mem[v+1]|r.mem[v+2]<<8)],m);r.enter(...M(r,v))}};t&&n.basic&&(D.sys=(r,d,m,v)=>{r.mem[122]=m&255,r.mem[123]=m>>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 y=N=>{b[780]=N.a,b[781]=N.x,b[782]=N.y,b[783]=N.c|N.z<<1|(N.i??0)<<2|(N.d??0)<<3|N.v<<6|N.n<<7};if(S(r,d)){let N=a(r,d);return y(r),N}let[L,P]=M(r,d);r.stack.push({name:r.name,pc:r.pc,rom:!0,after:y}),r.enter(L,P)},D["basic-load"]=(r,[d,m=1,v=0])=>{let b=r.mem;for(let L=0;L<d.length;L++)b[512+L]=d.charCodeAt(L);Object.assign(b,{183:d.length,187:0,188:2,186:m,185:v,184:0}),Object.assign(r,{a:0,x:1,y:8}),r.basic.call("load");let y=Object.entries(n.basic).find(([,L])=>L.file===d);if(v===0&&y){X(r,y[0]),r.enter(y[0]);return}r.pc=0},Js({cpu:O,read:r=>w.read(r),write:(r,d)=>w.write(r,d),evaluate:r=>{let d=w.sources[w.basic.script]?.params?.[r];if(!d)throw new Error("no parameter compiled at $"+ce(r));let[m,v,b]=d;return{value:v(w.basic),end:m,place:b}}})),t&&n.basic&&(D.error=(r,d)=>!(d instanceof _s)||!r.basic?!1:(w=r,Xs({cpu:O,write:(m,v)=>{r.mem[m]=v}},d.message,r.basic.at)));let X=(r,d)=>{r.basic=new Vs(r,n.basic[d]),r.basic.script=d};for(let[r,d]of Object.entries(e.routines).map(([m,v])=>[+m,v]))!D[d]&&r>=53248&&(D[d]=F(d,r)),!(D[d]||r>=48896)&&(D[d]=(m,v,b)=>{if(sn(m,d,v),I.has(d)&&m.inside){for(let W of m.stack)W.inside&&(delete W.inside,delete W.done);m.inside=0}let y=b?.at!=null?m.mem[b.at+1&65535]|m.mem[b.at+2&65535]<<8:null,L=A(b),P=e.routines[y]===d?y:parseInt(Object.entries(e.routines).find(([,W])=>W===d)[0]);d==="read-key"&&(m.mem[e.seed]=n.seed&255,m.mem[e.seed+1]=n.seed>>8);let N=me[d]&&b?.at!=null?me[d](W=>m.mem[W&65535],b.at+3).value:void 0;j(m,Q(d,[],{a:m.a,x:m.x,y:m.y,c:m.c},N,void 0,W=>m.mem[W]),L);let[z,V]=M(m,P);if(d==="escape"&&b?.at!=null&&m.stack.push({name:m.name,pc:m.pc,ret:b.at+2&65535}),I.has(d)){m.enter(z,V),m.entered=P;return}let ee=W=>{W.mem[e.seed]=n.seed&255,W.mem[e.seed+1]=n.seed>>8};m.callInside(z,V,W=>{d==="read-key"&&ee(W),ye[d]&&!L&&W.emit(se(d,{a:W.a,x:W.x,y:W.y,c:W.c}))},b?.at==null?void 0:b.at+2&65535)});D.elsewhere=(r,d)=>{let m=parseInt(d.slice(1),16),v=h.findLast(b=>b.from<=m&&m<=b.to);return v!==void 0&&v.script!==r.name&&/^L[0-9A-F]{4}$/.test(d)},D.timed=!0,D.polls=e.polls,D.reads=e.reads,t&&(D.getin=r=>{!r.clock&&!r.i&&(D.poll(r),r.polledSince=!0);let d;if(r.mem[198]?(d=r.mem[631],r.mem.copyWithin(631,632,631+r.mem[198]),r.mem[198]--):d=r.key(),r.c=0,d===void 0||d<0){r.a=r.flags(0),++r.idle>(r.polls??e.polls??200)&&!r.clock&&(r.polled=!0);return}r.a=r.flags(d),r.idle=0,r.emit(se("getin",{a:d}))});let Z=new Set([59953,60027,60030,60033]);D.poll=r=>{D.interrupt(r),l[26]&1&&D.interrupt(r,!0)};let he=r=>{for(let d of["y","x","a"]){let m=r.stack.pop();if(m?.a===void 0||m.name!==void 0)throw new Error("the end of an interrupt with its registers not on the stack");r[d]=m.a}};t&&(D.interrupt=(r,d=!1)=>{if(r.i)return;let m=r.mem[788]|r.mem[789]<<8,v={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=d?241:112,d&&(r.splitLine=l[18]|(l[17]&128)<<1);try{S(r,m)?a(r,m):(r.i=1,de(r,m,"the interrupt routine",b=>b.stack.push({a:v.a},{a:v.x},{a:v.y})))}finally{Object.assign(r,v),r.i=0,r.vicFlags=r.splitLine=void 0}});function de(r,d,m,v){let b=!1;r.callInside(...M(r,d),()=>{b=!0}),v?.(r);for(let y=0;!b;y++){if(y>1e6)throw new Error(m+" at $"+ce(d)+" runs on without end");if(r.exec(r.program.steps[r.pc])==="wait")throw new Error(m+" at $"+ce(d)+" waits")}}return D.inline=(r,d)=>me[d.words[0]]?me[d.words[0]](m=>r.mem[m&65535],d.at+3).length:0,D.before=(r,d)=>{if(t&&r.clock&&!r.i){r.cycles>=r.clock.irq&&(r.clock.irq=Math.max(r.clock.irq+16421,r.cycles),D.interrupt(r));let L=Math.floor(r.cycles/63)%312,P=r.clock.line??L,N=l[18]|(l[17]&128)<<1;r.clock.line=L,L<P&&(n.splits=r.clock.splits??new Map,r.clock.splits=new Map),l[26]&1&&(P<=L?P<N&&N<=L:N>P||N<=L)&&D.interrupt(r,!0)}let m=d.start??d.at,v=m!=null&&r.inside===0?e.routines[m]:void 0,b=r.entered===m;if(r.entered=null,v&&!b&&!A(d)){j(r,Q(v,[],{a:r.a,x:r.x,y:r.y,c:r.c},void 0,void 0,P=>r.mem[P]));let L=r.stack.at(-1);L?.name!==void 0&&!L.inside&&(L.inside=!0,L.done=P=>{ye[v]&&P.emit(se(v,{a:P.a,x:P.x,y:P.y,c:P.c}))},r.inside++)}if(e.ticks?.find(L=>L.at===d.at&&r.name===n.fileScripts?.[L.scene])){if(r.ticking===d){r.ticking=null,r.keys[0]===-1&&r.keys.shift();return}return r.emit({step:"tick"}),r.ticking=d,"wait"}},D.setup=r=>{if(t){if(!n.io||n.io[0]>53248||n.io[1]<st[1]-1)throw new Error("a Commodore 64 title's io must cover $D000 to the KERNAL's keyboard tables");r.ioAt=d=>d>=53248&&d<=57343&&u(r)||d>=st[0]&&d<st[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}),Fs.forEach((d,m)=>{l[m]=d}),l[3328]=151,qs.forEach((d,m)=>{r.mem[788+2*m]=d&255,r.mem[789+2*m]=d>>8});for(let d=0;d<1e3;d++)r.mem[1024+d]=32,l[2048+d]=14;for(let[d,m]of Object.entries(n.load??{})){let v=n.drive.find(Uint8Array.from(d,b=>b.charCodeAt(0))).raw;r.mem.set(v.subarray(2),m)}r.io=(d,m)=>k(r,d,m),n.basic&&(Object.assign(r.mem,{205:2,206:32,207:0,647:254}),X(r,n.start));return}for(let[d,m]of Object.entries(n.load??{}))r.mem.set(s.file("/"+s.volumes[0]+"/"+d).body,m);if(n.disk.kind==="dos33"){for(let d=0;d<24;d++)r.mem.fill(160,1024+(d&7)*128+(d>>3)*40,1024+(d&7)*128+(d>>3)*40+40);for(let[d,m,v]of n.disk.loads)v&&f(r,v),r.mem.set(s.file(d).body,m);f(r,1),c.read=1,Object.assign(r.mem,{32:0,33:40,34:16,35:24,50:255}),r.delay=2500}r.io=(d,m)=>k(r,d,m)},D}var an={};U(an,{compile:()=>xr});var rn={};U(rn,{branchTaken:()=>Be,operand:()=>te,parse:()=>De,words:()=>rt});var lr=/"(?:[^"\\]|\\.)*"|\S+/g;function De(n,e="script"){let t=[],s={},i=[];return n.split(`
21
+ `).forEach((o,c)=>{let f=o.replace(/^\s+|\s+$/g,"");if(!f||f.startsWith(";"))return;let l=e+":"+(c+1),p;if(p=/^(L[0-9A-F]{4}|[A-Za-z_][\w-]*):$/.exec(f)){s[p[1]]=t.length;return}if(p=/^data \$([0-9A-F]+)((?: [0-9A-F]{2})+)$/i.exec(f)){i.push({at:parseInt(p[1],16),bytes:p[2].trim().split(" ").map(k=>parseInt(k,16))});return}p=/^([0-9A-F]{4})\s+(.*)$/.exec(f);let x=p?parseInt(p[1],16):null,u=p?p[2]:f;t.push({at:x,words:rt(u),text:u,where:l,index:t.length})}),{steps:t,labels:s,data:i}}var rt=n=>n.match(lr).map(e=>e.startsWith('"')?{string:JSON.parse(e)}:e);function te(n){if(typeof n!="string")return{string:n.string};if(/^-?\d+$/.test(n))return{number:+n};if(/^[axy]$/.test(n)||n==="carry"||n==="borrow")return{reg:n};let e;if(e=/^\$([0-9A-F]+)(?:\[([xy])\])?$/i.exec(n))return{at:parseInt(e[1],16),index:e[2],zp:e[1].length<=2};if(e=/^\(\$([0-9A-F]{2})\)\[y\]$/i.exec(n))return{through:parseInt(e[1],16)};if(e=/^\(\$([0-9A-F]{2})\[x\]\)$/i.exec(n))return{pair:parseInt(e[1],16)};if(e=/^\[\$([0-9A-F]{4})\](?:\[([xy])\])?$/i.exec(n))return{via:parseInt(e[1],16),index:e[2]};throw new Error("not an operand: "+n)}var fr=n=>/^\d+$/.test(n)||/^\$[0-9A-F]{2}(\[[xy]\])?$/i.test(n)||/^\(\$/.test(n)?2:3;function Be(n){if(n.at===null)return 1;let e=n.words,t=parseInt(e.at(-1).slice(1),16),s=n.at+(e.length===6?fr(e[3]):0)+2&65535;return/^L[0-9A-F]{4}$/.test(e.at(-1))&&(t&65280)!==(s&65280)?2:1}var G=(n,e=2)=>"0x"+n.toString(16).padStart(e,"0"),Bt=49152,Ut=49407,hr=n=>n>=Bt&&n<=Ut;function zt(n){if(n.through!==void 0)return{js:`(e.mem[${G(n.through)}] | e.mem[${G(n.through+1)}] << 8) + e.y & 0xffff`,io:!0};if(n.pair!==void 0)return{js:`e.mem[${G(n.pair)} + e.x & 0xff] | e.mem[${G(n.pair)} + e.x + 1 & 0xff] << 8`,io:!0};if(n.via!==void 0)return{js:`(e.mem[${G(n.via,4)}] | e.mem[${G(n.via+1,4)}] << 8)${n.index?" + e."+n.index+" & 0xffff":""}`,io:!0};if(!n.index)return{js:G(n.at,4),io:hr(n.at)};let e=n.at<=Ut&&n.at+255>=Bt;return{js:n.at+255>65535?`(${G(n.at,4)} + e.${n.index}) & 0xffff`:`${G(n.at,4)} + e.${n.index}`,io:e}}function Ce(n,e=!0){let t=te(n);if(t.number!==void 0)return{js:String(t.number&255)};if(t.reg==="carry")return{js:"e.c"};if(t.reg)return{js:"e."+t.reg};let s=zt(t);return e&&t.through!==void 0?{js:`e.read(e.ix(e.mem[${G(t.through)}] | e.mem[${G(t.through+1)}] << 8, e.y))`,io:!0}:e&&t.via!==void 0&&t.index?{js:`e.read(e.ix(e.mem[${G(t.via,4)}] | e.mem[${G(t.via+1,4)}] << 8, e.${t.index}))`,io:!0}:e&&t.index&&!t.zp?{js:s.io?`e.read(e.ix(${G(t.at,4)}, e.${t.index}))`:`e.mem[e.ix(${G(t.at,4)}, e.${t.index})]`,io:s.io}:{js:s.io?`e.read(${s.js})`:`e.mem[${s.js}]`,io:s.io}}function dr(n,e){let t=te(n);if(t.reg)return{js:`e.${t.reg} = ${e}`};let s=zt(t);return{js:s.io?`e.write(${s.js}, ${e})`:`e.mem[${s.js}] = ${e}`,io:s.io}}function on(n){let e=te(n);if(e.reg)return{pre:"",read:"e."+e.reg,write:s=>`e.${e.reg} = ${s}`};let t=zt(e);return t.io?{pre:`const at = ${t.js}; `,read:"e.read(at)",write:s=>`e.write(at, ${s})`,io:!0}:{pre:"",read:`e.mem[${t.js}]`,write:s=>`e.mem[${t.js}] = ${s}`}}var pr={zero:"e.z",carry:"e.c",negative:"e.n",overflow:"e.v"},ur={"==":"e.z","!=":"!e.z",">=":"e.c","<":"!e.c"};function mr(n,e){let t=n.words,[s,i]=t,o=`s[${e}]`,c=(...l)=>({js:l.map(p=>p.js??p).join(""),kind:l.some(p=>p.io)?"io":"compute"});if(i==="="&&t.length===3){let l=Ce(t[2]),p=te(s);if(p.reg==="carry")return c("e.c = ",l," & 1;");if(p.reg)return c(`e.${p.reg} = e.flags(`,l,");");let x=dr(s,l.js);return{js:x.js+";",kind:l.io||x.io?"io":"compute"}}if(i==="+="||i==="-="){let l=Ce(t[2]);if(t.length===3){let p=on(s);return{js:`${p.pre}${p.write(`e.flags(${p.read} ${i[0]} ${l.js} & 0xff)`)};`,kind:p.io||l.io?"io":"compute"}}return{js:i==="+="?`e.add(${l.js});`:`e.sub(${l.js});`,kind:l.io?"io":"compute"}}if(i==="&="||i==="|="||i==="^="){let l=Ce(t[2]);return c(`e.a = e.flags(e.a ${i[0]} `,l,");")}if(i==="<<="||i===">>="||i==="rotate"){let l=on(s),p=i==="<<="||t[2]==="left";return{js:`${l.pre}${l.write(`e.shift(${l.read}, ${p}, ${i==="rotate"})`)};`,kind:l.io?"io":"compute"}}switch(s){case"if":{let l=t.at(-1),p=t.slice(1,-2);if(p.length===3&&/^[axy]$/.test(p[0])){let k=Ce(p[2]);return{js:`e.compare(e.${p[0]}, ${k.js}); if (${ur[p[1]]})`,kind:"branch",to:l,io:k.io}}let x=p[0]==="not",u=pr[x?p[1]:p[0]];if(!u)throw new Error(n.where+": no flag "+p.join(" "));return{js:`if (${x?"!":""}${u})`,kind:"branch",to:l}}case"goto":return t[1].startsWith("(")?{js:`return e.jumpThrough(${G(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:t[1].startsWith("[")?{js:`return e.jumpTable(${G(parseInt(t[1].slice(2),16),4)}, e.${t[2][0]});`,kind:"end"}:{js:`return e.jump('${t[1]}', ${o});`,kind:"end"};case"call":return t[1].startsWith("(")?{js:`return e.callThrough(${G(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:{js:`return e.call('${t[1]}', ${o});`,kind:"end"};case"return":return{js:`return e.ret(${o});`,kind:"end"};case"compare":return c(`e.compare(e.${t[1]}, `,Ce(t[2]),");");case"test":return c("e.test(",Ce(t[1]),");");case"push":return{js:`e.push(${t[1]==="a"});`,kind:"compute"};case"pull":return{js:`e.pull(${t[1]==="a"});`,kind:"compute"};case"asm":return t[1]==="RTI"?{js:`return e.ret(${o});`,kind:"end"}:{js:["TSX","TXS","CLV","SED","CLD","SEI","CLI"].includes(t[1])?`e.asm('${t[1]}');`:"",kind:"compute"}}let f=t.slice(1).map(l=>typeof l=="string"?`'${l}'`:`{ string: ${JSON.stringify(l.string)} }`).join(", ");return{js:`return e.routine('${s}', [${f}], ${o});`,kind:"routine"}}function xr(n,e,{io:t=[49152,49407]}={}){[Bt,Ut]=t;let{steps:s,labels:i,data:o}=De(n,e),c=s.map((x,u)=>mr(x,u)),f=new Set([0,...Object.values(i)]);c.forEach((x,u)=>{(x.kind==="routine"||x.kind==="io"||x.io)&&f.add(u),(x.kind!=="compute"&&x.kind!=="branch"||x.io)&&f.add(u+1)});let l=Object.fromEntries(Object.entries(i).map(([x,u])=>[u,x])),p=[];for(let x=0;x<s.length;x++){if(!f.has(x))continue;let u=x+1;for(;u<s.length&&!f.has(u);)u++;let k=c.slice(x,u).some(h=>h.kind==="branch"&&i[h.to]===x),w=[];for(let h=x;h<u;h++){if((h===x||c[h-1].kind==="branch")&&c[h].kind!=="routine"){let C=h;for(;C<u-1&&c[C].kind!=="branch";)C++;w.push(`e.time(s, ${h}, ${C});`)}let g=c[h],E=s[h].at===null?s[h].text:s[h].at.toString(16).toUpperCase().padStart(4,"0")+" "+s[h].text,$=g.js;if(g.kind==="branch"){let C=i[g.to],R=Be(s[h]),M=R===1?"e.cycles++":`e.cycles += ${R}`;$+=C===void 0?` { ${M}; e.pc = e.label('${g.to}'); return; }`:C===x&&k?` { ${M}; continue; }`:` { ${M}; e.pc = ${C}; return; }`}g.kind==="end"&&($=`e.pc = ${h+1}; `+$),w.push($?`${$.padEnd(48)} // ${E}`:`// ${E}`)}c[u-1].kind!=="end"&&c[u-1].kind!=="routine"&&u!==x+1&&w.push(`e.pc = ${u};`);let O=l[x]?` // ${l[x]}
22
+ `:"",T=w.length===1&&/^return (.*?);( +\/\/ .*)$/.exec(w[0]);if(T){p.push(`${O} ${`${x}: (e, s) => ${T[1]},`.padEnd(60)}${T[2].trim()?" "+T[2].trim():""}`);continue}let a=k?["for (;;) {",...w.map(h=>" "+h)," break;","}"]:w;p.push(`${O} ${x}: (e, s) => {
23
23
  ${a.map(h=>" "+h).join(`
24
24
  `)}
25
- },`)}return[`// ${e}, compiled from ${e}.scene by moonbase-compile (@moonbase-machines/player/remake/compile.js): compiled`,"// again from the scene, never edited","export default {",` labels: ${JSON.stringify(n)},`,` data: [${o.map(x=>`
25
+ },`)}return[`// ${e}, compiled from ${e}.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(x=>`
26
26
  [${G(x.at,4)}, [${x.bytes.map(u=>G(u)).join(", ")}]],`).join("")}
27
27
  ],`,` steps: [${s.map(x=>`
28
28
  [${x.at===null?"null":G(x.at,4)}, ${+x.where.split(":").at(-1)}, ${JSON.stringify(x.text)}],`).join("")}
29
29
  ],`," run: {",...p," },","};",""].join(`
30
- `)}var pi={};z(pi,{Engine:()=>ze,label16:()=>Ue});import{cpu as gr}from"@moonbase-machines/mos6502";var{CPU:Go,CYCLES:Kt}=gr;var ai={left:!0},kr=new Set(["if","goto","call","return","compare","test","asm","push","pull"]),ci=i=>kr.has(i.words[0])||/^(=|\+=|-=|&=|\|=|\^=|<<=|>>=|rotate)$/.test(i.words[1]),li=1020.484;function fi(i){if(i===32)return 3;if(i===0||i===64||i===96)return 1;let e=i>>2&7,t=i&3;return t===1?e===3||e===6||e===7?3:2:e===0?t===2||(i&224)>=160?2:1:e===2||e===6?t===0||t===2?1:2:e===4?2:e===3||e===7?3:2}var wr=new Set([234,169,162,160,165,166,164,173,174,172,24,56]),hi=i=>i.words[0]==="if"&&i.words.length===6,di=i=>i?.at==null?void 0:i.at+2&65535,Ue=i=>"L"+i.toString(16).toUpperCase().padStart(4,"0"),ze=class{constructor({routines:e,scripts:t,start:s,label:n,memory:o={}}){this.routines=e,this.sources=t,this.mem=new Uint8Array(65536);for(let[c,f]of Object.entries(o))this.mem[c]=f;this.a=0,this.x=0,this.y=0,this.n=0,this.z=0,this.c=0,this.v=0,this.d=0,this.stack=[],this.keys=[],this.listeners=[],this.takers=[],this.ended=!1,this.timed=!!e.timed,this.cycles=0,this.clicks=[],this.delay=0,this.programs={},e.setup?.(this),this.enter(s,n,!0)}on(e){this.listeners.push(e)}emit(e){this.inside&&(e.inside=!0);for(let t of this.listeners)t(e)}inside=0;press(e){this.keys.push(e)}key(){let e=this.keys.shift();if(e!==void 0)for(let t of this.takers)t(e);return e}onKey(e){return this.takers.push(e),()=>{this.takers=this.takers.filter(t=>t!==e)}}enter(e,t,s=!1){let n=this.script(e);if(s)for(let o of n.data)this.mem.set(o.bytes,o.at);this.program=n,this.name=e,this.pc=t===void 0?0:this.label(t)}script(e){if(this.programs[e])return this.programs[e];let t=this.sources[e];if(t===void 0)throw new Error("no script "+e);let s=this.programs[e]=typeof t=="string"?De(t,e):{labels:t.labels,data:t.data.map(([n,o])=>({at:n,bytes:o})),steps:t.steps.map(([n,o,c],f)=>({at:n,text:c,where:e+":"+o,run:t.run[f],words:rt(c),index:f}))};for(let[n,o]of Object.entries(s.labels)){let c=/^L[0-9A-F]{4}$/.test(n)?parseInt(n.slice(1),16):null;c!==null&&s.steps[o]?.at>c&&(s.steps[o].start=c),c!==null&&s.steps[o]?.at===c&&(s.steps[o].entered=!0)}return s}callInside(e,t,s,n){this.stack.push({name:this.name,pc:this.pc,inside:!0,done:s,ret:n}),this.inside++,this.enter(e,t)}leave(e,t){throw this.stack=[],this.problem=null,this.waitingOn=null,this.visited=null,this.enter(e,t),ai}visit(e){this.visiting=e}startVisit(e){let[t,s]=this.title.visit[this.visiting];this.visiting=void 0,this.visited||(this.visited={name:this.name,pc:e,stack:this.stack,problem:this.problem,waitingOn:this.waitingOn,asked:this.asked,askMode:this.askMode,regs:[this.a,this.x,this.y,this.n,this.z,this.c,this.v]},this.title.raster?.keepScreen(),this.inside++,this.emit({step:"keep-screen"}),this.inside--,this.routines.show(this,[],null)),this.stack=[{visit:!0}],this.problem=null,this.waitingOn=null,this.asked=null,this.a=2,this.c=0,this.enter(t,s)}endVisit(){let e=this.visited;this.visited=null,this.title.raster?.putScreen(),this.inside++,this.emit({step:"put-screen"}),this.inside--,this.routines.show(this,[],null),this.enter(e.name),Object.assign(this,{pc:e.pc,stack:e.stack,problem:e.problem,waitingOn:e.waitingOn,asked:e.asked,askMode:e.askMode}),[this.a,this.x,this.y,this.n,this.z,this.c,this.v]=e.regs}label(e){let t=this.program.labels[e];if(t===void 0)throw new Error(this.name+": no label "+e);return t}place(e){if(e.through!==void 0)return(this.mem[e.through]|this.mem[e.through+1]<<8)+this.y&65535;if(e.pair!==void 0){let t=e.pair+this.x&255;return this.mem[t]|this.mem[t+1&255]<<8}return e.via!==void 0?(this.mem[e.via]|this.mem[e.via+1]<<8)+(e.index?this[e.index]:0)&65535:e.at+(e.index?this[e.index]:0)&65535}read(e){return this.io&&this.ioAt(e)?this.io(e)&255:this.mem[e]}write(e,t){this.io&&this.ioAt(e)?this.io(e,t&255):this.mem[e]=t}ioAt(e){return(e&65280)===49152}get(e){return e.number!==void 0?e.number&255:e.reg==="carry"?this.c:e.reg?this[e.reg]:this.read(this.place(e))}load(e){return this.timed&&(e.index&&!e.zp||e.through!==void 0)&&((e.through!==void 0?this.mem[e.through]|this.mem[e.through+1]<<8:e.via!==void 0?this.mem[e.via]|this.mem[e.via+1]<<8:e.at)&255)+this[e.index??"y"]>255&&this.cycles++,this.get(e)}ix(e,t){return this.timed&&(e&255)+t>255&&this.cycles++,e+t&65535}set(e,t){if(t&=255,e.reg){this[e.reg]=t;return}this.write(this.place(e),t)}flags(e){return this.n=e>>7&1,this.z=e===0?1:0,e}compare(e,t){let s=e-t&511;this.c=e>=t?1:0,this.flags(s&255)}time(e,t,s){if(!this.timed)return;let n=e[t].cycles;if(n===void 0){n=0;for(let o=t;o<=s;o++)n+=this.cost(e,o);e[t].cycles=n}this.cycles+=n,this.delay+=n/li}cost(e,t){let s=e[t],n=this.mem;if(s.at===null)return 0;let o=Kt[n[s.at]]+(hi(s)?2:0),c=!s.entered&&!["return","goto"].includes(e[t-1]?.words[0])?e[t-1]:null;if(s.start!==void 0||c&&c.at!==null){let f=s.start??c.at+fi(n[c.at])+(hi(c)?2:0)+(this.routines.inline?.(this,c)??0);if(f<s.at&&s.at-f<=9){let l=0,p=f;for(;p<s.at&&wr.has(n[p]);p+=fi(n[p]))l+=Kt[n[p]];p===s.at&&(o+=l)}}return o}add(e){if(this.d){let n=(this.a&15)+(e&15)+this.c,o=(this.a>>4)+(e>>4);n>9&&(n-=10,o++),this.z=(this.a+e+this.c&255)===0?1:0,this.n=o&8?1:0,this.v=~(this.a^e)&(this.a^o<<4)&128?1:0,o>9?(o-=10,this.c=1):this.c=0,this.a=(o<<4|n)&255;return}let t=this.a,s=t+e+this.c;this.v=~(t^e)&(t^s)&128?1:0,this.c=s>255?1:0,this.a=this.flags(s&255)}sub(e){if(!this.d)return this.add(e^255);let t=(this.a&15)-(e&15)-(1-this.c),s=(this.a>>4)-(e>>4);t<0&&(t+=10,s--);let n=this.a-e-(1-this.c);this.z=(n&255)===0?1:0,this.n=n&128?1:0,this.v=(this.a^e)&(this.a^n)&128?1:0,this.c=n>=0?1:0,s<0&&(s+=10),this.a=(s<<4|t)&255}shift(e,t,s){let n=t?(e<<1|(s?this.c:0))&255:e>>1|(s&&this.c?128:0);return this.c=t?e>>7:e&1,this.flags(n)}test(e){this.n=e>>7&1,this.v=e>>6&1,this.z=(e&this.a)===0?1:0}jump(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["goto-engine"](this,["$"+e.slice(1)],t);this.pc=this.label(e)}jumpThrough(e,t){let s=Ue(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[s]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+s.slice(1)],t);this.pc=this.label(s)}jumpTable(e,t){this.pc=this.label(Ue(this.mem[e+t]|this.mem[e+t+1]<<8))}call(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["call-engine"](this,["$"+e.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:di(t)}),this.pc=this.label(e)}callThrough(e,t){let s=Ue(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[s]===void 0&&this.routines["call-engine"])return this.routines["call-engine"](this,["$"+s.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:di(t)}),this.pc=this.label(s)}ret(e){let t=this.stack.pop();if(!t)throw new Error("return with nothing called");if(t.visit){this.endVisit();return}let s=this.pulled;if(t.a!==void 0&&this.stack.at(-1)?.a!==void 0){let n=this.stack.pop().a,o=(n<<8|t.a)+1&65535,c=Ue(o);if(s?.ret!==void 0&&o>s.ret&&o-s.ret<=256){this.pulled=null,s.name!==this.name&&this.enter(s.name),this.pc=s.pc,s.inside&&(this.inside--,s.done?.(this));return}if(s?.ret!==void 0&&o<=s.ret&&s.ret-o<=32&&this.script(s.name).labels[c]!==void 0){this.pulled=null,s.name!==this.name&&this.enter(s.name),this.pc=this.label(c),s.inside&&(this.again=this.again?.ret===s.ret?{...this.again,n:this.again.n+1}:{ret:s.ret,done:s.done,n:1});return}if(this.program.labels[c]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+c.slice(1)],e);this.pc=this.label(c);return}if(s&&this.stack.length<s.depth&&(this.pulled=null,s.inside&&s.ret!==void 0&&this.inside--),t.name!==this.name&&this.enter(t.name),this.pc=t.pc,t.inside&&(this.inside--,t.done?.(this)),this.again&&t.ret===this.again.ret){let n=this.again;this.again=null,this.inside-=n.n,n.done?.(this)}t.after?.(this)}push(e){this.stack.push(e?{a:this.a}:{flags:[this.n,this.z,this.c,this.v]})}pull(e){let t=this.stack.at(-1);if(t&&t.name!==void 0){let n=t.ret===void 0?0:t.half?t.ret>>8:t.ret&255;t.half?(this.stack.pop(),t.depth=this.stack.length,this.pulled=t,t.inside&&t.ret===void 0&&this.inside--):t.half=!0,e&&(this.a=this.flags(n));return}let s=this.stack.pop();e?this.a=this.flags(s.a):[this.n,this.z,this.c,this.v]=s.flags}asm(e){if(e==="TSX"){let t=255-this.stack.reduce((s,n)=>s+(n.name===void 0||n.half?1:2),0)&255;(this.stacks??=new Map).set(t,this.stack.map(s=>({...s}))),this.x=this.flags(t)}if(e==="TXS"){let t=this.stacks?.get(this.x);this.stack=t?t.map(s=>({...s})):[],this.visited=null,this.inside=this.stack.filter(s=>s.inside).length}e==="CLV"&&(this.v=0),e==="SED"&&(this.d=1),e==="CLD"&&(this.d=0),e==="SEI"&&(this.i=1),e==="CLI"&&(this.i=0)}run(e=1e7){this.pacing||(this.idle=0),this.pacing=!1,this.delay??=0;for(let t=0;t<e;t++){if(this.ended)return"end";let s=this.program.steps[this.pc];if(!s)throw new Error(this.name+": ran off the end");if(this.routines.before?.(this,s)==="wait"||this.exec(s)==="wait")return"idle";if(this.polled)return this.polled=!1,"idle";if(this.delay>=16)return this.pacing=!0,"pace"}return"steps"}exec(e){let t=this.pc;this.pc++;try{this.called=!1,!e.run&&ci(e)&&this.time(this.program.steps,t,t);let s=e.run?e.run(this,this.program.steps):this.interpret(e);if(s==="wait"&&(e.run?this.called:!ci(e))&&(this.pc=t,this.visiting!==void 0)){this.startVisit(t);return}return s}catch(s){if(s===ai){this.inside=0;return}if(this.routines.error?.(this,s)){this.ended=!0;return}throw s.message=e.where+" ("+e.text+"): "+s.message,s}}interpret(e){let t=e.words,[s,n]=t;if(n==="="&&t.length===3){let o=te(s),c=this.load(te(t[2]));if(o.reg==="carry"){this.c=c&1;return}this.set(o,c),o.reg&&this.flags(c);return}if(n==="+="||n==="-="){let o=te(s),c=t.length===3?this.get(te(t[2])):this.load(te(t[2]));if(t.length===3){let f=this.get(o)+(n==="+="?c:-c)&255;this.set(o,f),this.flags(f);return}n==="+="?this.add(c):this.sub(c);return}if(n==="&="||n==="|="||n==="^="){let o=this.load(te(t[2]));this.a=this.flags(n==="&="?this.a&o:n==="|="?this.a|o:this.a^o);return}if(n==="<<="||n===">>="||n==="rotate"){let o=te(s);this.set(o,this.shift(this.get(o),n==="<<="||t[2]==="left",n==="rotate"));return}switch(s){case"if":return this.branch(t,e);case"goto":return t[1].startsWith("(")?this.jumpThrough(parseInt(t[1].slice(2,-1),16),e):t[1].startsWith("[")?this.jumpTable(parseInt(t[1].slice(2),16),this[t[2][0]]):this.jump(t[1],e);case"call":return t[1].startsWith("(")?this.callThrough(parseInt(t[1].slice(2,-1),16),e):this.call(t[1],e);case"return":return this.ret(e);case"compare":this.compare(this[t[1]],this.load(te(t[2])));return;case"test":this.test(this.get(te(t[1])));return;case"asm":if(t[1]==="RTI")return this.ret(e);this.asm(t[1]);return;case"push":this.push(t[1]==="a");return;case"pull":this.pull(t[1]==="a");return}return this.routine(s,t.slice(1),e)}routine(e,t,s){let n=this.routines[e];if(!n)throw new Error("no routine "+e);if(this.called=!0,s&&this.timed&&s.at!==null){let o=this.cost(this.program.steps,s.index);this.cycles+=o,this.delay+=o/li}return n(this,t,s)}branch(e,t){let s=e.at(-1),n=e.slice(1,-2),o;if(n.length===3&&/^[axy]$/.test(n[0]))this.compare(this[n[0]],this.load(te(n[2]))),o={"==":this.z,"!=":!this.z,">=":this.c,"<":!this.c}[n[1]];else{let c=n[0]==="not",f=c?n[1]:n[0],l={zero:this.z,carry:this.c,negative:this.n,overflow:this.v}[f];if(l===void 0)throw new Error("no flag "+f);o=c?!l:!!l}o&&(this.cycles+=Be(t),this.pc=this.label(s))}};var gi={};z(gi,{LAYOUT:()=>be,PANELS:()=>Ke,layout:()=>qe,resolve:()=>Oe,textLayout:()=>Fe,textPage:()=>ve,textPen:()=>We,word:()=>xi});import{font as yr}from"@moonbase-machines/vector";var{GLYPHS:sa,WIDTHS:ia,dots:ot,start:ui,useFont:mi,width:re}=yr;var be={65:[116,116,174],50:[116,116,160],49:[130,130,174],34:[130,130,160],17:[158,158,174]},oe=(i,e,t,s,n)=>({layout:i,rows:e,fill:10,paper:10,ink:0,gap:t,y:s,more:n}),ce=(i,e,t,s)=>({layout:i,rows:e,fill:5,paper:5,ink:15,gap:t,y:s}),Ke={1:oe(50,[116,159],7,128),2:oe(50,[116,159],33,135),3:oe(34,[130,159],5,135),4:oe(34,[130,159],19,142),5:ce(34,[160,189],5,166),6:ce(34,[160,189],19,172),7:oe(65,[116,173],5,121),8:oe(65,[116,173],6,128),9:oe(65,[116,173],7,134),10:oe(65,[116,173],47,142),11:oe(50,[116,159],5,121),12:oe(49,[130,173],5,135),13:oe(49,[130,173],7,142),14:oe(49,[130,173],33,149),15:oe(17,[158,173],5,163,[174]),16:ce(50,[160,189],19,172),17:ce(66,[160,189],19,172),18:ce(50,[160,189],5,166),19:ce(66,[160,189],5,166),20:ce(35,[160,189],0,163),21:ce(51,[160,189],0,163),22:ce(67,[160,189],0,163),23:ce(49,[174,189],5,179),24:ce(65,[174,189],5,179)};function xi(i,[e,t,s,n]){let o=e|t<<8,c=n===255?s:i[s|n<<8];for(;c-- >0;)o+=i[o]+1;let f="";for(let l=1;l<=i[o];l++)f+=String.fromCharCode(i[o+l]&127);return f}var Oe=(i,e)=>i.replace(/\{6:([0-9a-f,]+)\}/g,(t,s)=>xi(e,s.split(",").map(n=>parseInt(n,16))));function qe(i,e){let t=e,s=[];t.tall=!1,t.margin=t.x;let n=9,o=!1,c=[],f=t.ink,l=!1,p=u=>{if(c.length){let k=ui(c.map(L=>L.ch),t.spacing,t.x,t.centre),w=[];for(let L of c){let T=re(L.ch);w.push({ch:L.ch,x:k,ink:L.ink}),k+=L.ch.charCodeAt(0)<32?T:T+t.spacing}s.push({top:t.y,tall:t.tall,height:n,paper:t.paper,ink:t.ink,chars:w}),t.x=k}c=[],u&&(t.y+=(t.tall?2*n:n)+t.gap,t.x=t.margin)},x=u=>c.push({ch:o&&u>="0"&&u<="9"?String.fromCharCode(128+u.charCodeAt(0)-48):u,ink:l?f:void 0});for(let u=0;u<i.length;u++){let k=i[u];if(k===`
31
- `){p(!0);continue}if(k==="{"){let w=i.indexOf("}",u),[L,T]=i.slice(u+1,w).split(":"),a=(T??"").split(",").map(h=>parseInt(h,16));switch(u=w,parseInt(L,16)){case 0:t.x=t.margin=a[0];break;case 1:a[0]<192?t.y=a[0]:n=a[0]-192;break;case 2:t.spacing=a[0];break;case 3:t.gap=a[0];break;case 4:t.ink=f=a[0],l=!0;break;case 5:t.paper=a[0];break;case 7:t.centre=!0;break;case 8:t.centre=!1;break;case 9:t.tall=!0;break;case 10:t.tall=!1;break;case 13:f=0,l=!0;break;case 14:f=1,l=!0;break;case 16:o=!0;break;case 17:o=!1;break;case 15:for(let h=0;h<(a[1]||256);h++)x(String.fromCharCode(a[0]&127));break}continue}x(k)}return p(!1),s}function Fe(i,e){let t=[];e.inverse=!1;let s=[],n=c=>{let f=e.centre?40-s.length>>1:e.x;s.forEach((l,p)=>t.push({row:e.y,col:f+p,ch:l.ch,inverse:l.inverse})),s.length&&(e.x=f+s.length),s=[],c&&(e.y++,e.x=e.margin)},o=c=>s.push({ch:e.inverse?c.toUpperCase():c,inverse:e.inverse});for(let c=0;c<i.length;c++){let f=i[c];if(f===`
32
- `){n(!0);continue}if(f==="{"){let l=i.indexOf("}",c),[p,x]=i.slice(c+1,l).split(":"),u=(x??"").split(",").map(k=>parseInt(k,16));switch(c=l,parseInt(p,16)){case 0:n(!1),e.x=e.margin=u[0];break;case 1:n(!1),u[0]<192&&(e.y=u[0]);break;case 7:e.centre=!0;break;case 8:e.centre=!1;break;case 13:e.inverse=!0;break;case 14:e.inverse=!1;break;case 15:for(let k=0;k<(u[1]||256);k++)o(String.fromCharCode(u[0]&127));break}continue}o(f)}return n(!1),t}var We=()=>({x:0,y:0,margin:0,centre:!1,inverse:!1}),ve=()=>Array.from({length:24},()=>Array.from({length:40},()=>({ch:" ",inverse:!1})));var Ai={};z(Ai,{loadTitle:()=>Ht,makeEngine:()=>Yt});var Ci={};z(Ci,{codeFiles:()=>Ye,pictureShapes:()=>Sr,vectorRoutines:()=>Wt});var ki={};z(ki,{helpers:()=>qt});function qt(i,e){let t=i.title.map.vars.zero;function*s(f,...l){let p={words:[f]},x=l.map(u=>typeof u=="string"&&f==="text"?{string:u}:typeof u=="number"?String(u):u);for(;;){if(e[f](i,x,p)!=="wait")return{a:i.a,x:i.x,y:i.y,c:i.c};yield"wait"}}let n=(f,l=0,p,x)=>{i.a=l&255,p!==void 0&&(i.x=p&255),x!==void 0&&(i.y=x&255),i.title.paint?.[f]?.(i.title.model,i),i.emit(Q(f,[],i,void 0,u=>i.mem[u+t],u=>i.mem[u]))};function*o(f="wait"){let l={words:[f]};for(;;){let p=i.key();if(p===5&&i.title?.menu&&i.leave(...i.title.menu),i.title?.visit?.[p]){i.visit(p),i.waitingOn=l,yield"wait";continue}if(p!==void 0)return i.waitingOn=null,p;i.waitingOn=l,yield"wait"}}function*c(f){i.inside++;try{return yield*f}finally{i.inside--}}return{e:i,mem:i.mem,call:s,drawn:n,key:o,inside:c}}import{objects as br}from"@moonbase-machines/vector";var{carry:wi,decode:ca,put:yi,tables:at}=br;Ge();var Si={};z(Si,{Raster:()=>He});import{draw as vr}from"@moonbase-machines/vector";var{crossings:ha,draw:bi,fill:da,inside:pa,line:vi,outline:ua,screen:Ft,spans:ma,under:xa}=vr;var He=class{constructor(){this.dots=Ft(15),this.kept=null}keepScreen(){this.screenKept={dots:this.dots,kept:this.kept},this.dots=Ft(0)}putScreen(){this.screenKept&&({dots:this.dots,kept:this.kept}=this.screenKept),this.screenKept=null}scroll(){for(let e=19;e<=115;e++){let t=this.dots[e],s=[];for(let n of t)s.push(n>>3&1,n>>2&1,n>>1&1,n&1);for(let n=14;n<518;n++)s[n]=s[n+28];for(let n=0;n<140;n++)t[n]=s[4*n]<<3|s[4*n+1]<<2|s[4*n+2]<<1|s[4*n+3]}}set(e,t,s){e>=0&&e<140&&t>=0&&t<192&&(this.dots[t][e]=s&15)}get(e,t){return e>=0&&e<140&&t>=0&&t<192?this.dots[t][e]:0}span(e,t,s,n){for(let o=t;o<=s;o++)this.set(o,n,e)}rows(e,t,s,n){for(let o=s;o<s+t;o++)this.span(e,0,139,o),n&&(this.set(0,o,15),this.set(139,o,15))}whiteLines(e){this.span(15,0,139,e),this.span(15,0,139,e+1)}box(e,t,s,n){let[o,c,f]=be[e]??be[50];if(t!==128){this.span(0,1,138,1),this.span(0,1,138,o-1);for(let l=2;l<o-1;l++)this.set(1,l,0),this.set(138,l,0),this.span(t,2,137,l)}s!==128&&(this.whiteLines(c),this.rows(s,f-c-2,c+2,!0)),n!==128&&(this.whiteLines(f),this.rows(n,190-f-2,f+2,!0))}panel(e,t,s){this.whiteLines(e),this.rows(s,t-e-1,e+2,!0)}picture(e){bi(e,this.dots)}rectangle(e,t,s,n,o){for(let c=s;c<s+o;c++)this.span(e,t,t+n-1,c)}outline(e,t,s,n,o){this.span(e,t,t+n-1,s),this.span(e,t,t+n-1,s+o-1);for(let c=s;c<s+o;c++)this.set(t,c,e),this.set(t+n-1,c,e)}line(e,t,s,n,o){for(let[c,f]of vi(t,s,n,o))this.set(c,f,e)}object(e,t,s,n){n==="keep"&&(this.kept={x:t,y:s,rows:e.rows.map((o,c)=>o.map((f,l)=>this.get(t+l,s+c)))}),yi(this.dots,e,t,s,n==="whole")}restore(){let e=this.kept;e&&e.rows.forEach((t,s)=>t.forEach((n,o)=>this.set(e.x+o,e.y+s,n)))}glyph(e,t,s,n,o,c=1,f=9,l=0){let p=re(e);if(e.charCodeAt(0)<32){for(let u=0;u<Math.min(9,f);u++)for(let k=0;k<p;k++)for(let w=0;w<c;w++)this.set(t+k,s+u*c+w,o);return p}let x=new Set(ot(e).map(([u,k])=>u+","+k));for(let u=0;u<Math.min(9,f);u++)for(let k=0;k<p+l;k++)for(let w=0;w<c;w++)this.set(t+k,s+u*c+w,x.has(k+","+u)?n:o);return p}};function Ye(i,e){let t=i?.loads??{};return Object.entries(e).filter(([s])=>/^(PART|PROB)\d$/.test(s)).map(([s,n])=>({name:s,bytes:Uint8Array.from(atob(n.data),o=>o.charCodeAt(0)),origin:t[s]??t[s.slice(0,-1)]??n.aux}))}var ie={escape:27,space:32,return:13,delete:127,left:8,right:21,down:10,up:11,menu:5};function xe(i,e,t){let s=ue[e]||"",n=[],o=0;e==="panel"&&n.push(t[o++]);let c={a:i.a,x:i.x,y:i.y};if(e==="objects"&&t[0]?.startsWith?.("$")){let f=parseInt(t[o++].slice(1),16);c.x=f&255,c.y=f>>8}else for(let f of s){let l=t[o++];l===void 0||l===f||(c[f]=typeof l=="object"?l.string.charCodeAt(0)|128:l.startsWith("$")?i.mem[parseInt(l.slice(1),16)]:+l)}return i.a=c.a&255,i.x=c.x&255,i.y=c.y&255,{fixed:n,rest:t.slice(o)}}function ct(i,e,t,s,n,o){for(i.waitingOn!==e&&(i.emit(Q(t,s,i,n)),i.waitingOn=e,i.asked=null);;){let c=i.key();if(c===void 0)return"wait";if(c===ie.menu&&i.title.menu&&i.leave(...i.title.menu),i.title.visit?.[c])return i.visit(c),"wait";if(o(c)){i.waitingOn=null;return}}}function Ei(i,e){if(e){i.inside++;try{for(let t=e.next();!t.done;t=e.next())if(t.value==="wait")throw new Error("a choice drawn inside the ask cannot wait")}finally{i.inside--}}}function ji(i){if(i.objectTables||!i.disk)return i.objectTables;let e=Ye(i.map,Object.values(i.disk.volumes)[0]);return i.objectTables=new Map(at(e,i.map.objects).map(t=>[t.address,t.objects]))}function $i(i){if(i.pictureShapes||!i.disk)return i.pictureShapes;let e=Object.values(i.disk.volumes)[0],t=new Map;for(let[s,n]of Object.entries(e))if(/^PICS\d$/.test(s))for(let o of Ie(Uint8Array.from(atob(n.data),c=>c.charCodeAt(0))))t.set(o.name,o.shapes);return i.pictureShapes=t}var Sr=(i,e)=>$i(i)?.get(e.toUpperCase().replace(/_/g," "));function Wt(i){let e=i.map.vars,t=a=>e.zero+a;mi(i.font);let s=a=>{if(a.a<2)return;let h=ji(i)?.get(a.objectTable)?.find(g=>g.number===a.a);h&&(a.c=wi(h,a.x),a.mem[t(2)]=a.y+h.height&255)},n=i.raster??=new He,o=i.pen??={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10};i.text??={showing:!1,pen:We(),page:ve()};let c=(a,h)=>ji(i)?.get(a.objectTable)?.find(g=>g.number===h),f=(a,h)=>{if(a.a<2)return n.restore();let g=c(a,a.a);g&&n.object(g,a.x,a.y,h)},l=a=>{let h=re(a),g=o.x,j=(h<4?4-h:0)+1;n.rectangle(1,g,o.y-2,Math.max(4,h)+4,11),n.outline(13,g,o.y-2,Math.max(4,h)+4,11),n.glyph(a,g+1+j,o.y,15,1,1,8),o.x=g+1+j+h+1+2},p=a=>{let h=i.map.keyPanel;if(!h)return;let g=n.get(2,2),{x:j,y:$}=o;for(let C=h.top;C<h.top+h.rows;C++)n.span(g,h.left,h.right,C);h.caps.forEach(([C,R,M],v)=>{(!a||a===v+1)&&(o.x=C,o.y=R,l(String.fromCharCode(M&127)))}),Object.assign(o,{x:j,y:$})},x=(a,h)=>{for(let g of qe(Oe(h,a.mem),o))for(let j of g.chars)n.glyph(j.ch,j.x,g.top,j.ink??g.ink,g.paper,g.tall?2:1,g.height,o.spacing)},u=(a,h,g,j,$)=>{let C=c(a,h);C&&n.object(C,g,j,$)};i.model={raster:n,pen:o,cap:l,keyPanel:p,print:x,put:u};let k=(a,h)=>(g,j,$)=>{let{fixed:C,rest:R}=xe(g,a,j),M=R.map(v=>typeof v=="object"?v.string:v).join(" ");g.emit(Q(a,C,g,R.length?M:void 0,v=>g.mem[t(v)])),R=R.map(v=>typeof v=="object"?v.string:v),h?.(g,C,R)},w=!i.map.askClearsCarry,L=a=>(h,g,j)=>{h.waitingOn!==j&&xe(h,a,g);let $=h.waitingOn===j?h.askMode:h.a;h.askMode=$;let C=[ie.left,ie.right,ie.down,ie.up];$===128&&h.waitingOn!==j&&p(0);let R=ct(h,j,a,[],void 0,M=>{if(a==="ask-escape"&&M===ie.escape)return h.a=h.flags(27),h.x=155,h.c=1,h.asked=null,!0;if(h.asked===null){let v=-1,A=M;return $===128?(v=C.indexOf(M),A=219+v,v>=0&&p(v+1)):$>=177&&$<186?M>=49&&M<=($&127)&&(v=M-49):(A=M&95,A>=65&&A<=($&95&127)&&(v=A-65,A|=128)),v>=0&&(h.asked={place:v,key:A},a==="ask-mode"&&Ei(h,h.askHooks?.chose?.(v))),!1}return M===ie.return?(h.x=h.asked.place,h.y=2*h.x,h.a=h.asked.key,h.c=w&&h.a>=193?1:0,!0):((M===ie.delete||M===ie.left)&&(a==="ask-mode"&&Ei(h,h.askHooks?.undo?.(h.asked.place)),$===128&&p(0),h.asked=null),!1)});return R!=="wait"&&(h.mem[e.layout]=34,h.emit(se(a,h))),R},T={show:k("show",a=>{i.text.showing=!1,a.mem[49181]=128}),"text-screen":a=>{Object.assign(i.text,{showing:!0,page:ve()}),a.mem[49181]=0,a.inside++,a.emit({step:"text-screen"}),a.inside--},picture:k("picture",(a,h,[g])=>{let j=$i(i)?.get(g.toUpperCase().replace(/_/g," "));j&&n.picture(j)}),box:k("box",a=>n.box(a.mem[e.layout],a.a,a.x,a.y)),panel:k("panel",(a,[h])=>{let g=Ke[h];if(g){a.mem[e.layout]=g.layout,n.panel(g.rows[0],g.rows[1],g.fill);for(let j of g.more??[])n.whiteLines(j);Object.assign(o,{paper:g.paper,ink:g.ink,centre:!0,spacing:1,gap:g.gap,y:g.y})}}),text:(a,h)=>{let g=h[0].string.replace(/\{([0-9a-f]+):([^}]*)\}/g,(j,$,C)=>"{"+$+":"+C.split(",").map(R=>R.startsWith("$")?a.mem[parseInt(R.slice(1),16)].toString(16):R).join(",")+"}").replace(/\{\$([0-9A-Fa-f]{4})\}/g,(j,$)=>String.fromCharCode(a.mem[parseInt($,16)]&127));if(a.emit(Q("text",[],a,g)),i.text.showing){for(let j of Fe(Oe(g,a.mem),i.text.pen))i.text.page[j.row]?.[j.col]&&(i.text.page[j.row][j.col]={ch:j.ch,inverse:j.inverse});return}x(a,g)},objects:k("objects",a=>{a.objectTable=a.x|a.y<<8}),object:k("object",a=>{f(a,"whole"),s(a)}),"object-keep":k("object-keep",a=>{f(a,"keep"),s(a)}),"object-mode":k("object-mode",a=>f(a,"clear")),"key-at":k("key-at",a=>{o.x=a.x,o.y=a.y,l(String.fromCharCode(a.a&127))}),key:k("key",a=>l(String.fromCharCode(a.a&127))),"white-lines":k("white-lines",a=>n.whiteLines(a.y)),"fill-rows":k("fill-rows",a=>n.rows(a.a,a.x,a.y,a.c)),span:k("span",a=>n.span(a.a,a.x,a.y,a.mem[t(2)])),dot:k("dot",a=>{n.set(a.x,a.y,a.a),a.a=a.x%7<<4|a.a&15}),line:k("line",a=>n.line(a.mem[t(17)],a.mem[t(0)],a.mem[t(2)],a.mem[t(1)],a.mem[t(3)])),rectangle:k("rectangle",a=>n.rectangle(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)])),"rectangle-outline":k("rectangle-outline",a=>n.outline(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)]+1)),flash:k("flash"),"read-dot":(a,h)=>{xe(a,"read-dot",h),a.emit(Q("read-dot",[],a)),a.a=a.flags(n.get(a.x,a.y)),a.emit(se("read-dot",a))},"key-panel":k("key-panel",a=>p(a.a)),"keep-span":k("keep-span"),"put-span":k("put-span"),"invert-span":k("invert-span"),button:k("button"),beep:(a,h)=>{xe(a,"beep",h),Tt("beep",a.a)||a.emit(Q("beep",[],a))},sound:(a,h)=>a.emit(Q("sound",[],a,h.map(g=>g.startsWith("$")?a.mem[parseInt(g.slice(1),16)].toString(16):g).join(" "))),scroll:a=>{n.scroll(),a.inside++,a.emit({step:"scroll"}),a.inside--},"shift-down":(a,h)=>{let[g,j,$,C,R]=h.map(Number);for(let M=C;M>=$;M--)for(let v=g;v<=j;v++)n.set(v,M+R,n.get(v,M));a.inside++,a.emit({step:"shift-down",left:g,right:j,top:$,bottom:C,by:R}),a.inside--},part:k("part"),wait:(a,h,g)=>ct(a,g,"wait",[],void 0,j=>j===ie.space&&(a.a=32,a.c=0,!0)),"wait-erase":(a,h,g)=>ct(a,g,"wait-erase",[],void 0,j=>j===ie.space),"wait-or-escape":(a,h,g)=>{let j=ct(a,g,"wait-or-escape",[],void 0,$=>($===ie.space||$===ie.escape)&&(a.c=$===ie.escape?1:0,a.a=$,!0));return j!=="wait"&&a.emit(se("wait-or-escape",a)),j},ask:L("ask"),"ask-mode":L("ask-mode"),"ask-escape":L("ask-escape"),random:(a,h)=>{let{fixed:g}=xe(a,"random",h);a.emit(Q("random",g,a));let j=a.a,{at:$,used:C}=i.map.seed;a.mem[C]===255&&i.seed!==void 0&&(a.mem[$]=i.seed&255,a.mem[$+1]=i.seed>>8);let R=a.mem[$]|a.mem[$+1]<<8;R=R*259&65535,a.mem[$]=R&255,a.mem[$+1]=R>>8,a.mem[C]=j;let M=j?Math.floor(65535/j):65535;a.a=Math.floor(R/M)&255,a.c=0,a.emit(se("random",a))},multiply:(a,h)=>{xe(a,"multiply",h),a.emit(Q("multiply",[],a));let g=a.a*a.x;a.a=g&255,a.x=g>>8,a.emit(se("multiply",a))},divide:(a,h)=>{xe(a,"divide",h),a.emit(Q("divide",[],a));let g=a.x|a.y<<8,j=a.a||1;a.a=Math.floor(g/j)&255,a.x=g%j,a.emit(se("divide",a))},problem:(a,h,g)=>{if(!a.problem){xe(a,"problem",h),a.emit(Q("problem",[],a)),a.mem[e.practice]=a.c?128:0,a.repeats=a.mem[e.repeats],i.map.countInX&&a.c&&(a.mem[e.repeats]=a.x);let j=i.problems?.[a.a];if(!j)throw new Error("problem "+a.a+" is not written yet");let $=i.disk&&Ye(i.map,Object.values(i.disk.volumes)[0]).find(C=>C.name==="PROB"+a.a);$&&a.mem.set($.bytes,$.origin),a.problem=j(qt(a,T))}if(!a.problem.next().done)return"wait";a.problem=null,a.c=0,a.mem[e.repeats]=a.repeats,a.emit(se("problem",a))},"read-key":(a,h,g)=>{a.waitingOn!==g&&(a.waitingOn=g,a.asked=null);let j=a.key();if(j===void 0)return"wait";if(i.visit?.[j])return a.visit(j),"wait";a.waitingOn=null,j===ie.menu&&i.menu&&a.leave(...i.menu),a.a=a.flags(j&127),a.c=j===ie.escape?1:0,a.emit(se("read-key",a))},splash:(a,h,g)=>{if(a.waitingOn!==g&&(a.inside++,a.emit({step:"splash"}),a.inside--,a.waitingOn=g),a.key()===void 0)return"wait";a.waitingOn=null},"clear-screen":a=>{for(let h of n.dots)h.fill(0);a.inside++,a.emit({step:"clear-screen"}),a.inside--},pause:(a,[h])=>{a.x=0,a.y=0,a.flags(0),a.inside++,a.emit({step:"pause",ms:+h}),a.inside--},quit:a=>{a.ended=!0},unwritten:(a,[h])=>{throw new Error("not written yet: "+(h?.string??h))},"goto-engine":(a,[h])=>{let g=i.entries?.[h];if(!g)throw new Error("no script for "+h);a.enter(...g)},"call-engine":(a,[h])=>{let g=i.entries?.[h];if(!g)throw new Error("no script for "+h);a.stack.push({name:a.name,pc:a.pc}),a.enter(...g)},"load-part":a=>{let h=Object.keys(i.disk?.volumes??{})[0]?.toUpperCase();if(i.files?.out?.has(h)){a.a=a.flags(69),a.c=1;return}a.stack=[],a.enter("part"+a.a,void 0,!0)},"write-settings":a=>{let h=i.files??=new tt(i.disk),g=Object.keys(i.disk.volumes)[0].toUpperCase(),j=h.out?.has(g)?69:h.disks[g]==="protected"?43:0;a.a=a.flags(j),a.c=j?1:0}};return T}dt();var Li={vector:Wt,card:Dt};async function Oi(i,e){if(i.protocol==="file:"){let s=globalThis.process.getBuiltinModule("node:fs").readFileSync(i,"utf8");return e==="json"?JSON.parse(s):s}let t=await fetch(i);if(!t.ok)throw new Error(`${i.pathname}: ${t.status}`);return e==="json"?t.json():t.text()}var lt=async i=>(await import(i.href)).default;async function Ht(i,{data:e,scenes:t=!1,fixed:s=!1}={}){i=new URL(i);let n={...await lt(new URL("title.js",i))};for(let f of n.modules??[])n[f]=await lt(new URL(f+".js",i));if(n.view&&(n.viewSteps=await lt(new URL("view.js",i))),!Li[n.engine])return n.own=await import(new URL(n.engine+".js",i).href),{title:n,scripts:{},disk:null,folder:i};let o=Object.fromEntries(await Promise.all(n.scripts.map(async f=>[f,t?await Oi(new URL(f+".scene",i),"text"):await lt(new URL(`compiled/${s&&n.fixed?.[f]||f}.js`,i))]))),c=await Oi(new URL(e),"json");return{title:n,scripts:o,disk:c,folder:i}}function Yt(i,e){let t={...i.disk?.kind==="prodos"?ht(i.disk):{},...i.memory},s=new ze({routines:Li[i.engine](i),scripts:e,start:i.start,label:i.startLabel,memory:t});return s.title=i,s}var Pi={};z(Pi,{play:()=>Ar});var Mi={};z(Mi,{play:()=>Jt});Ze();Et();import{rom as Er}from"@moonbase-machines/c64";var{STANDS_IN:Pa,install:Na,standIn:Ti}=Er;mt();$t();var Ii={};z(Ii,{View:()=>Ve});import{colors as jr}from"@moonbase-machines/apple2e";var{COLORS:Ri,NAMES:Ua,rgb:ae}=jr;Ge();wt();import{font as $r}from"@moonbase-machines/charset";var{FONT:Vt}=$r;Xe();var Cr="http://www.w3.org/2000/svg",Y=i=>i*4,V=i=>i*2,ft='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',Or='ui-monospace, Menlo, Consolas, "Liberation Mono", monospace',_t=["[","\\","]","^"],Lr={"[":"\u2190","\\":"\u2192","]":"\u2193","^":"\u2191"},Ve=class{constructor(e,{disk:t,volume:s,engine:n,extra:o={},press:c}){this.svg=e,this.engine=n,this.extra=o,this.press=c,e.setAttribute("viewBox","0 0 560 384"),this.disk=t.volumes[s],this.pictures=new Map;for(let[x,u]of Object.entries(t.volumes[s]))if(/^PICS\d$/.test(x))for(let k of Ie(Uint8Array.from(atob(u.data),w=>w.charCodeAt(0))))this.pictures.set(k.name,k.shapes);let f=n.title.map;this.vars=f.vars;let l={...Lr,...f.modern};for(let x=0;x<10;x++)l[String.fromCharCode(128+x)]=String(x);let p=new RegExp("["+Object.keys(l).map(x=>"\\"+x).join("")+"]","g");this.modern=x=>x.replace(p,u=>l[u]),this.tables=new Map(at(Ye(f,t.volumes[s]),f.objects).map(x=>[x.address,x.objects])),this.items=[],this.pen={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10},this.window={color:0,bottom:116},this.shapes=[],this.spaceBar=null,this.layer=this.el("g"),e.append(this.layer),this.textScreen=this.el("g",{display:"none"}),e.append(this.textScreen),this.prompt=this.el("g"),e.append(this.prompt),this.textPen=We(),this.textCells=ve(),this.rect(0,0,140,192,15,this.layer)}el(e,t={},s){let n=document.createElementNS(Cr,e);for(let[o,c]of Object.entries(t))n.setAttribute(o,c);return s?.append(n),n}rect(e,t,s,n,o,c=this.layer){return this.el("rect",{x:Y(e),y:V(t),width:Y(s),height:V(n),fill:ae(o),"shape-rendering":"crispEdges"},c)}add(e,t,s,{covers:n=!0,left:o=0,right:c=139}={}){return n&&(this.items=this.items.filter(f=>f.top>=e&&f.bottom<=t&&f.left>=o&&f.right<=c?(f.el.remove(),!1):!0)),this.items.push({top:e,bottom:t,left:o,right:c,el:s}),this.layer.append(s),s}remove(e){e.remove(),this.items=this.items.filter(t=>t.el!==e)}fill(e,t,s,n=!0){let o=this.el("g");this.rect(0,e,140,t-e+1,s,o),n&&(this.rect(0,e,1,t-e+1,15,o),this.rect(139,e,1,t-e+1,15,o)),this.add(e,t,o)}whiteLines(e){this.add(e,e+1,this.rect(0,e,140,2,15,null))}snapshot(e){let t=this.engine.mem;return e.layout=t[this.vars.layout],e.difficulty=t[this.vars.difficulty],e.step==="text"&&(e.words=Oe(e.words,t)),e.step==="span"&&(e.row=t[this.vars.zero+2]),e}apply(e){this.difficulty=e.difficulty,this.spaceBar?.erase&&!this.waiting()&&(this.fill(this.spaceBar.y,this.spaceBar.y+10,5),this.spaceBar.el.remove(),this.spaceBar=null);let t=this.extra[e.step]??(typeof this[e.step]=="function"?this[e.step]:void 0);t&&t.call(this,e)}waiting(){return this.engine.waitingOn}"text-screen"(){this.textCells=ve(),this.textScreen.replaceChildren(),this.rect(0,0,140,192,0,this.textScreen),this.textScreen.setAttribute("display","inline"),this.layer.setAttribute("display","none")}show(){this.textScreen.setAttribute("display","none"),this.layer.setAttribute("display","inline")}textCell(e,t,s,n){this.textCells[e][t].el?.remove();let c=this.el("g",{"data-cell":e*40+t},this.textScreen),f=t*14,l=e*16,p=n?"#000":"#fff";if(n&&this.el("rect",{x:f,y:l,width:14,height:16,fill:"#fff","shape-rendering":"crispEdges"},c),this.oldStyle){let x=Vt[s.charCodeAt(0)-32]??Vt[0],u="";for(let k=0;k<5;k++)for(let w=0;w<7;w++)x[k]>>w&1&&(u+=`M${f+2+k*2} ${l+w*2}h2v2h-2z`);u&&this.el("path",{d:u,fill:p},c)}else if(s!==" "){let x=this.el("text",{x:f+7,y:l+12,fill:p,"font-family":Or,"font-size":15,"text-anchor":"middle"},c);x.textContent=s}this.textCells[e][t]={ch:s,inverse:n,el:c}}splash(){let e=this.disk.TITLE;if(!e)return;let t=Uint8Array.from(atob(e.data),o=>o.charCodeAt(0)),s=xt(t.subarray(0,8192),t.subarray(8192)),n=[];for(let o=0;o<192;o++)n.push(Array.from(s.subarray(o*140,o*140+140)));this.clear(),this.add(0,191,this.el("image",{href:this.image(n),x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))}"clear-screen"(){this.clear(),this.add(0,191,this.rect(0,0,140,192,0,null))}clear(){for(let e of this.items)e.el.remove();this.items=[]}"keep-screen"(){this.kept={items:this.items,pen:{...this.pen},window:{...this.window},shapes:this.shapes,spaceBar:this.spaceBar};for(let e of this.items)e.el.remove();this.items=[],this.spaceBar=null,this["clear-screen"]()}"put-screen"(){if(!this.kept)return;this.clear();let e=this.kept;this.kept=null;for(let t of e.items)this.layer.append(t.el);Object.assign(this,{items:e.items,pen:e.pen,window:e.window,shapes:e.shapes,spaceBar:e.spaceBar})}box({a:e,x:t,y:s,layout:n}){let[o,c,f]=be[n]??be[50];if(e!==128&&t!==128&&s!==128){for(let l of this.items)l.el.remove();this.items=[]}if(e!==128){let l=this.el("g");this.rect(1,1,138,o-1,e,l),this.el("rect",{x:Y(1)+2,y:V(1)+1,width:Y(138)-4,height:V(o-2)-2,fill:"none",stroke:"black","stroke-width":4},l),this.add(1,o-1,l,{left:1,right:138}),this.window={color:e,bottom:o},this.shapes=[]}t!==128&&(this.whiteLines(c),this.fill(c+2,f-1,t)),s!==128&&(this.whiteLines(f),this.fill(f+2,189,s))}panel({n:[e]}){let t=Ke[e];if(t){this.whiteLines(t.rows[0]),this.fill(t.rows[0]+2,t.rows[1],t.fill);for(let s of t.more??[])this.whiteLines(s);Object.assign(this.pen,{paper:t.paper,ink:t.ink,centre:!0,spacing:1,gap:t.gap,y:t.y})}}scroll(){let o=this.scrolling,c=(x,u,k)=>{let w="scroll-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:Y(x),y:V(19)-1,width:Y(u-x),height:V(97)+1},this.el("clipPath",{id:w},this.svg)),this.el("g",{"clip-path":`url(#${w})`},k)},f=(x,u)=>this.items.filter(k=>k!==o?.item&&k.top<=115&&k.bottom>=19&&k.left<=u&&k.right>=x);if(o?.item.el.isConnected&&this.items.at(-1)===o.item){let x=c(129.5,136.5,this.el("g",{transform:`translate(${Y(7*o.n)} 0)`},o.moved));for(let u of f(129.5,129.5+7))x.append(u.el.cloneNode(!0));o.n++,o.moved.setAttribute("transform",`translate(${Y(-7*o.n)} 0)`);return}let l=c(3.5,129.5),p=this.el("g",{transform:`translate(${Y(-7)} 0)`},l);this.rect(3.5,19,1120,97,this.window.color,p);for(let x of f(3.5,139))p.append(x.el.cloneNode(!0));this.add(19,115,l,{left:4,right:129}),this.scrolling={item:this.items.at(-1),moved:p,n:1}}"shift-down"({left:e,right:t,top:s,bottom:n,by:o}){let c=this.shifting,f=(u,k,w)=>{let L="shift-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:Y(e),y:V(u),width:Y(t-e+1),height:V(k-u)},this.el("clipPath",{id:L},this.svg)),this.el("g",{"clip-path":`url(#${L})`},w)},l=(u,k)=>this.items.filter(w=>w!==c?.item&&w.top<=k&&w.bottom>=u&&w.left<=t&&w.right>=e);if(c?.item.el.isConnected&&this.items.at(-1)===c.item){let u=f(s,s+o,this.el("g",{transform:`translate(0 ${V(-o*c.n)})`},c.moved));for(let k of l(s,s+o-1))u.append(k.el.cloneNode(!0));c.n++,c.moved.setAttribute("transform",`translate(0 ${V(o*c.n)})`);return}let p=f(s+o,n+o+1),x=this.el("g",{transform:`translate(0 ${V(o)})`},p);this.rect(e,s-o*60,t-e+1,n-s+1+o*61,this.window.color,x);for(let u of l(s,n))x.append(u.el.cloneNode(!0));this.add(s+o,n+o,p,{left:e,right:t}),this.shifting={item:this.items.at(-1),moved:x,n:1}}paint(e,t,s,n){this.hide(t,s,n,n);let o=this.painted;if(o?.el.isConnected&&o.color===e&&o.left===t&&o.right===s&&o.bottom===n-1){o.bottom=n,o.el.setAttribute("height",V(n-o.top+1));let f=this.items.find(l=>l.el===o.el);this.items=this.items.filter(l=>l!==f&&l.top>=o.top&&l.bottom<=n&&l.left>=t&&l.right<=s?(l.el.remove(),!1):!0),f&&(f.bottom=n);return}let c=this.add(n,n,this.rect(t,n,s-t+1,1,e,null),{left:t,right:s});this.painted={el:c,color:e,left:t,right:s,top:n,bottom:n}}span({a:e,x:t,y:s,row:n}){this.paint(e&15,t,s,n)}dot({a:e,x:t,y:s}){this.paint(e&15,t,t,s)}"white-lines"({y:e}){this.whiteLines(e)}"fill-rows"({a:e,x:t,y:s}){this.fill(s,s+t-1,e)}picture({words:e}){let t=this.pictures.get(e.toUpperCase().replace(/_/g," "));if(!t)return;let s="window-"+this.window.bottom;this.clips??=new Set,this.clips.has(s)||(this.clips.add(s),this.el("rect",{x:0,y:0,width:Y(140),height:V(this.window.bottom)},this.el("clipPath",{id:s},this.svg)));let n=this.el("g",{"clip-path":`url(#${s})`}),o=this.el("g",{transform:"scale(4 2)"},n);o.innerHTML=kt(t,{crisp:!1}),this.add(1,this.window.bottom-1,n,{covers:!1,left:1,right:138}),this.shapes=this.shapes.concat(t),this.picturesShapes=t}objects({table:e}){this.table=parseInt(e.slice(1),16)}object({a:e,x:t,y:s},n="whole"){let o=n==="keep",c=n==="whole",f=this.tables.get(this.table);if(e<2){this.kept?.isConnected&&this.remove(this.kept),this.kept=null;return}let l=f?.find(w=>w.number===e);if(!l)return;let p=l.rows.map(w=>w.map(L=>!c&&L===l.clear?void 0:L)),x=t+l.width-1,u=s+l.height-1;c&&this.hide(t,x,s,u);let k=this.el("image",{href:this.image(p),x:Y(t),y:V(s),width:Y(l.width),height:V(l.height),preserveAspectRatio:"none",style:"image-rendering: pixelated"});this.add(s,u,k,{covers:c,left:t,right:x}),o&&(this.kept=k),c&&(this.items.at(-1).whole={x:t,y:s,rows:p})}hide(e,t,s,n){for(let o of[...this.items]){let c=o.whole;if(!c||c.x>t||c.x+c.rows[0].length-1<e||c.y>n||c.y+c.rows.length-1<s)continue;let f=!1,l=c.rows.map((p,x)=>p.map((u,k)=>{let w=c.x+k,L=c.y+x;if(u!==void 0&&w>=e&&w<=t&&L>=s&&L<=n){f=!0;return}return u}));if(f){if(l.every(p=>p.every(x=>x===void 0))){this.remove(o.el);continue}o.el.setAttribute("href",this.image(l)),c.rows=l}}}image(e){let t=document.createElement("canvas");t.width=e[0].length,t.height=e.length;let s=t.getContext("2d"),n=s.createImageData(t.width,t.height);return e.forEach((o,c)=>o.forEach((f,l)=>{if(f===void 0)return;let[p,x,u]=Ri[f];n.data.set([p,x,u,255],(c*t.width+l)*4)})),s.putImageData(n,0,0),t.toDataURL()}"object-keep"(e){this.object(e,"keep")}"object-mode"(e){this.object(e,"clear")}"key-at"({a:e,x:t,y:s}){this.pen.x=t,this.pen.y=s,this.key({a:e})}key({a:e}){let t=re(e);this.cap(e,this.pen.x,this.pen.y,this.layer,!0,void 0,Math.max(4,t)+4),this.pen.x+=1+(t<4?4-t:0)+1+t+3}cap(e,t,s,n,o,c,f){let l={"\r":"RETURN","\x7F":"DELETE"}[e]??e,p=f??(l.length>1?32:7),x=this.el("g",c!==void 0?{class:"key","data-key":c}:{});if(this.el("rect",{x:Y(t),y:V(s-2),width:Y(p),height:V(11),rx:3,fill:ae(1),stroke:ae(13),"stroke-width":3},x),this.oldStyle){let u=0;for(let k of l)u+=re(k)+1;this.glyphs(x,l,t+Math.max(1,Math.round((p-u+1)/2)),s,15)}else{let u=this.el("text",{x:Y(t+p/2),y:V(s+7),fill:ae(15),"font-family":ft,"font-size":l.length>1?13:16,"font-weight":600,"text-anchor":"middle"},x);u.textContent=this.modern(l)}return o?(this.add(s-2,s+8,x,{covers:!1,left:t,right:t+p}),this.items.at(-1).cap=!0):n.append(x),x}text({words:e}){if(this.textScreen.getAttribute("display")!=="none"){for(let t of Fe(e,this.textPen))this.textCells[t.row]?.[t.col]&&this.textCell(t.row,t.col,t.ch,t.inverse);return}for(let t of qe(e,this.pen)){let{top:s,tall:n}=t,o=n?32:19,c=t.chars.filter(k=>k.ch.charCodeAt(0)>=32);if(c.length){let k=Math.min(...c.map(T=>T.x)),w=Math.max(...c.map(T=>T.x+re(T.ch)))-1,L=Math.min(9,t.height??9)*(n?2:1);this.add(s,s+L-1,this.rect(k,s,w-k+1,L,t.paper,null),{left:k,right:w})}let f=this.el("g",{"font-family":ft,"font-size":o,"font-weight":n?700:500}),l=null,p=139,x=0,u=()=>{if(!l)return;if(p=Math.min(p,l.x),x=Math.max(x,l.x+l.width),this.oldStyle){this.glyphs(f,l.chars,l.x,s,t.ink,n,t.paper),l=null;return}let k=this.el("text",{y:V(s+(n?15:7)),"data-x":Y(l.x),"data-width":Y(l.width)},f);for(let w of l.chars){let L=this.el("tspan",{fill:ae(w.ink??t.ink)},k);L.textContent=this.modern(w.ch)}l=null};for(let k of t.chars){if(k.ch.charCodeAt(0)<=32){u();continue}l??={x:k.x,width:0,chars:[]},l.chars.push(k),l.width=k.x+re(k.ch)-l.x}u(),f.childNodes.length&&(this.add(s,s+(n?16:8),f,{covers:!1,left:p,right:x}),this.fit(f))}}fit(e){for(let t of e.querySelectorAll("text[data-width]")){let s=t.getComputedTextLength();s>0&&t.setAttribute("transform",`translate(${t.dataset.x} 0) scale(${t.dataset.width/s} 1)`)}}glyphs(e,t,s,n,o,c=!1,f){let l=typeof t=="string"?[...t].map(u=>({ch:u})):t,p=c?2:1,x=new Map;for(let u of l){let k=re(u.ch),w=u.ink??o;f!==void 0&&this.rect(s,n,k,9*p,f,e);let L=x.get(w)??"";for(let[T,a]of ot(u.ch))L+=`M${Y(s+T)} ${V(n+a*p)}h4v${2*p}h-4z`;x.set(w,L),s+=k+1}for(let[u,k]of x)k&&this.el("path",{d:k,fill:ae(u)},e);return s}write(e,t,s,n,o=15){if(this.oldStyle)return this.glyphs(e,t,s,n,o);let c=this.el("g",{"font-family":ft,"font-size":19,"font-weight":500,fill:ae(o)},e);for(let f of t.split(" ")){if(f){let l=0;for(let x of f)l+=re(x)+1;let p=this.el("text",{y:V(n+7),"data-x":Y(s),"data-width":Y(l-1)},c);p.textContent=this.modern(f),s+=l}s+=re(" ")+1}return this.fit(c),s}line({x0:e,x1:t,y0:s,y1:n,color:o}){this.add(Math.min(s,n),Math.max(s,n),this.el("line",{x1:Y(e+.5),y1:V(s+.5),x2:Y(t+.5),y2:V(n+.5),stroke:ae(o),"stroke-width":3,"stroke-linecap":"round"}),{covers:!1,left:Math.min(e,t),right:Math.max(e,t)})}rectangle({a:e,x:t,y:s,width:n,height:o}){this.solid(e,t,s,n+1,o)}"rectangle-outline"({a:e,x:t,y:s,width:n,height:o}){let c=n+1,f=o+1;this.add(s,s+f-1,this.el("rect",{x:Y(t)+2,y:V(s)+1,width:Y(c)-4,height:V(f)-2,fill:"none",stroke:ae(e),"stroke-width":3}),{covers:!1,left:t,right:t+c-1})}solid(e,t,s,n,o){this.add(s,s+o-1,this.rect(t,s,n,o,e,null),{left:t,right:t+n-1})}prompts(){this.prompt.replaceChildren();let e=this.engine,t=e.waitingOn;if(!t)return;let s=t.words?.[0]??t.name;if(s==="wait"||s==="wait-erase"||s==="wait-or-escape"){let n=(e.mem[this.vars.layout]&15)===1?178:170,o=this.el("g",{class:"key","data-key":32},this.prompt);if(this.el("rect",{x:Y(46),y:V(n),width:Y(47),height:V(11),rx:4,fill:ae(1),stroke:ae(13),"stroke-width":3},o),this.oldStyle)this.glyphs(o,"SPACE BAR",48,n+2,15);else{let c=this.el("text",{x:Y(69.5),y:V(n+8),fill:ae(15),"font-family":ft,"font-size":15,"font-weight":600,"text-anchor":"middle"},o);c.textContent="SPACE BAR"}this.spaceBar={y:n,erase:s==="wait-erase",el:o}}else if(s==="ask"||s==="ask-mode"||s==="ask-escape"){this.rect(1,162,138,28,5,this.prompt);let n=e.askMode,o=[];if(n===128)_t.forEach((f,l)=>o.push([f,[8,21,10,11][l]]));else if(n>=177&&n<186)for(let f=49;f<=(n&127);f++)o.push([String.fromCharCode(f),f]);else for(let f=65;f<=(n&95);f++)o.push([String.fromCharCode(f),f]);let c=(f,l,p)=>this.write(this.prompt,f,l,p);if(e.asked===null)c("Press",4,166),o.forEach(([f,l],p)=>{p===o.length-1&&n!==128&&o.length>1&&c("or",31+10*p,166),this.cap(f,31+10*p+(p===o.length-1&&n!==128&&o.length>1?10:0),166,this.prompt,!1,l)}),n===128&&[[58,62],[74,62],[66,71],[66,53]].forEach(([f,l],p)=>this.cap(_t[p],f,l,this.prompt,!1,o[p][1]));else{let[f]=o[e.asked.place];this.cap(f,31+10*e.asked.place,166,this.prompt,!1),c("Press",4,179),this.cap("\r",31,179,this.prompt,!1,13),c("or",67,179),this.cap("\x7F",78,179,this.prompt,!1,127),n===128&&this.cap(_t[e.asked.place],[58,74,66,66][e.asked.place],[62,62,71,53][e.asked.place],this.prompt,!1)}}}};async function Jt(i){let{title:e,scripts:t,disk:s,root:n,stage:o,status:c,fail:f,kept:l,words:p,fixed:x}=i;n.classList.add("game"),o.innerHTML=`<svg id="screen" preserveAspectRatio="xMidYMid meet" tabindex="0" aria-label="The game's screen"></svg>`,c.insertAdjacentHTML("afterend",`${Re}<label><input type="checkbox" id="sound"> Sound</label><label><input type="checkbox" id="old-style"> Old style text</label><label hidden><input type="checkbox" id="printer" checked> Printer</label><label hidden title="The game with its bugs fixed: it starts again"><input type="checkbox" id="fixed"> Bugs fixed</label><label hidden>Mini view <select id="mini"><option value="">Off</option><option value="live">Live</option><option value="pictures">Pictures</option></select></label>`),n.append(Ae(p.printer));let u=L=>n.querySelector("#"+L),k=u("screen"),w=u("sound");Te(n,o);try{let L=u("fixed");L&&e.fixed&&(L.checked=x,L.parentElement.hidden=!1,L.addEventListener("change",()=>{let y=new URL(location.href);L.checked?y.searchParams.set("fixed",""):y.searchParams.delete("fixed"),location.href=y.href.replace("fixed=&","fixed&").replace(/fixed=$/,"fixed")}));let T=e.viewSteps??{},a=s.kind==="c64"?i.roms?.chargen??Ti().chargen:null;if(s.kind==="c64"){let y=u("printer"),O=u("paper"),P=u("paper-box");try{y.checked=localStorage.getItem("remake-printer")!=="0"}catch{}y.parentElement.hidden=!1;let N=e.printer=new Me({on:y.checked});y.addEventListener("change",()=>{N.on=y.checked;try{localStorage.setItem("remake-printer",y.checked?"1":"0")}catch{}}),N.changed=()=>{P.hidden=!N.lines.length,N.lines.length&&bt(O,N,a)},u("tear").addEventListener("click",()=>N.tear()),u("print-paper").addEventListener("click",()=>window.print())}e.disk=ut(s,l),s.kind==="c64"&&jt(e.drive=new it(Uint8Array.from(atob(s.image),y=>y.charCodeAt(0))),l);let h=Yt(e,t);e.files&&pt(s,e.files,l);let g=[],j=u("old-style"),$=[],C={get(){try{return localStorage.getItem("remake-old-style")==="1"}catch{return!1}},set(y){try{localStorage.setItem("remake-old-style",y?"1":"0")}catch{}}};j.checked=C.get()||new URLSearchParams(location.search).has("old-style");let R=null,M=()=>{k.replaceChildren();let y=s.kind==="c64"?new Pe(k,{engine:h,chargen:a}):e.engine==="card"?new Ne(k,{engine:h,inset:i.mini?e.inset:null}):new Ve(k,{disk:s,volume:Object.keys(s.volumes)[0],engine:h,extra:T});return y.oldStyle=j.checked,R?.(y),y},v=M();h.on(y=>g.push(v.snapshot({...y})));let A=u("mini");if(e.inset&&i.mini){A.parentElement.hidden=!1;try{A.value=localStorage.getItem("remake-mini")??""}catch{}let{top:y,bottom:O,view:[P,N]}=e.inset,B=document.createElement("div");B.className="mini",B.hidden=!0,Object.assign(B.style,{left:`${P/5.6}%`,top:`${y/3.84}%`,width:`${(N-P)/5.6}%`,height:`${(O-y+1)/3.84}%`}),k.parentElement.append(B);let X=await i.mini(B,{memory:()=>h.mem});R=W=>{W.insetOn=!!A.value;let ge=W.prompts.bind(W);W.prompts=()=>{ge(),B.hidden=!(A.value&&W.banded)}},R(v);let ee=()=>{v.insetOn=!!A.value,X.mode(A.value),v.prompts()};A.addEventListener("change",()=>{try{localStorage.setItem("remake-mini",A.value)}catch{}ee()}),ee()}j.addEventListener("change",()=>{C.set(j.checked),v=M();for(let y of $)v.apply(y);v.prompts()});let E=h.timed?new we:null;E&&(w.checked=!0);let H=()=>{s.kind!=="c64"&&E?.feed(w.checked?h.clicks:[],h.cycles),h.clicks.length=0},I=e.map?.vars??{sound:0,soundOn:0},K=null,_=(y,O,P)=>{if(!(h.mem[I.sound]&I.soundOn))return;K??=new AudioContext;let N=K.createOscillator(),B=K.createGain(),X=K.currentTime;N.type="square",N.frequency.setValueAtTime(y,X),N.frequency.linearRampToValueAtTime(O,X+P/1e3),B.gain.setValueAtTime(.06,X),B.gain.linearRampToValueAtTime(0,X+P/1e3),N.connect(B).connect(K.destination),N.start(X),N.stop(X+P/1e3)},U=y=>16e3/(y+8);w.addEventListener("change",()=>{E||(h.mem[I.sound]=w.checked?I.soundOn:0)});let q={sound:220,beep:60,"flash-box":60,flash:250,object:30,"object-keep":30},F=()=>i.pace??1,D=!1,J=y=>new Promise(O=>setTimeout(O,y));async function Z(){if(!D){D=!0;try{for(;;){let y=h.run();if(H(),y==="pace"){for(let O of g.splice(0))$.push(O),v.apply(O);v.prompts(),!he&&F()&&await J(h.delay*F()),h.delay=0;continue}for(h.delay=0;g.length;){let O=g.shift();if($.push(O),v.apply(O),!he){if(O.step==="sound"){let[P,N]=O.words.split(" ").map(B=>parseInt(B,16));_(U(N),U(P),180)}O.step==="beep"&&_(U(O.a&31)*2,U(O.a&31)*2,50),F()&&(q[O.step]&&await J(q[O.step]*F()),O.step==="pause"&&await J(O.ms*F()))}}if(v.prompts(),c.textContent=y==="end"?"The end.":"Waiting for a key.",!h.keys.length||y==="end")break}}catch(y){f(y)}D=!1}}let fe=s.kind==="c64"?{ArrowLeft:157,ArrowRight:29,ArrowDown:17,ArrowUp:145,Enter:13,Backspace:20,Delete:20,Escape:3," ":32}:{ArrowLeft:8,ArrowRight:21,ArrowDown:10,ArrowUp:11,Enter:13,Backspace:127,Delete:127,Escape:27," ":32},he=!1,r=y=>{h.press(y),K?.resume(),E?.start(),s.kind!=="c64"&&Z()};i.watch?.({engine:h,press:r,quick:y=>{he=y}});let d=()=>h.waitingOn?.words?.[0]==="tick",m=null,S=null;if(setInterval(()=>{if(!d()||D||h.keys.length)return;let y=S??m??-1;S=null,r(y)},100),window.addEventListener("keydown",y=>{if(y.metaKey||y.altKey)return;let O=y.ctrlKey?/^[a-z]$/i.test(y.key)?y.key.toUpperCase().charCodeAt(0)&31:void 0:fe[y.key]??(y.key.length===1?(s.kind==="c64"?y.key.toUpperCase():y.key).charCodeAt(0):void 0);if(O===void 0)return;if(y.preventDefault(),d()){S=m=O;return}let P=s.kind==="c64"&&!y.ctrlKey&&Ys(O);if(P){y.repeat||(h.clock.held={...P,key:y.key},K?.resume(),E?.start());return}!y.repeat&&!i.claim?.(O)&&r(O)}),window.addEventListener("keyup",y=>{m=null;let O=h.clock?.held;O?.key===y.key&&(O.seen?h.clock.held=null:O.up=!0)}),k.addEventListener("click",y=>{let O=y.target.closest(".key")?.dataset.key;O&&r(+O)}),k.focus(),s.kind==="c64"){if(i.route){let{route:B,name:X,keys:{expand:ee,give:W,petscii:ge,pollsAt:_e}}=i.route;e.seed=B.seed,B.printer&&e.printer&&(e.printer.on=!0,u("printer").checked=!0),c.textContent="Playing the route "+X+".";let ke={press:pe=>h.press(pe),also:pe=>{let Se=h.mem,Xt=Ni=>{Se[198]<10&&(Se[631+Se[198]]=Ni,Se[198]++)};h.keys.length&&Xt(h.keys.shift()),Xt(pe)}},Le=()=>{let pe;do h.delay=0,pe=h.run();while(pe==="pace");g.length=0};Le();for(let[pe,[Se]]of ee(B.keys).entries())W(ke,Se,ge),h.polls=_e(B,pe+1)??void 0,Le();h.polls=void 0,v.prompts()}h.sid=[],h.clock={irq:0,ahead:[],since:0};let y=null,O=null,P=0,N=!1;c.textContent="Playing.",setInterval(()=>{if(h.delay-=1e3/60,!N&&!h.ended&&h.delay<16){h.delay=Math.max(0,h.delay),h.clock.ahead.length&&h.idle>(h.routines.polls??200)&&!h.keys.length&&++h.clock.since>120&&(h.press(h.clock.ahead.shift()),h.clock.since=0);try{h.run(),g.length=0,v.prompts()}catch(B){N=!0,f(B)}h.ended&&(c.textContent="The end.")}if(E?.node&&w.checked){y??=new St(E.rate),O??=performance.now();let B=Math.floor((performance.now()-O)/1e3*E.rate)-P;if(B>0){let X=y.render(B,h.sid.map(([,ee,W])=>[0,ee,W]));P+=B,E.node.port.postMessage(X,[X.buffer])}}h.sid.length=0},1e3/60)}let b=new URLSearchParams(location.search).get("keys");if(b)for(let y of b.split(",")){let O={space:32,return:13,escape:27,delete:127,left:8,right:21,down:10,up:11,"control-e":5,"control-t":20,none:-1}[y]??y.charCodeAt(0);s.kind==="c64"?h.clock.ahead.push({8:157,21:29,10:17,11:145,127:20,27:3}[O]??O):h.press(O)}s.kind!=="c64"&&Z()}catch(L){f(L)}}async function Ar(i){let{title:e,data:t,root:s,disk:n,preview:o=!1,words:c}=i;s.classList.add("remake"),s.innerHTML='<div class="stage"></div><p class="options"><span id="status">Loading.</span></p>';let f=s.querySelector(".stage"),l=s.querySelector(".options"),p=s.querySelector("#status"),x=u=>{p.textContent="The remake stopped: "+u.message,p.className="error",console.error(u)};try{let u=new URLSearchParams(location.search).has("fixed"),{title:k,scripts:w,disk:L}=await Ht(e,{data:t,fixed:u});if(k.disk=L,k.style&&!document.querySelector(`link[data-title="${k.slug}"]`)){let a=Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL(k.style,e).href});a.dataset.title=k.slug,document.head.append(a),await new Promise(h=>{a.onload=a.onerror=h})}let T={...i,title:k,scripts:w,disk:L,folder:e,data:t,stage:f,options:l,status:p,fail:x,kept:n,preview:o,words:c,fixed:u};await(k.own??{play:Jt}).play(T)}catch(u){x(u)}}export{Gt as audio,js as diskDialogs,Ts as diskDisk,Ls as diskLocal,As as diskMemory,Ss as modal,ws as original,Zt as parts,Is as remakeC64View,ii as remakeCard,Ms as remakeCardView,Us as remakeCards,oi as remakeCompile,pi as remakeEngine,Ds as remakeEvents,gi as remakeLayout,ti as remakeLift,Ai as remakeLoad,Pi as remakeMain,ki as remakeProblems,Si as remakeRaster,Mi as remakeScenes,ni as remakeScript,Ci as remakeVector,Ii as remakeView};
30
+ `)}var un={};U(un,{Engine:()=>ze,label16:()=>Ue});import{cpu as gr}from"@moonbase-machines/mos6502";var{CPU:Go,CYCLES:Kt}=gr;var cn={left:!0},kr=new Set(["if","goto","call","return","compare","test","asm","push","pull"]),ln=n=>kr.has(n.words[0])||/^(=|\+=|-=|&=|\|=|\^=|<<=|>>=|rotate)$/.test(n.words[1]),fn=1020.484;function hn(n){if(n===32)return 3;if(n===0||n===64||n===96)return 1;let e=n>>2&7,t=n&3;return t===1?e===3||e===6||e===7?3:2:e===0?t===2||(n&224)>=160?2:1:e===2||e===6?t===0||t===2?1:2:e===4?2:e===3||e===7?3:2}var wr=new Set([234,169,162,160,165,166,164,173,174,172,24,56]),dn=n=>n.words[0]==="if"&&n.words.length===6,pn=n=>n?.at==null?void 0:n.at+2&65535,Ue=n=>"L"+n.toString(16).toUpperCase().padStart(4,"0"),ze=class{constructor({routines:e,scripts:t,start:s,label:i,memory:o={}}){this.routines=e,this.sources=t,this.mem=new Uint8Array(65536);for(let[c,f]of Object.entries(o))this.mem[c]=f;this.a=0,this.x=0,this.y=0,this.n=0,this.z=0,this.c=0,this.v=0,this.d=0,this.stack=[],this.keys=[],this.listeners=[],this.takers=[],this.ended=!1,this.timed=!!e.timed,this.cycles=0,this.clicks=[],this.delay=0,this.programs={},e.setup?.(this),this.enter(s,i,!0)}on(e){this.listeners.push(e)}emit(e){this.inside&&(e.inside=!0);for(let t of this.listeners)t(e)}inside=0;press(e){this.keys.push(e)}key(){let e=this.keys.shift();if(e!==void 0)for(let t of this.takers)t(e);return e}onKey(e){return this.takers.push(e),()=>{this.takers=this.takers.filter(t=>t!==e)}}enter(e,t,s=!1){let i=this.script(e);if(s)for(let o of i.data)this.mem.set(o.bytes,o.at);this.program=i,this.name=e,this.pc=t===void 0?0:this.label(t)}script(e){if(this.programs[e])return this.programs[e];let t=this.sources[e];if(t===void 0)throw new Error("no script "+e);let s=this.programs[e]=typeof t=="string"?De(t,e):{labels:t.labels,data:t.data.map(([i,o])=>({at:i,bytes:o})),steps:t.steps.map(([i,o,c],f)=>({at:i,text:c,where:e+":"+o,run:t.run[f],words:rt(c),index:f}))};for(let[i,o]of Object.entries(s.labels)){let c=/^L[0-9A-F]{4}$/.test(i)?parseInt(i.slice(1),16):null;c!==null&&s.steps[o]?.at>c&&(s.steps[o].start=c),c!==null&&s.steps[o]?.at===c&&(s.steps[o].entered=!0)}return s}callInside(e,t,s,i){this.stack.push({name:this.name,pc:this.pc,inside:!0,done:s,ret:i}),this.inside++,this.enter(e,t)}leave(e,t){throw this.stack=[],this.problem=null,this.waitingOn=null,this.visited=null,this.enter(e,t),cn}visit(e){this.visiting=e}startVisit(e){let[t,s]=this.title.visit[this.visiting];this.visiting=void 0,this.visited||(this.visited={name:this.name,pc:e,stack:this.stack,problem:this.problem,waitingOn:this.waitingOn,asked:this.asked,askMode:this.askMode,regs:[this.a,this.x,this.y,this.n,this.z,this.c,this.v]},this.title.raster?.keepScreen(),this.inside++,this.emit({step:"keep-screen"}),this.inside--,this.routines.show(this,[],null)),this.stack=[{visit:!0}],this.problem=null,this.waitingOn=null,this.asked=null,this.a=2,this.c=0,this.enter(t,s)}endVisit(){let e=this.visited;this.visited=null,this.title.raster?.putScreen(),this.inside++,this.emit({step:"put-screen"}),this.inside--,this.routines.show(this,[],null),this.enter(e.name),Object.assign(this,{pc:e.pc,stack:e.stack,problem:e.problem,waitingOn:e.waitingOn,asked:e.asked,askMode:e.askMode}),[this.a,this.x,this.y,this.n,this.z,this.c,this.v]=e.regs}label(e){let t=this.program.labels[e];if(t===void 0)throw new Error(this.name+": no label "+e);return t}place(e){if(e.through!==void 0)return(this.mem[e.through]|this.mem[e.through+1]<<8)+this.y&65535;if(e.pair!==void 0){let t=e.pair+this.x&255;return this.mem[t]|this.mem[t+1&255]<<8}return e.via!==void 0?(this.mem[e.via]|this.mem[e.via+1]<<8)+(e.index?this[e.index]:0)&65535:e.at+(e.index?this[e.index]:0)&65535}read(e){return this.io&&this.ioAt(e)?this.io(e)&255:this.mem[e]}write(e,t){this.io&&this.ioAt(e)?this.io(e,t&255):this.mem[e]=t}ioAt(e){return(e&65280)===49152}get(e){return e.number!==void 0?e.number&255:e.reg==="carry"?this.c:e.reg?this[e.reg]:this.read(this.place(e))}load(e){return this.timed&&(e.index&&!e.zp||e.through!==void 0)&&((e.through!==void 0?this.mem[e.through]|this.mem[e.through+1]<<8:e.via!==void 0?this.mem[e.via]|this.mem[e.via+1]<<8:e.at)&255)+this[e.index??"y"]>255&&this.cycles++,this.get(e)}ix(e,t){return this.timed&&(e&255)+t>255&&this.cycles++,e+t&65535}set(e,t){if(t&=255,e.reg){this[e.reg]=t;return}this.write(this.place(e),t)}flags(e){return this.n=e>>7&1,this.z=e===0?1:0,e}compare(e,t){let s=e-t&511;this.c=e>=t?1:0,this.flags(s&255)}time(e,t,s){if(!this.timed)return;let i=e[t].cycles;if(i===void 0){i=0;for(let o=t;o<=s;o++)i+=this.cost(e,o);e[t].cycles=i}this.cycles+=i,this.delay+=i/fn}cost(e,t){let s=e[t],i=this.mem;if(s.at===null)return 0;let o=Kt[i[s.at]]+(dn(s)?2:0),c=!s.entered&&!["return","goto"].includes(e[t-1]?.words[0])?e[t-1]:null;if(s.start!==void 0||c&&c.at!==null){let f=s.start??c.at+hn(i[c.at])+(dn(c)?2:0)+(this.routines.inline?.(this,c)??0);if(f<s.at&&s.at-f<=9){let l=0,p=f;for(;p<s.at&&wr.has(i[p]);p+=hn(i[p]))l+=Kt[i[p]];p===s.at&&(o+=l)}}return o}add(e){if(this.d){let i=(this.a&15)+(e&15)+this.c,o=(this.a>>4)+(e>>4);i>9&&(i-=10,o++),this.z=(this.a+e+this.c&255)===0?1:0,this.n=o&8?1:0,this.v=~(this.a^e)&(this.a^o<<4)&128?1:0,o>9?(o-=10,this.c=1):this.c=0,this.a=(o<<4|i)&255;return}let t=this.a,s=t+e+this.c;this.v=~(t^e)&(t^s)&128?1:0,this.c=s>255?1:0,this.a=this.flags(s&255)}sub(e){if(!this.d)return this.add(e^255);let t=(this.a&15)-(e&15)-(1-this.c),s=(this.a>>4)-(e>>4);t<0&&(t+=10,s--);let i=this.a-e-(1-this.c);this.z=(i&255)===0?1:0,this.n=i&128?1:0,this.v=(this.a^e)&(this.a^i)&128?1:0,this.c=i>=0?1:0,s<0&&(s+=10),this.a=(s<<4|t)&255}shift(e,t,s){let i=t?(e<<1|(s?this.c:0))&255:e>>1|(s&&this.c?128:0);return this.c=t?e>>7:e&1,this.flags(i)}test(e){this.n=e>>7&1,this.v=e>>6&1,this.z=(e&this.a)===0?1:0}jump(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["goto-engine"](this,["$"+e.slice(1)],t);this.pc=this.label(e)}jumpThrough(e,t){let s=Ue(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[s]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+s.slice(1)],t);this.pc=this.label(s)}jumpTable(e,t){this.pc=this.label(Ue(this.mem[e+t]|this.mem[e+t+1]<<8))}call(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["call-engine"](this,["$"+e.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:pn(t)}),this.pc=this.label(e)}callThrough(e,t){let s=Ue(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[s]===void 0&&this.routines["call-engine"])return this.routines["call-engine"](this,["$"+s.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:pn(t)}),this.pc=this.label(s)}ret(e){let t=this.stack.pop();if(!t)throw new Error("return with nothing called");if(t.visit){this.endVisit();return}let s=this.pulled;if(t.a!==void 0&&this.stack.at(-1)?.a!==void 0){let i=this.stack.pop().a,o=(i<<8|t.a)+1&65535,c=Ue(o);if(s?.ret!==void 0&&o>s.ret&&o-s.ret<=256){this.pulled=null,s.name!==this.name&&this.enter(s.name),this.pc=s.pc,s.inside&&(this.inside--,s.done?.(this));return}if(s?.ret!==void 0&&o<=s.ret&&s.ret-o<=32&&this.script(s.name).labels[c]!==void 0){this.pulled=null,s.name!==this.name&&this.enter(s.name),this.pc=this.label(c),s.inside&&(this.again=this.again?.ret===s.ret?{...this.again,n:this.again.n+1}:{ret:s.ret,done:s.done,n:1});return}if(this.program.labels[c]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+c.slice(1)],e);this.pc=this.label(c);return}if(s&&this.stack.length<s.depth&&(this.pulled=null,s.inside&&s.ret!==void 0&&this.inside--),t.name!==this.name&&this.enter(t.name),this.pc=t.pc,t.inside&&(this.inside--,t.done?.(this)),this.again&&t.ret===this.again.ret){let i=this.again;this.again=null,this.inside-=i.n,i.done?.(this)}t.after?.(this)}push(e){this.stack.push(e?{a:this.a}:{flags:[this.n,this.z,this.c,this.v]})}pull(e){let t=this.stack.at(-1);if(t&&t.name!==void 0){let i=t.ret===void 0?0:t.half?t.ret>>8:t.ret&255;t.half?(this.stack.pop(),t.depth=this.stack.length,this.pulled=t,t.inside&&t.ret===void 0&&this.inside--):t.half=!0,e&&(this.a=this.flags(i));return}let s=this.stack.pop();e?this.a=this.flags(s.a):[this.n,this.z,this.c,this.v]=s.flags}sp(){return 255-this.stack.reduce((e,t)=>e+(t.name===void 0||t.half?1:2),0)&255}stackPage(){let e=this.sp();(this.stacks??=new Map).set(e,this.stack.map(s=>({...s})));let t=255;for(let s of this.stack){let i=s.ret??0;s.name===void 0?this.mem[256+t--]=s.a??(s.flags?s.flags[0]<<7|s.flags[3]<<6|48|s.flags[1]<<1|s.flags[2]:0):(this.mem[256+t--]=i>>8,s.half||(this.mem[256+t--]=i&255))}return e}asm(e){if(e==="TSX"&&(this.x=this.flags(this.stackPage())),e==="TXS"){let t=this.stacks?.get(this.x);this.stack=t?t.map(s=>({...s})):[],this.visited=null,this.inside=this.stack.filter(s=>s.inside).length}e==="CLV"&&(this.v=0),e==="SED"&&(this.d=1),e==="CLD"&&(this.d=0),e==="SEI"&&(this.i=1),e==="CLI"&&(this.i=0)}run(e=1e7){this.pacing||(this.idle=0),this.pacing=!1,this.delay??=0;for(let t=0;t<e;t++){if(this.ended)return"end";let s=this.program.steps[this.pc];if(!s)throw new Error(this.name+": ran off the end");if(this.routines.before?.(this,s)==="wait"||this.exec(s)==="wait")return"idle";if(this.polled)return this.polled=!1,"idle";if(this.delay>=16)return this.pacing=!0,"pace"}return"steps"}exec(e){let t=this.pc;this.pc++;try{this.called=!1,!e.run&&ln(e)&&this.time(this.program.steps,t,t);let s=e.run?e.run(this,this.program.steps):this.interpret(e);if(s==="wait"&&(e.run?this.called:!ln(e))&&(this.pc=t,this.visiting!==void 0)){this.startVisit(t);return}return s}catch(s){if(s===cn){this.inside=0;return}if(this.routines.error?.(this,s)){this.ended=!0;return}throw s.message=e.where+" ("+e.text+"): "+s.message,s}}interpret(e){let t=e.words,[s,i]=t;if(i==="="&&t.length===3){let o=te(s),c=this.load(te(t[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=te(s),c=t.length===3?this.get(te(t[2])):this.load(te(t[2]));if(t.length===3){let f=this.get(o)+(i==="+="?c:-c)&255;this.set(o,f),this.flags(f);return}i==="+="?this.add(c):this.sub(c);return}if(i==="&="||i==="|="||i==="^="){let o=this.load(te(t[2]));this.a=this.flags(i==="&="?this.a&o:i==="|="?this.a|o:this.a^o);return}if(i==="<<="||i===">>="||i==="rotate"){let o=te(s);this.set(o,this.shift(this.get(o),i==="<<="||t[2]==="left",i==="rotate"));return}switch(s){case"if":return this.branch(t,e);case"goto":return t[1].startsWith("(")?this.jumpThrough(parseInt(t[1].slice(2,-1),16),e):t[1].startsWith("[")?this.jumpTable(parseInt(t[1].slice(2),16),this[t[2][0]]):this.jump(t[1],e);case"call":return t[1].startsWith("(")?this.callThrough(parseInt(t[1].slice(2,-1),16),e):this.call(t[1],e);case"return":return this.ret(e);case"compare":this.compare(this[t[1]],this.load(te(t[2])));return;case"test":this.test(this.get(te(t[1])));return;case"asm":if(t[1]==="RTI")return this.ret(e);this.asm(t[1]);return;case"push":this.push(t[1]==="a");return;case"pull":this.pull(t[1]==="a");return}return this.routine(s,t.slice(1),e)}routine(e,t,s){let i=this.routines[e];if(!i)throw new Error("no routine "+e);if(this.called=!0,s&&this.timed&&s.at!==null){let o=this.cost(this.program.steps,s.index);this.cycles+=o,this.delay+=o/fn}return i(this,t,s)}branch(e,t){let s=e.at(-1),i=e.slice(1,-2),o;if(i.length===3&&/^[axy]$/.test(i[0]))this.compare(this[i[0]],this.load(te(i[2]))),o={"==":this.z,"!=":!this.z,">=":this.c,"<":!this.c}[i[1]];else{let c=i[0]==="not",f=c?i[1]:i[0],l={zero:this.z,carry:this.c,negative:this.n,overflow:this.v}[f];if(l===void 0)throw new Error("no flag "+f);o=c?!l:!!l}o&&(this.cycles+=Be(t),this.pc=this.label(s))}};var kn={};U(kn,{LAYOUT:()=>be,PANELS:()=>Ke,layout:()=>qe,resolve:()=>Oe,textLayout:()=>Fe,textPage:()=>ve,textPen:()=>We,word:()=>gn});import{font as yr}from"@moonbase-machines/vector";var{GLYPHS:sa,WIDTHS:na,dots:ot,start:mn,useFont:xn,width:re}=yr;var be={65:[116,116,174],50:[116,116,160],49:[130,130,174],34:[130,130,160],17:[158,158,174]},oe=(n,e,t,s,i)=>({layout:n,rows:e,fill:10,paper:10,ink:0,gap:t,y:s,more:i}),le=(n,e,t,s)=>({layout:n,rows:e,fill:5,paper:5,ink:15,gap:t,y:s}),Ke={1:oe(50,[116,159],7,128),2:oe(50,[116,159],33,135),3:oe(34,[130,159],5,135),4:oe(34,[130,159],19,142),5:le(34,[160,189],5,166),6:le(34,[160,189],19,172),7:oe(65,[116,173],5,121),8:oe(65,[116,173],6,128),9:oe(65,[116,173],7,134),10:oe(65,[116,173],47,142),11:oe(50,[116,159],5,121),12:oe(49,[130,173],5,135),13:oe(49,[130,173],7,142),14:oe(49,[130,173],33,149),15:oe(17,[158,173],5,163,[174]),16:le(50,[160,189],19,172),17:le(66,[160,189],19,172),18:le(50,[160,189],5,166),19:le(66,[160,189],5,166),20:le(35,[160,189],0,163),21:le(51,[160,189],0,163),22:le(67,[160,189],0,163),23:le(49,[174,189],5,179),24:le(65,[174,189],5,179)};function gn(n,[e,t,s,i]){let o=e|t<<8,c=i===255?s:n[s|i<<8];for(;c-- >0;)o+=n[o]+1;let f="";for(let l=1;l<=n[o];l++)f+=String.fromCharCode(n[o+l]&127);return f}var Oe=(n,e)=>n.replace(/\{6:([0-9a-f,]+)\}/g,(t,s)=>gn(e,s.split(",").map(i=>parseInt(i,16))));function qe(n,e){let t=e,s=[];t.tall=!1,t.margin=t.x;let i=9,o=!1,c=[],f=t.ink,l=!1,p=u=>{if(c.length){let k=mn(c.map(O=>O.ch),t.spacing,t.x,t.centre),w=[];for(let O of c){let T=re(O.ch);w.push({ch:O.ch,x:k,ink:O.ink}),k+=O.ch.charCodeAt(0)<32?T:T+t.spacing}s.push({top:t.y,tall:t.tall,height:i,paper:t.paper,ink:t.ink,chars:w}),t.x=k}c=[],u&&(t.y+=(t.tall?2*i:i)+t.gap,t.x=t.margin)},x=u=>c.push({ch:o&&u>="0"&&u<="9"?String.fromCharCode(128+u.charCodeAt(0)-48):u,ink:l?f:void 0});for(let u=0;u<n.length;u++){let k=n[u];if(k===`
31
+ `){p(!0);continue}if(k==="{"){let w=n.indexOf("}",u),[O,T]=n.slice(u+1,w).split(":"),a=(T??"").split(",").map(h=>parseInt(h,16));switch(u=w,parseInt(O,16)){case 0:t.x=t.margin=a[0];break;case 1:a[0]<192?t.y=a[0]:i=a[0]-192;break;case 2:t.spacing=a[0];break;case 3:t.gap=a[0];break;case 4:t.ink=f=a[0],l=!0;break;case 5:t.paper=a[0];break;case 7:t.centre=!0;break;case 8:t.centre=!1;break;case 9:t.tall=!0;break;case 10:t.tall=!1;break;case 13:f=0,l=!0;break;case 14:f=1,l=!0;break;case 16:o=!0;break;case 17:o=!1;break;case 15:for(let h=0;h<(a[1]||256);h++)x(String.fromCharCode(a[0]&127));break}continue}x(k)}return p(!1),s}function Fe(n,e){let t=[];e.inverse=!1;let s=[],i=c=>{let f=e.centre?40-s.length>>1:e.x;s.forEach((l,p)=>t.push({row:e.y,col:f+p,ch:l.ch,inverse:l.inverse})),s.length&&(e.x=f+s.length),s=[],c&&(e.y++,e.x=e.margin)},o=c=>s.push({ch:e.inverse?c.toUpperCase():c,inverse:e.inverse});for(let c=0;c<n.length;c++){let f=n[c];if(f===`
32
+ `){i(!0);continue}if(f==="{"){let l=n.indexOf("}",c),[p,x]=n.slice(c+1,l).split(":"),u=(x??"").split(",").map(k=>parseInt(k,16));switch(c=l,parseInt(p,16)){case 0:i(!1),e.x=e.margin=u[0];break;case 1:i(!1),u[0]<192&&(e.y=u[0]);break;case 7:e.centre=!0;break;case 8:e.centre=!1;break;case 13:e.inverse=!0;break;case 14:e.inverse=!1;break;case 15:for(let k=0;k<(u[1]||256);k++)o(String.fromCharCode(u[0]&127));break}continue}o(f)}return i(!1),t}var We=()=>({x:0,y:0,margin:0,centre:!1,inverse:!1}),ve=()=>Array.from({length:24},()=>Array.from({length:40},()=>({ch:" ",inverse:!1})));var Tn={};U(Tn,{loadTitle:()=>Ht,makeEngine:()=>Yt});var On={};U(On,{codeFiles:()=>Ye,pictureShapes:()=>Sr,vectorRoutines:()=>Wt});var wn={};U(wn,{helpers:()=>qt});function qt(n,e){let t=n.title.map.vars.zero;function*s(f,...l){let p={words:[f]},x=l.map(u=>typeof u=="string"&&f==="text"?{string:u}:typeof u=="number"?String(u):u);for(;;){if(e[f](n,x,p)!=="wait")return{a:n.a,x:n.x,y:n.y,c:n.c};yield"wait"}}let i=(f,l=0,p,x)=>{n.a=l&255,p!==void 0&&(n.x=p&255),x!==void 0&&(n.y=x&255),n.title.paint?.[f]?.(n.title.model,n),n.emit(Q(f,[],n,void 0,u=>n.mem[u+t],u=>n.mem[u]))};function*o(f="wait"){let l={words:[f]};for(;;){let p=n.key();if(p===5&&n.title?.menu&&n.leave(...n.title.menu),n.title?.visit?.[p]){n.visit(p),n.waitingOn=l,yield"wait";continue}if(p!==void 0)return n.waitingOn=null,p;n.waitingOn=l,yield"wait"}}function*c(f){n.inside++;try{return yield*f}finally{n.inside--}}return{e:n,mem:n.mem,call:s,drawn:i,key:o,inside:c}}import{objects as br}from"@moonbase-machines/vector";var{carry:yn,decode:ca,put:bn,tables:at}=br;Ge();var En={};U(En,{Raster:()=>He});import{draw as vr}from"@moonbase-machines/vector";var{crossings:ha,draw:vn,fill:da,inside:pa,line:Sn,outline:ua,screen:Ft,spans:ma,under:xa}=vr;var He=class{constructor(){this.dots=Ft(15),this.kept=null}keepScreen(){this.screenKept={dots:this.dots,kept:this.kept},this.dots=Ft(0)}putScreen(){this.screenKept&&({dots:this.dots,kept:this.kept}=this.screenKept),this.screenKept=null}scroll(){for(let e=19;e<=115;e++){let t=this.dots[e],s=[];for(let i of t)s.push(i>>3&1,i>>2&1,i>>1&1,i&1);for(let i=14;i<518;i++)s[i]=s[i+28];for(let i=0;i<140;i++)t[i]=s[4*i]<<3|s[4*i+1]<<2|s[4*i+2]<<1|s[4*i+3]}}set(e,t,s){e>=0&&e<140&&t>=0&&t<192&&(this.dots[t][e]=s&15)}get(e,t){return e>=0&&e<140&&t>=0&&t<192?this.dots[t][e]:0}span(e,t,s,i){for(let o=t;o<=s;o++)this.set(o,i,e)}rows(e,t,s,i){for(let o=s;o<s+t;o++)this.span(e,0,139,o),i&&(this.set(0,o,15),this.set(139,o,15))}whiteLines(e){this.span(15,0,139,e),this.span(15,0,139,e+1)}box(e,t,s,i){let[o,c,f]=be[e]??be[50];if(t!==128){this.span(0,1,138,1),this.span(0,1,138,o-1);for(let l=2;l<o-1;l++)this.set(1,l,0),this.set(138,l,0),this.span(t,2,137,l)}s!==128&&(this.whiteLines(c),this.rows(s,f-c-2,c+2,!0)),i!==128&&(this.whiteLines(f),this.rows(i,190-f-2,f+2,!0))}panel(e,t,s){this.whiteLines(e),this.rows(s,t-e-1,e+2,!0)}picture(e){vn(e,this.dots)}rectangle(e,t,s,i,o){for(let c=s;c<s+o;c++)this.span(e,t,t+i-1,c)}outline(e,t,s,i,o){this.span(e,t,t+i-1,s),this.span(e,t,t+i-1,s+o-1);for(let c=s;c<s+o;c++)this.set(t,c,e),this.set(t+i-1,c,e)}line(e,t,s,i,o){for(let[c,f]of Sn(t,s,i,o))this.set(c,f,e)}object(e,t,s,i){i==="keep"&&(this.kept={x:t,y:s,rows:e.rows.map((o,c)=>o.map((f,l)=>this.get(t+l,s+c)))}),bn(this.dots,e,t,s,i==="whole")}restore(){let e=this.kept;e&&e.rows.forEach((t,s)=>t.forEach((i,o)=>this.set(e.x+o,e.y+s,i)))}glyph(e,t,s,i,o,c=1,f=9,l=0){let p=re(e);if(e.charCodeAt(0)<32){for(let u=0;u<Math.min(9,f);u++)for(let k=0;k<p;k++)for(let w=0;w<c;w++)this.set(t+k,s+u*c+w,o);return p}let x=new Set(ot(e).map(([u,k])=>u+","+k));for(let u=0;u<Math.min(9,f);u++)for(let k=0;k<p+l;k++)for(let w=0;w<c;w++)this.set(t+k,s+u*c+w,x.has(k+","+u)?i:o);return p}};function Ye(n,e){let t=n?.loads??{};return Object.entries(e).filter(([s])=>/^(PART|PROB)\d$/.test(s)).map(([s,i])=>({name:s,bytes:Uint8Array.from(atob(i.data),o=>o.charCodeAt(0)),origin:t[s]??t[s.slice(0,-1)]??i.aux}))}var ne={escape:27,space:32,return:13,delete:127,left:8,right:21,down:10,up:11,menu:5};function xe(n,e,t){let s=ue[e]||"",i=[],o=0;e==="panel"&&i.push(t[o++]);let c={a:n.a,x:n.x,y:n.y};if(e==="objects"&&t[0]?.startsWith?.("$")){let f=parseInt(t[o++].slice(1),16);c.x=f&255,c.y=f>>8}else for(let f of s){let l=t[o++];l===void 0||l===f||(c[f]=typeof l=="object"?l.string.charCodeAt(0)|128:l.startsWith("$")?n.mem[parseInt(l.slice(1),16)]:+l)}return n.a=c.a&255,n.x=c.x&255,n.y=c.y&255,{fixed:i,rest:t.slice(o)}}function ct(n,e,t,s,i,o){for(n.waitingOn!==e&&(n.emit(Q(t,s,n,i)),n.waitingOn=e,n.asked=null);;){let c=n.key();if(c===void 0)return"wait";if(c===ne.menu&&n.title.menu&&n.leave(...n.title.menu),n.title.visit?.[c])return n.visit(c),"wait";if(o(c)){n.waitingOn=null;return}}}function jn(n,e){if(e){n.inside++;try{for(let t=e.next();!t.done;t=e.next())if(t.value==="wait")throw new Error("a choice drawn inside the ask cannot wait")}finally{n.inside--}}}function $n(n){if(n.objectTables||!n.disk)return n.objectTables;let e=Ye(n.map,Object.values(n.disk.volumes)[0]);return n.objectTables=new Map(at(e,n.map.objects).map(t=>[t.address,t.objects]))}function Cn(n){if(n.pictureShapes||!n.disk)return n.pictureShapes;let e=Object.values(n.disk.volumes)[0],t=new Map;for(let[s,i]of Object.entries(e))if(/^PICS\d$/.test(s))for(let o of Ie(Uint8Array.from(atob(i.data),c=>c.charCodeAt(0))))t.set(o.name,o.shapes);return n.pictureShapes=t}var Sr=(n,e)=>Cn(n)?.get(e.toUpperCase().replace(/_/g," "));function Wt(n){let e=n.map.vars,t=a=>e.zero+a;xn(n.font);let s=a=>{if(a.a<2)return;let h=$n(n)?.get(a.objectTable)?.find(g=>g.number===a.a);h&&(a.c=yn(h,a.x),a.mem[t(2)]=a.y+h.height&255)},i=n.raster??=new He,o=n.pen??={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10};n.text??={showing:!1,pen:We(),page:ve()};let c=(a,h)=>$n(n)?.get(a.objectTable)?.find(g=>g.number===h),f=(a,h)=>{if(a.a<2)return i.restore();let g=c(a,a.a);g&&i.object(g,a.x,a.y,h)},l=a=>{let h=re(a),g=o.x,E=(h<4?4-h:0)+1;i.rectangle(1,g,o.y-2,Math.max(4,h)+4,11),i.outline(13,g,o.y-2,Math.max(4,h)+4,11),i.glyph(a,g+1+E,o.y,15,1,1,8),o.x=g+1+E+h+1+2},p=a=>{let h=n.map.keyPanel;if(!h)return;let g=i.get(2,2),{x:E,y:$}=o;for(let C=h.top;C<h.top+h.rows;C++)i.span(g,h.left,h.right,C);h.caps.forEach(([C,R,M],S)=>{(!a||a===S+1)&&(o.x=C,o.y=R,l(String.fromCharCode(M&127)))}),Object.assign(o,{x:E,y:$})},x=(a,h)=>{for(let g of qe(Oe(h,a.mem),o))for(let E of g.chars)i.glyph(E.ch,E.x,g.top,E.ink??g.ink,g.paper,g.tall?2:1,g.height,o.spacing)},u=(a,h,g,E,$)=>{let C=c(a,h);C&&i.object(C,g,E,$)};n.model={raster:i,pen:o,cap:l,keyPanel:p,print:x,put:u};let k=(a,h)=>(g,E,$)=>{let{fixed:C,rest:R}=xe(g,a,E),M=R.map(S=>typeof S=="object"?S.string:S).join(" ");g.emit(Q(a,C,g,R.length?M:void 0,S=>g.mem[t(S)])),R=R.map(S=>typeof S=="object"?S.string:S),h?.(g,C,R)},w=!n.map.askClearsCarry,O=a=>(h,g,E)=>{h.waitingOn!==E&&xe(h,a,g);let $=h.waitingOn===E?h.askMode:h.a;h.askMode=$;let C=[ne.left,ne.right,ne.down,ne.up];$===128&&h.waitingOn!==E&&p(0);let R=ct(h,E,a,[],void 0,M=>{if(a==="ask-escape"&&M===ne.escape)return h.a=h.flags(27),h.x=155,h.c=1,h.asked=null,!0;if(h.asked===null){let S=-1,A=M;return $===128?(S=C.indexOf(M),A=219+S,S>=0&&p(S+1)):$>=177&&$<186?M>=49&&M<=($&127)&&(S=M-49):(A=M&95,A>=65&&A<=($&95&127)&&(S=A-65,A|=128)),S>=0&&(h.asked={place:S,key:A},a==="ask-mode"&&jn(h,h.askHooks?.chose?.(S))),!1}return M===ne.return?(h.x=h.asked.place,h.y=2*h.x,h.a=h.asked.key,h.c=w&&h.a>=193?1:0,!0):((M===ne.delete||M===ne.left)&&(a==="ask-mode"&&jn(h,h.askHooks?.undo?.(h.asked.place)),$===128&&p(0),h.asked=null),!1)});return R!=="wait"&&(h.mem[e.layout]=34,h.emit(se(a,h))),R},T={show:k("show",a=>{n.text.showing=!1,a.mem[49181]=128}),"text-screen":a=>{Object.assign(n.text,{showing:!0,page:ve()}),a.mem[49181]=0,a.inside++,a.emit({step:"text-screen"}),a.inside--},picture:k("picture",(a,h,[g])=>{let E=Cn(n)?.get(g.toUpperCase().replace(/_/g," "));E&&i.picture(E)}),box:k("box",a=>i.box(a.mem[e.layout],a.a,a.x,a.y)),panel:k("panel",(a,[h])=>{let g=Ke[h];if(g){a.mem[e.layout]=g.layout,i.panel(g.rows[0],g.rows[1],g.fill);for(let E of g.more??[])i.whiteLines(E);Object.assign(o,{paper:g.paper,ink:g.ink,centre:!0,spacing:1,gap:g.gap,y:g.y})}}),text:(a,h)=>{let g=h[0].string.replace(/\{([0-9a-f]+):([^}]*)\}/g,(E,$,C)=>"{"+$+":"+C.split(",").map(R=>R.startsWith("$")?a.mem[parseInt(R.slice(1),16)].toString(16):R).join(",")+"}").replace(/\{\$([0-9A-Fa-f]{4})\}/g,(E,$)=>String.fromCharCode(a.mem[parseInt($,16)]&127));if(a.emit(Q("text",[],a,g)),n.text.showing){for(let E of Fe(Oe(g,a.mem),n.text.pen))n.text.page[E.row]?.[E.col]&&(n.text.page[E.row][E.col]={ch:E.ch,inverse:E.inverse});return}x(a,g)},objects:k("objects",a=>{a.objectTable=a.x|a.y<<8}),object:k("object",a=>{f(a,"whole"),s(a)}),"object-keep":k("object-keep",a=>{f(a,"keep"),s(a)}),"object-mode":k("object-mode",a=>f(a,"clear")),"key-at":k("key-at",a=>{o.x=a.x,o.y=a.y,l(String.fromCharCode(a.a&127))}),key:k("key",a=>l(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[t(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[t(17)],a.mem[t(0)],a.mem[t(2)],a.mem[t(1)],a.mem[t(3)])),rectangle:k("rectangle",a=>i.rectangle(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)])),"rectangle-outline":k("rectangle-outline",a=>i.outline(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)]+1)),flash:k("flash"),"read-dot":(a,h)=>{xe(a,"read-dot",h),a.emit(Q("read-dot",[],a)),a.a=a.flags(i.get(a.x,a.y)),a.emit(se("read-dot",a))},"key-panel":k("key-panel",a=>p(a.a)),"keep-span":k("keep-span"),"put-span":k("put-span"),"invert-span":k("invert-span"),button:k("button"),beep:(a,h)=>{xe(a,"beep",h),Tt("beep",a.a)||a.emit(Q("beep",[],a))},sound:(a,h)=>a.emit(Q("sound",[],a,h.map(g=>g.startsWith("$")?a.mem[parseInt(g.slice(1),16)].toString(16):g).join(" "))),scroll:a=>{i.scroll(),a.inside++,a.emit({step:"scroll"}),a.inside--},"shift-down":(a,h)=>{let[g,E,$,C,R]=h.map(Number);for(let M=C;M>=$;M--)for(let S=g;S<=E;S++)i.set(S,M+R,i.get(S,M));a.inside++,a.emit({step:"shift-down",left:g,right:E,top:$,bottom:C,by:R}),a.inside--},part:k("part"),wait:(a,h,g)=>ct(a,g,"wait",[],void 0,E=>E===ne.space&&(a.a=32,a.c=0,!0)),"wait-erase":(a,h,g)=>ct(a,g,"wait-erase",[],void 0,E=>E===ne.space),"wait-or-escape":(a,h,g)=>{let E=ct(a,g,"wait-or-escape",[],void 0,$=>($===ne.space||$===ne.escape)&&(a.c=$===ne.escape?1:0,a.a=$,!0));return E!=="wait"&&a.emit(se("wait-or-escape",a)),E},ask:O("ask"),"ask-mode":O("ask-mode"),"ask-escape":O("ask-escape"),random:(a,h)=>{let{fixed:g}=xe(a,"random",h);a.emit(Q("random",g,a));let E=a.a,{at:$,used:C}=n.map.seed;a.mem[C]===255&&n.seed!==void 0&&(a.mem[$]=n.seed&255,a.mem[$+1]=n.seed>>8);let R=a.mem[$]|a.mem[$+1]<<8;R=R*259&65535,a.mem[$]=R&255,a.mem[$+1]=R>>8,a.mem[C]=E;let M=E?Math.floor(65535/E):65535;a.a=Math.floor(R/M)&255,a.c=0,a.emit(se("random",a))},multiply:(a,h)=>{xe(a,"multiply",h),a.emit(Q("multiply",[],a));let g=a.a*a.x;a.a=g&255,a.x=g>>8,a.emit(se("multiply",a))},divide:(a,h)=>{xe(a,"divide",h),a.emit(Q("divide",[],a));let g=a.x|a.y<<8,E=a.a||1;a.a=Math.floor(g/E)&255,a.x=g%E,a.emit(se("divide",a))},problem:(a,h,g)=>{if(!a.problem){xe(a,"problem",h),a.emit(Q("problem",[],a)),a.mem[e.practice]=a.c?128:0,a.repeats=a.mem[e.repeats],n.map.countInX&&a.c&&(a.mem[e.repeats]=a.x);let E=n.problems?.[a.a];if(!E)throw new Error("problem "+a.a+" is not written yet");let $=n.disk&&Ye(n.map,Object.values(n.disk.volumes)[0]).find(C=>C.name==="PROB"+a.a);$&&a.mem.set($.bytes,$.origin),a.problem=E(qt(a,T))}if(!a.problem.next().done)return"wait";a.problem=null,a.c=0,a.mem[e.repeats]=a.repeats,a.emit(se("problem",a))},"read-key":(a,h,g)=>{a.waitingOn!==g&&(a.waitingOn=g,a.asked=null);let E=a.key();if(E===void 0)return"wait";if(n.visit?.[E])return a.visit(E),"wait";a.waitingOn=null,E===ne.menu&&n.menu&&a.leave(...n.menu),a.a=a.flags(E&127),a.c=E===ne.escape?1:0,a.emit(se("read-key",a))},splash:(a,h,g)=>{if(a.waitingOn!==g&&(a.inside++,a.emit({step:"splash"}),a.inside--,a.waitingOn=g),a.key()===void 0)return"wait";a.waitingOn=null},"clear-screen":a=>{for(let h of i.dots)h.fill(0);a.inside++,a.emit({step:"clear-screen"}),a.inside--},pause:(a,[h])=>{a.x=0,a.y=0,a.flags(0),a.inside++,a.emit({step:"pause",ms:+h}),a.inside--},quit:a=>{a.ended=!0},unwritten:(a,[h])=>{throw new Error("not written yet: "+(h?.string??h))},"goto-engine":(a,[h])=>{let g=n.entries?.[h];if(!g)throw new Error("no script for "+h);a.enter(...g)},"call-engine":(a,[h])=>{let g=n.entries?.[h];if(!g)throw new Error("no script for "+h);a.stack.push({name:a.name,pc:a.pc}),a.enter(...g)},"load-part":a=>{let h=Object.keys(n.disk?.volumes??{})[0]?.toUpperCase();if(n.files?.out?.has(h)){a.a=a.flags(69),a.c=1;return}a.stack=[],a.enter("part"+a.a,void 0,!0)},"write-settings":a=>{let h=n.files??=new tt(n.disk),g=Object.keys(n.disk.volumes)[0].toUpperCase(),E=h.out?.has(g)?69:h.disks[g]==="protected"?43:0;a.a=a.flags(E),a.c=E?1:0}};return T}dt();var An={vector:Wt,card:Dt};async function Ln(n,e){if(n.protocol==="file:"){let s=globalThis.process.getBuiltinModule("node:fs").readFileSync(n,"utf8");return e==="json"?JSON.parse(s):s}let t=await fetch(n);if(!t.ok)throw new Error(`${n.pathname}: ${t.status}`);return e==="json"?t.json():t.text()}var lt=async n=>(await import(n.href)).default;async function Ht(n,{data:e,scenes:t=!1,fixed:s=!1}={}){n=new URL(n);let i={...await lt(new URL("title.js",n))};for(let f of i.modules??[])i[f]=await lt(new URL(f+".js",n));if(i.view&&(i.viewSteps=await lt(new URL("view.js",n))),!An[i.engine])return i.own=await import(new URL(i.engine+".js",n).href),{title:i,scripts:{},disk:null,folder:n};let o=Object.fromEntries(await Promise.all(i.scripts.map(async f=>[f,t?await Ln(new URL(f+".scene",n),"text"):await lt(new URL(`compiled/${s&&i.fixed?.[f]||f}.js`,n))]))),c=await Ln(new URL(e),"json");return{title:i,scripts:o,disk:c,folder:n}}function Yt(n,e){let t={...n.disk?.kind==="prodos"?ht(n.disk):{},...n.memory},s=new ze({routines:An[n.engine](n),scripts:e,start:n.start,label:n.startLabel,memory:t});return s.title=n,s}var Nn={};U(Nn,{play:()=>Ar});var Pn={};U(Pn,{play:()=>Jt});Ze();Et();import{rom as Er}from"@moonbase-machines/c64";var{STANDS_IN:Pa,install:Na,standIn:Rn}=Er;mt();$t();var Mn={};U(Mn,{View:()=>Ve});import{colors as jr}from"@moonbase-machines/apple2e";var{COLORS:In,NAMES:Ua,rgb:ae}=jr;Ge();wt();import{font as $r}from"@moonbase-machines/charset";var{FONT:Vt}=$r;Xe();var Cr="http://www.w3.org/2000/svg",Y=n=>n*4,_=n=>n*2,ft='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',Or='ui-monospace, Menlo, Consolas, "Liberation Mono", monospace',_t=["[","\\","]","^"],Lr={"[":"\u2190","\\":"\u2192","]":"\u2193","^":"\u2191"},Ve=class{constructor(e,{disk:t,volume:s,engine:i,extra:o={},press:c}){this.svg=e,this.engine=i,this.extra=o,this.press=c,e.setAttribute("viewBox","0 0 560 384"),this.disk=t.volumes[s],this.pictures=new Map;for(let[x,u]of Object.entries(t.volumes[s]))if(/^PICS\d$/.test(x))for(let k of Ie(Uint8Array.from(atob(u.data),w=>w.charCodeAt(0))))this.pictures.set(k.name,k.shapes);let f=i.title.map;this.vars=f.vars;let l={...Lr,...f.modern};for(let x=0;x<10;x++)l[String.fromCharCode(128+x)]=String(x);let p=new RegExp("["+Object.keys(l).map(x=>"\\"+x).join("")+"]","g");this.modern=x=>x.replace(p,u=>l[u]),this.tables=new Map(at(Ye(f,t.volumes[s]),f.objects).map(x=>[x.address,x.objects])),this.items=[],this.pen={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10},this.window={color:0,bottom:116},this.shapes=[],this.spaceBar=null,this.layer=this.el("g"),e.append(this.layer),this.textScreen=this.el("g",{display:"none"}),e.append(this.textScreen),this.prompt=this.el("g"),e.append(this.prompt),this.textPen=We(),this.textCells=ve(),this.rect(0,0,140,192,15,this.layer)}el(e,t={},s){let i=document.createElementNS(Cr,e);for(let[o,c]of Object.entries(t))i.setAttribute(o,c);return s?.append(i),i}rect(e,t,s,i,o,c=this.layer){return this.el("rect",{x:Y(e),y:_(t),width:Y(s),height:_(i),fill:ae(o),"shape-rendering":"crispEdges"},c)}add(e,t,s,{covers:i=!0,left:o=0,right:c=139}={}){return i&&(this.items=this.items.filter(f=>f.top>=e&&f.bottom<=t&&f.left>=o&&f.right<=c?(f.el.remove(),!1):!0)),this.items.push({top:e,bottom:t,left:o,right:c,el:s}),this.layer.append(s),s}remove(e){e.remove(),this.items=this.items.filter(t=>t.el!==e)}fill(e,t,s,i=!0){let o=this.el("g");this.rect(0,e,140,t-e+1,s,o),i&&(this.rect(0,e,1,t-e+1,15,o),this.rect(139,e,1,t-e+1,15,o)),this.add(e,t,o)}whiteLines(e){this.add(e,e+1,this.rect(0,e,140,2,15,null))}snapshot(e){let t=this.engine.mem;return e.layout=t[this.vars.layout],e.difficulty=t[this.vars.difficulty],e.step==="text"&&(e.words=Oe(e.words,t)),e.step==="span"&&(e.row=t[this.vars.zero+2]),e}apply(e){this.difficulty=e.difficulty,this.spaceBar?.erase&&!this.waiting()&&(this.fill(this.spaceBar.y,this.spaceBar.y+10,5),this.spaceBar.el.remove(),this.spaceBar=null);let t=this.extra[e.step]??(typeof this[e.step]=="function"?this[e.step]:void 0);t&&t.call(this,e)}waiting(){return this.engine.waitingOn}"text-screen"(){this.textCells=ve(),this.textScreen.replaceChildren(),this.rect(0,0,140,192,0,this.textScreen),this.textScreen.setAttribute("display","inline"),this.layer.setAttribute("display","none")}show(){this.textScreen.setAttribute("display","none"),this.layer.setAttribute("display","inline")}textCell(e,t,s,i){this.textCells[e][t].el?.remove();let c=this.el("g",{"data-cell":e*40+t},this.textScreen),f=t*14,l=e*16,p=i?"#000":"#fff";if(i&&this.el("rect",{x:f,y:l,width:14,height:16,fill:"#fff","shape-rendering":"crispEdges"},c),this.oldStyle){let x=Vt[s.charCodeAt(0)-32]??Vt[0],u="";for(let k=0;k<5;k++)for(let w=0;w<7;w++)x[k]>>w&1&&(u+=`M${f+2+k*2} ${l+w*2}h2v2h-2z`);u&&this.el("path",{d:u,fill:p},c)}else if(s!==" "){let x=this.el("text",{x:f+7,y:l+12,fill:p,"font-family":Or,"font-size":15,"text-anchor":"middle"},c);x.textContent=s}this.textCells[e][t]={ch:s,inverse:i,el:c}}splash(){let e=this.disk.TITLE;if(!e)return;let t=Uint8Array.from(atob(e.data),o=>o.charCodeAt(0)),s=xt(t.subarray(0,8192),t.subarray(8192)),i=[];for(let o=0;o<192;o++)i.push(Array.from(s.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 e of this.items)e.el.remove();this.items=[]}"keep-screen"(){this.kept={items:this.items,pen:{...this.pen},window:{...this.window},shapes:this.shapes,spaceBar:this.spaceBar};for(let e of this.items)e.el.remove();this.items=[],this.spaceBar=null,this["clear-screen"]()}"put-screen"(){if(!this.kept)return;this.clear();let e=this.kept;this.kept=null;for(let t of e.items)this.layer.append(t.el);Object.assign(this,{items:e.items,pen:e.pen,window:e.window,shapes:e.shapes,spaceBar:e.spaceBar})}box({a:e,x:t,y:s,layout:i}){let[o,c,f]=be[i]??be[50];if(e!==128&&t!==128&&s!==128){for(let l of this.items)l.el.remove();this.items=[]}if(e!==128){let l=this.el("g");this.rect(1,1,138,o-1,e,l),this.el("rect",{x:Y(1)+2,y:_(1)+1,width:Y(138)-4,height:_(o-2)-2,fill:"none",stroke:"black","stroke-width":4},l),this.add(1,o-1,l,{left:1,right:138}),this.window={color:e,bottom:o},this.shapes=[]}t!==128&&(this.whiteLines(c),this.fill(c+2,f-1,t)),s!==128&&(this.whiteLines(f),this.fill(f+2,189,s))}panel({n:[e]}){let t=Ke[e];if(t){this.whiteLines(t.rows[0]),this.fill(t.rows[0]+2,t.rows[1],t.fill);for(let s of t.more??[])this.whiteLines(s);Object.assign(this.pen,{paper:t.paper,ink:t.ink,centre:!0,spacing:1,gap:t.gap,y:t.y})}}scroll(){let o=this.scrolling,c=(x,u,k)=>{let w="scroll-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:Y(x),y:_(19)-1,width:Y(u-x),height:_(97)+1},this.el("clipPath",{id:w},this.svg)),this.el("g",{"clip-path":`url(#${w})`},k)},f=(x,u)=>this.items.filter(k=>k!==o?.item&&k.top<=115&&k.bottom>=19&&k.left<=u&&k.right>=x);if(o?.item.el.isConnected&&this.items.at(-1)===o.item){let x=c(129.5,136.5,this.el("g",{transform:`translate(${Y(7*o.n)} 0)`},o.moved));for(let u of f(129.5,129.5+7))x.append(u.el.cloneNode(!0));o.n++,o.moved.setAttribute("transform",`translate(${Y(-7*o.n)} 0)`);return}let l=c(3.5,129.5),p=this.el("g",{transform:`translate(${Y(-7)} 0)`},l);this.rect(3.5,19,1120,97,this.window.color,p);for(let x of f(3.5,139))p.append(x.el.cloneNode(!0));this.add(19,115,l,{left:4,right:129}),this.scrolling={item:this.items.at(-1),moved:p,n:1}}"shift-down"({left:e,right:t,top:s,bottom:i,by:o}){let c=this.shifting,f=(u,k,w)=>{let O="shift-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:Y(e),y:_(u),width:Y(t-e+1),height:_(k-u)},this.el("clipPath",{id:O},this.svg)),this.el("g",{"clip-path":`url(#${O})`},w)},l=(u,k)=>this.items.filter(w=>w!==c?.item&&w.top<=k&&w.bottom>=u&&w.left<=t&&w.right>=e);if(c?.item.el.isConnected&&this.items.at(-1)===c.item){let u=f(s,s+o,this.el("g",{transform:`translate(0 ${_(-o*c.n)})`},c.moved));for(let k of l(s,s+o-1))u.append(k.el.cloneNode(!0));c.n++,c.moved.setAttribute("transform",`translate(0 ${_(o*c.n)})`);return}let p=f(s+o,i+o+1),x=this.el("g",{transform:`translate(0 ${_(o)})`},p);this.rect(e,s-o*60,t-e+1,i-s+1+o*61,this.window.color,x);for(let u of l(s,i))x.append(u.el.cloneNode(!0));this.add(s+o,i+o,p,{left:e,right:t}),this.shifting={item:this.items.at(-1),moved:x,n:1}}paint(e,t,s,i){this.hide(t,s,i,i);let o=this.painted;if(o?.el.isConnected&&o.color===e&&o.left===t&&o.right===s&&o.bottom===i-1){o.bottom=i,o.el.setAttribute("height",_(i-o.top+1));let f=this.items.find(l=>l.el===o.el);this.items=this.items.filter(l=>l!==f&&l.top>=o.top&&l.bottom<=i&&l.left>=t&&l.right<=s?(l.el.remove(),!1):!0),f&&(f.bottom=i);return}let c=this.add(i,i,this.rect(t,i,s-t+1,1,e,null),{left:t,right:s});this.painted={el:c,color:e,left:t,right:s,top:i,bottom:i}}span({a:e,x:t,y:s,row:i}){this.paint(e&15,t,s,i)}dot({a:e,x:t,y:s}){this.paint(e&15,t,t,s)}"white-lines"({y:e}){this.whiteLines(e)}"fill-rows"({a:e,x:t,y:s}){this.fill(s,s+t-1,e)}picture({words:e}){let t=this.pictures.get(e.toUpperCase().replace(/_/g," "));if(!t)return;let s="window-"+this.window.bottom;this.clips??=new Set,this.clips.has(s)||(this.clips.add(s),this.el("rect",{x:0,y:0,width:Y(140),height:_(this.window.bottom)},this.el("clipPath",{id:s},this.svg)));let i=this.el("g",{"clip-path":`url(#${s})`}),o=this.el("g",{transform:"scale(4 2)"},i);o.innerHTML=kt(t,{crisp:!1}),this.add(1,this.window.bottom-1,i,{covers:!1,left:1,right:138}),this.shapes=this.shapes.concat(t),this.picturesShapes=t}objects({table:e}){this.table=parseInt(e.slice(1),16)}object({a:e,x:t,y:s},i="whole"){let o=i==="keep",c=i==="whole",f=this.tables.get(this.table);if(e<2){this.kept?.isConnected&&this.remove(this.kept),this.kept=null;return}let l=f?.find(w=>w.number===e);if(!l)return;let p=l.rows.map(w=>w.map(O=>!c&&O===l.clear?void 0:O)),x=t+l.width-1,u=s+l.height-1;c&&this.hide(t,x,s,u);let k=this.el("image",{href:this.image(p),x:Y(t),y:_(s),width:Y(l.width),height:_(l.height),preserveAspectRatio:"none",style:"image-rendering: pixelated"});this.add(s,u,k,{covers:c,left:t,right:x}),o&&(this.kept=k),c&&(this.items.at(-1).whole={x:t,y:s,rows:p})}hide(e,t,s,i){for(let o of[...this.items]){let c=o.whole;if(!c||c.x>t||c.x+c.rows[0].length-1<e||c.y>i||c.y+c.rows.length-1<s)continue;let f=!1,l=c.rows.map((p,x)=>p.map((u,k)=>{let w=c.x+k,O=c.y+x;if(u!==void 0&&w>=e&&w<=t&&O>=s&&O<=i){f=!0;return}return u}));if(f){if(l.every(p=>p.every(x=>x===void 0))){this.remove(o.el);continue}o.el.setAttribute("href",this.image(l)),c.rows=l}}}image(e){let t=document.createElement("canvas");t.width=e[0].length,t.height=e.length;let s=t.getContext("2d"),i=s.createImageData(t.width,t.height);return e.forEach((o,c)=>o.forEach((f,l)=>{if(f===void 0)return;let[p,x,u]=In[f];i.data.set([p,x,u,255],(c*t.width+l)*4)})),s.putImageData(i,0,0),t.toDataURL()}"object-keep"(e){this.object(e,"keep")}"object-mode"(e){this.object(e,"clear")}"key-at"({a:e,x:t,y:s}){this.pen.x=t,this.pen.y=s,this.key({a:e})}key({a:e}){let t=re(e);this.cap(e,this.pen.x,this.pen.y,this.layer,!0,void 0,Math.max(4,t)+4),this.pen.x+=1+(t<4?4-t:0)+1+t+3}cap(e,t,s,i,o,c,f){let l={"\r":"RETURN","\x7F":"DELETE"}[e]??e,p=f??(l.length>1?32:7),x=this.el("g",c!==void 0?{class:"key","data-key":c}:{});if(this.el("rect",{x:Y(t),y:_(s-2),width:Y(p),height:_(11),rx:3,fill:ae(1),stroke:ae(13),"stroke-width":3},x),this.oldStyle){let u=0;for(let k of l)u+=re(k)+1;this.glyphs(x,l,t+Math.max(1,Math.round((p-u+1)/2)),s,15)}else{let u=this.el("text",{x:Y(t+p/2),y:_(s+7),fill:ae(15),"font-family":ft,"font-size":l.length>1?13:16,"font-weight":600,"text-anchor":"middle"},x);u.textContent=this.modern(l)}return o?(this.add(s-2,s+8,x,{covers:!1,left:t,right:t+p}),this.items.at(-1).cap=!0):i.append(x),x}text({words:e}){if(this.textScreen.getAttribute("display")!=="none"){for(let t of Fe(e,this.textPen))this.textCells[t.row]?.[t.col]&&this.textCell(t.row,t.col,t.ch,t.inverse);return}for(let t of qe(e,this.pen)){let{top:s,tall:i}=t,o=i?32:19,c=t.chars.filter(k=>k.ch.charCodeAt(0)>=32);if(c.length){let k=Math.min(...c.map(T=>T.x)),w=Math.max(...c.map(T=>T.x+re(T.ch)))-1,O=Math.min(9,t.height??9)*(i?2:1);this.add(s,s+O-1,this.rect(k,s,w-k+1,O,t.paper,null),{left:k,right:w})}let f=this.el("g",{"font-family":ft,"font-size":o,"font-weight":i?700:500}),l=null,p=139,x=0,u=()=>{if(!l)return;if(p=Math.min(p,l.x),x=Math.max(x,l.x+l.width),this.oldStyle){this.glyphs(f,l.chars,l.x,s,t.ink,i,t.paper),l=null;return}let k=this.el("text",{y:_(s+(i?15:7)),"data-x":Y(l.x),"data-width":Y(l.width)},f);for(let w of l.chars){let O=this.el("tspan",{fill:ae(w.ink??t.ink)},k);O.textContent=this.modern(w.ch)}l=null};for(let k of t.chars){if(k.ch.charCodeAt(0)<=32){u();continue}l??={x:k.x,width:0,chars:[]},l.chars.push(k),l.width=k.x+re(k.ch)-l.x}u(),f.childNodes.length&&(this.add(s,s+(i?16:8),f,{covers:!1,left:p,right:x}),this.fit(f))}}fit(e){for(let t of e.querySelectorAll("text[data-width]")){let s=t.getComputedTextLength();s>0&&t.setAttribute("transform",`translate(${t.dataset.x} 0) scale(${t.dataset.width/s} 1)`)}}glyphs(e,t,s,i,o,c=!1,f){let l=typeof t=="string"?[...t].map(u=>({ch:u})):t,p=c?2:1,x=new Map;for(let u of l){let k=re(u.ch),w=u.ink??o;f!==void 0&&this.rect(s,i,k,9*p,f,e);let O=x.get(w)??"";for(let[T,a]of ot(u.ch))O+=`M${Y(s+T)} ${_(i+a*p)}h4v${2*p}h-4z`;x.set(w,O),s+=k+1}for(let[u,k]of x)k&&this.el("path",{d:k,fill:ae(u)},e);return s}write(e,t,s,i,o=15){if(this.oldStyle)return this.glyphs(e,t,s,i,o);let c=this.el("g",{"font-family":ft,"font-size":19,"font-weight":500,fill:ae(o)},e);for(let f of t.split(" ")){if(f){let l=0;for(let x of f)l+=re(x)+1;let p=this.el("text",{y:_(i+7),"data-x":Y(s),"data-width":Y(l-1)},c);p.textContent=this.modern(f),s+=l}s+=re(" ")+1}return this.fit(c),s}line({x0:e,x1:t,y0:s,y1:i,color:o}){this.add(Math.min(s,i),Math.max(s,i),this.el("line",{x1:Y(e+.5),y1:_(s+.5),x2:Y(t+.5),y2:_(i+.5),stroke:ae(o),"stroke-width":3,"stroke-linecap":"round"}),{covers:!1,left:Math.min(e,t),right:Math.max(e,t)})}rectangle({a:e,x:t,y:s,width:i,height:o}){this.solid(e,t,s,i+1,o)}"rectangle-outline"({a:e,x:t,y:s,width:i,height:o}){let c=i+1,f=o+1;this.add(s,s+f-1,this.el("rect",{x:Y(t)+2,y:_(s)+1,width:Y(c)-4,height:_(f)-2,fill:"none",stroke:ae(e),"stroke-width":3}),{covers:!1,left:t,right:t+c-1})}solid(e,t,s,i,o){this.add(s,s+o-1,this.rect(t,s,i,o,e,null),{left:t,right:t+i-1})}prompts(){this.prompt.replaceChildren();let e=this.engine,t=e.waitingOn;if(!t)return;let s=t.words?.[0]??t.name;if(s==="wait"||s==="wait-erase"||s==="wait-or-escape"){let i=(e.mem[this.vars.layout]&15)===1?178:170,o=this.el("g",{class:"key","data-key":32},this.prompt);if(this.el("rect",{x:Y(46),y:_(i),width:Y(47),height:_(11),rx:4,fill:ae(1),stroke:ae(13),"stroke-width":3},o),this.oldStyle)this.glyphs(o,"SPACE BAR",48,i+2,15);else{let c=this.el("text",{x:Y(69.5),y:_(i+8),fill:ae(15),"font-family":ft,"font-size":15,"font-weight":600,"text-anchor":"middle"},o);c.textContent="SPACE BAR"}this.spaceBar={y:i,erase:s==="wait-erase",el:o}}else if(s==="ask"||s==="ask-mode"||s==="ask-escape"){this.rect(1,162,138,28,5,this.prompt);let i=e.askMode,o=[];if(i===128)_t.forEach((f,l)=>o.push([f,[8,21,10,11][l]]));else if(i>=177&&i<186)for(let f=49;f<=(i&127);f++)o.push([String.fromCharCode(f),f]);else for(let f=65;f<=(i&95);f++)o.push([String.fromCharCode(f),f]);let c=(f,l,p)=>this.write(this.prompt,f,l,p);if(e.asked===null)c("Press",4,166),o.forEach(([f,l],p)=>{p===o.length-1&&i!==128&&o.length>1&&c("or",31+10*p,166),this.cap(f,31+10*p+(p===o.length-1&&i!==128&&o.length>1?10:0),166,this.prompt,!1,l)}),i===128&&[[58,62],[74,62],[66,71],[66,53]].forEach(([f,l],p)=>this.cap(_t[p],f,l,this.prompt,!1,o[p][1]));else{let[f]=o[e.asked.place];this.cap(f,31+10*e.asked.place,166,this.prompt,!1),c("Press",4,179),this.cap("\r",31,179,this.prompt,!1,13),c("or",67,179),this.cap("\x7F",78,179,this.prompt,!1,127),i===128&&this.cap(_t[e.asked.place],[58,74,66,66][e.asked.place],[62,62,71,53][e.asked.place],this.prompt,!1)}}}};async function Jt(n){let{title:e,scripts:t,disk:s,root:i,stage:o,status:c,fail:f,kept:l,words:p,fixed:x}=n;i.classList.add("game"),o.innerHTML=`<svg id="screen" preserveAspectRatio="xMidYMid meet" tabindex="0" aria-label="The game's screen"></svg>`,c.insertAdjacentHTML("afterend",`${Re}<label><input type="checkbox" id="sound"> Sound</label><label><input type="checkbox" id="old-style"> Old style text</label><label hidden><input type="checkbox" id="printer" checked> Printer</label><label hidden title="The game with its bugs fixed: it starts again"><input type="checkbox" id="fixed"> Bugs fixed</label><label hidden>Mini view <select id="mini"><option value="">Off</option><option value="live">Live</option><option value="pictures">Pictures</option></select></label>`),i.append(Ae(p.printer));let u=O=>i.querySelector("#"+O),k=u("screen"),w=u("sound");Te(i,o);try{let O=u("fixed");O&&e.fixed&&(O.checked=x,O.parentElement.hidden=!1,O.addEventListener("change",()=>{let y=new URL(location.href);O.checked?y.searchParams.set("fixed",""):y.searchParams.delete("fixed"),location.href=y.href.replace("fixed=&","fixed&").replace(/fixed=$/,"fixed")}));let T=e.viewSteps??{},a=s.kind==="c64"?n.roms?.chargen??Rn().chargen:null;if(s.kind==="c64"){let y=u("printer"),L=u("paper"),P=u("paper-box");try{y.checked=localStorage.getItem("remake-printer")!=="0"}catch{}y.parentElement.hidden=!1;let N=e.printer=new Me({on:y.checked});y.addEventListener("change",()=>{N.on=y.checked;try{localStorage.setItem("remake-printer",y.checked?"1":"0")}catch{}}),N.changed=()=>{P.hidden=!N.lines.length,N.lines.length&&bt(L,N,a)},u("tear").addEventListener("click",()=>N.tear()),u("print-paper").addEventListener("click",()=>window.print())}e.disk=ut(s,l),s.kind==="c64"&&jt(e.drive=new nt(Uint8Array.from(atob(s.image),y=>y.charCodeAt(0))),l);let h=Yt(e,t);e.files&&pt(s,e.files,l);let g=[],E=u("old-style"),$=[],C={get(){try{return localStorage.getItem("remake-old-style")==="1"}catch{return!1}},set(y){try{localStorage.setItem("remake-old-style",y?"1":"0")}catch{}}};E.checked=C.get()||new URLSearchParams(location.search).has("old-style");let R=null,M=()=>{k.replaceChildren();let y=s.kind==="c64"?new Pe(k,{engine:h,chargen:a}):e.engine==="card"?new Ne(k,{engine:h,inset:n.mini?e.inset:null}):new Ve(k,{disk:s,volume:Object.keys(s.volumes)[0],engine:h,extra:T});return y.oldStyle=E.checked,R?.(y),y},S=M();h.on(y=>g.push(S.snapshot({...y})));let A=u("mini");if(e.inset&&n.mini){A.parentElement.hidden=!1;try{A.value=localStorage.getItem("remake-mini")??""}catch{}let{top:y,bottom:L,view:[P,N]}=e.inset,z=document.createElement("div");z.className="mini",z.hidden=!0,Object.assign(z.style,{left:`${P/5.6}%`,top:`${y/3.84}%`,width:`${(N-P)/5.6}%`,height:`${(L-y+1)/3.84}%`}),k.parentElement.append(z);let V=await n.mini(z,{memory:()=>h.mem});R=W=>{W.insetOn=!!A.value;let ge=W.prompts.bind(W);W.prompts=()=>{ge(),z.hidden=!(A.value&&W.banded)}},R(S);let ee=()=>{S.insetOn=!!A.value,V.mode(A.value),S.prompts()};A.addEventListener("change",()=>{try{localStorage.setItem("remake-mini",A.value)}catch{}ee()}),ee()}E.addEventListener("change",()=>{C.set(E.checked),S=M();for(let y of $)S.apply(y);S.prompts()});let j=h.timed?new we:null;j&&(w.checked=!0);let H=()=>{s.kind!=="c64"&&j?.feed(w.checked?h.clicks:[],h.cycles),h.clicks.length=0},I=e.map?.vars??{sound:0,soundOn:0},K=null,J=(y,L,P)=>{if(!(h.mem[I.sound]&I.soundOn))return;K??=new AudioContext;let N=K.createOscillator(),z=K.createGain(),V=K.currentTime;N.type="square",N.frequency.setValueAtTime(y,V),N.frequency.linearRampToValueAtTime(L,V+P/1e3),z.gain.setValueAtTime(.06,V),z.gain.linearRampToValueAtTime(0,V+P/1e3),N.connect(z).connect(K.destination),N.start(V),N.stop(V+P/1e3)},B=y=>16e3/(y+8);w.addEventListener("change",()=>{j||(h.mem[I.sound]=w.checked?I.soundOn:0)});let q={sound:220,beep:60,"flash-box":60,flash:250,object:30,"object-keep":30},F=()=>n.pace??1,D=!1,X=y=>new Promise(L=>setTimeout(L,y));async function Z(){if(!D){D=!0;try{for(;;){let y=h.run();if(H(),y==="pace"){for(let L of g.splice(0))$.push(L),S.apply(L);S.prompts(),!de&&F()&&await X(h.delay*F()),h.delay=0;continue}for(h.delay=0;g.length;){let L=g.shift();if($.push(L),S.apply(L),!de){if(L.step==="sound"){let[P,N]=L.words.split(" ").map(z=>parseInt(z,16));J(B(N),B(P),180)}L.step==="beep"&&J(B(L.a&31)*2,B(L.a&31)*2,50),F()&&(q[L.step]&&await X(q[L.step]*F()),L.step==="pause"&&await X(L.ms*F()))}}if(S.prompts(),c.textContent=y==="end"?"The end.":"Waiting for a key.",!h.keys.length||y==="end")break}}catch(y){f(y)}D=!1}}let he=s.kind==="c64"?{ArrowLeft:157,ArrowRight:29,ArrowDown:17,ArrowUp:145,Enter:13,Backspace:20,Delete:20,Escape:3," ":32}:{ArrowLeft:8,ArrowRight:21,ArrowDown:10,ArrowUp:11,Enter:13,Backspace:127,Delete:127,Escape:27," ":32},de=!1,r=y=>{h.press(y),K?.resume(),j?.start(),s.kind!=="c64"&&Z()};n.watch?.({engine:h,press:r,quick:y=>{de=y}});let d=()=>h.waitingOn?.words?.[0]==="tick",m=null,v=null;if(setInterval(()=>{if(!d()||D||h.keys.length)return;let y=v??m??-1;v=null,r(y)},100),window.addEventListener("keydown",y=>{if(y.metaKey||y.altKey)return;let L=y.ctrlKey?/^[a-z]$/i.test(y.key)?y.key.toUpperCase().charCodeAt(0)&31:void 0:he[y.key]??(y.key.length===1?(s.kind==="c64"?y.key.toUpperCase():y.key).charCodeAt(0):void 0);if(L===void 0)return;if(y.preventDefault(),d()){v=m=L;return}let P=s.kind==="c64"&&!y.ctrlKey&&Ys(L);if(P){y.repeat||(h.clock.held={...P,key:y.key},K?.resume(),j?.start());return}!y.repeat&&!n.claim?.(L)&&r(L)}),window.addEventListener("keyup",y=>{m=null;let L=h.clock?.held;L?.key===y.key&&(L.seen?h.clock.held=null:L.up=!0)}),k.addEventListener("click",y=>{let L=y.target.closest(".key")?.dataset.key;L&&r(+L)}),k.focus(),s.kind==="c64"){if(n.route){let{route:z,name:V,keys:{expand:ee,give:W,petscii:ge,pollsAt:_e}}=n.route;e.seed=z.seed,z.printer&&e.printer&&(e.printer.on=!0,u("printer").checked=!0),c.textContent="Playing the route "+V+".";let ke={press:pe=>h.press(pe),also:pe=>{let Se=h.mem,Xt=Dn=>{Se[198]<10&&(Se[631+Se[198]]=Dn,Se[198]++)};h.keys.length&&Xt(h.keys.shift()),Xt(pe)}},Le=()=>{let pe;do h.delay=0,pe=h.run();while(pe==="pace");g.length=0};Le();for(let[pe,[Se]]of ee(z.keys).entries())W(ke,Se,ge),h.polls=_e(z,pe+1)??void 0,Le();h.polls=void 0,S.prompts()}h.sid=[],h.clock={irq:0,ahead:[],since:0};let y=null,L=null,P=0,N=!1;c.textContent="Playing.",setInterval(()=>{if(h.delay-=1e3/60,!N&&!h.ended&&h.delay<16){h.delay=Math.max(0,h.delay),h.clock.ahead.length&&h.idle>(h.routines.polls??200)&&!h.keys.length&&++h.clock.since>120&&(h.press(h.clock.ahead.shift()),h.clock.since=0);try{h.run(),g.length=0,S.prompts()}catch(z){N=!0,f(z)}h.ended&&(c.textContent="The end.")}if(j?.node&&w.checked){y??=new St(j.rate),L??=performance.now();let z=Math.floor((performance.now()-L)/1e3*j.rate)-P;if(z>0){let V=y.render(z,h.sid.map(([,ee,W])=>[0,ee,W]));P+=z,j.node.port.postMessage(V,[V.buffer])}}h.sid.length=0},1e3/60)}let b=new URLSearchParams(location.search).get("keys");if(b)for(let y of b.split(",")){let L={space:32,return:13,escape:27,delete:127,left:8,right:21,down:10,up:11,"control-e":5,"control-t":20,none:-1}[y]??y.charCodeAt(0);s.kind==="c64"?h.clock.ahead.push({8:157,21:29,10:17,11:145,127:20,27:3}[L]??L):h.press(L)}s.kind!=="c64"&&Z()}catch(O){f(O)}}async function Ar(n){let{title:e,data:t,root:s,disk:i,preview:o=!1,words:c}=n;s.classList.add("remake"),s.innerHTML='<div class="stage"></div><p class="options"><span id="status">Loading.</span></p>';let f=s.querySelector(".stage"),l=s.querySelector(".options"),p=s.querySelector("#status"),x=u=>{p.textContent="The remake stopped: "+u.message,p.className="error",console.error(u)};try{let u=new URLSearchParams(location.search).has("fixed"),{title:k,scripts:w,disk:O}=await Ht(e,{data:t,fixed:u});if(k.disk=O,k.style&&!document.querySelector(`link[data-title="${k.slug}"]`)){let a=Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL(k.style,e).href});a.dataset.title=k.slug,document.head.append(a),await new Promise(h=>{a.onload=a.onerror=h})}let T={...n,title:k,scripts:w,disk:O,folder:e,data:t,stage:f,options:l,status:p,fail:x,kept:i,preview:o,words:c,fixed:u};await(k.own??{play:Jt}).play(T)}catch(u){x(u)}}export{Gt as audio,js as diskDialogs,Ts as diskDisk,Ls as diskLocal,As as diskMemory,Ss as modal,ws as original,Zt as parts,Is as remakeC64View,nn as remakeCard,Ms as remakeCardView,Us as remakeCards,an as remakeCompile,un as remakeEngine,Ds as remakeEvents,kn as remakeLayout,tn as remakeLift,Tn as remakeLoad,Nn as remakeMain,wn as remakeProblems,En as remakeRaster,Pn as remakeScenes,rn as remakeScript,On as remakeVector,Mn as remakeView};
33
33
  //# sourceMappingURL=moonbase-player.js.map