@moonbase-machines/player 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,11 @@
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.10.0: MIT, (c) 2026 Mark Wharton (its LICENSE) */
2
+ var ki=Object.defineProperty;var U=(s,e,t)=>()=>{if(t)throw t[0];try{return s&&(e=s(s=0)),e}catch(n){throw t=[n],n}};var F=(s,e)=>{for(var t in e)ki(s,t,{get:e[t],enumerable:!0})};var gs={};F(gs,{branchTaken:()=>$e,operand:()=>Q,parse:()=>Ee,words:()=>We});function Ee(s,e="script"){let t=[],n={},r=[];return s.split(`
3
+ `).forEach((o,c)=>{let f=o.replace(/^\s+|\s+$/g,"");if(!f||f.startsWith(";"))return;let l=e+":"+(c+1),d;if(d=/^(L[0-9A-F]{4}|[A-Za-z_][\w-]*):$/.exec(f)){n[d[1]]=t.length;return}if(d=/^data \$([0-9A-F]+)((?: [0-9A-F]{2})+)$/i.exec(f)){r.push({at:parseInt(d[1],16),bytes:d[2].trim().split(" ").map(w=>parseInt(w,16))});return}d=/^([0-9A-F]{4})\s+(.*)$/.exec(f);let g=d?parseInt(d[1],16):null,k=d?d[2]:f;t.push({at:g,words:We(k),text:k,where:l,index:t.length})}),{steps:t,labels:n,data:r}}function Q(s){if(typeof s!="string")return{string:s.string};if(/^-?\d+$/.test(s))return{number:+s};if(/^[axy]$/.test(s)||s==="carry"||s==="borrow")return{reg:s};let e;if(e=/^\$([0-9A-F]+)(?:\[([xy])\])?$/i.exec(s))return{at:parseInt(e[1],16),index:e[2],zp:e[1].length<=2};if(e=/^\(\$([0-9A-F]{2})\)\[y\]$/i.exec(s))return{through:parseInt(e[1],16)};if(e=/^\(\$([0-9A-F]{2})\[x\]\)$/i.exec(s))return{pair:parseInt(e[1],16)};if(e=/^\[\$([0-9A-F]{4})\](?:\[([xy])\])?$/i.exec(s))return{via:parseInt(e[1],16),index:e[2]};throw new Error("not an operand: "+s)}function $e(s){if(s.at===null)return 1;let e=s.words,t=parseInt(e.at(-1).slice(1),16),n=s.at+(e.length===6?yi(e[3]):0)+2&65535;return/^L[0-9A-F]{4}$/.test(e.at(-1))&&(t&65280)!==(n&65280)?2:1}var wi,We,yi,He=U(()=>{wi=/"(?:[^"\\]|\\.)*"|\S+/g;We=s=>s.match(wi).map(e=>e.startsWith('"')?{string:JSON.parse(e)}:e);yi=s=>/^\d+$/.test(s)||/^\$[0-9A-F]{2}(\[[xy]\])?$/i.test(s)||/^\(\$/.test(s)?2:3});import{cpu as bi}from"@moonbase-machines/mos6502";var uo,pt,ks=U(()=>{({CPU:uo,CYCLES:pt}=bi)});var $s={};F($s,{Engine:()=>Ce,label16:()=>je});function vs(s){if(s===32)return 3;if(s===0||s===64||s===96)return 1;let e=s>>2&7,t=s&3;return t===1?e===3||e===6||e===7?3:2:e===0?t===2||(s&224)>=160?2:1:e===2||e===6?t===0||t===2?1:2:e===4?2:e===3||e===7?3:2}var ws,vi,ys,bs,Si,Ss,Es,je,Ce,ut=U(()=>{He();ks();ws={left:!0},vi=new Set(["if","goto","call","return","compare","test","asm","push","pull"]),ys=s=>vi.has(s.words[0])||/^(=|\+=|-=|&=|\|=|\^=|<<=|>>=|rotate)$/.test(s.words[1]),bs=1020.484;Si=new Set([234,169,162,160,165,166,164,173,174,172,24,56]),Ss=s=>s.words[0]==="if"&&s.words.length===6,Es=s=>s?.at==null?void 0:s.at+2&65535,je=s=>"L"+s.toString(16).toUpperCase().padStart(4,"0"),Ce=class{constructor({routines:e,scripts:t,start:n,label:r,memory:o={}}){this.routines=e,this.sources=t,this.mem=new Uint8Array(65536);for(let[c,f]of Object.entries(o))this.mem[c]=f;this.a=0,this.x=0,this.y=0,this.n=0,this.z=0,this.c=0,this.v=0,this.d=0,this.stack=[],this.keys=[],this.listeners=[],this.takers=[],this.ended=!1,this.timed=!!e.timed,this.cycles=0,this.clicks=[],this.delay=0,this.programs={},e.setup?.(this),this.enter(n,r,!0)}on(e){this.listeners.push(e)}emit(e){this.inside&&(e.inside=!0);for(let t of this.listeners)t(e)}inside=0;press(e){this.keys.push(e)}key(){let e=this.keys.shift();if(e!==void 0)for(let t of this.takers)t(e);return e}onKey(e){return this.takers.push(e),()=>{this.takers=this.takers.filter(t=>t!==e)}}enter(e,t,n=!1){let r=this.script(e);if(n)for(let o of r.data)this.mem.set(o.bytes,o.at);this.program=r,this.name=e,this.pc=t===void 0?0:this.label(t)}script(e){if(this.programs[e])return this.programs[e];let t=this.sources[e];if(t===void 0)throw new Error("no script "+e);let n=this.programs[e]=typeof t=="string"?Ee(t,e):{labels:t.labels,data:t.data.map(([r,o])=>({at:r,bytes:o})),steps:t.steps.map(([r,o,c],f)=>({at:r,text:c,where:e+":"+o,run:t.run[f],words:We(c),index:f}))};for(let[r,o]of Object.entries(n.labels)){let c=/^L[0-9A-F]{4}$/.test(r)?parseInt(r.slice(1),16):null;c!==null&&n.steps[o]?.at>c&&(n.steps[o].start=c),c!==null&&n.steps[o]?.at===c&&(n.steps[o].entered=!0)}return n}callInside(e,t,n,r){this.stack.push({name:this.name,pc:this.pc,inside:!0,done:n,ret:r}),this.inside++,this.enter(e,t)}leave(e,t){throw this.stack=[],this.problem=null,this.waitingOn=null,this.visited=null,this.enter(e,t),ws}visit(e){this.visiting=e}startVisit(e){let[t,n]=this.title.visit[this.visiting];this.visiting=void 0,this.visited||(this.visited={name:this.name,pc:e,stack:this.stack,problem:this.problem,waitingOn:this.waitingOn,asked:this.asked,askMode:this.askMode,regs:[this.a,this.x,this.y,this.n,this.z,this.c,this.v]},this.title.raster?.keepScreen(),this.inside++,this.emit({step:"keep-screen"}),this.inside--,this.routines.show(this,[],null)),this.stack=[{visit:!0}],this.problem=null,this.waitingOn=null,this.asked=null,this.a=2,this.c=0,this.enter(t,n)}endVisit(){let e=this.visited;this.visited=null,this.title.raster?.putScreen(),this.inside++,this.emit({step:"put-screen"}),this.inside--,this.routines.show(this,[],null),this.enter(e.name),Object.assign(this,{pc:e.pc,stack:e.stack,problem:e.problem,waitingOn:e.waitingOn,asked:e.asked,askMode:e.askMode}),[this.a,this.x,this.y,this.n,this.z,this.c,this.v]=e.regs}label(e){let t=this.program.labels[e];if(t===void 0)throw new Error(this.name+": no label "+e);return t}place(e){if(e.through!==void 0)return(this.mem[e.through]|this.mem[e.through+1]<<8)+this.y&65535;if(e.pair!==void 0){let t=e.pair+this.x&255;return this.mem[t]|this.mem[t+1&255]<<8}return e.via!==void 0?(this.mem[e.via]|this.mem[e.via+1]<<8)+(e.index?this[e.index]:0)&65535:e.at+(e.index?this[e.index]:0)&65535}read(e){return this.io&&this.ioAt(e)?this.io(e)&255:this.mem[e]}write(e,t){this.io&&this.ioAt(e)?this.io(e,t&255):this.mem[e]=t}ioAt(e){return(e&65280)===49152}get(e){return e.number!==void 0?e.number&255:e.reg==="carry"?this.c:e.reg?this[e.reg]:this.read(this.place(e))}load(e){return this.timed&&(e.index&&!e.zp||e.through!==void 0)&&((e.through!==void 0?this.mem[e.through]|this.mem[e.through+1]<<8:e.via!==void 0?this.mem[e.via]|this.mem[e.via+1]<<8:e.at)&255)+this[e.index??"y"]>255&&this.cycles++,this.get(e)}ix(e,t){return this.timed&&(e&255)+t>255&&this.cycles++,e+t&65535}set(e,t){if(t&=255,e.reg){this[e.reg]=t;return}this.write(this.place(e),t)}flags(e){return this.n=e>>7&1,this.z=e===0?1:0,e}compare(e,t){let n=e-t&511;this.c=e>=t?1:0,this.flags(n&255)}time(e,t,n){if(!this.timed)return;let r=e[t].cycles;if(r===void 0){r=0;for(let o=t;o<=n;o++)r+=this.cost(e,o);e[t].cycles=r}this.cycles+=r,this.delay+=r/bs}cost(e,t){let n=e[t],r=this.mem;if(n.at===null)return 0;let o=pt[r[n.at]]+(Ss(n)?2:0),c=!n.entered&&!["return","goto"].includes(e[t-1]?.words[0])?e[t-1]:null;if(n.start!==void 0||c&&c.at!==null){let f=n.start??c.at+vs(r[c.at])+(Ss(c)?2:0)+(this.routines.inline?.(this,c)??0);if(f<n.at&&n.at-f<=9){let l=0,d=f;for(;d<n.at&&Si.has(r[d]);d+=vs(r[d]))l+=pt[r[d]];d===n.at&&(o+=l)}}return o}add(e){if(this.d){let r=(this.a&15)+(e&15)+this.c,o=(this.a>>4)+(e>>4);r>9&&(r-=10,o++),this.z=(this.a+e+this.c&255)===0?1:0,this.n=o&8?1:0,this.v=~(this.a^e)&(this.a^o<<4)&128?1:0,o>9?(o-=10,this.c=1):this.c=0,this.a=(o<<4|r)&255;return}let t=this.a,n=t+e+this.c;this.v=~(t^e)&(t^n)&128?1:0,this.c=n>255?1:0,this.a=this.flags(n&255)}sub(e){if(!this.d)return this.add(e^255);let t=(this.a&15)-(e&15)-(1-this.c),n=(this.a>>4)-(e>>4);t<0&&(t+=10,n--);let r=this.a-e-(1-this.c);this.z=(r&255)===0?1:0,this.n=r&128?1:0,this.v=(this.a^e)&(this.a^r)&128?1:0,this.c=r>=0?1:0,n<0&&(n+=10),this.a=(n<<4|t)&255}shift(e,t,n){let r=t?(e<<1|(n?this.c:0))&255:e>>1|(n&&this.c?128:0);return this.c=t?e>>7:e&1,this.flags(r)}test(e){this.n=e>>7&1,this.v=e>>6&1,this.z=(e&this.a)===0?1:0}jump(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["goto-engine"](this,["$"+e.slice(1)],t);this.pc=this.label(e)}jumpThrough(e,t){let n=je(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[n]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+n.slice(1)],t);this.pc=this.label(n)}jumpTable(e,t){this.pc=this.label(je(this.mem[e+t]|this.mem[e+t+1]<<8))}call(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["call-engine"](this,["$"+e.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:Es(t)}),this.pc=this.label(e)}callThrough(e,t){let n=je(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[n]===void 0&&this.routines["call-engine"])return this.routines["call-engine"](this,["$"+n.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:Es(t)}),this.pc=this.label(n)}ret(e){let t=this.stack.pop();if(!t)throw new Error("return with nothing called");if(t.visit){this.endVisit();return}let n=this.pulled;if(t.a!==void 0&&this.stack.at(-1)?.a!==void 0){let r=this.stack.pop().a,o=(r<<8|t.a)+1&65535,c=je(o);if(n?.ret!==void 0&&o>n.ret&&o-n.ret<=256){this.pulled=null,n.name!==this.name&&this.enter(n.name),this.pc=n.pc,n.inside&&(this.inside--,n.done?.(this));return}if(n?.ret!==void 0&&o<=n.ret&&n.ret-o<=32&&this.script(n.name).labels[c]!==void 0){this.pulled=null,n.name!==this.name&&this.enter(n.name),this.pc=this.label(c),n.inside&&(this.again=this.again?.ret===n.ret?{...this.again,n:this.again.n+1}:{ret:n.ret,done:n.done,n:1});return}if(this.program.labels[c]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+c.slice(1)],e);this.pc=this.label(c);return}if(n&&this.stack.length<n.depth&&(this.pulled=null,n.inside&&n.ret!==void 0&&this.inside--),t.name!==this.name&&this.enter(t.name),this.pc=t.pc,t.inside&&(this.inside--,t.done?.(this)),this.again&&t.ret===this.again.ret){let r=this.again;this.again=null,this.inside-=r.n,r.done?.(this)}t.after?.(this)}push(e){this.stack.push(e?{a:this.a}:{flags:[this.n,this.z,this.c,this.v]})}pull(e){let t=this.stack.at(-1);if(t&&t.name!==void 0){let r=t.ret===void 0?0:t.half?t.ret>>8:t.ret&255;t.half?(this.stack.pop(),t.depth=this.stack.length,this.pulled=t,t.inside&&t.ret===void 0&&this.inside--):t.half=!0,e&&(this.a=this.flags(r));return}let n=this.stack.pop();e?this.a=this.flags(n.a):[this.n,this.z,this.c,this.v]=n.flags}sp(){return 255-this.stack.reduce((e,t)=>e+(t.name===void 0||t.half?1:2),0)&255}stackPage(){let e=this.sp();(this.stacks??=new Map).set(e,this.stack.map(n=>({...n})));let t=255;for(let n of this.stack){let r=n.ret??0;n.name===void 0?this.mem[256+t--]=n.a??(n.flags?n.flags[0]<<7|n.flags[3]<<6|48|n.flags[1]<<1|n.flags[2]:0):(this.mem[256+t--]=r>>8,n.half||(this.mem[256+t--]=r&255))}return e}asm(e){if(e==="TSX"&&(this.x=this.flags(this.stackPage())),e==="TXS"){let t=this.stacks?.get(this.x);this.stack=t?t.map(n=>({...n})):[],this.visited=null,this.inside=this.stack.filter(n=>n.inside).length}e==="CLV"&&(this.v=0),e==="SED"&&(this.d=1),e==="CLD"&&(this.d=0),e==="SEI"&&(this.i=1),e==="CLI"&&(this.i=0)}run(e=1e7){this.pacing||(this.idle=0),this.pacing=!1,this.delay??=0;for(let t=0;t<e;t++){if(this.ended)return"end";let n=this.program.steps[this.pc];if(!n)throw new Error(this.name+": ran off the end");if(this.routines.before?.(this,n)==="wait"||this.exec(n)==="wait")return"idle";if(this.polled)return this.polled=!1,"idle";if(this.delay>=16)return this.pacing=!0,"pace"}return"steps"}exec(e){let t=this.pc;this.pc++;try{this.called=!1,!e.run&&ys(e)&&this.time(this.program.steps,t,t);let n=e.run?e.run(this,this.program.steps):this.interpret(e);if(n==="wait"&&(e.run?this.called:!ys(e))&&(this.pc=t,this.visiting!==void 0)){this.startVisit(t);return}return n}catch(n){if(n===ws){this.inside=0;return}if(this.routines.error?.(this,n)){this.ended=!0;return}throw n.message=e.where+" ("+e.text+"): "+n.message,n}}interpret(e){let t=e.words,[n,r]=t;if(r==="="&&t.length===3){let o=Q(n),c=this.load(Q(t[2]));if(o.reg==="carry"){this.c=c&1;return}this.set(o,c),o.reg&&this.flags(c);return}if(r==="+="||r==="-="){let o=Q(n),c=t.length===3?this.get(Q(t[2])):this.load(Q(t[2]));if(t.length===3){let f=this.get(o)+(r==="+="?c:-c)&255;this.set(o,f),this.flags(f);return}r==="+="?this.add(c):this.sub(c);return}if(r==="&="||r==="|="||r==="^="){let o=this.load(Q(t[2]));this.a=this.flags(r==="&="?this.a&o:r==="|="?this.a|o:this.a^o);return}if(r==="<<="||r===">>="||r==="rotate"){let o=Q(n);this.set(o,this.shift(this.get(o),r==="<<="||t[2]==="left",r==="rotate"));return}switch(n){case"if":return this.branch(t,e);case"goto":return t[1].startsWith("(")?this.jumpThrough(parseInt(t[1].slice(2,-1),16),e):t[1].startsWith("[")?this.jumpTable(parseInt(t[1].slice(2),16),this[t[2][0]]):this.jump(t[1],e);case"call":return t[1].startsWith("(")?this.callThrough(parseInt(t[1].slice(2,-1),16),e):this.call(t[1],e);case"return":return this.ret(e);case"compare":this.compare(this[t[1]],this.load(Q(t[2])));return;case"test":this.test(this.get(Q(t[1])));return;case"asm":if(t[1]==="RTI")return this.ret(e);this.asm(t[1]);return;case"push":this.push(t[1]==="a");return;case"pull":this.pull(t[1]==="a");return}return this.routine(n,t.slice(1),e)}routine(e,t,n){let r=this.routines[e];if(!r)throw new Error("no routine "+e);if(this.called=!0,n&&this.timed&&n.at!==null){let o=this.cost(this.program.steps,n.index);this.cycles+=o,this.delay+=o/bs}return r(this,t,n)}branch(e,t){let n=e.at(-1),r=e.slice(1,-2),o;if(r.length===3&&/^[axy]$/.test(r[0]))this.compare(this[r[0]],this.load(Q(r[2]))),o={"==":this.z,"!=":!this.z,">=":this.c,"<":!this.c}[r[1]];else{let c=r[0]==="not",f=c?r[1]:r[0],l={zero:this.z,carry:this.c,negative:this.n,overflow:this.v}[f];if(l===void 0)throw new Error("no flag "+f);o=c?!l:!!l}o&&(this.cycles+=$e(t),this.pc=this.label(n))}}});var Os={};F(Os,{GIVES:()=>xe,POLLS:()=>Ei,TAKES:()=>de,WAITS:()=>$i,describe:()=>G,nothing:()=>mt,result:()=>ee});function G(s,e,t,n,r,o){let c={step:s};e.length&&(c.n=e.map(Number));let f=de[s];if(s==="objects")c.table="$"+(t.x|t.y<<8).toString(16).toUpperCase().padStart(4,"0");else if(s.startsWith("object")&&t.a<2)c.a=t.a;else if(f)for(let l of f)c[l]=t[l];if((s==="key-at"||s==="key")&&c.a!==void 0&&(c.a=String.fromCharCode(c.a&127)),Cs[s]&&r)for(let[l,d]of Object.entries(Cs[s]))c[l]=r(d);if(js[s]&&o)for(let[l,d]of Object.entries(js[s]))c[l]=o(d);return n!==void 0&&(c.words=n),c}function ee(s,e){let t={result:s};for(let n of xe[s])t[n]=e[n];return t}var de,js,Cs,xe,mt,Ei,$i,we=U(()=>{de={box:"axy",object:"axy","object-keep":"axy","object-mode":"axy",objects:"xy",span:"axy",random:"a",beep:"a","key-at":"axy",key:"a",multiply:"ax",divide:"axy",ask:"a","ask-mode":"a","ask-escape":"a",rectangle:"axy","read-dot":"xy",problem:"a",dot:"axy","fill-rows":"axy",part:"a","rectangle-outline":"axy","key-panel":"a","keep-span":"xy","put-span":"xy","white-lines":"y","invert-span":"xy",label:"a","flip-box":"a","flash-box":"a",path:"ax",jump:"a",cell:"axy","cell-box":"axy",pair:"a",piece:"axy",colour:"a",tick:"",print:"axyc",arrow:"a",unpack:"y","load-picture":"a","action-cards":"a","return-key":"a","space-key":"a","wipe-rows":"a","wipe-columns":"a","text-card":"a","fill-left":"a","put-object":"axy","draw-room-objects":"yc",take:"y",drop:"y",effect:"a",outport:"a",cout:"a",char:"a",message:"xy",describe:"axy",chrout:"a",plot:"xyc",close:"a",chkin:"x",chkout:"x",setlfs:"axy",setnam:"axy",load:"axy",save:"axy",listen:"a",second:"a",ciout:"a",talk:"a",tksa:"a",setmsg:"a",tone:"xy","load-objects":"axy",hposn:"axy",hlin:"axy",hcolor:"x",pause:"a","bag-put":"a"},js={colour:{shape:3605},"card-frame":{x:16504,high:16505,y:16506,width:16507,height:16508}},Cs={line:{x0:0,x1:1,y0:2,y1:3,color:17},piece:{color:17},rectangle:{width:14,height:15},"rectangle-outline":{width:14,height:15}};xe={random:"a",ask:"ax","ask-mode":"ax","ask-escape":"axc","wait-or-escape":"c",problem:"c","read-key":"a","read-dot":"a",multiply:"ax",divide:"ax","blink-key":"a","which-box":"xy",tick:"a","choose-action":"a",take:"a",drop:"a","show-bag":"a","bag-choose":"a",getin:"a",acptr:"a",readst:"a",load:"cxy",chrin:"a"},mt=(s,e)=>s==="beep"&&e===0,Ei=new Set(["read-key","blink-key"]),$i=new Set(["wait","wait-erase","wait-or-escape","ask","ask-mode","ask-escape","which-box","tick","choose-action","take","drop","show-bag","bag-choose"])});var Ls={};F(Ls,{helpers:()=>xt});function xt(s,e){let t=s.title.map.vars.zero;function*n(f,...l){let d={words:[f]},g=l.map(k=>typeof k=="string"&&f==="text"?{string:k}:typeof k=="number"?String(k):k);for(;;){if(e[f](s,g,d)!=="wait")return{a:s.a,x:s.x,y:s.y,c:s.c};yield"wait"}}let r=(f,l=0,d,g)=>{s.a=l&255,d!==void 0&&(s.x=d&255),g!==void 0&&(s.y=g&255),s.title.paint?.[f]?.(s.title.model,s),s.emit(G(f,[],s,void 0,k=>s.mem[k+t],k=>s.mem[k]))};function*o(f="wait"){let l={words:[f]};for(;;){let d=s.key();if(d===5&&s.title?.menu&&s.leave(...s.title.menu),s.title?.visit?.[d]){s.visit(d),s.waitingOn=l,yield"wait";continue}if(d!==void 0)return s.waitingOn=null,d;s.waitingOn=l,yield"wait"}}function*c(f){s.inside++;try{return yield*f}finally{s.inside--}}return{e:s,mem:s.mem,call:n,drawn:r,key:o,inside:c}}var gt=U(()=>{we()});import{objects as ji}from"@moonbase-machines/vector";var As,yo,Rs,Ve,Ye=U(()=>{({carry:As,decode:yo,put:Rs,tables:Ve}=ji)});var Ts={};F(Ts,{pictures:()=>Oe,shapes:()=>Oi,windows:()=>Li});import{pictures as Ci}from"@moonbase-machines/vector";var Oe,Oi,Li,_e=U(()=>{({pictures:Oe,shapes:Oi,windows:Li}=Ci)});import{font as Ai}from"@moonbase-machines/vector";var Eo,$o,Xe,Is,Ms,ie,Le=U(()=>{({GLYPHS:Eo,WIDTHS:$o,dots:Xe,start:Is,useFont:Ms,width:ie}=Ai)});import{draw as Ri}from"@moonbase-machines/vector";var Oo,Ps,Lo,Ao,Ns,Ro,kt,To,Io,Ds=U(()=>{({crossings:Oo,draw:Ps,fill:Lo,inside:Ao,line:Ns,outline:Ro,screen:kt,spans:To,under:Io}=Ri)});var Bs={};F(Bs,{LAYOUT:()=>ge,PANELS:()=>Ae,layout:()=>Re,resolve:()=>ye,textLayout:()=>Te,textPage:()=>ke,textPen:()=>Ie,word:()=>Us});function Us(s,[e,t,n,r]){let o=e|t<<8,c=r===255?n:s[n|r<<8];for(;c-- >0;)o+=s[o]+1;let f="";for(let l=1;l<=s[o];l++)f+=String.fromCharCode(s[o+l]&127);return f}function Re(s,e){let t=e,n=[];t.tall=!1,t.margin=t.x;let r=9,o=!1,c=[],f=t.ink,l=!1,d=k=>{if(c.length){let w=Is(c.map(j=>j.ch),t.spacing,t.x,t.centre),x=[];for(let j of c){let O=ie(j.ch);x.push({ch:j.ch,x:w,ink:j.ink}),w+=j.ch.charCodeAt(0)<32?O:O+t.spacing}n.push({top:t.y,tall:t.tall,height:r,paper:t.paper,ink:t.ink,chars:x}),t.x=w}c=[],k&&(t.y+=(t.tall?2*r:r)+t.gap,t.x=t.margin)},g=k=>c.push({ch:o&&k>="0"&&k<="9"?String.fromCharCode(128+k.charCodeAt(0)-48):k,ink:l?f:void 0});for(let k=0;k<s.length;k++){let w=s[k];if(w===`
4
+ `){d(!0);continue}if(w==="{"){let x=s.indexOf("}",k),[j,O]=s.slice(k+1,x).split(":"),a=(O??"").split(",").map(p=>parseInt(p,16));switch(k=x,parseInt(j,16)){case 0:t.x=t.margin=a[0];break;case 1:a[0]<192?t.y=a[0]:r=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 p=0;p<(a[1]||256);p++)g(String.fromCharCode(a[0]&127));break}continue}g(w)}return d(!1),n}function Te(s,e){let t=[];e.inverse=!1;let n=[],r=c=>{let f=e.centre?40-n.length>>1:e.x;n.forEach((l,d)=>t.push({row:e.y,col:f+d,ch:l.ch,inverse:l.inverse})),n.length&&(e.x=f+n.length),n=[],c&&(e.y++,e.x=e.margin)},o=c=>n.push({ch:e.inverse?c.toUpperCase():c,inverse:e.inverse});for(let c=0;c<s.length;c++){let f=s[c];if(f===`
5
+ `){r(!0);continue}if(f==="{"){let l=s.indexOf("}",c),[d,g]=s.slice(c+1,l).split(":"),k=(g??"").split(",").map(w=>parseInt(w,16));switch(c=l,parseInt(d,16)){case 0:r(!1),e.x=e.margin=k[0];break;case 1:r(!1),k[0]<192&&(e.y=k[0]);break;case 7:e.centre=!0;break;case 8:e.centre=!1;break;case 13:e.inverse=!0;break;case 14:e.inverse=!1;break;case 15:for(let w=0;w<(k[1]||256);w++)o(String.fromCharCode(k[0]&127));break}continue}o(f)}return r(!1),t}var ge,re,le,Ae,ye,Ie,ke,Me=U(()=>{Le();ge={65:[116,116,174],50:[116,116,160],49:[130,130,174],34:[130,130,160],17:[158,158,174]},re=(s,e,t,n,r)=>({layout:s,rows:e,fill:10,paper:10,ink:0,gap:t,y:n,more:r}),le=(s,e,t,n)=>({layout:s,rows:e,fill:5,paper:5,ink:15,gap:t,y:n}),Ae={1:re(50,[116,159],7,128),2:re(50,[116,159],33,135),3:re(34,[130,159],5,135),4:re(34,[130,159],19,142),5:le(34,[160,189],5,166),6:le(34,[160,189],19,172),7:re(65,[116,173],5,121),8:re(65,[116,173],6,128),9:re(65,[116,173],7,134),10:re(65,[116,173],47,142),11:re(50,[116,159],5,121),12:re(49,[130,173],5,135),13:re(49,[130,173],7,142),14:re(49,[130,173],33,149),15:re(17,[158,173],5,163,[174]),16:le(50,[160,189],19,172),17:le(66,[160,189],19,172),18:le(50,[160,189],5,166),19:le(66,[160,189],5,166),20:le(35,[160,189],0,163),21:le(51,[160,189],0,163),22:le(67,[160,189],0,163),23:le(49,[174,189],5,179),24:le(65,[174,189],5,179)};ye=(s,e)=>s.replace(/\{6:([0-9a-f,]+)\}/g,(t,n)=>Us(e,n.split(",").map(r=>parseInt(r,16))));Ie=()=>({x:0,y:0,margin:0,centre:!1,inverse:!1}),ke=()=>Array.from({length:24},()=>Array.from({length:40},()=>({ch:" ",inverse:!1})))});var zs={};F(zs,{Raster:()=>Pe});var Pe,wt=U(()=>{Ds();Ye();Le();Me();Pe=class{constructor(){this.dots=kt(15),this.kept=null}keepScreen(){this.screenKept={dots:this.dots,kept:this.kept},this.dots=kt(0)}putScreen(){this.screenKept&&({dots:this.dots,kept:this.kept}=this.screenKept),this.screenKept=null}scroll(){for(let e=19;e<=115;e++){let t=this.dots[e],n=[];for(let r of t)n.push(r>>3&1,r>>2&1,r>>1&1,r&1);for(let r=14;r<518;r++)n[r]=n[r+28];for(let r=0;r<140;r++)t[r]=n[4*r]<<3|n[4*r+1]<<2|n[4*r+2]<<1|n[4*r+3]}}set(e,t,n){e>=0&&e<140&&t>=0&&t<192&&(this.dots[t][e]=n&15)}get(e,t){return e>=0&&e<140&&t>=0&&t<192?this.dots[t][e]:0}span(e,t,n,r){for(let o=t;o<=n;o++)this.set(o,r,e)}rows(e,t,n,r){for(let o=n;o<n+t;o++)this.span(e,0,139,o),r&&(this.set(0,o,15),this.set(139,o,15))}whiteLines(e){this.span(15,0,139,e),this.span(15,0,139,e+1)}box(e,t,n,r){let[o,c,f]=ge[e]??ge[50];if(t!==128){this.span(0,1,138,1),this.span(0,1,138,o-1);for(let l=2;l<o-1;l++)this.set(1,l,0),this.set(138,l,0),this.span(t,2,137,l)}n!==128&&(this.whiteLines(c),this.rows(n,f-c-2,c+2,!0)),r!==128&&(this.whiteLines(f),this.rows(r,190-f-2,f+2,!0))}panel(e,t,n){this.whiteLines(e),this.rows(n,t-e-1,e+2,!0)}picture(e){Ps(e,this.dots)}rectangle(e,t,n,r,o){for(let c=n;c<n+o;c++)this.span(e,t,t+r-1,c)}outline(e,t,n,r,o){this.span(e,t,t+r-1,n),this.span(e,t,t+r-1,n+o-1);for(let c=n;c<n+o;c++)this.set(t,c,e),this.set(t+r-1,c,e)}line(e,t,n,r,o){for(let[c,f]of Ns(t,n,r,o))this.set(c,f,e)}object(e,t,n,r){r==="keep"&&(this.kept={x:t,y:n,rows:e.rows.map((o,c)=>o.map((f,l)=>this.get(t+l,n+c)))}),Rs(this.dots,e,t,n,r==="whole")}restore(){let e=this.kept;e&&e.rows.forEach((t,n)=>t.forEach((r,o)=>this.set(e.x+o,e.y+n,r)))}glyph(e,t,n,r,o,c=1,f=9,l=0){let d=ie(e);if(e.charCodeAt(0)<32){for(let k=0;k<Math.min(9,f);k++)for(let w=0;w<d;w++)for(let x=0;x<c;x++)this.set(t+w,n+k*c+x,o);return d}let g=new Set(Xe(e).map(([k,w])=>k+","+w));for(let k=0;k<Math.min(9,f);k++)for(let w=0;w<d+l;w++)for(let x=0;x<c;x++)this.set(t+w,n+k*c+x,g.has(w+","+k)?r:o);return d}}});import{mli as Ti}from"@moonbase-machines/apple2e";var Fs,yt,Je,bt=U(()=>{({BLOCK:Fs,CLOCK:yt,Files:Je}=Ti)});var Hs={};F(Hs,{codeFiles:()=>Ne,pictureShapes:()=>Ii,vectorRoutines:()=>vt});function Ne(s,e){let t=s?.loads??{};return Object.entries(e).filter(([n])=>/^(PART|PROB)\d$/.test(n)).map(([n,r])=>({name:n,bytes:Uint8Array.from(atob(r.data),o=>o.charCodeAt(0)),origin:t[n]??t[n.slice(0,-1)]??r.aux}))}function pe(s,e,t){let n=de[e]||"",r=[],o=0;e==="panel"&&r.push(t[o++]);let c={a:s.a,x:s.x,y:s.y};if(e==="objects"&&t[0]?.startsWith?.("$")){let f=parseInt(t[o++].slice(1),16);c.x=f&255,c.y=f>>8}else for(let f of n){let l=t[o++];l===void 0||l===f||(c[f]=typeof l=="object"?l.string.charCodeAt(0)|128:l.startsWith("$")?s.mem[parseInt(l.slice(1),16)]:+l)}return s.a=c.a&255,s.x=c.x&255,s.y=c.y&255,{fixed:r,rest:t.slice(o)}}function Ge(s,e,t,n,r,o){for(s.waitingOn!==e&&(s.emit(G(t,n,s,r)),s.waitingOn=e,s.asked=null);;){let c=s.key();if(c===void 0)return"wait";if(c===te.menu&&s.title.menu&&s.leave(...s.title.menu),s.title.visit?.[c])return s.visit(c),"wait";if(o(c)){s.waitingOn=null;return}}}function qs(s,e){if(e){s.inside++;try{for(let t=e.next();!t.done;t=e.next())if(t.value==="wait")throw new Error("a choice drawn inside the ask cannot wait")}finally{s.inside--}}}function Ks(s){if(s.objectTables||!s.disk)return s.objectTables;let e=Ne(s.map,Object.values(s.disk.volumes)[0]);return s.objectTables=new Map(Ve(e,s.map.objects).map(t=>[t.address,t.objects]))}function Ws(s){if(s.pictureShapes||!s.disk)return s.pictureShapes;let e=Object.values(s.disk.volumes)[0],t=new Map;for(let[n,r]of Object.entries(e))if(/^PICS\d$/.test(n))for(let o of Oe(Uint8Array.from(atob(r.data),c=>c.charCodeAt(0))))t.set(o.name,o.shapes);return s.pictureShapes=t}function vt(s){let e=s.map.vars,t=a=>e.zero+a;Ms(s.font);let n=a=>{if(a.a<2)return;let p=Ks(s)?.get(a.objectTable)?.find(m=>m.number===a.a);p&&(a.c=As(p,a.x),a.mem[t(2)]=a.y+p.height&255)},r=s.raster??=new Pe,o=s.pen??={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10};s.text??={showing:!1,pen:Ie(),page:ke()};let c=(a,p)=>Ks(s)?.get(a.objectTable)?.find(m=>m.number===p),f=(a,p)=>{if(a.a<2)return r.restore();let m=c(a,a.a);m&&r.object(m,a.x,a.y,p)},l=a=>{let p=ie(a),m=o.x,y=(p<4?4-p:0)+1;r.rectangle(1,m,o.y-2,Math.max(4,p)+4,11),r.outline(13,m,o.y-2,Math.max(4,p)+4,11),r.glyph(a,m+1+y,o.y,15,1,1,8),o.x=m+1+y+p+1+2},d=a=>{let p=s.map.keyPanel;if(!p)return;let m=r.get(2,2),{x:y,y:E}=o;for(let L=p.top;L<p.top+p.rows;L++)r.span(m,p.left,p.right,L);p.caps.forEach(([L,C,M],S)=>{(!a||a===S+1)&&(o.x=L,o.y=C,l(String.fromCharCode(M&127)))}),Object.assign(o,{x:y,y:E})},g=(a,p)=>{for(let m of Re(ye(p,a.mem),o))for(let y of m.chars)r.glyph(y.ch,y.x,m.top,y.ink??m.ink,m.paper,m.tall?2:1,m.height,o.spacing)},k=(a,p,m,y,E)=>{let L=c(a,p);L&&r.object(L,m,y,E)};s.model={raster:r,pen:o,cap:l,keyPanel:d,print:g,put:k};let w=(a,p)=>(m,y,E)=>{let{fixed:L,rest:C}=pe(m,a,y),M=C.map(S=>typeof S=="object"?S.string:S).join(" ");m.emit(G(a,L,m,C.length?M:void 0,S=>m.mem[t(S)])),C=C.map(S=>typeof S=="object"?S.string:S),p?.(m,L,C)},x=!s.map.askClearsCarry,j=a=>(p,m,y)=>{p.waitingOn!==y&&pe(p,a,m);let E=p.waitingOn===y?p.askMode:p.a;p.askMode=E;let L=[te.left,te.right,te.down,te.up];E===128&&p.waitingOn!==y&&d(0);let C=Ge(p,y,a,[],void 0,M=>{if(a==="ask-escape"&&M===te.escape)return p.a=p.flags(27),p.x=155,p.c=1,p.asked=null,!0;if(p.asked===null){let S=-1,A=M;return E===128?(S=L.indexOf(M),A=219+S,S>=0&&d(S+1)):E>=177&&E<186?M>=49&&M<=(E&127)&&(S=M-49):(A=M&95,A>=65&&A<=(E&95&127)&&(S=A-65,A|=128)),S>=0&&(p.asked={place:S,key:A},a==="ask-mode"&&qs(p,p.askHooks?.chose?.(S))),!1}return M===te.return?(p.x=p.asked.place,p.y=2*p.x,p.a=p.asked.key,p.c=x&&p.a>=193?1:0,!0):((M===te.delete||M===te.left)&&(a==="ask-mode"&&qs(p,p.askHooks?.undo?.(p.asked.place)),E===128&&d(0),p.asked=null),!1)});return C!=="wait"&&(p.mem[e.layout]=34,p.emit(ee(a,p))),C},O={show:w("show",a=>{s.text.showing=!1,a.mem[49181]=128}),"text-screen":a=>{Object.assign(s.text,{showing:!0,page:ke()}),a.mem[49181]=0,a.inside++,a.emit({step:"text-screen"}),a.inside--},picture:w("picture",(a,p,[m])=>{let y=Ws(s)?.get(m.toUpperCase().replace(/_/g," "));y&&r.picture(y)}),box:w("box",a=>r.box(a.mem[e.layout],a.a,a.x,a.y)),panel:w("panel",(a,[p])=>{let m=Ae[p];if(m){a.mem[e.layout]=m.layout,r.panel(m.rows[0],m.rows[1],m.fill);for(let y of m.more??[])r.whiteLines(y);Object.assign(o,{paper:m.paper,ink:m.ink,centre:!0,spacing:1,gap:m.gap,y:m.y})}}),text:(a,p)=>{let m=p[0].string.replace(/\{([0-9a-f]+):([^}]*)\}/g,(y,E,L)=>"{"+E+":"+L.split(",").map(C=>C.startsWith("$")?a.mem[parseInt(C.slice(1),16)].toString(16):C).join(",")+"}").replace(/\{\$([0-9A-Fa-f]{4})\}/g,(y,E)=>String.fromCharCode(a.mem[parseInt(E,16)]&127));if(a.emit(G("text",[],a,m)),s.text.showing){for(let y of Te(ye(m,a.mem),s.text.pen))s.text.page[y.row]?.[y.col]&&(s.text.page[y.row][y.col]={ch:y.ch,inverse:y.inverse});return}g(a,m)},objects:w("objects",a=>{a.objectTable=a.x|a.y<<8}),object:w("object",a=>{f(a,"whole"),n(a)}),"object-keep":w("object-keep",a=>{f(a,"keep"),n(a)}),"object-mode":w("object-mode",a=>f(a,"clear")),"key-at":w("key-at",a=>{o.x=a.x,o.y=a.y,l(String.fromCharCode(a.a&127))}),key:w("key",a=>l(String.fromCharCode(a.a&127))),"white-lines":w("white-lines",a=>r.whiteLines(a.y)),"fill-rows":w("fill-rows",a=>r.rows(a.a,a.x,a.y,a.c)),span:w("span",a=>r.span(a.a,a.x,a.y,a.mem[t(2)])),dot:w("dot",a=>{r.set(a.x,a.y,a.a),a.a=a.x%7<<4|a.a&15}),line:w("line",a=>r.line(a.mem[t(17)],a.mem[t(0)],a.mem[t(2)],a.mem[t(1)],a.mem[t(3)])),rectangle:w("rectangle",a=>r.rectangle(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)])),"rectangle-outline":w("rectangle-outline",a=>r.outline(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)]+1)),flash:w("flash"),"read-dot":(a,p)=>{pe(a,"read-dot",p),a.emit(G("read-dot",[],a)),a.a=a.flags(r.get(a.x,a.y)),a.emit(ee("read-dot",a))},"key-panel":w("key-panel",a=>d(a.a)),"keep-span":w("keep-span"),"put-span":w("put-span"),"invert-span":w("invert-span"),button:w("button"),beep:(a,p)=>{pe(a,"beep",p),mt("beep",a.a)||a.emit(G("beep",[],a))},sound:(a,p)=>a.emit(G("sound",[],a,p.map(m=>m.startsWith("$")?a.mem[parseInt(m.slice(1),16)].toString(16):m).join(" "))),scroll:a=>{r.scroll(),a.inside++,a.emit({step:"scroll"}),a.inside--},"shift-down":(a,p)=>{let[m,y,E,L,C]=p.map(Number);for(let M=L;M>=E;M--)for(let S=m;S<=y;S++)r.set(S,M+C,r.get(S,M));a.inside++,a.emit({step:"shift-down",left:m,right:y,top:E,bottom:L,by:C}),a.inside--},part:w("part"),wait:(a,p,m)=>Ge(a,m,"wait",[],void 0,y=>y===te.space&&(a.a=32,a.c=0,!0)),"wait-erase":(a,p,m)=>Ge(a,m,"wait-erase",[],void 0,y=>y===te.space),"wait-or-escape":(a,p,m)=>{let y=Ge(a,m,"wait-or-escape",[],void 0,E=>(E===te.space||E===te.escape)&&(a.c=E===te.escape?1:0,a.a=E,!0));return y!=="wait"&&a.emit(ee("wait-or-escape",a)),y},ask:j("ask"),"ask-mode":j("ask-mode"),"ask-escape":j("ask-escape"),random:(a,p)=>{let{fixed:m}=pe(a,"random",p);a.emit(G("random",m,a));let y=a.a,{at:E,used:L}=s.map.seed;a.mem[L]===255&&s.seed!==void 0&&(a.mem[E]=s.seed&255,a.mem[E+1]=s.seed>>8);let C=a.mem[E]|a.mem[E+1]<<8;C=C*259&65535,a.mem[E]=C&255,a.mem[E+1]=C>>8,a.mem[L]=y;let M=y?Math.floor(65535/y):65535;a.a=Math.floor(C/M)&255,a.c=0,a.emit(ee("random",a))},multiply:(a,p)=>{pe(a,"multiply",p),a.emit(G("multiply",[],a));let m=a.a*a.x;a.a=m&255,a.x=m>>8,a.emit(ee("multiply",a))},divide:(a,p)=>{pe(a,"divide",p),a.emit(G("divide",[],a));let m=a.x|a.y<<8,y=a.a||1;a.a=Math.floor(m/y)&255,a.x=m%y,a.emit(ee("divide",a))},problem:(a,p,m)=>{if(!a.problem){pe(a,"problem",p),a.emit(G("problem",[],a)),a.mem[e.practice]=a.c?128:0,a.repeats=a.mem[e.repeats],s.map.countInX&&a.c&&(a.mem[e.repeats]=a.x);let y=s.problems?.[a.a];if(!y)throw new Error("problem "+a.a+" is not written yet");let E=s.disk&&Ne(s.map,Object.values(s.disk.volumes)[0]).find(L=>L.name==="PROB"+a.a);E&&a.mem.set(E.bytes,E.origin),a.problem=y(xt(a,O))}if(!a.problem.next().done)return"wait";a.problem=null,a.c=0,a.mem[e.repeats]=a.repeats,a.emit(ee("problem",a))},"read-key":(a,p,m)=>{a.waitingOn!==m&&(a.waitingOn=m,a.asked=null);let y=a.key();if(y===void 0)return"wait";if(s.visit?.[y])return a.visit(y),"wait";a.waitingOn=null,y===te.menu&&s.menu&&a.leave(...s.menu),a.a=a.flags(y&127),a.c=y===te.escape?1:0,a.emit(ee("read-key",a))},splash:(a,p,m)=>{if(a.waitingOn!==m&&(a.inside++,a.emit({step:"splash"}),a.inside--,a.waitingOn=m),a.key()===void 0)return"wait";a.waitingOn=null},"clear-screen":a=>{for(let p of r.dots)p.fill(0);a.inside++,a.emit({step:"clear-screen"}),a.inside--},pause:(a,[p])=>{a.x=0,a.y=0,a.flags(0),a.inside++,a.emit({step:"pause",ms:+p}),a.inside--},quit:a=>{a.ended=!0},unwritten:(a,[p])=>{throw new Error("not written yet: "+(p?.string??p))},"goto-engine":(a,[p])=>{let m=s.entries?.[p];if(!m)throw new Error("no script for "+p);a.enter(...m)},"call-engine":(a,[p])=>{let m=s.entries?.[p];if(!m)throw new Error("no script for "+p);a.stack.push({name:a.name,pc:a.pc}),a.enter(...m)},"load-part":a=>{let p=Object.keys(s.disk?.volumes??{})[0]?.toUpperCase();if(s.files?.out?.has(p)){a.a=a.flags(69),a.c=1;return}a.stack=[],a.enter("part"+a.a,void 0,!0)},"write-settings":a=>{let p=s.files??=new Je(s.disk),m=Object.keys(s.disk.volumes)[0].toUpperCase(),y=p.out?.has(m)?69:p.disks[m]==="protected"?43:0;a.a=a.flags(y),a.c=y?1:0}};return O}var te,Ii,Ze=U(()=>{we();gt();Ye();_e();Le();wt();bt();Me();te={escape:27,space:32,return:13,delete:127,left:8,right:21,down:10,up:11,menu:5};Ii=(s,e)=>Ws(s)?.get(e.toUpperCase().replace(/_/g," "))});var Ys={};F(Ys,{INLINE:()=>ue,KERNAL:()=>Mi,section:()=>Vs,sectionName:()=>Et});function Vs(s,e,t){let{lengths:n,marks:r}=s.sections,o=c=>e(c+t)|e(c+t+1)<<8;return{mark:o(r),length:o(n)}}function Et(s,e,t,n){let r=s.sections;if(!r||t!==r.file)return t;for(let o=0;o<r.count;o+=2){let c=Vs(s,e,o);if(c.length&&c.mark===n)return t+":"+o}return t}var St,ue,Mi,$t=U(()=>{St=s=>(e,t)=>{let n=[];for(let r=0;r<s;r++)n.push(e(t+r).toString(16));return{length:s,value:n.join(" ")}},ue={fill:St(7),copy:St(8),prodos:St(3),"boot-say":(s,e)=>ue.say(s,e),say(s,e){let t="",n=e;for(let r=0;r<1024;r++){let o=s(n++);if(!o)break;t+=String.fromCharCode((o^128)&127)}return{length:n-e,value:t}},print(s,e){let t="",n=e;for(let r=0;r<256;r++){let o=s(n++);if(!o)break;t+=String.fromCharCode(o&127)}return{length:n-e,value:t}}};Mi={65490:"chrout",65508:"getin",65520:"plot",65484:"clrchn",65505:"stop",65463:"readst",65466:"setlfs",65469:"setnam",65493:"load",65496:"save",65457:"listen",65427:"second",65448:"ciout",65454:"unlsn",65460:"talk",65430:"tksa",65445:"acptr",65451:"untlk",65499:"settim",65502:"rdtim",65424:"setmsg"}});import{rom as Pi}from"@moonbase-machines/apple2e";var _s,Xs=U(()=>{({install:_s}=Pi)});import{kernal as Ni}from"@moonbase-machines/c64";var Qe,Js,Gs,Zs,Qs,en,Qo,jt=U(()=>{({KEY_TABLES:Qe,VECTORS:Js,VIC:Gs,install:Zs,kernalByte:Qs,matrixOf:en,screenCode:Qo}=Ni)});import{drive as Di}from"@moonbase-machines/c64";var et,Ct=U(()=>{({Drive:et}=Di)});var tn={};F(tn,{Printer:()=>Ot,WIDTH:()=>Bi,bus:()=>Lt,paper:()=>zi});import{printer as Ui}from"@moonbase-machines/c64";var Ot,Bi,Lt,zi,At=U(()=>{({Printer:Ot,WIDTH:Bi,bus:Lt,paper:zi}=Ui)});import{basic as Fi}from"@moonbase-machines/c64";var sn,nn=U(()=>{({Basic:sn}=Fi)});import{numbers as qi}from"@moonbase-machines/c64";var rn,aa,ca,la,fa,ha,da,pa,ua,on=U(()=>{({BasicError:rn,ERRORS:aa,fail:ca,fout:la,int16:fa,nextRandom:ha,scanNumber:da,seedRandom:pa,val:ua}=qi)});import{basicRom as Ki}from"@moonbase-machines/c64";var ga,an,cn,ln=U(()=>{({evaluateInMemory:ga,install:an,printError:cn}=Ki)});import{disasm as Wi}from"@moonbase-machines/mos6502";var fn,hn,ya,fe,dn,pn=U(()=>{({OPS:fn,SIZE:hn,disassemble:ya,hex:fe,operand:dn}=Wi)});import{inline as Hi}from"@moonbase-machines/vector";var un,Sa,Ea,$a,mn=U(()=>{({INLINE:un,name:Sa,sound:Ea,text:$a}=Hi)});var xn={};F(xn,{lift:()=>Rt,readers:()=>tt,script:()=>Tt});function Rt(s,e,t,n,r=new Set,o=Vi){let c=o,f=new Map,l=new Set(t),d=new Set,g=[...t],k=O=>O>=e&&O<e+s.length;for(;g.length;){let O=g.pop(),a={};for(;k(O)&&!f.has(O);){d.add(O);let p=O-e,m=fn[s[p]];if(m.name==="???"){f.set(O,{line:".byte $"+fe(s[p],2)+" ; not an instruction",end:O+1});break}let y=hn[m.mode],E=s[p+1]|s[p+2]<<8,L=s.subarray(p,p+y),C=(m.name+" "+dn(m.mode,L,O)).trim(),M=O+y,S=!1;if(m.mode==="imm"&&"LDA LDX LDY".includes(m.name)?a[m.name[2]]=s[p+1]:(m.name.startsWith("T")||m.name.startsWith("IN")||m.name.startsWith("DE")||m.name.startsWith("LD")||m.name==="PLA")&&delete a[m.name.at(-1)],m.name==="JSR"&&n[E]){let A=n[E],$=c[A]?.(s,M-e),R=["A","X","Y"].map(T=>a[T]===void 0?"":T+"="+a[T]).filter(Boolean).join(" ");C=A+($?" "+$.words:"")+(R&&!$?" ; "+R:""),$&&(M+=$.length);for(let T in a)delete a[T]}else if(m.name==="JSR"){k(E)&&(l.add(E),g.push(E));for(let A in a)delete a[A]}else if(m.name==="JMP"&&m.mode==="abs")k(E)?(l.add(E),g.push(E)):C+=" ; into PART0"+(n[E]?", "+n[E]:""),S=!0;else if(m.name==="JMP"||m.name==="RTS"||m.name==="RTI"||m.name==="BRK")S=!0;else if(m.mode==="rel"){let A=O+2+(s[p+1]<<24>>24)&65535;l.add(A),g.push(A)}if((m.mode==="abx"||m.mode==="aby")&&m.name==="LDA"&&k(E))for(let A=p+3;A<p+12&&A+2<s.length;A++){if(s[A]!==s[p]||(s[A+1]|s[A+2]<<8)!==E+1)continue;let $=[];for(let R=E-e;R+1<s.length&&$.length<64&&!($.length&&r.has(e+R));R+=2){let T=s[R]|s[R+1]<<8;if(!k(T))break;$.push(T)}C+=" ; a table of "+$.length+" addresses";for(let R of $)l.add(R),g.push(R);break}f.set(O,{line:C,end:M,op:m.name,mode:m.mode,value:y===2?s[p+1]:E,call:m.name==="JSR"&&n[E]?{name:n[E],words:c[n[E]]?.(s,O+3-e)?.words}:null,stop:S});for(let A=O+1;A<M;A++)d.add(A);if(S)break;O=M}}let w=[],x=null;for(let O of[...f.keys()].sort((a,p)=>a-p))x!==null&&O!==x&&w.push(""),l.has(O)&&w.push("L"+fe(O,4)+":"),w.push(fe(O,4)+" "+f.get(O).line),x=f.get(O).end;let j=[];for(let O=e;O<e+s.length;){if(d.has(O)){O++;continue}let a=O;for(;O<e+s.length&&!d.has(O);)O++;j.push([a,O-a])}return{listing:w.join(`
6
+ `),left:j,reached:d.size,size:s.length,lines:f,targets:l}}function Tt({lines:s,targets:e,left:t},n,r,{stops:o=new Set,selfModified:c=!1,memory:f=!1,moved:l=[]}={}){let d=(S,A=4)=>"$"+fe(S,A),g=new Set(l);if(c)for(let S of s.values())/^(STA|STX|STY|INC|DEC|ASL|LSR|ROL|ROR)$/.test(S.op)&&/^(abs|abx|aby)$/.test(S.mode)&&g.add(S.value);let k=null,w=()=>k!==null&&(f||g.has(k+1)||g.has(k+2)),x=S=>{let A=S.value;if(w()&&S.mode==="imm"&&(f||g.has(k+1)))return d(k+1);if(w()&&/^(abs|abx|aby)$/.test(S.mode))return"["+d(k+1)+"]"+(S.mode==="abs"?"":"["+S.mode.at(-1)+"]");switch(S.mode){case"imm":return String(A);case"zp":return d(A,2);case"zpx":return d(A,2)+"[x]";case"zpy":return d(A,2)+"[y]";case"abs":return d(A);case"abx":return d(A)+"[x]";case"aby":return d(A)+"[y]";case"izy":return"("+d(A,2)+")[y]";case"izx":return"("+d(A,2)+"[x])";case"acc":return"a";default:return"?"}},j=S=>"L"+fe(S,4),O={BEQ:"zero",BNE:"not zero",BCS:"carry",BCC:"not carry",BMI:"negative",BPL:"not negative",BVS:"overflow",BVC:"not overflow"},a={BEQ:"==",BNE:"!=",BCS:">=",BCC:"<"},p=(S,A)=>S+2+(A.value<<24>>24)&65535,m=[...s.keys()].sort((S,A)=>S-A),y=[],E=S=>["JMP","RTS","RTI"].includes(S.op);e=new Set(e),m.forEach((S,A)=>{let $=s.get(S);$.op&&!E($)&&A+1<m.length&&$.end!==m[A+1]&&s.has($.end)&&e.add($.end)});let L=[],C=()=>{for(let[S,A,$]of L)y.push(fe(S,4)+" "+A+" = "+$);L=[]},M=null;for(let S=0;S<m.length;S++){let A=m[S],$=s.get(A),R=s.get(m[S+1]),T=P=>y.push(fe(A,4)+" "+P);if(k=A,M&&M.op&&!E(M)&&M.end!==A&&s.has(M.end)&&(C(),y.push(fe(M.pc,4)+" goto "+j(M.end))),M={...$,pc:m[S]},e.has(A)&&(C(),y.push(j(A)+":")),!$.op){C(),T("asm "+$.line);continue}let N=$.op.at(-1).toLowerCase();if($.call){let[P,...W]=$.call.name.split(" "),_=de[P]||"",K=Object.fromEntries(L.map(([,ne,he])=>[ne,he]));L=L.filter(([,ne])=>!_.includes(ne)),C();let se=[...W,...[..._].map(ne=>K[ne]??ne)];P==="objects"&&K.x!==void 0&&K.y!==void 0&&se.splice(W.length,2,d(K.x|K.y<<8)),(P==="key-at"||P==="key")&&(se[0]=K.a!==void 0?JSON.stringify(String.fromCharCode(K.a&127)):se[0]),T([P,...se,$.call.words??""].join(" ").trim());continue}switch($.op){case"LDA":case"LDX":case"LDY":if($.mode==="imm"&&!w()){L=L.filter(([,P])=>P!==N),L.push([A,N,$.value]);break}if($.mode==="aby"||$.mode==="abx"){let[P,W,_,K]=[1,2,3,4].map(B=>s.get(m[S+B]));if(P?.op==="STA"&&W?.op==="LDA"&&W.value===$.value+1&&_?.op==="STA"&&K?.op==="JMP"&&P.value===m[S+4]+1&&_.value===m[S+4]+2){C(),T("goto ["+d($.value)+" "+$.mode.at(-1)+"]"),S+=4,M=null;break}}C(),T(N+" = "+x($));break;case"STA":case"STX":case"STY":C(),T(x($)+" = "+N);break;case"TAX":case"TAY":case"TXA":case"TYA":C(),T($.op[2].toLowerCase()+" = "+$.op[1].toLowerCase());break;case"INX":case"INY":case"DEX":case"DEY":C(),T(N+($.op[0]==="I"?" += 1":" -= 1"));break;case"INC":case"DEC":C(),T(x($)+($.op==="INC"?" += 1":" -= 1"));break;case"CLC":case"SEC":C(),T("carry = "+($.op==="SEC"?1:0));break;case"ADC":C(),T("a += "+x($)+" + carry");break;case"SBC":C(),T("a -= "+x($)+" + borrow");break;case"AND":C(),T("a &= "+x($));break;case"ORA":C(),T("a |= "+x($));break;case"EOR":C(),T("a ^= "+x($));break;case"ASL":case"LSR":case"ROL":case"ROR":C(),T(x($)+" "+{ASL:"<<= 1",LSR:">>= 1",ROL:"rotate left",ROR:"rotate right"}[$.op]);break;case"BIT":C(),T("test "+x($));break;case"CMP":case"CPX":case"CPY":{C();let P=$.op==="CMP"?"a":$.op[2].toLowerCase();R&&a[R.op]&&!e.has(m[S+1])?(T("if "+P+" "+a[R.op]+" "+x($)+" goto "+j(p(m[S+1],R))),S++,M={...R,pc:m[S]}):T("compare "+P+" "+x($));break}case"JMP":if(C(),$.mode==="abs"&&w()){T("goto ("+d(A+1)+")");break}T($.mode==="abs"?$.value>=r&&$.value<r+n.length?"goto "+j($.value):"goto-engine "+d($.value):"goto ("+d($.value)+")");break;case"JSR":if(C(),w()){T("call ("+d(A+1)+")");break}T($.value>=r&&$.value<r+n.length?"call "+j($.value):"call-engine "+d($.value));break;case"RTS":C(),T("return");break;case"PHA":case"PLA":case"PHP":case"PLP":C(),T({PHA:"push a",PLA:"pull a",PHP:"push flags",PLP:"pull flags"}[$.op]);break;case"NOP":break;default:if(O[$.op]){C(),T("if "+O[$.op]+" goto "+j(p(A,$)));break}C(),T("asm "+$.line)}}C();for(let[S,A]of t){let $=0;for(;$<A&&!($&&o.has(S+$))&&!o.has(S);)$++;if(!$)continue;let R=[];for(let T=0;T<$;T+=16)R.push("data "+d(S+T)+" "+Array.from(n.subarray(S-r+T,S-r+Math.min($,T+16)),N=>fe(N,2)).join(" "));y.push("",...R)}return y.join(`
7
+ `)+`
8
+ `}var tt,Vi,It=U(()=>{pn();mn();we();tt=s=>Object.fromEntries(Object.entries(s).map(([e,t])=>[e,(n,r)=>{let o=t(c=>n[c],r);return{length:o.length,words:e==="text"||e==="print"||e==="say"?JSON.stringify(o.value):o.value}}])),Vi=tt(un)});var kn={};F(kn,{cardRoutines:()=>Mt});function gn(s,e,t){let n=de[e]||"",r=0,o=null;for(let c of n){let f=t[r++];if(f===void 0||f===c||typeof f=="object")continue;let l=f.startsWith("$")?s.mem[parseInt(f.slice(1),16)]:+f;c==="c"?s.c=l&1:(s[c]=l&255,o!=="a"&&(o=c))}return o&&s.flags(s[o]),t.slice(r)}function Mt(s){let e=s.map,t=s.disk.kind==="c64",n=t?null:s.files??=new Je(s.disk),r=s.screen??={text:1,mixed:0,page2:0,hires:0},o=0,c={bank:2,read:0,aside:new Uint8Array(4096)},f=(i,h)=>{if(h===c.bank)return;let u=i.mem.slice(53248,57344);i.mem.set(c.aside,53248),c.aside=u,c.bank=h},l=s.chip=new Uint8Array(4096),d={4:i=>i&255,5:i=>i>>8&255,8:i=>i*7&255,9:i=>i*13&255};function g(i,h,u){let v=h&4095;if(v<1024){let b=v&63;if(u===void 0&&(b===17||b===18))return i.raster=i.clock?Math.floor(i.cycles/63)%312:((i.raster??0)+1)%312,b===18?i.raster&255:l[17]&127|i.raster>>1&128;if(u===void 0&&b===25)return i.vicFlags??112;if(u===void 0)return l[b];if(l[b]=u,i.splitLine!==void 0&&b!==25){let I=i.clock?i.clock.splits??=new Map:s.splits??=new Map;(I.get(i.splitLine)??I.set(i.splitLine,new Map).get(i.splitLine)).set(b,u)}b===26&&!(u&1)&&s.splits?.clear();return}if(v<2048){let b=1024|v&31;if(u===void 0)return l[b];l[b]=u,i.sid?.push([i.cycles,v&31,u]);return}if(v<3072){if(u===void 0)return l[v]|240;l[v]=u&15;return}if(v<3328){let b=v&15;if(u===void 0)return d[b]?d[b](s.seed??17):b<2?255:b===13?0:l[3072|b];l[3072|b]=u;return}if(u===void 0)return l[v];if(l[v]=u,(v&15)===0&&i.splitLine!==void 0){let b=i.clock?i.clock.splits??=new Map:s.splits??=new Map;(b.get(i.splitLine)??b.set(i.splitLine,new Map).get(i.splitLine)).set(256,u)}}let k=i=>(i.mem[1]&3)!==0&&(i.mem[1]&4)!==0;function w(i,h,u){if(t&&h>=57344){if(u===void 0)return Qs(h);i.mem[h]=u;return}if(t)return g(i,h,u);if((h&65520)===49280){let v=h&15;return f(i,v&8?1:2),c.read=(v&1)===(v>>1&1)?1:0,0}if(h>=49232&&h<=49239){let v=["text","mixed","page2","hires"][h-49232>>1];return r[v]=h&1,0}if(h===49152&&u===void 0){if(!(o&128)){let v=i.key();v!==void 0&&v>=0&&(o=v|128)}return++i.idle>2e3&&(i.polled=!0),o}if(h===49168){let v=o;return!(o&128)&&++i.idle>2e3&&(i.polled=!0),o&=127,v}return h===49200&&i.clicks.push(i.cycles),0}let x=null,j={hooks:new Map,cycles:0,a:0,x:0,y:0,z:0,c:0,n:0,v:0,read:i=>x.mem[i],write:(i,h)=>{x.mem[i]=h&255},nz(i){this.n=i>>7&1,this.z=i?0:1}},O=0;t?Zs({cpu:j,read:i=>x.read(i),write:(i,h)=>x.write(i,h),drive:s.bus??=Lt(s.drive??=new et(Uint8Array.from(atob(s.disk.image),i=>i.charCodeAt(0))),s.printer??=new Ot({on:!1})),held:()=>{let i=x?.clock?.held;return i?.up&&(x.clock.held=null),i&&(i.seen=!0),i??null},call:i=>{Ke(x,i,"the keyboard read"),Object.assign(j,{a:x.a,x:x.x,y:x.y,c:x.c,z:x.z,n:x.n,v:x.v})},loaded:(i,h,u)=>{(s.files64??=[]).push({name:i,from:h,to:u});let v=s.fileScripts?.[i];if(v){let b={script:v,from:h,to:u};p.splice(0,1/0,...p.filter(I=>I.from<b.from||I.to>b.to),b)}}}):_s({cpu:j,game:s.disk,sw:{lcRead:0},io:i=>w(x,i),file:i=>n.file(i),get files(){return n.files},put:(i,h)=>n.put(i,h),remove:i=>n.remove(i),clicks:{push:i=>x.clicks.push(x.cycles+i-O)},log(){},halted:!1});let a=(i,h)=>{let u=j.hooks.get(h);if(!u&&t&&h>=40960&&h<49152)throw new Error("a BASIC program, calling BASIC's ROM at $"+ce(h)+": not written yet in the remake");if(!u)throw new Error("no ROM routine at $"+ce(h));x=i,Object.assign(j,{a:i.a,x:i.x,y:i.y,c:i.c,z:i.z,n:i.n,v:i.v,pc:h,sp:i.sp()-2&255});let v=O=j.cycles,b=u(j);if(b==="wait")return"wait";if(i.delay+=(j.cycles-v+6)/yt*1e3,i.cycles+=j.cycles-v+6,Object.assign(i,{a:j.a&255,x:j.x&255,y:j.y&255,c:j.c,z:j.z,n:j.n}),b==="return")return b;if(b===!1&&j.pc!==h)return{to:j.pc}},p=[],m=null,y=(i,h)=>{if(!m){m=new Map;for(let u of Object.keys(i.sources)){let v=i.script(u);for(let b of Object.keys(v.labels))if(/^L[0-9A-F]{4}$/.test(b)){let I=parseInt(b.slice(1),16);(m.get(I)??m.set(I,[]).get(I)).push(u)}}}return m.get(h)??[]},E=(i,h)=>{let u=s.files64?.findLast(D=>D.from<=h&&h<=D.to)??(h>=512&&h<40960?{name:"MEMORY",from:512,to:40959}:null);if(!u)return null;let v=i.mem.slice(u.from,u.to+1),b=(s.fileScripts?.[u.name]??u.name)+"@"+ce(h),I=Rt(v,u.from,[h],e.routines,new Set,tt(ue));return i.sources[b]=Tt(I,v,u.from,{selfModified:!0}),m=null,p.push({script:b,from:u.from,to:u.to}),(s.liftedAtNeed??=[]).push(u.name+" $"+ce(h)),console.warn(`lifted at need: ${u.name} from $${ce(h)} (an entry for its scene's lift)`),b},L=new Set(Object.values(s.fileScripts??{})),C=(i,h)=>t?i.filter(u=>!L.has(u)||p.some(v=>v.script===u&&v.from<=h&&h<=v.to)):i,M=(i,h)=>{let u=C(y(i,h),h);!u.length&&t&&E(i,h)&&(u=C(y(i,h),h));let v=p.findLast(I=>u.includes(I.script)&&I.from<=h&&h<=I.to),b=u.length>1?v?.script:u[0];if(!b)throw new Error("no script has $"+ce(h));return[b,"L"+ce(h)]},S=(i,h)=>t?h>=57344?(i.mem[1]&2)!==0:h>=40960&&h<49152?(i.mem[1]&3)===3:h===115||h===121:h>=53248?!(c.read&&y(i,h).length):j.hooks.has(h)&&!y(i,h).length,A=i=>e.stir&&i?.at>=e.stir.from&&i.at<=e.stir.to,$=(i,h,u)=>{u&&i.inside++,i.emit(h),u&&i.inside--},R=i=>{let h=i.stack.pop();h.name!==i.name&&i.enter(h.name),i.pc=h.pc,h.inside&&(i.inside--,h.done?.(i)),h.after?.(i)},T=new Set(["town","restart","escape"]),N=(i,h,u,v)=>{if(h?.at==null)return v.map(I=>parseInt(I,16));let b=[];for(let I=0;I<u;I++)b.push(i.mem[h.at+3+I&65535]);return b},P=i=>i.map(h=>h.toString(16)).join(" "),W=i=>(e.unplaced?.includes(i.step)&&(delete i.x,delete i.y),i),_={chrout:[806,61898],chrin:[804,61783],getin:[810,61758],save:[818,62957]},K=(i,h)=>(u,v,b)=>{gn(u,i,v),$(u,W(G(i,[],u,void 0,void 0,q=>u.mem[q])),A(b));let I=t&&_[i],D=I&&u.mem[I[0]]|u.mem[I[0]+1]<<8;if(I&&D!==I[1]){let[q,Y]=M(u,D);u.callInside(q,Y,Z=>{xe[i]&&Z.emit(ee(i,{a:Z.a,x:Z.x,y:Z.y,c:Z.c}))},b?.at==null?void 0:b.at+2&65535);return}let z=a(u,h);if(z==="wait")return"wait";if(z?.to!==void 0)return u.stackPage(),u.stack.push({name:u.name,pc:u.pc,inside:!0,ret:b?.at==null?void 0:b.at+2&65535}),u.inside++,B["goto-engine"](u,["$"+ce(z.to)],b);xe[i]&&t&&u.emit(ee(i,{a:u.a,x:u.x,y:u.y,c:u.c}))},B={prodos:(i,h,u)=>{let v=N(i,u,3,h),[b,I,D]=v,z=I|D<<8;$(i,G("prodos",[],i,P(v)),A(u));let q={read:Z=>i.mem[Z],write:(Z,ae)=>{i.mem[Z]=ae&255}};if(b===202){let Z=i.mem[z+1],ae=n.open.get(Z),X=i.mem[z+2]|i.mem[z+3]<<8,dt=ae?Math.min(i.mem[z+4]|i.mem[z+5]<<8,ae.f.body.length-ae.at):0,ms=ae&&s.fileScripts?.[Et(e,Se=>i.mem[Se],ae.f.path,ae.at)];if(ms&&dt){let Se={script:ms,from:X,to:X+dt-1};p.splice(0,1/0,...p.filter(xs=>xs.from<Se.from||xs.to>Se.to),Se)}i.delay+=Math.ceil(dt/512)*Fs/yt*1e3}let Y=n.call(b,z,q);i.cycles+=6,Y===null&&(Y=1),i.a=Y==="quit"?0:Y,i.c=i.a?1:0,i.z=i.a?0:1,Y==="quit"&&(i.ended=!0)},stirred:i=>{for(let h of e.stir.counts)i.mem[h]=s.seed&255},hposn:K("hposn",62481),hlin:K("hlin",62778),hcolor:K("hcolor",63216),"clear-page":K("clear-page",62452),pause:K("pause",64680),home:K("home",64600),outport:K("outport",65173),"call-engine":(i,[h],u)=>{let v=parseInt(h.slice(1),16);if(S(i,v)){let D=a(i,v);if(D==="return"){R(i);return}return D}if(!t&&i.mem[v]===96){i.cycles+=6;return}let[b,I]=M(i,v);i.stack.push({name:i.name,pc:i.pc,ret:u?.at==null?void 0:u.at+2&65535}),i.enter(b,I)},"goto-engine":(i,[h],u)=>{let v=parseInt(h.slice(1),16),b=e.routines[v];if(b){if(T.has(b))return B[b](i,[],u);let I=t&&i.stack.at(-1)?.rom;I&&i.inside++;let D;try{D=B[b](i,[],u)}finally{I&&i.inside--}let z=i.stack.at(-1);if(z?.inside){let q=z.done;z.done=Y=>{q?.(Y),R(Y)}}else R(i);return D}if(S(i,v)){if(a(i,v)==="wait")return"wait";t&&ne.has(v)&&he(i),R(i);return}if(!t&&i.mem[v]===76&&!y(i,v).length)return B["goto-engine"](i,["$"+ce(i.mem[v+1]|i.mem[v+2]<<8)],u);i.enter(...M(i,v))}};t&&s.basic&&(B.sys=(i,h,u,v)=>{i.mem[122]=u&255,i.mem[123]=u>>8;let b=i.mem;Object.assign(i,{a:b[780],x:b[781],y:b[782],c:b[783]&1,z:b[783]>>1&1,n:b[783]>>7});let I=q=>{b[780]=q.a,b[781]=q.x,b[782]=q.y,b[783]=q.c|q.z<<1|(q.i??0)<<2|(q.d??0)<<3|q.v<<6|q.n<<7};if(S(i,h)){let q=a(i,h);return I(i),q}let[D,z]=M(i,h);i.stack.push({name:i.name,pc:i.pc,rom:!0,after:I}),i.enter(D,z)},B["basic-load"]=(i,[h,u=1,v=0])=>{let b=i.mem;for(let D=0;D<h.length;D++)b[512+D]=h.charCodeAt(D);Object.assign(b,{183:h.length,187:0,188:2,186:u,185:v,184:0}),Object.assign(i,{a:0,x:1,y:8}),i.basic.call("load");let I=Object.entries(s.basic).find(([,D])=>D.file===h);if(v===0&&I){se(i,I[0]),i.enter(I[0]);return}i.pc=0},an({cpu:j,read:i=>x.read(i),write:(i,h)=>x.write(i,h),evaluate:i=>{let h=x.sources[x.basic.script]?.params?.[i];if(!h)throw new Error("no parameter compiled at $"+ce(i));let[u,v,b]=h;return{value:v(x.basic),end:u,place:b}}})),t&&s.basic&&(B.error=(i,h)=>!(h instanceof rn)||!i.basic?!1:(x=i,cn({cpu:j,write:(u,v)=>{i.mem[u]=v}},h.message,i.basic.at)));let se=(i,h)=>{i.basic=new sn(i,s.basic[h]),i.basic.script=h};for(let[i,h]of Object.entries(e.routines).map(([u,v])=>[+u,v]))!B[h]&&i>=53248&&(B[h]=K(h,i)),!(B[h]||i>=48896)&&(B[h]=(u,v,b)=>{if(gn(u,h,v),T.has(h)&&u.inside){for(let X of u.stack)X.inside&&(delete X.inside,delete X.done);u.inside=0}let I=b?.at!=null?u.mem[b.at+1&65535]|u.mem[b.at+2&65535]<<8:null,D=A(b),z=e.routines[I]===h?I:parseInt(Object.entries(e.routines).find(([,X])=>X===h)[0]);h==="read-key"&&(u.mem[e.seed]=s.seed&255,u.mem[e.seed+1]=s.seed>>8);let q=ue[h]&&b?.at!=null?ue[h](X=>u.mem[X&65535],b.at+3).value:void 0;$(u,G(h,[],{a:u.a,x:u.x,y:u.y,c:u.c},q,void 0,X=>u.mem[X]),D);let[Y,Z]=M(u,z);if(h==="escape"&&b?.at!=null&&u.stack.push({name:u.name,pc:u.pc,ret:b.at+2&65535}),T.has(h)){u.enter(Y,Z),u.entered=z;return}let ae=X=>{X.mem[e.seed]=s.seed&255,X.mem[e.seed+1]=s.seed>>8};u.callInside(Y,Z,X=>{h==="read-key"&&ae(X),xe[h]&&!D&&X.emit(ee(h,{a:X.a,x:X.x,y:X.y,c:X.c}))},b?.at==null?void 0:b.at+2&65535)});B.elsewhere=(i,h)=>{let u=parseInt(h.slice(1),16),v=p.findLast(b=>b.from<=u&&u<=b.to);return v!==void 0&&v.script!==i.name&&/^L[0-9A-F]{4}$/.test(h)},B.timed=!0,B.polls=e.polls,B.reads=e.reads,t&&(B.getin=i=>{!i.clock&&!i.i&&(B.poll(i),i.polledSince=!0);let h;if(i.mem[198]?(h=i.mem[631],i.mem.copyWithin(631,632,631+i.mem[198]),i.mem[198]--):h=i.key(),i.c=0,h===void 0||h<0){i.a=i.flags(0),++i.idle>(i.polls??e.polls??200)&&!i.clock&&(i.polled=!0);return}i.a=i.flags(h),i.idle=0,i.emit(ee("getin",{a:h}))});let ne=new Set([59953,60027,60030,60033]);B.poll=i=>{B.interrupt(i),l[26]&1&&B.interrupt(i,!0)};let he=i=>{for(let h of["y","x","a"]){let u=i.stack.pop();if(u?.a===void 0||u.name!==void 0)throw new Error("the end of an interrupt with its registers not on the stack");i[h]=u.a}};t&&(B.interrupt=(i,h=!1)=>{if(i.i)return;let u=i.mem[788]|i.mem[789]<<8,v={a:i.a,x:i.x,y:i.y,n:i.n,z:i.z,c:i.c,v:i.v,d:i.d};i.vicFlags=h?241:112,h&&(i.splitLine=l[18]|(l[17]&128)<<1);try{S(i,u)?a(i,u):(i.i=1,Ke(i,u,"the interrupt routine",b=>b.stack.push({a:v.a},{a:v.x},{a:v.y})))}finally{Object.assign(i,v),i.i=0,i.vicFlags=i.splitLine=void 0}});function Ke(i,h,u,v){let b=!1;i.callInside(...M(i,h),()=>{b=!0}),v?.(i);for(let I=0;!b;I++){if(I>1e6)throw new Error(u+" at $"+ce(h)+" runs on without end");if(i.exec(i.program.steps[i.pc])==="wait")throw new Error(u+" at $"+ce(h)+" waits")}}return B.inline=(i,h)=>ue[h.words[0]]?ue[h.words[0]](u=>i.mem[u&65535],h.at+3).length:0,B.before=(i,h)=>{if(t&&i.clock&&!i.i){i.cycles>=i.clock.irq&&(i.clock.irq=Math.max(i.clock.irq+16421,i.cycles),B.interrupt(i));let D=Math.floor(i.cycles/63)%312,z=i.clock.line??D,q=l[18]|(l[17]&128)<<1;i.clock.line=D,D<z&&(s.splits=i.clock.splits??new Map,i.clock.splits=new Map),l[26]&1&&(z<=D?z<q&&q<=D:q>z||q<=D)&&B.interrupt(i,!0)}let u=h.start??h.at,v=u!=null&&i.inside===0?e.routines[u]:void 0,b=i.entered===u;if(i.entered=null,v&&!b&&!A(h)){$(i,G(v,[],{a:i.a,x:i.x,y:i.y,c:i.c},void 0,void 0,z=>i.mem[z]));let D=i.stack.at(-1);D?.name!==void 0&&!D.inside&&(D.inside=!0,D.done=z=>{xe[v]&&z.emit(ee(v,{a:z.a,x:z.x,y:z.y,c:z.c}))},i.inside++)}if(e.ticks?.find(D=>D.at===h.at&&i.name===s.fileScripts?.[D.scene])){if(i.ticking===h){i.ticking=null,i.keys[0]===-1&&i.keys.shift();return}return i.emit({step:"tick"}),i.ticking=h,"wait"}},B.setup=i=>{if(t){if(!s.io||s.io[0]>53248||s.io[1]<Qe[1]-1)throw new Error("a Commodore 64 title's io must cover $D000 to the KERNAL's keyboard tables");i.ioAt=h=>h>=53248&&h<=57343&&k(i)||h>=Qe[0]&&h<Qe[1]&&(i.mem[1]&2)!==0,Object.assign(i.mem,{0:47,1:55,153:0,154:3,185:1,186:8,648:4,646:14}),Object.assign(i.mem,{197:64,203:64,204:1,649:10,650:0,651:4,652:16,655:72,656:235}),Gs.forEach((h,u)=>{l[u]=h}),l[3328]=151,Js.forEach((h,u)=>{i.mem[788+2*u]=h&255,i.mem[789+2*u]=h>>8});for(let h=0;h<1e3;h++)i.mem[1024+h]=32,l[2048+h]=14;for(let[h,u]of Object.entries(s.load??{})){let v=s.drive.find(Uint8Array.from(h,b=>b.charCodeAt(0))).raw;i.mem.set(v.subarray(2),u)}i.io=(h,u)=>w(i,h,u),s.basic&&(Object.assign(i.mem,{205:2,206:32,207:0,647:254}),se(i,s.start));return}for(let[h,u]of Object.entries(s.load??{}))i.mem.set(n.file("/"+n.volumes[0]+"/"+h).body,u);if(s.disk.kind==="dos33"){for(let h=0;h<24;h++)i.mem.fill(160,1024+(h&7)*128+(h>>3)*40,1024+(h&7)*128+(h>>3)*40+40);for(let[h,u,v]of s.disk.loads)v&&f(i,v),i.mem.set(n.file(h).body,u);f(i,1),c.read=1,Object.assign(i.mem,{32:0,33:40,34:16,35:24,50:255}),i.delay=2500}i.io=(h,u)=>w(i,h,u)},B}var ce,Pt=U(()=>{we();$t();bt();Xs();jt();Ct();At();nn();on();ln();It();ce=s=>s.toString(16).toUpperCase().padStart(4,"0")});var wn={};F(wn,{blank:()=>_i,placed:()=>Xi,started:()=>Nt,units:()=>Ji});import{prodos as Yi}from"@moonbase-machines/apple2e";var _i,Xi,Nt,Ji,Dt=U(()=>{({blank:_i,placed:Xi,started:Nt,units:Ji}=Yi)});var bn={};F(bn,{loadTitle:()=>Ut,makeEngine:()=>Bt,read:()=>De,titleOf:()=>nt});async function De(s,e){if(s.protocol==="file:"){let n=globalThis.process.getBuiltinModule("node:fs").readFileSync(s,"utf8");return e==="json"?JSON.parse(n):n}let t=await fetch(s);if(!t.ok)throw new Error(`${s.pathname}: ${t.status}`);return e==="json"?t.json():t.text()}async function nt(s){s=new URL(s);let e={...await st(new URL("title.js",s))};for(let t of e.modules??[])e[t]=await st(new URL(t+".js",s));return e.view&&(e.viewSteps=await st(new URL("view.js",s))),e}async function Ut(s,{data:e,scenes:t=!1,fixed:n=!1}={}){s=new URL(s);let r=await nt(s);if(!yn[r.engine])return r.own=await import(new URL(r.engine+".js",s).href),{title:r,scripts:{},disk:null,folder:s};let o=Object.fromEntries(await Promise.all(r.scripts.map(async f=>[f,t?await De(new URL(f+".scene",s),"text"):await st(new URL(`compiled/${n&&r.fixed?.[f]||f}.js`,s))]))),c=await De(new URL(e),"json");return{title:r,scripts:o,disk:c,folder:s}}function Bt(s,e){let t={...s.disk?.kind==="prodos"?Nt(s.disk):{},...s.memory},n=new Ce({routines:yn[s.engine](s),scripts:e,start:s.start,label:s.startLabel,memory:t});return n.title=s,n}var yn,st,it=U(()=>{ut();Ze();Pt();Dt();yn={vector:vt,card:Mt};st=async s=>(await import(s.href)).default});var Nn={};F(Nn,{Speaker:()=>me});var cr,me,ot=U(()=>{cr=`
3
9
  class SpeakerProcessor extends AudioWorkletProcessor {
4
10
  constructor() { super(); this.queue = []; this.at = 0; this.level = 0; this.port.onmessage = e => this.queue.push(e.data); }
5
11
  process(inputs, outputs) {
@@ -13,21 +19,14 @@ class SpeakerProcessor extends AudioWorkletProcessor {
13
19
  }
14
20
  }
15
21
  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(`
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) => {
23
- ${a.map(h=>" "+h).join(`
22
+ `,me=class{constructor(){this.context=null,this.node=null,this.level=0,this.from=null}async start(){this.context||(this.context=new AudioContext,await this.context.audioWorklet.addModule(URL.createObjectURL(new Blob([cr],{type:"text/javascript"}))),this.node=new AudioWorkletNode(this.context,"speaker"),this.node.connect(this.context.destination),this.rate=this.context.sampleRate,this.context.state!=="running"&&await this.context.resume())}feed(e,t){if(!this.node)return;this.from===null&&(this.from=t);let n=1020484/this.rate,r=Math.floor((t-this.from)/n);if(r<=0)return;let o=new Float32Array(r),c=0;for(let f=0;f<r;f++){let l=this.from+(f+1)*n;for(;c<e.length&&e[c]<=l;)this.level=this.level?0:.25,c++;o[f]=this.level}this.from+=r*n,this.node.port.postMessage(o,[o.buffer])}}});var Dn={};F(Dn,{Machine:()=>fr});import{machine as lr}from"@moonbase-machines/apple2e";var fr,Un=U(()=>{({Machine:fr}=lr)});var Bn={};F(Bn,{COLORS:()=>dr,colors:()=>Gt,paint:()=>pr,paintHires:()=>Zt,paintText:()=>at,rowStart:()=>ur,screen:()=>mr,textRow:()=>xr});import{screen as hr}from"@moonbase-machines/apple2e";var dr,Gt,pr,Zt,at,ur,mr,xr,ct=U(()=>{({COLORS:dr,colors:Gt,paint:pr,paintHires:Zt,paintText:at,rowStart:ur,screen:mr,textRow:xr}=hr)});var zn={};F(zn,{bounds:()=>kr,document:()=>wr,elements:()=>Qt});import{svg as gr}from"@moonbase-machines/vector";var kr,wr,Qt,es=U(()=>{({bounds:kr,document:wr,elements:Qt}=gr)});var Fn={};F(Fn,{C64:()=>br});import{machine as yr}from"@moonbase-machines/c64";var br,qn=U(()=>{({C64:br}=yr)});var Kn={};F(Kn,{keyboard:()=>Sr,pace:()=>Er,painter:()=>$r});import{browser as vr}from"@moonbase-machines/c64";var Sr,Er,$r,Wn=U(()=>{({keyboard:Sr,pace:Er,painter:$r}=vr)});var Hn={};F(Hn,{SID:()=>ts});import{sid as jr}from"@moonbase-machines/c64";var ts,ss=U(()=>{({SID:ts}=jr)});var Vn={};F(Vn,{ROM_CHOICES:()=>Or,c64Roms:()=>Lr,typed:()=>Ar});import{start as Cr}from"@moonbase-machines/c64";var Or,Lr,Ar,Yn=U(()=>{({ROM_CHOICES:Or,c64Roms:Lr,typed:Ar}=Cr)});var _n={};F(_n,{SECTORS:()=>Tr,add:()=>Ir,make:()=>Mr,petsciiName:()=>Pr,read:()=>Nr});import{d64 as Rr}from"@moonbase-machines/c64";var Tr,Ir,Mr,Pr,Nr,Xn=U(()=>{({SECTORS:Tr,add:Ir,make:Mr,petsciiName:Pr,read:Nr}=Rr)});var ns={};F(ns,{play:()=>Dr});async function Dr(s){s.stage.innerHTML='<svg id="vector" viewBox="0 0 140 192" preserveAspectRatio="none"></svg><canvas id="screen" width="560" height="384" tabindex="0"></canvas>';let e=s.stage.querySelector("canvas"),t=e.getContext("2d"),n=s.stage.querySelector("#vector");return s.game.kind==="c64"?Br(s,{canvas:e,layer:n,speaker:new me}):Ur(s,{canvas:e,ctx:t,layer:n,speaker:new me})}async function Ur({game:s,saves:e,roms:t,status:n,control:r,$:o},{canvas:c,ctx:f,layer:l,speaker:d}){let[{Machine:g},{placed:k},{screen:w},{shapes:x},{elements:j}]=await Promise.all([Promise.resolve().then(()=>(Un(),Dn)),Promise.resolve().then(()=>(Dt(),wn)),Promise.resolve().then(()=>(ct(),Bn)),Promise.resolve().then(()=>(_e(),Ts)),Promise.resolve().then(()=>(es(),zn))]);r('<label><input type="checkbox" id="vectors"> Draw the pictures as vectors</label>');let O=o("vectors"),a=e.data,p=null,m=null;if(t?.apple)try{p=t.apple,m=e.disks(k(a,new Map(await Promise.all(s.images.map(async N=>[N,await t.image(N)])))))}catch{p=null}let y=new g(a,{log:(...N)=>console.log(...N),...p?{roms:p,disks:m}:{}});console.log(p?"line 1: Apple's ROMs, the disks booted":"line 2: moonbase's machine"),e.keep(p?e.driveFiles(y,m):y.disk),y.diskTime=!0;let E=!1,L=0;function C(){let N=(P,W)=>{e:for(let _=16384;_<32768-P.length;_++){for(let K=0;K<P.length;K++)if(P[K]!==null&&W[_+K]!==P[K])continue e;return _}return-1};for(let P of[y.aux,y.main]){let W=N([32,null,null,32,null,null,238,null,null,76],P),_=N([162,0,160,224,24,96],P),K=N([141,null,null,142,null,null,140,null,null,173,null,null,201,128,240],P);if(!(W<0||_<0||K<0)){y.cpu.hooks.set(W,B=>(B.read16(96)===57344&&(l.insertAdjacentHTML("beforeend",j(x(se=>y.read(se),57344),{background:L})),y.marking=1),!1)),y.cpu.hooks.set(_,()=>(y.marking=0,!1)),y.cpu.hooks.set(K,B=>(B.a!==128&&(L=B.a&15),l.innerHTML="",y.owner.fill(0),!1)),E=!0;return}}}let M=new Uint8ClampedArray(560*384*4),S=new ImageData(M,560,384),A=new Uint8Array(26880),$="";function R(){y.halted||y.runCycles(17030);let N=`text ${y.sw.text} page2 ${y.sw.page2} hires ${y.sw.hires} dhires ${y.sw.dhires}`;N!==$&&(console.log("screen:",N,"at pc $"+y.cpu.pc.toString(16),"cycles",y.cpu.cycles),$=N),d.feed(T?y.clicks:[],y.cpu.cycles),y.clicks.length=0,E||C();let P=y.sw.text;w(y,M,{cols:A,owner:O.checked&&l.innerHTML?y.owner:null}),f.putImageData(S,0,0),l.style.visibility=O.checked&&!P?"visible":"hidden",n.textContent=y.halted?"The game has stopped: "+y.halted+".":y.idle>2e3?"Waiting for a key.":"Running.",requestAnimationFrame(R)}c.addEventListener("pointerdown",()=>c.focus());let T=!0;return{run(){c.focus(),R()},press(N){console.log("key",N,"at pc $"+y.cpu.pc.toString(16)),y.press(N)},start(){d.start()},sound(N){T=N},soundOn:!0,engine:y}}async function Br(s,{canvas:e,layer:t,speaker:n}){let{game:r,saves:o,roms:c,studies:f,status:l,printer:d}=s,[{C64:g},{keyboard:k,painter:w},{SID:x},{c64Roms:j,typed:O},{add:a}]=await Promise.all([Promise.resolve().then(()=>(qn(),Fn)),Promise.resolve().then(()=>(Wn(),Kn)),Promise.resolve().then(()=>(ss(),Hn)),Promise.resolve().then(()=>(Yn(),Vn)),Promise.resolve().then(()=>(Xn(),_n))]),p=await j(c?.choice??null,c?.load);if(!p)return l.textContent="Commodore's ROMs, asked for, are not here.",null;s.chargen=p.chargen;let m=new g(r,p,{log:(...P)=>console.log(...P),printer:d});o.drive(m.drive);let y=P=>Uint8Array.from(atob(P),W=>W.charCodeAt(0));for(let[P,W]of Object.entries(f??{}))m.drive.saved.set(P,y(W));t.style.display="none";let E=w(e),L=null,C=0,M=!0,S={keydown:[],keyup:[]},A=k(m,{log:!0,listen:(P,W)=>S[P].push(W)}),$=0,R=null,T=performance.now();function N(){let P=Math.min(2,Math.floor((performance.now()-T)/20)-$);for(let W=0;W<P;W++){if(m.runFrame(),$++,A.frame(),n.node&&M){R||(R=new x(n.rate));let _=Math.round(19656/985248*n.rate),K=m.cpu.cycles-19656,B=R.render(_,m.sidWrites.map(([se,ne,he])=>[Math.floor((se-K)/19656*_),ne,he]));n.node.port.postMessage(B,[B.buffer])}m.sidWrites.length=0}$>=120&&L===null&&!C&&(L=O(m,r),C=1),L!==null&&!m.ram[198]&&(L=m.type(L),L.length||(L=null)),E(m.vic.frame),l.textContent=m.halted?"The game has stopped: "+m.halted+".":"Running.",requestAnimationFrame(N)}return{run(){e.focus(),N()},press(P){m.type(String.fromCharCode(P))},key(P){for(let W of S[P.type])W(P)},start(){n.start()},sound(P){M=P},soundOn:!0,engine:m,diskImage:()=>a(m.drive.image,[...m.drive.saved].map(([P,W])=>({name:P,data:W})))}}var is=U(()=>{ot()});import{rom as zr}from"@moonbase-machines/c64";var fc,Jn,Gn=U(()=>{({install:fc,standIn:Jn}=zr)});import{colors as Fr}from"@moonbase-machines/apple2e";var Zn,pc,oe,Qn=U(()=>{({COLORS:Zn,NAMES:pc,rgb:oe}=Fr)});import{font as qr}from"@moonbase-machines/charset";var rs,ei=U(()=>{({FONT:rs}=qr)});var ti={};F(ti,{View:()=>Ue});var Kr,H,V,lt,Wr,os,Hr,Ue,as=U(()=>{Qn();_e();Ye();Ze();es();Le();Me();ei();ct();Kr="http://www.w3.org/2000/svg",H=s=>s*4,V=s=>s*2,lt='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',Wr='ui-monospace, Menlo, Consolas, "Liberation Mono", monospace',os=["[","\\","]","^"],Hr={"[":"\u2190","\\":"\u2192","]":"\u2193","^":"\u2191"},Ue=class{constructor(e,{disk:t,volume:n,engine:r,extra:o={},press:c}){this.svg=e,this.engine=r,this.extra=o,this.press=c,e.setAttribute("viewBox","0 0 560 384"),this.disk=t.volumes[n],this.pictures=new Map;for(let[g,k]of Object.entries(t.volumes[n]))if(/^PICS\d$/.test(g))for(let w of Oe(Uint8Array.from(atob(k.data),x=>x.charCodeAt(0))))this.pictures.set(w.name,w.shapes);let f=r.title.map;this.vars=f.vars;let l={...Hr,...f.modern};for(let g=0;g<10;g++)l[String.fromCharCode(128+g)]=String(g);let d=new RegExp("["+Object.keys(l).map(g=>"\\"+g).join("")+"]","g");this.modern=g=>g.replace(d,k=>l[k]),this.tables=new Map(Ve(Ne(f,t.volumes[n]),f.objects).map(g=>[g.address,g.objects])),this.items=[],this.pen={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10},this.window={color:0,bottom:116},this.shapes=[],this.spaceBar=null,this.layer=this.el("g"),e.append(this.layer),this.textScreen=this.el("g",{display:"none"}),e.append(this.textScreen),this.prompt=this.el("g"),e.append(this.prompt),this.textPen=Ie(),this.textCells=ke(),this.rect(0,0,140,192,15,this.layer)}el(e,t={},n){let r=document.createElementNS(Kr,e);for(let[o,c]of Object.entries(t))r.setAttribute(o,c);return n?.append(r),r}rect(e,t,n,r,o,c=this.layer){return this.el("rect",{x:H(e),y:V(t),width:H(n),height:V(r),fill:oe(o),"shape-rendering":"crispEdges"},c)}add(e,t,n,{covers:r=!0,left:o=0,right:c=139}={}){return r&&(this.items=this.items.filter(f=>f.top>=e&&f.bottom<=t&&f.left>=o&&f.right<=c?(f.el.remove(),!1):!0)),this.items.push({top:e,bottom:t,left:o,right:c,el:n}),this.layer.append(n),n}remove(e){e.remove(),this.items=this.items.filter(t=>t.el!==e)}fill(e,t,n,r=!0){let o=this.el("g");this.rect(0,e,140,t-e+1,n,o),r&&(this.rect(0,e,1,t-e+1,15,o),this.rect(139,e,1,t-e+1,15,o)),this.add(e,t,o)}whiteLines(e){this.add(e,e+1,this.rect(0,e,140,2,15,null))}snapshot(e){let t=this.engine.mem;return e.layout=t[this.vars.layout],e.difficulty=t[this.vars.difficulty],e.step==="text"&&(e.words=ye(e.words,t)),e.step==="span"&&(e.row=t[this.vars.zero+2]),e}apply(e){this.difficulty=e.difficulty,this.spaceBar?.erase&&!this.waiting()&&(this.fill(this.spaceBar.y,this.spaceBar.y+10,5),this.spaceBar.el.remove(),this.spaceBar=null);let t=this.extra[e.step]??(typeof this[e.step]=="function"?this[e.step]:void 0);t&&t.call(this,e)}waiting(){return this.engine.waitingOn}"text-screen"(){this.textCells=ke(),this.textScreen.replaceChildren(),this.rect(0,0,140,192,0,this.textScreen),this.textScreen.setAttribute("display","inline"),this.layer.setAttribute("display","none")}show(){this.textScreen.setAttribute("display","none"),this.layer.setAttribute("display","inline")}textCell(e,t,n,r){this.textCells[e][t].el?.remove();let c=this.el("g",{"data-cell":e*40+t},this.textScreen),f=t*14,l=e*16,d=r?"#000":"#fff";if(r&&this.el("rect",{x:f,y:l,width:14,height:16,fill:"#fff","shape-rendering":"crispEdges"},c),this.oldStyle){let g=rs[n.charCodeAt(0)-32]??rs[0],k="";for(let w=0;w<5;w++)for(let x=0;x<7;x++)g[w]>>x&1&&(k+=`M${f+2+w*2} ${l+x*2}h2v2h-2z`);k&&this.el("path",{d:k,fill:d},c)}else if(n!==" "){let g=this.el("text",{x:f+7,y:l+12,fill:d,"font-family":Wr,"font-size":15,"text-anchor":"middle"},c);g.textContent=n}this.textCells[e][t]={ch:n,inverse:r,el:c}}splash(){let e=this.disk.TITLE;if(!e)return;let t=Uint8Array.from(atob(e.data),o=>o.charCodeAt(0)),n=Gt(t.subarray(0,8192),t.subarray(8192)),r=[];for(let o=0;o<192;o++)r.push(Array.from(n.subarray(o*140,o*140+140)));this.clear(),this.add(0,191,this.el("image",{href:this.image(r),x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))}"clear-screen"(){this.clear(),this.add(0,191,this.rect(0,0,140,192,0,null))}clear(){for(let e of this.items)e.el.remove();this.items=[]}"keep-screen"(){this.kept={items:this.items,pen:{...this.pen},window:{...this.window},shapes:this.shapes,spaceBar:this.spaceBar};for(let e of this.items)e.el.remove();this.items=[],this.spaceBar=null,this["clear-screen"]()}"put-screen"(){if(!this.kept)return;this.clear();let e=this.kept;this.kept=null;for(let t of e.items)this.layer.append(t.el);Object.assign(this,{items:e.items,pen:e.pen,window:e.window,shapes:e.shapes,spaceBar:e.spaceBar})}box({a:e,x:t,y:n,layout:r}){let[o,c,f]=ge[r]??ge[50];if(e!==128&&t!==128&&n!==128){for(let l of this.items)l.el.remove();this.items=[]}if(e!==128){let l=this.el("g");this.rect(1,1,138,o-1,e,l),this.el("rect",{x:H(1)+2,y:V(1)+1,width:H(138)-4,height:V(o-2)-2,fill:"none",stroke:"black","stroke-width":4},l),this.add(1,o-1,l,{left:1,right:138}),this.window={color:e,bottom:o},this.shapes=[]}t!==128&&(this.whiteLines(c),this.fill(c+2,f-1,t)),n!==128&&(this.whiteLines(f),this.fill(f+2,189,n))}panel({n:[e]}){let t=Ae[e];if(t){this.whiteLines(t.rows[0]),this.fill(t.rows[0]+2,t.rows[1],t.fill);for(let n of t.more??[])this.whiteLines(n);Object.assign(this.pen,{paper:t.paper,ink:t.ink,centre:!0,spacing:1,gap:t.gap,y:t.y})}}scroll(){let o=this.scrolling,c=(g,k,w)=>{let x="scroll-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:H(g),y:V(19)-1,width:H(k-g),height:V(97)+1},this.el("clipPath",{id:x},this.svg)),this.el("g",{"clip-path":`url(#${x})`},w)},f=(g,k)=>this.items.filter(w=>w!==o?.item&&w.top<=115&&w.bottom>=19&&w.left<=k&&w.right>=g);if(o?.item.el.isConnected&&this.items.at(-1)===o.item){let g=c(129.5,136.5,this.el("g",{transform:`translate(${H(7*o.n)} 0)`},o.moved));for(let k of f(129.5,129.5+7))g.append(k.el.cloneNode(!0));o.n++,o.moved.setAttribute("transform",`translate(${H(-7*o.n)} 0)`);return}let l=c(3.5,129.5),d=this.el("g",{transform:`translate(${H(-7)} 0)`},l);this.rect(3.5,19,1120,97,this.window.color,d);for(let g of f(3.5,139))d.append(g.el.cloneNode(!0));this.add(19,115,l,{left:4,right:129}),this.scrolling={item:this.items.at(-1),moved:d,n:1}}"shift-down"({left:e,right:t,top:n,bottom:r,by:o}){let c=this.shifting,f=(k,w,x)=>{let j="shift-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:H(e),y:V(k),width:H(t-e+1),height:V(w-k)},this.el("clipPath",{id:j},this.svg)),this.el("g",{"clip-path":`url(#${j})`},x)},l=(k,w)=>this.items.filter(x=>x!==c?.item&&x.top<=w&&x.bottom>=k&&x.left<=t&&x.right>=e);if(c?.item.el.isConnected&&this.items.at(-1)===c.item){let k=f(n,n+o,this.el("g",{transform:`translate(0 ${V(-o*c.n)})`},c.moved));for(let w of l(n,n+o-1))k.append(w.el.cloneNode(!0));c.n++,c.moved.setAttribute("transform",`translate(0 ${V(o*c.n)})`);return}let d=f(n+o,r+o+1),g=this.el("g",{transform:`translate(0 ${V(o)})`},d);this.rect(e,n-o*60,t-e+1,r-n+1+o*61,this.window.color,g);for(let k of l(n,r))g.append(k.el.cloneNode(!0));this.add(n+o,r+o,d,{left:e,right:t}),this.shifting={item:this.items.at(-1),moved:g,n:1}}paint(e,t,n,r){this.hide(t,n,r,r);let o=this.painted;if(o?.el.isConnected&&o.color===e&&o.left===t&&o.right===n&&o.bottom===r-1){o.bottom=r,o.el.setAttribute("height",V(r-o.top+1));let f=this.items.find(l=>l.el===o.el);this.items=this.items.filter(l=>l!==f&&l.top>=o.top&&l.bottom<=r&&l.left>=t&&l.right<=n?(l.el.remove(),!1):!0),f&&(f.bottom=r);return}let c=this.add(r,r,this.rect(t,r,n-t+1,1,e,null),{left:t,right:n});this.painted={el:c,color:e,left:t,right:n,top:r,bottom:r}}span({a:e,x:t,y:n,row:r}){this.paint(e&15,t,n,r)}dot({a:e,x:t,y:n}){this.paint(e&15,t,t,n)}"white-lines"({y:e}){this.whiteLines(e)}"fill-rows"({a:e,x:t,y:n}){this.fill(n,n+t-1,e)}picture({words:e}){let t=this.pictures.get(e.toUpperCase().replace(/_/g," "));if(!t)return;let n="window-"+this.window.bottom;this.clips??=new Set,this.clips.has(n)||(this.clips.add(n),this.el("rect",{x:0,y:0,width:H(140),height:V(this.window.bottom)},this.el("clipPath",{id:n},this.svg)));let r=this.el("g",{"clip-path":`url(#${n})`}),o=this.el("g",{transform:"scale(4 2)"},r);o.innerHTML=Qt(t,{crisp:!1}),this.add(1,this.window.bottom-1,r,{covers:!1,left:1,right:138}),this.shapes=this.shapes.concat(t),this.picturesShapes=t}objects({table:e}){this.table=parseInt(e.slice(1),16)}object({a:e,x:t,y:n},r="whole"){let o=r==="keep",c=r==="whole",f=this.tables.get(this.table);if(e<2){this.kept?.isConnected&&this.remove(this.kept),this.kept=null;return}let l=f?.find(x=>x.number===e);if(!l)return;let d=l.rows.map(x=>x.map(j=>!c&&j===l.clear?void 0:j)),g=t+l.width-1,k=n+l.height-1;c&&this.hide(t,g,n,k);let w=this.el("image",{href:this.image(d),x:H(t),y:V(n),width:H(l.width),height:V(l.height),preserveAspectRatio:"none",style:"image-rendering: pixelated"});this.add(n,k,w,{covers:c,left:t,right:g}),o&&(this.kept=w),c&&(this.items.at(-1).whole={x:t,y:n,rows:d})}hide(e,t,n,r){for(let o of[...this.items]){let c=o.whole;if(!c||c.x>t||c.x+c.rows[0].length-1<e||c.y>r||c.y+c.rows.length-1<n)continue;let f=!1,l=c.rows.map((d,g)=>d.map((k,w)=>{let x=c.x+w,j=c.y+g;if(k!==void 0&&x>=e&&x<=t&&j>=n&&j<=r){f=!0;return}return k}));if(f){if(l.every(d=>d.every(g=>g===void 0))){this.remove(o.el);continue}o.el.setAttribute("href",this.image(l)),c.rows=l}}}image(e){let t=document.createElement("canvas");t.width=e[0].length,t.height=e.length;let n=t.getContext("2d"),r=n.createImageData(t.width,t.height);return e.forEach((o,c)=>o.forEach((f,l)=>{if(f===void 0)return;let[d,g,k]=Zn[f];r.data.set([d,g,k,255],(c*t.width+l)*4)})),n.putImageData(r,0,0),t.toDataURL()}"object-keep"(e){this.object(e,"keep")}"object-mode"(e){this.object(e,"clear")}"key-at"({a:e,x:t,y:n}){this.pen.x=t,this.pen.y=n,this.key({a:e})}key({a:e}){let t=ie(e);this.cap(e,this.pen.x,this.pen.y,this.layer,!0,void 0,Math.max(4,t)+4),this.pen.x+=1+(t<4?4-t:0)+1+t+3}cap(e,t,n,r,o,c,f){let l={"\r":"RETURN","\x7F":"DELETE"}[e]??e,d=f??(l.length>1?32:7),g=this.el("g",c!==void 0?{class:"key","data-key":c}:{});if(this.el("rect",{x:H(t),y:V(n-2),width:H(d),height:V(11),rx:3,fill:oe(1),stroke:oe(13),"stroke-width":3},g),this.oldStyle){let k=0;for(let w of l)k+=ie(w)+1;this.glyphs(g,l,t+Math.max(1,Math.round((d-k+1)/2)),n,15)}else{let k=this.el("text",{x:H(t+d/2),y:V(n+7),fill:oe(15),"font-family":lt,"font-size":l.length>1?13:16,"font-weight":600,"text-anchor":"middle"},g);k.textContent=this.modern(l)}return o?(this.add(n-2,n+8,g,{covers:!1,left:t,right:t+d}),this.items.at(-1).cap=!0):r.append(g),g}text({words:e}){if(this.textScreen.getAttribute("display")!=="none"){for(let t of Te(e,this.textPen))this.textCells[t.row]?.[t.col]&&this.textCell(t.row,t.col,t.ch,t.inverse);return}for(let t of Re(e,this.pen)){let{top:n,tall:r}=t,o=r?32:19,c=t.chars.filter(w=>w.ch.charCodeAt(0)>=32);if(c.length){let w=Math.min(...c.map(O=>O.x)),x=Math.max(...c.map(O=>O.x+ie(O.ch)))-1,j=Math.min(9,t.height??9)*(r?2:1);this.add(n,n+j-1,this.rect(w,n,x-w+1,j,t.paper,null),{left:w,right:x})}let f=this.el("g",{"font-family":lt,"font-size":o,"font-weight":r?700:500}),l=null,d=139,g=0,k=()=>{if(!l)return;if(d=Math.min(d,l.x),g=Math.max(g,l.x+l.width),this.oldStyle){this.glyphs(f,l.chars,l.x,n,t.ink,r,t.paper),l=null;return}let w=this.el("text",{y:V(n+(r?15:7)),"data-x":H(l.x),"data-width":H(l.width)},f);for(let x of l.chars){let j=this.el("tspan",{fill:oe(x.ink??t.ink)},w);j.textContent=this.modern(x.ch)}l=null};for(let w of t.chars){if(w.ch.charCodeAt(0)<=32){k();continue}l??={x:w.x,width:0,chars:[]},l.chars.push(w),l.width=w.x+ie(w.ch)-l.x}k(),f.childNodes.length&&(this.add(n,n+(r?16:8),f,{covers:!1,left:d,right:g}),this.fit(f))}}fit(e){for(let t of e.querySelectorAll("text[data-width]")){let n=t.getComputedTextLength();n>0&&t.setAttribute("transform",`translate(${t.dataset.x} 0) scale(${t.dataset.width/n} 1)`)}}glyphs(e,t,n,r,o,c=!1,f){let l=typeof t=="string"?[...t].map(k=>({ch:k})):t,d=c?2:1,g=new Map;for(let k of l){let w=ie(k.ch),x=k.ink??o;f!==void 0&&this.rect(n,r,w,9*d,f,e);let j=g.get(x)??"";for(let[O,a]of Xe(k.ch))j+=`M${H(n+O)} ${V(r+a*d)}h4v${2*d}h-4z`;g.set(x,j),n+=w+1}for(let[k,w]of g)w&&this.el("path",{d:w,fill:oe(k)},e);return n}write(e,t,n,r,o=15){if(this.oldStyle)return this.glyphs(e,t,n,r,o);let c=this.el("g",{"font-family":lt,"font-size":19,"font-weight":500,fill:oe(o)},e);for(let f of t.split(" ")){if(f){let l=0;for(let g of f)l+=ie(g)+1;let d=this.el("text",{y:V(r+7),"data-x":H(n),"data-width":H(l-1)},c);d.textContent=this.modern(f),n+=l}n+=ie(" ")+1}return this.fit(c),n}line({x0:e,x1:t,y0:n,y1:r,color:o}){this.add(Math.min(n,r),Math.max(n,r),this.el("line",{x1:H(e+.5),y1:V(n+.5),x2:H(t+.5),y2:V(r+.5),stroke:oe(o),"stroke-width":3,"stroke-linecap":"round"}),{covers:!1,left:Math.min(e,t),right:Math.max(e,t)})}rectangle({a:e,x:t,y:n,width:r,height:o}){this.solid(e,t,n,r+1,o)}"rectangle-outline"({a:e,x:t,y:n,width:r,height:o}){let c=r+1,f=o+1;this.add(n,n+f-1,this.el("rect",{x:H(t)+2,y:V(n)+1,width:H(c)-4,height:V(f)-2,fill:"none",stroke:oe(e),"stroke-width":3}),{covers:!1,left:t,right:t+c-1})}solid(e,t,n,r,o){this.add(n,n+o-1,this.rect(t,n,r,o,e,null),{left:t,right:t+r-1})}prompts(){this.prompt.replaceChildren();let e=this.engine,t=e.waitingOn;if(!t)return;let n=t.words?.[0]??t.name;if(n==="wait"||n==="wait-erase"||n==="wait-or-escape"){let r=(e.mem[this.vars.layout]&15)===1?178:170,o=this.el("g",{class:"key","data-key":32},this.prompt);if(this.el("rect",{x:H(46),y:V(r),width:H(47),height:V(11),rx:4,fill:oe(1),stroke:oe(13),"stroke-width":3},o),this.oldStyle)this.glyphs(o,"SPACE BAR",48,r+2,15);else{let c=this.el("text",{x:H(69.5),y:V(r+8),fill:oe(15),"font-family":lt,"font-size":15,"font-weight":600,"text-anchor":"middle"},o);c.textContent="SPACE BAR"}this.spaceBar={y:r,erase:n==="wait-erase",el:o}}else if(n==="ask"||n==="ask-mode"||n==="ask-escape"){this.rect(1,162,138,28,5,this.prompt);let r=e.askMode,o=[];if(r===128)os.forEach((f,l)=>o.push([f,[8,21,10,11][l]]));else if(r>=177&&r<186)for(let f=49;f<=(r&127);f++)o.push([String.fromCharCode(f),f]);else for(let f=65;f<=(r&95);f++)o.push([String.fromCharCode(f),f]);let c=(f,l,d)=>this.write(this.prompt,f,l,d);if(e.asked===null)c("Press",4,166),o.forEach(([f,l],d)=>{d===o.length-1&&r!==128&&o.length>1&&c("or",31+10*d,166),this.cap(f,31+10*d+(d===o.length-1&&r!==128&&o.length>1?10:0),166,this.prompt,!1,l)}),r===128&&[[58,62],[74,62],[66,71],[66,53]].forEach(([f,l],d)=>this.cap(os[d],f,l,this.prompt,!1,o[d][1]));else{let[f]=o[e.asked.place];this.cap(f,31+10*e.asked.place,166,this.prompt,!1),c("Press",4,179),this.cap("\r",31,179,this.prompt,!1,13),c("or",67,179),this.cap("\x7F",78,179,this.prompt,!1,127),r===128&&this.cap(os[e.asked.place],[58,74,66,66][e.asked.place],[62,62,71,53][e.asked.place],this.prompt,!1)}}}}});var si={};F(si,{CardView:()=>Be});function Yr(s,{top:e}){for(let t=0;t<e;t++)for(let n=0;n<560;n++){let r=(t*560+n)*4;if(s[r]<200||s[r+1]<200||s[r+2]<200)return!1}return!0}function _r(s,{top:e,bottom:t,move:[n,r],by:o}){for(let c=e;c<=t;c++){let f=c*560*4;s.copyWithin(f+(n+o)*4,f+n*4,f+r*4),o<0?s.fill(255,f+(r+o)*4,f+r*4):s.fill(255,f+n*4,f+(n+o)*4)}}var Vr,Be,cs=U(()=>{ct();Vr="http://www.w3.org/2000/svg",Be=class{constructor(e,{engine:t,inset:n=null}){this.svg=e,this.engine=t,this.inset=n,this.insetOn=!1,this.banded=!1,e.setAttribute("viewBox","0 0 560 384"),this.canvas=document.createElement("canvas"),this.canvas.width=560,this.canvas.height=384,this.image=document.createElementNS(Vr,"image");for(let[r,o]of Object.entries({x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(r,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine.mem,t=this.engine.title.screen,n=this.canvas.getContext("2d"),r=n.createImageData(560,384);if(t.text)at(r.data,e,e,!1,[0,24]);else{let o=t.page2?16384:8192;Zt(r.data,e.subarray(o,o+8192)),t.mixed&&at(r.data,e,e,!1,[20,24])}this.banded=this.insetOn&&!!this.inset&&Yr(r.data,this.inset),this.banded&&_r(r.data,this.inset),n.putImageData(r,0,0),this.image.setAttribute("href",this.canvas.toDataURL())}}});import{paint as Xr}from"@moonbase-machines/c64";var ni,ii=U(()=>{({paint:ni}=Xr)});import{vic as Jr}from"@moonbase-machines/c64";var ze,Rc,ls,Tc,Ic,Fe,ri=U(()=>{({HEIGHT:ze,LEFT:Rc,PALETTE:ls,TOP:Tc,VIC:Ic,WIDTH:Fe}=Jr)});var oi={};F(oi,{C64View:()=>qe});var Gr,qe,fs=U(()=>{ii();ri();Gr="http://www.w3.org/2000/svg",qe=class{constructor(e,{engine:t,chargen:n}){this.svg=e,this.engine=t,this.chargen=n,e.setAttribute("viewBox",`0 0 ${Fe*2} ${ze*2}`),this.canvas=document.createElement("canvas"),this.canvas.width=Fe,this.canvas.height=ze,this.image=document.createElementNS(Gr,"image");for(let[r,o]of Object.entries({x:0,y:0,width:Fe*2,height:ze*2,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(r,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine,t=ni(e.mem,e.title.chip,this.chargen,this.vic,e.title.splits),n=this.canvas.getContext("2d"),r=n.createImageData(Fe,ze);for(let o=0;o<t.length;o++){let[c,f,l]=ls[t[o]];r.data.set([c,f,l,255],o*4)}n.putImageData(r,0,0),this.svg.style.background=`rgb(${ls[t[0]].join(",")})`,this.image.setAttribute("href",this.canvas.toDataURL())}}});var ft={};F(ft,{play:()=>Zr});async function Zr(s){let{title:e,scripts:t,game:n,stage:r,status:o,fail:c,saves:f,$:l}=s,d=n.kind==="c64";r.innerHTML=`<svg id="screen" preserveAspectRatio="xMidYMid meet" tabindex="0" aria-label="The game's screen"></svg>`,s.control('<label><input type="checkbox" id="old-style"> Old style text</label>');let g=l("screen"),k=e.viewSteps??{},w=s.chargen=d?s.roms?.chargen??Jn().chargen:null;s.printer&&(e.printer=s.printer),e.disk=f.data,d&&f.drive(e.drive=new et(Uint8Array.from(atob(n.image),i=>i.charCodeAt(0))));let x=Bt(e,t);e.files&&f.keep(e.files);let j=[],O=l("old-style"),a=[],p={get(){try{return localStorage.getItem("remake-old-style")==="1"}catch{return!1}},set(i){try{localStorage.setItem("remake-old-style",i?"1":"0")}catch{}}};O.checked=p.get()||new URLSearchParams(location.search).has("old-style");let m=null,y=()=>{g.replaceChildren();let i=d?new qe(g,{engine:x,chargen:w}):e.engine==="card"?new Be(g,{engine:x,inset:s.mini?e.inset:null}):new Ue(g,{disk:n,volume:Object.keys(n.volumes)[0],engine:x,extra:k});return i.oldStyle=O.checked,m?.(i),i},E=y();x.on(i=>j.push(E.snapshot({...i})));let L=l("mini");if(e.inset&&s.mini){L.parentElement.hidden=!1;try{L.value=localStorage.getItem("remake-mini")??""}catch{}let{top:i,bottom:h,view:[u,v]}=e.inset,b=document.createElement("div");b.className="mini",b.hidden=!0,Object.assign(b.style,{left:`${u/5.6}%`,top:`${i/3.84}%`,width:`${(v-u)/5.6}%`,height:`${(h-i+1)/3.84}%`}),g.parentElement.append(b);let I=await s.mini(b,{memory:()=>x.mem});m=z=>{z.insetOn=!!L.value;let q=z.prompts.bind(z);z.prompts=()=>{q(),b.hidden=!(L.value&&z.banded)}},m(E);let D=()=>{E.insetOn=!!L.value,I.mode(L.value),E.prompts()};L.addEventListener("change",()=>{try{localStorage.setItem("remake-mini",L.value)}catch{}D()}),D()}O.addEventListener("change",()=>{p.set(O.checked),E=y();for(let i of a)E.apply(i);E.prompts()});let C=x.timed?new me:null,M=!!C,S=()=>{d||C?.feed(M?x.clicks:[],x.cycles),x.clicks.length=0},A=e.map?.vars??{sound:0,soundOn:0},$=null,R=(i,h,u)=>{if(!(x.mem[A.sound]&A.soundOn))return;$??=new AudioContext;let v=$.createOscillator(),b=$.createGain(),I=$.currentTime;v.type="square",v.frequency.setValueAtTime(i,I),v.frequency.linearRampToValueAtTime(h,I+u/1e3),b.gain.setValueAtTime(.06,I),b.gain.linearRampToValueAtTime(0,I+u/1e3),v.connect(b).connect($.destination),v.start(I),v.stop(I+u/1e3)},T=i=>16e3/(i+8),N={sound:220,beep:60,"flash-box":60,flash:250,object:30,"object-keep":30},P=!1,W=!1,_=i=>new Promise(h=>setTimeout(h,i));async function K(){if(!P){P=!0;try{for(;;){let i=x.run();if(S(),i==="pace"){for(let h of j.splice(0))a.push(h),E.apply(h);E.prompts(),!W&&s.pace()&&await _(x.delay*s.pace()),x.delay=0;continue}for(x.delay=0;j.length;){let h=j.shift();if(a.push(h),E.apply(h),!W){if(h.step==="sound"){let[u,v]=h.words.split(" ").map(b=>parseInt(b,16));R(T(v),T(u),180)}h.step==="beep"&&R(T(h.a&31)*2,T(h.a&31)*2,50),s.pace()&&(N[h.step]&&await _(N[h.step]*s.pace()),h.step==="pause"&&await _(h.ms*s.pace()))}}if(E.prompts(),o.textContent=i==="end"?"The end.":"Waiting for a key.",!x.keys.length||i==="end")break}}catch(i){c(i)}P=!1}}let B=i=>{x.press(i),$?.resume(),C?.start(),d||K()},se=()=>x.waitingOn?.words?.[0]==="tick",ne=null,he=null;g.addEventListener("click",i=>{let h=i.target.closest(".key")?.dataset.key;h&&B(+h)});function Ke(){x.sid=[],x.clock={irq:0,ahead:[],since:0};let i=null,h=null,u=0,v=!1;o.textContent="Playing.",setInterval(()=>{if(x.delay-=1e3/60,!v&&!x.ended&&x.delay<16){x.delay=Math.max(0,x.delay),x.clock.ahead.length&&x.idle>(x.routines.polls??200)&&!x.keys.length&&++x.clock.since>120&&(x.press(x.clock.ahead.shift()),x.clock.since=0);try{x.run(),j.length=0,E.prompts()}catch(b){v=!0,c(b)}x.ended&&(o.textContent="The end.")}if(C?.node&&M){i??=new ts(C.rate),h??=performance.now();let b=Math.floor((performance.now()-h)/1e3*C.rate)-u;if(b>0){let I=i.render(b,x.sid.map(([,D,z])=>[0,D,z]));u+=b,C.node.port.postMessage(I,[I.buffer])}}x.sid.length=0},1e3/60)}return setInterval(()=>{if(!se()||P||x.keys.length)return;let i=he??ne??-1;he=null,B(i)},100),{engine:x,press:B,run(){g.focus(),d?Ke():K()},key(i,h){if(i.type==="keyup"){ne=null;let v=x.clock?.held;v?.key===i.key&&(v.seen?x.clock.held=null:v.up=!0);return}if(h===void 0)return;if(i.preventDefault(),se()){he=ne=h;return}let u=d&&!i.ctrlKey&&en(h);if(u){i.repeat||(x.clock.held={...u,key:i.key},$?.resume(),C?.start());return}i.repeat||B(h)},keys(i){if(d)x.clock.ahead.push(...i);else for(let h of i)B(h)},start(){$?.resume(),C?.start()},sound(i){C?M=i:x.mem[A.sound]=i?A.soundOn:0},soundOn:!!C,quick(i){W=i},route({route:i,name:h,keys:{expand:u,give:v,petscii:b,pollsAt:I}}){e.seed=i.seed,i.printer&&e.printer&&(e.printer.on=!0,l("printer").checked=!0),o.textContent="Playing the route "+h+".";let D={press:q=>x.press(q),also:q=>{let Y=x.mem,Z=ae=>{Y[198]<10&&(Y[631+Y[198]]=ae,Y[198]++)};x.keys.length&&Z(x.keys.shift()),Z(q)}},z=()=>{let q;do x.delay=0,q=x.run();while(q==="pace");if(d)j.length=0;else for(let Y of j.splice(0))a.push(Y),E.apply(Y)};z();for(let[q,[Y]]of u(i.keys).entries())v(D,Y,d?b:void 0),x.polls=I(i,q+1)??void 0,z();x.polls=void 0,E.prompts()}}}var ht=U(()=>{it();ot();ss();jt();Gn();Ct();as();cs();fs()});var li={};F(li,{play:()=>Qr});it();var Cn={};F(Cn,{bytesText:()=>tr,openDisk:()=>Kt,programDisk:()=>Qi,textBytes:()=>er,titleDisk:()=>Wt});var $n={};F($n,{ACCOUNT:()=>En,DB:()=>vn,KEY:()=>Sn,STORE:()=>rt,VERSION:()=>Gi,local:()=>Ft});var vn="moonbase",Gi=1,rt="files",Sn=["account","disk","name"],En="local",Zi=()=>new Promise((s,e)=>{let t=indexedDB.open(vn,1);t.onupgradeneeded=()=>t.result.createObjectStore(rt,{keyPath:Sn}),t.onsuccess=()=>s(t.result),t.onerror=()=>e(t.error)}),zt=s=>new Promise((e,t)=>{s.onsuccess=()=>e(s.result),s.onerror=()=>t(s.error)});async function Ft({account:s=En}={}){let e=await Zi(),t=n=>e.transaction(rt,n).objectStore(rt);return{kept:!0,where:"this browser",load:async n=>(await zt(t("readonly").getAll(IDBKeyRange.bound([s,n],[s,n,[]])))).map(({name:r,bytes:o,meta:c,modified:f})=>({name:r,bytes:o,meta:c,modified:f})),put:(n,r)=>zt(t("readwrite").put({account:s,disk:n,...r})),delete:(n,r)=>zt(t("readwrite").delete([s,n,r]))}}var jn={};F(jn,{memory:()=>qt});function qt({kept:s=!0}={}){let e=new Map,t=n=>e.get(n)??e.set(n,new Map).get(n);return{kept:s,load:async n=>[...t(n).values()].map(r=>({...r,bytes:Uint8Array.from(r.bytes)})),put:async(n,r)=>{t(n).set(r.name,{...r,bytes:Uint8Array.from(r.bytes)})},delete:async(n,r)=>{t(n).delete(r)}}}async function Kt(s,{backend:e}={}){if(!e)try{e=await Ft()}catch{e=qt({kept:!1})}let t=new Map((await e.load(s)).map(c=>[c.name,c])),n=Promise.resolve(),r=c=>{let f=n.then(c);return n=f.catch(l=>o.failed?.(l)),f.catch(()=>{}),f},o={name:s,kept:e.kept,where:e.where??null,failed:null,list:()=>[...t.values()].sort((c,f)=>f.modified-c.modified).map(({name:c,bytes:f,meta:l,modified:d})=>({name:c,size:f.length,modified:d,meta:l})),read:c=>t.get(c)?.bytes??null,write(c,f,l={}){let d={name:c,bytes:Uint8Array.from(f),meta:l,modified:Date.now()};return t.set(c,d),r(()=>e.put(s,d))},remove(c){return t.delete(c),r(()=>e.delete(s,c))},written:()=>n};return o}var Wt=s=>`title/${s}`,Qi=s=>`program/${s}`,er=s=>new TextEncoder().encode(s),tr=s=>s?new TextDecoder().decode(s):null;var In={};F(In,{savesFor:()=>Ht});import{saves as sr}from"@moonbase-machines/apple2e";var{driveFiles:On,keepSaves:Ln,onDisks:An,withSaves:Rn}=sr;import{saves as nr}from"@moonbase-machines/c64";var{keepDrive:Tn}=nr;function Ht(s,e){return{data:Rn(s,e),keep:t=>Ln(s,t,e),drive:t=>Tn(t,e),disks:t=>An(s,t,e),driveFiles:(t,n)=>On(t,n,s)}}var Mn={};F(Mn,{code:()=>Vt,named:()=>Yt});var ir={ArrowLeft:8,ArrowRight:21,ArrowDown:10,ArrowUp:11,Enter:13,Backspace:127,Delete:127,Escape:27,Tab:9," ":32},rr={ArrowLeft:157,ArrowRight:29,ArrowDown:17,ArrowUp:145,Enter:13,Backspace:20,Delete:20,Escape:3," ":32},or={space:32,return:13,escape:27,delete:127,left:8,right:21,down:10,up:11,"control-e":5,"control-t":20,none:-1},ar={8:157,21:29,10:17,11:145,127:20,27:3};function Vt(s,e){if(!e||s.metaKey||s.altKey)return;let t=e==="c64";return s.ctrlKey?/^[a-z]$/i.test(s.key)?s.key.toUpperCase().charCodeAt(0)&31:void 0:(t?rr:ir)[s.key]??(s.key.length===1?(t?s.key.toUpperCase():s.key).charCodeAt(0):void 0)}function Yt(s,e){let t=or[s]??s.charCodeAt(0);return e==="c64"?ar[t]??t:t}var Pn={};F(Pn,{KEYS_MARKUP:()=>Jt,paperBox:()=>_t,phoneKeys:()=>Xt});function _t({line:s,print:e,tear:t}){let n=document.createElement("div");return n.id="paper-box",n.hidden=!0,n.innerHTML='<p><span></span> <button id="print-paper" type="button"></button> <button id="tear" type="button"></button></p><canvas id="paper"></canvas>',n.querySelector("span").textContent=s,n.querySelector("#print-paper").textContent=e,n.querySelector("#tear").textContent=t,n}function Xt(s,e){let t=s.querySelector("#keyboard"),n=s.querySelector("#keys-box");if(!t||!n||!matchMedia("(pointer: coarse)").matches)return;t.hidden=!1,t.addEventListener("click",()=>n.focus()),e.addEventListener("click",()=>n.focus());let r=!1;n.addEventListener("keydown",o=>{r=o.key==="Unidentified"}),n.addEventListener("input",()=>{if(r)for(let o of n.value)for(let c of["keydown","keyup"])window.dispatchEvent(new KeyboardEvent(c,{key:o}));n.value=""})}var Jt='<button type="button" id="keyboard" class="full" hidden>Keyboard</button><input id="keys-box" class="keys-box" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" aria-label="Keys for the game">';var ai={prodos:[280,192],dos33:[280,192],c64:[384,272]},ci={original:()=>Promise.resolve().then(()=>(is(),ns)),card:()=>Promise.resolve().then(()=>(ht(),ft)),vector:()=>Promise.resolve().then(()=>(ht(),ft))};async function Qr(s){let{way:e="remake",slug:t,root:n,preview:r=!1,words:o}=s;n.classList.add("player",e),t&&n.classList.add(t),n.innerHTML=`<div class="stage"></div><p class="options"><span id="status">Loading.</span>${Jt}<label hidden><input type="checkbox" id="sound" checked> Sound</label><label hidden><input type="checkbox" id="printer" checked> Printer</label><label hidden title="The game with its bugs fixed: it starts again"><input type="checkbox" id="fixed"> Bugs fixed</label><label hidden>Mini view <select id="mini"><option value="">Off</option><option value="live">Live</option><option value="pictures">Pictures</option></select></label><button id="disk" type="button" hidden>Download the disk</button></p>`,n.append(_t(o.printer));let c=k=>n.querySelector("#"+k),f=n.querySelector(".stage"),l=c("status"),d=c("sound"),g=k=>{l.textContent="The game stopped: "+k.message,l.className="error",console.error(k)};try{let k=new URLSearchParams(location.search).has("fixed"),w=s.title?new URL(s.title):null,x=new URL(s.data),j=null,O={},a=null;e==="remake"?{title:j,scripts:O,disk:a}=await Ut(w,{data:x,fixed:k}):w&&(j=await nt(w)),!a&&/\.json$/.test(x.pathname)&&(a=await De(x,"json"));let p=a?.kind;if(j?.style&&!document.querySelector(`link[data-title="${j.slug}"]`)){let R=Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL(j.style,w).href});R.dataset.title=j.slug,document.head.append(R),await new Promise(T=>{R.onload=R.onerror=T})}let m=s.disk??await Kt(Wt(t),{backend:s.backend});m.failed=R=>{l.textContent="A file was not kept: "+R.message,l.className="error"};let[y,E]=s.screen??j?.screen??ai[p]??ai.prodos;eo(f,n,y,E);let L=null,C={way:e,slug:t,title:j,scripts:O,game:a,folder:w,data:x,stage:f,status:l,fail:g,disk:m,preview:r,words:o,fixed:k,$:c,saves:a?Ht(a,m):null,roms:s.roms,studies:s.studies,mini:s.mini??null,chargen:null,pace:()=>{let R=s.pace;return typeof R=="function"?R():R??1},control(R){c("printer").parentElement.insertAdjacentHTML("beforebegin",R)},sounding(R){d.checked=R}};if(p==="c64"){let{Printer:R,paper:T}=await Promise.resolve().then(()=>(At(),tn)),N=c("printer"),P=c("paper"),W=c("paper-box");try{N.checked=localStorage.getItem("printer")!=="0"}catch{}N.parentElement.hidden=!1,L=C.printer=new R({on:N.checked}),N.addEventListener("change",()=>{L.on=N.checked;try{localStorage.setItem("printer",N.checked?"1":"0")}catch{}}),L.changed=()=>{W.hidden=!L.lines.length,L.lines.length&&T(P,L,C.chargen)},c("tear").addEventListener("click",()=>L.tear()),c("print-paper").addEventListener("click",()=>window.print())}if(e==="remake"&&j?.fixed){let R=c("fixed");R.checked=k,R.parentElement.hidden=!1,R.addEventListener("change",()=>{let T=new URL(location.href);R.checked?T.searchParams.set("fixed",""):T.searchParams.delete("fixed"),location.href=T.href.replace("fixed=&","fixed&").replace(/fixed=$/,"fixed")})}let S=await(e==="original"?await ci.original():j.own??await ci[j.engine]()).play(C);if(!S)return;S.sound&&(d.parentElement.hidden=!1,d.checked=S.soundOn??!0,d.addEventListener("change",()=>S.sound(d.checked)));let A=R=>{let T=Vt(R,p),N=R.type==="keydown";if(N&&T!==void 0&&!R.repeat&&s.claim?.(T)){R.preventDefault();return}if(N&&S.start?.(),S.key){S.key(R,T);return}!N||T===void 0||R.repeat||!S.press||(R.preventDefault(),S.press(T))};if(addEventListener("keydown",A),addEventListener("keyup",A),f.addEventListener("pointerdown",()=>S.start?.()),Xt(n,f),s.downloadDisk&&S.diskImage){let R=c("disk"),T=x.pathname.split("/").pop().replace(/\.json$/,"");R.hidden=!1,R.addEventListener("click",()=>{let N=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([S.diskImage()],{type:"application/octet-stream"})),download:T+".d64"});N.click(),URL.revokeObjectURL(N.href)})}if(s.watch?.({engine:S.engine,press:R=>{S.start?.(),S.press?.(R)},quick:R=>S.quick?.(R)}),s.route){if(!S.route)throw new Error("a route cannot be played on the "+e);await S.route(s.route)}S.run();let $=new URLSearchParams(location.search).get("keys");if($){let R=$.split(",").map(T=>Yt(T,p));if(S.keys)S.keys(R);else for(let T of R)S.press?.(T)}}catch(k){g(k)}}function eo(s,e,t,n){let r=()=>{let o=window.devicePixelRatio||1,c=parseFloat(getComputedStyle(e).paddingLeft)*2,f=e.clientWidth-c,l=document.documentElement.clientWidth-16,d=parseFloat(getComputedStyle(s).maxHeight),g=Math.ceil(f*o/t-.01);t*g/o>l&&(g=Math.max(1,Math.floor(l*o/t))),d&&n*g/o>d&&(g=Math.max(1,Math.floor(d*o/n)));let k=t*g/o;Object.assign(s.style,{width:k+"px",height:n*g/o+"px",aspectRatio:"auto",marginLeft:(f-k)/2+"px"}),e.style.setProperty("--scale",g/o)};r(),addEventListener("resize",r)}is();ht();ot();var pi={};F(pi,{modal:()=>hs,modalOpen:()=>so});var be=[],fi=!1,to=s=>{let e=be.at(-1);if(e){if(s.key==="Escape")s.preventDefault(),e.cancel();else if(s.key==="Enter"&&!(s.target instanceof HTMLButtonElement)&&s.target.tagName!=="TEXTAREA"){let t=e.box.querySelector(".default:not(:disabled)");t&&(s.preventDefault(),t.click())}else if(s.key==="Tab"){let t=di(e.box),n=t.indexOf(document.activeElement);t.length&&(s.preventDefault(),t[(n+(s.shiftKey?t.length-1:1))%t.length].focus())}s.stopPropagation()}},di=s=>[...s.querySelectorAll('button:not(:disabled), input:not([type=hidden]):not([type=file]):not([hidden]), select:not([hidden]), [tabindex="0"]')],hi=s=>s.querySelector("input:not([type=file]), select:not([hidden])")??s.querySelector(".default")??di(s)[0];function hs({within:s=document.body,className:e="",content:t,cancel:n=null}){fi||(document.addEventListener("keydown",to,!0),fi=!0);let r=document.createElement("div");r.className="modal-layer"+(s===document.body?" page":"");let o=document.createElement("div");o.className="modal "+e,o.setAttribute("role","dialog"),o.setAttribute("aria-modal","true"),o.append(t),r.append(o);let c=document.activeElement,f=[...s.children].filter(d=>!d.inert);for(let d of f)d.inert=!0;s.append(r);let l={box:o,cancel:()=>(n??l.close)(),close(){r.remove(),be.splice(be.indexOf(l),1);for(let g of f)g.inert=!1;let d=be.at(-1);(d&&!d.box.contains(c)?hi(d.box):c)?.focus?.({preventScroll:!0})}};return be.push(l),hi(o)?.focus({preventScroll:!0}),l}var so=()=>be.length>0;var mi={};F(mi,{dialogs:()=>no});function no({within:s,className:e=""}={}){function t(c,f,l,{aside:d=[]}={}){return new Promise(g=>{let k=document.createElement("div");k.className="disk";let w=document.createElement("h2");w.textContent=c;let x=document.createElement("p");x.className="buttons";for(let[O,a]of l){let p=Object.assign(document.createElement("button"),{type:"button",textContent:O});p.onclick=async()=>{j.close(),g(typeof a=="function"?await a():a)},x.append(p)}if(x.lastChild?.classList.add("default"),d.length){let O=document.createElement("span");O.className="aside",O.append(...d),x.prepend(O)}k.append(w,...f,x);let j=hs({within:s,className:e,content:k,cancel:()=>{j.close(),g(null)}})})}let n=c=>t(c,[],[["OK",null]]);async function r(c,{suggested:f=""}={}){let l=Object.assign(document.createElement("input"),{value:f,maxLength:31});setTimeout(()=>l.select());let d=document.createElement("label");d.append("Save as ",l);let g=await t("Save",[d,...ui(c)],[["Cancel",null],["Save",()=>l.value.trim()||null]]);return!g||c.read(g)&&!await t(`Replace "${g}"?`,[],[["Cancel",!1],["Replace",!0]])?null:g}async function o(c,{file:{extension:f="",type:l="application/octet-stream"}={}}={}){let d=Object.assign(document.createElement("select"),{size:6}),g=document.createElement("p");g.className="note";let k=Object.assign(document.createElement("input"),{type:"file",accept:[f,l].filter(Boolean).join(","),hidden:!0}),w=E=>Object.assign(document.createElement("button"),{type:"button",textContent:E}),x=w("File\u2026"),j=w("Download"),O=w("Delete"),a=()=>{d.replaceChildren(...c.list().map(E=>new Option(`${E.name} \xB7 ${new Date(E.modified).toLocaleString()}`,E.name))),d.selectedIndex=d.options.length?0:-1,d.hidden=!d.options.length,g.textContent=d.options.length?"On your disk:":"Nothing saved on your disk yet.",O.disabled=j.disabled=!d.options.length};a();let p=t("Open",[g,d,k,...ui(c)],[["Cancel",null],["Open",()=>d.value||null]],{aside:[x,j,O]}),m=()=>d.closest(".modal").querySelector(".default").click();x.onclick=()=>k.click(),k.onchange=async()=>{let E=k.files[0],L=E.name.slice(0,E.name.length-(f&&E.name.endsWith(f)?f.length:0));c.read(L)&&!await t(`Replace "${L}"?`,[],[["Cancel",!1],["Replace",!0]])||(c.write(L,new Uint8Array(await E.arrayBuffer())),a(),d.value=L,m())},j.onclick=()=>{let E=d.value;if(!E)return;let L=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([c.read(E)],{type:l})),download:E+f});L.click(),setTimeout(()=>URL.revokeObjectURL(L.href),1e3)},O.onclick=async()=>{let E=d.value;E&&await t(`Delete "${E}"?`,[io("It is gone from your disk for good.")],[["Delete",!0],["Cancel",!1]])&&(await c.remove(E),a(),d.focus())},d.ondblclick=m;let y=await p;return y?{name:y,bytes:c.read(y)}:null}return{saveAs:r,openFrom:o,ask:t,tell:n}}var io=s=>Object.assign(document.createElement("p"),{className:"note",textContent:s});function ui(s){if(s.kept)return[];let e=document.createElement("p");return e.className="note",e.textContent="This browser is not keeping files: download a game to keep it.",[e]}fs();cs();Pt();$t();var gi={};F(gi,{compile:()=>fo});He();var J=(s,e=2)=>"0x"+s.toString(16).padStart(e,"0"),ds=49152,ps=49407,ro=s=>s>=ds&&s<=ps;function us(s){if(s.through!==void 0)return{js:`(e.mem[${J(s.through)}] | e.mem[${J(s.through+1)}] << 8) + e.y & 0xffff`,io:!0};if(s.pair!==void 0)return{js:`e.mem[${J(s.pair)} + e.x & 0xff] | e.mem[${J(s.pair)} + e.x + 1 & 0xff] << 8`,io:!0};if(s.via!==void 0)return{js:`(e.mem[${J(s.via,4)}] | e.mem[${J(s.via+1,4)}] << 8)${s.index?" + e."+s.index+" & 0xffff":""}`,io:!0};if(!s.index)return{js:J(s.at,4),io:ro(s.at)};let e=s.at<=ps&&s.at+255>=ds;return{js:s.at+255>65535?`(${J(s.at,4)} + e.${s.index}) & 0xffff`:`${J(s.at,4)} + e.${s.index}`,io:e}}function ve(s,e=!0){let t=Q(s);if(t.number!==void 0)return{js:String(t.number&255)};if(t.reg==="carry")return{js:"e.c"};if(t.reg)return{js:"e."+t.reg};let n=us(t);return e&&t.through!==void 0?{js:`e.read(e.ix(e.mem[${J(t.through)}] | e.mem[${J(t.through+1)}] << 8, e.y))`,io:!0}:e&&t.via!==void 0&&t.index?{js:`e.read(e.ix(e.mem[${J(t.via,4)}] | e.mem[${J(t.via+1,4)}] << 8, e.${t.index}))`,io:!0}:e&&t.index&&!t.zp?{js:n.io?`e.read(e.ix(${J(t.at,4)}, e.${t.index}))`:`e.mem[e.ix(${J(t.at,4)}, e.${t.index})]`,io:n.io}:{js:n.io?`e.read(${n.js})`:`e.mem[${n.js}]`,io:n.io}}function oo(s,e){let t=Q(s);if(t.reg)return{js:`e.${t.reg} = ${e}`};let n=us(t);return{js:n.io?`e.write(${n.js}, ${e})`:`e.mem[${n.js}] = ${e}`,io:n.io}}function xi(s){let e=Q(s);if(e.reg)return{pre:"",read:"e."+e.reg,write:n=>`e.${e.reg} = ${n}`};let t=us(e);return t.io?{pre:`const at = ${t.js}; `,read:"e.read(at)",write:n=>`e.write(at, ${n})`,io:!0}:{pre:"",read:`e.mem[${t.js}]`,write:n=>`e.mem[${t.js}] = ${n}`}}var ao={zero:"e.z",carry:"e.c",negative:"e.n",overflow:"e.v"},co={"==":"e.z","!=":"!e.z",">=":"e.c","<":"!e.c"};function lo(s,e){let t=s.words,[n,r]=t,o=`s[${e}]`,c=(...l)=>({js:l.map(d=>d.js??d).join(""),kind:l.some(d=>d.io)?"io":"compute"});if(r==="="&&t.length===3){let l=ve(t[2]),d=Q(n);if(d.reg==="carry")return c("e.c = ",l," & 1;");if(d.reg)return c(`e.${d.reg} = e.flags(`,l,");");let g=oo(n,l.js);return{js:g.js+";",kind:l.io||g.io?"io":"compute"}}if(r==="+="||r==="-="){let l=ve(t[2]);if(t.length===3){let d=xi(n);return{js:`${d.pre}${d.write(`e.flags(${d.read} ${r[0]} ${l.js} & 0xff)`)};`,kind:d.io||l.io?"io":"compute"}}return{js:r==="+="?`e.add(${l.js});`:`e.sub(${l.js});`,kind:l.io?"io":"compute"}}if(r==="&="||r==="|="||r==="^="){let l=ve(t[2]);return c(`e.a = e.flags(e.a ${r[0]} `,l,");")}if(r==="<<="||r===">>="||r==="rotate"){let l=xi(n),d=r==="<<="||t[2]==="left";return{js:`${l.pre}${l.write(`e.shift(${l.read}, ${d}, ${r==="rotate"})`)};`,kind:l.io?"io":"compute"}}switch(n){case"if":{let l=t.at(-1),d=t.slice(1,-2);if(d.length===3&&/^[axy]$/.test(d[0])){let w=ve(d[2]);return{js:`e.compare(e.${d[0]}, ${w.js}); if (${co[d[1]]})`,kind:"branch",to:l,io:w.io}}let g=d[0]==="not",k=ao[g?d[1]:d[0]];if(!k)throw new Error(s.where+": no flag "+d.join(" "));return{js:`if (${g?"!":""}${k})`,kind:"branch",to:l}}case"goto":return t[1].startsWith("(")?{js:`return e.jumpThrough(${J(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:t[1].startsWith("[")?{js:`return e.jumpTable(${J(parseInt(t[1].slice(2),16),4)}, e.${t[2][0]});`,kind:"end"}:{js:`return e.jump('${t[1]}', ${o});`,kind:"end"};case"call":return t[1].startsWith("(")?{js:`return e.callThrough(${J(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:{js:`return e.call('${t[1]}', ${o});`,kind:"end"};case"return":return{js:`return e.ret(${o});`,kind:"end"};case"compare":return c(`e.compare(e.${t[1]}, `,ve(t[2]),");");case"test":return c("e.test(",ve(t[1]),");");case"push":return{js:`e.push(${t[1]==="a"});`,kind:"compute"};case"pull":return{js:`e.pull(${t[1]==="a"});`,kind:"compute"};case"asm":return t[1]==="RTI"?{js:`return e.ret(${o});`,kind:"end"}:{js:["TSX","TXS","CLV","SED","CLD","SEI","CLI"].includes(t[1])?`e.asm('${t[1]}');`:"",kind:"compute"}}let f=t.slice(1).map(l=>typeof l=="string"?`'${l}'`:`{ string: ${JSON.stringify(l.string)} }`).join(", ");return{js:`return e.routine('${n}', [${f}], ${o});`,kind:"routine"}}function fo(s,e,{io:t=[49152,49407]}={}){[ds,ps]=t;let{steps:n,labels:r,data:o}=Ee(s,e),c=n.map((g,k)=>lo(g,k)),f=new Set([0,...Object.values(r)]);c.forEach((g,k)=>{(g.kind==="routine"||g.kind==="io"||g.io)&&f.add(k),(g.kind!=="compute"&&g.kind!=="branch"||g.io)&&f.add(k+1)});let l=Object.fromEntries(Object.entries(r).map(([g,k])=>[k,g])),d=[];for(let g=0;g<n.length;g++){if(!f.has(g))continue;let k=g+1;for(;k<n.length&&!f.has(k);)k++;let w=c.slice(g,k).some(p=>p.kind==="branch"&&r[p.to]===g),x=[];for(let p=g;p<k;p++){if((p===g||c[p-1].kind==="branch")&&c[p].kind!=="routine"){let L=p;for(;L<k-1&&c[L].kind!=="branch";)L++;x.push(`e.time(s, ${p}, ${L});`)}let m=c[p],y=n[p].at===null?n[p].text:n[p].at.toString(16).toUpperCase().padStart(4,"0")+" "+n[p].text,E=m.js;if(m.kind==="branch"){let L=r[m.to],C=$e(n[p]),M=C===1?"e.cycles++":`e.cycles += ${C}`;E+=L===void 0?` { ${M}; e.pc = e.label('${m.to}'); return; }`:L===g&&w?` { ${M}; continue; }`:` { ${M}; e.pc = ${L}; return; }`}m.kind==="end"&&(E=`e.pc = ${p+1}; `+E),x.push(E?`${E.padEnd(48)} // ${y}`:`// ${y}`)}c[k-1].kind!=="end"&&c[k-1].kind!=="routine"&&k!==g+1&&x.push(`e.pc = ${k};`);let j=l[g]?` // ${l[g]}
23
+ `:"",O=x.length===1&&/^return (.*?);( +\/\/ .*)$/.exec(x[0]);if(O){d.push(`${j} ${`${g}: (e, s) => ${O[1]},`.padEnd(60)}${O[2].trim()?" "+O[2].trim():""}`);continue}let a=w?["for (;;) {",...x.map(p=>" "+p)," break;","}"]:x;d.push(`${j} ${g}: (e, s) => {
24
+ ${a.map(p=>" "+p).join(`
24
25
  `)}
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=>`
26
- [${G(x.at,4)}, [${x.bytes.map(u=>G(u)).join(", ")}]],`).join("")}
27
- ],`,` steps: [${s.map(x=>`
28
- [${x.at===null?"null":G(x.at,4)}, ${+x.where.split(":").at(-1)}, ${JSON.stringify(x.text)}],`).join("")}
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};
26
+ },`)}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(r)},`,` data: [${o.map(g=>`
27
+ [${J(g.at,4)}, [${g.bytes.map(k=>J(k)).join(", ")}]],`).join("")}
28
+ ],`,` steps: [${n.map(g=>`
29
+ [${g.at===null?"null":J(g.at,4)}, ${+g.where.split(":").at(-1)}, ${JSON.stringify(g.text)}],`).join("")}
30
+ ],`," run: {",...d," },","};",""].join(`
31
+ `)}ut();we();Me();It();it();gt();wt();He();Ze();as();export{Nn as audio,mi as diskDialogs,Cn as diskDisk,$n as diskLocal,jn as diskMemory,ns as enginesOriginal,ft as enginesScenes,Mn as keys,pi as modal,Pn as parts,li as play,oi as remakeC64View,kn as remakeCard,si as remakeCardView,Ys as remakeCards,gi as remakeCompile,$s as remakeEngine,Os as remakeEvents,Bs as remakeLayout,xn as remakeLift,bn as remakeLoad,Ls as remakeProblems,zs as remakeRaster,gs as remakeScript,Hs as remakeVector,ti as remakeView,In as saves};
33
32
  //# sourceMappingURL=moonbase-player.js.map