// Qaop/JS Copyright by Jan Bobrowski 2011
function Z80(a){function F(){var a=d&168|d>>8&1,b=f,c=g,h=c>>8;e||(a|=64);var i=e^b;return a|=h&2,a|=(i^c^h)&16,f&-256?b=154020>>((e^e>>4)&15):b=(i&(c^e))>>5,a|b&4}function G(a){e=~a&64,d=a|=a<<8,f=255&(g=a&-129|(a&4)<<5)}function H(a){G(a&255),c=a>>8}function I(){return z&128|A}function J(a){z=z&65280|a,A=a&127}function K(a){i=a>>8,j=a&255}function L(a){k=a>>8,l=a&255}function M(){var a;a=u,u=i,i=a,a=v,v=j,j=a,a=w,w=k,k=a,a=x,x=l,l=a,a=y,y=m,m=a}function N(){var a=p;p=c,c=a,a=q,q=d,d=a,a=r,r=e,e=a,a=s,s=f,f=a,a=t,t=g,g=a}function O(){}function P(b){a.time++,a.put(h-1&65535,b>>8),a.time+=3,a.put(h=h-2&65535,b&255),a.time+=3}function Q(){var b=a.get16(h);return h=h+2&65535,a.time+=6,b}function R(a){var b=(f=c)-a;g=~a,d=b&-41|a&40,e=b&255}function S(a){return d=d&256|(e=a=(f=a)+(g=1)&255),a}function T(a){return d=d&256|(e=a=(f=a)+(g=-1)&255),a}function U(a){d=d&-256|(e=a),f=a|256,g=0}function V(a){d=d&215|a&296,g&=128,f=f&-17|e&16,c=a&255}function W(b,c){var h=b+c;return d=d&128|h>>8&296,f&=-17,g=g&128|((h^b^c)>>8^e)&16,E=b+1,a.time+=7,h&65535}function X(){var c=a.get(b);return b=b+1&65535,a.time+=3,c}function Y(){var c=a.get16(b);return b=b+2&65535,a.time+=6,c}function Z(a){f&=-17,g=g&128|(a>>4^e)&16,d=256^a|d&128|c&40}function $(){d=d&-41|(c^=255)&40,g|=-129,f=f&-17|~e&16}function _(){var a=(e^f^g^g>>8)&16,b=0;(c|d&256)>153&&(b=352),(c&15|a)>9&&(b+=6),f=c|256,g&512?(c-=b,g=~b):c+=g=b,d=(e=c&=255)|b&256}function ab(a){var c=E=Y();a&&(b=c)}function bb(){E=b=b+(a.get(b)^128)-127&65535,a.time+=8}function cb(a){var c=E=Y();a&&(P(b),b=c)}function db(){E=b=a.get16(h),h=h+2&65535,a.time+=6}function eb(){D=!0;var b=a.time_limit-a.time+3>>2;b>0&&(b=a.halt(b,z|A),A=A+b&127,a.time+=4*b)}function fb(c){var d,e,f;a:for(;;){switch(c){case 221:case 253:break;case 243:C=0;break;case 251:C=3;break;default:Cb[c]();break a}e=c,c=a.m1(b,z|(A=A+1&127)),b=b+1&65535,a.time+=4;if(e&4&&(d=Db[c])){f=d(e==221?n:o),f!=null&&(e==221?n=f:o=f);break}}C&1&&a.int>=0&&a.time<a.time_limit&&jb()}function gb(){var c=Eb[a.m1(b,z|(A=A+1&127))];b=b+1&65535,a.time+=4,c&&c()}function hb(){var c,d;c=a.m1(b,z|(A=A+1&127)),b=b+1&65535,a.time+=4,d=c>>3&7;switch(c&192){case 0:Fb[c&7](d);break;case 64:Gb[c&7](d);break;case 128:Hb[c&7](1<<d);break;case 192:Ib[c&7](1<<d)}}function ib(e){var f,g,h,n;f=E=e+(a.get(b)^128)-128&65535,a.time+=3,g=a.get(b+1&65535),b=b+2&65535,a.time+=5,h=a.get(f),a.time+=4,n=g>>3&7;switch(g&192){case 0:h=Ab(n,h);break;case 64:Bb(n,h),d=d&-41|f>>8&40;return;case 128:h&=~(1<<n);break;case 192:h|=1<<n}a.put(f,h),a.time+=3;switch(g&7){case 0:i=h;break;case 1:j=h;break;case 2:k=h;break;case 3:l=h;break;case 4:m=m&255|h<<8;break;case 5:m=m&65280|h;break;case 7:c=h}}function jb(){var c=a.int,d;A=A+1&127,C=0,D=!1,a.time+=6,B?(P(b),d=56,B>1&&(d=a.get16(z&65280|c),a.time+=6),E=b=d):Cb[c]()}function kb(c){var d=a.get(b);return b=b+1&65535,a.time+=8,E=c+(d^128)-128&65535}function lb(c){var d=a.get(b);return b=b+1&65535,a.time+=8,d=a.get(E=c+(d^128)-128&65535),a.time+=3,d}function mb(b,c){var h=m+b+(d>>8&1^c);E=m+1,d=h>>8,f=m>>8,g=b>>8,m=h&=65535,e=h>>8|h<<8,a.time+=7}function nb(){var b=a.get(m)|c<<8;a.time+=7,U(c=c&240|b&15),a.put(m,b>>4&255),E=m+1,a.time+=3}function ob(){var b=a.get(m)<<4|c&15;a.time+=7,U(c=c&240|b>>8),a.put(m,b&255),E=m+1,a.time+=3}function pb(b){d=d&-256|(c=b),e=+!!b,f=g=C<<6&128,a.time++}function qb(){var b=i<<8|j,c=a.inp(b);return E=b+1,U(c),a.time+=4,c}function rb(b){var c=i<<8|j;E=c+1,a.out(c,b),a.time+=4}function sb(h,n){var o,p;p=a.get(o=m),m=o+h&65535,a.time+=3,a.put(o=k<<8|l,p),L(o+h&65535),a.time+=5,e&&(e=1),p+=c,d=d&-41|p&8|p<<4&32,p=0,--j<0&&(i=i-1&(j=255)),i|j&&(n&&(a.time+=5,E=(b=b-2&65535)+1),p=128),f=g=p}function tb(h,k){var l,n,o;o=c-(n=a.get(l=m))&255,E+=h,m=l+h&65535,a.time+=8,e=o&127|o>>7,g=~(n|128),f=c&127,--j<0&&(i=i-1&(j=255)),i|j&&(f|=128,g|=128,k&&o&&(E=(b=b-2&65535)+1,a.time+=5)),d=d&-256|o&-41,(o^n^c)&16&&o--,d|=o<<4&32|o&8}function ub(c){var h=c>>2,k,l,n;l=m+h&65535,k=i<<8|j,a.time++,c&1?(n=a.get(m),a.time+=3,k=k-256&65535,E=k+h,a.out(k,n),a.time+=4,h=l):(n=a.inp(k),a.time+=4,E=k+h,k=k-256&65535,a.put(m,n),a.time+=3,h+=k),h=(h&255)+n,m=l,i=k>>=8,c&2&&k&&(a.time+=5,b=b-2&65535);var o=h&7^k;d=k|(h&=256),f=(e=k)^128,o=4928640>>((o^o>>4)&15),g=(o^k)&128|h>>4|(n&128)<<2}function vb(){c=e=(d=(g=~c)+1)&255,f=0}function wb(){C|=C>>1,db()}function xb(){B=0}function yb(){B=1}function zb(){B=2}function Ab(a,b){switch(a){case 0:b=b*257>>7;break;case 1:b=b>>1|((b&1)+1^1)<<7;break;case 2:b=b<<1|d>>8&1;break;case 3:b=(b*513|d&256)>>1;break;case 4:b<<=1;break;case 5:b=(b*513+128^128)>>1;break;case 6:b=b<<1|1;break;case 7:b=b*513>>1}return f=256|(e=b=255&(d=b)),g=0,b}function Bb(a,b){d=d&-256|b&40|(b&=1<<a),f=~(e=b),g=0}this.env=a;var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E;b=z=A=B=C=0,h=n=o=m=y=65535,c=i=j=k=l=p=u=v=w=x=255,d=e=f=g=q=r=s=t=0,D=!1,this.getState=function(){var a={pc:b,a:c,f:F(),sp:h,bc:i<<8|j,de:k<<8|l,hl:m,ix:n,iy:o,bc_:u<<8|v,de_:w<<8|x,hl_:y,a_:p,r:I(),i:z>>8,im:B,iff:C,halted:D};return N(),a.f_=F(),N(),a},this.setState=function(a){"pc"in a&&(b=a.pc),"a"in a&&(c=a.a),"f"in a&&G(a.f),"sp"in a&&(h=a.sp),"bc"in a&&K(a.bc),"de"in a&&L(a.de),"hl"in a&&(m=a.hl),"ix"in a&&(n=a.ix),"iy"in a&&(o=a.iy),M(),N(),"bc_"in a&&K(a.bc_),"de_"in a&&L(a.de_),"hl_"in a&&(m=a.hl_),"a_"in a&&(c=a.a_),"f_"in a&&G(a.f_),M(),N(),"r"in a&&J(a.r),"i"in a&&(z=z&255|a.i<<8),"im"in a&&(B=a.im&3),"iff"in a&&(C=a.iff),"halted"in a&&(D=!!a.halted)},this.execute=function(){if(a.time>=a.time_limit)return;C&1&&a.int>=0&&jb();if(D)return eb();do{var c=a.m1(b,z|(A=A+1&127));b=b+1&65535,a.time+=4,Cb[c]()}while(a.time<a.time_limit)},this.nmi=function(){C&=2,D=!1,P(b),a.time+=4,b=102},this.reset=function(){D=!1,b=z=A=B=C=0};var Cb=[O,function(){var a=Y();i=a>>8,j=a&255},function(){var b=i<<8|j;E=b+1&255|c<<8,a.put(b,c),a.time+=3},function(){++j===256&&(i=i+1&255,j=0),a.time+=2},function(){i=S(i)},function(){i=T(i)},function(){i=X()},function(){V(c*257>>7)},N,function(){m=W(m,i<<8|j)},function(){var b=i<<8|j;E=b+1,c=a.get(b),a.time+=3},function(){--j<0&&(i=i-1&(j=255)),a.time+=2},function(){j=S(j)},function(){j=T(j)},function(){j=X()},function(){V(c>>1|((c&1)+1^1)<<7)},function(){var c,d;a.time++,d=a.get(c=b),c++,a.time+=3;if(i=i-1&255)a.time+=5,E=c+=(d^128)-128;b=c&65535},function(){var a=Y();k=a>>8,l=a&255},function(){var b=k<<8|l;E=b+1&255|c<<8,a.put(b,c),a.time+=3},function(){++l===256&&(k=k+1&255,l=0),a.time+=2},function(){k=S(k)},function(){k=T(k)},function(){k=X()},function(){V(c<<1|d>>8&1)},bb,function(){m=W(m,k<<8|l)},function(){var b=k<<8|l;E=b+1,c=a.get(b),a.time+=3},function(){--l<0&&(k=k-1&(l=255)),a.time+=2},function(){l=S(l)},function(){l=T(l)},function(){l=X()},function(){V((c*513|d&256)>>1)},function(){e?bb():X()},function(){m=Y()},function(){var b=Y();a.put(b,m&255),a.time+=3,a.put(E=b+1&65535,m>>8),a.time+=3},function(){m=m+1&65535,a.time+=2},function(){m=m&255|S(m>>8)<<8},function(){m=m&255|T(m>>8)<<8},function(){m=m&255|X()<<8},_,function(){e?X():bb()},function(){m=W(m,m)},function(){var b=Y();E=b+1,m=a.get16(b),a.time+=6},function(){m=m-1&65535,a.time+=2},function(){m=m&-256|S(m&255)},function(){m=m&-256|T(m&255)},function(){m=m&-256|X()},$,function(){d&256?X():bb()},function(){h=Y()},function(){var b=Y();E=b+1&255|c<<8,a.put(b,c),a.time+=3},function(){h=h+1&65535,a.time+=2},function(){var b=S(a.get(m));a.time+=4,a.put(m,b),a.time+=3},function(){var b=T(a.get(m));a.time+=4,a.put(m,b),a.time+=3},function(){a.put(m,X()),a.time+=3},function(){Z(0)},function(){d&256?bb():X()},function(){m=W(m,h)},function(){var b=Y();E=b+1,c=a.get(b),a.time+=3},function(){h=h-1&65535,a.time+=2},function(){c=S(c)},function(){c=T(c)},function(){c=X()},function(){Z(d&256)},O,function(){i=j},function(){i=k},function(){i=l},function(){i=m>>8},function(){i=m&255},function(){i=a.get(m),a.time+=3},function(){i=c},function(){j=i},O,function(){j=k},function(){j=l},function(){j=m>>8},function(){j=m&255},function(){j=a.get(m),a.time+=3},function(){j=c},function(){k=i},function(){k=j},O,function(){k=l},function(){k=m>>8},function(){k=m&255},function(){k=a.get(m),a.time+=3},function(){k=c},function(){l=i},function(){l=j},function(){l=k},O,function(){l=m>>8},function(){l=m&255},function(){l=a.get(m),a.time+=3},function(){l=c},function(){m=m&255|i<<8},function(){m=m&255|j<<8},function(){m=m&255|k<<8},function(){m=m&255|l<<8},O,function(){m=m&255|(m&255)<<8},function(){m=m&255|a.get(m)<<8,a.time+=3},function(){m=m&255|c<<8},function(){m=m&-256|i},function(){m=m&-256|j},function(){m=m&-256|k},function(){m=m&-256|l},function(){m=m&-256|m>>8},O,function(){m=m&-256|a.get(m),a.time+=3},function(){m=m&-256|c},function(){a.put(m,i),a.time+=3},function(){a.put(m,j),a.time+=3},function(){a.put(m,k),a.time+=3},function(){a.put(m,l),a.time+=3},function(){a.put(m,m>>8),a.time+=3},function(){a.put(m,m&255),a.time+=3},eb,function(){a.put(m,c),a.time+=3},function(){c=i},function(){c=j},function(){c=k},function(){c=l},function(){c=m>>8},function(){c=m&255},function(){c=a.get(m),a.time+=3},O,function(){c=e=(d=(f=c)+(g=i))&255},function(){c=e=(d=(f=c)+(g=j))&255},function(){c=e=(d=(f=c)+(g=k))&255},function(){c=e=(d=(f=c)+(g=l))&255},function(){c=e=(d=(f=c)+(g=m>>8))&255},function(){c=e=(d=(f=c)+(g=m&255))&255},function(){c=e=(d=(f=c)+(g=a.get(m)))&255,a.time+=3},function(){c=e=(d=2*(f=g=c))&255},function(){c=e=(d=(f=c)+(g=i)+(d>>8&1))&255},function(){c=e=(d=(f=c)+(g=j)+(d>>8&1))&255},function(){c=e=(d=(f=c)+(g=k)+(d>>8&1))&255},function(){c=e=(d=(f=c)+(g=l)+(d>>8&1))&255},function(){c=e=(d=(f=c)+(g=m>>8)+(d>>8&1))&255},function(){c=e=(d=(f=c)+(g=m&255)+(d>>8&1))&255},function(){c=e=(d=(f=c)+(g=a.get(m))+(d>>8&1))&255,a.time+=3},function(){c=e=(d=2*(f=g=c)+(d>>8&1))&255},function(){c=e=(d=(f=c)+(g=~i)+1)&255},function(){c=e=(d=(f=c)+(g=~j)+1)&255},function(){c=e=(d=(f=c)+(g=~k)+1)&255},function(){c=e=(d=(f=c)+(g=~l)+1)&255},function(){c=e=(d=(f=c)+(g=~(m>>8))+1)&255},function(){c=e=(d=(f=c)+(g=~(m&255))+1)&255},function(){c=e=(d=(f=c)+(g=~a.get(m))+1)&255,a.time+=3},function(){g=~(f=c),c=e=d=0},function(){c=e=(d=(f=c)+(g=~i)+(d>>8&1^1))&255},function(){c=e=(d=(f=c)+(g=~j)+(d>>8&1^1))&255},function(){c=e=(d=(f=c)+(g=~k)+(d>>8&1^1))&255},function(){c=e=(d=(f=c)+(g=~l)+(d>>8&1^1))&255},function(){c=e=(d=(f=c)+(g=~(m>>8))+(d>>8&1^1))&255},function(){c=e=(d=(f=c)+(g=~(m&255))+(d>>8&1^1))&255},function(){c=e=(d=(f=c)+(g=~a.get(m))+(d>>8&1^1))&255,a.time+=3},function(){g=~(f=c),c=e=(d=(d>>8&1^1)-1)&255},function(){f=~(c=d=e=c&i),g=0},function(){f=~(c=d=e=c&j),g=0},function(){f=~(c=d=e=c&k),g=0},function(){f=~(c=d=e=c&l),g=0},function(){f=~(c=d=e=c&m>>8),g=0},function(){f=~(c=d=e=c&m&255),g=0},function(){f=~(c=d=e=c&a.get(m)),g=0,a.time+=3},function(){f=~(d=e=c),g=0},function(){f=(c=d=e=c^i)|256,g=0},function(){f=(c=d=e=c^j)|256,g=0},function(){f=(c=d=e=c^k)|256,g=0},function(){f=(c=d=e=c^l)|256,g=0},function(){f=(c=d=e=c^m>>8)|256,g=0},function(){f=(c=d=e=c^m&255)|256,g=0},function(){f=(c=d=e=c^a.get(m))|256,g=0,a.time+=3},function(){c=d=e=g=0,f=256},function(){f=(c=d=e=c|i)|256,g=0},function(){f=(c=d=e=c|j)|256,g=0},function(){f=(c=d=e=c|k)|256,g=0},function(){f=(c=d=e=c|l)|256,g=0},function(){f=(c=d=e=c|m>>8)|256,g=0},function(){f=(c=d=e=c|m&255)|256,g=0},function(){f=(c=d=e=c|a.get(m))|256,g=0,a.time+=3},function(){f=(d=e=c)|256,g=0},function(){R(i)},function(){R(j)},function(){R(k)},function(){R(l)},function(){R(m>>8)},function(){R(m&255)},function(){R(a.get(m)),a.time+=3},function(){R(c)},function(){a.time++,e&&db()},function(){var a=Q();i=a>>8,j=a&255},function(){ab(e)},function(){E=b=Y()},function(){cb(e)},function(){P(i<<8|j)},function(){c=e=(d=(f=c)+(g=X()))&255},function(){P(b),E=b=0},function(){a.time++,e||db()},db,function(){ab(!e)},hb,function(){cb(!e)},function(){var a=Y();P(b),E=b=a},function(){c=e=(d=(f=c)+(g=X())+(d>>8&1))&255},function(){P(b),E=b=8},function(){a.time++,d&256||db()},function(){var a=Q();k=a>>8,l=a&255},function(){ab(!(d&256))},function(){var b=X()|c<<8;a.out(b,c),E=b+1&255|b&65280,a.time+=4},function(){cb(!(d&256))},function(){P(k<<8|l)},function(){c=e=(d=(f=c)+(g=~X())+1)&255},function(){P(b),E=b=16},function(){a.time++,d&256&&db()},M,function(){ab(d&256)},function(){var b=X()|c<<8;E=b+1,c=a.inp(b),a.time+=4},function(){cb(d&256)},function(){fb(221)},function(){c=e=(d=(f=c)+(g=~X())+(d>>8&1^1))&255},function(){P(b),E=b=24},function(){a.time++,F()&4^4&&db()},function(){m=Q()},function(){ab(F()&4^4)},function(){E=Q(),P(m),m=E,a.time+=2},function(){cb(F()&4^4)},function(){P(m)},function(){f=~(c=d=e=c&X()),g=0},function(){P(b),E=b=32},function(){a.time++,F()&4&&db()},function(){b=m},function(){ab(F()&4)},function(){var a=m;m=k<<8|l,k=a>>8,l=a&255},function(){cb(F()&4)},gb,function(){f=(c=d=e=c^X())|256,g=0},function(){P(b),E=b=40},function(){a.time++,d&128||db()},function(){H(Q())},function(){ab(!(d&128))},function(){fb(243)},function(){cb(!(d&128))},function(){P(c<<8|F())},function(){f=(c=d=e=c|X())|256,g=0},function(){P(b),E=b=48},function(){a.time++,d&128&&db()},function(){h=m,a.time+=2},function(){ab(d&128)},function(){fb(251)},function(){cb(d&128)},function(){fb(253)},function(){R(X())},function(){P(b),E=b=56}],Db=[,,,,,,,,,function(a){return W(a,i<<8|j)},,,,,,,,,,,,,,,,function(a){return W(a,k<<8|l)},,,,,,,,Y,function(b){var c=Y();a.put(c,b&255),a.time+=3,a.put(E=c+1&65535,b>>8),a.time+=3},function(b){return b=b+1&65535,a.time+=2,b},function(a){return a&255|S(a>>8)<<8},function(a){return a&255|T(a>>8)<<8},function(a){return a&255|X()<<8},,,function(a){return W(a,a)},function(b){var c=Y();return E=c+1,b=a.get16(c),a.time+=6,b},function(b){return b=b-1&65535,a.time+=2,b},function(a){return a&-256|S(a&255)},function(a){return a&-256|T(a&255)},function(a){return a&-256|X()},,,,,,function(b){var c=kb(b),d=S(a.get(c));a.time+=4,a.put(c,d),a.time+=3},function(b){var c=kb(b),d=T(a.get(c));a.time+=4,a.put(c,d),a.time+=3},function(b){var c,d=kb(b);a.time+=-5,c=X(),a.time+=2,a.put(d,c),a.time+=3},,,function(a){return W(a,h)},,,,,,,,,,,function(a){i=a>>8},function(a){i=a&255},function(a){i=lb(a)},,,,,,function(a){j=a>>8},function(a){j=a&255},function(a){j=lb(a)},,,,,,function(a){k=a>>8},function(a){k=a&255},function(a){k=lb(a)},,,,,,function(a){l=a>>8},function(a){l=a&255},function(a){l=lb(a)},,function(a){return a&255|i<<8},function(a){return a&255|j<<8},function(a){return a&255|k<<8},function(a){return a&255|l<<8},,function(a){return a&255|(a&255)<<8},function(a){m=m&255|lb(a)<<8},function(a){return a&255|c<<8},function(a){return a&-256|i},function(a){return a&-256|j},function(a){return a&-256|k},function(a){return a&-256|l},function(a){return a&-256|a>>8},,function(a){m=m&-256|lb(a)},function(a){return a&-256|c},function(b){a.put(kb(b),i),a.time+=3},function(b){a.put(kb(b),j),a.time+=3},function(b){a.put(kb(b),k),a.time+=3},function(b){a.put(kb(b),l),a.time+=3},function(b){a.put(kb(b),m>>8),a.time+=3},function(b){a.put(kb(b),m&255),a.time+=3},,function(b){a.put(kb(b),c),a.time+=3},,,,,function(a){c=a>>8},function(a){c=a&255},function(a){c=lb(a)},,,,,,function(a){c=e=(d=(f=c)+(g=a>>8))&255},function(a){c=e=(d=(f=c)+(g=a&255))&255},function(a){c=e=(d=(f=c)+(g=lb(a)))&255},,,,,,function(a){c=e=(d=(f=c)+(g=a>>8)+(d>>8&1))&255},function(a){c=e=(d=(f=c)+(g=a&255)+(d>>8&1))&255},function(a){c=e=(d=(f=c)+(g=lb(a))+(d>>8&1))&255},,,,,,function(a){c=e=(d=(f=c)+(g=~(a>>8))+1)&255},function(a){c=e=(d=(f=c)+(g=~(a&255))+1)&255},function(a){c=e=(d=(f=c)+(g=~lb(a))+1)&255},,,,,,function(a){c=e=(d=(f=c)+(g=~(a>>8))+(d>>8&1^1))&255},function(a){c=e=(d=(f=c)+(g=~(a&255))+(d>>8&1^1))&255},function(a){c=e=(d=(f=c)+(g=~lb(a))+(d>>8&1^1))&255},,,,,,function(a){f=~(c=d=e=c&a>>8),g=0},function(a){f=~(c=d=e=c&a&255),g=0},function(a){f=~(c=d=e=c&lb(a)),g=0},,,,,,function(a){f=(c=d=e=c^a>>8)|256,g=0},function(a){f=(c=d=e=c^a&255)|256,g=0},function(a){f=(c=d=e=c^lb(a))|256,g=0},,,,,,function(a){f=(c=d=e=c|a>>8)|256,g=0},function(a){f=(c=d=e=c|a&255)|256,g=0},function(a){f=(c=d=e=c|lb(a))|256,g=0},,,,,,function(a){R(a>>8)},function(a){R(a&255)},function(a){R(lb(a))},,,,,,,,,,,,,ib,,,,,,,,,,,,,,,,,,,,,,Q,,function(b){return E=Q(),P(b),a.time+=2,E},,P,,,,function(a){b=a},,,,,,,,,,,,,,,,function(b){h=b,a.time+=2}],Eb=[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(){i=qb()},function(){rb(i)},function(){mb(~(i<<8|j),1)},function(){var b=Y();a.put(b,j),a.time+=3,a.put(E=b+1&65535,i),a.time+=3},vb,wb,xb,function(){z=z&255|c<<8,a.time++},function(){j=qb()},function(){rb(j)},function(){mb(i<<8|j,0)},function(){var b=Y();E=b+1,b=a.get16(b),i=b>>8,j=b&255,a.time+=6},vb,wb,xb,function(){J(c),a.time++},function(){k=qb()},function(){rb(k)},function(){mb(~(k<<8|l),1)},function(){var b=Y();a.put(b,l),a.time+=3,a.put(E=b+1&65535,k),a.time+=3},vb,wb,yb,function(){pb(z>>8)},function(){l=qb()},function(){rb(l)},function(){mb(k<<8|l,0)},function(){var b=Y();E=b+1,b=a.get16(b),k=b>>8,l=b&255,a.time+=6},vb,wb,zb,function(){pb(I())},function(){m=m&255|qb()<<8},function(){rb(m>>8)},function(){mb(~m,1)},function(){var b=Y();a.put(b,m&255),a.time+=3,a.put(E=b+1&65535,m>>8),a.time+=3},vb,wb,xb,nb,function(){m=m&-256|qb()},function(){rb(m&255)},function(){mb(m,0)},function(){var b=Y();E=b+1,m=a.get16(b),a.time+=6},vb,wb,xb,ob,qb,function(){rb(0)},function(){mb(~h,1)},function(){var b=Y();a.put(b,h&255),a.time+=3,a.put(E=b+1&65535,h>>8),a.time+=3},vb,wb,yb,,function(){c=qb()},function(){rb(c)},function(){mb(h,0)},function(){var b=Y();E=b+1,h=a.get16(b),a.time+=6},vb,wb,zb,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(){sb(1,0)},function(){tb(1,0)},function(){ub(4)},function(){ub(5)},,,,,function(){sb(-1,0)},function(){tb(-1,0)},function(){ub(-4)},function(){ub(-3)},,,,,function(){sb(1,1)},function(){tb(1,1)},function(){ub(6)},function(){ub(7)},,,,,function(){sb(-1,1)},function(){tb(-1,1)},function(){ub(-2)},function(){ub(-1)}],Fb=[function(a){i=Ab(a,i)},function(a){j=Ab(a,j)},function(a){k=Ab(a,k)},function(a){l=Ab(a,l)},function(a){m=m&255|Ab(a,m>>8)<<8},function(a){m=m&-256|Ab(a,m&255)},function(b){var c=Ab(b,a.get(m));a.time+=4,a.put(m,c),a.time+=3},function(a){c=Ab(a,c)}],Gb=[function(a){Bb(a,i)},function(a){Bb(a,j)},function(a){Bb(a,k)},function(a){Bb(a,l)},function(a){Bb(a,m>>8)},function(a){Bb(a,m&255)},function(b){Bb(b,a.get(m)),d=d&-41|E>>8&40,a.time+=4},function(a){Bb(a,c)}],Hb=[function(a){i&=~a},function(a){j&=~a},function(a){k&=~a},function(a){l&=~a},function(a){m&=~(a<<8)},function(a){m&=~a},function(b){var c=a.get(m)&~b;a.time+=4,a.put(m,c),a.time+=3},function(a){c&=~a}],Ib=[function(a){i|=a},function(a){j|=a},function(a){k|=a},function(a){l|=a},function(a){m|=a<<8},function(a){m|=a},function(b){var c=a.get(m)|b;a.time+=4,a.put(m,c),a.time+=3},function(a){c|=a}]}function Spectrum(){function c(c){o=a.rom48k,e=69888,f=-14335,g=224;if(b=!!c)o=a.rom128[1],e=70908,f=-14361,g=228;h=191*g+126}function d(a,b,c,d,e){do a[b++]=c[d++]|0;while(--e)}function i(b){T||Z(),I=0,H=0,K=A*Y,J=A*(z+32+z)+z-1;var c=-g*A-4*z+4;N=-z,O=-A,M=c,b?(a.int=255,a.time_limit=f+32,a.cpu.execute(),a.int=-1,a.time_limit=f+e,a.cpu.execute()):a.time+=e,L(a.time);if(P!=Q){var d=M;R(a.time),d==c&&(Q=P)}a.time-=e,F&&db(F)}function u(b){t=b,m=n[b&7],q=226|b<<3&8,r=n[5|b>>2&2],j=b&16?p||o:a.rom128[0]}function w(b){b+=a.time;if(b<0||b>=h)return;b%=g,b<126&&(b=6-(b&7))>0&&(a.time+=b)}function x(b){var c,d,e=v;if(e+b<=0)return;c=h-e;if(c<0)return;c%=g;if(c>126){b-=c-126;if(b<=0)return;e=6,d=15}else{d=c>>3,c&=7;if(c==7){c--;if(!--b)return}e=c}b=b-1>>1,d<b&&(b=d),a.time+=e+6*b}function y(b){var c=a.time-v;c>0&&x(c),q&1<<(b>>14)?(v=a.time,x(2+((b&1)<<1)),v=a.time+4):(b&1||w(1),v=99999)}function L(a){if(a<H)return;var b=I,c=b-(b&255|b>>3&768|6144),d=H,e=J,f=K,h=1<<(b>>5&7|b>>8&24);do{var i=r[b-c]<<8|r[b++];i>32767&&(i^=E),G[++e]!==i&&(X(e,f,i),F|=h);var i=r[b-c]<<8|r[b++];i>32767&&(i^=E),G[++e]!==i&&(X(e,f,i),F|=h),d+=8;if(b&31)continue;d+=g-128,e+=2*z,f+=Y,b+=224,c+=256;if(b&1792)continue;b-=2016,c-=2048,h<<=1;if(b&224)continue;c+=1792,b+=1792;if(b>=6144){d=99999;break}}while(a>=d);I=b,H=d,J=e,K=f}function R(a){var b=M;if(a<b)return;Q=-1;var c=N,d=O,e=Y*(d+A),f=z+(z+32+z)*A+(z+32+z)*d+c,h=P<<11;do{G[f]!==h&&(X(f,e,h),F=-1),f++,b+=4;if(!++c&&d>=0&&d<192){f+=c=32,b+=128;continue}if(c<32+z)continue;c=-z;if(++d==8*(24+A)){b=99999;break}b+=g-4*(z+32+z),e+=Y}while(b<=a);N=c,O=d,M=b}function Z(){var a=S,b=V,c=b*C;a.createImageData?T=a.createImageData(B,c):window.ImageData?T=new ImageData(B,c):T=a.getImageData(0,0,B,c),U=T.data;for(var d=3;d<U.length;d+=4)U[d]=255;W=[[0,13178133,2171338,13313739,2935596,13421615,3526093,13487565,0,16456475,2697724,16527356,3669303,16711227,4325375,16777215],[65793,13637399,2302929,13773010,3068718,13882162,3658964,13948116,65793,16718876,2829311,16724479,3800889,16777022,4521983,16777215,0,12719124,2039747,12788675,2737193,12961069,3327429,13027014,0,15997209,2500343,16264440,3471924,16513848,4128253,16711422]][--b],Y=b*4*B,U.buffer&&(Y=b*B,U=new Uint32Array(U.buffer),b+=2),X=[$,ab,_,bb][b]}function $(a,b,c){G[a]=c,a*=32;var d=U,e=c>>11,f;f=W[e&15],e=W[c>>8&7|e&8]^f,c^=c>>1&127;do c&128&&(f^=e),c<<=1,d[a]=f&255,d[a+1]=f>>8&255,d[a+2]=f>>16;while((a+=4)&31)}function _(a,b,c){G[a]=c,a*=8;var d=U,e=c>>11,f,g;f=W[e&15]|-1<<24,g=W[c>>8&7|e&8]|-1<<24;do d[a++]=c&128?g:f,c<<=1;while(a&7)}function ab(a,b,c){G[a]=c,b+=a*32;var d=U,e,f,g,h=c>>11;f=h&15,h=c>>8&7|h&8,e=W[f],g=W[h]^e,f=W[f+16],h=W[h+16]^f,c^=c>>1&127;do c&128&&(e^=g,f^=h),c<<=1,d[b]=e&255,d[b+1]=e>>8&255,d[b+2]=e>>16,d[b+4*B]=f&255,d[b+4*B+1]=f>>8&255,d[b+4*B+2]=f>>16;while((b+=4)&31)}function bb(a,b,c){G[a]=c,b+=a*8;var d=U,e,f,g,h=c>>11;f=h&15,h=c>>8&7|h&8,e=W[f],g=W[h]^e,f=W[f+16],h=W[h+16]^f,e|=-1<<24,f|=-1<<24,c^=c>>1&127;do c&128&&(e^=g,f^=h),c<<=1,d[b]=e,d[b+B]=f;while(++b&7)}function cb(){T||Z();var a,b,c=0,d=0;for(b=0;b<192+2*A;b++){for(a=0;a<32+2*z;a++,c++)X(c,d,G[c]);d+=Y}db(-1)}function db(a){function h(a){var b=0;return a>65535&&(a>>=b=16),a>255&&(a>>=8,b+=8),a>15&&(a>>=4,b+=4),b+(-21936>>2*a&3)}var b=S,c=b.canvas,d=c.width-B>>1,e=c.height-V*C>>1;F=0;if(a<0)return b.putImageData(T,d,e);var f=h(a),g=h(a^a-1);b.putImageData(T,d,e,z*8,V*(8*g+A),256,V*8*(f-g+1))}function ob(a,b){var c=hb*b/fb,d=jb;ib[d]+=c,ib[d+1]+=b-c,a=hb-gb*a;while(a<0)a+=fb,d++;hb=a,jb=d}function pb(a){var b=s,c=b&16?b&8?nb:mb:0;ob(a-kb,c-lb),kb=a,lb=c}var a=this;a.cpu=new Z80(a),a.devs=[],a.keyboard=[255,255,255,255,255,255,255,255];var b=!1;a.init=function(){n=[];for(var b=0;b<8;b++)n[b]=bytes(16384);c(!1),j=rom=o,k=n[5],l=n[2],m=n[0],q=226,r=k,a.time=f,G=[],b=B*C/8;do G[--b]=0;while(b);S&&cb()},a.reset=function(){var c=a.time,d=a.devs,e=d.length,f,g;for(f=0;f<e;f++)g=d[f],g.reset&&g.reset(c);a.cpu.reset(),P=0,u(b?0:48)},a.canvas=function(a,b){T=null,S=a.getContext("2d"),V=b||1,G&&cb()},a.getState=function(c){var e=a.cpu.getState(),f=n;return e.pFE=s,e.border=P,c&&(f=bytes(49152),d(f,0,k,0,16384),d(f,16384,l,0,16384),d(f,32768,m,0,16384)),e.ram=f,p&&(e.rom=p),e.p7FFD=t,e.model=+b,e},a.setState=function(b){var e=b.pFE,f,g,h;e!=null&&(s=e),e=b.border,e!=null&&(s=s&248|e),P=s&7;if(e=b.ram){h=e.length;if(h>8)d(k,0,e,0,16384),d(l,0,e,16384,16384),d(m,0,e,32768,16384);else while(h)(g=e[--h])&&d(n[h],0,g,0,16384)}"rom"in b&&(p=b.rom),e=b.model,f=b.p7FFD,f!=+f&&(f=t),e!=null&&(c(e),e||(g=m,k!=g&&l!=g&&(m=n[0],n[0]=g),f=48)),u(f),S&&i(0),a.cpu.setState(b)};var e,f,g,h;a.frame=function(b){if(!n&&b)throw"not initialized";--D||(D=16,E^=255);var c=a.time;for(var d=0,f=a.devs,g=f.length;d<g;d++){var h=f[d];h.frame&&h.frame(e,c,b)}i(b);if(eb){var j=ib,k=new Float32Array(eb.hz/50+16|0);j&&(pb(e+c),eb.play(j.subarray(0,jb)),k[0]=j[jb],k[1]=j[jb+1]),ib=k,fb=50*e,kb=c,jb=0}};var j,k,l,m,n,o,p,q,r;a.time=a.time_limit=0,a.m1=function(b,c){var d,e;b<32768?b<16384?(d=j,e=1):(d=k,e=2):b<49152?(d=l,e=4):(d=m,e=8);var f=a.time-v;return f>0&&x(f),v=99999,q&e&&w(0),q&1<<(c>>14)&&(v=a.time+4),d[b&16383]},a.get=function(b){var c,d;b<32768?b<16384?(c=j,d=1):(c=k,d=2):b<49152?(c=l,d=4):(c=m,d=8);var e=a.time-v;return e>0&&x(e),v=99999,q&d&&(w(0),v=a.time+3),c[b&16383]},a.put=function(b,c){var d,e=q;b<32768?b<16384?(d=j,e&=17):(d=k,e&=34):b<49152?(d=l,e&=68):(d=m,e&=136);var f=a.time-v;f>0&&x(f),v=99999;if(!e)return;e&15&&(w(0),v=a.time+3),b&=16383;if(d[b]===c)return;b<6912&&d===r&&L(a.time),d[b]=c},a.get16=function(b){var c=b&16383;if(c==16383){var d=a.get(b);return a.time+=3,d|=a.get(b+1&65535)<<8,a.time-=3,d}var e,f;b<32768?b<16384?(e=j,f=1):(e=k,f=2):b<49152?(e=l,f=4):(e=m,f=8);var g=a.time-v;return g>0&&x(g),v=99999,q&f&&(w(0),w(3),v=a.time+6),e[c]|e[c+1]<<8};var s,t=48;a.inp=function(b){y(b);var c=65535,d=a.time,e=a.devs,f=e.length,h,i,j,k;for(j=0;j<f;j++)k=e[j],(b&k.imask)==k.iport&&(c&=k.inp(b,d));if(c<256)return c;h=255;if(!(b&1)){h=s<<2|191;if(i=b>>8^255)for(j=0;;j++){i&1&&(h&=a.keyboard[j]);if(!(i>>=1))break}}else if(qb&&(b&32770)==32768)h=qb.reg[qb.idx];else if(d>=0){var l,m=d/g;d%=g,m<192&&d<124&&!(d&4)&&(l=d>>1&1|d>>2,d&1?l+=6144|m<<2&992:l+=m&6144|m<<2&224|m<<8&1792,h=r[l])}return c&(h|c>>8^255)},a.out=function(b,c){y(b);var d=a.time,e=a.devs,f=e.length,g;for(g=0;g<f;g++){var h=e[g];(b&h.omask)==h.oport&&h.out(b,c,d)}if(!(b&1)){var i=c&7;i!=P&&(R(d),P=i),(s^c)&24&&ib&&pb(d),s=c}if(!(b&2))if(b<32768){if(t&32)return;(t^c)&8&&L(d),u(c)}else qb&&(b&16384?ay_idx=c&15:ay_write(ay_idx,c))},a.halt=function(a,b){return a};var v,z=4,A=28,B=8*(z+32+z),C=A+192+A;a.dim=[B,C];var D=16,E=0,F=0,G,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=-1,S,T,U,V,W,X,Y,eb,fb,gb,hb=0,ib,jb,kb,lb=0,mb,nb;a.audio=function(a){eb=a,gb=a.hz},(a.volume=function(a){a*=a,nb=a,mb=.94*a})(.5);var qb;a.command=function(b){function d(a,b){[,k,l,m][a>>14][a&16383]=b}function e(a,b){d(a,b&255),d(a+1,b>>8)}function f(a,b,c,e){while(e-->0)d(a++,b[c++])}var c=a.rom48k;u(t|16);var g={i:63,border:7,rom:null},h=16384;do d(h++,0);while(h<22528);do d(h++,56);while(h<23296);do d(h++,0);while(h<65536);e(23732,--h),h-=167,f(h,c,15880,168),e(23675,h--),d(23608,64),e(23730,h),e(23606,15360),d(h--,62),g.sp=h,e(23613,h-2),g.iy=23610,g.im=1,g.iff=3,e(23631,23734),f(23734,c,5551,21),h=23754,e(23639,h++),e(23635,h),e(23627,h),d(h++,128),e(23641,h);for(var i=0;i<b.length;i++)d(h++,b.charCodeAt(i));e(h,32781),h+=2,e(23649,h),e(23651,h),e(23653,h),d(23693,56),d(23695,56),d(23624,56),e(23561,1315),d(23552,255),d(23556,255),f(23568,c,5574,14),e(23688,6177),d(23659,2),e(23656,23698),d(23611,12),g.pc=4788,a.setState(g)}}function get_audio(){function g(a,d,g,h){var i=0,j,k;do j=g[i++],k=e+j,e=b*k,f=c*(f+k-e),j=f,a[d++]=j;while(--h)}function h(){if(!this.webkitAudioContext)return;d=48e3;var a,h,i=[];return a=new webkitAudioContext,h=a.createJavaScriptNode(2048,0,1),h.onaudioprocess=function(a){var d=a.outputBuffer.getChannelData(0),h=0,j=d.length,k,l,m;while(k=i.shift())if(l=k.length){j<l&&i.unshift(k.subarray(l=j)),g(d,h,k,l),h+=l,j-=l;if(!j)break}if(j)do m=e,e*=b,f=c*(f+m-e),d[h++]=f;while(--j);k=a.outputBuffer.getChannelData(1);if(k)for(j=d.length;j--;)k[j]=d[j]},h.connect(a.destination),console.log(h),function(a){i.length>9&&i.shift(),i.push(a)}}function i(){var a=new Audio;if(!a.mozSetup)return;return a.mozSetup(1,d=22050),function(b){g(b,0,b,b.length),a.mozWriteAudio(b)}}var a=h()||i();if(!a)throw"No audio";var b=Math.pow(2,-35e5/(700*d)),c=Math.pow(2,-35e5/(23256*d)),d,e=0,f=0;return{hz:d,play:a}}function load_snapshot(a,b,c){function f(b,c){return c=c||g,c(b!=+b?b:a.ram[b],0,16384)}function g(a,b,c){return function(){do a[b]=t();while(++b<c);return[]}}function h(){return o({bc:13,de:11,hl:9,ix:17,iy:15,bc_:5,de_:3,hl_:1,a:22,f:21,a_:8,f_:7,sp:23,i:0,r:20}),a.im=e[25],a.iff=e[19]?3:0,a.halted=0,a.border=e[26]&7,a.p7FFD=48,[f(5),f(2),f(0),i]}function i(){function d(b){return[,a.ram[5],a.ram[2],a.ram[0]][b>>14][b&16383]}var b=u();if(b>0)return[g(e=[],0,4),j];if(b){var c=a.sp;a.pc=d(c)|d(c+1)<<8,a.sp=c+2&65535}return b}function j(){o({pc:0}),a.model=1,a.p7FFD=c=e[2];if(c&=7)e=a.ram[0],a.ram[0]=a.ram[c],a.ram[c]=e;var b=[];for(var c=0;c<8;c++)c!=2&&c!=5&&c!=(a.p7FFD&7)&&b.push(f(c));return b}function k(){o({a:0,f:1,bc:2,hl:4,pc:6,sp:8,i:10,de:13,bc_:15,de_:17,hl_:19,a_:21,f_:22,iy:23,ix:25});var b=e[12];b==255&&(b=1),a.r=e[11]&127|b<<7&128,a.im=e[29],a.iff=!!e[27]|!!e[28]<<1,a.halted=0,a.border=b>>1&7,a.p7FFD=48,a.joystick=[[35,20,36,28,4],"kempston",[35,27,19,11,3],[36,28,20,12,4]][e[29]>>6];if(!a.pc)return[g(e,30,32),l];if(b&32)var c=p();return[f(5,c),f(2,c),f(0,c)]}function l(){var b=e[30]|e[31]<<8,c=32+b;if(e.length<c)return[g(e,32,c),l];o({pc:32}),e[34]>(b<24?2:3)&&(a.model=1,a.p7FFD=e[35]);a:if(b>=73&&e[29]>>6==2){for(var d=[],f=0;f<10;f+=2){var h=e[63+f],i=e[64+f];if(h>7||i>31||!i||i-1&i)break a;i=i<8?i>>1:16+i>>3,d.push(h|i<<3)}a.joystick=d}return[m]}function m(){var a=u();return a>0?[g(e=[],0,3),n]:a}function n(){var b=e[0]|e[1]<<8,c=e[2],d=[[,2,0,,,5],[0,1,2,3,4,5,6,7]][a.model|0][c-3];d!=+d&&(d=bytes(16384),c||(a.rom=d));if(b<65535)var g=p();return[f(d,g),m]}function o(b){for(var c in b){var d=b[c];a[c]=e[d],c.match(/.[a-z]/)&&(a[c]|=e[d+1]<<8)}}function p(){var a,b=0;return function(c,d,e){return function(){a:for(;;)switch(b){case 0:for(;;){a=t(),c[d]=a;if(a===237)break;if(++d===e)break a}b=-1;case-1:a=t();if(a!==237){b=1;if(++d===e)break a;break}b=-2;case-2:a=t(),b=-3;case-3:var f=t();if(!a)break;b=a,a=f;default:do{c[d]=a,--b;if(++d===e)break a}while(b)}return[]}}}function q(){var b=e.length;while(b<16384&&(b&b-1||u()!=s))e.push(t()),b++;while(e.length<16384)e=e.concat(e);return a.rom=e,a.pc=a.im=a.iff=a.halted=0,a.p7FFD=48,[]}function r(){function f(a,e){do c[b[d]>>3&7]++,d+=e;while(--a)}var b=a.ram[5],c=[0,0,0,0,0,0,0,0],d=6911,e;f(63,-1),f(22,-32),f(31,1),f(22,32);for(d=e=0;d<8;d++)c[d]>c[e]&&(e=d);return a.halted=1,a.iff=0,a.border=e,a.p7FFD=48,[]}function t(){var a=b.data,c=b.data.length,d=b.pos;if(d>=c)throw s;return b.pos=d+1,a.charCodeAt?a.charCodeAt(d)&255:a[d]}function u(){return b.data.length-b.pos||(b.eof?s:0)}var d,e=[];b.pos|=0;switch(c){case"sna":d=[h,g(e,0,27)];break;case"z80":d=[k,g(e,0,30)];break;case"rom":d=[q];break;case"scr":d=[r,g(a.ram[5],0,6912)];break;default:throw"Unknown format"}var s=[];return function(){try{var a;while(a=d.pop()){var c=a();if(!c)break;d=d.concat(c.reverse())}}catch(e){if(e!==s)throw e;if(b.eof)throw"Unexpected end of file"}if(a)return d.push(a)}}function gen_snap_z80(a){function c(c){for(var d in c){var e=c[d];b[e]=a[d]&255,d.match(/.[a-z]/)&&(b[e+1]=a[d]>>8)}}function h(b,c){i(b,a.ram[c],0)}function i(a,b,c){var f=c+16384,g="",h,i,j;do{h=b[c],i=1;while(b[++c]===h&&i<255)i++;j=d(h);if(i>4||h==237&&i>1)g+="\u00ed\u00ed"+d(i)+j;else{do g+=j;while(--i);h==237&&c<f&&(g+=d(b[c++]))}}while(c<f);i=g.length,e+=d(i&255,i>>8,a)+g}var b=[];c({a:0,f:1,bc:2,hl:4,pc:32,sp:8,i:10,r:11,de:13,bc_:15,de_:17,hl_:19,a_:21,f_:22,iy:23,ix:25}),b[12]=a.r>>7&1|a.border<<1|32,b[27]=a.iff&1,b[28]=a.iff&2,b[29]=a.im|80,b[30]=23,b[34]=a.model?3:0,b[35]=a.p7FFD,b[37]=3,b.length=32+b[30];var d=String.fromCharCode,e=d.apply(0,b);if(a.model){var f,g=5|a.p7FFD>>2&2;h(g+3,g);for(f=0;f<8;f++)f!=g&&h(f+3,f)}else h(8,5),h(4,2),h(5,0);return(b=a.rom)&&i(0,b,0),e}function $c(a,b,c){var d=a.className,e,f;d==null&&(d=(a=$(a)).className),d=d.split(" "),c="+-"[+(c!=null&&!c)];do b=b.match(/([-+])?(\S+)\s*(.*)/),f=b[1]||c,e=d.indexOf(b[2]),e<0?f=="-"||d.push(b[2]):f=="+"||d.splice(e,1);while(b=b[3]);return a.className=d.join(" "),a}function $m(a,b){var c=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.oMatchesSelector||a.msMatchesSelector;return c?c.call(a,b):$$(b).indexOf(a)>=0}function intoView(a){if(a.scrollIntoViewIfNeeded)return a.scrollIntoViewIfNeeded();var b=document,c=b.activeElement;c==a?c.blur():(a.focus(),b.activeElement!=a&&(a.tabIndex=-1,a.focus(),delete a.tabIndex,a.removeAttribute("tabindex"))),c.focus()}function script(a,b){var c=$("head"),d=c.appendChild($e("script"));d.onload=function(){c.removeChild(d),b&&b()},d.src=a}function request(a,b,c){function i(){k(1,e.statusText||"Error")}function j(){a.type=a.type||e.getResponseHeader("Content-Type");if(g)a.data=e.responseText;else{var b=e.response;b&&(a.data=new Uint8Array(b))}}function k(b,d){a.eof=f.e=1,f.t=f.b=b,ui.progress(f),d&&(a.data=null,ui.msg(d)),c&&c(a)}var d,e,f,g;b=b||{};if(d=a.file){a.type||(a.type=d.type),a.name||(a.name=d.name),e=new FileReader,e.readAsBinaryString(d),e.onloadend=function(b){a.data=e.result,a.eof=1,c(a)};return}if(f=a.url.match(/data:([^,;]+)(;base64)?,(.*)/i))try{a.type=f[1],a.data=f[2]?atob(f[3]):f[3].replace(/%[0-9a-f]{2}/gi,function(a){return String.fromCharCode("0x"+a.substr(1))})}catch(h){ui.msg(h)}finally{a.eof=1,setTimeout(c,0,a);return}e=new XMLHttpRequest,f={},g=b.text||e.overrideMimeType,e.onload=function(){if(e.status&&e.status!=200)return i();j(),k(a.data.length)},e.onerror=i,e.onabort=function(){c=null,k(0)},e.onprogress=function(b){if(e.status&&e.status!=200)return e.abort(),e.onerror();f.b=b.loaded,f.t=b.total
,b.lengthComputable||(f.t=f.b+16384),j(),ui.progress(f),c(a)};try{ui.progress(b.color||"gray"),ui.progress(f),e.open("GET",a.url),g?b.text||e.overrideMimeType("text/plain; charset=x-user-defined"):e.responseType=b.text?"text":"arraybuffer",b.acc&&e.setRequestHeader("Accept",b.acc),e.send()}catch(h){k(1,h.message);return}return e}emu=function(){function h(a){g(function(d){if(b.length)return c=0;if(d<a)return h(a);i(),d<a+41&&(d=a),h(d+20)})}function i(){var b=a.loading;d.frame(!b),(b||a.tape)&&k()}function k(){function o(f){c.ix=i,c.de=j,c.hl=h<<8|g,c.a=k,f>=0&&(n=f,c.pc=l(c),a.loading=null),c.f=n,d.setState(c),b.pos=e}function p(a){var c=b.data;return(c.charCodeAt?c.charCodeAt(a):c[a])&255}var b=a.loading,c,e;if(!b){c=d.cpu.getState();if(c.iff&1)return;var f=c.pc;if(f<1387||f>1540)return;c=d.getState(1);if(!(c.p7FFD&16))return;f>=1507&&(f=l(c),f==1510&&(f=l(c)));if(f<1387||f>1422)return;a.loading=b=a.tape,c.a=c.a_,c.f=c.f_,b.blk|=0,b.eof&&b.data.length<=b.blk&&(b.blk=0),e=b.blk+2;if(b.data.length<e){if(!b.eof)return;return c.pc=l(c),o(64)}b.blk=e+(p(e-2)|p(e-1)<<8),c.hl&=255}else c=d.getState(1),e=b.pos;var g=c.hl&255,h=c.hl>>8&255,i=c.ix,j=c.de,k=c.a,n=c.f;for(;;){if(e==b.blk)return o(64);if(e==b.data.length){if(b.eof)return o(64);break}g=p(e++),h^=g;if(!j)return o(+((k=h)<1));if(!(n&64)){k^=g;if(k)return o(0);n|=64;continue}if(n&1)i>=16384&&(c.ram[i-16384]=g);else{k=m(c,i)^g;if(k)return o(0)}i=i+1&65535,j--}return o(-1)}function l(a){var b=a.sp;return a.sp=b+2&65535,m(a,b)|m(a,b+1&65535)<<8}function m(a,b){return b<16384?d.rom48k[b]:a.ram[b-16384]}function o(b,c,d){d&&n[b]&&n[b].abort(),n[b]=c;if(c)switch(b){case"tape":a.loading=null;break;case"snap":a.stop(b,0)}}function p(a,b){var c;a=a.toLowerCase();if(b)c=a.match(/\S\.(\w{3})$/),a=c&&c[1];else{c=a.match(/^(application|image)\/(x\.zx\.|x-spectrum-)([-.a-z0-9]+)/),a=c&&c[3];if(a&&c[1][0]=="i"&&a!="scr")return}if(a&&~["rom","sna","z80","tap","scr"].indexOf(a))return a;if(a=="slt")return"z80"}var a={},b=["load"],c,d;a.init=function(b){a.zx=d=new Spectrum,d.rom48k=b.shift(),d.rom128=b,d.init();try{d.audio(get_audio()),a.has_audio=1}catch(c){ui.msg(c)}};var e=[],f=[,,,18247,,,,,17476,20303,,,,1542,,,0,3855,3855,,,,,,,,,17219,,,,,1799,,,,,25443,23644,21588,25700,,,,,,,,1028,771,2827,4883,6939,8995,9252,7196,5140,3084,,34957,,38542,,,,257,10023,6168,4369,4626,6425,8481,9766,5397,7710,5654,3598,5911,7967,3341,1285,514,6682,2313,8738,7453,8224,2570,4112,9509,2056,0,3855,,,,,,,,,,,,,,42919,38550,,40606,,41120,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34957,38542,39583,33950,41623,39072,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34204];a.kbd=function(a,b,c){var g,h=d.keyboard;for(g=0;g<8;g++)h[g]=255;if(a==null){e.length=0;return}a:{for(g=0;g<e.length;g++)if(a==e[g]){c||e.splice(g,1);break a}c&&e.push(a)}for(g=0;g<e.length;g++){var i=f[e[g]];if(i==null)continue;b&1&&(i>>=8),i&=255;switch(i>>6){case 1:h[0]&=254,h[7]|=2;break;case 2:h[7]&=253,h[0]|=1}h[i&7]&=~(1<<(i>>3&7))}},a.stop=function(a,d){var e=b,f=e.indexOf(a);if(d){if(~f)return;!e.length&&!g&&clearInterval(c),e.push(a)}else{if(d==null)return f>=0;if(f<0)return;e.splice(f,1);if(e.length)return;g?c||(c=1,h()):c=setInterval(i,20)}};var g=window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame,j;a.canvas=function(a,b){var c=d.dim,e=1+(b>=2*c[1]);e!=j&&(j=e,a.width=c[0],a.height=e*c[1]),d.canvas(a,e)},a.reset=function(){d.setState({rom:null}),d.reset()};var n={};return a.load=function(b,c,d){function k(){ui.progress("#0D1"),a.tape={data:c.data,pos:0},h=function(){a.tape.data=c.data},i=function(){a.tape.eof=1}}typeof c=="string"?c={url:c}:window.File&&c instanceof File&&(c={file:c,name:c.name,type:c.type}),console.log("load",c.url&&c.url.substr(0,222),b);var e,f,g,h,i,j;b=="tape"&&k(),j=request(c,{},function(c){if(!c.data){o(b);return}if(!h){c.type&&(e=p(c.type)),e||(e=p(c.name||c.url,1)),console.log(c.type,e);switch(e){case"rom":case"sna":case"z80":case"scr":ui.progress(e!="rom"?"#06F":"#D04"),a.stop("snap",1),f=a.zx.getState(),f={ram:f.ram,rom:null},h=load_snapshot(f,c,e),i=function(){a.stop("snap",0)};break;case"tap":b=="snap"&&(o(b="tape",j,1),a.zx.command('\u00ef""'),o("snap"),k())}}if(h)try{var g=1;h(),g=c.eof}finally{g&&(o(b),i()),f&&(a.zx.setState(f),d&&d(f))}}),o(b,j,1)},a.getType=p,a}(),!function(a){function j(a,b){$$(a).forEach(function(a){$c(a,"active",b),a.checked=b})}function k(a){var b;(b=a.model)!=null&&j(".c-128",b),(b=a.mute)!=null&&(j(".c-mute",b),$c("body","mute",b)),(b=a.volume)!=null&&($("#vol>*>*").style.width=100*b+"%")}function l(a){emu.zx.setState(a);var b,c;(b=a.volume)!=null&&(h=b,c=1),(b=a.mute)!=null&&(i=b,c=1),c&&emu.zx.volume(i?0:h),k(a)}function n(a){$c("body","-anim")}function o(){var a=m&3,b=emu.zx.dim,c=innerWidth,g=innerHeight,h=c,i=g,j,k,l,n,o;a&&(c=c*15>>4,g=g*15>>4,o=i-g>>2),j=b[0]*g,k=b[1]*c,j>k?g=k/b[0]|0:c=j/b[1]|0,l=h-c>>1,n=i-g>>1;var p=e.w,q=f.w;k=h-48;switch(a){case 1:p>k&&(p=k),j=p+o,l<j&&(l=j);break;case 2:q>k&&(q=k),j=h-c-q-o,l>j&&(l=j);break;case 3:k>>=1,p>k&&(p=k),q>k&&(q=k)}var r=d.style;r.width=c+"px",r.height=g+"px",r.left=l+"px",r.top=n+"px",r=e.e.style,r.left=(a&1?0:-e.w)+"px",r.width=p+"px",r=f.e.style,r.right=(a&2?0:-f.w)+"px",r.width=q+"px",emu.canvas(d,g)}function q(a){p=b.activeElement;if($m(a.target,"#vol,#vol *"))return M(a)}function r(c){var d=c.target,e=d.className;if(e){e=e.match(/\bc-(\S+)/);if(e&&!d.disabled)return void a.cmd(e[1])}if($m(d,".tabv>button")){d.focus();return}if($m(d,"#vol,#vol *"))return M(c);d=b.activeElement,X(c,p!=d&&"click+focus"),p=d}function v(b){if(s)return s(b);var c=t,d=[b.clientX,b.clientY],e=b.type=="mousemove",f,h,i;return t=d,e||(f=y(b)),c&&!(h=d[0]-c[0])&&!(i=d[1]-c[1])?f:($c("body","+move"),clearTimeout(u),u=g(function(){$c("body","-move");if(!c)return;var d=b.target;if($m(d,".tabv>button"))return d.focus();if(X(b,"hover"))return;if(c[1]<32||innerHeight-c[1]<33)return;h<=0&&c[0]<32&&a.show(1,1),h>=0&&innerWidth-c[0]<33&&a.show(2,2)},200),f)}function w(b){var e=b.target,f=b.keyCode,g;if(!(e!=d&&!c||L(b)!==!1))return;g={19:"pause",113:"remember",114:"restore",116:"update",121:"mute"}[f],g&&b.preventDefault();if(b.type!="keydown")return;if(g)return void a.cmd(g);f==120&&a.show(3,m&3?0:3),f==27&&d.focus(),f==46&&b.ctrlKey&&(emu.kbd(),a.cmd("reset"));if((f>32&&f<35&&!m||e.id=="vol")&&M(b))return;if(e.nodeName=="BUTTON"){switch(f){case 37:g="previousElementSibling";break;case 39:g="nextElementSibling";break;case 40:g=e.dataset.down,g&&$("#"+g).focus();default:return}do e=e[g];while(e&&e.hidden);e&&e.nodeName=="BUTTON"&&e.focus()}X(b)}function x(c){var e=c.type=="focus",f=c.target;if(f==d){if(e)return void a.show(3,0);emu.kbd(),g(function(){b.activeElement!=f&&!m&&a.show(3,3)});return}if(!e)return;$m(f,"#l *")&&a.show(1,1),$m(f,"#r *")&&a.show(2,2),$m(f,".tabv>button")&&N(f)}function y(b){var c=b.target,d=b.type,e=b.dataTransfer,f;e.dropEffect="copy",b.preventDefault();if(d!="drop")return!1;if(!(f=e.files)||!(f=f[0])){f=e.getData("URL");if(!f)return}a.load(f)}function z(a){var b=a.target,c=a.dataTransfer;if(b!=d)return X(a);if(a.type=="dragstart"){K(c);var e=$e("canvas"),f=$e("img"),g=emu.zx.dim,h;e.height=h=g[1]>>1,e.width=g=g[0]>>1,e.getContext("2d").drawImage(d,0,0,d.width,d.height,0,0,g,h),f.src=e.toDataURL(),c.setDragImage(f,g>>1,h>>1)}return!0}function B(){var b=[],c=[],d;location.hash.substr(1).split("#").forEach(function(a){if(!a)return;var d,e="l",f;if(d=a.match(/^([^=]+)=(.*)/))e=d[1],a=d[2];f=b.indexOf(e),f<0&&(f=b.push(e)-1),c[f]=decodeURIComponent(a)});for(d in A){var e=b.indexOf(d),f=A[d],g=null;~e&&(g=c[e],delete b[e]),f.v!=g&&f.f(f.v=g)}b.forEach(function(b){a.msg("Not recognized argument "+b)})}function D(b){$("h1").onclick=function(){a.cmd("update")},b.onupdateready=function(){C=1,b.swapCache(),$c("body","+update"),a.msg("Update available. Reload")}}function E(){function d(){var b=$e("canvas"),d=b.getContext("2d"),e,f,g;b.width=e=c.width,b.height=f=c.height,d.drawImage(c,0,0),emu.stop("user")&&(d.scale(e/16,f/16),d.fillStyle="#FFF",d.fillRect(9,9,7,7),d.fillStyle="#33C",d.fillRect(10,10,2,5),d.fillRect(13,10,2,5)),a=(g=a).cloneNode(1),a.type="image/png",a.href=b.toDataURL(),g.parentNode.replaceChild(a,g)}var a=b.querySelector("link[rel~=icon]"),c=new Image;c.src=a.href,c.onload=function(){(E=d)()}}function F(b){var c=localStorage,d;if(c&&(d=c[b]))try{c.removeItem(b),d=JSON.parse(d),emu.stop("user")^d.pause&&a.cmd("pause"),l(d)}catch(e){a.msg(e)}return onunload=function(){var a=emu.zx.getState();a.pause=emu.stop("user"),a.volume=h,a.mute=i,c[b]=JSON.stringify(a)},d}function G(){var a=S("snaps"),b=[],c=a.o.slice(),d;for(d in localStorage)/^zx\/./.test(d)&&b.push(d.substr(3));b.sort(),b=b.filter(function(a){var b=c.indexOf(a);if(b<0)return 1;delete c[b]}),c.forEach(function(b,c){V(a,c)}),b.forEach(function(b){U(a,b,b)}),a.act=H}function H(b,c,d){switch(b){case"click":case"drag":var e=this.o[c],f=localStorage["zx/"+e];if(!f)return;if(b=="drag")return K(d,e,f);f[0]=="{"?l(JSON.parse(f)):a.load(f);break;case"sel":$$(".c-svsna,.c-rmsna,.c-restore").forEach(function(a){a.disabled=c<0}),c>=0&&intoView(this.e[c]);break;case"del":if(!(c>=0))break;delete localStorage["zx/"+this.o[c]],V(this,c)}}function I(){var b=new Date,c,d,e,f,g;c=[b.getMonth()+1,b.getDate(),b.getHours(),b.getMinutes()].reduce(function(a,b,c){return a+"-- :"[c]+("0"+b).substr(-2)},b.getFullYear()),e=R.snaps;for(g=0,d=c;;d=c+" ("+ ++g+")"){f=e.o.indexOf(d);if(f<0||f==e.sel)break}try{localStorage["zx/"+d]=J()}catch(h){return a.msg(h)}(f=e.sel)<0?$c(e.e[f=U(e,d,d)],"+sel"):e.e[f].firstChild.textContent=e.o[f]=d,e.act("sel",e.sel=f)}function J(a){return"data:application/x.zx.z80;base64,"+btoa(gen_snap_z80(a||emu.zx.getState()))}function K(a,b,c,d,e){c=c||J(),a.setData("URL",c);if(!d){d=c.match(/^data:([^,;]+)/);if(!d)return;d=d[1]}e=e||emu.getType(d);if(!e)return;b=(b||"snapshot")+"."+e,a.setData("DownloadURL",d+":"+b.replace(/:/,"")+":"+c)}function L(b){var c=b.keyCode,d=b.type;if(c>=112&&c<=123||c==19)return;b.preventDefault();if(c==32&&emu.stop("user"))return a.cmd("pause");d!="keypress"&&emu.kbd(c,b.shiftKey+2*(b.ctrlKey|b.altKey|b.metaKey),d!="keyup")}function M(a){function j(a){var b=$("#vol>*").getBoundingClientRect();k((a-b.left)/b.width)}function k(a){l({volume:a<0?0:a>1?1:a})}var b=a.type,c=h,d,e=a.clientX,f,i;switch(a.type){case"keydown":i={33:1,34:-1,39:1,37:-1}[a.keyCode],i&&(k(c+.1*i),d=1);break;case"mousedown":i=$("#vol>*>*>*").getBoundingClientRect(),e-=i.left;if(e<0||e>=i.width)return;f=e-i.width/2,s=function(a){j(a.clientX-f),d=1},onmouseup=function(a){d&&(i=onclick,onclick=null,g(function(){onclick=i})),s(a),s=onmouseup=null};break;case"click":j(e)}return d}function N(a){[].forEach.call(a.parentNode.children,function(b){var c=b.getAttribute("data-for"),d=b==a;$c(b,"active",d),b.tabIndex=d-1,c&&($("#"+c).style.visibility=d?"visible":"hidden")})}function O(){var a,b=[].map.call($("#games").querySelectorAll("a"),function(a){return{name:a.textContent,url:a.href}});a=S("games"),a.act=Q,b.map(function(b){U(a,b.name,b)})}function P(c,d){var e=S(c),f="application/json",g;e.rq&&e.rq.abort();if(d==null)return;e.act=Q,g=$e("a"),g.href=d,e.rq=request({url:g.href},{text:1,acc:f,color:"#EC0"},function(c){function l(){if(h==f){d=JSON.parse(i);if(!d.forEach)throw"Not a table"}else h=="text/html"?(d=$e("div"),d.innerHTML=i,d=[].map.call(d.querySelectorAll("a"),function(a){return{name:a.textContent,url:a.href}})):d=i.split(/\n+/).map(function(a){return{url:a}}),d=d.filter(function(a){if(a.url)return a.name||(a.name=a.url.replace(/.*\//,"")),a})}var d,h=c.type,i=c.data,j=$e("base");if(!c.eof)return;delete e.rq,e.ul.innerHTML="";if(!i)return;j.href=c.url,b.head.insertBefore(j,b.head.firstChild);try{l(),d.forEach(function(a){var b=a.name,c=a.url;b&&c&&U(e,b+"",{url:(g.href=c,g.href)})})}catch(k){a.msg(k)}b.head.removeChild(j)}),e.ul.innerHTML="\u2652"}function Q(b,c){b=="click"&&a.load(this.o[c].url)}function S(a){var b=R[a];return b.e=[],b.o=[],b.sel=-1,b.ul.innerHTML="",b}function T(a,b){b>=0&&intoView(a.e[b]),a.e.forEach(function(a,c){$c(a,"sel",c==b)}),a.act("sel",a.sel=b)}function U(a,b,c){var d=$e("li"),e=d.appendChild($e("a"));return e.textContent=b,a.ul.appendChild(d),a.e.push(d),e.draggable=!0,a.o.push(c)-1}function V(a,b){a.ul.removeChild(a.e[b]),a.e.splice(b,1),a.o.splice(b,1);var c=a.sel;b>c&&c--,(c<a.e.length||~--c)&&T(a,c)}function W(a){var b,c,d,e;$m(a,".ls>li>a")?a=(b=(c=a).parentNode).parentNode:$m(a,".ls>li")&&(a=a.parentNode);for(e in R)if((d=R[e]).ul==a)return{l:d,i:d.e.indexOf(b),e:b,a:c}}function X(a,b){var c=W(a.target),d,e,f;if(!c)return;d=c.l,e=c.i,f=d.sel;switch(b||a.type){case"click":f=e;case"click+focus":e>=0&&!(a.which>1)&&d.act("click",e);break;case"hover":e>=0&&(f=e);break;case"keydown":switch(a.keyCode){case 38:f>0&&f--;break;case 40:f+1<d.e.length&&f++;break;case 13:f>=0&&d.act("click",f);break;case 46:return d.act("del",f),1;case 27:f=-1;break;default:d.act("key",-1,a);return}a.preventDefault();break;case"dragstart":if((f=e)<0)break;d.act("drag",e,a.dataTransfer)}return d.sel!=f&&T(d,f),1}var b=document,c=/\bembed\b/.test(b.body.className),d=$("#scr"),e={e:$("#l"),w:256},f={e:$("#r"),w:272},g=setTimeout;a.init=function(){(onresize=o)(),onclick=r,onmousemove=ondragenter=ondragover=ondragleave=v,onmousedown=q,onkeydown=onkeypress=onkeyup=w,addEventListener("focus",x,1),addEventListener("blur",x,1),ondrop=y,ondragstart=ondrag=ondragend=z,c||(O(),F("qaop-current-state")||a.msg("F9 - menu"),N($(".tabv>*")),a.show(3,3)),g(function(){a.show(3,0)}),emu.stop("load",0);var e="files"in $("input[type=file]"),f=emu.has_audio;$c("body",f?"+audio":"+noaudio"),$$(".c-pause,.c-reset,.c-128,.c-remember"+(e?",.c-open":"")+(f?",#vol,.c-mute":"")).forEach(function(a){a.disabled=0}),g(function(){$("#pp").hidden=!1},999),d.ondblclick=function(b){a.cmd("pause")},d.draggable=!0,g(onhashchange=B),(onstorage=G)(),b.body.removeChild($("#splash"));var h=window.applicationCache;h&&D(h),onmessage=function(b){var c=b.data,d;if(c==c+""){d=c.match(/^([^ ]+) ([^ ]+)/);if(!d)a.cmd(b.data);else switch(d[1]){case"load":a.load(d[2])}}}};var h=.5,i=0;a.cmd=function(c){function k(){return h=R.snaps}switch(c){case"pause":var d=!emu.stop("user");emu.stop("user",d),$c(b.body,"pause",d),j(".c-pause",d),E();break;case"reset":emu.reset();break;case"open":var e=$("input[type=file]");e.onchange=function(){var b=e.files[0];b&&a.load(b),e.value=""},e.click();break;case"128":l({model:!emu.zx.getState().model});break;case"mute":l({mute:!i});break;case"remember":I();break;case"restore":k().act("click",h.sel);break;case"rmsna":k().act("del",h.sel);break;case"svsna":var f=localStorage["zx/"+k().o[h.sel]];f.match(/^data:/)&&(location.href=f);break;case"update":var g=window.applicationCache;if(g&&!C)switch(g.status){case 1:g.update();case 2:case 3:return}location.reload()}var h},a.load=function(a){emu.load("snap",a,k)};var m;a.show=function(a,e){c&&(e&=-4);var f=m&~a^e;if(f==m)return f;var g=b.body;return(m^f)&3&&$c(g,"anim",m!=null),$c(g,"full",!(f&3)),m=f,$("#pause").style.display=f&1?"none":"",o(),f&3?d.blur():d.focus(),f},addEventListener("transitionend",n,0),addEventListener("webkitTransitionEnd",n,0),addEventListener("oTransitionEnd",n,0),addEventListener("msTransitionEnd",n,0);var p,s,t,u,A={u:{f:function(a){var b=$("[data-for=userg]");b.hidden=!a,b.style.display=a?"":"none",P("user",a||null),a&&b.focus()}},l:{f:function(b){b&&a.load(b)}},m:{f:function(a){a&&l({model:!/^48k?$|^0$/i.test(a)})}}},C,R={games:{ul:$("#games")},snaps:{ul:$("#snaps")},user:{ul:$("#userg")}}}(ui);
