@moonbase-machines/player 0.9.1 → 0.11.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.1: MIT, (c) 2026 Mark Wharton (its LICENSE) */
2
- var Bn=Object.defineProperty;var ie=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(s){throw t=[s],s}};var U=(n,e)=>{for(var t in e)Bn(n,t,{get:e[t],enumerable:!0})};var Qt={};U(Qt,{Machine:()=>Kn});import{machine as zn}from"@moonbase-machines/apple2e";var Kn,es=ie(()=>{({Machine:Kn}=zn)});var ts={};U(ts,{blank:()=>Fn,placed:()=>Wn,started:()=>ht,units:()=>Hn});import{prodos as qn}from"@moonbase-machines/apple2e";var Fn,Wn,ht,Hn,dt=ie(()=>{({blank:Fn,placed:Wn,started:ht,units:Hn}=qn)});var ss={};U(ss,{driveFiles:()=>Vn,keepSaves:()=>pt,onDisks:()=>_n,withSaves:()=>ut});import{saves as Yn}from"@moonbase-machines/apple2e";var Vn,pt,_n,ut,mt=ie(()=>{({driveFiles:Vn,keepSaves:pt,onDisks:_n,withSaves:ut}=Yn)});var ns={};U(ns,{COLORS:()=>Xn,colors:()=>xt,paint:()=>Gn,paintHires:()=>gt,paintText:()=>Je,rowStart:()=>Zn,screen:()=>Qn,textRow:()=>ei});import{screen as Jn}from"@moonbase-machines/apple2e";var Xn,xt,Gn,gt,Je,Zn,Qn,ei,Xe=ie(()=>{({COLORS:Xn,colors:xt,paint:Gn,paintHires:gt,paintText:Je,rowStart:Zn,screen:Qn,textRow:ei}=Jn)});var is={};U(is,{pictures:()=>Ie,shapes:()=>si,windows:()=>ni});import{pictures as ti}from"@moonbase-machines/vector";var Ie,si,ni,Ge=ie(()=>{({pictures:Ie,shapes:si,windows:ni}=ti)});var rs={};U(rs,{bounds:()=>ri,document:()=>oi,elements:()=>kt});import{svg as ii}from"@moonbase-machines/vector";var ri,oi,kt,wt=ie(()=>{({bounds:ri,document:oi,elements:kt}=ii)});var os={};U(os,{C64:()=>ci});import{machine as ai}from"@moonbase-machines/c64";var ci,as=ie(()=>{({C64:ci}=ai)});var cs={};U(cs,{Printer:()=>Me,WIDTH:()=>fi,bus:()=>yt,paper:()=>bt});import{printer as li}from"@moonbase-machines/c64";var Me,fi,yt,bt,Ze=ie(()=>{({Printer:Me,WIDTH:fi,bus:yt,paper:bt}=li)});var ls={};U(ls,{HEIGHT:()=>Ee,LEFT:()=>di,PALETTE:()=>Qe,TOP:()=>pi,VIC:()=>ui,WIDTH:()=>je});import{vic as hi}from"@moonbase-machines/c64";var Ee,di,Qe,pi,ui,je,vt=ie(()=>{({HEIGHT:Ee,LEFT:di,PALETTE:Qe,TOP:pi,VIC:ui,WIDTH:je}=hi)});var fs={};U(fs,{keyboard:()=>xi,pace:()=>gi,painter:()=>ki});import{browser as mi}from"@moonbase-machines/c64";var xi,gi,ki,hs=ie(()=>{({keyboard:xi,pace:gi,painter:ki}=mi)});var ds={};U(ds,{SID:()=>St});import{sid as wi}from"@moonbase-machines/c64";var St,Et=ie(()=>{({SID:St}=wi)});var ps={};U(ps,{ROM_CHOICES:()=>bi,c64Roms:()=>vi,typed:()=>Si});import{start as yi}from"@moonbase-machines/c64";var bi,vi,Si,us=ie(()=>{({ROM_CHOICES:bi,c64Roms:vi,typed:Si}=yi)});var ms={};U(ms,{SECTORS:()=>ji,add:()=>$i,make:()=>Ci,petsciiName:()=>Oi,read:()=>Li});import{d64 as Ei}from"@moonbase-machines/c64";var ji,$i,Ci,Oi,Li,xs=ie(()=>{({SECTORS:ji,add:$i,make:Ci,petsciiName:Oi,read:Li}=Ei)});var gs={};U(gs,{keepDrive:()=>jt});import{saves as Ai}from"@moonbase-machines/c64";var jt,$t=ie(()=>{({keepDrive:jt}=Ai)});var ws={};U(ws,{play:()=>Ti});var Gt={};U(Gt,{Speaker:()=>we});var Un=`
1
+ /*! @moonbase-machines/player 0.11.0: MIT, (c) 2026 Mark Wharton (its LICENSE) */
2
+ var Ci=Object.defineProperty;var B=(s,t,e)=>()=>{if(e)throw e[0];try{return s&&(t=s(s=0)),t}catch(n){throw e=[n],n}};var z=(s,t)=>{for(var e in t)Ci(s,e,{get:t[e],enumerable:!0})};var bs={};z(bs,{branchTaken:()=>Ot,operand:()=>Z,parse:()=>Ct,words:()=>Vt});function Ct(s,t="script"){let e=[],n={},i=[];return s.split(`
3
+ `).forEach((o,c)=>{let h=o.replace(/^\s+|\s+$/g,"");if(!h||h.startsWith(";"))return;let f=t+":"+(c+1),l;if(l=/^(L[0-9A-F]{4}|[A-Za-z_][\w-]*):$/.exec(h)){n[l[1]]=e.length;return}if(l=/^data \$([0-9A-F]+)((?: [0-9A-F]{2})+)$/i.exec(h)){i.push({at:parseInt(l[1],16),bytes:l[2].trim().split(" ").map(k=>parseInt(k,16))});return}l=/^([0-9A-F]{4})\s+(.*)$/.exec(h);let m=l?parseInt(l[1],16):null,g=l?l[2]:h;e.push({at:m,words:Vt(g),text:g,where:f,index:e.length})}),{steps:e,labels:n,data:i}}function Z(s){if(typeof s!="string")return{string:s.string};if(/^-?\d+$/.test(s))return{number:+s};if(/^[axy]$/.test(s)||s==="carry"||s==="borrow")return{reg:s};let t;if(t=/^\$([0-9A-F]+)(?:\[([xy])\])?$/i.exec(s))return{at:parseInt(t[1],16),index:t[2],zp:t[1].length<=2};if(t=/^\(\$([0-9A-F]{2})\)\[y\]$/i.exec(s))return{through:parseInt(t[1],16)};if(t=/^\(\$([0-9A-F]{2})\[x\]\)$/i.exec(s))return{pair:parseInt(t[1],16)};if(t=/^\[\$([0-9A-F]{4})\](?:\[([xy])\])?$/i.exec(s))return{via:parseInt(t[1],16),index:t[2]};throw new Error("not an operand: "+s)}function Ot(s){if(s.at===null)return 1;let t=s.words,e=parseInt(t.at(-1).slice(1),16),n=s.at+(t.length===6?Ai(t[3]):0)+2&65535;return/^L[0-9A-F]{4}$/.test(t.at(-1))&&(e&65280)!==(n&65280)?2:1}var Oi,Vt,Ai,Yt=B(()=>{Oi=/"(?:[^"\\]|\\.)*"|\S+/g;Vt=s=>s.match(Oi).map(t=>t.startsWith('"')?{string:JSON.parse(t)}:t);Ai=s=>/^\d+$/.test(s)||/^\$[0-9A-F]{2}(\[[xy]\])?$/i.test(s)||/^\(\$/.test(s)?2:3});import{cpu as Li}from"@moonbase-machines/mos6502";var Oo,me,vs=B(()=>{({CPU:Oo,CYCLES:me}=Li)});var As={};z(As,{Engine:()=>Lt,label16:()=>At});function js(s){if(s===32)return 3;if(s===0||s===64||s===96)return 1;let t=s>>2&7,e=s&3;return e===1?t===3||t===6||t===7?3:2:t===0?e===2||(s&224)>=160?2:1:t===2||t===6?e===0||e===2?1:2:t===4?2:t===3||t===7?3:2}var Ss,Ti,Es,$s,Ri,Cs,Os,At,Lt,xe=B(()=>{Yt();vs();Ss={left:!0},Ti=new Set(["if","goto","call","return","compare","test","asm","push","pull"]),Es=s=>Ti.has(s.words[0])||/^(=|\+=|-=|&=|\|=|\^=|<<=|>>=|rotate)$/.test(s.words[1]),$s=1020.484;Ri=new Set([234,169,162,160,165,166,164,173,174,172,24,56]),Cs=s=>s.words[0]==="if"&&s.words.length===6,Os=s=>s?.at==null?void 0:s.at+2&65535,At=s=>"L"+s.toString(16).toUpperCase().padStart(4,"0"),Lt=class{constructor({routines:t,scripts:e,start:n,label:i,memory:o={}}){this.routines=t,this.sources=e,this.mem=new Uint8Array(65536);for(let[c,h]of Object.entries(o))this.mem[c]=h;this.a=0,this.x=0,this.y=0,this.n=0,this.z=0,this.c=0,this.v=0,this.d=0,this.stack=[],this.keys=[],this.listeners=[],this.takers=[],this.ended=!1,this.timed=!!t.timed,this.cycles=0,this.clicks=[],this.delay=0,this.programs={},t.setup?.(this),this.enter(n,i,!0)}on(t){this.listeners.push(t)}emit(t){this.inside&&(t.inside=!0);for(let e of this.listeners)e(t)}inside=0;press(t){this.keys.push(t)}key(){let t=this.keys.shift();if(t!==void 0)for(let e of this.takers)e(t);return t}onKey(t){return this.takers.push(t),()=>{this.takers=this.takers.filter(e=>e!==t)}}enter(t,e,n=!1){let i=this.script(t);if(n)for(let o of i.data)this.mem.set(o.bytes,o.at);this.program=i,this.name=t,this.pc=e===void 0?0:this.label(e)}script(t){if(this.programs[t])return this.programs[t];let e=this.sources[t];if(e===void 0)throw new Error("no script "+t);let n=this.programs[t]=typeof e=="string"?Ct(e,t):{labels:e.labels,data:e.data.map(([i,o])=>({at:i,bytes:o})),steps:e.steps.map(([i,o,c],h)=>({at:i,text:c,where:t+":"+o,run:e.run[h],words:Vt(c),index:h}))};for(let[i,o]of Object.entries(n.labels)){let c=/^L[0-9A-F]{4}$/.test(i)?parseInt(i.slice(1),16):null;c!==null&&n.steps[o]?.at>c&&(n.steps[o].start=c),c!==null&&n.steps[o]?.at===c&&(n.steps[o].entered=!0)}return n}callInside(t,e,n,i){this.stack.push({name:this.name,pc:this.pc,inside:!0,done:n,ret:i}),this.inside++,this.enter(t,e)}leave(t,e){throw this.stack=[],this.problem=null,this.waitingOn=null,this.visited=null,this.enter(t,e),Ss}visit(t){this.visiting=t}startVisit(t){let[e,n]=this.title.visit[this.visiting];this.visiting=void 0,this.visited||(this.visited={name:this.name,pc:t,stack:this.stack,problem:this.problem,waitingOn:this.waitingOn,asked:this.asked,askMode:this.askMode,regs:[this.a,this.x,this.y,this.n,this.z,this.c,this.v]},this.title.raster?.keepScreen(),this.inside++,this.emit({step:"keep-screen"}),this.inside--,this.routines.show(this,[],null)),this.stack=[{visit:!0}],this.problem=null,this.waitingOn=null,this.asked=null,this.a=2,this.c=0,this.enter(e,n)}endVisit(){let t=this.visited;this.visited=null,this.title.raster?.putScreen(),this.inside++,this.emit({step:"put-screen"}),this.inside--,this.routines.show(this,[],null),this.enter(t.name),Object.assign(this,{pc:t.pc,stack:t.stack,problem:t.problem,waitingOn:t.waitingOn,asked:t.asked,askMode:t.askMode}),[this.a,this.x,this.y,this.n,this.z,this.c,this.v]=t.regs}label(t){let e=this.program.labels[t];if(e===void 0)throw new Error(this.name+": no label "+t);return e}place(t){if(t.through!==void 0)return(this.mem[t.through]|this.mem[t.through+1]<<8)+this.y&65535;if(t.pair!==void 0){let e=t.pair+this.x&255;return this.mem[e]|this.mem[e+1&255]<<8}return t.via!==void 0?(this.mem[t.via]|this.mem[t.via+1]<<8)+(t.index?this[t.index]:0)&65535:t.at+(t.index?this[t.index]:0)&65535}read(t){return this.io&&this.ioAt(t)?this.io(t)&255:this.mem[t]}write(t,e){this.io&&this.ioAt(t)?this.io(t,e&255):this.mem[t]=e}ioAt(t){return(t&65280)===49152}get(t){return t.number!==void 0?t.number&255:t.reg==="carry"?this.c:t.reg?this[t.reg]:this.read(this.place(t))}load(t){return this.timed&&(t.index&&!t.zp||t.through!==void 0)&&((t.through!==void 0?this.mem[t.through]|this.mem[t.through+1]<<8:t.via!==void 0?this.mem[t.via]|this.mem[t.via+1]<<8:t.at)&255)+this[t.index??"y"]>255&&this.cycles++,this.get(t)}ix(t,e){return this.timed&&(t&255)+e>255&&this.cycles++,t+e&65535}set(t,e){if(e&=255,t.reg){this[t.reg]=e;return}this.write(this.place(t),e)}flags(t){return this.n=t>>7&1,this.z=t===0?1:0,t}compare(t,e){let n=t-e&511;this.c=t>=e?1:0,this.flags(n&255)}time(t,e,n){if(!this.timed)return;let i=t[e].cycles;if(i===void 0){i=0;for(let o=e;o<=n;o++)i+=this.cost(t,o);t[e].cycles=i}this.cycles+=i,this.delay+=i/$s}cost(t,e){let n=t[e],i=this.mem;if(n.at===null)return 0;let o=me[i[n.at]]+(Cs(n)?2:0),c=!n.entered&&!["return","goto"].includes(t[e-1]?.words[0])?t[e-1]:null;if(n.start!==void 0||c&&c.at!==null){let h=n.start??c.at+js(i[c.at])+(Cs(c)?2:0)+(this.routines.inline?.(this,c)??0);if(h<n.at&&n.at-h<=9){let f=0,l=h;for(;l<n.at&&Ri.has(i[l]);l+=js(i[l]))f+=me[i[l]];l===n.at&&(o+=f)}}return o}add(t){if(this.d){let i=(this.a&15)+(t&15)+this.c,o=(this.a>>4)+(t>>4);i>9&&(i-=10,o++),this.z=(this.a+t+this.c&255)===0?1:0,this.n=o&8?1:0,this.v=~(this.a^t)&(this.a^o<<4)&128?1:0,o>9?(o-=10,this.c=1):this.c=0,this.a=(o<<4|i)&255;return}let e=this.a,n=e+t+this.c;this.v=~(e^t)&(e^n)&128?1:0,this.c=n>255?1:0,this.a=this.flags(n&255)}sub(t){if(!this.d)return this.add(t^255);let e=(this.a&15)-(t&15)-(1-this.c),n=(this.a>>4)-(t>>4);e<0&&(e+=10,n--);let i=this.a-t-(1-this.c);this.z=(i&255)===0?1:0,this.n=i&128?1:0,this.v=(this.a^t)&(this.a^i)&128?1:0,this.c=i>=0?1:0,n<0&&(n+=10),this.a=(n<<4|e)&255}shift(t,e,n){let i=e?(t<<1|(n?this.c:0))&255:t>>1|(n&&this.c?128:0);return this.c=e?t>>7:t&1,this.flags(i)}test(t){this.n=t>>7&1,this.v=t>>6&1,this.z=(t&this.a)===0?1:0}jump(t,e){if(this.routines.elsewhere?.(this,t))return this.routines["goto-engine"](this,["$"+t.slice(1)],e);this.pc=this.label(t)}jumpThrough(t,e){let n=At(this.mem[t]|this.mem[t+1]<<8);if(this.program.labels[n]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+n.slice(1)],e);this.pc=this.label(n)}jumpTable(t,e){this.pc=this.label(At(this.mem[t+e]|this.mem[t+e+1]<<8))}call(t,e){if(this.routines.elsewhere?.(this,t))return this.routines["call-engine"](this,["$"+t.slice(1)],e);this.stack.push({name:this.name,pc:this.pc,ret:Os(e)}),this.pc=this.label(t)}callThrough(t,e){let n=At(this.mem[t]|this.mem[t+1]<<8);if(this.program.labels[n]===void 0&&this.routines["call-engine"])return this.routines["call-engine"](this,["$"+n.slice(1)],e);this.stack.push({name:this.name,pc:this.pc,ret:Os(e)}),this.pc=this.label(n)}ret(t){let e=this.stack.pop();if(!e)throw new Error("return with nothing called");if(e.visit){this.endVisit();return}let n=this.pulled;if(e.a!==void 0&&this.stack.at(-1)?.a!==void 0){let i=this.stack.pop().a,o=(i<<8|e.a)+1&65535,c=At(o);if(n?.ret!==void 0&&o>n.ret&&o-n.ret<=256){this.pulled=null,n.name!==this.name&&this.enter(n.name),this.pc=n.pc,n.inside&&(this.inside--,n.done?.(this));return}if(n?.ret!==void 0&&o<=n.ret&&n.ret-o<=32&&this.script(n.name).labels[c]!==void 0){this.pulled=null,n.name!==this.name&&this.enter(n.name),this.pc=this.label(c),n.inside&&(this.again=this.again?.ret===n.ret?{...this.again,n:this.again.n+1}:{ret:n.ret,done:n.done,n:1});return}if(this.program.labels[c]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+c.slice(1)],t);this.pc=this.label(c);return}if(n&&this.stack.length<n.depth&&(this.pulled=null,n.inside&&n.ret!==void 0&&this.inside--),e.name!==this.name&&this.enter(e.name),this.pc=e.pc,e.inside&&(this.inside--,e.done?.(this)),this.again&&e.ret===this.again.ret){let i=this.again;this.again=null,this.inside-=i.n,i.done?.(this)}e.after?.(this)}push(t){this.stack.push(t?{a:this.a}:{flags:[this.n,this.z,this.c,this.v]})}pull(t){let e=this.stack.at(-1);if(e&&e.name!==void 0){let i=e.ret===void 0?0:e.half?e.ret>>8:e.ret&255;e.half?(this.stack.pop(),e.depth=this.stack.length,this.pulled=e,e.inside&&e.ret===void 0&&this.inside--):e.half=!0,t&&(this.a=this.flags(i));return}let n=this.stack.pop();t?this.a=this.flags(n.a):[this.n,this.z,this.c,this.v]=n.flags}sp(){return 255-this.stack.reduce((t,e)=>t+(e.name===void 0||e.half?1:2),0)&255}stackPage(){let t=this.sp();(this.stacks??=new Map).set(t,this.stack.map(n=>({...n})));let e=255;for(let n of this.stack){let i=n.ret??0;n.name===void 0?this.mem[256+e--]=n.a??(n.flags?n.flags[0]<<7|n.flags[3]<<6|48|n.flags[1]<<1|n.flags[2]:0):(this.mem[256+e--]=i>>8,n.half||(this.mem[256+e--]=i&255))}return t}asm(t){if(t==="TSX"&&(this.x=this.flags(this.stackPage())),t==="TXS"){let e=this.stacks?.get(this.x);this.stack=e?e.map(n=>({...n})):[],this.visited=null,this.inside=this.stack.filter(n=>n.inside).length}t==="CLV"&&(this.v=0),t==="SED"&&(this.d=1),t==="CLD"&&(this.d=0),t==="SEI"&&(this.i=1),t==="CLI"&&(this.i=0)}run(t=1e7){this.pacing||(this.idle=0),this.pacing=!1,this.delay??=0;for(let e=0;e<t;e++){if(this.ended)return"end";let n=this.program.steps[this.pc];if(!n)throw new Error(this.name+": ran off the end");if(this.routines.before?.(this,n)==="wait"||this.exec(n)==="wait")return"idle";if(this.polled)return this.polled=!1,"idle";if(this.delay>=16)return this.pacing=!0,"pace"}return"steps"}exec(t){let e=this.pc;this.pc++;try{this.called=!1,!t.run&&Es(t)&&this.time(this.program.steps,e,e);let n=t.run?t.run(this,this.program.steps):this.interpret(t);if(n==="wait"&&(t.run?this.called:!Es(t))&&(this.pc=e,this.visiting!==void 0)){this.startVisit(e);return}return n}catch(n){if(n===Ss){this.inside=0;return}if(this.routines.error?.(this,n)){this.ended=!0;return}throw n.message=t.where+" ("+t.text+"): "+n.message,n}}interpret(t){let e=t.words,[n,i]=e;if(i==="="&&e.length===3){let o=Z(n),c=this.load(Z(e[2]));if(o.reg==="carry"){this.c=c&1;return}this.set(o,c),o.reg&&this.flags(c);return}if(i==="+="||i==="-="){let o=Z(n),c=e.length===3?this.get(Z(e[2])):this.load(Z(e[2]));if(e.length===3){let h=this.get(o)+(i==="+="?c:-c)&255;this.set(o,h),this.flags(h);return}i==="+="?this.add(c):this.sub(c);return}if(i==="&="||i==="|="||i==="^="){let o=this.load(Z(e[2]));this.a=this.flags(i==="&="?this.a&o:i==="|="?this.a|o:this.a^o);return}if(i==="<<="||i===">>="||i==="rotate"){let o=Z(n);this.set(o,this.shift(this.get(o),i==="<<="||e[2]==="left",i==="rotate"));return}switch(n){case"if":return this.branch(e,t);case"goto":return e[1].startsWith("(")?this.jumpThrough(parseInt(e[1].slice(2,-1),16),t):e[1].startsWith("[")?this.jumpTable(parseInt(e[1].slice(2),16),this[e[2][0]]):this.jump(e[1],t);case"call":return e[1].startsWith("(")?this.callThrough(parseInt(e[1].slice(2,-1),16),t):this.call(e[1],t);case"return":return this.ret(t);case"compare":this.compare(this[e[1]],this.load(Z(e[2])));return;case"test":this.test(this.get(Z(e[1])));return;case"asm":if(e[1]==="RTI")return this.ret(t);this.asm(e[1]);return;case"push":this.push(e[1]==="a");return;case"pull":this.pull(e[1]==="a");return}return this.routine(n,e.slice(1),t)}routine(t,e,n){let i=this.routines[t];if(!i)throw new Error("no routine "+t);if(this.called=!0,n&&this.timed&&n.at!==null){let o=this.cost(this.program.steps,n.index);this.cycles+=o,this.delay+=o/$s}return i(this,e,n)}branch(t,e){let n=t.at(-1),i=t.slice(1,-2),o;if(i.length===3&&/^[axy]$/.test(i[0]))this.compare(this[i[0]],this.load(Z(i[2]))),o={"==":this.z,"!=":!this.z,">=":this.c,"<":!this.c}[i[1]];else{let c=i[0]==="not",h=c?i[1]:i[0],f={zero:this.z,carry:this.c,negative:this.n,overflow:this.v}[h];if(f===void 0)throw new Error("no flag "+h);o=c?!f:!!f}o&&(this.cycles+=Ot(e),this.pc=this.label(n))}}});var Rs={};z(Rs,{GIVES:()=>gt,POLLS:()=>Ii,TAKES:()=>pt,WAITS:()=>Mi,describe:()=>G,nothing:()=>ge,result:()=>et});function G(s,t,e,n,i,o){let c={step:s};t.length&&(c.n=t.map(Number));let h=pt[s];if(s==="objects")c.table="$"+(e.x|e.y<<8).toString(16).toUpperCase().padStart(4,"0");else if(s.startsWith("object")&&e.a<2)c.a=e.a;else if(h)for(let f of h)c[f]=e[f];if((s==="key-at"||s==="key")&&c.a!==void 0&&(c.a=String.fromCharCode(c.a&127)),Ts[s]&&i)for(let[f,l]of Object.entries(Ts[s]))c[f]=i(l);if(Ls[s]&&o)for(let[f,l]of Object.entries(Ls[s]))c[f]=o(l);return n!==void 0&&(c.words=n),c}function et(s,t){let e={result:s};for(let n of gt[s])e[n]=t[n];return e}var pt,Ls,Ts,gt,ge,Ii,Mi,yt=B(()=>{pt={box:"axy",object:"axy","object-keep":"axy","object-mode":"axy",objects:"xy",span:"axy",random:"a",beep:"a","key-at":"axy",key:"a",multiply:"ax",divide:"axy",ask:"a","ask-mode":"a","ask-escape":"a",rectangle:"axy","read-dot":"xy",problem:"a",dot:"axy","fill-rows":"axy",part:"a","rectangle-outline":"axy","key-panel":"a","keep-span":"xy","put-span":"xy","white-lines":"y","invert-span":"xy",label:"a","flip-box":"a","flash-box":"a",path:"ax",jump:"a",cell:"axy","cell-box":"axy",pair:"a",piece:"axy",colour:"a",tick:"",print:"axyc",arrow:"a",unpack:"y","load-picture":"a","action-cards":"a","return-key":"a","space-key":"a","wipe-rows":"a","wipe-columns":"a","text-card":"a","fill-left":"a","put-object":"axy","draw-room-objects":"yc",take:"y",drop:"y",effect:"a",outport:"a",cout:"a",char:"a",message:"xy",describe:"axy",chrout:"a",plot:"xyc",close:"a",chkin:"x",chkout:"x",setlfs:"axy",setnam:"axy",load:"axy",save:"axy",listen:"a",second:"a",ciout:"a",talk:"a",tksa:"a",setmsg:"a",tone:"xy","load-objects":"axy",hposn:"axy",hlin:"axy",hcolor:"x",pause:"a","bag-put":"a"},Ls={colour:{shape:3605},"card-frame":{x:16504,high:16505,y:16506,width:16507,height:16508}},Ts={line:{x0:0,x1:1,y0:2,y1:3,color:17},piece:{color:17},rectangle:{width:14,height:15},"rectangle-outline":{width:14,height:15}};gt={random:"a",ask:"ax","ask-mode":"ax","ask-escape":"axc","wait-or-escape":"c",problem:"c","read-key":"a","read-dot":"a",multiply:"ax",divide:"ax","blink-key":"a","which-box":"xy",tick:"a","choose-action":"a",take:"a",drop:"a","show-bag":"a","bag-choose":"a",getin:"a",acptr:"a",readst:"a",load:"cxy",chrin:"a"},ge=(s,t)=>s==="beep"&&t===0,Ii=new Set(["read-key","blink-key"]),Mi=new Set(["wait","wait-erase","wait-or-escape","ask","ask-mode","ask-escape","which-box","tick","choose-action","take","drop","show-bag","bag-choose"])});var Is={};z(Is,{helpers:()=>we});function we(s,t){let e=s.title.map.vars.zero;function*n(h,...f){let l={words:[h]},m=f.map(g=>typeof g=="string"&&h==="text"?{string:g}:typeof g=="number"?String(g):g);for(;;){if(t[h](s,m,l)!=="wait")return{a:s.a,x:s.x,y:s.y,c:s.c};yield"wait"}}let i=(h,f=0,l,m)=>{s.a=f&255,l!==void 0&&(s.x=l&255),m!==void 0&&(s.y=m&255),s.title.paint?.[h]?.(s.title.model,s),s.emit(G(h,[],s,void 0,g=>s.mem[g+e],g=>s.mem[g]))};function*o(h="wait"){let f={words:[h]};for(;;){let l=s.key();if(l===5&&s.title?.menu&&s.leave(...s.title.menu),s.title?.visit?.[l]){s.visit(l),s.waitingOn=f,yield"wait";continue}if(l!==void 0)return s.waitingOn=null,l;s.waitingOn=f,yield"wait"}}function*c(h){s.inside++;try{return yield*h}finally{s.inside--}}return{e:s,mem:s.mem,call:n,drawn:i,key:o,inside:c}}var ke=B(()=>{yt()});import{objects as Ni}from"@moonbase-machines/vector";var Ms,Mo,Ns,Jt,_t=B(()=>{({carry:Ms,decode:Mo,put:Ns,tables:Jt}=Ni)});var Ps={};z(Ps,{pictures:()=>Tt,shapes:()=>Di,windows:()=>Ui});import{pictures as Pi}from"@moonbase-machines/vector";var Tt,Di,Ui,Xt=B(()=>{({pictures:Tt,shapes:Di,windows:Ui}=Pi)});import{font as Bi}from"@moonbase-machines/vector";var Uo,Bo,Gt,Ds,Us,it,Rt=B(()=>{({GLYPHS:Uo,WIDTHS:Bo,dots:Gt,start:Ds,useFont:Us,width:it}=Bi)});import{draw as zi}from"@moonbase-machines/vector";var qo,Bs,Ko,Wo,zs,Ho,ye,Vo,Yo,Fs=B(()=>{({crossings:qo,draw:Bs,fill:Ko,inside:Wo,line:zs,outline:Ho,screen:ye,spans:Vo,under:Yo}=zi)});var Ks={};z(Ks,{LAYOUT:()=>wt,PANELS:()=>It,layout:()=>Mt,resolve:()=>bt,textLayout:()=>Nt,textPage:()=>kt,textPen:()=>Pt,word:()=>qs});function qs(s,[t,e,n,i]){let o=t|e<<8,c=i===255?n:s[n|i<<8];for(;c-- >0;)o+=s[o]+1;let h="";for(let f=1;f<=s[o];f++)h+=String.fromCharCode(s[o+f]&127);return h}function Mt(s,t){let e=t,n=[];e.tall=!1,e.margin=e.x;let i=9,o=!1,c=[],h=e.ink,f=!1,l=g=>{if(c.length){let k=Ds(c.map(w=>w.ch),e.spacing,e.x,e.centre),y=[];for(let w of c){let O=it(w.ch);y.push({ch:w.ch,x:k,ink:w.ink}),k+=w.ch.charCodeAt(0)<32?O:O+e.spacing}n.push({top:e.y,tall:e.tall,height:i,paper:e.paper,ink:e.ink,chars:y}),e.x=k}c=[],g&&(e.y+=(e.tall?2*i:i)+e.gap,e.x=e.margin)},m=g=>c.push({ch:o&&g>="0"&&g<="9"?String.fromCharCode(128+g.charCodeAt(0)-48):g,ink:f?h:void 0});for(let g=0;g<s.length;g++){let k=s[g];if(k===`
4
+ `){l(!0);continue}if(k==="{"){let y=s.indexOf("}",g),[w,O]=s.slice(g+1,y).split(":"),a=(O??"").split(",").map(u=>parseInt(u,16));switch(g=y,parseInt(w,16)){case 0:e.x=e.margin=a[0];break;case 1:a[0]<192?e.y=a[0]:i=a[0]-192;break;case 2:e.spacing=a[0];break;case 3:e.gap=a[0];break;case 4:e.ink=h=a[0],f=!0;break;case 5:e.paper=a[0];break;case 7:e.centre=!0;break;case 8:e.centre=!1;break;case 9:e.tall=!0;break;case 10:e.tall=!1;break;case 13:h=0,f=!0;break;case 14:h=1,f=!0;break;case 16:o=!0;break;case 17:o=!1;break;case 15:for(let u=0;u<(a[1]||256);u++)m(String.fromCharCode(a[0]&127));break}continue}m(k)}return l(!1),n}function Nt(s,t){let e=[];t.inverse=!1;let n=[],i=c=>{let h=t.centre?40-n.length>>1:t.x;n.forEach((f,l)=>e.push({row:t.y,col:h+l,ch:f.ch,inverse:f.inverse})),n.length&&(t.x=h+n.length),n=[],c&&(t.y++,t.x=t.margin)},o=c=>n.push({ch:t.inverse?c.toUpperCase():c,inverse:t.inverse});for(let c=0;c<s.length;c++){let h=s[c];if(h===`
5
+ `){i(!0);continue}if(h==="{"){let f=s.indexOf("}",c),[l,m]=s.slice(c+1,f).split(":"),g=(m??"").split(",").map(k=>parseInt(k,16));switch(c=f,parseInt(l,16)){case 0:i(!1),t.x=t.margin=g[0];break;case 1:i(!1),g[0]<192&&(t.y=g[0]);break;case 7:t.centre=!0;break;case 8:t.centre=!1;break;case 13:t.inverse=!0;break;case 14:t.inverse=!1;break;case 15:for(let k=0;k<(g[1]||256);k++)o(String.fromCharCode(g[0]&127));break}continue}o(h)}return i(!1),e}var wt,ot,lt,It,bt,Pt,kt,Dt=B(()=>{Rt();wt={65:[116,116,174],50:[116,116,160],49:[130,130,174],34:[130,130,160],17:[158,158,174]},ot=(s,t,e,n,i)=>({layout:s,rows:t,fill:10,paper:10,ink:0,gap:e,y:n,more:i}),lt=(s,t,e,n)=>({layout:s,rows:t,fill:5,paper:5,ink:15,gap:e,y:n}),It={1:ot(50,[116,159],7,128),2:ot(50,[116,159],33,135),3:ot(34,[130,159],5,135),4:ot(34,[130,159],19,142),5:lt(34,[160,189],5,166),6:lt(34,[160,189],19,172),7:ot(65,[116,173],5,121),8:ot(65,[116,173],6,128),9:ot(65,[116,173],7,134),10:ot(65,[116,173],47,142),11:ot(50,[116,159],5,121),12:ot(49,[130,173],5,135),13:ot(49,[130,173],7,142),14:ot(49,[130,173],33,149),15:ot(17,[158,173],5,163,[174]),16:lt(50,[160,189],19,172),17:lt(66,[160,189],19,172),18:lt(50,[160,189],5,166),19:lt(66,[160,189],5,166),20:lt(35,[160,189],0,163),21:lt(51,[160,189],0,163),22:lt(67,[160,189],0,163),23:lt(49,[174,189],5,179),24:lt(65,[174,189],5,179)};bt=(s,t)=>s.replace(/\{6:([0-9a-f,]+)\}/g,(e,n)=>qs(t,n.split(",").map(i=>parseInt(i,16))));Pt=()=>({x:0,y:0,margin:0,centre:!1,inverse:!1}),kt=()=>Array.from({length:24},()=>Array.from({length:40},()=>({ch:" ",inverse:!1})))});var Ws={};z(Ws,{Raster:()=>Ut});var Ut,be=B(()=>{Fs();_t();Rt();Dt();Ut=class{constructor(){this.dots=ye(15),this.kept=null}keepScreen(){this.screenKept={dots:this.dots,kept:this.kept},this.dots=ye(0)}putScreen(){this.screenKept&&({dots:this.dots,kept:this.kept}=this.screenKept),this.screenKept=null}scroll(){for(let t=19;t<=115;t++){let e=this.dots[t],n=[];for(let i of e)n.push(i>>3&1,i>>2&1,i>>1&1,i&1);for(let i=14;i<518;i++)n[i]=n[i+28];for(let i=0;i<140;i++)e[i]=n[4*i]<<3|n[4*i+1]<<2|n[4*i+2]<<1|n[4*i+3]}}set(t,e,n){t>=0&&t<140&&e>=0&&e<192&&(this.dots[e][t]=n&15)}get(t,e){return t>=0&&t<140&&e>=0&&e<192?this.dots[e][t]:0}span(t,e,n,i){for(let o=e;o<=n;o++)this.set(o,i,t)}rows(t,e,n,i){for(let o=n;o<n+e;o++)this.span(t,0,139,o),i&&(this.set(0,o,15),this.set(139,o,15))}whiteLines(t){this.span(15,0,139,t),this.span(15,0,139,t+1)}box(t,e,n,i){let[o,c,h]=wt[t]??wt[50];if(e!==128){this.span(0,1,138,1),this.span(0,1,138,o-1);for(let f=2;f<o-1;f++)this.set(1,f,0),this.set(138,f,0),this.span(e,2,137,f)}n!==128&&(this.whiteLines(c),this.rows(n,h-c-2,c+2,!0)),i!==128&&(this.whiteLines(h),this.rows(i,190-h-2,h+2,!0))}panel(t,e,n){this.whiteLines(t),this.rows(n,e-t-1,t+2,!0)}picture(t){Bs(t,this.dots)}rectangle(t,e,n,i,o){for(let c=n;c<n+o;c++)this.span(t,e,e+i-1,c)}outline(t,e,n,i,o){this.span(t,e,e+i-1,n),this.span(t,e,e+i-1,n+o-1);for(let c=n;c<n+o;c++)this.set(e,c,t),this.set(e+i-1,c,t)}line(t,e,n,i,o){for(let[c,h]of zs(e,n,i,o))this.set(c,h,t)}object(t,e,n,i){i==="keep"&&(this.kept={x:e,y:n,rows:t.rows.map((o,c)=>o.map((h,f)=>this.get(e+f,n+c)))}),Ns(this.dots,t,e,n,i==="whole")}restore(){let t=this.kept;t&&t.rows.forEach((e,n)=>e.forEach((i,o)=>this.set(t.x+o,t.y+n,i)))}glyph(t,e,n,i,o,c=1,h=9,f=0){let l=it(t);if(t.charCodeAt(0)<32){for(let g=0;g<Math.min(9,h);g++)for(let k=0;k<l;k++)for(let y=0;y<c;y++)this.set(e+k,n+g*c+y,o);return l}let m=new Set(Gt(t).map(([g,k])=>g+","+k));for(let g=0;g<Math.min(9,h);g++)for(let k=0;k<l+f;k++)for(let y=0;y<c;y++)this.set(e+k,n+g*c+y,m.has(k+","+g)?i:o);return l}}});import{mli as Fi}from"@moonbase-machines/apple2e";var Hs,ve,Zt,Se=B(()=>{({BLOCK:Hs,CLOCK:ve,Files:Zt}=Fi)});var _s={};z(_s,{codeFiles:()=>Bt,pictureShapes:()=>qi,vectorRoutines:()=>Ee});function Bt(s,t){let e=s?.loads??{};return Object.entries(t).filter(([n])=>/^(PART|PROB)\d$/.test(n)).map(([n,i])=>({name:n,bytes:Uint8Array.from(atob(i.data),o=>o.charCodeAt(0)),origin:e[n]??e[n.slice(0,-1)]??i.aux}))}function dt(s,t,e){let n=pt[t]||"",i=[],o=0;t==="panel"&&i.push(e[o++]);let c={a:s.a,x:s.x,y:s.y};if(t==="objects"&&e[0]?.startsWith?.("$")){let h=parseInt(e[o++].slice(1),16);c.x=h&255,c.y=h>>8}else for(let h of n){let f=e[o++];f===void 0||f===h||(c[h]=typeof f=="object"?f.string.charCodeAt(0)|128:f.startsWith("$")?s.mem[parseInt(f.slice(1),16)]:+f)}return s.a=c.a&255,s.x=c.x&255,s.y=c.y&255,{fixed:i,rest:e.slice(o)}}function Qt(s,t,e,n,i,o){for(s.waitingOn!==t&&(s.emit(G(e,n,s,i)),s.waitingOn=t,s.asked=null);;){let c=s.key();if(c===void 0)return"wait";if(c===st.menu&&s.title.menu&&s.leave(...s.title.menu),s.title.visit?.[c])return s.visit(c),"wait";if(o(c)){s.waitingOn=null;return}}}function Vs(s,t){if(t){s.inside++;try{for(let e=t.next();!e.done;e=t.next())if(e.value==="wait")throw new Error("a choice drawn inside the ask cannot wait")}finally{s.inside--}}}function Ys(s){if(s.objectTables||!s.disk)return s.objectTables;let t=Bt(s.map,Object.values(s.disk.volumes)[0]);return s.objectTables=new Map(Jt(t,s.map.objects).map(e=>[e.address,e.objects]))}function Js(s){if(s.pictureShapes||!s.disk)return s.pictureShapes;let t=Object.values(s.disk.volumes)[0],e=new Map;for(let[n,i]of Object.entries(t))if(/^PICS\d$/.test(n))for(let o of Tt(Uint8Array.from(atob(i.data),c=>c.charCodeAt(0))))e.set(o.name,o.shapes);return s.pictureShapes=e}function Ee(s){let t=s.map.vars,e=a=>t.zero+a;Us(s.font);let n=a=>{if(a.a<2)return;let u=Ys(s)?.get(a.objectTable)?.find(d=>d.number===a.a);u&&(a.c=Ms(u,a.x),a.mem[e(2)]=a.y+u.height&255)},i=s.raster??=new Ut,o=s.pen??={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10};s.text??={showing:!1,pen:Pt(),page:kt()};let c=(a,u)=>Ys(s)?.get(a.objectTable)?.find(d=>d.number===u),h=(a,u)=>{if(a.a<2)return i.restore();let d=c(a,a.a);d&&i.object(d,a.x,a.y,u)},f=a=>{let u=it(a),d=o.x,E=(u<4?4-u:0)+1;i.rectangle(1,d,o.y-2,Math.max(4,u)+4,11),i.outline(13,d,o.y-2,Math.max(4,u)+4,11),i.glyph(a,d+1+E,o.y,15,1,1,8),o.x=d+1+E+u+1+2},l=a=>{let u=s.map.keyPanel;if(!u)return;let d=i.get(2,2),{x:E,y:v}=o;for(let L=u.top;L<u.top+u.rows;L++)i.span(d,u.left,u.right,L);u.caps.forEach(([L,T,I],C)=>{(!a||a===C+1)&&(o.x=L,o.y=T,f(String.fromCharCode(I&127)))}),Object.assign(o,{x:E,y:v})},m=(a,u)=>{for(let d of Mt(bt(u,a.mem),o))for(let E of d.chars)i.glyph(E.ch,E.x,d.top,E.ink??d.ink,d.paper,d.tall?2:1,d.height,o.spacing)},g=(a,u,d,E,v)=>{let L=c(a,u);L&&i.object(L,d,E,v)};s.model={raster:i,pen:o,cap:f,keyPanel:l,print:m,put:g};let k=(a,u)=>(d,E,v)=>{let{fixed:L,rest:T}=dt(d,a,E),I=T.map(C=>typeof C=="object"?C.string:C).join(" ");d.emit(G(a,L,d,T.length?I:void 0,C=>d.mem[e(C)])),T=T.map(C=>typeof C=="object"?C.string:C),u?.(d,L,T)},y=!s.map.askClearsCarry,w=a=>(u,d,E)=>{u.waitingOn!==E&&dt(u,a,d);let v=u.waitingOn===E?u.askMode:u.a;u.askMode=v;let L=[st.left,st.right,st.down,st.up];v===128&&u.waitingOn!==E&&l(0);let T=Qt(u,E,a,[],void 0,I=>{if(a==="ask-escape"&&I===st.escape)return u.a=u.flags(27),u.x=155,u.c=1,u.asked=null,!0;if(u.asked===null){let C=-1,$=I;return v===128?(C=L.indexOf(I),$=219+C,C>=0&&l(C+1)):v>=177&&v<186?I>=49&&I<=(v&127)&&(C=I-49):($=I&95,$>=65&&$<=(v&95&127)&&(C=$-65,$|=128)),C>=0&&(u.asked={place:C,key:$},a==="ask-mode"&&Vs(u,u.askHooks?.chose?.(C))),!1}return I===st.return?(u.x=u.asked.place,u.y=2*u.x,u.a=u.asked.key,u.c=y&&u.a>=193?1:0,!0):((I===st.delete||I===st.left)&&(a==="ask-mode"&&Vs(u,u.askHooks?.undo?.(u.asked.place)),v===128&&l(0),u.asked=null),!1)});return T!=="wait"&&(u.mem[t.layout]=34,u.emit(et(a,u))),T},O={show:k("show",a=>{s.text.showing=!1,a.mem[49181]=128}),"text-screen":a=>{Object.assign(s.text,{showing:!0,page:kt()}),a.mem[49181]=0,a.inside++,a.emit({step:"text-screen"}),a.inside--},picture:k("picture",(a,u,[d])=>{let E=Js(s)?.get(d.toUpperCase().replace(/_/g," "));E&&i.picture(E)}),box:k("box",a=>i.box(a.mem[t.layout],a.a,a.x,a.y)),panel:k("panel",(a,[u])=>{let d=It[u];if(d){a.mem[t.layout]=d.layout,i.panel(d.rows[0],d.rows[1],d.fill);for(let E of d.more??[])i.whiteLines(E);Object.assign(o,{paper:d.paper,ink:d.ink,centre:!0,spacing:1,gap:d.gap,y:d.y})}}),text:(a,u)=>{let d=u[0].string.replace(/\{([0-9a-f]+):([^}]*)\}/g,(E,v,L)=>"{"+v+":"+L.split(",").map(T=>T.startsWith("$")?a.mem[parseInt(T.slice(1),16)].toString(16):T).join(",")+"}").replace(/\{\$([0-9A-Fa-f]{4})\}/g,(E,v)=>String.fromCharCode(a.mem[parseInt(v,16)]&127));if(a.emit(G("text",[],a,d)),s.text.showing){for(let E of Nt(bt(d,a.mem),s.text.pen))s.text.page[E.row]?.[E.col]&&(s.text.page[E.row][E.col]={ch:E.ch,inverse:E.inverse});return}m(a,d)},objects:k("objects",a=>{a.objectTable=a.x|a.y<<8}),object:k("object",a=>{h(a,"whole"),n(a)}),"object-keep":k("object-keep",a=>{h(a,"keep"),n(a)}),"object-mode":k("object-mode",a=>h(a,"clear")),"key-at":k("key-at",a=>{o.x=a.x,o.y=a.y,f(String.fromCharCode(a.a&127))}),key:k("key",a=>f(String.fromCharCode(a.a&127))),"white-lines":k("white-lines",a=>i.whiteLines(a.y)),"fill-rows":k("fill-rows",a=>i.rows(a.a,a.x,a.y,a.c)),span:k("span",a=>i.span(a.a,a.x,a.y,a.mem[e(2)])),dot:k("dot",a=>{i.set(a.x,a.y,a.a),a.a=a.x%7<<4|a.a&15}),line:k("line",a=>i.line(a.mem[e(17)],a.mem[e(0)],a.mem[e(2)],a.mem[e(1)],a.mem[e(3)])),rectangle:k("rectangle",a=>i.rectangle(a.a,a.x,a.y,a.mem[e(14)]+1,a.mem[e(15)])),"rectangle-outline":k("rectangle-outline",a=>i.outline(a.a,a.x,a.y,a.mem[e(14)]+1,a.mem[e(15)]+1)),flash:k("flash"),"read-dot":(a,u)=>{dt(a,"read-dot",u),a.emit(G("read-dot",[],a)),a.a=a.flags(i.get(a.x,a.y)),a.emit(et("read-dot",a))},"key-panel":k("key-panel",a=>l(a.a)),"keep-span":k("keep-span"),"put-span":k("put-span"),"invert-span":k("invert-span"),button:k("button"),beep:(a,u)=>{dt(a,"beep",u),ge("beep",a.a)||a.emit(G("beep",[],a))},sound:(a,u)=>a.emit(G("sound",[],a,u.map(d=>d.startsWith("$")?a.mem[parseInt(d.slice(1),16)].toString(16):d).join(" "))),scroll:a=>{i.scroll(),a.inside++,a.emit({step:"scroll"}),a.inside--},"shift-down":(a,u)=>{let[d,E,v,L,T]=u.map(Number);for(let I=L;I>=v;I--)for(let C=d;C<=E;C++)i.set(C,I+T,i.get(C,I));a.inside++,a.emit({step:"shift-down",left:d,right:E,top:v,bottom:L,by:T}),a.inside--},part:k("part"),wait:(a,u,d)=>Qt(a,d,"wait",[],void 0,E=>E===st.space&&(a.a=32,a.c=0,!0)),"wait-erase":(a,u,d)=>Qt(a,d,"wait-erase",[],void 0,E=>E===st.space),"wait-or-escape":(a,u,d)=>{let E=Qt(a,d,"wait-or-escape",[],void 0,v=>(v===st.space||v===st.escape)&&(a.c=v===st.escape?1:0,a.a=v,!0));return E!=="wait"&&a.emit(et("wait-or-escape",a)),E},ask:w("ask"),"ask-mode":w("ask-mode"),"ask-escape":w("ask-escape"),random:(a,u)=>{let{fixed:d}=dt(a,"random",u);a.emit(G("random",d,a));let E=a.a,{at:v,used:L}=s.map.seed;a.mem[L]===255&&s.seed!==void 0&&(a.mem[v]=s.seed&255,a.mem[v+1]=s.seed>>8);let T=a.mem[v]|a.mem[v+1]<<8;T=T*259&65535,a.mem[v]=T&255,a.mem[v+1]=T>>8,a.mem[L]=E;let I=E?Math.floor(65535/E):65535;a.a=Math.floor(T/I)&255,a.c=0,a.emit(et("random",a))},multiply:(a,u)=>{dt(a,"multiply",u),a.emit(G("multiply",[],a));let d=a.a*a.x;a.a=d&255,a.x=d>>8,a.emit(et("multiply",a))},divide:(a,u)=>{dt(a,"divide",u),a.emit(G("divide",[],a));let d=a.x|a.y<<8,E=a.a||1;a.a=Math.floor(d/E)&255,a.x=d%E,a.emit(et("divide",a))},problem:(a,u,d)=>{if(!a.problem){dt(a,"problem",u),a.emit(G("problem",[],a)),a.mem[t.practice]=a.c?128:0,a.repeats=a.mem[t.repeats],s.map.countInX&&a.c&&(a.mem[t.repeats]=a.x);let E=s.problems?.[a.a];if(!E)throw new Error("problem "+a.a+" is not written yet");let v=s.disk&&Bt(s.map,Object.values(s.disk.volumes)[0]).find(L=>L.name==="PROB"+a.a);v&&a.mem.set(v.bytes,v.origin),a.problem=E(we(a,O))}if(!a.problem.next().done)return"wait";a.problem=null,a.c=0,a.mem[t.repeats]=a.repeats,a.emit(et("problem",a))},"read-key":(a,u,d)=>{a.waitingOn!==d&&(a.waitingOn=d,a.asked=null);let E=a.key();if(E===void 0)return"wait";if(s.visit?.[E])return a.visit(E),"wait";a.waitingOn=null,E===st.menu&&s.menu&&a.leave(...s.menu),a.a=a.flags(E&127),a.c=E===st.escape?1:0,a.emit(et("read-key",a))},splash:(a,u,d)=>{if(a.waitingOn!==d&&(a.inside++,a.emit({step:"splash"}),a.inside--,a.waitingOn=d),a.key()===void 0)return"wait";a.waitingOn=null},"clear-screen":a=>{for(let u of i.dots)u.fill(0);a.inside++,a.emit({step:"clear-screen"}),a.inside--},pause:(a,[u])=>{a.x=0,a.y=0,a.flags(0),a.inside++,a.emit({step:"pause",ms:+u}),a.inside--},quit:a=>{a.ended=!0},unwritten:(a,[u])=>{throw new Error("not written yet: "+(u?.string??u))},"goto-engine":(a,[u])=>{let d=s.entries?.[u];if(!d)throw new Error("no script for "+u);a.enter(...d)},"call-engine":(a,[u])=>{let d=s.entries?.[u];if(!d)throw new Error("no script for "+u);a.stack.push({name:a.name,pc:a.pc}),a.enter(...d)},"load-part":a=>{let u=Object.keys(s.disk?.volumes??{})[0]?.toUpperCase();if(s.files?.out?.has(u)){a.a=a.flags(69),a.c=1;return}a.stack=[],a.enter("part"+a.a,void 0,!0)},"write-settings":a=>{let u=s.files??=new Zt(s.disk),d=Object.keys(s.disk.volumes)[0].toUpperCase(),E=u.out?.has(d)?69:u.disks[d]==="protected"?43:0;a.a=a.flags(E),a.c=E?1:0}};return O}var st,qi,te=B(()=>{yt();ke();_t();Xt();Rt();be();Se();Dt();st={escape:27,space:32,return:13,delete:127,left:8,right:21,down:10,up:11,menu:5};qi=(s,t)=>Js(s)?.get(t.toUpperCase().replace(/_/g," "))});var Gs={};z(Gs,{INLINE:()=>ut,KERNAL:()=>Ki,section:()=>Xs,sectionName:()=>je});function Xs(s,t,e){let{lengths:n,marks:i}=s.sections,o=c=>t(c+e)|t(c+e+1)<<8;return{mark:o(i),length:o(n)}}function je(s,t,e,n){let i=s.sections;if(!i||e!==i.file)return e;for(let o=0;o<i.count;o+=2){let c=Xs(s,t,o);if(c.length&&c.mark===n)return e+":"+o}return e}var $e,ut,Ki,Ce=B(()=>{$e=s=>(t,e)=>{let n=[];for(let i=0;i<s;i++)n.push(t(e+i).toString(16));return{length:s,value:n.join(" ")}},ut={fill:$e(7),copy:$e(8),prodos:$e(3),"boot-say":(s,t)=>ut.say(s,t),say(s,t){let e="",n=t;for(let i=0;i<1024;i++){let o=s(n++);if(!o)break;e+=String.fromCharCode((o^128)&127)}return{length:n-t,value:e}},print(s,t){let e="",n=t;for(let i=0;i<256;i++){let o=s(n++);if(!o)break;e+=String.fromCharCode(o&127)}return{length:n-t,value:e}}};Ki={65490:"chrout",65508:"getin",65520:"plot",65484:"clrchn",65505:"stop",65463:"readst",65466:"setlfs",65469:"setnam",65493:"load",65496:"save",65457:"listen",65427:"second",65448:"ciout",65454:"unlsn",65460:"talk",65430:"tksa",65445:"acptr",65451:"untlk",65499:"settim",65502:"rdtim",65424:"setmsg"}});import{rom as Wi}from"@moonbase-machines/apple2e";var Zs,Qs=B(()=>{({install:Zs}=Wi)});import{kernal as Hi}from"@moonbase-machines/c64";var ee,tn,en,sn,nn,rn,da,Oe=B(()=>{({KEY_TABLES:ee,VECTORS:tn,VIC:en,install:sn,kernalByte:nn,matrixOf:rn,screenCode:da}=Hi)});import{drive as Vi}from"@moonbase-machines/c64";var se,Ae=B(()=>{({Drive:se}=Vi)});var on={};z(on,{Printer:()=>Le,WIDTH:()=>Ji,bus:()=>Te,paper:()=>_i});import{printer as Yi}from"@moonbase-machines/c64";var Le,Ji,Te,_i,Re=B(()=>{({Printer:Le,WIDTH:Ji,bus:Te,paper:_i}=Yi)});import{basic as Xi}from"@moonbase-machines/c64";var an,cn=B(()=>{({Basic:an}=Xi)});import{numbers as Gi}from"@moonbase-machines/c64";var ln,ba,va,Sa,Ea,$a,ja,Ca,Oa,fn=B(()=>{({BasicError:ln,ERRORS:ba,fail:va,fout:Sa,int16:Ea,nextRandom:$a,scanNumber:ja,seedRandom:Ca,val:Oa}=Gi)});import{basicRom as Zi}from"@moonbase-machines/c64";var Ta,hn,pn,dn=B(()=>{({evaluateInMemory:Ta,install:hn,printError:pn}=Zi)});import{disasm as Qi}from"@moonbase-machines/mos6502";var un,mn,Ma,ht,xn,gn=B(()=>{({OPS:un,SIZE:mn,disassemble:Ma,hex:ht,operand:xn}=Qi)});import{inline as tr}from"@moonbase-machines/vector";var wn,Da,Ua,Ba,kn=B(()=>{({INLINE:wn,name:Da,sound:Ua,text:Ba}=tr)});var yn={};z(yn,{lift:()=>Ie,readers:()=>ne,script:()=>Me});function Ie(s,t,e,n,i=new Set,o=er){let c=o,h=new Map,f=new Set(e),l=new Set,m=[...e],g=O=>O>=t&&O<t+s.length;for(;m.length;){let O=m.pop(),a={};for(;g(O)&&!h.has(O);){l.add(O);let u=O-t,d=un[s[u]];if(d.name==="???"){h.set(O,{line:".byte $"+ht(s[u],2)+" ; not an instruction",end:O+1});break}let E=mn[d.mode],v=s[u+1]|s[u+2]<<8,L=s.subarray(u,u+E),T=(d.name+" "+xn(d.mode,L,O)).trim(),I=O+E,C=!1;if(d.mode==="imm"&&"LDA LDX LDY".includes(d.name)?a[d.name[2]]=s[u+1]:(d.name.startsWith("T")||d.name.startsWith("IN")||d.name.startsWith("DE")||d.name.startsWith("LD")||d.name==="PLA")&&delete a[d.name.at(-1)],d.name==="JSR"&&n[v]){let $=n[v],j=c[$]?.(s,I-t),R=["A","X","Y"].map(A=>a[A]===void 0?"":A+"="+a[A]).filter(Boolean).join(" ");T=$+(j?" "+j.words:"")+(R&&!j?" ; "+R:""),j&&(I+=j.length);for(let A in a)delete a[A]}else if(d.name==="JSR"){g(v)&&(f.add(v),m.push(v));for(let $ in a)delete a[$]}else if(d.name==="JMP"&&d.mode==="abs")g(v)?(f.add(v),m.push(v)):T+=" ; into PART0"+(n[v]?", "+n[v]:""),C=!0;else if(d.name==="JMP"||d.name==="RTS"||d.name==="RTI"||d.name==="BRK")C=!0;else if(d.mode==="rel"){let $=O+2+(s[u+1]<<24>>24)&65535;f.add($),m.push($)}if((d.mode==="abx"||d.mode==="aby")&&d.name==="LDA"&&g(v))for(let $=u+3;$<u+12&&$+2<s.length;$++){if(s[$]!==s[u]||(s[$+1]|s[$+2]<<8)!==v+1)continue;let j=[];for(let R=v-t;R+1<s.length&&j.length<64&&!(j.length&&i.has(t+R));R+=2){let A=s[R]|s[R+1]<<8;if(!g(A))break;j.push(A)}T+=" ; a table of "+j.length+" addresses";for(let R of j)f.add(R),m.push(R);break}h.set(O,{line:T,end:I,op:d.name,mode:d.mode,value:E===2?s[u+1]:v,call:d.name==="JSR"&&n[v]?{name:n[v],words:c[n[v]]?.(s,O+3-t)?.words}:null,stop:C});for(let $=O+1;$<I;$++)l.add($);if(C)break;O=I}}let k=[],y=null;for(let O of[...h.keys()].sort((a,u)=>a-u))y!==null&&O!==y&&k.push(""),f.has(O)&&k.push("L"+ht(O,4)+":"),k.push(ht(O,4)+" "+h.get(O).line),y=h.get(O).end;let w=[];for(let O=t;O<t+s.length;){if(l.has(O)){O++;continue}let a=O;for(;O<t+s.length&&!l.has(O);)O++;w.push([a,O-a])}return{listing:k.join(`
6
+ `),left:w,reached:l.size,size:s.length,lines:h,targets:f}}function Me({lines:s,targets:t,left:e},n,i,{stops:o=new Set,selfModified:c=!1,memory:h=!1,moved:f=[]}={}){let l=(C,$=4)=>"$"+ht(C,$),m=new Set(f);if(c)for(let C of s.values())/^(STA|STX|STY|INC|DEC|ASL|LSR|ROL|ROR)$/.test(C.op)&&/^(abs|abx|aby)$/.test(C.mode)&&m.add(C.value);let g=null,k=()=>g!==null&&(h||m.has(g+1)||m.has(g+2)),y=C=>{let $=C.value;if(k()&&C.mode==="imm"&&(h||m.has(g+1)))return l(g+1);if(k()&&/^(abs|abx|aby)$/.test(C.mode))return"["+l(g+1)+"]"+(C.mode==="abs"?"":"["+C.mode.at(-1)+"]");switch(C.mode){case"imm":return String($);case"zp":return l($,2);case"zpx":return l($,2)+"[x]";case"zpy":return l($,2)+"[y]";case"abs":return l($);case"abx":return l($)+"[x]";case"aby":return l($)+"[y]";case"izy":return"("+l($,2)+")[y]";case"izx":return"("+l($,2)+"[x])";case"acc":return"a";default:return"?"}},w=C=>"L"+ht(C,4),O={BEQ:"zero",BNE:"not zero",BCS:"carry",BCC:"not carry",BMI:"negative",BPL:"not negative",BVS:"overflow",BVC:"not overflow"},a={BEQ:"==",BNE:"!=",BCS:">=",BCC:"<"},u=(C,$)=>C+2+($.value<<24>>24)&65535,d=[...s.keys()].sort((C,$)=>C-$),E=[],v=C=>["JMP","RTS","RTI"].includes(C.op);t=new Set(t),d.forEach((C,$)=>{let j=s.get(C);j.op&&!v(j)&&$+1<d.length&&j.end!==d[$+1]&&s.has(j.end)&&t.add(j.end)});let L=[],T=()=>{for(let[C,$,j]of L)E.push(ht(C,4)+" "+$+" = "+j);L=[]},I=null;for(let C=0;C<d.length;C++){let $=d[C],j=s.get($),R=s.get(d[C+1]),A=P=>E.push(ht($,4)+" "+P);if(g=$,I&&I.op&&!v(I)&&I.end!==$&&s.has(I.end)&&(T(),E.push(ht(I.pc,4)+" goto "+w(I.end))),I={...j,pc:d[C]},t.has($)&&(T(),E.push(w($)+":")),!j.op){T(),A("asm "+j.line);continue}let F=j.op.at(-1).toLowerCase();if(j.call){let[P,...W]=j.call.name.split(" "),J=pt[P]||"",H=Object.fromEntries(L.map(([,nt,xt])=>[nt,xt]));L=L.filter(([,nt])=>!J.includes(nt)),T();let rt=[...W,...[...J].map(nt=>H[nt]??nt)];P==="objects"&&H.x!==void 0&&H.y!==void 0&&rt.splice(W.length,2,l(H.x|H.y<<8)),(P==="key-at"||P==="key")&&(rt[0]=H.a!==void 0?JSON.stringify(String.fromCharCode(H.a&127)):rt[0]),A([P,...rt,j.call.words??""].join(" ").trim());continue}switch(j.op){case"LDA":case"LDX":case"LDY":if(j.mode==="imm"&&!k()){L=L.filter(([,P])=>P!==F),L.push([$,F,j.value]);break}if(j.mode==="aby"||j.mode==="abx"){let[P,W,J,H]=[1,2,3,4].map(q=>s.get(d[C+q]));if(P?.op==="STA"&&W?.op==="LDA"&&W.value===j.value+1&&J?.op==="STA"&&H?.op==="JMP"&&P.value===d[C+4]+1&&J.value===d[C+4]+2){T(),A("goto ["+l(j.value)+" "+j.mode.at(-1)+"]"),C+=4,I=null;break}}T(),A(F+" = "+y(j));break;case"STA":case"STX":case"STY":T(),A(y(j)+" = "+F);break;case"TAX":case"TAY":case"TXA":case"TYA":T(),A(j.op[2].toLowerCase()+" = "+j.op[1].toLowerCase());break;case"INX":case"INY":case"DEX":case"DEY":T(),A(F+(j.op[0]==="I"?" += 1":" -= 1"));break;case"INC":case"DEC":T(),A(y(j)+(j.op==="INC"?" += 1":" -= 1"));break;case"CLC":case"SEC":T(),A("carry = "+(j.op==="SEC"?1:0));break;case"ADC":T(),A("a += "+y(j)+" + carry");break;case"SBC":T(),A("a -= "+y(j)+" + borrow");break;case"AND":T(),A("a &= "+y(j));break;case"ORA":T(),A("a |= "+y(j));break;case"EOR":T(),A("a ^= "+y(j));break;case"ASL":case"LSR":case"ROL":case"ROR":T(),A(y(j)+" "+{ASL:"<<= 1",LSR:">>= 1",ROL:"rotate left",ROR:"rotate right"}[j.op]);break;case"BIT":T(),A("test "+y(j));break;case"CMP":case"CPX":case"CPY":{T();let P=j.op==="CMP"?"a":j.op[2].toLowerCase();R&&a[R.op]&&!t.has(d[C+1])?(A("if "+P+" "+a[R.op]+" "+y(j)+" goto "+w(u(d[C+1],R))),C++,I={...R,pc:d[C]}):A("compare "+P+" "+y(j));break}case"JMP":if(T(),j.mode==="abs"&&k()){A("goto ("+l($+1)+")");break}A(j.mode==="abs"?j.value>=i&&j.value<i+n.length?"goto "+w(j.value):"goto-engine "+l(j.value):"goto ("+l(j.value)+")");break;case"JSR":if(T(),k()){A("call ("+l($+1)+")");break}A(j.value>=i&&j.value<i+n.length?"call "+w(j.value):"call-engine "+l(j.value));break;case"RTS":T(),A("return");break;case"PHA":case"PLA":case"PHP":case"PLP":T(),A({PHA:"push a",PLA:"pull a",PHP:"push flags",PLP:"pull flags"}[j.op]);break;case"NOP":break;default:if(O[j.op]){T(),A("if "+O[j.op]+" goto "+w(u($,j)));break}T(),A("asm "+j.line)}}T();for(let[C,$]of e){let j=0;for(;j<$&&!(j&&o.has(C+j))&&!o.has(C);)j++;if(!j)continue;let R=[];for(let A=0;A<j;A+=16)R.push("data "+l(C+A)+" "+Array.from(n.subarray(C-i+A,C-i+Math.min(j,A+16)),F=>ht(F,2)).join(" "));E.push("",...R)}return E.join(`
7
+ `)+`
8
+ `}var ne,er,Ne=B(()=>{gn();kn();yt();ne=s=>Object.fromEntries(Object.entries(s).map(([t,e])=>[t,(n,i)=>{let o=e(c=>n[c],i);return{length:o.length,words:t==="text"||t==="print"||t==="say"?JSON.stringify(o.value):o.value}}])),er=ne(wn)});var vn={};z(vn,{cardRoutines:()=>Pe});function bn(s,t,e){let n=pt[t]||"",i=0,o=null;for(let c of n){let h=e[i++];if(h===void 0||h===c||typeof h=="object")continue;let f=h.startsWith("$")?s.mem[parseInt(h.slice(1),16)]:+h;c==="c"?s.c=f&1:(s[c]=f&255,o!=="a"&&(o=c))}return o&&s.flags(s[o]),e.slice(i)}function Pe(s){let t=s.map,e=s.disk.kind==="c64",n=e?null:s.files??=new Zt(s.disk),i=s.screen??={text:1,mixed:0,page2:0,hires:0},o=0,c={bank:2,read:0,aside:new Uint8Array(4096)},h=(r,p)=>{if(p===c.bank)return;let x=r.mem.slice(53248,57344);r.mem.set(c.aside,53248),c.aside=x,c.bank=p},f=s.chip=new Uint8Array(4096),l={4:r=>r&255,5:r=>r>>8&255,8:r=>r*7&255,9:r=>r*13&255};function m(r,p,x){let S=p&4095;if(S<1024){let b=S&63;if(x===void 0&&(b===17||b===18))return r.raster=r.clock?Math.floor(r.cycles/63)%312:((r.raster??0)+1)%312,b===18?r.raster&255:f[17]&127|r.raster>>1&128;if(x===void 0&&b===25)return r.vicFlags??112;if(x===void 0)return f[b];if(f[b]=x,r.splitLine!==void 0&&b!==25){let N=r.clock?r.clock.splits??=new Map:s.splits??=new Map;(N.get(r.splitLine)??N.set(r.splitLine,new Map).get(r.splitLine)).set(b,x)}b===26&&!(x&1)&&s.splits?.clear();return}if(S<2048){let b=1024|S&31;if(x===void 0)return f[b];f[b]=x,r.sid?.push([r.cycles,S&31,x]);return}if(S<3072){if(x===void 0)return f[S]|240;f[S]=x&15;return}if(S<3328){let b=S&15;if(x===void 0)return l[b]?l[b](s.seed??17):b<2?255:b===13?0:f[3072|b];f[3072|b]=x;return}if(x===void 0)return f[S];if(f[S]=x,(S&15)===0&&r.splitLine!==void 0){let b=r.clock?r.clock.splits??=new Map:s.splits??=new Map;(b.get(r.splitLine)??b.set(r.splitLine,new Map).get(r.splitLine)).set(256,x)}}let g=r=>(r.mem[1]&3)!==0&&(r.mem[1]&4)!==0;function k(r,p,x){if(e&&p>=57344){if(x===void 0)return nn(p);r.mem[p]=x;return}if(e)return m(r,p,x);if((p&65520)===49280){let S=p&15;return h(r,S&8?1:2),c.read=(S&1)===(S>>1&1)?1:0,0}if(p>=49232&&p<=49239){let S=["text","mixed","page2","hires"][p-49232>>1];return i[S]=p&1,0}if(p===49152&&x===void 0){if(!(o&128)){let S=r.key();S!==void 0&&S>=0&&(o=S|128)}return++r.idle>2e3&&(r.polled=!0),o}if(p===49168){let S=o;return!(o&128)&&++r.idle>2e3&&(r.polled=!0),o&=127,S}return p===49200&&r.clicks.push(r.cycles),0}let y=null,w={hooks:new Map,cycles:0,a:0,x:0,y:0,z:0,c:0,n:0,v:0,read:r=>y.mem[r],write:(r,p)=>{y.mem[r]=p&255},nz(r){this.n=r>>7&1,this.z=r?0:1}},O=0;e?sn({cpu:w,read:r=>y.read(r),write:(r,p)=>y.write(r,p),drive:s.bus??=Te(s.drive??=new se(Uint8Array.from(atob(s.disk.image),r=>r.charCodeAt(0))),s.printer??=new Le({on:!1})),held:()=>{let r=y?.clock?.held;return r?.up&&(y.clock.held=null),r&&(r.seen=!0),r??null},call:r=>{M(y,r,"the keyboard read"),Object.assign(w,{a:y.a,x:y.x,y:y.y,c:y.c,z:y.z,n:y.n,v:y.v})},loaded:(r,p,x)=>{(s.files64??=[]).push({name:r,from:p,to:x});let S=s.fileScripts?.[r];if(S){let b={script:S,from:p,to:x};u.splice(0,1/0,...u.filter(N=>N.from<b.from||N.to>b.to),b)}}}):Zs({cpu:w,game:s.disk,sw:{lcRead:0},io:r=>k(y,r),file:r=>n.file(r),get files(){return n.files},put:(r,p)=>n.put(r,p),remove:r=>n.remove(r),clicks:{push:r=>y.clicks.push(y.cycles+r-O)},log(){},halted:!1});let a=(r,p)=>{let x=w.hooks.get(p);if(!x&&e&&p>=40960&&p<49152)throw new Error("a BASIC program, calling BASIC's ROM at $"+ct(p)+": not written yet in the remake");if(!x)throw new Error("no ROM routine at $"+ct(p));y=r,Object.assign(w,{a:r.a,x:r.x,y:r.y,c:r.c,z:r.z,n:r.n,v:r.v,pc:p,sp:r.sp()-2&255});let S=O=w.cycles,b=x(w);if(b==="wait")return"wait";if(r.delay+=(w.cycles-S+6)/ve*1e3,r.cycles+=w.cycles-S+6,Object.assign(r,{a:w.a&255,x:w.x&255,y:w.y&255,c:w.c,z:w.z,n:w.n}),b==="return")return b;if(b===!1&&w.pc!==p)return{to:w.pc}},u=[],d=null,E=(r,p)=>{if(!d){d=new Map;for(let x of Object.keys(r.sources)){let S=r.script(x);for(let b of Object.keys(S.labels))if(/^L[0-9A-F]{4}$/.test(b)){let N=parseInt(b.slice(1),16);(d.get(N)??d.set(N,[]).get(N)).push(x)}}}return d.get(p)??[]},v=(r,p)=>{let x=s.files64?.findLast(U=>U.from<=p&&p<=U.to)??(p>=512&&p<40960?{name:"MEMORY",from:512,to:40959}:null);if(!x)return null;let S=r.mem.slice(x.from,x.to+1),b=(s.fileScripts?.[x.name]??x.name)+"@"+ct(p),N=Ie(S,x.from,[p],t.routines,new Set,ne(ut));return r.sources[b]=Me(N,S,x.from,{selfModified:!0}),d=null,u.push({script:b,from:x.from,to:x.to}),(s.liftedAtNeed??=[]).push(x.name+" $"+ct(p)),console.warn(`lifted at need: ${x.name} from $${ct(p)} (an entry for its scene's lift)`),b},L=new Set(Object.values(s.fileScripts??{})),T=(r,p)=>e?r.filter(x=>!L.has(x)||u.some(S=>S.script===x&&S.from<=p&&p<=S.to)):r,I=(r,p)=>{let x=T(E(r,p),p);!x.length&&e&&v(r,p)&&(x=T(E(r,p),p));let S=u.findLast(N=>x.includes(N.script)&&N.from<=p&&p<=N.to),b=x.length>1?S?.script:x[0];if(!b)throw new Error("no script has $"+ct(p));return[b,"L"+ct(p)]},C=(r,p)=>e?p>=57344?(r.mem[1]&2)!==0:p>=40960&&p<49152?(r.mem[1]&3)===3:p===115||p===121:p>=53248?!(c.read&&E(r,p).length):w.hooks.has(p)&&!E(r,p).length,$=r=>t.stir&&r?.at>=t.stir.from&&r.at<=t.stir.to,j=(r,p,x)=>{x&&r.inside++,r.emit(p),x&&r.inside--},R=r=>{let p=r.stack.pop();p.name!==r.name&&r.enter(p.name),r.pc=p.pc,p.inside&&(r.inside--,p.done?.(r)),p.after?.(r)},A=new Set(["town","restart","escape"]),F=(r,p,x,S)=>{if(p?.at==null)return S.map(N=>parseInt(N,16));let b=[];for(let N=0;N<x;N++)b.push(r.mem[p.at+3+N&65535]);return b},P=r=>r.map(p=>p.toString(16)).join(" "),W=r=>(t.unplaced?.includes(r.step)&&(delete r.x,delete r.y),r),J={chrout:[806,61898],chrin:[804,61783],getin:[810,61758],save:[818,62957]},H=(r,p)=>(x,S,b)=>{bn(x,r,S),j(x,W(G(r,[],x,void 0,void 0,K=>x.mem[K])),$(b));let N=e&&J[r],U=N&&x.mem[N[0]]|x.mem[N[0]+1]<<8;if(N&&U!==N[1]){let[K,Q]=I(x,U);x.callInside(K,Q,tt=>{gt[r]&&tt.emit(et(r,{a:tt.a,x:tt.x,y:tt.y,c:tt.c}))},b?.at==null?void 0:b.at+2&65535);return}let D=a(x,p);if(D==="wait")return"wait";if(D?.to!==void 0)return x.stackPage(),x.stack.push({name:x.name,pc:x.pc,inside:!0,ret:b?.at==null?void 0:b.at+2&65535}),x.inside++,q["goto-engine"](x,["$"+ct(D.to)],b);gt[r]&&e&&x.emit(et(r,{a:x.a,x:x.x,y:x.y,c:x.c}))},q={prodos:(r,p,x)=>{let S=F(r,x,3,p),[b,N,U]=S,D=N|U<<8;j(r,G("prodos",[],r,P(S)),$(x));let K={read:tt=>r.mem[tt],write:(tt,ft)=>{r.mem[tt]=ft&255}};if(b===202){let tt=r.mem[D+1],ft=n.open.get(tt),_=r.mem[D+2]|r.mem[D+3]<<8,ue=ft?Math.min(r.mem[D+4]|r.mem[D+5]<<8,ft.f.body.length-ft.at):0,ks=ft&&s.fileScripts?.[je(t,jt=>r.mem[jt],ft.f.path,ft.at)];if(ks&&ue){let jt={script:ks,from:_,to:_+ue-1};u.splice(0,1/0,...u.filter(ys=>ys.from<jt.from||ys.to>jt.to),jt)}r.delay+=Math.ceil(ue/512)*Hs/ve*1e3}let Q=n.call(b,D,K);r.cycles+=6,Q===null&&(Q=1),r.a=Q==="quit"?0:Q,r.c=r.a?1:0,r.z=r.a?0:1,Q==="quit"&&(r.ended=!0)},stirred:r=>{for(let p of t.stir.counts)r.mem[p]=s.seed&255},hposn:H("hposn",62481),hlin:H("hlin",62778),hcolor:H("hcolor",63216),"clear-page":H("clear-page",62452),pause:H("pause",64680),home:H("home",64600),outport:H("outport",65173),"call-engine":(r,[p],x)=>{let S=parseInt(p.slice(1),16);if(C(r,S)){let U=a(r,S);if(U==="return"){R(r);return}return U}if(!e&&r.mem[S]===96){r.cycles+=6;return}let[b,N]=I(r,S);r.stack.push({name:r.name,pc:r.pc,ret:x?.at==null?void 0:x.at+2&65535}),r.enter(b,N)},"goto-engine":(r,[p],x)=>{let S=parseInt(p.slice(1),16),b=t.routines[S];if(b){if(A.has(b))return q[b](r,[],x);let N=e&&r.stack.at(-1)?.rom;N&&r.inside++;let U;try{U=q[b](r,[],x)}finally{N&&r.inside--}let D=r.stack.at(-1);if(D?.inside){let K=D.done;D.done=Q=>{K?.(Q),R(Q)}}else R(r);return U}if(C(r,S)){if(a(r,S)==="wait")return"wait";e&&nt.has(S)&&xt(r),R(r);return}if(!e&&r.mem[S]===76&&!E(r,S).length)return q["goto-engine"](r,["$"+ct(r.mem[S+1]|r.mem[S+2]<<8)],x);r.enter(...I(r,S))}};e&&s.basic&&(q.sys=(r,p,x,S)=>{r.mem[122]=x&255,r.mem[123]=x>>8;let b=r.mem;Object.assign(r,{a:b[780],x:b[781],y:b[782],c:b[783]&1,z:b[783]>>1&1,n:b[783]>>7});let N=K=>{b[780]=K.a,b[781]=K.x,b[782]=K.y,b[783]=K.c|K.z<<1|(K.i??0)<<2|(K.d??0)<<3|K.v<<6|K.n<<7};if(C(r,p)){let K=a(r,p);return N(r),K}let[U,D]=I(r,p);r.stack.push({name:r.name,pc:r.pc,rom:!0,after:N}),r.enter(U,D)},q["basic-load"]=(r,[p,x=1,S=0])=>{let b=r.mem;for(let U=0;U<p.length;U++)b[512+U]=p.charCodeAt(U);Object.assign(b,{183:p.length,187:0,188:2,186:x,185:S,184:0}),Object.assign(r,{a:0,x:1,y:8}),r.basic.call("load");let N=Object.entries(s.basic).find(([,U])=>U.file===p);if(S===0&&N){rt(r,N[0]),r.enter(N[0]);return}r.pc=0},hn({cpu:w,read:r=>y.read(r),write:(r,p)=>y.write(r,p),evaluate:r=>{let p=y.sources[y.basic.script]?.params?.[r];if(!p)throw new Error("no parameter compiled at $"+ct(r));let[x,S,b]=p;return{value:S(y.basic),end:x,place:b}}})),e&&s.basic&&(q.error=(r,p)=>!(p instanceof ln)||!r.basic?!1:(y=r,pn({cpu:w,write:(x,S)=>{r.mem[x]=S}},p.message,r.basic.at)));let rt=(r,p)=>{r.basic=new an(r,s.basic[p]),r.basic.script=p};for(let[r,p]of Object.entries(t.routines).map(([x,S])=>[+x,S]))!q[p]&&r>=53248&&(q[p]=H(p,r)),!(q[p]||r>=48896)&&(q[p]=(x,S,b)=>{if(bn(x,p,S),A.has(p)&&x.inside){for(let _ of x.stack)_.inside&&(delete _.inside,delete _.done);x.inside=0}let N=b?.at!=null?x.mem[b.at+1&65535]|x.mem[b.at+2&65535]<<8:null,U=$(b),D=t.routines[N]===p?N:parseInt(Object.entries(t.routines).find(([,_])=>_===p)[0]);p==="read-key"&&(x.mem[t.seed]=s.seed&255,x.mem[t.seed+1]=s.seed>>8);let K=ut[p]&&b?.at!=null?ut[p](_=>x.mem[_&65535],b.at+3).value:void 0;j(x,G(p,[],{a:x.a,x:x.x,y:x.y,c:x.c},K,void 0,_=>x.mem[_]),U);let[Q,tt]=I(x,D);if(p==="escape"&&b?.at!=null&&x.stack.push({name:x.name,pc:x.pc,ret:b.at+2&65535}),A.has(p)){x.enter(Q,tt),x.entered=D;return}let ft=_=>{_.mem[t.seed]=s.seed&255,_.mem[t.seed+1]=s.seed>>8};x.callInside(Q,tt,_=>{p==="read-key"&&ft(_),gt[p]&&!U&&_.emit(et(p,{a:_.a,x:_.x,y:_.y,c:_.c}))},b?.at==null?void 0:b.at+2&65535)});q.elsewhere=(r,p)=>{let x=parseInt(p.slice(1),16),S=u.findLast(b=>b.from<=x&&x<=b.to);return S!==void 0&&S.script!==r.name&&/^L[0-9A-F]{4}$/.test(p)},q.timed=!0,q.polls=t.polls,q.reads=t.reads,e&&(q.getin=r=>{!r.clock&&!r.i&&(q.poll(r),r.polledSince=!0);let p;if(r.mem[198]?(p=r.mem[631],r.mem.copyWithin(631,632,631+r.mem[198]),r.mem[198]--):p=r.key(),r.c=0,p===void 0||p<0){r.a=r.flags(0),++r.idle>(r.polls??t.polls??200)&&!r.clock&&(r.polled=!0);return}r.a=r.flags(p),r.idle=0,r.emit(et("getin",{a:p}))});let nt=new Set([59953,60027,60030,60033]);q.poll=r=>{q.interrupt(r),f[26]&1&&q.interrupt(r,!0)};let xt=r=>{for(let p of["y","x","a"]){let x=r.stack.pop();if(x?.a===void 0||x.name!==void 0)throw new Error("the end of an interrupt with its registers not on the stack");r[p]=x.a}};e&&(q.interrupt=(r,p=!1)=>{if(r.i)return;let x=r.mem[788]|r.mem[789]<<8,S={a:r.a,x:r.x,y:r.y,n:r.n,z:r.z,c:r.c,v:r.v,d:r.d};r.vicFlags=p?241:112,p&&(r.splitLine=f[18]|(f[17]&128)<<1);try{C(r,x)?a(r,x):(r.i=1,M(r,x,"the interrupt routine",b=>b.stack.push({a:S.a},{a:S.x},{a:S.y})))}finally{Object.assign(r,S),r.i=0,r.vicFlags=r.splitLine=void 0}});function M(r,p,x,S){let b=!1;r.callInside(...I(r,p),()=>{b=!0}),S?.(r);for(let N=0;!b;N++){if(N>1e6)throw new Error(x+" at $"+ct(p)+" runs on without end");if(r.exec(r.program.steps[r.pc])==="wait")throw new Error(x+" at $"+ct(p)+" waits")}}return q.inline=(r,p)=>ut[p.words[0]]?ut[p.words[0]](x=>r.mem[x&65535],p.at+3).length:0,q.before=(r,p)=>{if(e&&r.clock&&!r.i){r.cycles>=r.clock.irq&&(r.clock.irq=Math.max(r.clock.irq+16421,r.cycles),q.interrupt(r));let U=Math.floor(r.cycles/63)%312,D=r.clock.line??U,K=f[18]|(f[17]&128)<<1;r.clock.line=U,U<D&&(s.splits=r.clock.splits??new Map,r.clock.splits=new Map),f[26]&1&&(D<=U?D<K&&K<=U:K>D||K<=U)&&q.interrupt(r,!0)}let x=p.start??p.at,S=x!=null&&r.inside===0?t.routines[x]:void 0,b=r.entered===x;if(r.entered=null,S&&!b&&!$(p)){j(r,G(S,[],{a:r.a,x:r.x,y:r.y,c:r.c},void 0,void 0,D=>r.mem[D]));let U=r.stack.at(-1);U?.name!==void 0&&!U.inside&&(U.inside=!0,U.done=D=>{gt[S]&&D.emit(et(S,{a:D.a,x:D.x,y:D.y,c:D.c}))},r.inside++)}if(t.ticks?.find(U=>U.at===p.at&&r.name===s.fileScripts?.[U.scene])){if(r.ticking===p){r.ticking=null,r.keys[0]===-1&&r.keys.shift();return}return r.emit({step:"tick"}),r.ticking=p,"wait"}},q.setup=r=>{if(e){if(!s.io||s.io[0]>53248||s.io[1]<ee[1]-1)throw new Error("a Commodore 64 title's io must cover $D000 to the KERNAL's keyboard tables");r.ioAt=p=>p>=53248&&p<=57343&&g(r)||p>=ee[0]&&p<ee[1]&&(r.mem[1]&2)!==0,Object.assign(r.mem,{0:47,1:55,153:0,154:3,185:1,186:8,648:4,646:14}),Object.assign(r.mem,{197:64,203:64,204:1,649:10,650:0,651:4,652:16,655:72,656:235}),en.forEach((p,x)=>{f[x]=p}),f[3328]=151,tn.forEach((p,x)=>{r.mem[788+2*x]=p&255,r.mem[789+2*x]=p>>8});for(let p=0;p<1e3;p++)r.mem[1024+p]=32,f[2048+p]=14;for(let[p,x]of Object.entries(s.load??{})){let S=s.drive.find(Uint8Array.from(p,b=>b.charCodeAt(0))).raw;r.mem.set(S.subarray(2),x)}r.io=(p,x)=>k(r,p,x),s.basic&&(Object.assign(r.mem,{205:2,206:32,207:0,647:254}),rt(r,s.start));return}for(let[p,x]of Object.entries(s.load??{}))r.mem.set(n.file("/"+n.volumes[0]+"/"+p).body,x);if(s.disk.kind==="dos33"){for(let p=0;p<24;p++)r.mem.fill(160,1024+(p&7)*128+(p>>3)*40,1024+(p&7)*128+(p>>3)*40+40);for(let[p,x,S]of s.disk.loads)S&&h(r,S),r.mem.set(n.file(p).body,x);h(r,1),c.read=1,Object.assign(r.mem,{32:0,33:40,34:16,35:24,50:255}),r.delay=2500}r.io=(p,x)=>k(r,p,x)},q}var ct,De=B(()=>{yt();Ce();Se();Qs();Oe();Ae();Re();cn();fn();dn();Ne();ct=s=>s.toString(16).toUpperCase().padStart(4,"0")});var Sn={};z(Sn,{blank:()=>nr,placed:()=>ir,started:()=>Ue,units:()=>rr});import{prodos as sr}from"@moonbase-machines/apple2e";var nr,ir,Ue,rr,Be=B(()=>{({blank:nr,placed:ir,started:Ue,units:rr}=sr)});var $n={};z($n,{loadTitle:()=>ze,makeEngine:()=>Fe,read:()=>zt,titleOf:()=>re});async function zt(s,t){if(s.protocol==="file:"){let n=globalThis.process.getBuiltinModule("node:fs").readFileSync(s,"utf8");return t==="json"?JSON.parse(n):n}let e=await fetch(s);if(!e.ok)throw new Error(`${s.pathname}: ${e.status}`);return t==="json"?e.json():e.text()}async function re(s){s=new URL(s);let t={...await ie(new URL("title.js",s))};for(let e of t.modules??[])t[e]=await ie(new URL(e+".js",s));return t.view&&(t.viewSteps=await ie(new URL("view.js",s))),t}async function ze(s,{data:t,scenes:e=!1,fixed:n=!1}={}){s=new URL(s);let i=await re(s);if(!En[i.engine])return i.own=await import(new URL(i.engine+".js",s).href),{title:i,scripts:{},disk:null,folder:s};let o=Object.fromEntries(await Promise.all(i.scripts.map(async h=>[h,e?await zt(new URL(h+".scene",s),"text"):await ie(new URL(`compiled/${n&&i.fixed?.[h]||h}.js`,s))]))),c=await zt(new URL(t),"json");return{title:i,scripts:o,disk:c,folder:s}}function Fe(s,t){let e={...s.disk?.kind==="prodos"?Ue(s.disk):{},...s.memory},n=new Lt({routines:En[s.engine](s),scripts:t,start:s.start,label:s.startLabel,memory:e});return n.title=s,n}var En,ie,oe=B(()=>{xe();te();De();Be();En={vector:Ee,card:Pe};ie=async s=>(await import(s.href)).default});var Mn={};z(Mn,{Speaker:()=>mt});var pr,mt,ae=B(()=>{pr=`
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([Un],{type:"text/javascript"}))),this.node=new AudioWorkletNode(this.context,"speaker"),this.node.connect(this.context.destination),this.rate=this.context.sampleRate,this.context.state!=="running"&&await this.context.resume())}feed(e,t){if(!this.node)return;this.from===null&&(this.from=t);let s=1020484/this.rate,i=Math.floor((t-this.from)/s);if(i<=0)return;let o=new Float32Array(i),c=0;for(let f=0;f<i;f++){let l=this.from+(f+1)*s;for(;c<e.length&&e[c]<=l;)this.level=this.level?0:.25,c++;o[f]=this.level}this.from+=i*s,this.node.port.postMessage(o,[o.buffer])}};var Zt={};U(Zt,{KEYS_MARKUP:()=>Re,paperBox:()=>Ae,phoneKeys:()=>Te});function Ae({line:n,print:e,tear:t}){let s=document.createElement("div");return s.id="paper-box",s.hidden=!0,s.innerHTML='<p><span></span> <button id="print-paper" type="button"></button> <button id="tear" type="button"></button></p><canvas id="paper"></canvas>',s.querySelector("span").textContent=n,s.querySelector("#print-paper").textContent=e,s.querySelector("#tear").textContent=t,s}function Te(n,e){let t=n.querySelector("#keyboard"),s=n.querySelector("#keys-box");if(!t||!s||!matchMedia("(pointer: coarse)").matches)return;t.hidden=!1,t.addEventListener("click",()=>s.focus()),e.addEventListener("click",()=>s.focus());let i=!1;s.addEventListener("keydown",o=>{i=o.key==="Unidentified"}),s.addEventListener("input",()=>{if(i)for(let o of s.value)for(let c of["keydown","keyup"])window.dispatchEvent(new KeyboardEvent(c,{key:o}));s.value=""})}var Re='<button type="button" id="keyboard" class="full" hidden>Keyboard</button><input id="keys-box" class="keys-box" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" aria-label="Keys for the game">';async function Ti({data:n,root:e,disk:t,words:s,downloadDisk:i=!1,roms:o=null,studies:c=null}){e.classList.add("game"),e.innerHTML=`<div class="stage"><svg id="vector" viewBox="0 0 140 192" preserveAspectRatio="none"></svg><canvas id="screen" width="560" height="384" tabindex="0"></canvas></div>
17
- <p class="options"><span id="status">Loading.</span>${Re}<label><input type="checkbox" id="vectors"> Draw the pictures as vectors</label><label hidden><input type="checkbox" id="printer" checked> Printer</label><button id="disk" type="button" hidden>Download the disk</button></p>`,e.append(Ae(s.printer));let f=w=>e.querySelector("#"+w),l=f("screen"),p=l.getContext("2d");Te(e,l.parentElement);let u={name:new URL(n).pathname.split("/").pop().replace(/\.json$/,""),roms:o,studies:c,disk:t,downloadDisk:i,$:f,canvas:l,ctx:p,layer:f("vector"),status:f("status"),vectorToggle:f("vectors"),speaker:new we},k=await(await fetch(n)).json();k.kind==="c64"?await Ii(k,u):await Ri(k,u)}function ks(n,e,t){let s=n.parentElement,i=s.parentElement,o=()=>{let c=window.devicePixelRatio||1,f=parseFloat(getComputedStyle(i).paddingLeft)*2,l=i.clientWidth-f,p=document.documentElement.clientWidth-16,x=Math.ceil(l*c/e-.01);e*x/c>p&&(x=Math.max(1,Math.floor(p*c/e)));let u=e*x/c;Object.assign(s.style,{width:u+"px",height:t*x/c+"px",aspectRatio:"auto",marginLeft:(l-u)/2+"px"})};o(),addEventListener("resize",o)}async function Ri(n,{roms:e,disk:t,canvas:s,ctx:i,layer:o,status:c,vectorToggle:f,speaker:l}){let[{Machine:p},{placed:x},{withSaves:u,keepSaves:k,onDisks:w,driveFiles:O},{screen:T},{shapes:a},{elements:h}]=await Promise.all([Promise.resolve().then(()=>(es(),Qt)),Promise.resolve().then(()=>(dt(),ts)),Promise.resolve().then(()=>(mt(),ss)),Promise.resolve().then(()=>(Xe(),ns)),Promise.resolve().then(()=>(Ge(),is)),Promise.resolve().then(()=>(wt(),rs))]);ks(s,280,192);let g=u(n,t),E=null,$=null;if(e?.apple)try{E=e.apple,$=w(n,x(g,new Map(await Promise.all(n.images.map(async B=>[B,await e.image(B)])))),t)}catch{E=null}let C=new p(g,{log:(...B)=>console.log(...B),...E?{roms:E,disks:$}:{}});console.log(E?"line 1: Apple's ROMs, the disks booted":"line 2: moonbase's machine"),k(n,E?O(C,$,n):C.disk,t),C.diskTime=!0;let R=!1,M=0;function S(){let B=(q,F)=>{e:for(let D=16384;D<32768-q.length;D++){for(let X=0;X<q.length;X++)if(q[X]!==null&&F[D+X]!==q[X])continue e;return D}return-1};for(let q of[C.aux,C.main]){let F=B([32,null,null,32,null,null,238,null,null,76],q),D=B([162,0,160,224,24,96],q),X=B([141,null,null,142,null,null,140,null,null,173,null,null,201,128,240],q);if(!(F<0||D<0||X<0)){C.cpu.hooks.set(F,Z=>(Z.read16(96)===57344&&(o.insertAdjacentHTML("beforeend",h(a(he=>C.read(he),57344),{background:M})),C.marking=1),!1)),C.cpu.hooks.set(D,()=>(C.marking=0,!1)),C.cpu.hooks.set(X,Z=>(Z.a!==128&&(M=Z.a&15),o.innerHTML="",C.owner.fill(0),!1)),R=!0;return}}}let A={Escape:27,Enter:13,Backspace:127,Delete:127,ArrowLeft:8,ArrowRight:21,ArrowUp:11,ArrowDown:10,Tab:9};window.addEventListener("keydown",B=>{if(l.start(),B.metaKey||B.altKey||B.repeat)return;let q=B.ctrlKey?/^[a-z]$/i.test(B.key)?B.key.toUpperCase().charCodeAt(0)&31:void 0:A[B.key]??(B.key.length===1?B.key.charCodeAt(0):void 0);q!==void 0&&(console.log("key",JSON.stringify(B.key),"->",q,"at pc $"+C.cpu.pc.toString(16)),C.press(q),B.preventDefault())});let j=new Uint8ClampedArray(560*384*4),H=new ImageData(j,560,384),I=new Uint8Array(26880),K="";function J(){C.halted||C.runCycles(17030);let B=`text ${C.sw.text} page2 ${C.sw.page2} hires ${C.sw.hires} dhires ${C.sw.dhires}`;B!==K&&(console.log("screen:",B,"at pc $"+C.cpu.pc.toString(16),"cycles",C.cpu.cycles),K=B),l.feed(C.clicks,C.cpu.cycles),C.clicks.length=0,R||S();let q=C.sw.text;T(C,j,{cols:I,owner:f.checked&&o.innerHTML?C.owner:null}),i.putImageData(H,0,0),o.style.visibility=f.checked&&!q?"visible":"hidden",c.textContent=C.halted?"The game has stopped: "+C.halted+".":C.idle>2e3?"Waiting for a key.":"Running.",requestAnimationFrame(J)}s.addEventListener("pointerdown",()=>{l.start(),s.focus()}),s.focus(),J()}async function Ii(n,{name:e,roms:t,studies:s,disk:i,downloadDisk:o,$:c,canvas:f,layer:l,status:p,vectorToggle:x,speaker:u}){let[{C64:k},{Printer:w,paper:O},{WIDTH:T,HEIGHT:a},{keyboard:h,painter:g},{SID:E},{c64Roms:$,typed:C},{add:R},{keepDrive:M}]=await Promise.all([Promise.resolve().then(()=>(as(),os)),Promise.resolve().then(()=>(Ze(),cs)),Promise.resolve().then(()=>(vt(),ls)),Promise.resolve().then(()=>(hs(),fs)),Promise.resolve().then(()=>(Et(),ds)),Promise.resolve().then(()=>(us(),ps)),Promise.resolve().then(()=>(xs(),ms)),Promise.resolve().then(()=>($t(),gs))]);ks(f,T,a);let S=await $(t?.choice??null,t?.load);if(!S){p.textContent="Commodore's ROMs, asked for, are not here.";return}let A=c("printer"),j=c("paper"),H=c("paper-box");try{A.checked=localStorage.getItem("printer")!=="0"}catch{}A.parentElement.hidden=!1;let I=new w({on:A.checked});A.addEventListener("change",()=>{I.on=A.checked;try{localStorage.setItem("printer",A.checked?"1":"0")}catch{}}),I.changed=()=>{H.hidden=!I.lines.length,I.lines.length&&O(j,I,S.chargen)},c("tear").addEventListener("click",()=>I.tear()),c("print-paper").addEventListener("click",()=>window.print());let K=new k(n,S,{log:(...r)=>console.log(...r),printer:I});M(K.drive,i);let J=r=>Uint8Array.from(atob(r),d=>d.charCodeAt(0));for(let[r,d]of Object.entries(s??{}))K.drive.saved.set(r,J(d));if(o){let r=c("disk");r.hidden=!1,r.addEventListener("click",()=>{let d=R(K.drive.image,[...K.drive.saved].map(([v,b])=>({name:v,data:b}))),m=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([d],{type:"application/octet-stream"})),download:e+".d64"});m.click(),URL.revokeObjectURL(m.href)})}l.style.display="none",x.parentElement.style.display="none";let B=g(f),q=null,F=0,D=h(K,{onKey:()=>u.start(),log:!0}),X=0,Z=null,he=performance.now();function de(){let r=Math.min(2,Math.floor((performance.now()-he)/20)-X);for(let d=0;d<r;d++){if(K.runFrame(),X++,D.frame(),u.node){Z||(Z=new E(u.rate));let m=Math.round(19656/985248*u.rate),v=K.cpu.cycles-19656,b=Z.render(m,K.sidWrites.map(([y,L,P])=>[Math.floor((y-v)/19656*m),L,P]));u.node.port.postMessage(b,[b.buffer])}K.sidWrites.length=0}X>=120&&q===null&&!F&&(q=C(K,n),F=1),q!==null&&!K.ram[198]&&(q=K.type(q),q.length||(q=null)),B(K.vic.frame),p.textContent=K.halted?"The game has stopped: "+K.halted+".":"Running.",requestAnimationFrame(de)}f.focus(),de()}var Ss={};U(Ss,{modal:()=>Ct,modalOpen:()=>Pi});var $e=[],ys=!1,Mi=n=>{let e=$e.at(-1);if(e){if(n.key==="Escape")n.preventDefault(),e.cancel();else if(n.key==="Enter"&&!(n.target instanceof HTMLButtonElement)&&n.target.tagName!=="TEXTAREA"){let t=e.box.querySelector(".default:not(:disabled)");t&&(n.preventDefault(),t.click())}else if(n.key==="Tab"){let t=vs(e.box),s=t.indexOf(document.activeElement);t.length&&(n.preventDefault(),t[(s+(n.shiftKey?t.length-1:1))%t.length].focus())}n.stopPropagation()}},vs=n=>[...n.querySelectorAll('button:not(:disabled), input:not([type=hidden]):not([type=file]):not([hidden]), select:not([hidden]), [tabindex="0"]')],bs=n=>n.querySelector("input:not([type=file]), select:not([hidden])")??n.querySelector(".default")??vs(n)[0];function Ct({within:n=document.body,className:e="",content:t,cancel:s=null}){ys||(document.addEventListener("keydown",Mi,!0),ys=!0);let i=document.createElement("div");i.className="modal-layer"+(n===document.body?" page":"");let o=document.createElement("div");o.className="modal "+e,o.setAttribute("role","dialog"),o.setAttribute("aria-modal","true"),o.append(t),i.append(o);let c=document.activeElement,f=[...n.children].filter(p=>!p.inert);for(let p of f)p.inert=!0;n.append(i);let l={box:o,cancel:()=>(s??l.close)(),close(){i.remove(),$e.splice($e.indexOf(l),1);for(let x of f)x.inert=!1;let p=$e.at(-1);(p&&!p.box.contains(c)?bs(p.box):c)?.focus?.({preventScroll:!0})}};return $e.push(l),bs(o)?.focus({preventScroll:!0}),l}var Pi=()=>$e.length>0;var js={};U(js,{dialogs:()=>Ni});function Ni({within:n,className:e=""}={}){function t(c,f,l,{aside:p=[]}={}){return new Promise(x=>{let u=document.createElement("div");u.className="disk";let k=document.createElement("h2");k.textContent=c;let w=document.createElement("p");w.className="buttons";for(let[T,a]of l){let h=Object.assign(document.createElement("button"),{type:"button",textContent:T});h.onclick=async()=>{O.close(),x(typeof a=="function"?await a():a)},w.append(h)}if(w.lastChild?.classList.add("default"),p.length){let T=document.createElement("span");T.className="aside",T.append(...p),w.prepend(T)}u.append(k,...f,w);let O=Ct({within:n,className:e,content:u,cancel:()=>{O.close(),x(null)}})})}let s=c=>t(c,[],[["OK",null]]);async function i(c,{suggested:f=""}={}){let l=Object.assign(document.createElement("input"),{value:f,maxLength:31});setTimeout(()=>l.select());let p=document.createElement("label");p.append("Save as ",l);let x=await t("Save",[p,...Es(c)],[["Cancel",null],["Save",()=>l.value.trim()||null]]);return!x||c.read(x)&&!await t(`Replace "${x}"?`,[],[["Cancel",!1],["Replace",!0]])?null:x}async function o(c,{file:{extension:f="",type:l="application/octet-stream"}={}}={}){let p=Object.assign(document.createElement("select"),{size:6}),x=document.createElement("p");x.className="note";let u=Object.assign(document.createElement("input"),{type:"file",accept:[f,l].filter(Boolean).join(","),hidden:!0}),k=$=>Object.assign(document.createElement("button"),{type:"button",textContent:$}),w=k("File\u2026"),O=k("Download"),T=k("Delete"),a=()=>{p.replaceChildren(...c.list().map($=>new Option(`${$.name} \xB7 ${new Date($.modified).toLocaleString()}`,$.name))),p.selectedIndex=p.options.length?0:-1,p.hidden=!p.options.length,x.textContent=p.options.length?"On your disk:":"Nothing saved on your disk yet.",T.disabled=O.disabled=!p.options.length};a();let h=t("Open",[x,p,u,...Es(c)],[["Cancel",null],["Open",()=>p.value||null]],{aside:[w,O,T]}),g=()=>p.closest(".modal").querySelector(".default").click();w.onclick=()=>u.click(),u.onchange=async()=>{let $=u.files[0],C=$.name.slice(0,$.name.length-(f&&$.name.endsWith(f)?f.length:0));c.read(C)&&!await t(`Replace "${C}"?`,[],[["Cancel",!1],["Replace",!0]])||(c.write(C,new Uint8Array(await $.arrayBuffer())),a(),p.value=C,g())},O.onclick=()=>{let $=p.value;if(!$)return;let C=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([c.read($)],{type:l})),download:$+f});C.click(),setTimeout(()=>URL.revokeObjectURL(C.href),1e3)},T.onclick=async()=>{let $=p.value;$&&await t(`Delete "${$}"?`,[Di("It is gone from your disk for good.")],[["Delete",!0],["Cancel",!1]])&&(await c.remove($),a(),p.focus())},p.ondblclick=g;let E=await h;return E?{name:E,bytes:c.read(E)}:null}return{saveAs:i,openFrom:o,ask:t,tell:s}}var Di=n=>Object.assign(document.createElement("p"),{className:"note",textContent:n});function Es(n){if(n.kept)return[];let e=document.createElement("p");return e.className="note",e.textContent="This browser is not keeping files: download a game to keep it.",[e]}var Ts={};U(Ts,{bytesText:()=>Wi,openDisk:()=>zi,programDisk:()=>qi,textBytes:()=>Fi,titleDisk:()=>Ki});var Ls={};U(Ls,{ACCOUNT:()=>Os,DB:()=>$s,KEY:()=>Cs,STORE:()=>et,VERSION:()=>Bi,local:()=>Lt});var $s="moonbase",Bi=1,et="files",Cs=["account","disk","name"],Os="local",Ui=()=>new Promise((n,e)=>{let t=indexedDB.open($s,1);t.onupgradeneeded=()=>t.result.createObjectStore(et,{keyPath:Cs}),t.onsuccess=()=>n(t.result),t.onerror=()=>e(t.error)}),Ot=n=>new Promise((e,t)=>{n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)});async function Lt({account:n=Os}={}){let e=await Ui(),t=s=>e.transaction(et,s).objectStore(et);return{kept:!0,load:async s=>(await Ot(t("readonly").getAll(IDBKeyRange.bound([n,s],[n,s,[]])))).map(({name:i,bytes:o,meta:c,modified:f})=>({name:i,bytes:o,meta:c,modified:f})),put:(s,i)=>Ot(t("readwrite").put({account:n,disk:s,...i})),delete:(s,i)=>Ot(t("readwrite").delete([n,s,i]))}}var As={};U(As,{memory:()=>At});function At({kept:n=!0}={}){let e=new Map,t=s=>e.get(s)??e.set(s,new Map).get(s);return{kept:n,load:async s=>[...t(s).values()].map(i=>({...i,bytes:Uint8Array.from(i.bytes)})),put:async(s,i)=>{t(s).set(i.name,{...i,bytes:Uint8Array.from(i.bytes)})},delete:async(s,i)=>{t(s).delete(i)}}}async function zi(n,{backend:e}={}){if(!e)try{e=await Lt()}catch{e=At({kept:!1})}let t=new Map((await e.load(n)).map(o=>[o.name,o])),s=Promise.resolve(),i=o=>s=s.then(o);return{name:n,kept:e.kept,list:()=>[...t.values()].sort((o,c)=>c.modified-o.modified).map(({name:o,bytes:c,meta:f,modified:l})=>({name:o,size:c.length,modified:l,meta:f})),read:o=>t.get(o)?.bytes??null,write(o,c,f={}){let l={name:o,bytes:Uint8Array.from(c),meta:f,modified:Date.now()};return t.set(o,l),i(()=>e.put(n,l))},remove(o){return t.delete(o),i(()=>e.delete(n,o))},written:()=>s}}var Ki=n=>`title/${n}`,qi=n=>`program/${n}`,Fi=n=>new TextEncoder().encode(n),Wi=n=>n?new TextDecoder().decode(n):null;var Is={};U(Is,{C64View:()=>Pe});import{paint as Hi}from"@moonbase-machines/c64";var{paint:Rs}=Hi;vt();var Yi="http://www.w3.org/2000/svg",Pe=class{constructor(e,{engine:t,chargen:s}){this.svg=e,this.engine=t,this.chargen=s,e.setAttribute("viewBox",`0 0 ${je*2} ${Ee*2}`),this.canvas=document.createElement("canvas"),this.canvas.width=je,this.canvas.height=Ee,this.image=document.createElementNS(Yi,"image");for(let[i,o]of Object.entries({x:0,y:0,width:je*2,height:Ee*2,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(i,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine,t=Rs(e.mem,e.title.chip,this.chargen,this.vic,e.title.splits),s=this.canvas.getContext("2d"),i=s.createImageData(je,Ee);for(let o=0;o<t.length;o++){let[c,f,l]=Qe[t[o]];i.data.set([c,f,l,255],o*4)}s.putImageData(i,0,0),this.svg.style.background=`rgb(${Qe[t[0]].join(",")})`,this.image.setAttribute("href",this.canvas.toDataURL())}};var Ms={};U(Ms,{CardView:()=>Ne});Xe();var Vi="http://www.w3.org/2000/svg",Ne=class{constructor(e,{engine:t,inset:s=null}){this.svg=e,this.engine=t,this.inset=s,this.insetOn=!1,this.banded=!1,e.setAttribute("viewBox","0 0 560 384"),this.canvas=document.createElement("canvas"),this.canvas.width=560,this.canvas.height=384,this.image=document.createElementNS(Vi,"image");for(let[i,o]of Object.entries({x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(i,o);e.append(this.image)}snapshot(e){return e}apply(){}prompts(){let e=this.engine.mem,t=this.engine.title.screen,s=this.canvas.getContext("2d"),i=s.createImageData(560,384);if(t.text)Je(i.data,e,e,!1,[0,24]);else{let o=t.page2?16384:8192;gt(i.data,e.subarray(o,o+8192)),t.mixed&&Je(i.data,e,e,!1,[20,24])}this.banded=this.insetOn&&!!this.inset&&_i(i.data,this.inset),this.banded&&Ji(i.data,this.inset),s.putImageData(i,0,0),this.image.setAttribute("href",this.canvas.toDataURL())}};function _i(n,{top:e}){for(let t=0;t<e;t++)for(let s=0;s<560;s++){let i=(t*560+s)*4;if(n[i]<200||n[i+1]<200||n[i+2]<200)return!1}return!0}function Ji(n,{top:e,bottom:t,move:[s,i],by:o}){for(let c=e;c<=t;c++){let f=c*560*4;n.copyWithin(f+(s+o)*4,f+s*4,f+i*4),o<0?n.fill(255,f+(i+o)*4,f+i*4):n.fill(255,f+s*4,f+(s+o)*4)}}var nn={};U(nn,{cardRoutines:()=>Dt});var Ds={};U(Ds,{GIVES:()=>ye,POLLS:()=>Xi,TAKES:()=>ue,WAITS:()=>Gi,describe:()=>Q,nothing:()=>Tt,result:()=>se});var ue={box:"axy",object:"axy","object-keep":"axy","object-mode":"axy",objects:"xy",span:"axy",random:"a",beep:"a","key-at":"axy",key:"a",multiply:"ax",divide:"axy",ask:"a","ask-mode":"a","ask-escape":"a",rectangle:"axy","read-dot":"xy",problem:"a",dot:"axy","fill-rows":"axy",part:"a","rectangle-outline":"axy","key-panel":"a","keep-span":"xy","put-span":"xy","white-lines":"y","invert-span":"xy",label:"a","flip-box":"a","flash-box":"a",path:"ax",jump:"a",cell:"axy","cell-box":"axy",pair:"a",piece:"axy",colour:"a",tick:"",print:"axyc",arrow:"a",unpack:"y","load-picture":"a","action-cards":"a","return-key":"a","space-key":"a","wipe-rows":"a","wipe-columns":"a","text-card":"a","fill-left":"a","put-object":"axy","draw-room-objects":"yc",take:"y",drop:"y",effect:"a",outport:"a",cout:"a",char:"a",message:"xy",describe:"axy",chrout:"a",plot:"xyc",close:"a",chkin:"x",chkout:"x",setlfs:"axy",setnam:"axy",load:"axy",save:"axy",listen:"a",second:"a",ciout:"a",talk:"a",tksa:"a",setmsg:"a",tone:"xy","load-objects":"axy",hposn:"axy",hlin:"axy",hcolor:"x",pause:"a","bag-put":"a"},Ps={colour:{shape:3605},"card-frame":{x:16504,high:16505,y:16506,width:16507,height:16508}},Ns={line:{x0:0,x1:1,y0:2,y1:3,color:17},piece:{color:17},rectangle:{width:14,height:15},"rectangle-outline":{width:14,height:15}};function Q(n,e,t,s,i,o){let c={step:n};e.length&&(c.n=e.map(Number));let f=ue[n];if(n==="objects")c.table="$"+(t.x|t.y<<8).toString(16).toUpperCase().padStart(4,"0");else if(n.startsWith("object")&&t.a<2)c.a=t.a;else if(f)for(let l of f)c[l]=t[l];if((n==="key-at"||n==="key")&&c.a!==void 0&&(c.a=String.fromCharCode(c.a&127)),Ns[n]&&i)for(let[l,p]of Object.entries(Ns[n]))c[l]=i(p);if(Ps[n]&&o)for(let[l,p]of Object.entries(Ps[n]))c[l]=o(p);return s!==void 0&&(c.words=s),c}var ye={random:"a",ask:"ax","ask-mode":"ax","ask-escape":"axc","wait-or-escape":"c",problem:"c","read-key":"a","read-dot":"a",multiply:"ax",divide:"ax","blink-key":"a","which-box":"xy",tick:"a","choose-action":"a",take:"a",drop:"a","show-bag":"a","bag-choose":"a",getin:"a",acptr:"a",readst:"a",load:"cxy",chrin:"a"},Tt=(n,e)=>n==="beep"&&e===0,Xi=new Set(["read-key","blink-key"]),Gi=new Set(["wait","wait-erase","wait-or-escape","ask","ask-mode","ask-escape","which-box","tick","choose-action","take","drop","show-bag","bag-choose"]);function se(n,e){let t={result:n};for(let s of ye[n])t[s]=e[s];return t}var Us={};U(Us,{INLINE:()=>me,KERNAL:()=>Zi,section:()=>Bs,sectionName:()=>It});var Rt=n=>(e,t)=>{let s=[];for(let i=0;i<n;i++)s.push(e(t+i).toString(16));return{length:n,value:s.join(" ")}},me={fill:Rt(7),copy:Rt(8),prodos:Rt(3),"boot-say":(n,e)=>me.say(n,e),say(n,e){let t="",s=e;for(let i=0;i<1024;i++){let o=n(s++);if(!o)break;t+=String.fromCharCode((o^128)&127)}return{length:s-e,value:t}},print(n,e){let t="",s=e;for(let i=0;i<256;i++){let o=n(s++);if(!o)break;t+=String.fromCharCode(o&127)}return{length:s-e,value:t}}};function Bs(n,e,t){let{lengths:s,marks:i}=n.sections,o=c=>e(c+t)|e(c+t+1)<<8;return{mark:o(i),length:o(s)}}function It(n,e,t,s){let i=n.sections;if(!i||t!==i.file)return t;for(let o=0;o<i.count;o+=2){let c=Bs(n,e,o);if(c.length&&c.mark===s)return t+":"+o}return t}var Zi={65490:"chrout",65508:"getin",65520:"plot",65484:"clrchn",65505:"stop",65463:"readst",65466:"setlfs",65469:"setnam",65493:"load",65496:"save",65457:"listen",65427:"second",65448:"ciout",65454:"unlsn",65460:"talk",65430:"tksa",65445:"acptr",65451:"untlk",65499:"settim",65502:"rdtim",65424:"setmsg"};import{mli as Qi}from"@moonbase-machines/apple2e";var{BLOCK:zs,CLOCK:Mt,Files:tt}=Qi;import{rom as er}from"@moonbase-machines/apple2e";var{install:Ks}=er;import{kernal as tr}from"@moonbase-machines/c64";var{KEY_TABLES:st,VECTORS:qs,VIC:Fs,install:Ws,kernalByte:Hs,matrixOf:Ys,screenCode:ao}=tr;import{drive as sr}from"@moonbase-machines/c64";var{Drive:nt}=sr;Ze();import{basic as nr}from"@moonbase-machines/c64";var{Basic:Vs}=nr;import{numbers as ir}from"@moonbase-machines/c64";var{BasicError:_s,ERRORS:mo,fail:xo,fout:go,int16:ko,nextRandom:wo,scanNumber:yo,seedRandom:bo,val:vo}=ir;import{basicRom as rr}from"@moonbase-machines/c64";var{evaluateInMemory:jo,install:Js,printError:Xs}=rr;var tn={};U(tn,{lift:()=>Pt,readers:()=>it,script:()=>Nt});import{disasm as or}from"@moonbase-machines/mos6502";var{OPS:Gs,SIZE:Zs,disassemble:Oo,hex:fe,operand:Qs}=or;import{inline as ar}from"@moonbase-machines/vector";var{INLINE:en,name:To,sound:Ro,text:Io}=ar;var it=n=>Object.fromEntries(Object.entries(n).map(([e,t])=>[e,(s,i)=>{let o=t(c=>s[c],i);return{length:o.length,words:e==="text"||e==="print"||e==="say"?JSON.stringify(o.value):o.value}}])),cr=it(en);function Pt(n,e,t,s,i=new Set,o=cr){let c=o,f=new Map,l=new Set(t),p=new Set,x=[...t],u=T=>T>=e&&T<e+n.length;for(;x.length;){let T=x.pop(),a={};for(;u(T)&&!f.has(T);){p.add(T);let h=T-e,g=Gs[n[h]];if(g.name==="???"){f.set(T,{line:".byte $"+fe(n[h],2)+" ; not an instruction",end:T+1});break}let E=Zs[g.mode],$=n[h+1]|n[h+2]<<8,C=n.subarray(h,h+E),R=(g.name+" "+Qs(g.mode,C,T)).trim(),M=T+E,S=!1;if(g.mode==="imm"&&"LDA LDX LDY".includes(g.name)?a[g.name[2]]=n[h+1]:(g.name.startsWith("T")||g.name.startsWith("IN")||g.name.startsWith("DE")||g.name.startsWith("LD")||g.name==="PLA")&&delete a[g.name.at(-1)],g.name==="JSR"&&s[$]){let A=s[$],j=c[A]?.(n,M-e),H=["A","X","Y"].map(I=>a[I]===void 0?"":I+"="+a[I]).filter(Boolean).join(" ");R=A+(j?" "+j.words:"")+(H&&!j?" ; "+H:""),j&&(M+=j.length);for(let I in a)delete a[I]}else if(g.name==="JSR"){u($)&&(l.add($),x.push($));for(let A in a)delete a[A]}else if(g.name==="JMP"&&g.mode==="abs")u($)?(l.add($),x.push($)):R+=" ; into PART0"+(s[$]?", "+s[$]:""),S=!0;else if(g.name==="JMP"||g.name==="RTS"||g.name==="RTI"||g.name==="BRK")S=!0;else if(g.mode==="rel"){let A=T+2+(n[h+1]<<24>>24)&65535;l.add(A),x.push(A)}if((g.mode==="abx"||g.mode==="aby")&&g.name==="LDA"&&u($))for(let A=h+3;A<h+12&&A+2<n.length;A++){if(n[A]!==n[h]||(n[A+1]|n[A+2]<<8)!==$+1)continue;let j=[];for(let H=$-e;H+1<n.length&&j.length<64&&!(j.length&&i.has(e+H));H+=2){let I=n[H]|n[H+1]<<8;if(!u(I))break;j.push(I)}R+=" ; a table of "+j.length+" addresses";for(let H of j)l.add(H),x.push(H);break}f.set(T,{line:R,end:M,op:g.name,mode:g.mode,value:E===2?n[h+1]:$,call:g.name==="JSR"&&s[$]?{name:s[$],words:c[s[$]]?.(n,T+3-e)?.words}:null,stop:S});for(let A=T+1;A<M;A++)p.add(A);if(S)break;T=M}}let k=[],w=null;for(let T of[...f.keys()].sort((a,h)=>a-h))w!==null&&T!==w&&k.push(""),l.has(T)&&k.push("L"+fe(T,4)+":"),k.push(fe(T,4)+" "+f.get(T).line),w=f.get(T).end;let O=[];for(let T=e;T<e+n.length;){if(p.has(T)){T++;continue}let a=T;for(;T<e+n.length&&!p.has(T);)T++;O.push([a,T-a])}return{listing:k.join(`
18
- `),left:O,reached:p.size,size:n.length,lines:f,targets:l}}function Nt({lines:n,targets:e,left:t},s,i,{stops:o=new Set,selfModified:c=!1,memory:f=!1,moved:l=[]}={}){let p=(S,A=4)=>"$"+fe(S,A),x=new Set(l);if(c)for(let S of n.values())/^(STA|STX|STY|INC|DEC|ASL|LSR|ROL|ROR)$/.test(S.op)&&/^(abs|abx|aby)$/.test(S.mode)&&x.add(S.value);let u=null,k=()=>u!==null&&(f||x.has(u+1)||x.has(u+2)),w=S=>{let A=S.value;if(k()&&S.mode==="imm"&&(f||x.has(u+1)))return p(u+1);if(k()&&/^(abs|abx|aby)$/.test(S.mode))return"["+p(u+1)+"]"+(S.mode==="abs"?"":"["+S.mode.at(-1)+"]");switch(S.mode){case"imm":return String(A);case"zp":return p(A,2);case"zpx":return p(A,2)+"[x]";case"zpy":return p(A,2)+"[y]";case"abs":return p(A);case"abx":return p(A)+"[x]";case"aby":return p(A)+"[y]";case"izy":return"("+p(A,2)+")[y]";case"izx":return"("+p(A,2)+"[x])";case"acc":return"a";default:return"?"}},O=S=>"L"+fe(S,4),T={BEQ:"zero",BNE:"not zero",BCS:"carry",BCC:"not carry",BMI:"negative",BPL:"not negative",BVS:"overflow",BVC:"not overflow"},a={BEQ:"==",BNE:"!=",BCS:">=",BCC:"<"},h=(S,A)=>S+2+(A.value<<24>>24)&65535,g=[...n.keys()].sort((S,A)=>S-A),E=[],$=S=>["JMP","RTS","RTI"].includes(S.op);e=new Set(e),g.forEach((S,A)=>{let j=n.get(S);j.op&&!$(j)&&A+1<g.length&&j.end!==g[A+1]&&n.has(j.end)&&e.add(j.end)});let C=[],R=()=>{for(let[S,A,j]of C)E.push(fe(S,4)+" "+A+" = "+j);C=[]},M=null;for(let S=0;S<g.length;S++){let A=g[S],j=n.get(A),H=n.get(g[S+1]),I=J=>E.push(fe(A,4)+" "+J);if(u=A,M&&M.op&&!$(M)&&M.end!==A&&n.has(M.end)&&(R(),E.push(fe(M.pc,4)+" goto "+O(M.end))),M={...j,pc:g[S]},e.has(A)&&(R(),E.push(O(A)+":")),!j.op){R(),I("asm "+j.line);continue}let K=j.op.at(-1).toLowerCase();if(j.call){let[J,...B]=j.call.name.split(" "),q=ue[J]||"",F=Object.fromEntries(C.map(([,Z,he])=>[Z,he]));C=C.filter(([,Z])=>!q.includes(Z)),R();let X=[...B,...[...q].map(Z=>F[Z]??Z)];J==="objects"&&F.x!==void 0&&F.y!==void 0&&X.splice(B.length,2,p(F.x|F.y<<8)),(J==="key-at"||J==="key")&&(X[0]=F.a!==void 0?JSON.stringify(String.fromCharCode(F.a&127)):X[0]),I([J,...X,j.call.words??""].join(" ").trim());continue}switch(j.op){case"LDA":case"LDX":case"LDY":if(j.mode==="imm"&&!k()){C=C.filter(([,J])=>J!==K),C.push([A,K,j.value]);break}if(j.mode==="aby"||j.mode==="abx"){let[J,B,q,F]=[1,2,3,4].map(D=>n.get(g[S+D]));if(J?.op==="STA"&&B?.op==="LDA"&&B.value===j.value+1&&q?.op==="STA"&&F?.op==="JMP"&&J.value===g[S+4]+1&&q.value===g[S+4]+2){R(),I("goto ["+p(j.value)+" "+j.mode.at(-1)+"]"),S+=4,M=null;break}}R(),I(K+" = "+w(j));break;case"STA":case"STX":case"STY":R(),I(w(j)+" = "+K);break;case"TAX":case"TAY":case"TXA":case"TYA":R(),I(j.op[2].toLowerCase()+" = "+j.op[1].toLowerCase());break;case"INX":case"INY":case"DEX":case"DEY":R(),I(K+(j.op[0]==="I"?" += 1":" -= 1"));break;case"INC":case"DEC":R(),I(w(j)+(j.op==="INC"?" += 1":" -= 1"));break;case"CLC":case"SEC":R(),I("carry = "+(j.op==="SEC"?1:0));break;case"ADC":R(),I("a += "+w(j)+" + carry");break;case"SBC":R(),I("a -= "+w(j)+" + borrow");break;case"AND":R(),I("a &= "+w(j));break;case"ORA":R(),I("a |= "+w(j));break;case"EOR":R(),I("a ^= "+w(j));break;case"ASL":case"LSR":case"ROL":case"ROR":R(),I(w(j)+" "+{ASL:"<<= 1",LSR:">>= 1",ROL:"rotate left",ROR:"rotate right"}[j.op]);break;case"BIT":R(),I("test "+w(j));break;case"CMP":case"CPX":case"CPY":{R();let J=j.op==="CMP"?"a":j.op[2].toLowerCase();H&&a[H.op]&&!e.has(g[S+1])?(I("if "+J+" "+a[H.op]+" "+w(j)+" goto "+O(h(g[S+1],H))),S++,M={...H,pc:g[S]}):I("compare "+J+" "+w(j));break}case"JMP":if(R(),j.mode==="abs"&&k()){I("goto ("+p(A+1)+")");break}I(j.mode==="abs"?j.value>=i&&j.value<i+s.length?"goto "+O(j.value):"goto-engine "+p(j.value):"goto ("+p(j.value)+")");break;case"JSR":if(R(),k()){I("call ("+p(A+1)+")");break}I(j.value>=i&&j.value<i+s.length?"call "+O(j.value):"call-engine "+p(j.value));break;case"RTS":R(),I("return");break;case"PHA":case"PLA":case"PHP":case"PLP":R(),I({PHA:"push a",PLA:"pull a",PHP:"push flags",PLP:"pull flags"}[j.op]);break;case"NOP":break;default:if(T[j.op]){R(),I("if "+T[j.op]+" goto "+O(h(A,j)));break}R(),I("asm "+j.line)}}R();for(let[S,A]of t){let j=0;for(;j<A&&!(j&&o.has(S+j))&&!o.has(S);)j++;if(!j)continue;let H=[];for(let I=0;I<j;I+=16)H.push("data "+p(S+I)+" "+Array.from(s.subarray(S-i+I,S-i+Math.min(j,I+16)),K=>fe(K,2)).join(" "));E.push("",...H)}return E.join(`
19
- `)+`
20
- `}var ce=n=>n.toString(16).toUpperCase().padStart(4,"0");function sn(n,e,t){let s=ue[e]||"",i=0,o=null;for(let c of s){let f=t[i++];if(f===void 0||f===c||typeof f=="object")continue;let l=f.startsWith("$")?n.mem[parseInt(f.slice(1),16)]:+f;c==="c"?n.c=l&1:(n[c]=l&255,o!=="a"&&(o=c))}return o&&n.flags(n[o]),t.slice(i)}function Dt(n){let e=n.map,t=n.disk.kind==="c64",s=t?null:n.files??=new tt(n.disk),i=n.screen??={text:1,mixed:0,page2:0,hires:0},o=0,c={bank:2,read:0,aside:new Uint8Array(4096)},f=(r,d)=>{if(d===c.bank)return;let m=r.mem.slice(53248,57344);r.mem.set(c.aside,53248),c.aside=m,c.bank=d},l=n.chip=new Uint8Array(4096),p={4:r=>r&255,5:r=>r>>8&255,8:r=>r*7&255,9:r=>r*13&255};function x(r,d,m){let v=d&4095;if(v<1024){let b=v&63;if(m===void 0&&(b===17||b===18))return r.raster=r.clock?Math.floor(r.cycles/63)%312:((r.raster??0)+1)%312,b===18?r.raster&255:l[17]&127|r.raster>>1&128;if(m===void 0&&b===25)return r.vicFlags??112;if(m===void 0)return l[b];if(l[b]=m,r.splitLine!==void 0&&b!==25){let y=r.clock?r.clock.splits??=new Map:n.splits??=new Map;(y.get(r.splitLine)??y.set(r.splitLine,new Map).get(r.splitLine)).set(b,m)}b===26&&!(m&1)&&n.splits?.clear();return}if(v<2048){let b=1024|v&31;if(m===void 0)return l[b];l[b]=m,r.sid?.push([r.cycles,v&31,m]);return}if(v<3072){if(m===void 0)return l[v]|240;l[v]=m&15;return}if(v<3328){let b=v&15;if(m===void 0)return p[b]?p[b](n.seed??17):b<2?255:b===13?0:l[3072|b];l[3072|b]=m;return}if(m===void 0)return l[v];if(l[v]=m,(v&15)===0&&r.splitLine!==void 0){let b=r.clock?r.clock.splits??=new Map:n.splits??=new Map;(b.get(r.splitLine)??b.set(r.splitLine,new Map).get(r.splitLine)).set(256,m)}}let u=r=>(r.mem[1]&3)!==0&&(r.mem[1]&4)!==0;function k(r,d,m){if(t&&d>=57344){if(m===void 0)return Hs(d);r.mem[d]=m;return}if(t)return x(r,d,m);if((d&65520)===49280){let v=d&15;return f(r,v&8?1:2),c.read=(v&1)===(v>>1&1)?1:0,0}if(d>=49232&&d<=49239){let v=["text","mixed","page2","hires"][d-49232>>1];return i[v]=d&1,0}if(d===49152&&m===void 0){if(!(o&128)){let v=r.key();v!==void 0&&v>=0&&(o=v|128)}return++r.idle>2e3&&(r.polled=!0),o}if(d===49168){let v=o;return!(o&128)&&++r.idle>2e3&&(r.polled=!0),o&=127,v}return d===49200&&r.clicks.push(r.cycles),0}let w=null,O={hooks:new Map,cycles:0,a:0,x:0,y:0,z:0,c:0,n:0,v:0,read:r=>w.mem[r],write:(r,d)=>{w.mem[r]=d&255},nz(r){this.n=r>>7&1,this.z=r?0:1}},T=0;t?Ws({cpu:O,read:r=>w.read(r),write:(r,d)=>w.write(r,d),drive:n.bus??=yt(n.drive??=new nt(Uint8Array.from(atob(n.disk.image),r=>r.charCodeAt(0))),n.printer??=new Me({on:!1})),held:()=>{let r=w?.clock?.held;return r?.up&&(w.clock.held=null),r&&(r.seen=!0),r??null},call:r=>{de(w,r,"the keyboard read"),Object.assign(O,{a:w.a,x:w.x,y:w.y,c:w.c,z:w.z,n:w.n,v:w.v})},loaded:(r,d,m)=>{(n.files64??=[]).push({name:r,from:d,to:m});let v=n.fileScripts?.[r];if(v){let b={script:v,from:d,to:m};h.splice(0,1/0,...h.filter(y=>y.from<b.from||y.to>b.to),b)}}}):Ks({cpu:O,game:n.disk,sw:{lcRead:0},io:r=>k(w,r),file:r=>s.file(r),get files(){return s.files},put:(r,d)=>s.put(r,d),remove:r=>s.remove(r),clicks:{push:r=>w.clicks.push(w.cycles+r-T)},log(){},halted:!1});let a=(r,d)=>{let m=O.hooks.get(d);if(!m&&t&&d>=40960&&d<49152)throw new Error("a BASIC program (Zoopak's NOTEBOOK or ZOOTIME): not written yet in the remake");if(!m)throw new Error("no ROM routine at $"+ce(d));w=r,Object.assign(O,{a:r.a,x:r.x,y:r.y,c:r.c,z:r.z,n:r.n,v:r.v,pc:d,sp:r.sp()-2&255});let v=T=O.cycles,b=m(O);if(b==="wait")return"wait";if(r.delay+=(O.cycles-v+6)/Mt*1e3,r.cycles+=O.cycles-v+6,Object.assign(r,{a:O.a&255,x:O.x&255,y:O.y&255,c:O.c,z:O.z,n:O.n}),b==="return")return b;if(b===!1&&O.pc!==d)return{to:O.pc}},h=[],g=null,E=(r,d)=>{if(!g){g=new Map;for(let m of Object.keys(r.sources)){let v=r.script(m);for(let b of Object.keys(v.labels))if(/^L[0-9A-F]{4}$/.test(b)){let y=parseInt(b.slice(1),16);(g.get(y)??g.set(y,[]).get(y)).push(m)}}}return g.get(d)??[]},$=(r,d)=>{let m=n.files64?.findLast(L=>L.from<=d&&d<=L.to)??(d>=512&&d<40960?{name:"MEMORY",from:512,to:40959}:null);if(!m)return null;let v=r.mem.slice(m.from,m.to+1),b=(n.fileScripts?.[m.name]??m.name)+"@"+ce(d),y=Pt(v,m.from,[d],e.routines,new Set,it(me));return r.sources[b]=Nt(y,v,m.from,{selfModified:!0}),g=null,h.push({script:b,from:m.from,to:m.to}),(n.liftedAtNeed??=[]).push(m.name+" $"+ce(d)),console.warn(`lifted at need: ${m.name} from $${ce(d)} (an entry for its scene's lift)`),b},C=new Set(Object.values(n.fileScripts??{})),R=(r,d)=>t?r.filter(m=>!C.has(m)||h.some(v=>v.script===m&&v.from<=d&&d<=v.to)):r,M=(r,d)=>{let m=R(E(r,d),d);!m.length&&t&&$(r,d)&&(m=R(E(r,d),d));let v=h.findLast(y=>m.includes(y.script)&&y.from<=d&&d<=y.to),b=m.length>1?v?.script:m[0];if(!b)throw new Error("no script has $"+ce(d));return[b,"L"+ce(d)]},S=(r,d)=>t?d>=57344?(r.mem[1]&2)!==0:d>=40960&&d<49152?(r.mem[1]&3)===3:d===115||d===121:d>=53248?!(c.read&&E(r,d).length):O.hooks.has(d)&&!E(r,d).length,A=r=>e.stir&&r?.at>=e.stir.from&&r.at<=e.stir.to,j=(r,d,m)=>{m&&r.inside++,r.emit(d),m&&r.inside--},H=r=>{let d=r.stack.pop();d.name!==r.name&&r.enter(d.name),r.pc=d.pc,d.inside&&(r.inside--,d.done?.(r)),d.after?.(r)},I=new Set(["town","restart","escape"]),K=(r,d,m,v)=>{if(d?.at==null)return v.map(y=>parseInt(y,16));let b=[];for(let y=0;y<m;y++)b.push(r.mem[d.at+3+y&65535]);return b},J=r=>r.map(d=>d.toString(16)).join(" "),B=r=>(e.unplaced?.includes(r.step)&&(delete r.x,delete r.y),r),q={chrout:[806,61898],chrin:[804,61783],getin:[810,61758],save:[818,62957]},F=(r,d)=>(m,v,b)=>{sn(m,r,v),j(m,B(Q(r,[],m,void 0,void 0,N=>m.mem[N])),A(b));let y=t&&q[r],L=y&&m.mem[y[0]]|m.mem[y[0]+1]<<8;if(y&&L!==y[1]){let[N,z]=M(m,L);m.callInside(N,z,V=>{ye[r]&&V.emit(se(r,{a:V.a,x:V.x,y:V.y,c:V.c}))},b?.at==null?void 0:b.at+2&65535);return}let P=a(m,d);if(P==="wait")return"wait";if(P?.to!==void 0)return m.stackPage(),m.stack.push({name:m.name,pc:m.pc,inside:!0,ret:b?.at==null?void 0:b.at+2&65535}),m.inside++,D["goto-engine"](m,["$"+ce(P.to)],b);ye[r]&&t&&m.emit(se(r,{a:m.a,x:m.x,y:m.y,c:m.c}))},D={prodos:(r,d,m)=>{let v=K(r,m,3,d),[b,y,L]=v,P=y|L<<8;j(r,Q("prodos",[],r,J(v)),A(m));let N={read:V=>r.mem[V],write:(V,ee)=>{r.mem[V]=ee&255}};if(b===202){let V=r.mem[P+1],ee=s.open.get(V),W=r.mem[P+2]|r.mem[P+3]<<8,ge=ee?Math.min(r.mem[P+4]|r.mem[P+5]<<8,ee.f.body.length-ee.at):0,_e=ee&&n.fileScripts?.[It(e,ke=>r.mem[ke],ee.f.path,ee.at)];if(_e&&ge){let ke={script:_e,from:W,to:W+ge-1};h.splice(0,1/0,...h.filter(Le=>Le.from<ke.from||Le.to>ke.to),ke)}r.delay+=Math.ceil(ge/512)*zs/Mt*1e3}let z=s.call(b,P,N);r.cycles+=6,z===null&&(z=1),r.a=z==="quit"?0:z,r.c=r.a?1:0,r.z=r.a?0:1,z==="quit"&&(r.ended=!0)},stirred:r=>{for(let d of e.stir.counts)r.mem[d]=n.seed&255},hposn:F("hposn",62481),hlin:F("hlin",62778),hcolor:F("hcolor",63216),"clear-page":F("clear-page",62452),pause:F("pause",64680),home:F("home",64600),outport:F("outport",65173),"call-engine":(r,[d],m)=>{let v=parseInt(d.slice(1),16);if(S(r,v)){let L=a(r,v);if(L==="return"){H(r);return}return L}if(!t&&r.mem[v]===96){r.cycles+=6;return}let[b,y]=M(r,v);r.stack.push({name:r.name,pc:r.pc,ret:m?.at==null?void 0:m.at+2&65535}),r.enter(b,y)},"goto-engine":(r,[d],m)=>{let v=parseInt(d.slice(1),16),b=e.routines[v];if(b){if(I.has(b))return D[b](r,[],m);let y=t&&r.stack.at(-1)?.rom;y&&r.inside++;let L;try{L=D[b](r,[],m)}finally{y&&r.inside--}let P=r.stack.at(-1);if(P?.inside){let N=P.done;P.done=z=>{N?.(z),H(z)}}else H(r);return L}if(S(r,v)){if(a(r,v)==="wait")return"wait";t&&Z.has(v)&&he(r),H(r);return}if(!t&&r.mem[v]===76&&!E(r,v).length)return D["goto-engine"](r,["$"+ce(r.mem[v+1]|r.mem[v+2]<<8)],m);r.enter(...M(r,v))}};t&&n.basic&&(D.sys=(r,d,m,v)=>{r.mem[122]=m&255,r.mem[123]=m>>8;let b=r.mem;Object.assign(r,{a:b[780],x:b[781],y:b[782],c:b[783]&1,z:b[783]>>1&1,n:b[783]>>7});let y=N=>{b[780]=N.a,b[781]=N.x,b[782]=N.y,b[783]=N.c|N.z<<1|(N.i??0)<<2|(N.d??0)<<3|N.v<<6|N.n<<7};if(S(r,d)){let N=a(r,d);return y(r),N}let[L,P]=M(r,d);r.stack.push({name:r.name,pc:r.pc,rom:!0,after:y}),r.enter(L,P)},D["basic-load"]=(r,[d,m=1,v=0])=>{let b=r.mem;for(let L=0;L<d.length;L++)b[512+L]=d.charCodeAt(L);Object.assign(b,{183:d.length,187:0,188:2,186:m,185:v,184:0}),Object.assign(r,{a:0,x:1,y:8}),r.basic.call("load");let y=Object.entries(n.basic).find(([,L])=>L.file===d);if(v===0&&y){X(r,y[0]),r.enter(y[0]);return}r.pc=0},Js({cpu:O,read:r=>w.read(r),write:(r,d)=>w.write(r,d),evaluate:r=>{let d=w.sources[w.basic.script]?.params?.[r];if(!d)throw new Error("no parameter compiled at $"+ce(r));let[m,v,b]=d;return{value:v(w.basic),end:m,place:b}}})),t&&n.basic&&(D.error=(r,d)=>!(d instanceof _s)||!r.basic?!1:(w=r,Xs({cpu:O,write:(m,v)=>{r.mem[m]=v}},d.message,r.basic.at)));let X=(r,d)=>{r.basic=new Vs(r,n.basic[d]),r.basic.script=d};for(let[r,d]of Object.entries(e.routines).map(([m,v])=>[+m,v]))!D[d]&&r>=53248&&(D[d]=F(d,r)),!(D[d]||r>=48896)&&(D[d]=(m,v,b)=>{if(sn(m,d,v),I.has(d)&&m.inside){for(let W of m.stack)W.inside&&(delete W.inside,delete W.done);m.inside=0}let y=b?.at!=null?m.mem[b.at+1&65535]|m.mem[b.at+2&65535]<<8:null,L=A(b),P=e.routines[y]===d?y:parseInt(Object.entries(e.routines).find(([,W])=>W===d)[0]);d==="read-key"&&(m.mem[e.seed]=n.seed&255,m.mem[e.seed+1]=n.seed>>8);let N=me[d]&&b?.at!=null?me[d](W=>m.mem[W&65535],b.at+3).value:void 0;j(m,Q(d,[],{a:m.a,x:m.x,y:m.y,c:m.c},N,void 0,W=>m.mem[W]),L);let[z,V]=M(m,P);if(d==="escape"&&b?.at!=null&&m.stack.push({name:m.name,pc:m.pc,ret:b.at+2&65535}),I.has(d)){m.enter(z,V),m.entered=P;return}let ee=W=>{W.mem[e.seed]=n.seed&255,W.mem[e.seed+1]=n.seed>>8};m.callInside(z,V,W=>{d==="read-key"&&ee(W),ye[d]&&!L&&W.emit(se(d,{a:W.a,x:W.x,y:W.y,c:W.c}))},b?.at==null?void 0:b.at+2&65535)});D.elsewhere=(r,d)=>{let m=parseInt(d.slice(1),16),v=h.findLast(b=>b.from<=m&&m<=b.to);return v!==void 0&&v.script!==r.name&&/^L[0-9A-F]{4}$/.test(d)},D.timed=!0,D.polls=e.polls,D.reads=e.reads,t&&(D.getin=r=>{!r.clock&&!r.i&&(D.poll(r),r.polledSince=!0);let d;if(r.mem[198]?(d=r.mem[631],r.mem.copyWithin(631,632,631+r.mem[198]),r.mem[198]--):d=r.key(),r.c=0,d===void 0||d<0){r.a=r.flags(0),++r.idle>(r.polls??e.polls??200)&&!r.clock&&(r.polled=!0);return}r.a=r.flags(d),r.idle=0,r.emit(se("getin",{a:d}))});let Z=new Set([59953,60027,60030,60033]);D.poll=r=>{D.interrupt(r),l[26]&1&&D.interrupt(r,!0)};let he=r=>{for(let d of["y","x","a"]){let m=r.stack.pop();if(m?.a===void 0||m.name!==void 0)throw new Error("the end of an interrupt with its registers not on the stack");r[d]=m.a}};t&&(D.interrupt=(r,d=!1)=>{if(r.i)return;let m=r.mem[788]|r.mem[789]<<8,v={a:r.a,x:r.x,y:r.y,n:r.n,z:r.z,c:r.c,v:r.v,d:r.d};r.vicFlags=d?241:112,d&&(r.splitLine=l[18]|(l[17]&128)<<1);try{S(r,m)?a(r,m):(r.i=1,de(r,m,"the interrupt routine",b=>b.stack.push({a:v.a},{a:v.x},{a:v.y})))}finally{Object.assign(r,v),r.i=0,r.vicFlags=r.splitLine=void 0}});function de(r,d,m,v){let b=!1;r.callInside(...M(r,d),()=>{b=!0}),v?.(r);for(let y=0;!b;y++){if(y>1e6)throw new Error(m+" at $"+ce(d)+" runs on without end");if(r.exec(r.program.steps[r.pc])==="wait")throw new Error(m+" at $"+ce(d)+" waits")}}return D.inline=(r,d)=>me[d.words[0]]?me[d.words[0]](m=>r.mem[m&65535],d.at+3).length:0,D.before=(r,d)=>{if(t&&r.clock&&!r.i){r.cycles>=r.clock.irq&&(r.clock.irq=Math.max(r.clock.irq+16421,r.cycles),D.interrupt(r));let L=Math.floor(r.cycles/63)%312,P=r.clock.line??L,N=l[18]|(l[17]&128)<<1;r.clock.line=L,L<P&&(n.splits=r.clock.splits??new Map,r.clock.splits=new Map),l[26]&1&&(P<=L?P<N&&N<=L:N>P||N<=L)&&D.interrupt(r,!0)}let m=d.start??d.at,v=m!=null&&r.inside===0?e.routines[m]:void 0,b=r.entered===m;if(r.entered=null,v&&!b&&!A(d)){j(r,Q(v,[],{a:r.a,x:r.x,y:r.y,c:r.c},void 0,void 0,P=>r.mem[P]));let L=r.stack.at(-1);L?.name!==void 0&&!L.inside&&(L.inside=!0,L.done=P=>{ye[v]&&P.emit(se(v,{a:P.a,x:P.x,y:P.y,c:P.c}))},r.inside++)}if(e.ticks?.find(L=>L.at===d.at&&r.name===n.fileScripts?.[L.scene])){if(r.ticking===d){r.ticking=null,r.keys[0]===-1&&r.keys.shift();return}return r.emit({step:"tick"}),r.ticking=d,"wait"}},D.setup=r=>{if(t){if(!n.io||n.io[0]>53248||n.io[1]<st[1]-1)throw new Error("a Commodore 64 title's io must cover $D000 to the KERNAL's keyboard tables");r.ioAt=d=>d>=53248&&d<=57343&&u(r)||d>=st[0]&&d<st[1]&&(r.mem[1]&2)!==0,Object.assign(r.mem,{0:47,1:55,153:0,154:3,185:1,186:8,648:4,646:14}),Object.assign(r.mem,{197:64,203:64,204:1,649:10,650:0,651:4,652:16,655:72,656:235}),Fs.forEach((d,m)=>{l[m]=d}),l[3328]=151,qs.forEach((d,m)=>{r.mem[788+2*m]=d&255,r.mem[789+2*m]=d>>8});for(let d=0;d<1e3;d++)r.mem[1024+d]=32,l[2048+d]=14;for(let[d,m]of Object.entries(n.load??{})){let v=n.drive.find(Uint8Array.from(d,b=>b.charCodeAt(0))).raw;r.mem.set(v.subarray(2),m)}r.io=(d,m)=>k(r,d,m),n.basic&&(Object.assign(r.mem,{205:2,206:32,207:0,647:254}),X(r,n.start));return}for(let[d,m]of Object.entries(n.load??{}))r.mem.set(s.file("/"+s.volumes[0]+"/"+d).body,m);if(n.disk.kind==="dos33"){for(let d=0;d<24;d++)r.mem.fill(160,1024+(d&7)*128+(d>>3)*40,1024+(d&7)*128+(d>>3)*40+40);for(let[d,m,v]of n.disk.loads)v&&f(r,v),r.mem.set(s.file(d).body,m);f(r,1),c.read=1,Object.assign(r.mem,{32:0,33:40,34:16,35:24,50:255}),r.delay=2500}r.io=(d,m)=>k(r,d,m)},D}var an={};U(an,{compile:()=>xr});var rn={};U(rn,{branchTaken:()=>Be,operand:()=>te,parse:()=>De,words:()=>rt});var lr=/"(?:[^"\\]|\\.)*"|\S+/g;function De(n,e="script"){let t=[],s={},i=[];return n.split(`
21
- `).forEach((o,c)=>{let f=o.replace(/^\s+|\s+$/g,"");if(!f||f.startsWith(";"))return;let l=e+":"+(c+1),p;if(p=/^(L[0-9A-F]{4}|[A-Za-z_][\w-]*):$/.exec(f)){s[p[1]]=t.length;return}if(p=/^data \$([0-9A-F]+)((?: [0-9A-F]{2})+)$/i.exec(f)){i.push({at:parseInt(p[1],16),bytes:p[2].trim().split(" ").map(k=>parseInt(k,16))});return}p=/^([0-9A-F]{4})\s+(.*)$/.exec(f);let x=p?parseInt(p[1],16):null,u=p?p[2]:f;t.push({at:x,words:rt(u),text:u,where:l,index:t.length})}),{steps:t,labels:s,data:i}}var rt=n=>n.match(lr).map(e=>e.startsWith('"')?{string:JSON.parse(e)}:e);function te(n){if(typeof n!="string")return{string:n.string};if(/^-?\d+$/.test(n))return{number:+n};if(/^[axy]$/.test(n)||n==="carry"||n==="borrow")return{reg:n};let e;if(e=/^\$([0-9A-F]+)(?:\[([xy])\])?$/i.exec(n))return{at:parseInt(e[1],16),index:e[2],zp:e[1].length<=2};if(e=/^\(\$([0-9A-F]{2})\)\[y\]$/i.exec(n))return{through:parseInt(e[1],16)};if(e=/^\(\$([0-9A-F]{2})\[x\]\)$/i.exec(n))return{pair:parseInt(e[1],16)};if(e=/^\[\$([0-9A-F]{4})\](?:\[([xy])\])?$/i.exec(n))return{via:parseInt(e[1],16),index:e[2]};throw new Error("not an operand: "+n)}var fr=n=>/^\d+$/.test(n)||/^\$[0-9A-F]{2}(\[[xy]\])?$/i.test(n)||/^\(\$/.test(n)?2:3;function Be(n){if(n.at===null)return 1;let e=n.words,t=parseInt(e.at(-1).slice(1),16),s=n.at+(e.length===6?fr(e[3]):0)+2&65535;return/^L[0-9A-F]{4}$/.test(e.at(-1))&&(t&65280)!==(s&65280)?2:1}var G=(n,e=2)=>"0x"+n.toString(16).padStart(e,"0"),Bt=49152,Ut=49407,hr=n=>n>=Bt&&n<=Ut;function zt(n){if(n.through!==void 0)return{js:`(e.mem[${G(n.through)}] | e.mem[${G(n.through+1)}] << 8) + e.y & 0xffff`,io:!0};if(n.pair!==void 0)return{js:`e.mem[${G(n.pair)} + e.x & 0xff] | e.mem[${G(n.pair)} + e.x + 1 & 0xff] << 8`,io:!0};if(n.via!==void 0)return{js:`(e.mem[${G(n.via,4)}] | e.mem[${G(n.via+1,4)}] << 8)${n.index?" + e."+n.index+" & 0xffff":""}`,io:!0};if(!n.index)return{js:G(n.at,4),io:hr(n.at)};let e=n.at<=Ut&&n.at+255>=Bt;return{js:n.at+255>65535?`(${G(n.at,4)} + e.${n.index}) & 0xffff`:`${G(n.at,4)} + e.${n.index}`,io:e}}function Ce(n,e=!0){let t=te(n);if(t.number!==void 0)return{js:String(t.number&255)};if(t.reg==="carry")return{js:"e.c"};if(t.reg)return{js:"e."+t.reg};let s=zt(t);return e&&t.through!==void 0?{js:`e.read(e.ix(e.mem[${G(t.through)}] | e.mem[${G(t.through+1)}] << 8, e.y))`,io:!0}:e&&t.via!==void 0&&t.index?{js:`e.read(e.ix(e.mem[${G(t.via,4)}] | e.mem[${G(t.via+1,4)}] << 8, e.${t.index}))`,io:!0}:e&&t.index&&!t.zp?{js:s.io?`e.read(e.ix(${G(t.at,4)}, e.${t.index}))`:`e.mem[e.ix(${G(t.at,4)}, e.${t.index})]`,io:s.io}:{js:s.io?`e.read(${s.js})`:`e.mem[${s.js}]`,io:s.io}}function dr(n,e){let t=te(n);if(t.reg)return{js:`e.${t.reg} = ${e}`};let s=zt(t);return{js:s.io?`e.write(${s.js}, ${e})`:`e.mem[${s.js}] = ${e}`,io:s.io}}function on(n){let e=te(n);if(e.reg)return{pre:"",read:"e."+e.reg,write:s=>`e.${e.reg} = ${s}`};let t=zt(e);return t.io?{pre:`const at = ${t.js}; `,read:"e.read(at)",write:s=>`e.write(at, ${s})`,io:!0}:{pre:"",read:`e.mem[${t.js}]`,write:s=>`e.mem[${t.js}] = ${s}`}}var pr={zero:"e.z",carry:"e.c",negative:"e.n",overflow:"e.v"},ur={"==":"e.z","!=":"!e.z",">=":"e.c","<":"!e.c"};function mr(n,e){let t=n.words,[s,i]=t,o=`s[${e}]`,c=(...l)=>({js:l.map(p=>p.js??p).join(""),kind:l.some(p=>p.io)?"io":"compute"});if(i==="="&&t.length===3){let l=Ce(t[2]),p=te(s);if(p.reg==="carry")return c("e.c = ",l," & 1;");if(p.reg)return c(`e.${p.reg} = e.flags(`,l,");");let x=dr(s,l.js);return{js:x.js+";",kind:l.io||x.io?"io":"compute"}}if(i==="+="||i==="-="){let l=Ce(t[2]);if(t.length===3){let p=on(s);return{js:`${p.pre}${p.write(`e.flags(${p.read} ${i[0]} ${l.js} & 0xff)`)};`,kind:p.io||l.io?"io":"compute"}}return{js:i==="+="?`e.add(${l.js});`:`e.sub(${l.js});`,kind:l.io?"io":"compute"}}if(i==="&="||i==="|="||i==="^="){let l=Ce(t[2]);return c(`e.a = e.flags(e.a ${i[0]} `,l,");")}if(i==="<<="||i===">>="||i==="rotate"){let l=on(s),p=i==="<<="||t[2]==="left";return{js:`${l.pre}${l.write(`e.shift(${l.read}, ${p}, ${i==="rotate"})`)};`,kind:l.io?"io":"compute"}}switch(s){case"if":{let l=t.at(-1),p=t.slice(1,-2);if(p.length===3&&/^[axy]$/.test(p[0])){let k=Ce(p[2]);return{js:`e.compare(e.${p[0]}, ${k.js}); if (${ur[p[1]]})`,kind:"branch",to:l,io:k.io}}let x=p[0]==="not",u=pr[x?p[1]:p[0]];if(!u)throw new Error(n.where+": no flag "+p.join(" "));return{js:`if (${x?"!":""}${u})`,kind:"branch",to:l}}case"goto":return t[1].startsWith("(")?{js:`return e.jumpThrough(${G(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:t[1].startsWith("[")?{js:`return e.jumpTable(${G(parseInt(t[1].slice(2),16),4)}, e.${t[2][0]});`,kind:"end"}:{js:`return e.jump('${t[1]}', ${o});`,kind:"end"};case"call":return t[1].startsWith("(")?{js:`return e.callThrough(${G(parseInt(t[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:{js:`return e.call('${t[1]}', ${o});`,kind:"end"};case"return":return{js:`return e.ret(${o});`,kind:"end"};case"compare":return c(`e.compare(e.${t[1]}, `,Ce(t[2]),");");case"test":return c("e.test(",Ce(t[1]),");");case"push":return{js:`e.push(${t[1]==="a"});`,kind:"compute"};case"pull":return{js:`e.pull(${t[1]==="a"});`,kind:"compute"};case"asm":return t[1]==="RTI"?{js:`return e.ret(${o});`,kind:"end"}:{js:["TSX","TXS","CLV","SED","CLD","SEI","CLI"].includes(t[1])?`e.asm('${t[1]}');`:"",kind:"compute"}}let f=t.slice(1).map(l=>typeof l=="string"?`'${l}'`:`{ string: ${JSON.stringify(l.string)} }`).join(", ");return{js:`return e.routine('${s}', [${f}], ${o});`,kind:"routine"}}function xr(n,e,{io:t=[49152,49407]}={}){[Bt,Ut]=t;let{steps:s,labels:i,data:o}=De(n,e),c=s.map((x,u)=>mr(x,u)),f=new Set([0,...Object.values(i)]);c.forEach((x,u)=>{(x.kind==="routine"||x.kind==="io"||x.io)&&f.add(u),(x.kind!=="compute"&&x.kind!=="branch"||x.io)&&f.add(u+1)});let l=Object.fromEntries(Object.entries(i).map(([x,u])=>[u,x])),p=[];for(let x=0;x<s.length;x++){if(!f.has(x))continue;let u=x+1;for(;u<s.length&&!f.has(u);)u++;let k=c.slice(x,u).some(h=>h.kind==="branch"&&i[h.to]===x),w=[];for(let h=x;h<u;h++){if((h===x||c[h-1].kind==="branch")&&c[h].kind!=="routine"){let C=h;for(;C<u-1&&c[C].kind!=="branch";)C++;w.push(`e.time(s, ${h}, ${C});`)}let g=c[h],E=s[h].at===null?s[h].text:s[h].at.toString(16).toUpperCase().padStart(4,"0")+" "+s[h].text,$=g.js;if(g.kind==="branch"){let C=i[g.to],R=Be(s[h]),M=R===1?"e.cycles++":`e.cycles += ${R}`;$+=C===void 0?` { ${M}; e.pc = e.label('${g.to}'); return; }`:C===x&&k?` { ${M}; continue; }`:` { ${M}; e.pc = ${C}; return; }`}g.kind==="end"&&($=`e.pc = ${h+1}; `+$),w.push($?`${$.padEnd(48)} // ${E}`:`// ${E}`)}c[u-1].kind!=="end"&&c[u-1].kind!=="routine"&&u!==x+1&&w.push(`e.pc = ${u};`);let O=l[x]?` // ${l[x]}
22
- `:"",T=w.length===1&&/^return (.*?);( +\/\/ .*)$/.exec(w[0]);if(T){p.push(`${O} ${`${x}: (e, s) => ${T[1]},`.padEnd(60)}${T[2].trim()?" "+T[2].trim():""}`);continue}let a=k?["for (;;) {",...w.map(h=>" "+h)," break;","}"]:w;p.push(`${O} ${x}: (e, s) => {
23
- ${a.map(h=>" "+h).join(`
22
+ `,mt=class{constructor(){this.context=null,this.node=null,this.level=0,this.from=null}async start(){this.context||(this.context=new AudioContext,await this.context.audioWorklet.addModule(URL.createObjectURL(new Blob([pr],{type:"text/javascript"}))),this.node=new AudioWorkletNode(this.context,"speaker"),this.node.connect(this.context.destination),this.rate=this.context.sampleRate,this.context.state!=="running"&&await this.context.resume())}feed(t,e){if(!this.node)return;this.from===null&&(this.from=e);let n=1020484/this.rate,i=Math.floor((e-this.from)/n);if(i<=0)return;let o=new Float32Array(i),c=0;for(let h=0;h<i;h++){let f=this.from+(h+1)*n;for(;c<t.length&&t[c]<=f;)this.level=this.level?0:.25,c++;o[h]=this.level}this.from+=i*n,this.node.port.postMessage(o,[o.buffer])}}});var Nn={};z(Nn,{Machine:()=>ur});import{machine as dr}from"@moonbase-machines/apple2e";var ur,Pn=B(()=>{({Machine:ur}=dr)});var Dn={};z(Dn,{COLORS:()=>xr,colors:()=>Je,paint:()=>gr,paintHires:()=>_e,paintText:()=>ce,rowStart:()=>wr,screen:()=>kr,textRow:()=>yr});import{screen as mr}from"@moonbase-machines/apple2e";var xr,Je,gr,_e,ce,wr,kr,yr,le=B(()=>{({COLORS:xr,colors:Je,paint:gr,paintHires:_e,paintText:ce,rowStart:wr,screen:kr,textRow:yr}=mr)});var Un={};z(Un,{bounds:()=>vr,document:()=>Sr,elements:()=>Xe});import{svg as br}from"@moonbase-machines/vector";var vr,Sr,Xe,Ge=B(()=>{({bounds:vr,document:Sr,elements:Xe}=br)});var Bn={};z(Bn,{C64:()=>$r});import{machine as Er}from"@moonbase-machines/c64";var $r,zn=B(()=>{({C64:$r}=Er)});var Fn={};z(Fn,{keyboard:()=>Cr,pace:()=>Or,painter:()=>Ar});import{browser as jr}from"@moonbase-machines/c64";var Cr,Or,Ar,qn=B(()=>{({keyboard:Cr,pace:Or,painter:Ar}=jr)});var Kn={};z(Kn,{SID:()=>Ze});import{sid as Lr}from"@moonbase-machines/c64";var Ze,Qe=B(()=>{({SID:Ze}=Lr)});var Wn={};z(Wn,{ROM_CHOICES:()=>Rr,c64Roms:()=>Ir,typed:()=>Mr});import{start as Tr}from"@moonbase-machines/c64";var Rr,Ir,Mr,Hn=B(()=>{({ROM_CHOICES:Rr,c64Roms:Ir,typed:Mr}=Tr)});var Vn={};z(Vn,{SECTORS:()=>Pr,add:()=>Dr,make:()=>Ur,petsciiName:()=>Br,read:()=>zr});import{d64 as Nr}from"@moonbase-machines/c64";var Pr,Dr,Ur,Br,zr,Yn=B(()=>{({SECTORS:Pr,add:Dr,make:Ur,petsciiName:Br,read:zr}=Nr)});var ts={};z(ts,{play:()=>qr});async function qr(s){s.stage.innerHTML='<svg id="vector" viewBox="0 0 140 192" preserveAspectRatio="none"></svg><canvas id="screen" width="560" height="384" tabindex="0"></canvas>';let t=s.stage.querySelector("canvas"),e=t.getContext("2d"),n=s.stage.querySelector("#vector");return s.game.kind==="c64"?Wr(s,{canvas:t,layer:n,speaker:new mt}):Kr(s,{canvas:t,ctx:e,layer:n,speaker:new mt})}async function Kr({game:s,saves:t,roms:e,status:n,setting:i},{canvas:o,ctx:c,layer:h,speaker:f}){let[{Machine:l},{placed:m},{screen:g},{shapes:k},{elements:y}]=await Promise.all([Promise.resolve().then(()=>(Pn(),Nn)),Promise.resolve().then(()=>(Be(),Sn)),Promise.resolve().then(()=>(le(),Dn)),Promise.resolve().then(()=>(Xt(),Ps)),Promise.resolve().then(()=>(Ge(),Un))]),w=i(Fr),O=t.data,a=null,u=null;if(e?.apple)try{a=e.apple,u=t.disks(m(O,new Map(await Promise.all(s.images.map(async A=>[A,await e.image(A)])))))}catch{a=null}let d=new l(O,{log:(...A)=>console.log(...A),...a?{roms:a,disks:u}:{}});console.log(a?"line 1: Apple's ROMs, the disks booted":"line 2: moonbase's machine"),t.keep(a?t.driveFiles(d,u):d.disk),d.diskTime=!0;let E=!1,v=0;function L(){let A=(F,P)=>{t:for(let W=16384;W<32768-F.length;W++){for(let J=0;J<F.length;J++)if(F[J]!==null&&P[W+J]!==F[J])continue t;return W}return-1};for(let F of[d.aux,d.main]){let P=A([32,null,null,32,null,null,238,null,null,76],F),W=A([162,0,160,224,24,96],F),J=A([141,null,null,142,null,null,140,null,null,173,null,null,201,128,240],F);if(!(P<0||W<0||J<0)){d.cpu.hooks.set(P,H=>(H.read16(96)===57344&&(h.insertAdjacentHTML("beforeend",y(k(q=>d.read(q),57344),{background:v})),d.marking=1),!1)),d.cpu.hooks.set(W,()=>(d.marking=0,!1)),d.cpu.hooks.set(J,H=>(H.a!==128&&(v=H.a&15),h.innerHTML="",d.owner.fill(0),!1)),E=!0;return}}}let T=new Uint8ClampedArray(560*384*4),I=new ImageData(T,560,384),C=new Uint8Array(26880),$="";function j(){d.halted||d.runCycles(17030);let A=`text ${d.sw.text} page2 ${d.sw.page2} hires ${d.sw.hires} dhires ${d.sw.dhires}`;A!==$&&(console.log("screen:",A,"at pc $"+d.cpu.pc.toString(16),"cycles",d.cpu.cycles),$=A),f.feed(R?d.clicks:[],d.cpu.cycles),d.clicks.length=0,E||L();let F=d.sw.text;g(d,T,{cols:C,owner:w.value&&h.innerHTML?d.owner:null}),c.putImageData(I,0,0),h.style.visibility=w.value&&!F?"visible":"hidden",n.textContent=d.halted?"The game has stopped: "+d.halted+".":d.idle>2e3?"Waiting for a key.":"Running.",requestAnimationFrame(j)}o.addEventListener("pointerdown",()=>o.focus());let R=!0;return{run(){o.focus(),j()},press(A){console.log("key",A,"at pc $"+d.cpu.pc.toString(16)),d.press(A)},start(){f.start()},sound(A){R=A},engine:d}}async function Wr(s,{canvas:t,layer:e,speaker:n}){let{game:i,saves:o,roms:c,studies:h,status:f,printer:l}=s,[{C64:m},{keyboard:g,painter:k},{SID:y},{c64Roms:w,typed:O},{add:a}]=await Promise.all([Promise.resolve().then(()=>(zn(),Bn)),Promise.resolve().then(()=>(qn(),Fn)),Promise.resolve().then(()=>(Qe(),Kn)),Promise.resolve().then(()=>(Hn(),Wn)),Promise.resolve().then(()=>(Yn(),Vn))]),u=await w(c?.choice??null,c?.load);if(!u)return f.textContent="Commodore's ROMs, asked for, are not here.",null;s.chargen=u.chargen;let d=new m(i,u,{log:(...P)=>console.log(...P),printer:l});o.drive(d.drive);let E=P=>Uint8Array.from(atob(P),W=>W.charCodeAt(0));for(let[P,W]of Object.entries(h??{}))d.drive.saved.set(P,E(W));e.style.display="none";let v=k(t),L=null,T=0,I=!0,C={keydown:[],keyup:[]},$=g(d,{log:!0,listen:(P,W)=>C[P].push(W)}),j=0,R=null,A=performance.now();function F(){let P=Math.min(2,Math.floor((performance.now()-A)/20)-j);for(let W=0;W<P;W++){if(d.runFrame(),j++,$.frame(),n.node&&I){R||(R=new y(n.rate));let J=Math.round(19656/985248*n.rate),H=d.cpu.cycles-19656,q=R.render(J,d.sidWrites.map(([rt,nt,xt])=>[Math.floor((rt-H)/19656*J),nt,xt]));n.node.port.postMessage(q,[q.buffer])}d.sidWrites.length=0}j>=120&&L===null&&!T&&(L=O(d,i),T=1),L!==null&&!d.ram[198]&&(L=d.type(L),L.length||(L=null)),v(d.vic.frame),f.textContent=d.halted?"The game has stopped: "+d.halted+".":"Running.",requestAnimationFrame(F)}return{run(){t.focus(),F()},press(P){d.type(String.fromCharCode(P))},key(P){for(let W of C[P.type])W(P)},start(){n.start()},sound(P){I=P},engine:d,diskImage:()=>a(d.drive.image,[...d.drive.saved].map(([P,W])=>({name:P,data:W})))}}var Fr,es=B(()=>{ae();Fr={name:"vectors",type:"boolean",default:!1,owner:"person",words:"Draw the pictures as vectors"}});import{rom as Hr}from"@moonbase-machines/c64";var vc,Jn,_n=B(()=>{({install:vc,standIn:Jn}=Hr)});import{colors as Vr}from"@moonbase-machines/apple2e";var Xn,$c,at,Gn=B(()=>{({COLORS:Xn,NAMES:$c,rgb:at}=Vr)});import{font as Yr}from"@moonbase-machines/charset";var ss,Zn=B(()=>{({FONT:ss}=Yr)});var Qn={};z(Qn,{View:()=>Ft});var Jr,V,Y,fe,_r,ns,Xr,Ft,is=B(()=>{Gn();Xt();_t();te();Ge();Rt();Dt();Zn();le();Jr="http://www.w3.org/2000/svg",V=s=>s*4,Y=s=>s*2,fe='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',_r='ui-monospace, Menlo, Consolas, "Liberation Mono", monospace',ns=["[","\\","]","^"],Xr={"[":"\u2190","\\":"\u2192","]":"\u2193","^":"\u2191"},Ft=class{constructor(t,{disk:e,volume:n,engine:i,extra:o={},press:c}){this.svg=t,this.engine=i,this.extra=o,this.press=c,t.setAttribute("viewBox","0 0 560 384"),this.disk=e.volumes[n],this.pictures=new Map;for(let[m,g]of Object.entries(e.volumes[n]))if(/^PICS\d$/.test(m))for(let k of Tt(Uint8Array.from(atob(g.data),y=>y.charCodeAt(0))))this.pictures.set(k.name,k.shapes);let h=i.title.map;this.vars=h.vars;let f={...Xr,...h.modern};for(let m=0;m<10;m++)f[String.fromCharCode(128+m)]=String(m);let l=new RegExp("["+Object.keys(f).map(m=>"\\"+m).join("")+"]","g");this.modern=m=>m.replace(l,g=>f[g]),this.tables=new Map(Jt(Bt(h,e.volumes[n]),h.objects).map(m=>[m.address,m.objects])),this.items=[],this.pen={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10},this.window={color:0,bottom:116},this.shapes=[],this.spaceBar=null,this.layer=this.el("g"),t.append(this.layer),this.textScreen=this.el("g",{display:"none"}),t.append(this.textScreen),this.prompt=this.el("g"),t.append(this.prompt),this.textPen=Pt(),this.textCells=kt(),this.rect(0,0,140,192,15,this.layer)}el(t,e={},n){let i=document.createElementNS(Jr,t);for(let[o,c]of Object.entries(e))i.setAttribute(o,c);return n?.append(i),i}rect(t,e,n,i,o,c=this.layer){return this.el("rect",{x:V(t),y:Y(e),width:V(n),height:Y(i),fill:at(o),"shape-rendering":"crispEdges"},c)}add(t,e,n,{covers:i=!0,left:o=0,right:c=139}={}){return i&&(this.items=this.items.filter(h=>h.top>=t&&h.bottom<=e&&h.left>=o&&h.right<=c?(h.el.remove(),!1):!0)),this.items.push({top:t,bottom:e,left:o,right:c,el:n}),this.layer.append(n),n}remove(t){t.remove(),this.items=this.items.filter(e=>e.el!==t)}fill(t,e,n,i=!0){let o=this.el("g");this.rect(0,t,140,e-t+1,n,o),i&&(this.rect(0,t,1,e-t+1,15,o),this.rect(139,t,1,e-t+1,15,o)),this.add(t,e,o)}whiteLines(t){this.add(t,t+1,this.rect(0,t,140,2,15,null))}snapshot(t){let e=this.engine.mem;return t.layout=e[this.vars.layout],t.difficulty=e[this.vars.difficulty],t.step==="text"&&(t.words=bt(t.words,e)),t.step==="span"&&(t.row=e[this.vars.zero+2]),t}apply(t){this.difficulty=t.difficulty,this.spaceBar?.erase&&!this.waiting()&&(this.fill(this.spaceBar.y,this.spaceBar.y+10,5),this.spaceBar.el.remove(),this.spaceBar=null);let e=this.extra[t.step]??(typeof this[t.step]=="function"?this[t.step]:void 0);e&&e.call(this,t)}waiting(){return this.engine.waitingOn}"text-screen"(){this.textCells=kt(),this.textScreen.replaceChildren(),this.rect(0,0,140,192,0,this.textScreen),this.textScreen.setAttribute("display","inline"),this.layer.setAttribute("display","none")}show(){this.textScreen.setAttribute("display","none"),this.layer.setAttribute("display","inline")}textCell(t,e,n,i){this.textCells[t][e].el?.remove();let c=this.el("g",{"data-cell":t*40+e},this.textScreen),h=e*14,f=t*16,l=i?"#000":"#fff";if(i&&this.el("rect",{x:h,y:f,width:14,height:16,fill:"#fff","shape-rendering":"crispEdges"},c),this.oldStyle){let m=ss[n.charCodeAt(0)-32]??ss[0],g="";for(let k=0;k<5;k++)for(let y=0;y<7;y++)m[k]>>y&1&&(g+=`M${h+2+k*2} ${f+y*2}h2v2h-2z`);g&&this.el("path",{d:g,fill:l},c)}else if(n!==" "){let m=this.el("text",{x:h+7,y:f+12,fill:l,"font-family":_r,"font-size":15,"text-anchor":"middle"},c);m.textContent=n}this.textCells[t][e]={ch:n,inverse:i,el:c}}splash(){let t=this.disk.TITLE;if(!t)return;let e=Uint8Array.from(atob(t.data),o=>o.charCodeAt(0)),n=Je(e.subarray(0,8192),e.subarray(8192)),i=[];for(let o=0;o<192;o++)i.push(Array.from(n.subarray(o*140,o*140+140)));this.clear(),this.add(0,191,this.el("image",{href:this.image(i),x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))}"clear-screen"(){this.clear(),this.add(0,191,this.rect(0,0,140,192,0,null))}clear(){for(let t of this.items)t.el.remove();this.items=[]}"keep-screen"(){this.kept={items:this.items,pen:{...this.pen},window:{...this.window},shapes:this.shapes,spaceBar:this.spaceBar};for(let t of this.items)t.el.remove();this.items=[],this.spaceBar=null,this["clear-screen"]()}"put-screen"(){if(!this.kept)return;this.clear();let t=this.kept;this.kept=null;for(let e of t.items)this.layer.append(e.el);Object.assign(this,{items:t.items,pen:t.pen,window:t.window,shapes:t.shapes,spaceBar:t.spaceBar})}box({a:t,x:e,y:n,layout:i}){let[o,c,h]=wt[i]??wt[50];if(t!==128&&e!==128&&n!==128){for(let f of this.items)f.el.remove();this.items=[]}if(t!==128){let f=this.el("g");this.rect(1,1,138,o-1,t,f),this.el("rect",{x:V(1)+2,y:Y(1)+1,width:V(138)-4,height:Y(o-2)-2,fill:"none",stroke:"black","stroke-width":4},f),this.add(1,o-1,f,{left:1,right:138}),this.window={color:t,bottom:o},this.shapes=[]}e!==128&&(this.whiteLines(c),this.fill(c+2,h-1,e)),n!==128&&(this.whiteLines(h),this.fill(h+2,189,n))}panel({n:[t]}){let e=It[t];if(e){this.whiteLines(e.rows[0]),this.fill(e.rows[0]+2,e.rows[1],e.fill);for(let n of e.more??[])this.whiteLines(n);Object.assign(this.pen,{paper:e.paper,ink:e.ink,centre:!0,spacing:1,gap:e.gap,y:e.y})}}scroll(){let o=this.scrolling,c=(m,g,k)=>{let y="scroll-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:V(m),y:Y(19)-1,width:V(g-m),height:Y(97)+1},this.el("clipPath",{id:y},this.svg)),this.el("g",{"clip-path":`url(#${y})`},k)},h=(m,g)=>this.items.filter(k=>k!==o?.item&&k.top<=115&&k.bottom>=19&&k.left<=g&&k.right>=m);if(o?.item.el.isConnected&&this.items.at(-1)===o.item){let m=c(129.5,136.5,this.el("g",{transform:`translate(${V(7*o.n)} 0)`},o.moved));for(let g of h(129.5,129.5+7))m.append(g.el.cloneNode(!0));o.n++,o.moved.setAttribute("transform",`translate(${V(-7*o.n)} 0)`);return}let f=c(3.5,129.5),l=this.el("g",{transform:`translate(${V(-7)} 0)`},f);this.rect(3.5,19,1120,97,this.window.color,l);for(let m of h(3.5,139))l.append(m.el.cloneNode(!0));this.add(19,115,f,{left:4,right:129}),this.scrolling={item:this.items.at(-1),moved:l,n:1}}"shift-down"({left:t,right:e,top:n,bottom:i,by:o}){let c=this.shifting,h=(g,k,y)=>{let w="shift-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:V(t),y:Y(g),width:V(e-t+1),height:Y(k-g)},this.el("clipPath",{id:w},this.svg)),this.el("g",{"clip-path":`url(#${w})`},y)},f=(g,k)=>this.items.filter(y=>y!==c?.item&&y.top<=k&&y.bottom>=g&&y.left<=e&&y.right>=t);if(c?.item.el.isConnected&&this.items.at(-1)===c.item){let g=h(n,n+o,this.el("g",{transform:`translate(0 ${Y(-o*c.n)})`},c.moved));for(let k of f(n,n+o-1))g.append(k.el.cloneNode(!0));c.n++,c.moved.setAttribute("transform",`translate(0 ${Y(o*c.n)})`);return}let l=h(n+o,i+o+1),m=this.el("g",{transform:`translate(0 ${Y(o)})`},l);this.rect(t,n-o*60,e-t+1,i-n+1+o*61,this.window.color,m);for(let g of f(n,i))m.append(g.el.cloneNode(!0));this.add(n+o,i+o,l,{left:t,right:e}),this.shifting={item:this.items.at(-1),moved:m,n:1}}paint(t,e,n,i){this.hide(e,n,i,i);let o=this.painted;if(o?.el.isConnected&&o.color===t&&o.left===e&&o.right===n&&o.bottom===i-1){o.bottom=i,o.el.setAttribute("height",Y(i-o.top+1));let h=this.items.find(f=>f.el===o.el);this.items=this.items.filter(f=>f!==h&&f.top>=o.top&&f.bottom<=i&&f.left>=e&&f.right<=n?(f.el.remove(),!1):!0),h&&(h.bottom=i);return}let c=this.add(i,i,this.rect(e,i,n-e+1,1,t,null),{left:e,right:n});this.painted={el:c,color:t,left:e,right:n,top:i,bottom:i}}span({a:t,x:e,y:n,row:i}){this.paint(t&15,e,n,i)}dot({a:t,x:e,y:n}){this.paint(t&15,e,e,n)}"white-lines"({y:t}){this.whiteLines(t)}"fill-rows"({a:t,x:e,y:n}){this.fill(n,n+e-1,t)}picture({words:t}){let e=this.pictures.get(t.toUpperCase().replace(/_/g," "));if(!e)return;let n="window-"+this.window.bottom;this.clips??=new Set,this.clips.has(n)||(this.clips.add(n),this.el("rect",{x:0,y:0,width:V(140),height:Y(this.window.bottom)},this.el("clipPath",{id:n},this.svg)));let i=this.el("g",{"clip-path":`url(#${n})`}),o=this.el("g",{transform:"scale(4 2)"},i);o.innerHTML=Xe(e,{crisp:!1}),this.add(1,this.window.bottom-1,i,{covers:!1,left:1,right:138}),this.shapes=this.shapes.concat(e),this.picturesShapes=e}objects({table:t}){this.table=parseInt(t.slice(1),16)}object({a:t,x:e,y:n},i="whole"){let o=i==="keep",c=i==="whole",h=this.tables.get(this.table);if(t<2){this.kept?.isConnected&&this.remove(this.kept),this.kept=null;return}let f=h?.find(y=>y.number===t);if(!f)return;let l=f.rows.map(y=>y.map(w=>!c&&w===f.clear?void 0:w)),m=e+f.width-1,g=n+f.height-1;c&&this.hide(e,m,n,g);let k=this.el("image",{href:this.image(l),x:V(e),y:Y(n),width:V(f.width),height:Y(f.height),preserveAspectRatio:"none",style:"image-rendering: pixelated"});this.add(n,g,k,{covers:c,left:e,right:m}),o&&(this.kept=k),c&&(this.items.at(-1).whole={x:e,y:n,rows:l})}hide(t,e,n,i){for(let o of[...this.items]){let c=o.whole;if(!c||c.x>e||c.x+c.rows[0].length-1<t||c.y>i||c.y+c.rows.length-1<n)continue;let h=!1,f=c.rows.map((l,m)=>l.map((g,k)=>{let y=c.x+k,w=c.y+m;if(g!==void 0&&y>=t&&y<=e&&w>=n&&w<=i){h=!0;return}return g}));if(h){if(f.every(l=>l.every(m=>m===void 0))){this.remove(o.el);continue}o.el.setAttribute("href",this.image(f)),c.rows=f}}}image(t){let e=document.createElement("canvas");e.width=t[0].length,e.height=t.length;let n=e.getContext("2d"),i=n.createImageData(e.width,e.height);return t.forEach((o,c)=>o.forEach((h,f)=>{if(h===void 0)return;let[l,m,g]=Xn[h];i.data.set([l,m,g,255],(c*e.width+f)*4)})),n.putImageData(i,0,0),e.toDataURL()}"object-keep"(t){this.object(t,"keep")}"object-mode"(t){this.object(t,"clear")}"key-at"({a:t,x:e,y:n}){this.pen.x=e,this.pen.y=n,this.key({a:t})}key({a:t}){let e=it(t);this.cap(t,this.pen.x,this.pen.y,this.layer,!0,void 0,Math.max(4,e)+4),this.pen.x+=1+(e<4?4-e:0)+1+e+3}cap(t,e,n,i,o,c,h){let f={"\r":"RETURN","\x7F":"DELETE"}[t]??t,l=h??(f.length>1?32:7),m=this.el("g",c!==void 0?{class:"key","data-key":c}:{});if(this.el("rect",{x:V(e),y:Y(n-2),width:V(l),height:Y(11),rx:3,fill:at(1),stroke:at(13),"stroke-width":3},m),this.oldStyle){let g=0;for(let k of f)g+=it(k)+1;this.glyphs(m,f,e+Math.max(1,Math.round((l-g+1)/2)),n,15)}else{let g=this.el("text",{x:V(e+l/2),y:Y(n+7),fill:at(15),"font-family":fe,"font-size":f.length>1?13:16,"font-weight":600,"text-anchor":"middle"},m);g.textContent=this.modern(f)}return o?(this.add(n-2,n+8,m,{covers:!1,left:e,right:e+l}),this.items.at(-1).cap=!0):i.append(m),m}text({words:t}){if(this.textScreen.getAttribute("display")!=="none"){for(let e of Nt(t,this.textPen))this.textCells[e.row]?.[e.col]&&this.textCell(e.row,e.col,e.ch,e.inverse);return}for(let e of Mt(t,this.pen)){let{top:n,tall:i}=e,o=i?32:19,c=e.chars.filter(k=>k.ch.charCodeAt(0)>=32);if(c.length){let k=Math.min(...c.map(O=>O.x)),y=Math.max(...c.map(O=>O.x+it(O.ch)))-1,w=Math.min(9,e.height??9)*(i?2:1);this.add(n,n+w-1,this.rect(k,n,y-k+1,w,e.paper,null),{left:k,right:y})}let h=this.el("g",{"font-family":fe,"font-size":o,"font-weight":i?700:500}),f=null,l=139,m=0,g=()=>{if(!f)return;if(l=Math.min(l,f.x),m=Math.max(m,f.x+f.width),this.oldStyle){this.glyphs(h,f.chars,f.x,n,e.ink,i,e.paper),f=null;return}let k=this.el("text",{y:Y(n+(i?15:7)),"data-x":V(f.x),"data-width":V(f.width)},h);for(let y of f.chars){let w=this.el("tspan",{fill:at(y.ink??e.ink)},k);w.textContent=this.modern(y.ch)}f=null};for(let k of e.chars){if(k.ch.charCodeAt(0)<=32){g();continue}f??={x:k.x,width:0,chars:[]},f.chars.push(k),f.width=k.x+it(k.ch)-f.x}g(),h.childNodes.length&&(this.add(n,n+(i?16:8),h,{covers:!1,left:l,right:m}),this.fit(h))}}fit(t){for(let e of t.querySelectorAll("text[data-width]")){let n=e.getComputedTextLength();n>0&&e.setAttribute("transform",`translate(${e.dataset.x} 0) scale(${e.dataset.width/n} 1)`)}}glyphs(t,e,n,i,o,c=!1,h){let f=typeof e=="string"?[...e].map(g=>({ch:g})):e,l=c?2:1,m=new Map;for(let g of f){let k=it(g.ch),y=g.ink??o;h!==void 0&&this.rect(n,i,k,9*l,h,t);let w=m.get(y)??"";for(let[O,a]of Gt(g.ch))w+=`M${V(n+O)} ${Y(i+a*l)}h4v${2*l}h-4z`;m.set(y,w),n+=k+1}for(let[g,k]of m)k&&this.el("path",{d:k,fill:at(g)},t);return n}write(t,e,n,i,o=15){if(this.oldStyle)return this.glyphs(t,e,n,i,o);let c=this.el("g",{"font-family":fe,"font-size":19,"font-weight":500,fill:at(o)},t);for(let h of e.split(" ")){if(h){let f=0;for(let m of h)f+=it(m)+1;let l=this.el("text",{y:Y(i+7),"data-x":V(n),"data-width":V(f-1)},c);l.textContent=this.modern(h),n+=f}n+=it(" ")+1}return this.fit(c),n}line({x0:t,x1:e,y0:n,y1:i,color:o}){this.add(Math.min(n,i),Math.max(n,i),this.el("line",{x1:V(t+.5),y1:Y(n+.5),x2:V(e+.5),y2:Y(i+.5),stroke:at(o),"stroke-width":3,"stroke-linecap":"round"}),{covers:!1,left:Math.min(t,e),right:Math.max(t,e)})}rectangle({a:t,x:e,y:n,width:i,height:o}){this.solid(t,e,n,i+1,o)}"rectangle-outline"({a:t,x:e,y:n,width:i,height:o}){let c=i+1,h=o+1;this.add(n,n+h-1,this.el("rect",{x:V(e)+2,y:Y(n)+1,width:V(c)-4,height:Y(h)-2,fill:"none",stroke:at(t),"stroke-width":3}),{covers:!1,left:e,right:e+c-1})}solid(t,e,n,i,o){this.add(n,n+o-1,this.rect(e,n,i,o,t,null),{left:e,right:e+i-1})}prompts(){this.prompt.replaceChildren();let t=this.engine,e=t.waitingOn;if(!e)return;let n=e.words?.[0]??e.name;if(n==="wait"||n==="wait-erase"||n==="wait-or-escape"){let i=(t.mem[this.vars.layout]&15)===1?178:170,o=this.el("g",{class:"key","data-key":32},this.prompt);if(this.el("rect",{x:V(46),y:Y(i),width:V(47),height:Y(11),rx:4,fill:at(1),stroke:at(13),"stroke-width":3},o),this.oldStyle)this.glyphs(o,"SPACE BAR",48,i+2,15);else{let c=this.el("text",{x:V(69.5),y:Y(i+8),fill:at(15),"font-family":fe,"font-size":15,"font-weight":600,"text-anchor":"middle"},o);c.textContent="SPACE BAR"}this.spaceBar={y:i,erase:n==="wait-erase",el:o}}else if(n==="ask"||n==="ask-mode"||n==="ask-escape"){this.rect(1,162,138,28,5,this.prompt);let i=t.askMode,o=[];if(i===128)ns.forEach((h,f)=>o.push([h,[8,21,10,11][f]]));else if(i>=177&&i<186)for(let h=49;h<=(i&127);h++)o.push([String.fromCharCode(h),h]);else for(let h=65;h<=(i&95);h++)o.push([String.fromCharCode(h),h]);let c=(h,f,l)=>this.write(this.prompt,h,f,l);if(t.asked===null)c("Press",4,166),o.forEach(([h,f],l)=>{l===o.length-1&&i!==128&&o.length>1&&c("or",31+10*l,166),this.cap(h,31+10*l+(l===o.length-1&&i!==128&&o.length>1?10:0),166,this.prompt,!1,f)}),i===128&&[[58,62],[74,62],[66,71],[66,53]].forEach(([h,f],l)=>this.cap(ns[l],h,f,this.prompt,!1,o[l][1]));else{let[h]=o[t.asked.place];this.cap(h,31+10*t.asked.place,166,this.prompt,!1),c("Press",4,179),this.cap("\r",31,179,this.prompt,!1,13),c("or",67,179),this.cap("\x7F",78,179,this.prompt,!1,127),i===128&&this.cap(ns[t.asked.place],[58,74,66,66][t.asked.place],[62,62,71,53][t.asked.place],this.prompt,!1)}}}}});var ti={};z(ti,{CardView:()=>qt});function Zr(s,{top:t}){for(let e=0;e<t;e++)for(let n=0;n<560;n++){let i=(e*560+n)*4;if(s[i]<200||s[i+1]<200||s[i+2]<200)return!1}return!0}function Qr(s,{top:t,bottom:e,move:[n,i],by:o}){for(let c=t;c<=e;c++){let h=c*560*4;s.copyWithin(h+(n+o)*4,h+n*4,h+i*4),o<0?s.fill(255,h+(i+o)*4,h+i*4):s.fill(255,h+n*4,h+(n+o)*4)}}var Gr,qt,rs=B(()=>{le();Gr="http://www.w3.org/2000/svg",qt=class{constructor(t,{engine:e,inset:n=null}){this.svg=t,this.engine=e,this.inset=n,this.insetOn=!1,this.banded=!1,t.setAttribute("viewBox","0 0 560 384"),this.canvas=document.createElement("canvas"),this.canvas.width=560,this.canvas.height=384,this.image=document.createElementNS(Gr,"image");for(let[i,o]of Object.entries({x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(i,o);t.append(this.image)}snapshot(t){return t}apply(){}prompts(){let t=this.engine.mem,e=this.engine.title.screen,n=this.canvas.getContext("2d"),i=n.createImageData(560,384);if(e.text)ce(i.data,t,t,!1,[0,24]);else{let o=e.page2?16384:8192;_e(i.data,t.subarray(o,o+8192)),e.mixed&&ce(i.data,t,t,!1,[20,24])}this.banded=this.insetOn&&!!this.inset&&Zr(i.data,this.inset),this.banded&&Qr(i.data,this.inset),n.putImageData(i,0,0),this.image.setAttribute("href",this.canvas.toDataURL())}}});import{paint as to}from"@moonbase-machines/c64";var ei,si=B(()=>{({paint:ei}=to)});import{vic as eo}from"@moonbase-machines/c64";var Kt,Kc,os,Wc,Hc,Wt,ni=B(()=>{({HEIGHT:Kt,LEFT:Kc,PALETTE:os,TOP:Wc,VIC:Hc,WIDTH:Wt}=eo)});var ii={};z(ii,{C64View:()=>Ht});var so,Ht,as=B(()=>{si();ni();so="http://www.w3.org/2000/svg",Ht=class{constructor(t,{engine:e,chargen:n}){this.svg=t,this.engine=e,this.chargen=n,t.setAttribute("viewBox",`0 0 ${Wt*2} ${Kt*2}`),this.canvas=document.createElement("canvas"),this.canvas.width=Wt,this.canvas.height=Kt,this.image=document.createElementNS(so,"image");for(let[i,o]of Object.entries({x:0,y:0,width:Wt*2,height:Kt*2,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))this.image.setAttribute(i,o);t.append(this.image)}snapshot(t){return t}apply(){}prompts(){let t=this.engine,e=ei(t.mem,t.title.chip,this.chargen,this.vic,t.title.splits),n=this.canvas.getContext("2d"),i=n.createImageData(Wt,Kt);for(let o=0;o<e.length;o++){let[c,h,f]=os[e[o]];i.data.set([c,h,f,255],o*4)}n.putImageData(i,0,0),this.svg.style.background=`rgb(${os[e[0]].join(",")})`,this.image.setAttribute("href",this.canvas.toDataURL())}}});var he={};z(he,{play:()=>ro});async function ro(s){let{title:t,scripts:e,game:n,stage:i,status:o,fail:c,saves:h,$:f}=s,l=n.kind==="c64";i.innerHTML=`<svg id="screen" preserveAspectRatio="xMidYMid meet" tabindex="0" aria-label="The game's screen"></svg>`;let m=f("screen"),g=l?"c64":t.engine==="card"?"card":"vector",k=t.viewSteps??{},y=s.chargen=l?s.roms?.chargen??Jn().chargen:null;s.printer&&(t.printer=s.printer),t.disk=h.data,l&&h.drive(t.drive=new se(Uint8Array.from(atob(n.image),M=>M.charCodeAt(0))));let w=Fe(t,e);t.files&&h.keep(t.files);let O=[],a=[],u=g==="vector"?s.setting(no):{value:!1,on(){return this}},d=null,E=()=>{m.replaceChildren();let M=g==="c64"?new Ht(m,{engine:w,chargen:y}):g==="card"?new qt(m,{engine:w,inset:s.mini?t.inset:null}):new Ft(m,{disk:n,volume:Object.keys(n.volumes)[0],engine:w,extra:k});return M.oldStyle=u.value,d?.(M),M},v=E();if(w.on(M=>O.push(v.snapshot({...M}))),t.inset&&s.mini){let M=s.setting(io),{top:r,bottom:p,view:[x,S]}=t.inset,b=document.createElement("div");b.className="mini",b.hidden=!0,Object.assign(b.style,{left:`${x/5.6}%`,top:`${r/3.84}%`,width:`${(S-x)/5.6}%`,height:`${(p-r+1)/3.84}%`}),m.parentElement.append(b);let N=await s.mini(b,{memory:()=>w.mem});d=D=>{D.insetOn=!!M.value;let K=D.prompts.bind(D);D.prompts=()=>{K(),b.hidden=!(M.value&&D.banded)}},d(v);let U=()=>{v.insetOn=!!M.value,N.mode(M.value),v.prompts()};M.on(U),U()}u.on(()=>{v=E();for(let M of a)v.apply(M);v.prompts()});let L=w.timed?new mt:null,T=!0,I=()=>{l||L?.feed(T?w.clicks:[],w.cycles),w.clicks.length=0},C=t.map?.vars??{sound:0,soundOn:0},$=null,j=(M,r,p)=>{if(!T||!(w.mem[C.sound]&C.soundOn))return;$??=new AudioContext;let x=$.createOscillator(),S=$.createGain(),b=$.currentTime;x.type="square",x.frequency.setValueAtTime(M,b),x.frequency.linearRampToValueAtTime(r,b+p/1e3),S.gain.setValueAtTime(.06,b),S.gain.linearRampToValueAtTime(0,b+p/1e3),x.connect(S).connect($.destination),x.start(b),x.stop(b+p/1e3)},R=M=>16e3/(M+8),A={sound:220,beep:60,"flash-box":60,flash:250,object:30,"object-keep":30},F=!1,P=!1,W=M=>new Promise(r=>setTimeout(r,M));async function J(){if(!F){F=!0;try{for(;;){let M=w.run();if(I(),M==="pace"){for(let r of O.splice(0))a.push(r),v.apply(r);v.prompts(),!P&&s.pace()&&await W(w.delay*s.pace()),w.delay=0;continue}for(w.delay=0;O.length;){let r=O.shift();if(a.push(r),v.apply(r),!P){if(r.step==="sound"){let[p,x]=r.words.split(" ").map(S=>parseInt(S,16));j(R(x),R(p),180)}r.step==="beep"&&j(R(r.a&31)*2,R(r.a&31)*2,50),s.pace()&&(A[r.step]&&await W(A[r.step]*s.pace()),r.step==="pause"&&await W(r.ms*s.pace()))}}if(v.prompts(),o.textContent=M==="end"?"The end.":"Waiting for a key.",!w.keys.length||M==="end")break}}catch(M){c(M)}F=!1}}let H=M=>{w.press(M),$?.resume(),L?.start(),l||J()},q=()=>w.waitingOn?.words?.[0]==="tick",rt=null,nt=null;m.addEventListener("click",M=>{let r=M.target.closest(".key")?.dataset.key;r&&H(+r)});function xt(){w.sid=[],w.clock={irq:0,ahead:[],since:0};let M=null,r=null,p=0,x=!1;o.textContent="Playing.",setInterval(()=>{if(w.delay-=1e3/60,!x&&!w.ended&&w.delay<16){w.delay=Math.max(0,w.delay),w.clock.ahead.length&&w.idle>(w.routines.polls??200)&&!w.keys.length&&++w.clock.since>120&&(w.press(w.clock.ahead.shift()),w.clock.since=0);try{w.run(),O.length=0,v.prompts()}catch(S){x=!0,c(S)}w.ended&&(o.textContent="The end.")}if(L?.node&&T){M??=new Ze(L.rate),r??=performance.now();let S=Math.floor((performance.now()-r)/1e3*L.rate)-p;if(S>0){let b=M.render(S,w.sid.map(([,N,U])=>[0,N,U]));p+=S,L.node.port.postMessage(b,[b.buffer])}}w.sid.length=0},1e3/60)}return setInterval(()=>{if(!q()||F||w.keys.length)return;let M=nt??rt??-1;nt=null,H(M)},100),{engine:w,press:H,run(){m.focus(),l?xt():J()},key(M,r){if(M.type==="keyup"){rt=null;let x=w.clock?.held;x?.key===M.key&&(x.seen?w.clock.held=null:x.up=!0);return}if(r===void 0)return;if(M.preventDefault(),q()){nt=rt=r;return}let p=l&&!M.ctrlKey&&rn(r);if(p){M.repeat||(w.clock.held={...p,key:M.key},$?.resume(),L?.start());return}M.repeat||H(r)},keys(M){if(l)w.clock.ahead.push(...M);else for(let r of M)H(r)},start(){$?.resume(),L?.start()},sound(M){T=M},quick(M){P=M},route({route:M,name:r,keys:{expand:p,give:x,petscii:S,pollsAt:b}}){if(t.seed=M.seed,M.printer&&t.printer){t.printer.on=!0;let D=f("printer");D&&(D.checked=!0)}o.textContent="Playing the route "+r+".";let N={press:D=>w.press(D),also:D=>{let K=w.mem,Q=tt=>{K[198]<10&&(K[631+K[198]]=tt,K[198]++)};w.keys.length&&Q(w.keys.shift()),Q(D)}},U=()=>{let D;do w.delay=0,D=w.run();while(D==="pace");if(l)O.length=0;else for(let K of O.splice(0))a.push(K),v.apply(K)};U();for(let[D,[K]]of p(M.keys).entries())x(N,K,l?S:void 0),w.polls=b(M,D+1)??void 0,U();w.polls=void 0,v.prompts()}}}var no,io,pe=B(()=>{oe();ae();Qe();Oe();_n();Ae();is();rs();as();no={name:"old-style",type:"boolean",default:!1,owner:"person",words:"Old style text"},io={name:"mini",type:["","live","pictures"],default:"",owner:"person",words:"Mini view",labels:["Off","Live","Pictures"]}});var ci={};z(ci,{play:()=>co});oe();var Tn={};z(Tn,{savesFor:()=>qe});import{saves as or}from"@moonbase-machines/apple2e";var{driveFiles:jn,keepSaves:Cn,onDisks:On,withSaves:An}=or;import{saves as ar}from"@moonbase-machines/c64";var{keepDrive:Ln}=ar;function qe(s,t){return{data:An(s,t),keep:e=>Cn(s,e,t),drive:e=>Ln(e,t),disks:e=>On(s,e,t),driveFiles:(e,n)=>jn(e,n,s)}}var Rn={};z(Rn,{code:()=>Ke,named:()=>We});var cr={ArrowLeft:8,ArrowRight:21,ArrowDown:10,ArrowUp:11,Enter:13,Backspace:127,Delete:127,Escape:27,Tab:9," ":32},lr={ArrowLeft:157,ArrowRight:29,ArrowDown:17,ArrowUp:145,Enter:13,Backspace:20,Delete:20,Escape:3," ":32},fr={space:32,return:13,escape:27,delete:127,left:8,right:21,down:10,up:11,"control-e":5,"control-t":20,none:-1},hr={8:157,21:29,10:17,11:145,127:20,27:3};function Ke(s,t){if(!t||s.metaKey||s.altKey)return;let e=t==="c64";return s.ctrlKey?/^[a-z]$/i.test(s.key)?s.key.toUpperCase().charCodeAt(0)&31:void 0:(e?lr:cr)[s.key]??(s.key.length===1?(e?s.key.toUpperCase():s.key).charCodeAt(0):void 0)}function We(s,t){let e=fr[s]??s.charCodeAt(0);return t==="c64"?hr[e]??e:e}var In={};z(In,{KEYS_MARKUP:()=>Ye,paperBox:()=>He,phoneKeys:()=>Ve});function He({line:s,print:t,tear:e}){let n=document.createElement("div");return n.id="paper-box",n.hidden=!0,n.innerHTML='<p><span></span> <button id="print-paper" type="button"></button> <button id="tear" type="button"></button></p><canvas id="paper"></canvas>',n.querySelector("span").textContent=s,n.querySelector("#print-paper").textContent=t,n.querySelector("#tear").textContent=e,n}function Ve(s,t){let e=s.querySelector("#keyboard"),n=s.querySelector("#keys-box");if(!e||!n||!matchMedia("(pointer: coarse)").matches)return;e.hidden=!1,e.addEventListener("click",()=>n.focus()),t.addEventListener("click",()=>n.focus());let i=!1;n.addEventListener("keydown",o=>{i=o.key==="Unidentified"}),n.addEventListener("input",()=>{if(i)for(let o of n.value)for(let c of["keydown","keyup"])window.dispatchEvent(new KeyboardEvent(c,{key:o}));n.value=""})}var Ye='<button type="button" id="keyboard" class="full" hidden>Keyboard</button><input id="keys-box" class="keys-box" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" aria-label="Keys for the game">';var ri={prodos:[280,192],dos33:[280,192],c64:[384,272]},oi={original:()=>Promise.resolve().then(()=>(es(),ts)),card:()=>Promise.resolve().then(()=>(pe(),he)),vector:()=>Promise.resolve().then(()=>(pe(),he))},oo={name:"sound",type:"boolean",default:!0,owner:"person",words:"Sound"},ao={name:"printer",type:"boolean",default:!0,owner:"person",words:"Printer"},ai={name:"fixed",type:"boolean",default:!1,owner:"person",words:"Bugs fixed",title:"The game with its bugs fixed: it starts again"};async function co(s){let{way:t="remake",slug:e,root:n,disk:i,settings:o,preview:c=!1,words:h}=s;n.classList.add("player",t),e&&n.classList.add(e),n.innerHTML=`<div class="stage"></div><p class="options"><span id="status">Loading.</span>${Ye}<span class="settings"></span><button id="disk" type="button" hidden>Download the disk</button></p>`,n.append(He(h.printer));let f=w=>n.querySelector("#"+w),l=n.querySelector(".stage"),m=f("status"),g=n.querySelector(".options .settings"),k=w=>{m.textContent="The game stopped: "+w.message,m.className="error",console.error(w)},y=(w,{first:O=!1}={})=>{let a={value:o.get(w),told:[],on(v){return this.told.push(v),this}};if(!o.offered(w))return a;let u=document.createElement("label"),d=Array.isArray(w.type);w.title&&(u.title=w.title);let E=d?Object.assign(document.createElement("select"),{innerHTML:w.type.map((v,L)=>`<option value="${v}">${w.labels[L]}</option>`).join("")}):Object.assign(document.createElement("input"),{type:"checkbox"});return E.id=w.name,d?(E.value=a.value,u.append(w.words+" ",E)):(E.checked=a.value,u.append(E," "+w.words)),E.addEventListener("change",()=>{a.value=d?E.value:E.checked,o.set(w,a.value);for(let v of a.told)v(a.value)}),g[O?"prepend":"append"](u),a};try{if(!i||!o)throw new Error("the page gives the player its disk and its settings");let w=o.get(ai),O=s.title?new URL(s.title):null,a=new URL(s.data),u=null,d={},E=null;t==="remake"?{title:u,scripts:d,disk:E}=await ze(O,{data:a,fixed:w}):O&&(u=await re(O)),!E&&/\.json$/.test(a.pathname)&&(E=await zt(a,"json"));let v=E?.kind;if(u?.style&&!document.querySelector(`link[data-title="${u.slug}"]`)){let R=Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL(u.style,O).href});R.dataset.title=u.slug,document.head.append(R),await new Promise(A=>{R.onload=R.onerror=A})}i.failed=R=>{m.textContent="A file was not kept: "+R.message,m.className="error"};let[L,T]=s.screen??u?.screen??ri[v]??ri.prodos;lo(l,n,L,T);let I={way:t,slug:e,title:u,scripts:d,game:E,folder:O,data:a,stage:l,status:m,fail:k,disk:i,preview:c,words:h,fixed:w,$:f,setting:y,saves:E?qe(E,i):null,roms:s.roms,studies:s.studies,mini:s.mini??null,chargen:null,pace:()=>{let R=s.pace;return typeof R=="function"?R():R??1},control(R){g.insertAdjacentHTML("afterend",R)}};if(v==="c64"){let{Printer:R,paper:A}=await Promise.resolve().then(()=>(Re(),on)),F=y(ao),P=I.printer=new R({on:F.value});F.on(H=>{P.on=H});let W=f("paper"),J=f("paper-box");P.changed=()=>{J.hidden=!P.lines.length,P.lines.length&&A(W,P,I.chargen)},f("tear").addEventListener("click",()=>P.tear()),f("print-paper").addEventListener("click",()=>window.print())}t==="remake"&&u?.fixed&&y(ai).on(()=>location.reload());let $=await(t==="original"?await oi.original():u.own??await oi[u.engine]()).play(I);if(!$)return;if($.sound){let R=y(oo,{first:!0});$.sound(R.value),R.on(A=>$.sound(A))}let j=R=>{let A=Ke(R,v),F=R.type==="keydown";if(F&&A!==void 0&&!R.repeat&&s.claim?.(A)){R.preventDefault();return}if(F&&$.start?.(),$.key){$.key(R,A);return}!F||A===void 0||R.repeat||!$.press||(R.preventDefault(),$.press(A))};if(addEventListener("keydown",j),addEventListener("keyup",j),l.addEventListener("pointerdown",()=>$.start?.()),Ve(n,l),s.downloadDisk&&$.diskImage){let R=f("disk"),A=a.pathname.split("/").pop().replace(/\.json$/,"");R.hidden=!1,R.addEventListener("click",()=>{let F=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([$.diskImage()],{type:"application/octet-stream"})),download:A+".d64"});F.click(),URL.revokeObjectURL(F.href)})}if(s.watch?.({engine:$.engine,press:R=>{$.start?.(),$.press?.(R)},quick:R=>$.quick?.(R)}),s.route){if(!$.route)throw new Error("a route cannot be played on the "+t);await $.route(s.route)}if($.run(),s.keys?.length){let R=s.keys.map(A=>We(A,v));if($.keys)$.keys(R);else for(let A of R)$.press?.(A)}}catch(w){k(w)}}function lo(s,t,e,n){let i=()=>{let o=window.devicePixelRatio||1,c=parseFloat(getComputedStyle(t).paddingLeft)*2,h=t.clientWidth-c,f=document.documentElement.clientWidth-16,l=parseFloat(getComputedStyle(s).maxHeight),m=Math.ceil(h*o/e-.01);e*m/o>f&&(m=Math.max(1,Math.floor(f*o/e))),l&&n*m/o>l&&(m=Math.max(1,Math.floor(l*o/n)));let g=e*m/o;Object.assign(s.style,{width:g+"px",height:n*m/o+"px",aspectRatio:"auto",marginLeft:(h-g)/2+"px"}),t.style.setProperty("--scale",m/o)};i(),addEventListener("resize",i)}var hi={};z(hi,{check:()=>vt,describe:()=>St,settingsStore:()=>hs});var li={};z(li,{bytesText:()=>fs,openDisk:()=>cs,programDisk:()=>ho,textBytes:()=>ls,titleDisk:()=>fo});async function cs(s,{backend:t}){if(!t)throw new Error("openDisk: a backend is the provider's to give (provider.js)");let e=new Map((await t.load(s)).map(c=>[c.name,c])),n=Promise.resolve(),i=c=>{let h=n.then(c);return n=h.catch(f=>o.failed?.(f)),h.catch(()=>{}),h},o={name:s,kept:t.kept,where:t.where??null,failed:null,list:()=>[...e.values()].sort((c,h)=>h.modified-c.modified).map(({name:c,bytes:h,meta:f,modified:l})=>({name:c,size:h.length,modified:l,meta:f})),read:c=>e.get(c)?.bytes??null,write(c,h,f={}){let l={name:c,bytes:Uint8Array.from(h),meta:f,modified:Date.now()};return e.set(c,l),i(()=>t.put(s,l))},remove(c){return e.delete(c),i(()=>t.delete(s,c))},written:()=>n};return o}var fo=s=>`title/${s}`,ho=s=>`program/${s}`,ls=s=>new TextEncoder().encode(s),fs=s=>s?new TextDecoder().decode(s):null;var fi="settings";function vt(s,t){if(Array.isArray(s))return s.includes(t);if(s==="boolean")return typeof t=="boolean";throw new Error("settings: no such type: "+JSON.stringify(s))}var St=s=>Array.isArray(s)?"one of "+s.map(t=>t===""?"nothing":t).join(", "):"on or off";function hs({disks:s,visit:t=()=>{},fixed:e={},hidden:n=[]}){let i=new Set,o=(l,m)=>{i.has(l)||(i.add(l),console.warn(m))},c=Object.fromEntries(Object.entries(s).map(([l,m])=>{let g=null;try{g=JSON.parse(fs(m.read(fi))??"{}")}catch{}return[l,{disk:m,kept:g&&typeof g=="object"&&!Array.isArray(g)?g:{}}]})),h=new Set,f=l=>{let m=c[l.owner];if(!m)throw new Error(`settings: no store for the owner ${l.owner} (${l.name})`);if(!h.has(l.name)&&(h.add(l.name),!vt(l.type,l.default)))throw new Error(`settings: ${l.name}'s default ${JSON.stringify(l.default)} is not ${St(l.type)}`);return m};return{get(l){let m=f(l);if(l.name in e){if(!vt(l.type,e[l.name]))throw new Error(`settings: ${l.name} fixed at ${JSON.stringify(e[l.name])}, not ${St(l.type)}`);return e[l.name]}let g=t(l);if(g!==void 0){if(vt(l.type,g))return g;o("visit "+l.name,`${l.name}: ${JSON.stringify(g)} for this visit refused: not ${St(l.type)}`)}if(l.name in m.kept){if(vt(l.type,m.kept[l.name]))return m.kept[l.name];o("kept "+l.name,`${l.name}: the kept ${JSON.stringify(m.kept[l.name])} is not ${St(l.type)}; its default used`)}return l.default},set(l,m){let g=f(l);if(!vt(l.type,m))throw new Error(`settings: ${l.name} cannot be ${JSON.stringify(m)}: not ${St(l.type)}`);return g.kept[l.name]=m,g.disk.write(fi,ls(JSON.stringify(g.kept)))},offered:l=>!n.includes(l.name)&&!(l.name in e)}}var wi={};z(wi,{provider:()=>mo,settingsDisk:()=>gi});var mi={};z(mi,{ACCOUNT:()=>ui,DB:()=>pi,KEY:()=>di,STORE:()=>de,VERSION:()=>po,local:()=>ds});var pi="moonbase",po=1,de="files",di=["account","disk","name"],ui="local",uo=()=>new Promise((s,t)=>{let e=indexedDB.open(pi,1);e.onupgradeneeded=()=>e.result.createObjectStore(de,{keyPath:di}),e.onsuccess=()=>s(e.result),e.onerror=()=>t(e.error)}),ps=s=>new Promise((t,e)=>{s.onsuccess=()=>t(s.result),s.onerror=()=>e(s.error)});async function ds({account:s=ui}={}){let t=await uo(),e=n=>t.transaction(de,n).objectStore(de);return{kept:!0,where:"this browser",load:async n=>(await ps(e("readonly").getAll(IDBKeyRange.bound([s,n],[s,n,[]])))).map(({name:i,bytes:o,meta:c,modified:h})=>({name:i,bytes:o,meta:c,modified:h})),put:(n,i)=>ps(e("readwrite").put({account:s,disk:n,...i})),delete:(n,i)=>ps(e("readwrite").delete([s,n,i]))}}var xi={};z(xi,{memory:()=>us});function us({kept:s=!0}={}){let t=new Map,e=n=>t.get(n)??t.set(n,new Map).get(n);return{kept:s,load:async n=>[...e(n).values()].map(i=>({...i,bytes:Uint8Array.from(i.bytes)})),put:async(n,i)=>{e(n).set(i.name,{...i,bytes:Uint8Array.from(i.bytes)})},delete:async(n,i)=>{e(n).delete(i)}}}async function mo({backend:s,visit:t,fixed:e={},hidden:n=[]}={}){if(!s)try{s=await ds()}catch{s=us({kept:!1})}let i=c=>cs(c,{backend:s}),o=hs({disks:{person:await i(gi("person"))},visit:t,fixed:e,hidden:n});return{disk:i,settings:o}}var gi=s=>`settings/${s}`;es();pe();ae();var vi={};z(vi,{modal:()=>ms,modalOpen:()=>go});var Et=[],ki=!1,xo=s=>{let t=Et.at(-1);if(t){if(s.key==="Escape")s.preventDefault(),t.cancel();else if(s.key==="Enter"&&!(s.target instanceof HTMLButtonElement)&&s.target.tagName!=="TEXTAREA"){let e=t.box.querySelector(".default:not(:disabled)");e&&(s.preventDefault(),e.click())}else if(s.key==="Tab"){let e=bi(t.box),n=e.indexOf(document.activeElement);e.length&&(s.preventDefault(),e[(n+(s.shiftKey?e.length-1:1))%e.length].focus())}s.stopPropagation()}},bi=s=>[...s.querySelectorAll('button:not(:disabled), input:not([type=hidden]):not([type=file]):not([hidden]), select:not([hidden]), [tabindex="0"]')],yi=s=>s.querySelector("input:not([type=file]), select:not([hidden])")??s.querySelector(".default")??bi(s)[0];function ms({within:s=document.body,className:t="",content:e,cancel:n=null}){ki||(document.addEventListener("keydown",xo,!0),ki=!0);let i=document.createElement("div");i.className="modal-layer"+(s===document.body?" page":"");let o=document.createElement("div");o.className="modal "+t,o.setAttribute("role","dialog"),o.setAttribute("aria-modal","true"),o.append(e),i.append(o);let c=document.activeElement,h=[...s.children].filter(l=>!l.inert);for(let l of h)l.inert=!0;s.append(i);let f={box:o,cancel:()=>(n??f.close)(),close(){i.remove(),Et.splice(Et.indexOf(f),1);for(let m of h)m.inert=!1;let l=Et.at(-1);(l&&!l.box.contains(c)?yi(l.box):c)?.focus?.({preventScroll:!0})}};return Et.push(f),yi(o)?.focus({preventScroll:!0}),f}var go=()=>Et.length>0;var Ei={};z(Ei,{dialogs:()=>wo});function wo({within:s,className:t=""}={}){function e(c,h,f,{aside:l=[]}={}){return new Promise(m=>{let g=document.createElement("div");g.className="disk";let k=document.createElement("h2");k.textContent=c;let y=document.createElement("p");y.className="buttons";for(let[O,a]of f){let u=Object.assign(document.createElement("button"),{type:"button",textContent:O});u.onclick=async()=>{w.close(),m(typeof a=="function"?await a():a)},y.append(u)}if(y.lastChild?.classList.add("default"),l.length){let O=document.createElement("span");O.className="aside",O.append(...l),y.prepend(O)}g.append(k,...h,y);let w=ms({within:s,className:t,content:g,cancel:()=>{w.close(),m(null)}})})}let n=c=>e(c,[],[["OK",null]]);async function i(c,{suggested:h=""}={}){let f=Object.assign(document.createElement("input"),{value:h,maxLength:31});setTimeout(()=>f.select());let l=document.createElement("label");l.append("Save as ",f);let m=await e("Save",[l,...Si(c)],[["Cancel",null],["Save",()=>f.value.trim()||null]]);return!m||c.read(m)&&!await e(`Replace "${m}"?`,[],[["Cancel",!1],["Replace",!0]])?null:m}async function o(c,{file:{extension:h="",type:f="application/octet-stream"}={}}={}){let l=Object.assign(document.createElement("select"),{size:6}),m=document.createElement("p");m.className="note";let g=Object.assign(document.createElement("input"),{type:"file",accept:[h,f].filter(Boolean).join(","),hidden:!0}),k=v=>Object.assign(document.createElement("button"),{type:"button",textContent:v}),y=k("File\u2026"),w=k("Download"),O=k("Delete"),a=()=>{l.replaceChildren(...c.list().map(v=>new Option(`${v.name} \xB7 ${new Date(v.modified).toLocaleString()}`,v.name))),l.selectedIndex=l.options.length?0:-1,l.hidden=!l.options.length,m.textContent=l.options.length?"On your disk:":"Nothing saved on your disk yet.",O.disabled=w.disabled=!l.options.length};a();let u=e("Open",[m,l,g,...Si(c)],[["Cancel",null],["Open",()=>l.value||null]],{aside:[y,w,O]}),d=()=>l.closest(".modal").querySelector(".default").click();y.onclick=()=>g.click(),g.onchange=async()=>{let v=g.files[0],L=v.name.slice(0,v.name.length-(h&&v.name.endsWith(h)?h.length:0));c.read(L)&&!await e(`Replace "${L}"?`,[],[["Cancel",!1],["Replace",!0]])||(c.write(L,new Uint8Array(await v.arrayBuffer())),a(),l.value=L,d())},w.onclick=()=>{let v=l.value;if(!v)return;let L=Object.assign(document.createElement("a"),{href:URL.createObjectURL(new Blob([c.read(v)],{type:f})),download:v+h});L.click(),setTimeout(()=>URL.revokeObjectURL(L.href),1e3)},O.onclick=async()=>{let v=l.value;v&&await e(`Delete "${v}"?`,[ko("It is gone from your disk for good.")],[["Delete",!0],["Cancel",!1]])&&(await c.remove(v),a(),l.focus())},l.ondblclick=d;let E=await u;return E?{name:E,bytes:c.read(E)}:null}return{saveAs:i,openFrom:o,ask:e,tell:n}}var ko=s=>Object.assign(document.createElement("p"),{className:"note",textContent:s});function Si(s){if(s.kept)return[];let t=document.createElement("p");return t.className="note",t.textContent="This browser is not keeping files: download a game to keep it.",[t]}as();rs();De();Ce();var ji={};z(ji,{compile:()=>$o});Yt();var X=(s,t=2)=>"0x"+s.toString(16).padStart(t,"0"),xs=49152,gs=49407,yo=s=>s>=xs&&s<=gs;function ws(s){if(s.through!==void 0)return{js:`(e.mem[${X(s.through)}] | e.mem[${X(s.through+1)}] << 8) + e.y & 0xffff`,io:!0};if(s.pair!==void 0)return{js:`e.mem[${X(s.pair)} + e.x & 0xff] | e.mem[${X(s.pair)} + e.x + 1 & 0xff] << 8`,io:!0};if(s.via!==void 0)return{js:`(e.mem[${X(s.via,4)}] | e.mem[${X(s.via+1,4)}] << 8)${s.index?" + e."+s.index+" & 0xffff":""}`,io:!0};if(!s.index)return{js:X(s.at,4),io:yo(s.at)};let t=s.at<=gs&&s.at+255>=xs;return{js:s.at+255>65535?`(${X(s.at,4)} + e.${s.index}) & 0xffff`:`${X(s.at,4)} + e.${s.index}`,io:t}}function $t(s,t=!0){let e=Z(s);if(e.number!==void 0)return{js:String(e.number&255)};if(e.reg==="carry")return{js:"e.c"};if(e.reg)return{js:"e."+e.reg};let n=ws(e);return t&&e.through!==void 0?{js:`e.read(e.ix(e.mem[${X(e.through)}] | e.mem[${X(e.through+1)}] << 8, e.y))`,io:!0}:t&&e.via!==void 0&&e.index?{js:`e.read(e.ix(e.mem[${X(e.via,4)}] | e.mem[${X(e.via+1,4)}] << 8, e.${e.index}))`,io:!0}:t&&e.index&&!e.zp?{js:n.io?`e.read(e.ix(${X(e.at,4)}, e.${e.index}))`:`e.mem[e.ix(${X(e.at,4)}, e.${e.index})]`,io:n.io}:{js:n.io?`e.read(${n.js})`:`e.mem[${n.js}]`,io:n.io}}function bo(s,t){let e=Z(s);if(e.reg)return{js:`e.${e.reg} = ${t}`};let n=ws(e);return{js:n.io?`e.write(${n.js}, ${t})`:`e.mem[${n.js}] = ${t}`,io:n.io}}function $i(s){let t=Z(s);if(t.reg)return{pre:"",read:"e."+t.reg,write:n=>`e.${t.reg} = ${n}`};let e=ws(t);return e.io?{pre:`const at = ${e.js}; `,read:"e.read(at)",write:n=>`e.write(at, ${n})`,io:!0}:{pre:"",read:`e.mem[${e.js}]`,write:n=>`e.mem[${e.js}] = ${n}`}}var vo={zero:"e.z",carry:"e.c",negative:"e.n",overflow:"e.v"},So={"==":"e.z","!=":"!e.z",">=":"e.c","<":"!e.c"};function Eo(s,t){let e=s.words,[n,i]=e,o=`s[${t}]`,c=(...f)=>({js:f.map(l=>l.js??l).join(""),kind:f.some(l=>l.io)?"io":"compute"});if(i==="="&&e.length===3){let f=$t(e[2]),l=Z(n);if(l.reg==="carry")return c("e.c = ",f," & 1;");if(l.reg)return c(`e.${l.reg} = e.flags(`,f,");");let m=bo(n,f.js);return{js:m.js+";",kind:f.io||m.io?"io":"compute"}}if(i==="+="||i==="-="){let f=$t(e[2]);if(e.length===3){let l=$i(n);return{js:`${l.pre}${l.write(`e.flags(${l.read} ${i[0]} ${f.js} & 0xff)`)};`,kind:l.io||f.io?"io":"compute"}}return{js:i==="+="?`e.add(${f.js});`:`e.sub(${f.js});`,kind:f.io?"io":"compute"}}if(i==="&="||i==="|="||i==="^="){let f=$t(e[2]);return c(`e.a = e.flags(e.a ${i[0]} `,f,");")}if(i==="<<="||i===">>="||i==="rotate"){let f=$i(n),l=i==="<<="||e[2]==="left";return{js:`${f.pre}${f.write(`e.shift(${f.read}, ${l}, ${i==="rotate"})`)};`,kind:f.io?"io":"compute"}}switch(n){case"if":{let f=e.at(-1),l=e.slice(1,-2);if(l.length===3&&/^[axy]$/.test(l[0])){let k=$t(l[2]);return{js:`e.compare(e.${l[0]}, ${k.js}); if (${So[l[1]]})`,kind:"branch",to:f,io:k.io}}let m=l[0]==="not",g=vo[m?l[1]:l[0]];if(!g)throw new Error(s.where+": no flag "+l.join(" "));return{js:`if (${m?"!":""}${g})`,kind:"branch",to:f}}case"goto":return e[1].startsWith("(")?{js:`return e.jumpThrough(${X(parseInt(e[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:e[1].startsWith("[")?{js:`return e.jumpTable(${X(parseInt(e[1].slice(2),16),4)}, e.${e[2][0]});`,kind:"end"}:{js:`return e.jump('${e[1]}', ${o});`,kind:"end"};case"call":return e[1].startsWith("(")?{js:`return e.callThrough(${X(parseInt(e[1].slice(2,-1),16),4)}, ${o});`,kind:"end"}:{js:`return e.call('${e[1]}', ${o});`,kind:"end"};case"return":return{js:`return e.ret(${o});`,kind:"end"};case"compare":return c(`e.compare(e.${e[1]}, `,$t(e[2]),");");case"test":return c("e.test(",$t(e[1]),");");case"push":return{js:`e.push(${e[1]==="a"});`,kind:"compute"};case"pull":return{js:`e.pull(${e[1]==="a"});`,kind:"compute"};case"asm":return e[1]==="RTI"?{js:`return e.ret(${o});`,kind:"end"}:{js:["TSX","TXS","CLV","SED","CLD","SEI","CLI"].includes(e[1])?`e.asm('${e[1]}');`:"",kind:"compute"}}let h=e.slice(1).map(f=>typeof f=="string"?`'${f}'`:`{ string: ${JSON.stringify(f.string)} }`).join(", ");return{js:`return e.routine('${n}', [${h}], ${o});`,kind:"routine"}}function $o(s,t,{io:e=[49152,49407]}={}){[xs,gs]=e;let{steps:n,labels:i,data:o}=Ct(s,t),c=n.map((m,g)=>Eo(m,g)),h=new Set([0,...Object.values(i)]);c.forEach((m,g)=>{(m.kind==="routine"||m.kind==="io"||m.io)&&h.add(g),(m.kind!=="compute"&&m.kind!=="branch"||m.io)&&h.add(g+1)});let f=Object.fromEntries(Object.entries(i).map(([m,g])=>[g,m])),l=[];for(let m=0;m<n.length;m++){if(!h.has(m))continue;let g=m+1;for(;g<n.length&&!h.has(g);)g++;let k=c.slice(m,g).some(u=>u.kind==="branch"&&i[u.to]===m),y=[];for(let u=m;u<g;u++){if((u===m||c[u-1].kind==="branch")&&c[u].kind!=="routine"){let L=u;for(;L<g-1&&c[L].kind!=="branch";)L++;y.push(`e.time(s, ${u}, ${L});`)}let d=c[u],E=n[u].at===null?n[u].text:n[u].at.toString(16).toUpperCase().padStart(4,"0")+" "+n[u].text,v=d.js;if(d.kind==="branch"){let L=i[d.to],T=Ot(n[u]),I=T===1?"e.cycles++":`e.cycles += ${T}`;v+=L===void 0?` { ${I}; e.pc = e.label('${d.to}'); return; }`:L===m&&k?` { ${I}; continue; }`:` { ${I}; e.pc = ${L}; return; }`}d.kind==="end"&&(v=`e.pc = ${u+1}; `+v),y.push(v?`${v.padEnd(48)} // ${E}`:`// ${E}`)}c[g-1].kind!=="end"&&c[g-1].kind!=="routine"&&g!==m+1&&y.push(`e.pc = ${g};`);let w=f[m]?` // ${f[m]}
23
+ `:"",O=y.length===1&&/^return (.*?);( +\/\/ .*)$/.exec(y[0]);if(O){l.push(`${w} ${`${m}: (e, s) => ${O[1]},`.padEnd(60)}${O[2].trim()?" "+O[2].trim():""}`);continue}let a=k?["for (;;) {",...y.map(u=>" "+u)," break;","}"]:y;l.push(`${w} ${m}: (e, s) => {
24
+ ${a.map(u=>" "+u).join(`
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(i)},`,` 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 un={};U(un,{Engine:()=>ze,label16:()=>Ue});import{cpu as gr}from"@moonbase-machines/mos6502";var{CPU:Go,CYCLES:Kt}=gr;var cn={left:!0},kr=new Set(["if","goto","call","return","compare","test","asm","push","pull"]),ln=n=>kr.has(n.words[0])||/^(=|\+=|-=|&=|\|=|\^=|<<=|>>=|rotate)$/.test(n.words[1]),fn=1020.484;function hn(n){if(n===32)return 3;if(n===0||n===64||n===96)return 1;let e=n>>2&7,t=n&3;return t===1?e===3||e===6||e===7?3:2:e===0?t===2||(n&224)>=160?2:1:e===2||e===6?t===0||t===2?1:2:e===4?2:e===3||e===7?3:2}var wr=new Set([234,169,162,160,165,166,164,173,174,172,24,56]),dn=n=>n.words[0]==="if"&&n.words.length===6,pn=n=>n?.at==null?void 0:n.at+2&65535,Ue=n=>"L"+n.toString(16).toUpperCase().padStart(4,"0"),ze=class{constructor({routines:e,scripts:t,start:s,label:i,memory:o={}}){this.routines=e,this.sources=t,this.mem=new Uint8Array(65536);for(let[c,f]of Object.entries(o))this.mem[c]=f;this.a=0,this.x=0,this.y=0,this.n=0,this.z=0,this.c=0,this.v=0,this.d=0,this.stack=[],this.keys=[],this.listeners=[],this.takers=[],this.ended=!1,this.timed=!!e.timed,this.cycles=0,this.clicks=[],this.delay=0,this.programs={},e.setup?.(this),this.enter(s,i,!0)}on(e){this.listeners.push(e)}emit(e){this.inside&&(e.inside=!0);for(let t of this.listeners)t(e)}inside=0;press(e){this.keys.push(e)}key(){let e=this.keys.shift();if(e!==void 0)for(let t of this.takers)t(e);return e}onKey(e){return this.takers.push(e),()=>{this.takers=this.takers.filter(t=>t!==e)}}enter(e,t,s=!1){let i=this.script(e);if(s)for(let o of i.data)this.mem.set(o.bytes,o.at);this.program=i,this.name=e,this.pc=t===void 0?0:this.label(t)}script(e){if(this.programs[e])return this.programs[e];let t=this.sources[e];if(t===void 0)throw new Error("no script "+e);let s=this.programs[e]=typeof t=="string"?De(t,e):{labels:t.labels,data:t.data.map(([i,o])=>({at:i,bytes:o})),steps:t.steps.map(([i,o,c],f)=>({at:i,text:c,where:e+":"+o,run:t.run[f],words:rt(c),index:f}))};for(let[i,o]of Object.entries(s.labels)){let c=/^L[0-9A-F]{4}$/.test(i)?parseInt(i.slice(1),16):null;c!==null&&s.steps[o]?.at>c&&(s.steps[o].start=c),c!==null&&s.steps[o]?.at===c&&(s.steps[o].entered=!0)}return s}callInside(e,t,s,i){this.stack.push({name:this.name,pc:this.pc,inside:!0,done:s,ret:i}),this.inside++,this.enter(e,t)}leave(e,t){throw this.stack=[],this.problem=null,this.waitingOn=null,this.visited=null,this.enter(e,t),cn}visit(e){this.visiting=e}startVisit(e){let[t,s]=this.title.visit[this.visiting];this.visiting=void 0,this.visited||(this.visited={name:this.name,pc:e,stack:this.stack,problem:this.problem,waitingOn:this.waitingOn,asked:this.asked,askMode:this.askMode,regs:[this.a,this.x,this.y,this.n,this.z,this.c,this.v]},this.title.raster?.keepScreen(),this.inside++,this.emit({step:"keep-screen"}),this.inside--,this.routines.show(this,[],null)),this.stack=[{visit:!0}],this.problem=null,this.waitingOn=null,this.asked=null,this.a=2,this.c=0,this.enter(t,s)}endVisit(){let e=this.visited;this.visited=null,this.title.raster?.putScreen(),this.inside++,this.emit({step:"put-screen"}),this.inside--,this.routines.show(this,[],null),this.enter(e.name),Object.assign(this,{pc:e.pc,stack:e.stack,problem:e.problem,waitingOn:e.waitingOn,asked:e.asked,askMode:e.askMode}),[this.a,this.x,this.y,this.n,this.z,this.c,this.v]=e.regs}label(e){let t=this.program.labels[e];if(t===void 0)throw new Error(this.name+": no label "+e);return t}place(e){if(e.through!==void 0)return(this.mem[e.through]|this.mem[e.through+1]<<8)+this.y&65535;if(e.pair!==void 0){let t=e.pair+this.x&255;return this.mem[t]|this.mem[t+1&255]<<8}return e.via!==void 0?(this.mem[e.via]|this.mem[e.via+1]<<8)+(e.index?this[e.index]:0)&65535:e.at+(e.index?this[e.index]:0)&65535}read(e){return this.io&&this.ioAt(e)?this.io(e)&255:this.mem[e]}write(e,t){this.io&&this.ioAt(e)?this.io(e,t&255):this.mem[e]=t}ioAt(e){return(e&65280)===49152}get(e){return e.number!==void 0?e.number&255:e.reg==="carry"?this.c:e.reg?this[e.reg]:this.read(this.place(e))}load(e){return this.timed&&(e.index&&!e.zp||e.through!==void 0)&&((e.through!==void 0?this.mem[e.through]|this.mem[e.through+1]<<8:e.via!==void 0?this.mem[e.via]|this.mem[e.via+1]<<8:e.at)&255)+this[e.index??"y"]>255&&this.cycles++,this.get(e)}ix(e,t){return this.timed&&(e&255)+t>255&&this.cycles++,e+t&65535}set(e,t){if(t&=255,e.reg){this[e.reg]=t;return}this.write(this.place(e),t)}flags(e){return this.n=e>>7&1,this.z=e===0?1:0,e}compare(e,t){let s=e-t&511;this.c=e>=t?1:0,this.flags(s&255)}time(e,t,s){if(!this.timed)return;let i=e[t].cycles;if(i===void 0){i=0;for(let o=t;o<=s;o++)i+=this.cost(e,o);e[t].cycles=i}this.cycles+=i,this.delay+=i/fn}cost(e,t){let s=e[t],i=this.mem;if(s.at===null)return 0;let o=Kt[i[s.at]]+(dn(s)?2:0),c=!s.entered&&!["return","goto"].includes(e[t-1]?.words[0])?e[t-1]:null;if(s.start!==void 0||c&&c.at!==null){let f=s.start??c.at+hn(i[c.at])+(dn(c)?2:0)+(this.routines.inline?.(this,c)??0);if(f<s.at&&s.at-f<=9){let l=0,p=f;for(;p<s.at&&wr.has(i[p]);p+=hn(i[p]))l+=Kt[i[p]];p===s.at&&(o+=l)}}return o}add(e){if(this.d){let i=(this.a&15)+(e&15)+this.c,o=(this.a>>4)+(e>>4);i>9&&(i-=10,o++),this.z=(this.a+e+this.c&255)===0?1:0,this.n=o&8?1:0,this.v=~(this.a^e)&(this.a^o<<4)&128?1:0,o>9?(o-=10,this.c=1):this.c=0,this.a=(o<<4|i)&255;return}let t=this.a,s=t+e+this.c;this.v=~(t^e)&(t^s)&128?1:0,this.c=s>255?1:0,this.a=this.flags(s&255)}sub(e){if(!this.d)return this.add(e^255);let t=(this.a&15)-(e&15)-(1-this.c),s=(this.a>>4)-(e>>4);t<0&&(t+=10,s--);let i=this.a-e-(1-this.c);this.z=(i&255)===0?1:0,this.n=i&128?1:0,this.v=(this.a^e)&(this.a^i)&128?1:0,this.c=i>=0?1:0,s<0&&(s+=10),this.a=(s<<4|t)&255}shift(e,t,s){let i=t?(e<<1|(s?this.c:0))&255:e>>1|(s&&this.c?128:0);return this.c=t?e>>7:e&1,this.flags(i)}test(e){this.n=e>>7&1,this.v=e>>6&1,this.z=(e&this.a)===0?1:0}jump(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["goto-engine"](this,["$"+e.slice(1)],t);this.pc=this.label(e)}jumpThrough(e,t){let s=Ue(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[s]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+s.slice(1)],t);this.pc=this.label(s)}jumpTable(e,t){this.pc=this.label(Ue(this.mem[e+t]|this.mem[e+t+1]<<8))}call(e,t){if(this.routines.elsewhere?.(this,e))return this.routines["call-engine"](this,["$"+e.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:pn(t)}),this.pc=this.label(e)}callThrough(e,t){let s=Ue(this.mem[e]|this.mem[e+1]<<8);if(this.program.labels[s]===void 0&&this.routines["call-engine"])return this.routines["call-engine"](this,["$"+s.slice(1)],t);this.stack.push({name:this.name,pc:this.pc,ret:pn(t)}),this.pc=this.label(s)}ret(e){let t=this.stack.pop();if(!t)throw new Error("return with nothing called");if(t.visit){this.endVisit();return}let s=this.pulled;if(t.a!==void 0&&this.stack.at(-1)?.a!==void 0){let i=this.stack.pop().a,o=(i<<8|t.a)+1&65535,c=Ue(o);if(s?.ret!==void 0&&o>s.ret&&o-s.ret<=256){this.pulled=null,s.name!==this.name&&this.enter(s.name),this.pc=s.pc,s.inside&&(this.inside--,s.done?.(this));return}if(s?.ret!==void 0&&o<=s.ret&&s.ret-o<=32&&this.script(s.name).labels[c]!==void 0){this.pulled=null,s.name!==this.name&&this.enter(s.name),this.pc=this.label(c),s.inside&&(this.again=this.again?.ret===s.ret?{...this.again,n:this.again.n+1}:{ret:s.ret,done:s.done,n:1});return}if(this.program.labels[c]===void 0&&this.routines["goto-engine"])return this.routines["goto-engine"](this,["$"+c.slice(1)],e);this.pc=this.label(c);return}if(s&&this.stack.length<s.depth&&(this.pulled=null,s.inside&&s.ret!==void 0&&this.inside--),t.name!==this.name&&this.enter(t.name),this.pc=t.pc,t.inside&&(this.inside--,t.done?.(this)),this.again&&t.ret===this.again.ret){let i=this.again;this.again=null,this.inside-=i.n,i.done?.(this)}t.after?.(this)}push(e){this.stack.push(e?{a:this.a}:{flags:[this.n,this.z,this.c,this.v]})}pull(e){let t=this.stack.at(-1);if(t&&t.name!==void 0){let i=t.ret===void 0?0:t.half?t.ret>>8:t.ret&255;t.half?(this.stack.pop(),t.depth=this.stack.length,this.pulled=t,t.inside&&t.ret===void 0&&this.inside--):t.half=!0,e&&(this.a=this.flags(i));return}let s=this.stack.pop();e?this.a=this.flags(s.a):[this.n,this.z,this.c,this.v]=s.flags}sp(){return 255-this.stack.reduce((e,t)=>e+(t.name===void 0||t.half?1:2),0)&255}stackPage(){let e=this.sp();(this.stacks??=new Map).set(e,this.stack.map(s=>({...s})));let t=255;for(let s of this.stack){let i=s.ret??0;s.name===void 0?this.mem[256+t--]=s.a??(s.flags?s.flags[0]<<7|s.flags[3]<<6|48|s.flags[1]<<1|s.flags[2]:0):(this.mem[256+t--]=i>>8,s.half||(this.mem[256+t--]=i&255))}return e}asm(e){if(e==="TSX"&&(this.x=this.flags(this.stackPage())),e==="TXS"){let t=this.stacks?.get(this.x);this.stack=t?t.map(s=>({...s})):[],this.visited=null,this.inside=this.stack.filter(s=>s.inside).length}e==="CLV"&&(this.v=0),e==="SED"&&(this.d=1),e==="CLD"&&(this.d=0),e==="SEI"&&(this.i=1),e==="CLI"&&(this.i=0)}run(e=1e7){this.pacing||(this.idle=0),this.pacing=!1,this.delay??=0;for(let t=0;t<e;t++){if(this.ended)return"end";let s=this.program.steps[this.pc];if(!s)throw new Error(this.name+": ran off the end");if(this.routines.before?.(this,s)==="wait"||this.exec(s)==="wait")return"idle";if(this.polled)return this.polled=!1,"idle";if(this.delay>=16)return this.pacing=!0,"pace"}return"steps"}exec(e){let t=this.pc;this.pc++;try{this.called=!1,!e.run&&ln(e)&&this.time(this.program.steps,t,t);let s=e.run?e.run(this,this.program.steps):this.interpret(e);if(s==="wait"&&(e.run?this.called:!ln(e))&&(this.pc=t,this.visiting!==void 0)){this.startVisit(t);return}return s}catch(s){if(s===cn){this.inside=0;return}if(this.routines.error?.(this,s)){this.ended=!0;return}throw s.message=e.where+" ("+e.text+"): "+s.message,s}}interpret(e){let t=e.words,[s,i]=t;if(i==="="&&t.length===3){let o=te(s),c=this.load(te(t[2]));if(o.reg==="carry"){this.c=c&1;return}this.set(o,c),o.reg&&this.flags(c);return}if(i==="+="||i==="-="){let o=te(s),c=t.length===3?this.get(te(t[2])):this.load(te(t[2]));if(t.length===3){let f=this.get(o)+(i==="+="?c:-c)&255;this.set(o,f),this.flags(f);return}i==="+="?this.add(c):this.sub(c);return}if(i==="&="||i==="|="||i==="^="){let o=this.load(te(t[2]));this.a=this.flags(i==="&="?this.a&o:i==="|="?this.a|o:this.a^o);return}if(i==="<<="||i===">>="||i==="rotate"){let o=te(s);this.set(o,this.shift(this.get(o),i==="<<="||t[2]==="left",i==="rotate"));return}switch(s){case"if":return this.branch(t,e);case"goto":return t[1].startsWith("(")?this.jumpThrough(parseInt(t[1].slice(2,-1),16),e):t[1].startsWith("[")?this.jumpTable(parseInt(t[1].slice(2),16),this[t[2][0]]):this.jump(t[1],e);case"call":return t[1].startsWith("(")?this.callThrough(parseInt(t[1].slice(2,-1),16),e):this.call(t[1],e);case"return":return this.ret(e);case"compare":this.compare(this[t[1]],this.load(te(t[2])));return;case"test":this.test(this.get(te(t[1])));return;case"asm":if(t[1]==="RTI")return this.ret(e);this.asm(t[1]);return;case"push":this.push(t[1]==="a");return;case"pull":this.pull(t[1]==="a");return}return this.routine(s,t.slice(1),e)}routine(e,t,s){let i=this.routines[e];if(!i)throw new Error("no routine "+e);if(this.called=!0,s&&this.timed&&s.at!==null){let o=this.cost(this.program.steps,s.index);this.cycles+=o,this.delay+=o/fn}return i(this,t,s)}branch(e,t){let s=e.at(-1),i=e.slice(1,-2),o;if(i.length===3&&/^[axy]$/.test(i[0]))this.compare(this[i[0]],this.load(te(i[2]))),o={"==":this.z,"!=":!this.z,">=":this.c,"<":!this.c}[i[1]];else{let c=i[0]==="not",f=c?i[1]:i[0],l={zero:this.z,carry:this.c,negative:this.n,overflow:this.v}[f];if(l===void 0)throw new Error("no flag "+f);o=c?!l:!!l}o&&(this.cycles+=Be(t),this.pc=this.label(s))}};var kn={};U(kn,{LAYOUT:()=>be,PANELS:()=>Ke,layout:()=>qe,resolve:()=>Oe,textLayout:()=>Fe,textPage:()=>ve,textPen:()=>We,word:()=>gn});import{font as yr}from"@moonbase-machines/vector";var{GLYPHS:sa,WIDTHS:na,dots:ot,start:mn,useFont:xn,width:re}=yr;var be={65:[116,116,174],50:[116,116,160],49:[130,130,174],34:[130,130,160],17:[158,158,174]},oe=(n,e,t,s,i)=>({layout:n,rows:e,fill:10,paper:10,ink:0,gap:t,y:s,more:i}),le=(n,e,t,s)=>({layout:n,rows:e,fill:5,paper:5,ink:15,gap:t,y:s}),Ke={1:oe(50,[116,159],7,128),2:oe(50,[116,159],33,135),3:oe(34,[130,159],5,135),4:oe(34,[130,159],19,142),5:le(34,[160,189],5,166),6:le(34,[160,189],19,172),7:oe(65,[116,173],5,121),8:oe(65,[116,173],6,128),9:oe(65,[116,173],7,134),10:oe(65,[116,173],47,142),11:oe(50,[116,159],5,121),12:oe(49,[130,173],5,135),13:oe(49,[130,173],7,142),14:oe(49,[130,173],33,149),15:oe(17,[158,173],5,163,[174]),16:le(50,[160,189],19,172),17:le(66,[160,189],19,172),18:le(50,[160,189],5,166),19:le(66,[160,189],5,166),20:le(35,[160,189],0,163),21:le(51,[160,189],0,163),22:le(67,[160,189],0,163),23:le(49,[174,189],5,179),24:le(65,[174,189],5,179)};function gn(n,[e,t,s,i]){let o=e|t<<8,c=i===255?s:n[s|i<<8];for(;c-- >0;)o+=n[o]+1;let f="";for(let l=1;l<=n[o];l++)f+=String.fromCharCode(n[o+l]&127);return f}var Oe=(n,e)=>n.replace(/\{6:([0-9a-f,]+)\}/g,(t,s)=>gn(e,s.split(",").map(i=>parseInt(i,16))));function qe(n,e){let t=e,s=[];t.tall=!1,t.margin=t.x;let i=9,o=!1,c=[],f=t.ink,l=!1,p=u=>{if(c.length){let k=mn(c.map(O=>O.ch),t.spacing,t.x,t.centre),w=[];for(let O of c){let T=re(O.ch);w.push({ch:O.ch,x:k,ink:O.ink}),k+=O.ch.charCodeAt(0)<32?T:T+t.spacing}s.push({top:t.y,tall:t.tall,height:i,paper:t.paper,ink:t.ink,chars:w}),t.x=k}c=[],u&&(t.y+=(t.tall?2*i:i)+t.gap,t.x=t.margin)},x=u=>c.push({ch:o&&u>="0"&&u<="9"?String.fromCharCode(128+u.charCodeAt(0)-48):u,ink:l?f:void 0});for(let u=0;u<n.length;u++){let k=n[u];if(k===`
31
- `){p(!0);continue}if(k==="{"){let w=n.indexOf("}",u),[O,T]=n.slice(u+1,w).split(":"),a=(T??"").split(",").map(h=>parseInt(h,16));switch(u=w,parseInt(O,16)){case 0:t.x=t.margin=a[0];break;case 1:a[0]<192?t.y=a[0]:i=a[0]-192;break;case 2:t.spacing=a[0];break;case 3:t.gap=a[0];break;case 4:t.ink=f=a[0],l=!0;break;case 5:t.paper=a[0];break;case 7:t.centre=!0;break;case 8:t.centre=!1;break;case 9:t.tall=!0;break;case 10:t.tall=!1;break;case 13:f=0,l=!0;break;case 14:f=1,l=!0;break;case 16:o=!0;break;case 17:o=!1;break;case 15:for(let h=0;h<(a[1]||256);h++)x(String.fromCharCode(a[0]&127));break}continue}x(k)}return p(!1),s}function Fe(n,e){let t=[];e.inverse=!1;let s=[],i=c=>{let f=e.centre?40-s.length>>1:e.x;s.forEach((l,p)=>t.push({row:e.y,col:f+p,ch:l.ch,inverse:l.inverse})),s.length&&(e.x=f+s.length),s=[],c&&(e.y++,e.x=e.margin)},o=c=>s.push({ch:e.inverse?c.toUpperCase():c,inverse:e.inverse});for(let c=0;c<n.length;c++){let f=n[c];if(f===`
32
- `){i(!0);continue}if(f==="{"){let l=n.indexOf("}",c),[p,x]=n.slice(c+1,l).split(":"),u=(x??"").split(",").map(k=>parseInt(k,16));switch(c=l,parseInt(p,16)){case 0:i(!1),e.x=e.margin=u[0];break;case 1:i(!1),u[0]<192&&(e.y=u[0]);break;case 7:e.centre=!0;break;case 8:e.centre=!1;break;case 13:e.inverse=!0;break;case 14:e.inverse=!1;break;case 15:for(let k=0;k<(u[1]||256);k++)o(String.fromCharCode(u[0]&127));break}continue}o(f)}return i(!1),t}var We=()=>({x:0,y:0,margin:0,centre:!1,inverse:!1}),ve=()=>Array.from({length:24},()=>Array.from({length:40},()=>({ch:" ",inverse:!1})));var Tn={};U(Tn,{loadTitle:()=>Ht,makeEngine:()=>Yt});var On={};U(On,{codeFiles:()=>Ye,pictureShapes:()=>Sr,vectorRoutines:()=>Wt});var wn={};U(wn,{helpers:()=>qt});function qt(n,e){let t=n.title.map.vars.zero;function*s(f,...l){let p={words:[f]},x=l.map(u=>typeof u=="string"&&f==="text"?{string:u}:typeof u=="number"?String(u):u);for(;;){if(e[f](n,x,p)!=="wait")return{a:n.a,x:n.x,y:n.y,c:n.c};yield"wait"}}let i=(f,l=0,p,x)=>{n.a=l&255,p!==void 0&&(n.x=p&255),x!==void 0&&(n.y=x&255),n.title.paint?.[f]?.(n.title.model,n),n.emit(Q(f,[],n,void 0,u=>n.mem[u+t],u=>n.mem[u]))};function*o(f="wait"){let l={words:[f]};for(;;){let p=n.key();if(p===5&&n.title?.menu&&n.leave(...n.title.menu),n.title?.visit?.[p]){n.visit(p),n.waitingOn=l,yield"wait";continue}if(p!==void 0)return n.waitingOn=null,p;n.waitingOn=l,yield"wait"}}function*c(f){n.inside++;try{return yield*f}finally{n.inside--}}return{e:n,mem:n.mem,call:s,drawn:i,key:o,inside:c}}import{objects as br}from"@moonbase-machines/vector";var{carry:yn,decode:ca,put:bn,tables:at}=br;Ge();var En={};U(En,{Raster:()=>He});import{draw as vr}from"@moonbase-machines/vector";var{crossings:ha,draw:vn,fill:da,inside:pa,line:Sn,outline:ua,screen:Ft,spans:ma,under:xa}=vr;var He=class{constructor(){this.dots=Ft(15),this.kept=null}keepScreen(){this.screenKept={dots:this.dots,kept:this.kept},this.dots=Ft(0)}putScreen(){this.screenKept&&({dots:this.dots,kept:this.kept}=this.screenKept),this.screenKept=null}scroll(){for(let e=19;e<=115;e++){let t=this.dots[e],s=[];for(let i of t)s.push(i>>3&1,i>>2&1,i>>1&1,i&1);for(let i=14;i<518;i++)s[i]=s[i+28];for(let i=0;i<140;i++)t[i]=s[4*i]<<3|s[4*i+1]<<2|s[4*i+2]<<1|s[4*i+3]}}set(e,t,s){e>=0&&e<140&&t>=0&&t<192&&(this.dots[t][e]=s&15)}get(e,t){return e>=0&&e<140&&t>=0&&t<192?this.dots[t][e]:0}span(e,t,s,i){for(let o=t;o<=s;o++)this.set(o,i,e)}rows(e,t,s,i){for(let o=s;o<s+t;o++)this.span(e,0,139,o),i&&(this.set(0,o,15),this.set(139,o,15))}whiteLines(e){this.span(15,0,139,e),this.span(15,0,139,e+1)}box(e,t,s,i){let[o,c,f]=be[e]??be[50];if(t!==128){this.span(0,1,138,1),this.span(0,1,138,o-1);for(let l=2;l<o-1;l++)this.set(1,l,0),this.set(138,l,0),this.span(t,2,137,l)}s!==128&&(this.whiteLines(c),this.rows(s,f-c-2,c+2,!0)),i!==128&&(this.whiteLines(f),this.rows(i,190-f-2,f+2,!0))}panel(e,t,s){this.whiteLines(e),this.rows(s,t-e-1,e+2,!0)}picture(e){vn(e,this.dots)}rectangle(e,t,s,i,o){for(let c=s;c<s+o;c++)this.span(e,t,t+i-1,c)}outline(e,t,s,i,o){this.span(e,t,t+i-1,s),this.span(e,t,t+i-1,s+o-1);for(let c=s;c<s+o;c++)this.set(t,c,e),this.set(t+i-1,c,e)}line(e,t,s,i,o){for(let[c,f]of Sn(t,s,i,o))this.set(c,f,e)}object(e,t,s,i){i==="keep"&&(this.kept={x:t,y:s,rows:e.rows.map((o,c)=>o.map((f,l)=>this.get(t+l,s+c)))}),bn(this.dots,e,t,s,i==="whole")}restore(){let e=this.kept;e&&e.rows.forEach((t,s)=>t.forEach((i,o)=>this.set(e.x+o,e.y+s,i)))}glyph(e,t,s,i,o,c=1,f=9,l=0){let p=re(e);if(e.charCodeAt(0)<32){for(let u=0;u<Math.min(9,f);u++)for(let k=0;k<p;k++)for(let w=0;w<c;w++)this.set(t+k,s+u*c+w,o);return p}let x=new Set(ot(e).map(([u,k])=>u+","+k));for(let u=0;u<Math.min(9,f);u++)for(let k=0;k<p+l;k++)for(let w=0;w<c;w++)this.set(t+k,s+u*c+w,x.has(k+","+u)?i:o);return p}};function Ye(n,e){let t=n?.loads??{};return Object.entries(e).filter(([s])=>/^(PART|PROB)\d$/.test(s)).map(([s,i])=>({name:s,bytes:Uint8Array.from(atob(i.data),o=>o.charCodeAt(0)),origin:t[s]??t[s.slice(0,-1)]??i.aux}))}var ne={escape:27,space:32,return:13,delete:127,left:8,right:21,down:10,up:11,menu:5};function xe(n,e,t){let s=ue[e]||"",i=[],o=0;e==="panel"&&i.push(t[o++]);let c={a:n.a,x:n.x,y:n.y};if(e==="objects"&&t[0]?.startsWith?.("$")){let f=parseInt(t[o++].slice(1),16);c.x=f&255,c.y=f>>8}else for(let f of s){let l=t[o++];l===void 0||l===f||(c[f]=typeof l=="object"?l.string.charCodeAt(0)|128:l.startsWith("$")?n.mem[parseInt(l.slice(1),16)]:+l)}return n.a=c.a&255,n.x=c.x&255,n.y=c.y&255,{fixed:i,rest:t.slice(o)}}function ct(n,e,t,s,i,o){for(n.waitingOn!==e&&(n.emit(Q(t,s,n,i)),n.waitingOn=e,n.asked=null);;){let c=n.key();if(c===void 0)return"wait";if(c===ne.menu&&n.title.menu&&n.leave(...n.title.menu),n.title.visit?.[c])return n.visit(c),"wait";if(o(c)){n.waitingOn=null;return}}}function jn(n,e){if(e){n.inside++;try{for(let t=e.next();!t.done;t=e.next())if(t.value==="wait")throw new Error("a choice drawn inside the ask cannot wait")}finally{n.inside--}}}function $n(n){if(n.objectTables||!n.disk)return n.objectTables;let e=Ye(n.map,Object.values(n.disk.volumes)[0]);return n.objectTables=new Map(at(e,n.map.objects).map(t=>[t.address,t.objects]))}function Cn(n){if(n.pictureShapes||!n.disk)return n.pictureShapes;let e=Object.values(n.disk.volumes)[0],t=new Map;for(let[s,i]of Object.entries(e))if(/^PICS\d$/.test(s))for(let o of Ie(Uint8Array.from(atob(i.data),c=>c.charCodeAt(0))))t.set(o.name,o.shapes);return n.pictureShapes=t}var Sr=(n,e)=>Cn(n)?.get(e.toUpperCase().replace(/_/g," "));function Wt(n){let e=n.map.vars,t=a=>e.zero+a;xn(n.font);let s=a=>{if(a.a<2)return;let h=$n(n)?.get(a.objectTable)?.find(g=>g.number===a.a);h&&(a.c=yn(h,a.x),a.mem[t(2)]=a.y+h.height&255)},i=n.raster??=new He,o=n.pen??={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10};n.text??={showing:!1,pen:We(),page:ve()};let c=(a,h)=>$n(n)?.get(a.objectTable)?.find(g=>g.number===h),f=(a,h)=>{if(a.a<2)return i.restore();let g=c(a,a.a);g&&i.object(g,a.x,a.y,h)},l=a=>{let h=re(a),g=o.x,E=(h<4?4-h:0)+1;i.rectangle(1,g,o.y-2,Math.max(4,h)+4,11),i.outline(13,g,o.y-2,Math.max(4,h)+4,11),i.glyph(a,g+1+E,o.y,15,1,1,8),o.x=g+1+E+h+1+2},p=a=>{let h=n.map.keyPanel;if(!h)return;let g=i.get(2,2),{x:E,y:$}=o;for(let C=h.top;C<h.top+h.rows;C++)i.span(g,h.left,h.right,C);h.caps.forEach(([C,R,M],S)=>{(!a||a===S+1)&&(o.x=C,o.y=R,l(String.fromCharCode(M&127)))}),Object.assign(o,{x:E,y:$})},x=(a,h)=>{for(let g of qe(Oe(h,a.mem),o))for(let E of g.chars)i.glyph(E.ch,E.x,g.top,E.ink??g.ink,g.paper,g.tall?2:1,g.height,o.spacing)},u=(a,h,g,E,$)=>{let C=c(a,h);C&&i.object(C,g,E,$)};n.model={raster:i,pen:o,cap:l,keyPanel:p,print:x,put:u};let k=(a,h)=>(g,E,$)=>{let{fixed:C,rest:R}=xe(g,a,E),M=R.map(S=>typeof S=="object"?S.string:S).join(" ");g.emit(Q(a,C,g,R.length?M:void 0,S=>g.mem[t(S)])),R=R.map(S=>typeof S=="object"?S.string:S),h?.(g,C,R)},w=!n.map.askClearsCarry,O=a=>(h,g,E)=>{h.waitingOn!==E&&xe(h,a,g);let $=h.waitingOn===E?h.askMode:h.a;h.askMode=$;let C=[ne.left,ne.right,ne.down,ne.up];$===128&&h.waitingOn!==E&&p(0);let R=ct(h,E,a,[],void 0,M=>{if(a==="ask-escape"&&M===ne.escape)return h.a=h.flags(27),h.x=155,h.c=1,h.asked=null,!0;if(h.asked===null){let S=-1,A=M;return $===128?(S=C.indexOf(M),A=219+S,S>=0&&p(S+1)):$>=177&&$<186?M>=49&&M<=($&127)&&(S=M-49):(A=M&95,A>=65&&A<=($&95&127)&&(S=A-65,A|=128)),S>=0&&(h.asked={place:S,key:A},a==="ask-mode"&&jn(h,h.askHooks?.chose?.(S))),!1}return M===ne.return?(h.x=h.asked.place,h.y=2*h.x,h.a=h.asked.key,h.c=w&&h.a>=193?1:0,!0):((M===ne.delete||M===ne.left)&&(a==="ask-mode"&&jn(h,h.askHooks?.undo?.(h.asked.place)),$===128&&p(0),h.asked=null),!1)});return R!=="wait"&&(h.mem[e.layout]=34,h.emit(se(a,h))),R},T={show:k("show",a=>{n.text.showing=!1,a.mem[49181]=128}),"text-screen":a=>{Object.assign(n.text,{showing:!0,page:ve()}),a.mem[49181]=0,a.inside++,a.emit({step:"text-screen"}),a.inside--},picture:k("picture",(a,h,[g])=>{let E=Cn(n)?.get(g.toUpperCase().replace(/_/g," "));E&&i.picture(E)}),box:k("box",a=>i.box(a.mem[e.layout],a.a,a.x,a.y)),panel:k("panel",(a,[h])=>{let g=Ke[h];if(g){a.mem[e.layout]=g.layout,i.panel(g.rows[0],g.rows[1],g.fill);for(let E of g.more??[])i.whiteLines(E);Object.assign(o,{paper:g.paper,ink:g.ink,centre:!0,spacing:1,gap:g.gap,y:g.y})}}),text:(a,h)=>{let g=h[0].string.replace(/\{([0-9a-f]+):([^}]*)\}/g,(E,$,C)=>"{"+$+":"+C.split(",").map(R=>R.startsWith("$")?a.mem[parseInt(R.slice(1),16)].toString(16):R).join(",")+"}").replace(/\{\$([0-9A-Fa-f]{4})\}/g,(E,$)=>String.fromCharCode(a.mem[parseInt($,16)]&127));if(a.emit(Q("text",[],a,g)),n.text.showing){for(let E of Fe(Oe(g,a.mem),n.text.pen))n.text.page[E.row]?.[E.col]&&(n.text.page[E.row][E.col]={ch:E.ch,inverse:E.inverse});return}x(a,g)},objects:k("objects",a=>{a.objectTable=a.x|a.y<<8}),object:k("object",a=>{f(a,"whole"),s(a)}),"object-keep":k("object-keep",a=>{f(a,"keep"),s(a)}),"object-mode":k("object-mode",a=>f(a,"clear")),"key-at":k("key-at",a=>{o.x=a.x,o.y=a.y,l(String.fromCharCode(a.a&127))}),key:k("key",a=>l(String.fromCharCode(a.a&127))),"white-lines":k("white-lines",a=>i.whiteLines(a.y)),"fill-rows":k("fill-rows",a=>i.rows(a.a,a.x,a.y,a.c)),span:k("span",a=>i.span(a.a,a.x,a.y,a.mem[t(2)])),dot:k("dot",a=>{i.set(a.x,a.y,a.a),a.a=a.x%7<<4|a.a&15}),line:k("line",a=>i.line(a.mem[t(17)],a.mem[t(0)],a.mem[t(2)],a.mem[t(1)],a.mem[t(3)])),rectangle:k("rectangle",a=>i.rectangle(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)])),"rectangle-outline":k("rectangle-outline",a=>i.outline(a.a,a.x,a.y,a.mem[t(14)]+1,a.mem[t(15)]+1)),flash:k("flash"),"read-dot":(a,h)=>{xe(a,"read-dot",h),a.emit(Q("read-dot",[],a)),a.a=a.flags(i.get(a.x,a.y)),a.emit(se("read-dot",a))},"key-panel":k("key-panel",a=>p(a.a)),"keep-span":k("keep-span"),"put-span":k("put-span"),"invert-span":k("invert-span"),button:k("button"),beep:(a,h)=>{xe(a,"beep",h),Tt("beep",a.a)||a.emit(Q("beep",[],a))},sound:(a,h)=>a.emit(Q("sound",[],a,h.map(g=>g.startsWith("$")?a.mem[parseInt(g.slice(1),16)].toString(16):g).join(" "))),scroll:a=>{i.scroll(),a.inside++,a.emit({step:"scroll"}),a.inside--},"shift-down":(a,h)=>{let[g,E,$,C,R]=h.map(Number);for(let M=C;M>=$;M--)for(let S=g;S<=E;S++)i.set(S,M+R,i.get(S,M));a.inside++,a.emit({step:"shift-down",left:g,right:E,top:$,bottom:C,by:R}),a.inside--},part:k("part"),wait:(a,h,g)=>ct(a,g,"wait",[],void 0,E=>E===ne.space&&(a.a=32,a.c=0,!0)),"wait-erase":(a,h,g)=>ct(a,g,"wait-erase",[],void 0,E=>E===ne.space),"wait-or-escape":(a,h,g)=>{let E=ct(a,g,"wait-or-escape",[],void 0,$=>($===ne.space||$===ne.escape)&&(a.c=$===ne.escape?1:0,a.a=$,!0));return E!=="wait"&&a.emit(se("wait-or-escape",a)),E},ask:O("ask"),"ask-mode":O("ask-mode"),"ask-escape":O("ask-escape"),random:(a,h)=>{let{fixed:g}=xe(a,"random",h);a.emit(Q("random",g,a));let E=a.a,{at:$,used:C}=n.map.seed;a.mem[C]===255&&n.seed!==void 0&&(a.mem[$]=n.seed&255,a.mem[$+1]=n.seed>>8);let R=a.mem[$]|a.mem[$+1]<<8;R=R*259&65535,a.mem[$]=R&255,a.mem[$+1]=R>>8,a.mem[C]=E;let M=E?Math.floor(65535/E):65535;a.a=Math.floor(R/M)&255,a.c=0,a.emit(se("random",a))},multiply:(a,h)=>{xe(a,"multiply",h),a.emit(Q("multiply",[],a));let g=a.a*a.x;a.a=g&255,a.x=g>>8,a.emit(se("multiply",a))},divide:(a,h)=>{xe(a,"divide",h),a.emit(Q("divide",[],a));let g=a.x|a.y<<8,E=a.a||1;a.a=Math.floor(g/E)&255,a.x=g%E,a.emit(se("divide",a))},problem:(a,h,g)=>{if(!a.problem){xe(a,"problem",h),a.emit(Q("problem",[],a)),a.mem[e.practice]=a.c?128:0,a.repeats=a.mem[e.repeats],n.map.countInX&&a.c&&(a.mem[e.repeats]=a.x);let E=n.problems?.[a.a];if(!E)throw new Error("problem "+a.a+" is not written yet");let $=n.disk&&Ye(n.map,Object.values(n.disk.volumes)[0]).find(C=>C.name==="PROB"+a.a);$&&a.mem.set($.bytes,$.origin),a.problem=E(qt(a,T))}if(!a.problem.next().done)return"wait";a.problem=null,a.c=0,a.mem[e.repeats]=a.repeats,a.emit(se("problem",a))},"read-key":(a,h,g)=>{a.waitingOn!==g&&(a.waitingOn=g,a.asked=null);let E=a.key();if(E===void 0)return"wait";if(n.visit?.[E])return a.visit(E),"wait";a.waitingOn=null,E===ne.menu&&n.menu&&a.leave(...n.menu),a.a=a.flags(E&127),a.c=E===ne.escape?1:0,a.emit(se("read-key",a))},splash:(a,h,g)=>{if(a.waitingOn!==g&&(a.inside++,a.emit({step:"splash"}),a.inside--,a.waitingOn=g),a.key()===void 0)return"wait";a.waitingOn=null},"clear-screen":a=>{for(let h of i.dots)h.fill(0);a.inside++,a.emit({step:"clear-screen"}),a.inside--},pause:(a,[h])=>{a.x=0,a.y=0,a.flags(0),a.inside++,a.emit({step:"pause",ms:+h}),a.inside--},quit:a=>{a.ended=!0},unwritten:(a,[h])=>{throw new Error("not written yet: "+(h?.string??h))},"goto-engine":(a,[h])=>{let g=n.entries?.[h];if(!g)throw new Error("no script for "+h);a.enter(...g)},"call-engine":(a,[h])=>{let g=n.entries?.[h];if(!g)throw new Error("no script for "+h);a.stack.push({name:a.name,pc:a.pc}),a.enter(...g)},"load-part":a=>{let h=Object.keys(n.disk?.volumes??{})[0]?.toUpperCase();if(n.files?.out?.has(h)){a.a=a.flags(69),a.c=1;return}a.stack=[],a.enter("part"+a.a,void 0,!0)},"write-settings":a=>{let h=n.files??=new tt(n.disk),g=Object.keys(n.disk.volumes)[0].toUpperCase(),E=h.out?.has(g)?69:h.disks[g]==="protected"?43:0;a.a=a.flags(E),a.c=E?1:0}};return T}dt();var An={vector:Wt,card:Dt};async function Ln(n,e){if(n.protocol==="file:"){let s=globalThis.process.getBuiltinModule("node:fs").readFileSync(n,"utf8");return e==="json"?JSON.parse(s):s}let t=await fetch(n);if(!t.ok)throw new Error(`${n.pathname}: ${t.status}`);return e==="json"?t.json():t.text()}var lt=async n=>(await import(n.href)).default;async function Ht(n,{data:e,scenes:t=!1,fixed:s=!1}={}){n=new URL(n);let i={...await lt(new URL("title.js",n))};for(let f of i.modules??[])i[f]=await lt(new URL(f+".js",n));if(i.view&&(i.viewSteps=await lt(new URL("view.js",n))),!An[i.engine])return i.own=await import(new URL(i.engine+".js",n).href),{title:i,scripts:{},disk:null,folder:n};let o=Object.fromEntries(await Promise.all(i.scripts.map(async f=>[f,t?await Ln(new URL(f+".scene",n),"text"):await lt(new URL(`compiled/${s&&i.fixed?.[f]||f}.js`,n))]))),c=await Ln(new URL(e),"json");return{title:i,scripts:o,disk:c,folder:n}}function Yt(n,e){let t={...n.disk?.kind==="prodos"?ht(n.disk):{},...n.memory},s=new ze({routines:An[n.engine](n),scripts:e,start:n.start,label:n.startLabel,memory:t});return s.title=n,s}var Nn={};U(Nn,{play:()=>Ar});var Pn={};U(Pn,{play:()=>Jt});Ze();Et();import{rom as Er}from"@moonbase-machines/c64";var{STANDS_IN:Pa,install:Na,standIn:Rn}=Er;mt();$t();var Mn={};U(Mn,{View:()=>Ve});import{colors as jr}from"@moonbase-machines/apple2e";var{COLORS:In,NAMES:Ua,rgb:ae}=jr;Ge();wt();import{font as $r}from"@moonbase-machines/charset";var{FONT:Vt}=$r;Xe();var Cr="http://www.w3.org/2000/svg",Y=n=>n*4,_=n=>n*2,ft='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',Or='ui-monospace, Menlo, Consolas, "Liberation Mono", monospace',_t=["[","\\","]","^"],Lr={"[":"\u2190","\\":"\u2192","]":"\u2193","^":"\u2191"},Ve=class{constructor(e,{disk:t,volume:s,engine:i,extra:o={},press:c}){this.svg=e,this.engine=i,this.extra=o,this.press=c,e.setAttribute("viewBox","0 0 560 384"),this.disk=t.volumes[s],this.pictures=new Map;for(let[x,u]of Object.entries(t.volumes[s]))if(/^PICS\d$/.test(x))for(let k of Ie(Uint8Array.from(atob(u.data),w=>w.charCodeAt(0))))this.pictures.set(k.name,k.shapes);let f=i.title.map;this.vars=f.vars;let l={...Lr,...f.modern};for(let x=0;x<10;x++)l[String.fromCharCode(128+x)]=String(x);let p=new RegExp("["+Object.keys(l).map(x=>"\\"+x).join("")+"]","g");this.modern=x=>x.replace(p,u=>l[u]),this.tables=new Map(at(Ye(f,t.volumes[s]),f.objects).map(x=>[x.address,x.objects])),this.items=[],this.pen={x:0,y:0,margin:0,centre:!1,spacing:1,gap:0,ink:15,paper:10},this.window={color:0,bottom:116},this.shapes=[],this.spaceBar=null,this.layer=this.el("g"),e.append(this.layer),this.textScreen=this.el("g",{display:"none"}),e.append(this.textScreen),this.prompt=this.el("g"),e.append(this.prompt),this.textPen=We(),this.textCells=ve(),this.rect(0,0,140,192,15,this.layer)}el(e,t={},s){let i=document.createElementNS(Cr,e);for(let[o,c]of Object.entries(t))i.setAttribute(o,c);return s?.append(i),i}rect(e,t,s,i,o,c=this.layer){return this.el("rect",{x:Y(e),y:_(t),width:Y(s),height:_(i),fill:ae(o),"shape-rendering":"crispEdges"},c)}add(e,t,s,{covers:i=!0,left:o=0,right:c=139}={}){return i&&(this.items=this.items.filter(f=>f.top>=e&&f.bottom<=t&&f.left>=o&&f.right<=c?(f.el.remove(),!1):!0)),this.items.push({top:e,bottom:t,left:o,right:c,el:s}),this.layer.append(s),s}remove(e){e.remove(),this.items=this.items.filter(t=>t.el!==e)}fill(e,t,s,i=!0){let o=this.el("g");this.rect(0,e,140,t-e+1,s,o),i&&(this.rect(0,e,1,t-e+1,15,o),this.rect(139,e,1,t-e+1,15,o)),this.add(e,t,o)}whiteLines(e){this.add(e,e+1,this.rect(0,e,140,2,15,null))}snapshot(e){let t=this.engine.mem;return e.layout=t[this.vars.layout],e.difficulty=t[this.vars.difficulty],e.step==="text"&&(e.words=Oe(e.words,t)),e.step==="span"&&(e.row=t[this.vars.zero+2]),e}apply(e){this.difficulty=e.difficulty,this.spaceBar?.erase&&!this.waiting()&&(this.fill(this.spaceBar.y,this.spaceBar.y+10,5),this.spaceBar.el.remove(),this.spaceBar=null);let t=this.extra[e.step]??(typeof this[e.step]=="function"?this[e.step]:void 0);t&&t.call(this,e)}waiting(){return this.engine.waitingOn}"text-screen"(){this.textCells=ve(),this.textScreen.replaceChildren(),this.rect(0,0,140,192,0,this.textScreen),this.textScreen.setAttribute("display","inline"),this.layer.setAttribute("display","none")}show(){this.textScreen.setAttribute("display","none"),this.layer.setAttribute("display","inline")}textCell(e,t,s,i){this.textCells[e][t].el?.remove();let c=this.el("g",{"data-cell":e*40+t},this.textScreen),f=t*14,l=e*16,p=i?"#000":"#fff";if(i&&this.el("rect",{x:f,y:l,width:14,height:16,fill:"#fff","shape-rendering":"crispEdges"},c),this.oldStyle){let x=Vt[s.charCodeAt(0)-32]??Vt[0],u="";for(let k=0;k<5;k++)for(let w=0;w<7;w++)x[k]>>w&1&&(u+=`M${f+2+k*2} ${l+w*2}h2v2h-2z`);u&&this.el("path",{d:u,fill:p},c)}else if(s!==" "){let x=this.el("text",{x:f+7,y:l+12,fill:p,"font-family":Or,"font-size":15,"text-anchor":"middle"},c);x.textContent=s}this.textCells[e][t]={ch:s,inverse:i,el:c}}splash(){let e=this.disk.TITLE;if(!e)return;let t=Uint8Array.from(atob(e.data),o=>o.charCodeAt(0)),s=xt(t.subarray(0,8192),t.subarray(8192)),i=[];for(let o=0;o<192;o++)i.push(Array.from(s.subarray(o*140,o*140+140)));this.clear(),this.add(0,191,this.el("image",{href:this.image(i),x:0,y:0,width:560,height:384,preserveAspectRatio:"none",style:"image-rendering: pixelated"}))}"clear-screen"(){this.clear(),this.add(0,191,this.rect(0,0,140,192,0,null))}clear(){for(let e of this.items)e.el.remove();this.items=[]}"keep-screen"(){this.kept={items:this.items,pen:{...this.pen},window:{...this.window},shapes:this.shapes,spaceBar:this.spaceBar};for(let e of this.items)e.el.remove();this.items=[],this.spaceBar=null,this["clear-screen"]()}"put-screen"(){if(!this.kept)return;this.clear();let e=this.kept;this.kept=null;for(let t of e.items)this.layer.append(t.el);Object.assign(this,{items:e.items,pen:e.pen,window:e.window,shapes:e.shapes,spaceBar:e.spaceBar})}box({a:e,x:t,y:s,layout:i}){let[o,c,f]=be[i]??be[50];if(e!==128&&t!==128&&s!==128){for(let l of this.items)l.el.remove();this.items=[]}if(e!==128){let l=this.el("g");this.rect(1,1,138,o-1,e,l),this.el("rect",{x:Y(1)+2,y:_(1)+1,width:Y(138)-4,height:_(o-2)-2,fill:"none",stroke:"black","stroke-width":4},l),this.add(1,o-1,l,{left:1,right:138}),this.window={color:e,bottom:o},this.shapes=[]}t!==128&&(this.whiteLines(c),this.fill(c+2,f-1,t)),s!==128&&(this.whiteLines(f),this.fill(f+2,189,s))}panel({n:[e]}){let t=Ke[e];if(t){this.whiteLines(t.rows[0]),this.fill(t.rows[0]+2,t.rows[1],t.fill);for(let s of t.more??[])this.whiteLines(s);Object.assign(this.pen,{paper:t.paper,ink:t.ink,centre:!0,spacing:1,gap:t.gap,y:t.y})}}scroll(){let o=this.scrolling,c=(x,u,k)=>{let w="scroll-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:Y(x),y:_(19)-1,width:Y(u-x),height:_(97)+1},this.el("clipPath",{id:w},this.svg)),this.el("g",{"clip-path":`url(#${w})`},k)},f=(x,u)=>this.items.filter(k=>k!==o?.item&&k.top<=115&&k.bottom>=19&&k.left<=u&&k.right>=x);if(o?.item.el.isConnected&&this.items.at(-1)===o.item){let x=c(129.5,136.5,this.el("g",{transform:`translate(${Y(7*o.n)} 0)`},o.moved));for(let u of f(129.5,129.5+7))x.append(u.el.cloneNode(!0));o.n++,o.moved.setAttribute("transform",`translate(${Y(-7*o.n)} 0)`);return}let l=c(3.5,129.5),p=this.el("g",{transform:`translate(${Y(-7)} 0)`},l);this.rect(3.5,19,1120,97,this.window.color,p);for(let x of f(3.5,139))p.append(x.el.cloneNode(!0));this.add(19,115,l,{left:4,right:129}),this.scrolling={item:this.items.at(-1),moved:p,n:1}}"shift-down"({left:e,right:t,top:s,bottom:i,by:o}){let c=this.shifting,f=(u,k,w)=>{let O="shift-"+(this.clipIds=(this.clipIds??0)+1);return this.el("rect",{x:Y(e),y:_(u),width:Y(t-e+1),height:_(k-u)},this.el("clipPath",{id:O},this.svg)),this.el("g",{"clip-path":`url(#${O})`},w)},l=(u,k)=>this.items.filter(w=>w!==c?.item&&w.top<=k&&w.bottom>=u&&w.left<=t&&w.right>=e);if(c?.item.el.isConnected&&this.items.at(-1)===c.item){let u=f(s,s+o,this.el("g",{transform:`translate(0 ${_(-o*c.n)})`},c.moved));for(let k of l(s,s+o-1))u.append(k.el.cloneNode(!0));c.n++,c.moved.setAttribute("transform",`translate(0 ${_(o*c.n)})`);return}let p=f(s+o,i+o+1),x=this.el("g",{transform:`translate(0 ${_(o)})`},p);this.rect(e,s-o*60,t-e+1,i-s+1+o*61,this.window.color,x);for(let u of l(s,i))x.append(u.el.cloneNode(!0));this.add(s+o,i+o,p,{left:e,right:t}),this.shifting={item:this.items.at(-1),moved:x,n:1}}paint(e,t,s,i){this.hide(t,s,i,i);let o=this.painted;if(o?.el.isConnected&&o.color===e&&o.left===t&&o.right===s&&o.bottom===i-1){o.bottom=i,o.el.setAttribute("height",_(i-o.top+1));let f=this.items.find(l=>l.el===o.el);this.items=this.items.filter(l=>l!==f&&l.top>=o.top&&l.bottom<=i&&l.left>=t&&l.right<=s?(l.el.remove(),!1):!0),f&&(f.bottom=i);return}let c=this.add(i,i,this.rect(t,i,s-t+1,1,e,null),{left:t,right:s});this.painted={el:c,color:e,left:t,right:s,top:i,bottom:i}}span({a:e,x:t,y:s,row:i}){this.paint(e&15,t,s,i)}dot({a:e,x:t,y:s}){this.paint(e&15,t,t,s)}"white-lines"({y:e}){this.whiteLines(e)}"fill-rows"({a:e,x:t,y:s}){this.fill(s,s+t-1,e)}picture({words:e}){let t=this.pictures.get(e.toUpperCase().replace(/_/g," "));if(!t)return;let s="window-"+this.window.bottom;this.clips??=new Set,this.clips.has(s)||(this.clips.add(s),this.el("rect",{x:0,y:0,width:Y(140),height:_(this.window.bottom)},this.el("clipPath",{id:s},this.svg)));let i=this.el("g",{"clip-path":`url(#${s})`}),o=this.el("g",{transform:"scale(4 2)"},i);o.innerHTML=kt(t,{crisp:!1}),this.add(1,this.window.bottom-1,i,{covers:!1,left:1,right:138}),this.shapes=this.shapes.concat(t),this.picturesShapes=t}objects({table:e}){this.table=parseInt(e.slice(1),16)}object({a:e,x:t,y:s},i="whole"){let o=i==="keep",c=i==="whole",f=this.tables.get(this.table);if(e<2){this.kept?.isConnected&&this.remove(this.kept),this.kept=null;return}let l=f?.find(w=>w.number===e);if(!l)return;let p=l.rows.map(w=>w.map(O=>!c&&O===l.clear?void 0:O)),x=t+l.width-1,u=s+l.height-1;c&&this.hide(t,x,s,u);let k=this.el("image",{href:this.image(p),x:Y(t),y:_(s),width:Y(l.width),height:_(l.height),preserveAspectRatio:"none",style:"image-rendering: pixelated"});this.add(s,u,k,{covers:c,left:t,right:x}),o&&(this.kept=k),c&&(this.items.at(-1).whole={x:t,y:s,rows:p})}hide(e,t,s,i){for(let o of[...this.items]){let c=o.whole;if(!c||c.x>t||c.x+c.rows[0].length-1<e||c.y>i||c.y+c.rows.length-1<s)continue;let f=!1,l=c.rows.map((p,x)=>p.map((u,k)=>{let w=c.x+k,O=c.y+x;if(u!==void 0&&w>=e&&w<=t&&O>=s&&O<=i){f=!0;return}return u}));if(f){if(l.every(p=>p.every(x=>x===void 0))){this.remove(o.el);continue}o.el.setAttribute("href",this.image(l)),c.rows=l}}}image(e){let t=document.createElement("canvas");t.width=e[0].length,t.height=e.length;let s=t.getContext("2d"),i=s.createImageData(t.width,t.height);return e.forEach((o,c)=>o.forEach((f,l)=>{if(f===void 0)return;let[p,x,u]=In[f];i.data.set([p,x,u,255],(c*t.width+l)*4)})),s.putImageData(i,0,0),t.toDataURL()}"object-keep"(e){this.object(e,"keep")}"object-mode"(e){this.object(e,"clear")}"key-at"({a:e,x:t,y:s}){this.pen.x=t,this.pen.y=s,this.key({a:e})}key({a:e}){let t=re(e);this.cap(e,this.pen.x,this.pen.y,this.layer,!0,void 0,Math.max(4,t)+4),this.pen.x+=1+(t<4?4-t:0)+1+t+3}cap(e,t,s,i,o,c,f){let l={"\r":"RETURN","\x7F":"DELETE"}[e]??e,p=f??(l.length>1?32:7),x=this.el("g",c!==void 0?{class:"key","data-key":c}:{});if(this.el("rect",{x:Y(t),y:_(s-2),width:Y(p),height:_(11),rx:3,fill:ae(1),stroke:ae(13),"stroke-width":3},x),this.oldStyle){let u=0;for(let k of l)u+=re(k)+1;this.glyphs(x,l,t+Math.max(1,Math.round((p-u+1)/2)),s,15)}else{let u=this.el("text",{x:Y(t+p/2),y:_(s+7),fill:ae(15),"font-family":ft,"font-size":l.length>1?13:16,"font-weight":600,"text-anchor":"middle"},x);u.textContent=this.modern(l)}return o?(this.add(s-2,s+8,x,{covers:!1,left:t,right:t+p}),this.items.at(-1).cap=!0):i.append(x),x}text({words:e}){if(this.textScreen.getAttribute("display")!=="none"){for(let t of Fe(e,this.textPen))this.textCells[t.row]?.[t.col]&&this.textCell(t.row,t.col,t.ch,t.inverse);return}for(let t of qe(e,this.pen)){let{top:s,tall:i}=t,o=i?32:19,c=t.chars.filter(k=>k.ch.charCodeAt(0)>=32);if(c.length){let k=Math.min(...c.map(T=>T.x)),w=Math.max(...c.map(T=>T.x+re(T.ch)))-1,O=Math.min(9,t.height??9)*(i?2:1);this.add(s,s+O-1,this.rect(k,s,w-k+1,O,t.paper,null),{left:k,right:w})}let f=this.el("g",{"font-family":ft,"font-size":o,"font-weight":i?700:500}),l=null,p=139,x=0,u=()=>{if(!l)return;if(p=Math.min(p,l.x),x=Math.max(x,l.x+l.width),this.oldStyle){this.glyphs(f,l.chars,l.x,s,t.ink,i,t.paper),l=null;return}let k=this.el("text",{y:_(s+(i?15:7)),"data-x":Y(l.x),"data-width":Y(l.width)},f);for(let w of l.chars){let O=this.el("tspan",{fill:ae(w.ink??t.ink)},k);O.textContent=this.modern(w.ch)}l=null};for(let k of t.chars){if(k.ch.charCodeAt(0)<=32){u();continue}l??={x:k.x,width:0,chars:[]},l.chars.push(k),l.width=k.x+re(k.ch)-l.x}u(),f.childNodes.length&&(this.add(s,s+(i?16:8),f,{covers:!1,left:p,right:x}),this.fit(f))}}fit(e){for(let t of e.querySelectorAll("text[data-width]")){let s=t.getComputedTextLength();s>0&&t.setAttribute("transform",`translate(${t.dataset.x} 0) scale(${t.dataset.width/s} 1)`)}}glyphs(e,t,s,i,o,c=!1,f){let l=typeof t=="string"?[...t].map(u=>({ch:u})):t,p=c?2:1,x=new Map;for(let u of l){let k=re(u.ch),w=u.ink??o;f!==void 0&&this.rect(s,i,k,9*p,f,e);let O=x.get(w)??"";for(let[T,a]of ot(u.ch))O+=`M${Y(s+T)} ${_(i+a*p)}h4v${2*p}h-4z`;x.set(w,O),s+=k+1}for(let[u,k]of x)k&&this.el("path",{d:k,fill:ae(u)},e);return s}write(e,t,s,i,o=15){if(this.oldStyle)return this.glyphs(e,t,s,i,o);let c=this.el("g",{"font-family":ft,"font-size":19,"font-weight":500,fill:ae(o)},e);for(let f of t.split(" ")){if(f){let l=0;for(let x of f)l+=re(x)+1;let p=this.el("text",{y:_(i+7),"data-x":Y(s),"data-width":Y(l-1)},c);p.textContent=this.modern(f),s+=l}s+=re(" ")+1}return this.fit(c),s}line({x0:e,x1:t,y0:s,y1:i,color:o}){this.add(Math.min(s,i),Math.max(s,i),this.el("line",{x1:Y(e+.5),y1:_(s+.5),x2:Y(t+.5),y2:_(i+.5),stroke:ae(o),"stroke-width":3,"stroke-linecap":"round"}),{covers:!1,left:Math.min(e,t),right:Math.max(e,t)})}rectangle({a:e,x:t,y:s,width:i,height:o}){this.solid(e,t,s,i+1,o)}"rectangle-outline"({a:e,x:t,y:s,width:i,height:o}){let c=i+1,f=o+1;this.add(s,s+f-1,this.el("rect",{x:Y(t)+2,y:_(s)+1,width:Y(c)-4,height:_(f)-2,fill:"none",stroke:ae(e),"stroke-width":3}),{covers:!1,left:t,right:t+c-1})}solid(e,t,s,i,o){this.add(s,s+o-1,this.rect(t,s,i,o,e,null),{left:t,right:t+i-1})}prompts(){this.prompt.replaceChildren();let e=this.engine,t=e.waitingOn;if(!t)return;let s=t.words?.[0]??t.name;if(s==="wait"||s==="wait-erase"||s==="wait-or-escape"){let i=(e.mem[this.vars.layout]&15)===1?178:170,o=this.el("g",{class:"key","data-key":32},this.prompt);if(this.el("rect",{x:Y(46),y:_(i),width:Y(47),height:_(11),rx:4,fill:ae(1),stroke:ae(13),"stroke-width":3},o),this.oldStyle)this.glyphs(o,"SPACE BAR",48,i+2,15);else{let c=this.el("text",{x:Y(69.5),y:_(i+8),fill:ae(15),"font-family":ft,"font-size":15,"font-weight":600,"text-anchor":"middle"},o);c.textContent="SPACE BAR"}this.spaceBar={y:i,erase:s==="wait-erase",el:o}}else if(s==="ask"||s==="ask-mode"||s==="ask-escape"){this.rect(1,162,138,28,5,this.prompt);let i=e.askMode,o=[];if(i===128)_t.forEach((f,l)=>o.push([f,[8,21,10,11][l]]));else if(i>=177&&i<186)for(let f=49;f<=(i&127);f++)o.push([String.fromCharCode(f),f]);else for(let f=65;f<=(i&95);f++)o.push([String.fromCharCode(f),f]);let c=(f,l,p)=>this.write(this.prompt,f,l,p);if(e.asked===null)c("Press",4,166),o.forEach(([f,l],p)=>{p===o.length-1&&i!==128&&o.length>1&&c("or",31+10*p,166),this.cap(f,31+10*p+(p===o.length-1&&i!==128&&o.length>1?10:0),166,this.prompt,!1,l)}),i===128&&[[58,62],[74,62],[66,71],[66,53]].forEach(([f,l],p)=>this.cap(_t[p],f,l,this.prompt,!1,o[p][1]));else{let[f]=o[e.asked.place];this.cap(f,31+10*e.asked.place,166,this.prompt,!1),c("Press",4,179),this.cap("\r",31,179,this.prompt,!1,13),c("or",67,179),this.cap("\x7F",78,179,this.prompt,!1,127),i===128&&this.cap(_t[e.asked.place],[58,74,66,66][e.asked.place],[62,62,71,53][e.asked.place],this.prompt,!1)}}}};async function Jt(n){let{title:e,scripts:t,disk:s,root:i,stage:o,status:c,fail:f,kept:l,words:p,fixed:x}=n;i.classList.add("game"),o.innerHTML=`<svg id="screen" preserveAspectRatio="xMidYMid meet" tabindex="0" aria-label="The game's screen"></svg>`,c.insertAdjacentHTML("afterend",`${Re}<label><input type="checkbox" id="sound"> Sound</label><label><input type="checkbox" id="old-style"> Old style text</label><label hidden><input type="checkbox" id="printer" checked> Printer</label><label hidden title="The game with its bugs fixed: it starts again"><input type="checkbox" id="fixed"> Bugs fixed</label><label hidden>Mini view <select id="mini"><option value="">Off</option><option value="live">Live</option><option value="pictures">Pictures</option></select></label>`),i.append(Ae(p.printer));let u=O=>i.querySelector("#"+O),k=u("screen"),w=u("sound");Te(i,o);try{let O=u("fixed");O&&e.fixed&&(O.checked=x,O.parentElement.hidden=!1,O.addEventListener("change",()=>{let y=new URL(location.href);O.checked?y.searchParams.set("fixed",""):y.searchParams.delete("fixed"),location.href=y.href.replace("fixed=&","fixed&").replace(/fixed=$/,"fixed")}));let T=e.viewSteps??{},a=s.kind==="c64"?n.roms?.chargen??Rn().chargen:null;if(s.kind==="c64"){let y=u("printer"),L=u("paper"),P=u("paper-box");try{y.checked=localStorage.getItem("remake-printer")!=="0"}catch{}y.parentElement.hidden=!1;let N=e.printer=new Me({on:y.checked});y.addEventListener("change",()=>{N.on=y.checked;try{localStorage.setItem("remake-printer",y.checked?"1":"0")}catch{}}),N.changed=()=>{P.hidden=!N.lines.length,N.lines.length&&bt(L,N,a)},u("tear").addEventListener("click",()=>N.tear()),u("print-paper").addEventListener("click",()=>window.print())}e.disk=ut(s,l),s.kind==="c64"&&jt(e.drive=new nt(Uint8Array.from(atob(s.image),y=>y.charCodeAt(0))),l);let h=Yt(e,t);e.files&&pt(s,e.files,l);let g=[],E=u("old-style"),$=[],C={get(){try{return localStorage.getItem("remake-old-style")==="1"}catch{return!1}},set(y){try{localStorage.setItem("remake-old-style",y?"1":"0")}catch{}}};E.checked=C.get()||new URLSearchParams(location.search).has("old-style");let R=null,M=()=>{k.replaceChildren();let y=s.kind==="c64"?new Pe(k,{engine:h,chargen:a}):e.engine==="card"?new Ne(k,{engine:h,inset:n.mini?e.inset:null}):new Ve(k,{disk:s,volume:Object.keys(s.volumes)[0],engine:h,extra:T});return y.oldStyle=E.checked,R?.(y),y},S=M();h.on(y=>g.push(S.snapshot({...y})));let A=u("mini");if(e.inset&&n.mini){A.parentElement.hidden=!1;try{A.value=localStorage.getItem("remake-mini")??""}catch{}let{top:y,bottom:L,view:[P,N]}=e.inset,z=document.createElement("div");z.className="mini",z.hidden=!0,Object.assign(z.style,{left:`${P/5.6}%`,top:`${y/3.84}%`,width:`${(N-P)/5.6}%`,height:`${(L-y+1)/3.84}%`}),k.parentElement.append(z);let V=await n.mini(z,{memory:()=>h.mem});R=W=>{W.insetOn=!!A.value;let ge=W.prompts.bind(W);W.prompts=()=>{ge(),z.hidden=!(A.value&&W.banded)}},R(S);let ee=()=>{S.insetOn=!!A.value,V.mode(A.value),S.prompts()};A.addEventListener("change",()=>{try{localStorage.setItem("remake-mini",A.value)}catch{}ee()}),ee()}E.addEventListener("change",()=>{C.set(E.checked),S=M();for(let y of $)S.apply(y);S.prompts()});let j=h.timed?new we:null;j&&(w.checked=!0);let H=()=>{s.kind!=="c64"&&j?.feed(w.checked?h.clicks:[],h.cycles),h.clicks.length=0},I=e.map?.vars??{sound:0,soundOn:0},K=null,J=(y,L,P)=>{if(!(h.mem[I.sound]&I.soundOn))return;K??=new AudioContext;let N=K.createOscillator(),z=K.createGain(),V=K.currentTime;N.type="square",N.frequency.setValueAtTime(y,V),N.frequency.linearRampToValueAtTime(L,V+P/1e3),z.gain.setValueAtTime(.06,V),z.gain.linearRampToValueAtTime(0,V+P/1e3),N.connect(z).connect(K.destination),N.start(V),N.stop(V+P/1e3)},B=y=>16e3/(y+8);w.addEventListener("change",()=>{j||(h.mem[I.sound]=w.checked?I.soundOn:0)});let q={sound:220,beep:60,"flash-box":60,flash:250,object:30,"object-keep":30},F=()=>n.pace??1,D=!1,X=y=>new Promise(L=>setTimeout(L,y));async function Z(){if(!D){D=!0;try{for(;;){let y=h.run();if(H(),y==="pace"){for(let L of g.splice(0))$.push(L),S.apply(L);S.prompts(),!de&&F()&&await X(h.delay*F()),h.delay=0;continue}for(h.delay=0;g.length;){let L=g.shift();if($.push(L),S.apply(L),!de){if(L.step==="sound"){let[P,N]=L.words.split(" ").map(z=>parseInt(z,16));J(B(N),B(P),180)}L.step==="beep"&&J(B(L.a&31)*2,B(L.a&31)*2,50),F()&&(q[L.step]&&await X(q[L.step]*F()),L.step==="pause"&&await X(L.ms*F()))}}if(S.prompts(),c.textContent=y==="end"?"The end.":"Waiting for a key.",!h.keys.length||y==="end")break}}catch(y){f(y)}D=!1}}let he=s.kind==="c64"?{ArrowLeft:157,ArrowRight:29,ArrowDown:17,ArrowUp:145,Enter:13,Backspace:20,Delete:20,Escape:3," ":32}:{ArrowLeft:8,ArrowRight:21,ArrowDown:10,ArrowUp:11,Enter:13,Backspace:127,Delete:127,Escape:27," ":32},de=!1,r=y=>{h.press(y),K?.resume(),j?.start(),s.kind!=="c64"&&Z()};n.watch?.({engine:h,press:r,quick:y=>{de=y}});let d=()=>h.waitingOn?.words?.[0]==="tick",m=null,v=null;if(setInterval(()=>{if(!d()||D||h.keys.length)return;let y=v??m??-1;v=null,r(y)},100),window.addEventListener("keydown",y=>{if(y.metaKey||y.altKey)return;let L=y.ctrlKey?/^[a-z]$/i.test(y.key)?y.key.toUpperCase().charCodeAt(0)&31:void 0:he[y.key]??(y.key.length===1?(s.kind==="c64"?y.key.toUpperCase():y.key).charCodeAt(0):void 0);if(L===void 0)return;if(y.preventDefault(),d()){v=m=L;return}let P=s.kind==="c64"&&!y.ctrlKey&&Ys(L);if(P){y.repeat||(h.clock.held={...P,key:y.key},K?.resume(),j?.start());return}!y.repeat&&!n.claim?.(L)&&r(L)}),window.addEventListener("keyup",y=>{m=null;let L=h.clock?.held;L?.key===y.key&&(L.seen?h.clock.held=null:L.up=!0)}),k.addEventListener("click",y=>{let L=y.target.closest(".key")?.dataset.key;L&&r(+L)}),k.focus(),s.kind==="c64"){if(n.route){let{route:z,name:V,keys:{expand:ee,give:W,petscii:ge,pollsAt:_e}}=n.route;e.seed=z.seed,z.printer&&e.printer&&(e.printer.on=!0,u("printer").checked=!0),c.textContent="Playing the route "+V+".";let ke={press:pe=>h.press(pe),also:pe=>{let Se=h.mem,Xt=Dn=>{Se[198]<10&&(Se[631+Se[198]]=Dn,Se[198]++)};h.keys.length&&Xt(h.keys.shift()),Xt(pe)}},Le=()=>{let pe;do h.delay=0,pe=h.run();while(pe==="pace");g.length=0};Le();for(let[pe,[Se]]of ee(z.keys).entries())W(ke,Se,ge),h.polls=_e(z,pe+1)??void 0,Le();h.polls=void 0,S.prompts()}h.sid=[],h.clock={irq:0,ahead:[],since:0};let y=null,L=null,P=0,N=!1;c.textContent="Playing.",setInterval(()=>{if(h.delay-=1e3/60,!N&&!h.ended&&h.delay<16){h.delay=Math.max(0,h.delay),h.clock.ahead.length&&h.idle>(h.routines.polls??200)&&!h.keys.length&&++h.clock.since>120&&(h.press(h.clock.ahead.shift()),h.clock.since=0);try{h.run(),g.length=0,S.prompts()}catch(z){N=!0,f(z)}h.ended&&(c.textContent="The end.")}if(j?.node&&w.checked){y??=new St(j.rate),L??=performance.now();let z=Math.floor((performance.now()-L)/1e3*j.rate)-P;if(z>0){let V=y.render(z,h.sid.map(([,ee,W])=>[0,ee,W]));P+=z,j.node.port.postMessage(V,[V.buffer])}}h.sid.length=0},1e3/60)}let b=new URLSearchParams(location.search).get("keys");if(b)for(let y of b.split(",")){let L={space:32,return:13,escape:27,delete:127,left:8,right:21,down:10,up:11,"control-e":5,"control-t":20,none:-1}[y]??y.charCodeAt(0);s.kind==="c64"?h.clock.ahead.push({8:157,21:29,10:17,11:145,127:20,27:3}[L]??L):h.press(L)}s.kind!=="c64"&&Z()}catch(O){f(O)}}async function Ar(n){let{title:e,data:t,root:s,disk:i,preview:o=!1,words:c}=n;s.classList.add("remake"),s.innerHTML='<div class="stage"></div><p class="options"><span id="status">Loading.</span></p>';let f=s.querySelector(".stage"),l=s.querySelector(".options"),p=s.querySelector("#status"),x=u=>{p.textContent="The remake stopped: "+u.message,p.className="error",console.error(u)};try{let u=new URLSearchParams(location.search).has("fixed"),{title:k,scripts:w,disk:O}=await Ht(e,{data:t,fixed:u});if(k.disk=O,k.style&&!document.querySelector(`link[data-title="${k.slug}"]`)){let a=Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL(k.style,e).href});a.dataset.title=k.slug,document.head.append(a),await new Promise(h=>{a.onload=a.onerror=h})}let T={...n,title:k,scripts:w,disk:O,folder:e,data:t,stage:f,options:l,status:p,fail:x,kept:i,preview:o,words:c,fixed:u};await(k.own??{play:Jt}).play(T)}catch(u){x(u)}}export{Gt as audio,js as diskDialogs,Ts as diskDisk,Ls as diskLocal,As as diskMemory,Ss as modal,ws as original,Zt as parts,Is as remakeC64View,nn as remakeCard,Ms as remakeCardView,Us as remakeCards,an as remakeCompile,un as remakeEngine,Ds as remakeEvents,kn as remakeLayout,tn as remakeLift,Tn as remakeLoad,Nn as remakeMain,wn as remakeProblems,En as remakeRaster,Pn as remakeScenes,rn as remakeScript,On as remakeVector,Mn as remakeView};
26
+ },`)}return[`// ${t}, compiled from ${t}.scene by moonbase-compile (@moonbase-machines/player/remake/compile.js): compiled`,"// again from the scene, never edited","export default {",` labels: ${JSON.stringify(i)},`,` data: [${o.map(m=>`
27
+ [${X(m.at,4)}, [${m.bytes.map(g=>X(g)).join(", ")}]],`).join("")}
28
+ ],`,` steps: [${n.map(m=>`
29
+ [${m.at===null?"null":X(m.at,4)}, ${+m.where.split(":").at(-1)}, ${JSON.stringify(m.text)}],`).join("")}
30
+ ],`," run: {",...l," },","};",""].join(`
31
+ `)}xe();yt();Dt();Ne();oe();ke();be();Yt();te();is();export{Mn as audio,Ei as diskDialogs,li as diskDisk,mi as diskLocal,xi as diskMemory,ts as enginesOriginal,he as enginesScenes,Rn as keys,vi as modal,In as parts,ci as play,wi as provider,ii as remakeC64View,vn as remakeCard,ti as remakeCardView,Gs as remakeCards,ji as remakeCompile,As as remakeEngine,Rs as remakeEvents,Ks as remakeLayout,yn as remakeLift,$n as remakeLoad,Is as remakeProblems,Ws as remakeRaster,bs as remakeScript,_s as remakeVector,Qn as remakeView,Tn as saves,hi as settings};
33
32
  //# sourceMappingURL=moonbase-player.js.map