Quixe=function(){function quixe_prepare(image,all_options){game_image=image;var ls=game_image.slice(0,64);var ix,val;for(ix=0;ix=32&&ix<127){if(ix==34||ix==39||ix==92){val="\\"+String.fromCharCode(ix)}else{val=String.fromCharCode(ix)}}else{if(ix==10){val="\\n"}else{val="\\x"+bytestring_table[ix]}}quotechar_table[ix]=val}}function ByteRead4(arr,addr){return(arr[addr]*16777216)+(arr[addr+1]*65536)+(arr[ addr+2]*256)+(arr[addr+3])}function ByteRead2(arr,addr){return(arr[addr]*256)+(arr[addr+1])}function ByteRead1(arr,addr){return arr[addr]}function Mem1(addr){return memmap[addr]}function Mem2(addr){return(memmap[addr]*256)+(memmap[addr+1])}function Mem4(addr){return(memmap[addr]*16777216)+(memmap[addr+1]*65536)+(memmap[addr+2]*256)+(memmap[addr+3])}function MemW1(addr,val){memmap[addr]=val&255}function MemW2(addr,val){memmap[addr]=(val>>8)&255;memmap[addr+1]=val&255}function MemW4(addr,val){memmap[addr]=(val>>24)&255;memmap[addr+1]=(val>>16)&255;memmap[addr+2]=(val>>8)&255;memmap[addr+3]=val&255}function BytePushString(arr,str){for(var ix=0;ix>24)&255);arr.push((val>>16)&255);arr.push((val>>8)&255);arr.push(val&255)}function BytePush2(arr,val){arr.push((val>>8)&255);arr.push(val&255)}function BytePush1(arr,val){arr.push(val&255)}function ByteWrite4(arr,addr,val){arr[addr]=(val>>24)&255;arr[addr+1]=(val>>16)&255;arr[addr +2]=(val>>8)&255;arr[addr+3]=val&255}function ByteReadString(arr,addr,len){return String.fromCharCode.apply(this,arr.slice(addr,addr+len))}function QuoteMem1(addr){if(memmap[addr]>=128){return"0xffffff"+bytestring_table[memmap[addr]]}return"0x"+bytestring_table[memmap[addr]]}function QuoteMem2(addr){if(memmap[addr]>=128){return"0xffff"+bytestring_table[memmap[addr]]+bytestring_table[memmap[addr+1]]}if(memmap[addr]){return"0x"+bytestring_table[memmap[addr]]+bytestring_table[memmap[addr+1]]}return"0x"+bytestring_table[memmap[addr+1]]}function QuoteMem4(addr){if(memmap[addr]){return"0x"+bytestring_table[memmap[addr]]+bytestring_table[memmap[addr+1]]+bytestring_table[memmap[addr+2]]+bytestring_table[memmap[addr+3]]}if(memmap[addr+1]){return"0x"+bytestring_table[memmap[addr+1]]+bytestring_table[memmap[addr+2]]+bytestring_table[memmap[addr+3]]}if(memmap[addr+2]){return"0x"+bytestring_table[memmap[addr+2]]+bytestring_table[memmap[addr+3]]}return"0x"+bytestring_table[memmap[addr+3]]}function ReadArgByte(addr){if(add r==4294967295){return frame.valstack.pop()&255}else{return Mem1(addr)}}function WriteArgByte(addr,val){if(addr==4294967295){frame.valstack.push(val&255)}else{MemW1(addr,val)}}function ReadArgWord(addr){if(addr==4294967295){return frame.valstack.pop()}else{return Mem4(addr)}}function WriteArgWord(addr,val){if(addr==4294967295){frame.valstack.push(val)}else{MemW4(addr,val)}}function ReadStructField(addr,fieldnum){if(addr==4294967295){return frame.valstack.pop()}else{return Mem4(addr+4*fieldnum)}}function WriteStructField(addr,fieldnum,val){if(addr==4294967295){frame.valstack.push(val)}else{MemW4(addr+4*fieldnum,val)}}function SetResumeStore(val){resumevalue=val}function CharToString(val){if(val<65536){return String.fromCharCode(val)}else{val-=65536;return String.fromCharCode(55296+(val>>10),56320+(val&1023))}}function QuoteCharToString(val){if(val<256){return quotechar_table[val]}else{if(val<65536){val=val.toString(16);while(val.length<4){val="0"+val}return("\\u"+val)}else{var val2;val-=65536;val2=55296+(val>> 10);val=56320+(val&1023);return("\\u"+val2.toString(16)+"\\u"+val.toString(16))}}}function QuoteStr1ToString(val){return QuoteCharToString(val.charCodeAt(0))}var regexp_string_unsafe=/[^a-zA-Z0-9 .,;:?!=_+()-]/g;function QuoteEscapeString(val){val=val.replace(regexp_string_unsafe,QuoteStr1ToString);return'"'+val+'"'}function fatal_error(msg){var ix,val;if(arguments.length>1){msg+=" (";for(ix=1;ix=arr.length){qlog("Bad frameptr in serialized stack frame");return undefined}arr=arr.splice(frameptr,arr.length);var framelen=ByteRead4(arr,0);var localspos=ByteRead4(arr,4);if(localspos!=(8+vmfunc.rawformat.length)){qlog("LocalsPos in save file ("+localspos+") doesn't match game image ("+(8+vmfunc.rawformat.length)+")");ret urn undefined}if(framelen!=(localspos+vmfunc.locallen)){qlog("FrameLen in save file ("+framelen+") doesn't match game image ("+(localspos+vmfunc.locallen)+")");return undefined}var frame=new StackFrame(vmfunc);frame.framestart=frameptr;for(var i=0;i>>0;context.code.push("pc = "+newpc+";");context.vmfunc.pathaddrs[newpc]=true}}else{oputil_unload_offstack(context,!unconditional);context.code.push("if (("+operand+")==0 || ("+operand+")==1) {");context.code.push("leave_function( );");context.code.push("pop_callstub("+operand+");");context.code.push("}");context.code.push("else {");context.code.push("pc = ("+context.cp+"+("+operand+")-2) >>>0;");context.code.push("}")}context.code.push("return;")}var opcode_table={0:function(context,operands){},16:function(context,operands){context.code.push(operands[2]+"(("+operands[0]+")+("+operands[1]+")) >>>0);")},17:function(context,operands){context.code.push(operands[2]+"(("+operands[0]+")-("+operands[1]+")) >>>0);")},18:function(context,operands){var sign0=oputil_signify_operand(context,operands[0]);var sign1=oputil_signify_operand(context,operands[1]);context.code.push(operands[2]+"(("+sign0+")*("+sign1+")) >>>0);")},19:function(context,operands){var sign0=oputil_signify_operand(context,operands[0]);var sign1=oputil_signify_operand(context,operands[1]);var holdvar=alloc_holdvar(context);context.code.push(holdvar+"=(("+sign0+")/("+sign1+"));");context.code.push("if (!isFinite("+holdvar+")) fatal_error('Division by zero.');");context.code.push (operands[2]+"("+holdvar+">=0)?Math.floor("+holdvar+"):(-Math.floor(-"+holdvar+") >>>0));")},20:function(context,operands){var sign0=oputil_signify_operand(context,operands[0]);var sign1=oputil_signify_operand(context,operands[1]);var holdvar=alloc_holdvar(context);context.code.push(holdvar+"=(("+sign0+")%("+sign1+"));");context.code.push("if (!isFinite("+holdvar+")) fatal_error('Modulo division by zero.');");context.code.push(operands[2]+holdvar+" >>>0);")},21:function(context,operands){context.code.push(operands[1]+"(-("+operands[0]+")) >>>0);")},24:function(context,operands){context.code.push(operands[2]+"(("+operands[0]+")&("+operands[1]+")) >>>0);")},25:function(context,operands){context.code.push(operands[2]+"(("+operands[0]+")|("+operands[1]+")) >>>0);")},26:function(context,operands){context.code.push(operands[2]+"(("+operands[0]+")^("+operands[1]+")) >>>0);")},27:function(context,operands){context.code.push(operands[1]+"(~("+operands[0]+")) >>>0);")},28:function(context,operands){if(quot_isconstant( operands[1])){var val=Number(operands[1]);if(val<32){context.code.push(operands[2]+"(("+operands[0]+")<<"+val+") >>>0);")}else{context.code.push(operands[2]+"0);")}}else{context.code.push(operands[2]+"("+operands[1]+"<32) ? (("+operands[0]+"<<"+operands[1]+") >>>0) : 0);")}},29:function(context,operands){if(quot_isconstant(operands[1])){var val=Number(operands[1]);if(val<32){context.code.push(operands[2]+"(("+operands[0]+")>>"+val+") >>>0);")}else{context.code.push(operands[2]+"(("+operands[0]+")&0x80000000) ? 0xffffffff : 0);")}}else{context.code.push("if ("+operands[0]+" & 0x80000000) {");context.code.push(operands[2]+"("+operands[1]+"<32) ? (("+operands[0]+">>"+operands[1]+") >>>0) : 0xffffffff);");context.code.push("} else {");context.code.push(operands[2]+"("+operands[1]+"<32) ? (("+operands[0]+">>"+operands[1]+") >>>0) : 0);");context.code.push("}")}},30:function(context,operands){if(quot_isconstant(operands[1])){var val=Number(operands[1]);if(val<32){context.code.push(operands[2]+"("+operands[0]+")>>> "+val+");")}else{context.code.push(operands[2]+"0);")}}else{context.code.push(operands[2]+"("+operands[1]+"<32) ? ("+operands[0]+">>>"+operands[1]+") : 0);")}},32:function(context,operands){oputil_perform_jump(context,operands[0],true);context.path_ends=true},260:function(context,operands){if(quot_isconstant(operands[0])){var newpc=Number(operands[0]);context.code.push("pc = "+newpc+";");context.vmfunc.pathaddrs[newpc]=true}else{context.code.push("pc = "+operands[0]+";")}oputil_unload_offstack(context);context.code.push("return;");context.path_ends=true},34:function(context,operands){context.code.push("if (("+operands[0]+")==0) {");oputil_perform_jump(context,operands[1]);context.code.push("}")},35:function(context,operands){context.code.push("if (("+operands[0]+")!=0) {");oputil_perform_jump(context,operands[1]);context.code.push("}")},36:function(context,operands){context.code.push("if (("+operands[0]+")==("+operands[1]+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},37:function(co ntext,operands){context.code.push("if (("+operands[0]+")!=("+operands[1]+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},38:function(context,operands){var sign0=oputil_signify_operand(context,operands[0]);var sign1=oputil_signify_operand(context,operands[1]);context.code.push("if (("+sign0+")<("+sign1+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},39:function(context,operands){var sign0=oputil_signify_operand(context,operands[0]);var sign1=oputil_signify_operand(context,operands[1]);context.code.push("if (("+sign0+")>=("+sign1+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},40:function(context,operands){var sign0=oputil_signify_operand(context,operands[0]);var sign1=oputil_signify_operand(context,operands[1]);context.code.push("if (("+sign0+")>("+sign1+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},41:function(context,operands){var sign0=oputil_signify_operand(context,operands[0]);var sign1=oputil_signify_op erand(context,operands[1]);context.code.push("if (("+sign0+")<=("+sign1+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},42:function(context,operands){context.code.push("if (("+operands[0]+")<("+operands[1]+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},43:function(context,operands){context.code.push("if (("+operands[0]+")>=("+operands[1]+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},44:function(context,operands){context.code.push("if (("+operands[0]+")>("+operands[1]+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},45:function(context,operands){context.code.push("if (("+operands[0]+")<=("+operands[1]+")) {");oputil_perform_jump(context,operands[2]);context.code.push("}")},48:function(context,operands){if(quot_isconstant(operands[1])){var ix;var argc=Number(operands[1]);for(ix=0;ix>>0):(val&65535);context.code.push(operands[1]+val+");")}else{context.code.push(operands[1]+"("+operands[0]+" & 0x8000) ? (("+operands[0]+" | 0xffff0000) >>> 0) : ("+operands[0]+" & 0xffff));")}},69:function(context,operands){var val;if(quot_isconstant(operands[0])){val=Number(operands[0]);val=(val&128)?((val|4294967040)>>>0):(val&255);context.code.push(operands[1]+val+");")}else{context.code.push(operands[1]+"("+operands[0]+" & 0x80) ? (("+operands[0]+" | 0xffffff00) >>> 0) : ("+operands[0]+" & 0xff));")}},72:function(context,operands){var val,addr;if(quot_isconstant(operands[1])){if(quot_isconstant(operands[0])){addr=Number(operands[0])+Number(operands[1])*4;val="Mem4("+(addr>>>0)+")"}else{var addr=Number(operands[1 ])*4;if(addr){val="Mem4(("+operands[0]+"+"+addr+") >>>0)"}else{val="Mem4("+operands[0]+")"}}}else{val="Mem4(("+operands[0]+"+4*"+operands[1]+") >>>0)"}context.code.push(operands[2]+val+");")},73:function(context,operands){var val,addr;if(quot_isconstant(operands[1])){if(quot_isconstant(operands[0])){addr=Number(operands[0])+Number(operands[1])*2;val="Mem2("+(addr>>>0)+")"}else{var addr=Number(operands[1])*2;if(addr){val="Mem2(("+operands[0]+"+"+addr+") >>>0)"}else{val="Mem2("+operands[0]+")"}}}else{val="Mem2(("+operands[0]+"+2*"+operands[1]+") >>>0)"}context.code.push(operands[2]+val+");")},74:function(context,operands){var val,addr;if(quot_isconstant(operands[1])){if(quot_isconstant(operands[0])){addr=Number(operands[0])+Number(operands[1]);val="Mem1("+(addr>>>0)+")"}else{var addr=Number(operands[1]);if(addr){val="Mem1(("+operands[0]+"+"+addr+") >>>0)"}else{val="Mem1("+operands[0]+")"}}}else{val="Mem1(("+operands[0]+"+"+operands[1]+") >>>0)"}context.code.push(operands[2]+val+");")},76:function(context,opera nds){var val,addr;if(quot_isconstant(operands[1])){if(quot_isconstant(operands[0])){addr=Number(operands[0])+Number(operands[1])*4;val=(addr>>>0)+","}else{var addr=Number(operands[1])*4;if(addr){val="("+operands[0]+"+"+addr+") >>>0,"}else{val=operands[0]+","}}}else{val="("+operands[0]+"+4*"+operands[1]+") >>>0,"}context.code.push("MemW4("+val+operands[2]+");")},77:function(context,operands){var val,addr;if(quot_isconstant(operands[1])){if(quot_isconstant(operands[0])){addr=Number(operands[0])+Number(operands[1])*2;val=(addr>>>0)+","}else{var addr=Number(operands[1])*2;if(addr){val="("+operands[0]+"+"+addr+") >>>0,"}else{val=operands[0]+","}}}else{val="("+operands[0]+"+2*"+operands[1]+") >>>0,"}context.code.push("MemW2("+val+operands[2]+");")},78:function(context,operands){var val,addr;if(quot_isconstant(operands[1])){if(quot_isconstant(operands[0])){addr=Number(operands[0])+Number(operands[1]);val=(addr>>>0)+","}else{var addr=Number(operands[1]);if(addr){val="("+operands[0]+"+"+addr+") >>>0,"}else{val=operan ds[0]+","}}}else{val="("+operands[0]+"+"+operands[1]+") >>>0,"}context.code.push("MemW1("+val+operands[2]+");")},75:function(context,operands){if(quot_isconstant(operands[1])){var bitx,addrx,bitnum;bitnum=Number(operands[1])&4294967295;bitx=bitnum&7;if(quot_isconstant(operands[0])){addrx=Number(operands[0]);if(bitnum>=0){addrx+=(bitnum>>3)}else{addrx-=(1+((-1-bitnum)>>3))}}else{if(bitnum>=0){if(bitnum<=7){addrx=operands[0]}else{addrx=(operands[0]+"+"+(bitnum>>3))}}else{addrx=(operands[0]+"-"+(1+((-1-bitnum)>>3)))}}context.code.push(operands[2]+"(Mem1("+addrx+") & "+(1<=0) addrx = "+operands[0]+" + ("+sign1+">>3);");context.code.push("else addrx = "+operands[0]+" - (1+((-1-("+sign1+"))>>3));");context.code.push(operands[2]+"(Mem1(addrx) & (1<=0){addrx+=(bitnum>>3)}else{addrx-=(1+((-1-bitnum)>>3))}}else{if(bitnum>=0){if(bitnum<=7){addrx=operands[0]}else{addrx=(operands[0]+"+"+(bitnum>>3))}}else{addrx=(operands[0]+"-"+(1+((-1-bitnum)>>3)))}}mask=(1<=0) addrx = "+operands[0]+" + ("+sign1+">>3);");context.code.push("else addrx = "+operands[0]+" - (1+((-1-("+sign1+"))>>3));");addrx="addrx";mask="(1< 0) {");context.code.push("if ("+sign1+" > 0) {");context.code.push("vals1 = "+sign1+" % "+sign0+";");context.code.push("} else {");context.code.push("vals1 = "+sign0+" - (-("+sign1+")) % "+sign0+";");context.code.push("}");context.code.push("if (vals1) {");context.code.push("pos = frame.valstack.length - "+sign0+";");context.code.push("roll = frame.valstack.slice(frame.valstack.length-vals1, frame.valstack.length).concat(frame.valstack.slice(pos, frame.valstack.length-vals1));");context.code.push("for (ix=0; ix<"+sign0+"; ix++) { frame.valstack[pos+ix] = roll[ix]; }");context.code.push("roll = undefined;");context.code.push("}");context.code.push("}")},84:function(context,operands){oputil_unload_offstack(context);if(quot_isconstant(operands[0])){var ix,holdvar;var pos=Number(operands[0]);fo r(ix=0;ix>>0"}else{if(val>0){expr="Math.floor(random_func() * "+val+")"}else{expr="-Math.floor(random_func() * "+(-val)+")"}}}else{var sign0=oputil_signify_operand(context,operands[0],true);var holdvar=alloc_holdvar(context);expr=holdvar;context.code.push("if ("+sign0+" > 0)");context.code.push(holdvar+" = Math.floor(random_func() * "+sign0+");");context.code.push("else if ("+sign0+" < 0)");context.code.push(holdvar+" = -Math.floor(random_func() * -"+sign0+");");context.code.push("else");context.code.push(holdvar+" = (Math.floor(random_func() * 0x10000) | (Math.floor(random_func() * 0x10000) << 16)) >>>0;")}context.code.push(operands[1]+expr+");")},273:function(context,operands){context.code.push("set_random("+operands[0]+");")},288:function(context,operands){context.offstack.length=0;context.code.push("done_executing = true; vm_stopped = true;");context.code.push("return;");context.path_ends=true},289:function(context,operands){context.code.push(operands[0]+"perform_verify()); ")},290:function(context,operands){context.code.push("vm_restart();");context.code.push("return;");context.path_ends=true},291:function(context,operands){oputil_unload_offstack(context);context.varsused.ix=true;oputil_push_callstub(context,operands[1]);context.code.push("ix = vm_save("+operands[0]+");");context.code.push("pop_callstub(ix ? 0 : 1);");context.code.push("return;");context.path_ends=true},292:function(context,operands){oputil_unload_offstack(context);context.code.push("if (vm_restore("+operands[0]+")) {");context.code.push("pop_callstub((-1)>>>0);");context.code.push("} else {");context.code.push(operands[1]+"1);");context.code.push("pc = "+context.cp+";");context.code.push("}");context.code.push("return;");context.path_ends=true},293:function(context,operands){oputil_unload_offstack(context);oputil_push_callstub(context,operands[0]);context.code.push("vm_saveundo();");context.code.push("pop_callstub(0);");context.code.push("return;");context.path_ends=true},294:function(context,operands){oputil _unload_offstack(context);context.code.push("if (vm_restoreundo()) {");context.code.push("pop_callstub((-1)>>>0);");context.code.push("} else {");context.code.push(operands[0]+"1);");context.code.push("pc = "+context.cp+";");context.code.push("}");context.code.push("return;");context.path_ends=true},295:function(context,operands){context.code.push("protectstart="+operands[0]+";");context.code.push("protectend=protectstart+("+operands[1]+");");context.code.push("if (protectstart==protectend) {");context.code.push(" protectstart=0; protectend=0;");context.code.push("}")},368:function(context,operands){context.varsused.maddr=true;context.varsused.mlen=true;context.varsused.ix=true;context.code.push("mlen="+operands[0]+";");context.code.push("maddr="+operands[1]+";");context.code.push("for (ix=0; ix 0x7fffffff))");context.code.push(" res = 0x7fffffff;");context.code.push(" else");context.code.push(" res = Math.floor(valf);");context.code.push("} else {");context.code.push(" if (isNaN(valf) || !isFinite(valf) || (valf < -0x80000000))");context.code.push(" res = -0x80000000;");context.code.push(" else");context.code.push(" res = Math.ceil(valf);");context.code.push("}");context.code.push(operands[1]+"res>>>0);")},402:function(context,operands){context.varsused.valf=true;context.varsused.res=true;context.code.push("valf = "+oputil_decode_float(context,operands[0])+";");context.code.push("if (!("+operands[0]+" & 0x80000000)) {");context.code.push(" if (isNaN(valf) || !isFinite(valf))");context.code.push(" res = 0x7fffffff;");context.code.push(" else");context.code.push(" res = Math.round(valf);");context.code.push(" if (res > 0x7fffffff) res = 0x7fffffff;");context.code.push("} else {");context .code.push(" if (isNaN(valf) || !isFinite(valf))");context.code.push(" res = -0x80000000;");context.code.push(" else");context.code.push(" res = Math.round(valf);");context.code.push(" if (res < -0x80000000) res = -0x80000000;");context.code.push("}");context.code.push(operands[1]+"res>>>0);")},408:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.ceil("+valf+")));")},409:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.floor("+valf+")));")},416:function(context,operands){var valf0=oputil_decode_float(context,operands[0]);var valf1=oputil_decode_float(context,operands[1]);context.code.push(operands[2]+"encode_float("+valf0+" + "+valf1+"));")},417:function(context,operands){var valf0=oputil_decode_float(context,operands[0]);var valf1=oputil_decode_float(context,operands[1]);context.code.push(operands[2]+"encode_float("+valf0+" - "+valf1+"));")},418:f unction(context,operands){var valf0=oputil_decode_float(context,operands[0]);var valf1=oputil_decode_float(context,operands[1]);context.code.push(operands[2]+"encode_float("+valf0+" * "+valf1+"));")},419:function(context,operands){var valf0=oputil_decode_float(context,operands[0]);var valf1=oputil_decode_float(context,operands[1]);context.code.push(operands[2]+"encode_float("+valf0+" / "+valf1+"));")},420:function(context,operands){var valf0=oputil_decode_float(context,operands[0],true);var valf1=oputil_decode_float(context,operands[1],true);context.varsused.modv=true;context.varsused.quov=true;context.code.push("modv=("+valf0+" % "+valf1+");");context.code.push("quov=encode_float(("+valf0+" - modv) / "+valf1+");");context.code.push("if (quov == 0x0 || quov == 0x80000000) {");context.code.push(" quov = (("+operands[0]+" ^ "+operands[1]+") & 0x80000000) >>>0;");context.code.push("}");context.code.push(operands[2]+"encode_float(modv));");context.code.push(operands[3]+"quov);")},424:function(context,operands){ var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.sqrt("+valf+")));")},425:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.exp("+valf+")));")},426:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.log("+valf+")));")},427:function(context,operands){context.varsused.valf=true;var valf0=oputil_decode_float(context,operands[0],true);var valf1=oputil_decode_float(context,operands[1],true);context.code.push("if ("+operands[0]+" == 0x3f800000) {");context.code.push(" valf = 0x3f800000;");context.code.push("} else if ("+operands[0]+" == 0xbf800000 && ("+operands[1]+" == 0xff800000 || "+operands[1]+" == 0x7f800000)) {");context.code.push(" valf = 0x3f800000;");context.code.push("} else {");context.code.push(" valf=encode_float(Math.pow("+valf0+", "+valf1+"));");context.code.push("}");context.code.push(operands[2]+" valf);")},432:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.sin("+valf+")));")},433:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.cos("+valf+")));")},434:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.tan("+valf+")));")},435:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.asin("+valf+")));")},436:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.acos("+valf+")));")},437:function(context,operands){var valf=oputil_decode_float(context,operands[0]);context.code.push(operands[1]+"encode_float(Math.atan("+valf+")));")},438:function(context,operands){var valf0=oputil_decode_float(context,operands[0]);var valf1=oputil_decode_floa t(context,operands[1]);context.code.push(operands[2]+"encode_float(Math.atan2("+valf0+", "+valf1+")));")},448:function(context,operands){var val,valf0,valf1,valf2;context.varsused.fequal=true;context.varsused.fdiff=true;context.code.push("if (("+operands[2]+" & 0x7f800000) == 0x7f800000 && ("+operands[2]+" & 0x007fffff) != 0) {");context.code.push(" fequal = 0;");context.code.push("} else if (("+operands[0]+" == 0xff800000 || "+operands[0]+" == 0x7f800000) && ("+operands[1]+" == 0xff800000 || "+operands[1]+" == 0x7f800000)) {");context.code.push(" fequal = ("+operands[0]+" == "+operands[1]+");");context.code.push("} else {");if(quot_isconstant(operands[2])){val=Number(operands[2]);valf2=""+decode_float(val&2147483647)}else{val="decode_float(("+operands[2]+") & 0x7fffffff)";valf2=alloc_holdvar(context);context.code.push(valf2+"="+val+";")}valf0=oputil_decode_float(context,operands[0]);valf1=oputil_decode_float(context,operands[1]);context.code.push(" fdiff = "+valf1+" - "+valf0+";");context.code.push(" fe qual = (fdiff <= "+valf2+" && fdiff >= -("+valf2+"));");context.code.push("}");context.code.push("if (fequal) {");oputil_perform_jump(context,operands[3]);context.code.push("}")},449:function(context,operands){var val,valf0,valf1,valf2;context.varsused.fequal=true;context.varsused.fdiff=true;context.code.push("if (("+operands[2]+" & 0x7f800000) == 0x7f800000 && ("+operands[2]+" & 0x007fffff) != 0) {");context.code.push(" fequal = 0;");context.code.push("} else if (("+operands[0]+" == 0xff800000 || "+operands[0]+" == 0x7f800000) && ("+operands[1]+" == 0xff800000 || "+operands[1]+" == 0x7f800000)) {");context.code.push(" fequal = ("+operands[0]+" == "+operands[1]+");");context.code.push("} else {");if(quot_isconstant(operands[2])){val=Number(operands[2]);valf2=""+decode_float(val&2147483647)}else{val="decode_float(("+operands[2]+") & 0x7fffffff)";valf2=alloc_holdvar(context);context.code.push(valf2+"="+val+";")}valf0=oputil_decode_float(context,operands[0]);valf1=oputil_decode_float(context,operands[1]);cont ext.code.push(" fdiff = "+valf1+" - "+valf0+";");context.code.push(" fequal = (fdiff <= "+valf2+" && fdiff >= -("+valf2+"));");context.code.push("}");context.code.push("if (!fequal) {");oputil_perform_jump(context,operands[3]);context.code.push("}")},450:function(context,operands){valf0=oputil_decode_float(context,operands[0]);valf1=oputil_decode_float(context,operands[1]);context.code.push("if ("+valf0+" < "+valf1+") {");oputil_perform_jump(context,operands[2]);context.code.push("}")},451:function(context,operands){valf0=oputil_decode_float(context,operands[0]);valf1=oputil_decode_float(context,operands[1]);context.code.push("if ("+valf0+" <= "+valf1+") {");oputil_perform_jump(context,operands[2]);context.code.push("}")},452:function(context,operands){valf0=oputil_decode_float(context,operands[0]);valf1=oputil_decode_float(context,operands[1]);context.code.push("if ("+valf0+" > "+valf1+") {");oputil_perform_jump(context,operands[2]);context.code.push("}")},453:function(context,operands){valf0=oputil_decod e_float(context,operands[0]);valf1=oputil_decode_float(context,operands[1]);context.code.push("if ("+valf0+" >= "+valf1+") {");oputil_perform_jump(context,operands[2]);context.code.push("}")},456:function(context,operands){context.code.push("if (("+operands[0]+" & 0x7f800000) == 0x7f800000 && ("+operands[0]+" & 0x007fffff) != 0) {");oputil_perform_jump(context,operands[1]);context.code.push("}")},457:function(context,operands){context.code.push("if ("+operands[0]+" == 0xff800000 || "+operands[0]+" == 0x7f800000) {");oputil_perform_jump(context,operands[1]);context.code.push("}")},304:function(context,operands){var mayblock;if(quot_isconstant(operands[0])){mayblock=Glk.call_may_not_return(Number(operands[0]))}else{mayblock=true}context.code.push("tempglkargs.length = "+operands[1]+";");if(quot_isconstant(operands[1])){var ix;var argc=Number(operands[1]);for(ix=0;ix>1);for(ix=0;ix>4)&15);modeaddr++}var optype=oplist.formlist[ix];if(optype=="L"){switch(mode){case 8:if(context.offstack.length){operands[ix]=pop_offstack_holdvar(context)}else{holdvar=alloc_holdvar(context);context.code.push(holdvar+"=frame.valstack.pop();");operands[ix]=holdvar}continue;case 0:operands[ix]="0";continue;case 1:value=QuoteMem1(cp);cp++;operands[ix]=v alue;continue;case 2:value=QuoteMem2(cp);cp+=2;operands[ix]=value;continue;case 3:value=QuoteMem4(cp);cp+=4;operands[ix]=value;continue}if(mode>=9&&mode<=11){if(mode==9){addr=Mem1(cp);cp++}else{if(mode==10){addr=Mem2(cp);cp+=2}else{if(mode==11){addr=Mem4(cp);cp+=4}}}if(oplist.argsize==4){value="frame.locals["+addr+"]"}else{if(oplist.argsize==2){value="frame.locals["+addr+"] & 0xffff"}else{value="frame.locals["+addr+"] & 0xff"}}holdvar=alloc_holdvar(context);context.code.push(holdvar+"=("+value+");");operands[ix]=holdvar;continue}switch(mode){case 15:addr=Mem4(cp)+ramstart;cp+=4;break;case 14:addr=Mem2(cp)+ramstart;cp+=2;break;case 13:addr=Mem1(cp)+ramstart;cp++;break;case 7:addr=Mem4(cp);cp+=4;break;case 6:addr=Mem2(cp);cp+=2;break;case 5:addr=Mem1(cp);cp++;break;default:fatal_error("Unknown addressing mode in load operand.")}if(oplist.argsize==4){value="Mem4("+addr+")"}else{if(oplist.argsize==2){value="Mem2("+addr+")"}else{value="Mem1("+addr+")"}}holdvar=alloc_holdvar(context);context.code.push(holdvar+"=(" +value+");");operands[ix]=holdvar;continue}else{if(optype=="E"){switch(mode){case 8:if(context.offstack.length){operands[ix]=pop_offstack_holdvar(context)}else{operands[ix]="frame.valstack.pop()"}continue;case 0:operands[ix]="0";continue;case 1:value=QuoteMem1(cp);cp++;operands[ix]=value;continue;case 2:value=QuoteMem2(cp);cp+=2;operands[ix]=value;continue;case 3:value=QuoteMem4(cp);cp+=4;operands[ix]=value;continue}if(mode>=9&&mode<=11){if(mode==9){addr=Mem1(cp);cp++}else{if(mode==10){addr=Mem2(cp);cp+=2}else{if(mode==11){addr=Mem4(cp);cp+=4}}}if(oplist.argsize==4){operands[ix]="frame.locals["+addr+"]"}else{if(oplist.argsize==2){operands[ix]="frame.locals["+addr+"] & 0xffff"}else{operands[ix]="frame.locals["+addr+"] & 0xff"}}continue}switch(mode){case 15:addr=Mem4(cp)+ramstart;cp+=4;break;case 14:addr=Mem2(cp)+ramstart;cp+=2;break;case 13:addr=Mem1(cp)+ramstart;cp++;break;case 7:addr=Mem4(cp);cp+=4;break;case 6:addr=Mem2(cp);cp+=2;break;case 5:addr=Mem1(cp);cp++;break;default:fatal_error("Unknown addressing mode in load operand.")}if(oplist.argsize==4){value="Mem4("+addr+")"}else{if(oplist.argsize==2){value="Mem2("+addr+")"}else{value="Mem1("+addr+")"}}operands[ix]=value;continue}else{if(optype=="S"){switch(mode){case 8:holdvar=alloc_holdvar(context,true);context.offstack.push(holdvar);operands[ix]=holdvar+"=(";continue;case 0:operands[ix]="(";continue}if(mode>=9&&mode<=11){if(mode==9){addr=Mem1(cp);cp++}else{if(mode==10){addr=Mem2(cp);cp+=2}else{if(mode==11){addr=Mem4(cp);cp+=4}}}if(oplist.argsize==4){operands[ix]="frame.locals["+addr+"]=("}else{if(oplist.argsize==2){operands[ix]="frame.locals["+addr+"]=(0xffff &"}else{operands[ix]="frame.locals["+addr+"]=(0xff &"}}continue}switch(mode){case 15:addr=Mem4(cp)+ramstart;cp+=4;break;case 14:addr=Mem2(cp)+ramstart;cp+=2;break;case 13:addr=Mem1(cp)+ramstart;cp++;break;case 7:addr=Mem4(cp);cp+=4;break;case 6:addr=Mem2(cp);cp+=2;break;case 5:addr=Mem1(cp);cp++;break;default:fatal_error("Unknown addressing mode in store operand.")}if(oplist.argsize==4){value="MemW4("+ addr+","}else{if(oplist.argsize==2){value="MemW2("+addr+","}else{value="MemW1("+addr+","}}operands[ix]=value;continue}else{if(optype=="F"){var funcop=operands.func_store;switch(mode){case 8:funcop.mode=8;funcop.argsize=oplist.argsize;operands[ix]=funcop;continue;case 0:funcop.mode=0;funcop.argsize=oplist.argsize;operands[ix]=funcop;continue}if(mode>=9&&mode<=11){if(mode==9){addr=Mem1(cp);cp++}else{if(mode==10){addr=Mem2(cp);cp+=2}else{if(mode==11){addr=Mem4(cp);cp+=4}}}funcop.mode=11;funcop.addr=addr;funcop.argsize=oplist.argsize;operands[ix]=funcop;continue}switch(mode){case 15:addr=Mem4(cp)+ramstart;cp+=4;break;case 14:addr=Mem2(cp)+ramstart;cp+=2;break;case 13:addr=Mem1(cp)+ramstart;cp++;break;case 7:addr=Mem4(cp);cp+=4;break;case 6:addr=Mem2(cp);cp+=2;break;case 5:addr=Mem1(cp);cp++;break;default:fatal_error("Unknown addressing mode in store operand.")}funcop.mode=15;funcop.addr=addr;funcop.argsize=oplist.argsize;operands[ix]=funcop;continue}else{if(optype=="C"){switch(mode){case 8:operands[ix]="3,0";con tinue;case 0:operands[ix]="0,0";continue}if(mode>=9&&mode<=11){if(mode==9){addr=Mem1(cp);cp++}else{if(mode==10){addr=Mem2(cp);cp+=2}else{if(mode==11){addr=Mem4(cp);cp+=4}}}operands[ix]="2,"+addr;continue}switch(mode){case 15:addr=Mem4(cp)+ramstart;cp+=4;break;case 14:addr=Mem2(cp)+ramstart;cp+=2;break;case 13:addr=Mem1(cp)+ramstart;cp++;break;case 7:addr=Mem4(cp);cp+=4;break;case 6:addr=Mem2(cp);cp+=2;break;case 5:addr=Mem1(cp);cp++;break;default:fatal_error("Unknown addressing mode in store operand.")}operands[ix]="1,"+addr;continue}else{fatal_error("Unknown operand type.",optype)}}}}}}return cp}function compile_func(funcaddr){var addr=funcaddr;var functype=Mem1(addr);if(functype!=192&&functype!=193){if(functype>=192&&functype<=223){fatal_error("Call to unknown type of function.",addr)}else{fatal_error("Call to non-function.",addr)}}addr++;var localsformat=[];var rawstart=addr;var ix=0;while(1){var loctype=Mem1(addr);addr++;var locnum=Mem1(addr);addr++;if(loctype==0){break}if(loctype!=1&&loctype!=2&&loctype !=4){fatal_error("Invalid local variable size in function header.",loctype)}localsformat.push({size:loctype,count:locnum})}var rawformat=memmap.slice(rawstart,addr);while(rawformat.length%4){rawformat.push(0)}return new VMFunc(funcaddr,addr,localsformat,rawformat)}function compile_path(vmfunc,startaddr,startiosys){var cp=startaddr;var opcode;var opcodecp;var key;var context={vmfunc:vmfunc,cp:null,curiosys:startiosys,code:[],holduse:{},varsused:{},offstack:[],path_ends:false};var operands={};operands.func_store={};context.code.push("");while(!context.path_ends){opcodecp=cp;opcode=Mem1(cp);if(opcode===undefined){fatal_error("Tried to compile nonexistent address",cp)}cp++;if(opcode&128){if(opcode&64){opcode&=63;opcode=(opcode*256)|Mem1(cp);cp++;opcode=(opcode*256)|Mem1(cp);cp++;opcode=(opcode*256)|Mem1(cp);cp++}else{opcode&=127;opcode=(opcode*256)|Mem1(cp);cp++}}var oplist=operandlist_table[opcode];if(!oplist){fatal_error("Encountered unknown opcode.",opcode)}cp=parse_operands(context,cp,oplist,operands);contex t.cp=cp;var ophandler=opcode_table[opcode];if(!ophandler){fatal_error("Encountered unhandled opcode.",opcode)}ophandler(context,operands);for(key in context.holduse){if(context.holduse[key]===true){context.holduse[key]=false}}if(vmfunc.pathaddrs[cp]&&!context.path_ends){context.code.push("pc="+cp+";");oputil_unload_offstack(context);context.code.push("return;");context.path_ends=true}}if(context.offstack.length){fatal_error("Path compilation ended with nonempty offstack.",context.offstack.length)}var ls=[];for(key in context.holduse){ls.push(key)}for(key in context.varsused){ls.push(key)}if(ls.length){context.code[0]="var "+ls.join(",")+";"}return make_code(context.code.join("\n"))}function enter_function(addr,argcount){var ix;total_function_calls++;var vmfunc=vmfunc_table[addr];if(vmfunc===undefined){vmfunc=compile_func(addr);if(addr=0;ix--){frame.valstack.push(tempcallargs[ix])}frame.valstack.push(argcount)}else{for(ix=0;ixval){stack.pop()}if(stack.length==0){fatal_error("Stack evaporated during throw.")}frame=stack[stack.length-1];val-=(frame.framestart+ frame.framelen);if(val<0){fatal_error("Attempted to throw below the frame value stack.")}if(val&3){fatal_error("Attempted to throw to an unaligned address.")}val>>>=2;if(val>frame.valstack.length){fatal_error("Attempted to throw beyond the frame value stack.")}frame.valstack.length=val}function pop_callstub(val){var destaddr,desttype;if(isNaN(val)){fatal_error("Function returned undefined value.")}var framestart=frame.valstack.pop();if(framestart!=frame.framestart){fatal_error("Call stub frameptr ("+framestart+") does not match frame ("+frame.framestart+")")}pc=frame.valstack.pop();destaddr=frame.valstack.pop();desttype=frame.valstack.pop();switch(desttype){case 0:return;case 1:MemW4(destaddr,val);return;case 2:frame.locals[destaddr]=val;return;case 3:frame.valstack.push(val);return;case 17:fatal_error("String-terminator call stub at end of function call.");return;case 16:stream_string(0,pc,225,destaddr);return;case 18:stream_num(0,pc,true,destaddr);return;case 19:stream_string(0,pc,224,destaddr);return;case 20:stream_string(0,pc,226,destaddr);return;default:fatal_error("Unrecognized desttype in callstub.",desttype)}}function store_operand(desttype,destaddr,val){switch(desttype){case 0:return;case 1:MemW4(destaddr,val);return;case 2:frame.locals[destaddr]=val;return;case 3:frame.valstack.push(val);return;default:fatal_error("Unrecognized desttype in callstub.",desttype)}}function store_operand_by_funcop(funcop,val){if(!funcop){return}switch(funcop.mode){case 8:frame.valstack.push(val);return;case 0:return;case 11:if(funcop.argsize==4){frame.locals[funcop.addr]=(val)}else{if(funcop.argsize==2){frame.locals[funcop.addr]=(65535&val)}else{frame.locals[funcop.addr]=(255&val)}}return;case 15:if(funcop.argsize==4){MemW4(funcop.addr,val)}else{if(funcop.argsize==2){MemW2(funcop.addr,val)}else{MemW1(funcop.addr,val)}}return;default:fatal_error("Unknown addressing mode in store func by operand.")}}function set_random(val){if(val==0){random_func=Math.random}else{srand_set_seed(val);random_func=srand_get_random}}var srand_t able=undefined;var srand_index1,srand_index2;function srand_set_seed(seed){var i,ii,k,val,loop;if(srand_table===undefined){srand_table=Array(55)}srand_table[54]=seed;srand_index1=0;srand_index2=31;k=1;for(i=0;i<55;i++){ii=(21*i)%55;srand_table[ii]=k;k=(seed-k)>>>0;seed=srand_table[ii]}for(loop=0;loop<4;loop++){for(i=0;i<55;i++){val=srand_table[i]-srand_table[(1+i+30)%55];srand_table[i]=val>>>0}}}function srand_get_random(){srand_index1=(srand_index1+1)%55;srand_index2=(srand_index2+1)%55;srand_table[srand_index1]=(srand_table[srand_index1]-srand_table[srand_index2])>>>0;return srand_table[srand_index1]/4294967296}function set_string_table(addr){if(stringtable==addr){return}decoding_tree=undefined;vmstring_table=undefined;stringtable=addr;if(stringtable==0){return}var textenv=vmtextenv_table[stringtable];if(textenv===undefined){var dectab=undefined;var tablelen=Mem4(stringtable);var rootaddr=Mem4(stringtable+8);var cache_stringtable=(stringtable+tablelen<=ramstart);if(cache_stringtable){var tmparray=Array(1); build_decoding_tree(tmparray,rootaddr,4,0);dectab=tmparray[0];if(dectab===undefined){fatal_error("Failed to create decoding tree.")}}textenv=new VMTextEnv(stringtable,dectab);vmtextenv_table[stringtable]=textenv}decoding_tree=textenv.decoding_tree;vmstring_table=textenv.vmstring_tables[iosysmode]}function set_iosys(mode,rock){switch(mode){case 0:rock=0;break;case 1:break;case 2:rock=0;break;default:mode=0;rock=0;break}iosysmode=mode;iosysrock=rock;var textenv=vmtextenv_table[stringtable];if(textenv===undefined){vmstring_table=undefined}else{vmstring_table=textenv.vmstring_tables[iosysmode]}}function build_decoding_tree(cablist,nodeaddr,depth,mask){var ix,type,cab;var depthbit;type=Mem1(nodeaddr);if(type==0&&depth==4){cab=Array(16);cab.type=0;cab.depth=4;cablist[mask]=cab;build_decoding_tree(cab,nodeaddr,0,0);return}if(type==0){var leftaddr=Mem4(nodeaddr+1);var rightaddr=Mem4(nodeaddr+5);build_decoding_tree(cablist,leftaddr,depth+1,mask);build_decoding_tree(cablist,rightaddr,depth+1,(mask|(1<>=bitnum}numbits=(8-bitnum);readahead=false;if(!(decoding_tree instanceof Array)){done=true}cablist=decoding_tree;while(!done){if(numbits<4){var newbyte=Mem1(addr+1);bits|=(newbyte<>=cab.depth;bitnum+=cab.depth;if(bitnum>=8){addr+=1;bitnum-=8;if(readahead){readahead=false}else{var newbyte=Mem1(addr);bits|=(newbyte<=9){context.code.push("oaddr = Mem4(oaddr);")}if(cab.type==11){context.code.push("oaddr = Mem4(oaddr);")}context.code.push("otype = Mem1(oaddr);");retval="retval";done=true;oputil_push_callstub(context,"0x10,"+bitnum,addr);context.code.push("if (otype >= 0xE0 && otype <= 0xFF) {");context.code.push("retval = [oaddr, 0, 0];");context.code.push("}");context.code.push("else if (otype >= 0xC0 && otype <= 0xDF) {");var argc=0;if(cab.type==10||cab.type==11){argc=Mem4(cab.addr+4);for(var ix=0;ix>=bitnum}node=Mem4(stringtable+8);while(!done){nodetype=Mem1(node);node++;switch(nodetype){case 0:if(byt&1){node=Mem4(node+4)}else{node=Mem4(node+0)}if(bitnum==7){bitnum=0;addr++;byt=Mem1(addr)}else{bitnum++;byt>>=1}break;case 1:retval=false;done=true;break;case 2:ch=Mem1(node);switch(curiosys){case 2:context.buffer.push(CharToString(ch));break;case 1:oputil_flush_string(context);oputil_push_substring_callstub(context);oputil_push_callstub(contex t,"0x10,"+bitnum,addr);context.code.push("tempcallargs[0]="+ch+";");context.code.push("enter_function(iosysrock, 1);");retval=true;done=true;break}node=Mem4(stringtable+8);break;case 4:ch=Mem4(node);switch(curiosys){case 2:context.buffer.push(CharToString(ch));break;case 1:oputil_flush_string(context);oputil_push_substring_callstub(context);oputil_push_callstub(context,"0x10,"+bitnum,addr);context.code.push("tempcallargs[0]="+ch+";");context.code.push("enter_function(iosysrock, 1);");retval=true;done=true;break}node=Mem4(stringtable+8);break;case 3:switch(curiosys){case 2:while(true){ch=Mem1(node);if(ch==0){break}context.buffer.push(CharToString(ch));node++}break;case 1:oputil_flush_string(context);oputil_push_substring_callstub(context);oputil_push_callstub(context,"0x10,"+bitnum,addr);retval="["+node+", 0xE0, 0]";done=true;break}node=Mem4(stringtable+8);break;case 5:switch(curiosys){case 2:while(true){ch=Mem4(node);if(ch==0){break}context.buffer.push(CharToString(ch));node+=4}break;case 1:oputil_flush_stri ng(context);oputil_push_substring_callstub(context);oputil_push_callstub(context,"0x10,"+bitnum,addr);retval="["+node+", 0xE2, 0]";done=true;break}node=Mem4(stringtable+8);break;case 8:case 9:case 10:case 11:oputil_flush_string(context);oputil_push_substring_callstub(context);context.code.push("var otype, retval;");context.code.push("var oaddr = "+Mem4(node)+";");if(nodetype==9||nodetype==11){context.code.push("oaddr = Mem4(oaddr);")}context.code.push("otype = Mem1(oaddr);");retval="retval";done=true;oputil_push_callstub(context,"0x10,"+bitnum,addr);context.code.push("if (otype >= 0xE0 && otype <= 0xFF) {");context.code.push("retval = [oaddr, 0, 0];");context.code.push("}");context.code.push("else if (otype >= 0xC0 && otype <= 0xDF) {");var argc=0;if(nodetype==10||nodetype==11){argc=Mem4(node+4);for(var ix=0;ix=224&&type<=255){fatal_error("Attempt to print unknown type of string.")}else{fatal_error("Attempt to print non-string.")}}}}if(!retval){return context.buffer.join("")}else{oputil_flush_string(context);context.code.push("return "+retval+";");return make_code(context.code.join("\n"),"nextcp,substring")}}function do_gestalt(val,val2){var ix;switch(val){case 0:return 196866;case 1:return 65539;case 2:return 1;case 3:return 1;case 4:switch(val2){case 0:return 1;case 1:return 1;case 2:return 1;default:return 0}break;case 5:return 1;case 6:return 1;case 7:return 1;case 8:return heap_get_start();case 9:return 1;case 10:return 0;case 11:return 1;default:return 0}}var tempsearchkey=[];function fetch_search_key(addr,len,options){var ix;tempsearchkey.length=len;if(options&1){for(ix=0;ix>24)&255;tempsearchkey[1]=(addr>>16)&255;tempsearchkey[2]=(addr>>8)&255;tempse archkey[3]=addr&255;break;case 2:tempsearchkey[0]=(addr>>8)&255;tempsearchkey[1]=addr&255;break;case 1:tempsearchkey[0]=addr&255;break;default:throw ("Direct search key must hold one, two, or four bytes.")}}return tempsearchkey}function linear_search(key,keysize,start,structsize,numstructs,keyoffset,options){var ix,count,match,byt;var retindex=((options&4)!=0);var zeroterm=((options&2)!=0);var keybuf=fetch_search_key(key,keysize,options);for(count=0;count>1;addr=start+val*structsize;for(ix=0;(!cmp)&&ixbyt2){cmp=1}}}if(!cmp){if(retindex){return val}else{return addr}}if(cmp<0){bot=val+1}else{top=val}}if(retindex){return 4294967295}else{return 0}}function linked_search(key,keysize,start,keyoffset,nextoffset,options){var ix,byt,match;var zeroterm=((options&2)!=0);var keybuf=fetch_search_key(key,keysize,options);while(start!=0){match=true;for(ix=0;match&&ix>23&255);if(expo){res=((val&8388607|8388608)/8388608*Math.pow(2,(expo-127)))}else{res=((val&8388607)/8388608*Math.pow(2,-126))}if(sign){return -res}else{return res}}function encode_float(val){var absval,fbits;var mant,expo,sign;if(isNaN(val)){return 2139095041}if(!isFinite(val)){if(val<0){return 4286578688}else{return 2139095040}}if(val==0){if(1/val<0){return 2147483648}else{return 0}}if(val<0){sign=true;absval=-val}else{sign=false;absval=val}expo=Math.floor(Math.log(absval)/Math.log(2));mant=absval/Math.pow(2,expo);if(expo>=128){return(sign?4286578688:2139095040)}else{if(expo<-126){mant=mant*Math.pow(2,126+expo);expo=0}else{if(!(expo==0&&mant==0)){expo+=127;mant-=1}}}mant=mant*8388608;fbits=(mant+0.4999999999999999)<<0;if(fbits>=8388608){fbits=0;expo++;if(expo>=255){return(sign?4286578688:2139095040)}}if(sign){return((2147483648)|(expo<<23)|(fbits))>>>0}else{return(expo<<23)|(fbits)}}var game_image=null;var game_signature=null;var opt_rethr ow_exceptions=null;var memmap;var stack;var frame;var vm_started=false;var vm_stopped=false;var tempcallargs;var tempglkargs;var done_executing;var vmfunc_table;var vmtextenv_table;var decoding_tree;var vmstring_table;var random_func;var ramstart;var endgamefile;var origendmem;var stacksize;var startfuncaddr;var origstringtable;var checksum;var pc;var stringtable;var endmem;var protectstart,protectend;var iosysmode,iosysrock;var undostack;var resumefuncop,resumevalue;var heapstart;var usedlist;var freelist;var total_execution_time=0;var total_function_calls=0;var total_path_calls=0;var paths_cached=0;var paths_compiled=0;var strings_cached=0;var strings_compiled=0;function setup_vm(){var val,version;if(!game_image){fatal_error("There is no Glulx game file loaded.")}vm_started=true;resumefuncop=null;resumevalue=0;memmap=null;stack=[];frame=null;pc=0;if(game_image.length<36){fatal_error("This is too short to be a valid Glulx file.")}val=ByteRead4(game_image,0);if(val!=1198290284){fatal_error("This is not a val id Glulx file.")}version=ByteRead4(game_image,4);if(version<131072){fatal_error("This Glulx file is too old a version to execute.")}if(version>=197120){fatal_error("This Glulx file is too new a version to execute.")}ramstart=ByteRead4(game_image,8);endgamefile=ByteRead4(game_image,12);origendmem=ByteRead4(game_image,16);stacksize=ByteRead4(game_image,20);startfuncaddr=ByteRead4(game_image,24);origstringtable=ByteRead4(game_image,28);checksum=ByteRead4(game_image,32);protectstart=0;protectend=0;if(ramstart<256||endgamefile0){result.push(0);result.push(zeroes-1)}while(ibytes.length){qlog("IFF chunk header is truncated");return undefined}var key=ByteReadString(bytes,pos,4);var size=ByteRead4(bytes,pos+4);pos+=8;if((pos+size)>bytes.length){qlog(key+" chunk is truncated ("+size+" bytes needed, "+(bytes.length-pos)+" available");return undefined}chunks[key]=bytes.slice(pos,pos+size);pos+=size}return chunks}function vm_save(streamid){if(iosysmode!=2){fatal_error("Streams are only available in Glk I/O system.")}var str=GiDispa.class_obj_from_id("stream",streamid);if(!str){return false}chunks={};chunks.IFhd=game_image.slice(0,128);chunks.CMem=memmap.slice(ramstart);for(var i=ramstart;i0){count=Glk.glk_get_buffer_stream(str,buffer);quetzal=quetzal.concat(buffer.slice(0,count))}quetzal=unpack_iff_chunks(quetzal);if(!quetzal){qlog("vm_restore failed: file is not Quetzal");return false}quetzal=quetzal.FORM;if(!quetzal||ByteReadString(quetzal,0,4)!= "IFZS"){qlog("vm_restore failed: file doesn't start with FORM/IFZS header");return false}var chunks=unpack_iff_chunks(quetzal.slice(4));if(!chunks.IFhd){qlog("vm_restore failed: missing required IFhd chunk");return false}for(var i=0;i<128;i++){if(chunks.IFhd[i]!=game_image[i]){qlog("vm_restore failed: this save image is for a different game");return false}}if(!chunks.CMem){qlog("vm_restore failed: missing required CMem chunk");return false}if(!chunks.QFun){qlog("vm_restore failed: missing required QFun chunk")}if(!chunks.Stks){qlog("vm_restore failed: missing required Stks chunk")}var protect=copy_protected_range();heap_clear();var ram_xor=decompress_bytes(chunks.CMem);change_memsize(ramstart+ram_xor.length,false);memmap=game_image.slice(0,ramstart).concat(ram_xor);for(var i=ramstart;i=0;i--){frame=pop_deserialized_stackframe(chunks.Stks,vmfuncs[i]);if(!frame){fatal_error("vm_restore failed: bad stack frame")}stack.unshift(frame)}for(var i=0;iendmem){fatal_error("vm_restore failed: corrupt dynamic heap")}usedlist.push(new HeapBlock(addr,size));if(addr>heapend){freelist.push(new HeapBlock(heapend,addr-heapend))}heapend=addr+size}if(heapend10){undostack.shift()}}function vm_restoreundo(){if(undostack.length==0){return false}var snapshot=undostack.pop();var protect=copy_protected_range();memmap=memmap.slice(0,ramstart).concat(snapshot.ram);endmem=snapshot.endmem;stack=snapshot.stack;frame=stack[stack.length-1];pc=snapshot.pc;heapstart=snapshot.heapstart;usedlist=snapshot.usedlist;freelist=snapshot.freelist;paste_protected_range(protect);return true}function change_memsize(newlen,internal){var lx;if(newlen==endmem){return}if((!internal)&&heap_is_active()){fatal_error("Cannot resize Glulx memory space while heap is active.")}if(newlenendme m){for(lx=endmem;lx=protectend){return null}var len=protectend-protectstart;var obj={start:protectstart,end:protectend,len:len};var arr=memmap.slice(protectstart,protectend);while(arr.lengthendmem){end=endmem}for(ix=0,addr=start;addr>>0;for(ix=0;ix>>0}if(newsum!=checksum){return 1}return 0}function quixe_get_signature(){return game_signature}function quixe_get_statistics(){var stat={game_image_length:game_image.length,total_execution_time:to tal_execution_time,total_function_calls:total_function_calls,total_path_calls:total_path_calls,paths_cached:paths_cached,paths_compiled:paths_compiled,strings_cached:strings_cached,strings_compiled:strings_compiled};return stat}function heap_clear(){heapstart=0;usedlist=[];freelist=[]}function heap_is_active(){return(usedlist.length>0)}function heap_get_start(){return heapstart}function HeapBlock(addr,size){this.addr=addr;this.size=size;this.end=addr+size}function heap_binary_search(list,addr){var low=0;var high=list.length;while(low>1;if(list[mid].addr=size){if(freeblock.size>size){freelist[i]=new HeapBlock(freeblock.addr+size,freeblock.size-size)}else{freelist.splice(i,1)}var pos=heap_binary_search(usedlist,freeblock.addr);usedlist.splice(pos,0,new HeapBlock(freeblock.addr,size));return f reeblock.addr}}var addr=endmem;var rounded_up_size=((size+255)&4294967040);change_memsize(endmem+rounded_up_size,true);if(rounded_up_size>size){freelist.push(new HeapBlock(addr+size,rounded_up_size-size))}usedlist.push(new HeapBlock(addr,size));return addr}function heap_free(addr){var pos=heap_binary_search(usedlist,addr);var block=usedlist[pos];if(!block||block.addr!=addr){fatal_error("Tried to free non-existent block")}usedlist.splice(pos,1);if(usedlist.length==0){change_memsize(heapstart,true);heap_clear();return}pos=heap_binary_search(freelist,addr);var next=freelist[pos];if(next&&next.addr==block.end){block=new HeapBlock(addr,block.size+next.size);freelist.splice(pos,1)}var prev=freelist[pos-1];if(prev&&prev.end==block.addr){block=new HeapBlock(prev.addr,prev.size+block.size);freelist.splice(pos-1,1);pos-=1}freelist.splice(pos,0,block)}function assert_heap_valid(){if(!heap_is_active()){if(heapstart!=0){fatal_error("Heap inconsistency: heapstart nonzero")}if(usedlist.length>0){fatal_error("Heap inconsist ency: usedlist nonempty")}if(freelist.length>0){fatal_error("Heap inconsistency: usedlist nonempty")}return}if(heapstart==0){fatal_error("Heap inconsistency: heapstart is zero")}var addr=heapstart;var upos=0,fpos=0;while(upos>> 0"}if(arg instanceof ArgChar){if(!arg.signed){return val+" & 0xFF"}else{return"uncast_signed_char("+val+")"}}if(arg instanceof ArgClass){return'class_obj_to_id("'+arg.name+'", '+val+")"}return"???"}function cast_signed_char(val){val=val&255;if(val&128){val-=256}return val}function uncast_signed_char(val){val=val&255;if(val&128){val+=4294967040}return val}function class_obj_to_id(clas, val){if(!val){return 0}return val.disprock}function class_obj_from_id(clas,val){if(val==0){return null}return class_map[clas][val]}function build_function(func){var ix,jx;var form,retarg,argpos,argjoin,subargs;var arg,refarg,tmpvar,val,retval,ls;var mayblock;var out=[];var locals={};var arraycount=0;out.push("// no local vars");out.push("// "+func.id+": "+func.name);form=func.proto;retarg=null;if(form.retarg){retarg=form.retarg.arg}mayblock=Glk.call_may_not_return(func.id);argpos=0;argjoin=[];for(ix=0;ix>>0);VM.WriteStructField(blocked_callargs[0],1,class_obj_to_id("window",glka0.get_field(1)));VM.WriteStructField(blocked_callargs[0],2,glka0.get_field(2)>>>0);VM.WriteStructField(blocked_callargs[0],3,glka0.get_field(3)>>>0)}}else{if(blocked_selector==98){VM.SetResumeStore(class_obj_to_id("fileref",glka0))}}blocked_selector=null;blocked_callargs=null}var temp_arg_arrays=[];var retained_arrays=[];function make_arg_array(arr,addr,len,arg){var obj;if(!arr){return}obj={arr:arr,addr:addr,len:len,arg:arg};temp_arg_arrays.push(obj)}function retain_array(arr){var ix,obj;if(!arr){return}obj=undefined;for(ix=0;ix>>0)}}else{if(obj.arg instanceof ArgChar){if(!obj.arg.signed){for(ix=0,jx=obj.addr;ix element!");return}var y=new Element("script",{src:j,type:"text/javascript"});m[0].insert(y);return}if(s&&z){GlkOte.log("### trying binary load...");new Ajax.Request(j,{method:"get",onCreate:function(C){C.transport.overrideMimeType("text/plain; charset=x-user-defined")},onSuccess:function(C){b(c(C.responseText))},onFailure:function(C){h.io.fatal_error("The story could not be loaded. ("+j+"): Error "+C.status+": "+C.statusText)}});return}if(q=="file:"){h.io.fatal_error("Th e story could not be loaded. ("+j+"): A local file cannot be sent to the proxy.");return}var o=j;if(x){o=f(j);GlkOte.log("### absolutize "+j+" to "+o)}if(u){GlkOte.log("### trying proxy load... ("+h.proxy_url+")");new Ajax.Request(h.proxy_url,{method:"get",parameters:{encode:"base64",url:o},onFailure:function(C){h.io.fatal_error("The story could not be loaded. ("+j+"): Error "+C.status+": "+C.statusText)},onSuccess:function(C){b(decode_base64(C.responseText))}});return}if(true){var v=h.proxy_url+"?encode=base64&callback=processBase64Zcode&url="+o;GlkOte.log("### trying proxy-script load... ("+v+")");window.processBase64Zcode=function(C){b(decode_base64(C))};var m=$$("head");if(!m||m.length==0){h.io.fatal_error("This page has no element!");return}var y=new Element("script",{src:v,type:"text/javascript"});m[0].insert(y);return}h.io.fatal_error("The story could not be loaded. ("+j+"): I don't know how to load this data.")}function a(){var p={};var k=location.search.substring(1,location.search.length);if( k.length){var n=k.split("&");k=k.replace(/\+/g," ");for(var l=0;l/gi,"");u=u.replace(/<\/title>/gi,"");var p=new Element("metadata").update(u);if(p.down("bibliographic")){var n=p.down("bibliographic").childElements();var k,l;for(l=0;l>4);l=((s&15)<<4)+(r>>2);k=((r&3)<<6)+q;m.push(o,l,k)}if(q==64){m.pop()}if(r==64){m.pop()}return m}}function b(l){if(l.length==0){h.io.fatal_error("No game file was loaded. (Zero-length response.)");return}if(l[0]==70&&l[1]==79&&l[2]==82&&l[3]==77){try{l=e(l)}catch(k){h.io.fatal_error("Blorb file could not be parsed: "+k);return}if(!l){h.io.fatal_error("Blorb file contains no Glulx game!");return}}if(h.set_page_title){var m=null;if(i){m=i.title}if(!m&&j){m=j.slice(j.lastIndexOf("/")+1)}if(! m){m="Game"}document.title=m+" - Quixe"}h.vm.prepare(l,h);h.io.init(h)}return{load_run:d}}();