1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-05-17 08:28:42 +03:00
inform7/inform7/Internal/Templates/Parchment/zvm.min.js
2019-03-16 13:12:11 +00:00

13 lines
29 KiB
JavaScript
Executable file

/*
ZVM - the ifvms.js Z-Machine (versions 5 and 8)
===============================================
Built: 2015-09-06
Copyright (c) 2011-2015 The ifvms.js team
BSD licenced
http://github.com/curiousdannii/ifvms.js
*/
var ZVM=function(){"use strict";function e(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]}function t(e){return[255&e>>24,255&e>>16,255&e>>8,255&e]}function r(e,t){return String.fromCharCode(e[t],e[t+1],e[t+2],e[t+3])}function n(e){return[e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2),e.charCodeAt(3)]}function i(e,t){return Function.prototype.bind?e.bind(t):function(){e.apply(t,[].slice.call(arguments))}}function s(e,t){for(var r in t)e[r]=t[r];return e}function a(e){return e<<16>>16}function o(e){return 65535&e}function u(e){for(var t=0,r=e.length,n=[];r>t;)n[t/2]=e[t++]<<8|e[t++];return n}function _(e){return e.replace(/(e\.)?U2S\(([^(]+?)\)/g,"(($2)<<16>>16)").replace(/(e\.)?S2U\(([^(]+?)\)/g,"(($2)&65535)").replace(/([\w.]+)\.getUint8\(([^(]+?)\)/g,"$1[$2]").replace(/([\w.]+)\.getUint16\(([^(]+?)\)/g,"($1[$2]<<8|$1[$2+1])")}function l(e,t){var r,n,i=[];for(r in e)t.indexOf(r)>=0&&(n=/function\s*\(([^(]*)\)\s*\{([\s\S]+)\}/.exec(""+e[r]),i.push(r+":function("+n[1]+"){"+_(n[2])+"}"));s(e,eval("({"+i.join()+"})"))}function c(e,t,r){return r=r||{},t&&(r.func=t),e.subClass(r)}function f(e,t){for(var r,n,i,s,o,u=0;e.ops.length-1>u;){if(e.ops[u].offset===t){if(2===e.ops.length-u&&e.ops[u+1].offset)return s=e.ops.pop(),o=e.ops.pop(),o.cond.invert=!o.cond.invert,s.cond=new E([o.cond,s.cond],"&&"),s.labels=o.labels.concat(s.labels),e.ops.push(s),1;r=new P(e.e,e.ops[u+1].pc),r.ops=e.ops.slice(u+1),n=r.ops.length-1,e.ops.length=u+1,i=e.ops[u],i.result=r,i.cond.invert=!i.cond.invert,s=r.ops[n],140===s.code&&a(s.operands[0].v)+s.next-2===i.pc?(i.keyword="while",r.ops.pop()):r.stopper=s.stopper;return 1}u++}}function h(e){return""+e}var d=function(){var e,t,r=0,n=/\b_super\b/,i=function(){};for(t in{toString:1})e=1;return i.subClass=function(t){var s,a,o,u=this.prototype,_=!/native code/.test(""+t.toString)&&t.toString,l=function(e,t){return function(){var r,n=this._super;return this._super=u[e],r=t.apply(this,arguments),this._super=n,r}};r=1,s=new this,r=0;for(a in t)s[a]="function"==typeof t[a]&&"function"==typeof u[a]&&n.test(t[a])?l(a,t[a]):t[a];return!e&&_&&(s.toString=n.test(_)?l("toString",_):_),o=s.init?function(){r||this.init.apply(this,arguments)}:function(){},o.prototype=s,o.constructor=o,o.subClass=i.subClass,o},i}(),p=d.subClass({init:function g(t){if(this.type="",this.chunks=[],t){if("FORM"!==r(t,0))throw Error("Not an IFF file");this.type=r(t,8);for(var n=12,i=t.length;i>n;){var s=e(t,n+4);if(0>s||s+n>i)throw Error("IFF: Chunk out of range");this.chunks.push({type:r(t,n),offset:n,data:t.slice(n+8,n+8+s)}),n+=8+s,s%2&&n++}}},write:function m(){for(var e=n(this.type),r=0,i=this.chunks.length;i>r;r++){var s=this.chunks[r],a=s.data,o=a.length;e=e.concat(n(s.type),t(o),a),o%2&&e.push(0)}return n("FORM").concat(t(e.length),e)}});p.num_from=e,p.num_to_word=t,p.text_from=r,p.text_to_word=n,[].indexOf||(Array.prototype.indexOf=function(e,t){for(var r=t||0,n=this.length;n>r;r++)if(this[r]===e)return r;return-1});var v=v!==void 0?v:{log:function(){},info:function(){},warn:function(){}},w,y,b=0,k=b?function(e){var t=new ArrayBuffer(e);return e=new DataView(t),e.buffer=t,e}:function(e){return e=e.slice(),ZVM?s(e,{data:e,getUint8:function(t){return e[t]},getUint16:function(t){return e[t]<<8|e[t+1]},getBuffer:function(t,r){return e.slice(t,t+r)},getBuffer16:function(t,r){return u(e.slice(t,t+2*r))},setUint8:function(t,r){return e[t]=255&r},setUint16:function(t,r){return e[t]=255&r>>8,e[t+1]=255&r,65535&r},setBuffer:function(t,r){for(var n=0,i=r.length;i>n;)e[n+t]=r[n++]}}):void 0},x=d.subClass({init:function(e,t){this.e=e,this.v=t},toString:function(){return this.v},U2S:function(){return a(this.v)}}),S=x.subClass({toString:function(){var e=this.v;return this.indirect?"e.indirect("+e+")":0===e?"s.pop()":15>--e?"l["+e+"]":"m.getUint16("+(this.e.globals+2*(e-15))+")"},store:function(e){var t=this.v;return this.indirect?"e.indirect("+t+","+e+")":this.returnval?"e.variable("+t+","+e+")":0===t?"s.push("+e+")":15>--t?"l["+t+"]="+e:"m.setUint16("+(this.e.globals+2*(t-15))+","+e+")"},U2S:function(){return"e.U2S("+this+")"}}),F=d.subClass({init:function(e,t,r,n,i,s){this.e=e,this.context=t,this.code=r,this.pc=n,this.labels=[this.pc+"/"+this.code],this.next=i,this.operands=s,this.post&&this.post()},toString:function(){return this.label()+(this.func?this.func.apply(this,this.operands):"")},args:function(e){return this.operands.join(e)},label:function(){return"/* "+this.labels.join()+" */ "}}),C=F.subClass({stopper:1}),M=C.subClass({storer:1,post:function(){this.storer=this.operands.pop(),this.origfunc=this.func,this.func=this.newfunc},newfunc:function(){return"e.pc="+this.next+";"+this.origfunc.apply(this,arguments)}}),E=d.subClass({init:function(e,t){this.ops=e||[],this.code=t||"||"},toString:function(){for(var e,t=0,r=[];this.ops.length>t;)e=this.ops[t++],r.push(e.func?(e.iftrue?"":"!(")+e.func.apply(e,e.operands)+(e.iftrue?"":")"):e);return(this.invert?"(!(":"(")+r.join(this.code)+(this.invert?"))":")")}}),T=F.subClass({brancher:1,keyword:"if",post:function(){var e,t,r=this.operands.pop(),n=r[1];this.iftrue=r[0],0===n||1===n?e="e.ret("+n+")":(n+=this.next-2,this.context.targets.push(n),e="e.pc="+n),this.result=e+";return",this.offset=n,this.cond=new E([this]),this.context.ops.length&&(t=this.context.ops.pop(),t.offset===n?(this.cond.ops.unshift(t.cond),this.labels=t.labels,this.labels.push(this.pc+"/"+this.code)):this.context.ops.push(t))},toString:function(){var e=this.result;return e instanceof P&&(e+=e.stopper?"; return":"",this.result.ops.length>1&&(e="\n"+e+"\n")),this.label()+this.keyword+this.cond+" {"+e+"}"}}),A=T.subClass({storer:1,post:function(){this._super(),this.storer=this.operands.pop(),this.storer.returnval=1,this.origfunc=this.func,this.func=this.newfunc},newfunc:function(){return this.storer.store(this.origfunc.apply(this,arguments))}}),U=F.subClass({storer:1,post:function(){this.storer=this.operands.pop()},toString:function(){var e=this._super();return this.storer?this.storer.store(e):e}}),R=C.subClass({result:{v:-1},toString:function(){return this.label()+"e.call("+this.operands.shift()+","+this.result.v+","+this.next+",["+this.args()+"])"}}),j=R.subClass({storer:1,post:function(){this.result=this.operands.pop()}}),P=d.subClass({init:function(e,t){this.e=e,this.pc=t,this.pre=[],this.ops=[],this.post=[],this.targets=[]},toString:function(){return this.pre.join("")+this.ops.join(";")+this.post.join("")}}),N=P.subClass({toString:function(){return this.pre.unshift("var l=e.l,m=e.m,s=e.s;\n"),this._super()}}),Z=p.subClass({init:function(e){if(this._super(e),e){if("IFZS"!==this.type)throw Error("Not a Quetzal savefile");for(var t=0,r=this.chunks.length;r>t;t++){var n=this.chunks[t].type,i=this.chunks[t].data;"CMem"===n||"UMem"===n?(this.memory=i,this.compressed="CMem"===n):"Stks"===n?this.stacks=i:"IFhd"===n&&(this.release=i.slice(0,2),this.serial=i.slice(2,8),this.checksum=i.slice(8,10),this.pc=i[10]<<16|i[11]<<8|i[12])}}},write:function(){this.type="IFZS";var e=this.pc,t=this.release.concat(this.serial,this.checksum,255&e>>16,255&e>>8,255&e);return this.chunks=[{type:"IFhd",data:t},{type:this.compressed?"CMem":"UMem",data:this.memory},{type:"Stks",data:this.stacks}],this._super()}}),G=d.subClass({init:function(e,t){this.e=e,this.buffer="",s(this,this.formatters[e.env.formatter]||{}),this.mono=t,this.process_colours(),this.currentwin=0,this.status=[],e.orders.push({code:"stream",name:"status"},{code:"stream",name:"main"},{code:"find",name:"main"})},clear_window:function(){this.e.orders.push({code:"clear",name:"main",bg:this.bg})},erase_line:function(e){1===e&&(this.flush(),this.status.push({code:"eraseline"}))},erase_window:function(e){this.flush(),1>e&&this.clear_window(),-1===e&&this.split_window(0),(-2===e||1===e)&&this.status.push({code:"clear"})},flush:function(){if(""!==this.buffer){var e={code:"stream",text:this.buffer,props:this.format()};(this.currentwin?this.status:this.e.orders).push(e),this.buffer=""}},format:function(){var e,t={},r=[],n=this.fg,i=this.bg;return this.bold&&r.push("zvm-bold"),this.italic&&r.push("zvm-italic"),this.mono&&r.push("zvm-mono"),this.reverse&&(e=n,n=i||this.env.bg,i=e||this.env.fg),n!==void 0&&(isNaN(n)?t.css={color:n}:r.push("zvm-fg-"+n)),i!==void 0&&(isNaN(i)?(t.css||(t.css={}),t.css["background-color"]=i):r.push("zvm-bg-"+i)),r.length&&(t["class"]=r.join(" ")),t},get_cursor:function(e){this.status.push({code:"get_cursor",addr:e}),this.e.act()},process_colours:function(){function e(e){var t,r=Math.round,n=/(\d+),\s*(\d+),\s*(\d+)|#(\w{1,2})(\w{1,2})(\w{1,2})/.exec(e);return n[1]?t=[n[1],n[2],n[3]]:(t=[parseInt(n[4],16),parseInt(n[5],16),parseInt(n[6],16)],4===e.length&&(t=[t[0]<<4|t[0],t[1]<<4|t[1],t[2]<<4|t[2]])),r(t[2]/8.226)<<10|r(t[1]/8.226)<<5|r(t[0]/8.226)}var t=[65534,65535,0,29,832,957,22944,31775,30624,32767,23254,17969,11627],r=this.e.env.fgcolour,n=this.e.env.bgcolour,i=r?e(r):65535,s=n?e(n):65535,a=t.indexOf(i),o=t.indexOf(s);2>a&&(a=r||2),2>o&&(o=n||9),this.env={fg:a,bg:o,fg_true:i,bg_true:s}},set_colour:function(e,t){this.flush(),1===e&&(this.fg=void 0),e>1&&13>e&&(this.fg=e),1===t&&(this.bg=void 0),t>1&&13>t&&(this.bg=t)},set_cursor:function(e,t){this.flush(),this.status.push({code:"cursor",to:[e-1,t-1]})},set_font:function(e){if(1!==e&&4!==e)return 0;var t=4&this.mono?4:1;return e!==t&&(this.flush(),this.mono^=4),t},set_style:function(e){this.flush(),0===e&&(this.reverse=this.bold=this.italic=0,this.mono&=254),1&e&&(this.reverse=1),2&e&&(this.bold=1),4&e&&(this.italic=1),8&e&&(this.mono|=1)},set_true_colour:function(e,t){function r(e){var t=Math.round(8.226*(31&e))<<16|Math.round(8.226*((992&e)>>5))<<8|Math.round(8.226*((31744&e)>>10));for(t=t.toString(16);6>t.length;)t="0"+t;return"#"+t}this.flush(),65535===e?this.fg=void 0:32768>e&&(this.fg=r(e)),65535===t?this.bg=void 0:32768>t&&(this.bg=r(t))},set_window:function(e){this.flush(),this.currentwin=e,this.e.orders.push({code:"find",name:e?"status":"main"}),e&&this.status.push({code:"cursor",to:[0,0]})},split_window:function(e){this.flush(),this.status.push({code:"height",lines:e})},update_header:function(){var e=this.e.m;e.setUint8(44,isNaN(this.env.bg)?1:this.env.bg),e.setUint8(45,isNaN(this.env.fg)?1:this.env.fg),this.e.extension_table(5,this.env.fg_true),this.e.extension_table(6,this.env.bg_true)},formatters:{}}),z=c(T,function(){return 1}),B=U.subClass({storer:0,post:function(){var e=this.operands,t=e[0],r=t instanceof S;e[0]=new S(this.e,r?t:t.v),(r||0===t.v)&&(e[0].indirect=1),this.storer=142===this.code?e.pop():e.shift(),0===e.length&&e.push(new S(this.e,0))},func:h}),q=F.subClass({func:function(e){var t=e.v-1,r=this.code%2?1:-1;return e instanceof S||t>14?"e.incdec("+e+","+r+")":(0>t?"e.s[e.s.length-1]=e.S2U(e.s[e.s.length-1]+":"e.l["+t+"]=e.S2U(e.l["+t+"]+")+r+")"}}),D={1:c(T,function(){return 2===arguments.length?this.args("==="):"e.jeq("+this.args()+")"}),2:c(T,function(e,t){return e.U2S()+"<"+t.U2S()}),3:c(T,function(e,t){return e.U2S()+">"+t.U2S()}),4:c(T,function(e,t){return"e.U2S(e.incdec("+e+",-1))<"+t.U2S()}),5:c(T,function(e,t){return"e.U2S(e.incdec("+e+",1))>"+t.U2S()}),6:c(T,function(){return"e.jin("+this.args()+")"}),7:c(T,function(){return"e.test("+this.args()+")"}),8:c(U,function(){return this.args("|")}),9:c(U,function(){return this.args("&")}),10:c(T,function(){return"e.test_attr("+this.args()+")"}),11:c(F,function(){return"e.set_attr("+this.args()+")"}),12:c(F,function(){return"e.clear_attr("+this.args()+")"}),13:B,14:c(F,function(){return"e.insert_obj("+this.args()+")"}),15:c(U,function(e,t){return"m.getUint16(e.S2U("+e+"+2*"+t.U2S()+"))"}),16:c(U,function(e,t){return"m.getUint8(e.S2U("+e+"+"+t.U2S()+"))"}),17:c(U,function(){return"e.get_prop("+this.args()+")"}),18:c(U,function(){return"e.find_prop("+this.args()+")"}),19:c(U,function(){return"e.find_prop("+this.args(",0,")+")"}),20:c(U,function(){return"e.S2U("+this.args("+")+")"}),21:c(U,function(){return"e.S2U("+this.args("-")+")"}),22:c(U,function(){return"e.S2U("+this.args("*")+")"}),23:c(U,function(e,t){return"e.S2U(parseInt("+e.U2S()+"/"+t.U2S()+"))"}),24:c(U,function(e,t){return"e.S2U("+e.U2S()+"%"+t.U2S()+")"}),25:j,26:R,27:c(F,function(){return"e.ui.set_colour("+this.args()+")"}),28:c(C,function(e,t){return"while(e.call_stack.length>"+t+"){e.call_stack.shift()}return "+e}),128:c(T,function(e){return e+"===0"}),129:c(A,function(e){return"e.get_sibling("+e+")"}),130:c(A,function(e){return"e.get_child("+e+")"}),131:c(U,function(e){return"e.get_parent("+e+")"}),132:c(U,function(e){return"e.get_prop_len("+e+")"}),133:q,134:q,135:c(F,function(e){return"e.print(2,"+e+")"}),136:j,137:c(F,function(e){return"e.remove_obj("+e+")"}),138:c(F,function(e){return"e.print(3,"+e+")"}),139:c(C,function(e){return"return "+e}),140:c(C,function(e){return"e.pc="+e.U2S()+"+"+(this.next-2)}),141:c(F,function(e){return"e.print(2,"+e+"*"+this.e.addr_multipler+")"}),142:B.subClass({storer:1}),143:R,176:c(C,function(){return"return 1"}),177:c(C,function(){return"return 0"}),178:c(F,function(e){return"e.print(2,"+e+")"},{printer:1}),179:c(C,function(e){return"e.print(2,"+e+");e.print(1,13);return 1"},{printer:1}),180:F,183:c(C,function(){return"e.act(183)"}),184:c(C,function(e){return"return "+e},{post:function(){this.operands.push(new S(this.e,0))}}),185:c(U,function(){return"e.call_stack.length"}),186:c(C,function(){return"e.act(186)"}),187:c(F,function(){return"e.print(1,13)"}),189:z,191:z,224:j,225:c(F,function(e,t,r){return"m.setUint16(e.S2U("+e+"+2*"+t.U2S()+"),"+r+")"}),226:c(F,function(e,t,r){return"m.setUint8(e.S2U("+e+"+"+t.U2S()+"),"+r+")"}),227:c(F,function(){return"e.put_prop("+this.args()+")"}),228:c(M,function(){return"e.read("+this.args()+","+this.storer.v+")"}),229:c(F,function(e){return"e.print(4,"+e+")"}),230:c(F,function(e){return"e.print(0,"+e.U2S()+")"}),231:c(U,function(e){return"e.random("+e.U2S()+")"}),232:c(U,h,{post:function(){this.storer=new S(this.e,0)},storer:0}),233:B,234:c(F,function(e){return"e.ui.split_window("+e+")"}),235:c(F,function(e){return"e.ui.set_window("+e+")"}),236:j,237:c(F,function(e){return"e.ui.erase_window("+e.U2S()+")"}),238:c(F,function(e){return"e.ui.erase_line("+e+")"}),239:c(F,function(){return"e.ui.set_cursor("+this.args()+")"}),240:c(M,function(e){return"e.ui.get_cursor("+e+")"}),241:c(F,function(e){return"e.ui.set_style("+e+")"}),242:F,243:c(F,function(){return"e.output_stream("+this.args()+")"}),244:F,245:F,246:c(M,function(){return"e.read_char("+(this.args()||"1")+","+this.storer.v+")"}),247:c(A,function(){return"e.scan_table("+this.args()+")"}),248:c(U,function(e){return"e.S2U(~"+e+")"}),249:R,250:R,251:c(F,function(){return"e.tokenise("+this.args()+")"}),252:c(F,function(){return"e.encode_text("+this.args()+")"}),253:c(F,function(){return"e.copy_table("+this.args()+")"}),254:c(F,function(){return"e.print_table("+this.args()+")"}),255:c(T,function(e){return e+"<=e.call_stack[0][4]"}),1e3:c(M,function(){return"e.save("+(this.next-1)+","+this.storer.v+")"}),1001:c(M,function(){return"e.act(1001,"+this.storer.v+")"}),1002:c(U,function(e,t){return"e.S2U(e.log_shift("+e+","+t.U2S()+"))"}),1003:c(U,function(e,t){return"e.S2U(e.art_shift("+e.U2S()+","+t.U2S()+"))"}),1004:c(U,function(e){return"e.ui.set_font("+e+")"}),1009:c(U,function(){return"e.save_undo("+this.next+","+this.storer.v+")"}),1010:c(F,function(){return"if(e.restore_undo())return"},{storer:1}),1011:c(F,function(e){return"e.print(1,"+e+")"}),1012:c(U,function(){return 3}),1013:c(F,function(){return"e.ui.set_true_colour("+this.args()+")"}),1014:F.subClass({brancher:1}),1030:c(U,function(){return"e.gestalt("+this.args()+")"})},I=d.subClass({art_shift:function(e,t){return t>0?e<<t:e>>-t},call:function(e,t,r,n){if(0===e)return t>=0&&this.variable(t,0),this.pc=r;var i,s,a=this.l.length,o=n.length;for(this.pc=e*this.addr_multipler,s=this.m.getUint8(this.pc++),n=n.slice(0,s),i=n.length;s>i;i++)n.push(0);this.l=n.concat(this.l),this.call_stack.unshift([r,t,s,this.s.length,o,a])},clear_attr:function(e,t){var r=0|this.objects+14*e+t/8;this.m.setUint8(r,this.m.getUint8(r)&~(128>>t%8))},copy_table:function(e,t,r){r=a(r);var n=this.m,i=0,s=0>r;if(r=Math.abs(r),0!==t)if(s)for(;r>i;)n.setUint8(t+i,n.getUint8(e+i++));else n.setBuffer(t,n.getBuffer(e,r));else for(;r>i;)n.setUint8(e+i++,0)},encode_text:function(e,t,r,n){this.m.setBuffer(n,this.encode(this.m.getBuffer(e+r,t)))},extension_table:function(e,t){var r=this.extension;return!r||e>this.extension_count?0:(r+=2*e,void 0===t?this.m.getUint16(r):(this.e.setUint16(r,t),void 0))},find_prop:function(e,t,r){var n,i,s=this.m,a=0,o=s.getUint16(this.objects+14*e+12);for(o+=2*s.getUint8(o)+1;;){if(n=s.getUint8(o),i=63&n,a===r)return i;if(i===t)return o+(128&n?2:1);if(t>i)return 0;a=i,128&n?(i=63&s.getUint8(o+1),o+=i?i+2:66):o+=64&n?3:2}},gestalt:function(e){switch(e){case 1:return 258;case 8192:return 1;case 8193:case 8194:return 2}return 0},get_child:function(e){return this.m.getUint16(this.objects+14*e+10)},get_sibling:function(e){return this.m.getUint16(this.objects+14*e+8)},get_parent:function(e){return this.m.getUint16(this.objects+14*e+6)},get_prop:function(e,t){var r=this.m,n=this.find_prop(e,t);return n?(64&r.getUint8(n-1)?r.getUint16:r.getUint8)(n):r.getUint16(this.properties+2*(t-1))},get_prop_len:function(e){if(0===e)return 0;var t=this.m.getUint8(e-1);return 128&t?(t&=63,0===t?64:t):64&t?2:1},incdec:function(e,t){var r,n;return 0===e?(r=o(this.s.pop()+t),this.s.push(r),r):15>--e?this.l[e]=o(this.l[e]+t):(n=this.globals+2*(e-15),this.m.setUint16(n,this.m.getUint16(n)+t))},indirect:function(e,t){return 0===e?arguments.length>1?this.s[this.s.length-1]=t:this.s[this.s.length-1]:this.variable(e,t)},insert_obj:function(e,t){this.remove_obj(e),this.set_family(e,t,t,e,e,this.get_child(t))},jeq:function(){for(var e=1;arguments.length>e;)if(arguments[e++]===arguments[0])return 1},jin:function(e,t){return this.get_parent(e)===t},log_shift:function(e,t){return t>0?e<<t:e>>>-t},output_stream:function(e,t){if(e=a(e),1===e&&(this.streams[0]=1),-1===e&&(this.streams[0]=0),3===e&&this.streams[2].unshift([t,""]),-3===e){var r=this.streams[2].shift(),n=this.text_to_zscii(r[1]);this.m.setUint16(r[0],n.length),this.m.setBuffer(r[0]+2,n)}},_print:function(e){if(this.streams[2].length)this.streams[2][0][1]+=e;else if(this.streams[0]){var t=2&this.m.getUint8(17);t!==(2&this.ui.mono)&&(253&this.ui.mono||this.ui.flush(),this.ui.mono^=2),this.ui.buffer+=e}},print:function(e,t){if(0===e&&(t=""+t),1===e&&(t=String.fromCharCode(t)),2===e&&(t=this.jit[t]||this.decode(t)),3===e){var r=this.m.getUint16(this.objects+14*t+12);t=this.decode(r+1,2*this.m.getUint8(r))}if(4===e){if(!this.unicode_table[t])return;t=this.unicode_table[t]}this._print(t)},print_table:function(e,t,r,n){r=r||1,n=n||0;for(var i=0;r>i++;)this._print(this.zscii_to_text(this.m.getBuffer(e,t))+(r>i?"\r":"")),e+=t+n},put_prop:function(e,t,r){var n=this.m,i=this.find_prop(e,t);(64&n.getUint8(i-1)?n.setUint16:n.setUint8)(i,r)},random:function(e){var t=this.xorshift_seed;return 1>e?(this.xorshift_seed=e,0):0===t?0|1+Math.random()*e:(t^=65535&t<<4,t^=65535&t>>3,this.xorshift_seed=t^=65535&t<<7,1+t%e)},read:function(e,t,r,n,i){3===arguments.length&&(i=r,r=n=0),this.act("read",{buffer:e,parse:t,len:this.m.getUint8(e),initiallen:this.m.getUint8(e+1),time:r,routine:n,storer:i})},read_char:function(e,t,r,n){2===arguments.length&&(n=t,t=r=0),this.act("char",{time:t,routine:r,storer:n})},remove_obj:function(e){var t,r,n,i=this.get_parent(e);if(0!==i)if(t=this.get_child(i),r=this.get_sibling(e),t===e)this.set_family(e,0,i,r);else{for(;;){if(n=this.get_sibling(t),n===e)break;t=n}this.set_family(e,0,0,0,t,r)}},restart:function(){var e=k(this.data),t=e.getUint8(0),r=5===t?4:8,n=e.getUint16(10),i=e.getUint16(54);if(5!==t&&8!==t)throw Error("Unsupported Z-Machine version: "+t);this.m&&e.setUint8(17,this.m.getUint8(17)),s(this,{m:e,s:[],l:[],call_stack:[],undo:[],orders:[],streams:[1,0,[],0],version:t,pc:e.getUint16(6),properties:n,objects:n+112,globals:e.getUint16(12),staticmem:e.getUint16(14),eof:(e.getUint16(26)||65536)*r,extension:i,extension_count:i?e.getUint16(i):0,addr_multipler:r}),this.ui=new G(this,2&e.getUint8(17)),this.init_text(),this.update_header()},restore:function(e){var t,r,n=new Z(e),i=n.memory,s=n.stacks,a=n.pc,o=this.m.getUint8(17),_=0,l=0,c=[],f=[];if(this.m.setBuffer(0,this.data.slice(0,this.staticmem)),n.compressed)for(;i.length>_;)t=i[_++],0===t?l+=1+i[_++]:this.m.setUint8(l,t^this.data[l++]);else this.m.setBuffer(0,i);for(this.m.setUint8(17,o),_=6,t=s[_++]<<8|s[_++],r=u(s.slice(_,t));s.length>_;){for(c.unshift([s[_++]<<16|s[_++]<<8|s[_++],0,0,r.length,0,f.length]),c[0][1]=16&s[_]?-1:s[_+1],c[0][2]=15&s[_],_+=2,t=s[_++];t;)c[0][4]++,t>>=1;t=2*(s[_++]<<8|s[_++]),f=u(s.slice(_,_+=2*c[0][2])).concat(f),r=r.concat(u(s.slice(_,_+=t)))}this.call_stack=c,this.l=f,this.s=r,this.update_header(),this.variable(this.m.getUint8(a++),2),this.pc=a},restore_undo:function(){if(0===this.undo.length)return 0;var e=this.undo.pop();return this.pc=e[0],e[2][17]=this.m.getUint8(17),this.m.setBuffer(0,e[2]),this.l=e[3],this.s=e[4],this.call_stack=e[5],this.variable(e[1],2),1},ret:function(e){var t=this.call_stack.shift(),r=t[1];this.pc=t[0],this.l=this.l.slice(this.l.length-t[5]),this.s.length=t[3],r>=0&&this.variable(r,0|e)},save:function(e,t){var r,n,i,s,a,o=this.m,u=this.s,_=this.l,l=new Z,c=[],f=0,h=this.call_stack.reverse(),d=[0,0,0,0,0,0];for(l.release=o.getBuffer(2,2),l.serial=o.getBuffer(18,6),l.checksum=o.getBuffer(28,2),l.pc=e,l.compressed=1,r=0;this.staticmem>r;r++)i=o.getUint8(r)^this.data[r],0===i?256===++f&&(c.push(0,255),f=0):(f&&(c.push(0,f-1),f=0),c.push(i));for(l.memory=c,d.push(h[0][3]>>8,255&h[0][3]),n=0;h[0][3]>n;n++)d.push(u[n]>>8,255&u[n]);for(r=0;h.length>r;r++){for(s=h[r],a=(h[r+1]?h[r+1][3]:u.length)-s[3],d.push(s[0]>>16,255&s[0]>>8,255&s[0],s[2]|(0>s[1]?16:0),0>s[1]?0:s[1],(1<<s[4])-1,a>>8,255&a),n=_.length-s[5]-s[2];_.length-s[5]>n;n++)d.push(_[n]>>8,255&_[n]);for(n=s[3];s[3]+a>n;n++)d.push(u[n]>>8,255&u[n])}h.reverse(),l.stacks=d,this.act("save",{data:l.write(),storer:t})},save_undo:function(e,t){return this.undo.push([e,t,this.m.getBuffer(0,this.staticmem),this.l.slice(),this.s.slice(),this.call_stack.slice()]),1},scan_table:function(e,t,r,n){n=n||130;var i=128&n?this.m.getUint16:this.m.getUint8;for(n&=127,r=t+r*n;r>t;){if(i(t)===e)return t;t+=n}return 0},set_attr:function(e,t){var r=0|this.objects+14*e+t/8;this.m.setUint8(r,this.m.getUint8(r)|128>>t%8)},set_family:function(e,t,r,n,i,s){this.m.setUint16(this.objects+14*e+6,t),r&&this.m.setUint16(this.objects+14*r+10,n),i&&this.m.setUint16(this.objects+14*i+8,s)},test:function(e,t){return e&t===t},test_attr:function(e,t){return 128&this.m.getUint8(0|this.objects+14*e+t/8)<<t%8},update_header:function(){var e=this.m;this.xorshift_seed=0,e.setUint8(1,29|(this.env.timed?128:0)),e.setUint8(17,87&e.getUint8(17)),e.setUint8(32,255),e.setUint8(33,this.env.width),e.setUint16(34,this.env.width),e.setUint16(36,255),e.setUint16(38,257),e.setUint16(50,258),this.extension_table(4,0),this.ui.update_header()},variable:function(e,t){var r,n=void 0!==t;if(0===e){if(!n)return this.s.pop();this.s.push(t)}else if(15>--e){if(!n)return this.l[e];this.l[e]=t}else{if(r=this.globals+2*(e-15),!n)return this.m.getUint16(r);this.m.setUint16(r,t)}return t},U2S:a,S2U:o,init_text:function(){function e(e){for(var t=[[],[],[]],n=0;78>n;)t[0|n/26][n%26]=e[n++];t[2][1]=13,r.alphabets=t}function t(e){for(var t={13:"\r"},n={13:13},i=0;e.length>i;)t[155+i]=String.fromCharCode(e[i]),n[e[i]]=155+i++;for(i=32;127>i;)t[i]=String.fromCharCode(i),n[i]=i++;r.unicode_table=t,r.reverse_unicode_table=n}var r=this,n=this.m,i=n.getUint16(52),s=this.extension_table(3),a=s&&n.getUint8(s++);e(i?n.getBuffer(i,78):this.text_to_zscii("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \r0123456789.,!?_#'\"/\\-:()",1)),t(s?n.getBuffer16(s,a):this.text_to_zscii(unescape("%E4%F6%FC%C4%D6%DC%DF%BB%AB%EB%EF%FF%CB%CF%E1%E9%ED%F3%FA%FD%C1%C9%CD%D3%DA%DD%E0%E8%EC%F2%F9%C0%C8%CC%D2%D9%E2%EA%EE%F4%FB%C2%CA%CE%D4%DB%E5%C5%F8%D8%E3%F1%F5%C3%D1%D5%E6%C6%E7%C7%FE%F0%DE%D0%A3%u0153%u0152%A1%BF"),1)),this.dictionaries={},this.dict=n.getUint16(8),this.parse_dict(this.dict)},decode:function(e,t){var r,n,s,a,o=this.m,u=e,_=[],l=0,c=0,f=[],h=[],d=0;if(this.jit[e])return this.jit[e];for(t=t?t+e:this.eof;t>e&&(r=o.getUint16(e),e+=2,_.push(31&r>>10,31&r>>5,31&r),!(32768&r)););for(;_.length>l;){if(n=_[l++],0===n)f.push(32);else if(4>n)s=1,f.push(-1),h.push("\ue000+this.abbr("+(32*(n-1)+_[l++])+")+\ue000");else if(6>n)c=n;else if(2===c&&6===n){if(_.length>l+1)if(a=_[l++]<<5|_[l++],768>a)f.push(a);else{for(a-=767,d+=a,r=l,l=l%3+3;a--;)f.push(-1),h.push(String.fromCharCode(_[l]<<10|_[l+1]<<5|_[l+2])),_[l++]=_[l++]=_[l++]=32;l=r}}else 32>n&&f.push(this.alphabets[c][n-6]);c=4>c?0:c-3,0===l%3&&(l+=d,d=0)}return f=this.zscii_to_text(f,h),s&&(f={toString:i(Function('return"'+f.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\r/g,"\\r").replace(/\uE000/g,'"')+'"'),this)}),u>=this.staticmem&&(this.jit[u]=f),f},encode:function(e){for(var t,r,n=this.alphabets,i=[],s=0,a=[];9>i.length;)t=e[s++],32===t?i.push(0):(r=n[0].indexOf(t))>=0?i.push(r+6):(r=n[1].indexOf(t))>=0?i.push(4,r+6):(r=n[2].indexOf(t))>=0?i.push(5,r+6):(r=this.reverse_unicode_table[t])?i.push(5,6,r>>5,31&r):void 0===t&&i.push(5);for(i.length=9,s=0;9>s;)a.push(i[s++]<<2|i[s]>>3,(7&i[s++])<<5|i[s++]);return a[4]|=128,a},zscii_to_text:function(e,t){for(var r,n=0,i=e.length,s=0,a="";i>n;)r=e[n++],-1===r&&(a+=t[s++]),(r=this.unicode_table[r])&&(a+=r);return a},text_to_zscii:function(e,t){for(var r,n=[],i=0,s=e.length;s>i;)r=e.charCodeAt(i++),t||(r=this.reverse_unicode_table[r]||63),n.push(r);return n},parse_dict:function(e){var t,r,n=this.m,i=e,s={},a=n.getUint8(e++);for(s.separators=n.getBuffer(e,a),e+=a,t=n.getUint8(e++),r=e+2+t*n.getUint16(e),e+=2;r>e;)s[""+n.getBuffer(e,6)]=e,e+=t;return this.dictionaries[i]=s,s},abbr:function(e){var t=this.m;return this.decode(2*t.getUint16(t.getUint16(24)+2*e))},tokenise:function(e,t,r,n){r=r||this.dict,r=this.dictionaries[r]||this.parse_dict(r);for(var i,s,a=this.m,o=2,u=o+a.getUint8(e+1),_=r.separators,l=[],c=[],f=o,h=0;u>o;)i=a.getUint8(e+o++),32===i||_.indexOf(i)>=0?(l.length&&(c.push([l,f]),f+=l.length,l=[]),32!==i&&c.push([[i],f]),f++):l.push(i);for(l.length&&c.push([l,f]),s=Math.min(c.length,a.getUint8(t));s>h;)l=r[""+this.encode(c[h][0])],(!n||l)&&(a.setUint16(t+2+4*h,l||0),a.setUint8(t+4+4*h,c[h][0].length),a.setUint8(t+5+4*h,c[h][1])),h++;a.setUint8(t+1,h)},keyinput:function(e){var t=e.charCode,r=e.keyCode,n=function(){for(var e={8:8,13:13,27:27,37:131,38:129,39:132,40:130},t=96;106>t;)e[t]=49+t++;for(t=112;124>t;)e[t]=21+t++;return e}();return n[r]?n[r]:this.reverse_unicode_table[t]||63},disassemble:function(){function e(e,t){for(var r=0;4>r;r++)t.push((192&e)>>6),e<<=2}for(var t,r,n,i,s,a,o,u=this.m,_=new N(this,this.pc);;){if(r=t=this.pc,i=u.getUint8(t++),190===i?(a=-1,i=u.getUint8(t++)+1e3):128&i?64&i?(a=-1,32&i||(i&=31)):(a=[(48&i)>>4],3>a[0]&&(i&=207)):(a=[64&i?2:1,32&i?2:1],i&=31),!D[i])throw this.stop=1,Error("Unknown opcode #"+i+" at pc="+r);for(s=D[i].prototype,-1===a&&(a=[],e(u.getUint8(t++),a),(236===i||250===i)&&e(u.getUint8(t++),a)),o=[],n=0;a.length>n;)0===a[n]&&(o.push(new x(this,u.getUint16(t))),t+=2),1===a[n]&&o.push(new x(this,u.getUint8(t++))),2===a[n++]&&o.push(new S(this,u.getUint8(t++)));if(s.storer&&o.push(new S(this,u.getUint8(t++))),s.brancher&&(n=u.getUint8(t++),o.push([128&n,64&n?63&n:(n<<8|u.getUint8(t++))<<18>>18])),s.printer)for(o.push(t);this.eof>t&&(n=u.getUint8(t),t+=2,!(128&n)););if(this.pc=t,_.ops.push(new D[i](this,_,i,r,t,o)),n=0,_.targets.indexOf(t)>=0&&(n=f(_,t)),s.stopper&&!n)break}return _},init:function(){this.jit={},this.env={width:80},l(this,["find_prop"])},inputEvent:function(e){var t,r=this.m,n=e.code;if(!e.env||(s(this.env,e.env),n)){if("load"===n)return this.data=e.data,void 0;this.orders=[],"restart"===n&&this.restart(),"save"===n&&this.variable(e.storer,e.result||1),"restore"===n&&(this.m||this.restart(),e.data?this.restore(e.data):this.variable(e.storer,0)),"read"===n&&(this.variable(e.storer,isNaN(e.terminator)?13:e.terminator),t=e.response,this._print(t+"\r"),t=this.text_to_zscii(t.toLowerCase()),t.length>e.len&&(t=t.slice(0,e.len)),r.setUint8(e.buffer+1,t.length),r.setBuffer(e.buffer+2,t),e.parse&&this.tokenise(e.buffer,e.parse)),"char"===n&&this.variable(e.storer,this.keyinput(e.response)),"get_cursor"===n&&(r.setUint16(e.addr,e.pos[0]+1),r.setUint16(e.addr+2,e.pos[1]+1)),this.run()}},run:function(){var e,t,r=new Date,n=0;for(this.stop=0;!this.stop;)if(e=this.pc,this.jit[e]||this.compile(),t=this.jit[e](this),isNaN(t)||this.ret(t),0===++n%5e4&&new Date-r>5e3)return this.act("tick"),void 0},compile:function(){var e=this.disassemble(),t,r;this.jit[e.pc]=Function("e",_(""+e)),e.pc<this.staticmem&&v.warn("Caching a JIT function in dynamic memory: "+e.pc)},act:function(e,t){t=t||{},183===e&&(e="restart"),186===e&&(e="quit"),1001===e&&(e="restore",t={storer:t}),this.ui.flush(),this.ui.status.length&&(this.orders.push({code:"stream",to:"status",data:this.ui.status}),this.ui.status=[]),t.code=e,this.orders.push(t),this.stop=1,this.outputEvent&&this.outputEvent(this.orders)}});return I.ZVMUI=G,"object"==typeof module&&"object"==typeof module.exports&&(module.exports=I),I}();