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