Fixed old, longstanding, and surprisingly bad bug in cleanMemory() for all machine implementations

This commit is contained in:
Jeff Parsons 2017-07-12 21:02:30 -07:00 • committed by Jeff Parsons
commit ec438be5c9
24 changed files with 145 additions and 128 deletions

View file

@ -172,10 +172,10 @@ function Gd(a,b,c,d){var e=8>=a.ua?8:16,f=8<e?15:0,g=a.W.length/e,h=!1===d,m={M:
(x&15)*b,(x>>4)*c)}return m}k.ca=function(a,b){return b||!a||this.restore(a)?!0:!1};k.ba=function(a){return!a||this.save()};k.save=function(){var a=new E(this);a.set(0,[]);return a.data()};k.restore=function(){return!0};
k.Ga=function(){var a=!1;if(this.a){if(this.a.Ga){a="100%";if(screen&&screen.width&&screen.height){var b=screen.width/screen.height,c=this.A/this.s;b>c&&(a=Math.round(c/b*100)+"%")}this.Da?(this.o.style.width=a,this.o.style.width=a,this.o.style.display="block",this.o.style.margin="auto"):(this.a.style.width=a,this.a.style.height="auto");this.a.style.backgroundColor="black";this.a.Ga();a=!0}this.J&&this.J.focus()}return a};
function xd(a,b){!b&&a.a&&(a.Da?a.o.style.width=a.o.style.height="":a.a.style.width=a.a.style.height="")}function zd(a,b){a.La=b;a.N=!1;if(void 0===a.g||a.g.length!=a.La)a.g=Array(a.La)}function Kd(a,b,c,d,e){d=a.b?(b.height-c-1)*b.width+d:c+d*b.width;e&&a.P==Bd&&(208<=c&&236>c?e=a.O+Cd:28<=c&&72>c&&(e=a.O+Dd));a=a.I[e];d*=a.length;b.data[d]=a[0];b.data[d+1]=a[1];b.data[d+2]=a[2];b.data[d+3]=a[3]}
function dc(a,b){var c=!0;if(!b){a.ha&&(120==a.ha?a.Na&1?(Bc(a.m,2),c=!1):Bc(a.m,1):Bc(a.m,4));if(c&&a.N&&a.v){for(var d=a.u,e=a.v,f=!0,g=a.da>>>d.b;0<e&&g<d.a.length;)d.a[g].ja&&(d.a[g].ja=f=!1,d.a[g].Zb=!0),e-=d.c,g++;f&&(c=!1)}$b(a.m,a.Pa,1E3/Math.max(a.Oa,a.ha));a.Na++}if(c)if(1<a.M)switch(a.P){case Ed:for(var c=a.da,d=-1,e=0,f=60==a.bc?2:5,h=g=0,m=-1;e<a.R;){var q=0,x=c,w=d,L=a.C;for(w!=Fd&&(L>>=1);;){var z=sb(a.u,x++);if((z&Ld)==Ld){var v=sb(a.u,x++),d=v&Md,c=(v&Nd)<<8|sb(a.u,x),c=c+(v&Od?Pd:
Qd);break}if(q<L)a.X[q++]=z;else break}if(f)f--;else{for(;q<a.X.length;)a.X[q++]=0;if(0<=w)for(x=a.N&&a.g[g]==L,a.g[g++]=L,L=0;L<q;L++){z=a.X[L];if(!x||z!==a.g[g]){a.g[m=g]=z;var v=a,F=a.ma,U=z&127;if(z=v.H[w][z&128?1:0]){var Z=(U&15)*z.M,U=(U>>4)*z.L,da,xa,Wa,qb,hd=z.M,ec=z.L;F?(da=L*v.M,xa=e*v.L,Wa=v.M,qb=v.L):(da=L*v.va,xa=e*v.wa,Wa=v.va,qb=v.wa);z.M>v.M&&(da*=2,Wa*=2);z.L>v.L&&(w==Jd&&(U+=v.L),ec=v.L);F?F.drawImage(z.canvas,Z,U,hd,ec,da,xa,Wa,qb):(da+=0,xa+=0,v.c.drawImage(z.canvas,Z,U,hd,ec,
da,xa,Wa,qb))}h++}g++}e++}}a.N=!0;!b&&a.na&&1==h&&(a.g[m]=-1,h=0);a.na=!1;(h||b)&&a.ma&&a.c.drawImage(a.l,0,a.la,a.j,a.B-a.L,0,0,a.kb,a.jc)}else{e=a.da;f=e+a.v;m=h=g=0;b=a.j;q=0;c=a.B;w=d=0;x=a.ea;L=(1<<x)-1;a.Tc&&(x=-x,w=16+x);for(;e<f;){v=a.u;F=e;z=F&v.f;Z=(F&v.g)>>>v.b;v=z!=v.f?v.a[Z].ec(z,F):v.a[Z++].fb(z,F)|v.a[Z&v.o].fb(0,F+1)<<8;if(a.N&&v===a.g[g])h+=a.Ma;else{a.g[g]=v;(F=w)&&(v=v>>8|(v&255)<<8);h<b&&(b=h);for(z=a.Ma;z--;)Z=v>>F&L,Kd(a,a.Ea,h++,m,Z),F+=x;h>q&&(q=h);m<c&&(c=m);m>=d&&(d=m+1)}e+=
2;g++;if(h>=a.j&&(h=0,m++,m>a.B))break}a.N=!0;b<a.j&&(e=q-b,d-=c,a.b&&(f=b,g=e,b=c,e=d,c=a.j-(f+g),d=g),a.ma.putImageData(a.Ea,0,0,b,c,e,d),a.c.drawImage(a.l,0,0,a.l.width,a.l.height,0,0,a.A,a.s))}}var Cd=0,Dd=1,Ad=2,wd=0,Bd=1,Ed=2,vd={SI1978:Bd,VT100:Ed},Fd=96,Hd=64,Id=32,Jd=0,Ld=127,Nd=15,Od=16,Md=96,Pd=8192,Qd=16384;
function dc(a,b){var c=!0;if(!b){a.ha&&(120==a.ha?a.Na&1?(Bc(a.m,2),c=!1):Bc(a.m,1):Bc(a.m,4));if(c&&a.N&&a.v){for(var d=a.u,e=a.da,f=a.v,g=!0,h=e>>>d.b,e=d.c-(e&d.f);0<f&&h<d.a.length;)d.a[h].ja&&(d.a[h].ja=g=!1,d.a[h].Zb=!0),f-=e,e=d.c,h++;g&&(c=!1)}$b(a.m,a.Pa,1E3/Math.max(a.Oa,a.ha));a.Na++}if(c)if(1<a.M)switch(a.P){case Ed:for(var c=a.da,d=-1,f=0,g=60==a.bc?2:5,e=h=0,m=-1;f<a.R;){var q=0,x=c,w=d,L=a.C;for(w!=Fd&&(L>>=1);;){var z=sb(a.u,x++);if((z&Ld)==Ld){var v=sb(a.u,x++),d=v&Md,c=(v&Nd)<<8|
sb(a.u,x),c=c+(v&Od?Pd:Qd);break}if(q<L)a.X[q++]=z;else break}if(g)g--;else{for(;q<a.X.length;)a.X[q++]=0;if(0<=w)for(x=a.N&&a.g[h]==L,a.g[h++]=L,L=0;L<q;L++){z=a.X[L];if(!x||z!==a.g[h]){a.g[m=h]=z;var v=a,F=a.ma,U=z&127;if(z=v.H[w][z&128?1:0]){var Z=(U&15)*z.M,U=(U>>4)*z.L,da,xa,Wa,qb,hd=z.M,ec=z.L;F?(da=L*v.M,xa=f*v.L,Wa=v.M,qb=v.L):(da=L*v.va,xa=f*v.wa,Wa=v.va,qb=v.wa);z.M>v.M&&(da*=2,Wa*=2);z.L>v.L&&(w==Jd&&(U+=v.L),ec=v.L);F?F.drawImage(z.canvas,Z,U,hd,ec,da,xa,Wa,qb):(da+=0,xa+=0,v.c.drawImage(z.canvas,
Z,U,hd,ec,da,xa,Wa,qb))}e++}h++}f++}}a.N=!0;!b&&a.na&&1==e&&(a.g[m]=-1,e=0);a.na=!1;(e||b)&&a.ma&&a.c.drawImage(a.l,0,a.la,a.j,a.B-a.L,0,0,a.kb,a.jc)}else{f=a.da;g=f+a.v;m=e=h=0;b=a.j;q=0;c=a.B;w=d=0;x=a.ea;L=(1<<x)-1;a.Tc&&(x=-x,w=16+x);for(;f<g;){v=a.u;F=f;z=F&v.f;Z=(F&v.g)>>>v.b;v=z!=v.f?v.a[Z].ec(z,F):v.a[Z++].fb(z,F)|v.a[Z&v.o].fb(0,F+1)<<8;if(a.N&&v===a.g[h])e+=a.Ma;else{a.g[h]=v;(F=w)&&(v=v>>8|(v&255)<<8);e<b&&(b=e);for(z=a.Ma;z--;)Z=v>>F&L,Kd(a,a.Ea,e++,m,Z),F+=x;e>q&&(q=e);m<c&&(c=m);m>=
d&&(d=m+1)}f+=2;h++;if(e>=a.j&&(e=0,m++,m>a.B))break}a.N=!0;b<a.j&&(f=q-b,d-=c,a.b&&(g=b,h=f,b=c,f=d,c=a.j-(g+h),d=h),a.ma.putImageData(a.Ea,0,0,b,c,f,d),a.c.drawImage(a.l,0,0,a.l.width,a.l.height,0,0,a.A,a.s))}}var Cd=0,Dd=1,Ad=2,wd=0,Bd=1,Ed=2,vd={SI1978:Bd,VT100:Ed},Fd=96,Hd=64,Id=32,Jd=0,Ld=127,Nd=15,Od=16,Md=96,Pd=8192,Qd=16384;
Fa(function(){for(var a=y(document,"pc8080","video"),b=0;b<a.length;b++){var c=a[b],d=A(c),e=document.createElement("canvas");if(!e||!e.getContext){c.innerHTML="<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=(window?window.navigator.userAgent:"").indexOf("MSIE")&&(c.onresize=function(a,b,c,d){return function(){b.style.height=
(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());var f=+(d.aspect||Ca("aspect"));f&&.3<=f&&3.33>=f&&(Ea("onresize",function(a,b,c){return function(){b.style.height=(a.clientWidth/c|0)+"px"}}(c,e,f)),window.onresize());c.appendChild(e);f=document.createElement("textarea");Ba("iOS")&&(f.setAttribute("autocapitalize","off"),f.setAttribute("autocorrect","off"),f.style.fontSize="16px");c.appendChild(f);var g=e.getContext("2d"),d=new ud(d,e,g,f,c);Ta(d,c)}});
function Rd(a){t.call(this,"SerialPort",a);this.H=+a.adapter;switch(this.H){case 0:this.I=0;this.O=2;break;default:r("Unrecognized serial adapter #"+this.H);return}this.b=this.c=null;this.J=a.tabSize;this.F=a.charBOL;this.f=0;this.B=!1;this.l=!0;var b=a.binding;if("console"==b)this.c="";else{var c;a=Sd;b&&(void 0===c&&(c="Panel"),(c=Xa(c,this.id))&&(b=c.w[b])&&this.S(null,a,b))}this.g="";this.a=this.Aa=this.s=null;this.exports={connect:this.ac,receiveData:this.nb,receiveStatus:this.Kd}}l(Rd,t);