Fixed an old annoying bug where a restored video card wouldn't properly display a blinking cursor; originally, I assumed it was a CRTC register restoration bug, but actually, some supporting variables (eg, cBlinks) were not getting initialized in both the reset() and restore() code paths. This is also a good time to remember that when an uninitialized array from some hardware state gets serialized and deserialized to/from JSON, the array is restored as a series of "null" values, not as "undefined" values, so it's best for any code checking for undefined values to use "== null" rather than "=== undefined".

This commit is contained in:
Jeff Parsons 2017-06-26 08:56:17 -07:00 committed by Jeff Parsons
commit ed75397b83
10 changed files with 58 additions and 36 deletions

View file

@ -97,7 +97,7 @@ function dc(a,b,c){if(!(b&a.C||!c||c&a.C)){for(var d=b>>>a.B;0<c;){var e=a.X[d];
function Zb(a,b,c,d,e){for(var f=0,g=b>>>a.B;0<c&&g<a.X.length;){var h=d[f++];if(!h)break;if(void 0!==e){var l=new u(b),m=l,q=e,y=a.Ea;m.id=h.id|1;m.xe=h.xe;m.size=h.size;q&&(m.type=q,m.H=q==fc);rb?(m.L=h.L,m.K=h.K,m.Fa=h.Fa,m.rd=h.rd,m.T=h.T,bc(m,gc?hc:ic)):(m.T=h.T,bc(m,jc));Rb(m,y,h);h=l}a.X[g++]=h;c-=a.A}}k.Eb=function(a){return this.X[(a&this.D)>>>this.B].mc(a&this.C,a)};function kc(a,b){var c=b&a.C,d=(b&a.D)>>>a.B;return c!=a.C?a.X[d].cf(c,b):a.X[d++].Ad(c,b)|a.X[d&a.L].Ad(0,b+1)<<8}
k.Dc=function(a,b){this.X[(a&this.D)>>>this.B].nc(a&this.C,b&255,a)};function lc(a,b,c){var d=b&a.C,e=(b&a.D)>>>a.B;d!=a.C?a.X[e].wh(d,c&65535,b):(a.X[e++].jf(d,c&255,b),a.X[e&a.L].jf(0,c>>8&255,b+1))}
function mc(a,b){var c=0,d=[],e=!a.G&&a.W==a.D;e||Sb(a,!0);for(var f=0;f<a.H;f++){var g=a.X[f];if(b&&g.type!=fc||g.Da||g.oi){d[c++]=f;var h=c++;if(g=g.save()){for(var l=0,m=0,q=[];l<g.length;){for(var y=g[l],w=l+1;w<g.length&&g[w]===y;)w++;q[m++]=w-l;q[m++]=y;l=w}q.length<g.length&&(g=q)}d[h]=g}}e||Sb(a,!1);d[c]=e;return d}
function nc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var f=a,g=+e+d,h=c[e].bind(b);if(h)for(var l=+e+d;l<=g;l++)void 0!==f.I[l]?r("Input port "+oa(l,4,!0)+" already registered"):f.I[l]=[h,!1]}}function oc(a,b,c,d){for(var e=0,f=0;0<c;){var g=a.I[b],h=a.M[b]||1,l=1==h?255:2==h?65535:-1,m=l;void 0!==g&&g[0]&&(m=g[0](b,d),void 0===m?m=l:m&=l);e|=m<<f;f+=h<<3;b+=h;c-=h}return e}
function nc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var f=a,g=+e+d,h=c[e].bind(b);if(h)for(var l=+e+d;l<=g;l++)void 0!==f.I[l]?r("Input port "+oa(l,4,!0)+" already registered"):f.I[l]=[h,!1]}}function oc(a,b,c,d){for(var e=0,f=0;0<c;){var g=a.I[b],h=a.M[b]||1,l=1==h?255:2==h?65535:-1,m=l;void 0!==g&&g[0]&&(m=g[0](b,d),null==m?m=l:m&=l);e|=m<<f;f+=h<<3;b+=h;c-=h}return e}
function qc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var f=a,g=+e+d,h=c[e].bind(b);if(h)for(var l=+e+d;l<=g;l++)void 0!==f.J[l]?r("Output port "+oa(l,4,!0)+" already registered"):f.J[l]=[h,!1]}}function rc(a,b,c,d,e){for(var f=0;0<c;){var g=a.J[b],h=a.O[b]||1,l=1==h?255:2==h?65535:-1,l=(d>>>=f)&l;if(void 0!==g&&g[0])g[0](b,l,e);f+=h<<3;b+=h;c-=h}}function Ub(a,b,c,d,e){b="Memory block error ("+b+": "+oa(c)+","+oa(d)+")";e?a.Ea?a.Ea.message(b):a.log(b):r(b);return!1}
var Fb,sc={Fj:20,count:8,Ho:1,type:3},tc=0,uc;for(uc in sc){var vc=sc[uc];sc[uc]={sg:(1<<vc)-1<<tc,shift:tc};tc+=vc}Fb=sc;var Vb=1,Yb=2,ac=3,cc=4,ec=5,wc;if(rb){var xc=new ArrayBuffer(2);(new DataView(xc)).setUint16(0,256,!0);wc=256===(new Uint16Array(xc))[0]}else wc=!1;var gc=wc;
function u(a,b,c,d,e,f){this.id=yc+=2;this.T=null;this.G=0;this.ee=a;this.xe=b;this.size=c||0;this.type=d||zc;this.H=d==fc;this.controller=null;this.F=f;Rb(this);this.Da=this.oi=!1;if(c)if(e)this.controller=e,a=e.ui(a),this.T=a[0],this.G=a[1],bc(this,e.rg());else if(rb)this.L=new ArrayBuffer(c),this.K=new DataView(this.L,0,c),this.Fa=new Uint8Array(this.L,0,c),this.rd=new Uint16Array(this.L,0,c>>1),this.T=new Int32Array(this.L,0,c>>2),bc(this,gc?hc:ic);else{this.T=Array(c>>2);for(e=0;e<this.T.length;e++)this.T[e]=
@ -521,13 +521,13 @@ function Yp(a,b){!b&&a.M&&(a.Hc?a.O.style.width=a.O.style.height="":a.M.style.wi
function jq(a,b){var c=a.D;c&&!a.dc&&(c.addEventListener("touchstart",function(b){nq(a,b,!0)},!1),c.addEventListener("touchmove",function(b){nq(a,b)},!0),c.addEventListener("touchend",function(b){nq(a,b,!1)},!1),a.dc=b,a.bb=a.ib=a.Tc=-1,a.Wb=!1,a.sb=null,a.Vb=!1,a.nd=function(){a.Vb=!0;a.K.ie(oq,!0)})}k.Tf=function(a){this.C&&this.C.Tf(a)};
function nq(a,b,c){var d,e,f=0,g=0;d=a.O;do isNaN(d.offsetLeft)||(f+=d.offsetLeft,g+=d.offsetTop);while(d=d.offsetParent);var h=a.X/a.O.offsetWidth,l=a.ja/a.O.offsetHeight;b.targetTouches&&b.targetTouches.length?(d=b.targetTouches[0].pageX,e=b.targetTouches[0].pageY):(d=b.pageX,e=b.pageY);d=(d-f)*h;e=(e-g)*l;if(a.dc==lq)c&&mo(a.C,pq[e/(a.ja/3)|0][d/(a.X/3)|0],!0);else if(a.K){g=a.Wb;f=b.timeStamp-a.Tc;!0===c?(a.Wb=500<f,a.Tc=b.timeStamp,a.sb=setTimeout(a.nd,500)):null!=a.sb&&(clearTimeout(a.sb),a.sb=
null);void 0===c&&(a.Wb=!1);g||b.preventDefault();if(!1===c){a.Vb?(a.K.ie(oq,!1),a.Vb=!1,b=!0):b=!1;if(b)return;if(200>f){a.K.ie(oq,!0);a.K.ie(oq,!1);return}}if(c||0>a.bb||0>a.ib)a.bb=d,a.ib=e;c=Math.round(d-a.bb);b=Math.round(e-a.ib);a.bb=d;a.ib=e;a.K.tg(c,b,a.bb,a.ib)}}k.Ob=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};k.Nb=function(a){return a?this.save():!0};
k.reset=function(){var a=!0,b=0;this.V&&(b=+gk(this.V,zj,void 0));this.ba||(this.Ma=b==hk?cq:$p);this.ca=qq;switch(this.Ma){case Un:b=7;break;case Sn:var c=rq[this.qb];c&&(b=c[0]);b||(b=4);break;case cq:b=hk;this.ca=sq;break;default:b=2}this.ea!==b&&(this.ea=b,a=!0);this.B=null;this.W=this.Bb=new bp(this,cq);this.I=this.rb=new bp(this,$p);this.Ma<Sn?this.A=new bp:(this.A=new bp(this,this.Ma,null,this.Wc),tq(this));uq(this);this.qa=null;this.ya=this.Z=-1;this.ua=0;vq(this,this.ca);if(this.B.Ya&&a){a=
this.B.Ya+this.Xa;for(b=this.B.Ya;b<a;b+=2){var d=65536*Math.random()|0;4==this.ea||7==this.ea?(c=b>>1&255,d=d>>8&~wq,d>>4==(d&15)&&(d^=15)):(c=d&255,d=(d&256?xq|yq:zq|Aq)|Bq&d>>8);lc(this.ma,b,c|d<<8)}mq(this,!0)}};function tq(a){a.A.ff&ip?(a.W=a.Bb,a.I=a.A):(a.W=a.A,a.I=a.rb)}k.save=function(){var a=new Te(this);a.set(0,wp(this.Bb));a.set(1,wp(this.rb));a.set(2,[this.ea,this.ca,this.qa]);a.set(3,wp(this.A));return a.data()};
k.reset=function(){var a=!0,b=0;this.V&&(b=+gk(this.V,zj,void 0));this.ba||(this.Ma=b==hk?cq:$p);this.ca=qq;switch(this.Ma){case Un:b=7;break;case Sn:var c=rq[this.qb];c&&(b=c[0]);b||(b=4);break;case cq:b=hk;this.ca=sq;break;default:b=2}this.ea!==b&&(this.ea=b,a=!0);this.B=null;this.W=this.Bb=new bp(this,cq);this.I=this.rb=new bp(this,$p);this.Ma<Sn?this.A=new bp:(this.A=new bp(this,this.Ma,null,this.Wc),tq(this));uq(this);this.qa=null;vq(this,this.ca);if(this.B.Ya&&a){a=this.B.Ya+this.Xa;for(b=this.B.Ya;b<
a;b+=2){var d=65536*Math.random()|0;4==this.ea||7==this.ea?(c=b>>1&255,d=d>>8&~wq,d>>4==(d&15)&&(d^=15)):(c=d&255,d=(d&256?xq|yq:zq|Aq)|Bq&d>>8);lc(this.ma,b,c|d<<8)}mq(this,!0)}};function tq(a){a.A.ff&ip?(a.W=a.Bb,a.I=a.A):(a.W=a.A,a.I=a.rb)}k.save=function(){var a=new Te(this);a.set(0,wp(this.Bb));a.set(1,wp(this.rb));a.set(2,[this.ea,this.ca,this.qa]);a.set(3,wp(this.A));return a.data()};
k.restore=function(a){var b=a[2];this.ea=b[0];this.ca=b[1];this.qa=b[2];this.B=null;this.W=this.Bb=new bp(this,cq,a[0]);this.I=this.rb=new bp(this,$p,a[1]);this.A=new bp(this,this.Ma,a[3],this.Wc);this.A.Ub&&tq(this);uq(this);if(!Cq(this))return!1;Dq(this);return!0};
function Zp(a,b,c,d){if(d)a.wa("Unable to load font ROM (error "+d+": "+b+")");else{Ya(a.Wd,b,c);try{var e=eval("("+c+")"),f=e.bytes||e;if(!f.length){r("Empty font ROM: "+b);return}if(1==f.length){r(f[0]);return}if(8192==f.length)Tn(a,f,[6144,0]);else if(2048==f.length)Tn(a,f,[0]);else{a.wa("Unrecognized font data length ("+f.length+")");return}}catch(g){a.wa("Font ROM data error: "+g.message);return}(a.J||a.Ea)&&pb(a)}}
function Eq(a,b){if(1==b)return a.ga[0]=Fq[zq],a.ga[1]=Fq[xq],a.ga;if(2==b){var c=a.B.ef;if(a.B===a.A){var d=a.A.rc[0],c=d&7;d&16&&(c|=8);18!=a.A.rc[1]&&(c|=32)}a.ga[0]=Fq[c&15];c=c&32?Gq:Hq;for(d=0;d<c.length;d++)a.ga[d+1]=Fq[c[d]];return a.ga}if(a.I===a.rb)return Fq;a.Ga&&b&&!a.ga[16]&&(a.Ga=!1);if(!a.Ga){var c=a.A,d=c.we,e,f,g,h;if(8==b)for(e=0;256>e;e++)f=d[e]||0,g=f<<2&252,h=f>>4&252,f=f>>10&252,a.ga[e]=[g,h,f,255];else{var l=d&&d[255];b=null!=c.rc[15]?c.rc:Iq;for(e=0;16>e;e++)f=b[e]&63,l?(f|=
(c.rc[20]&12)<<4,c.rc[16]&128&&(f&=-49,f|=(c.rc[20]&3)<<4),f=d[f],g=f<<2&252,h=f>>4&252,f=f>>10&252):(g=(f&4?170:0)|(f&32?85:0),h=(f&2?170:0)|(f&16?85:0),f=(f&1?170:0)|(f&8?85:0)),a.ga[e]=[g,h,f,255]}a.Ga=!0}return a.ga}function Tn(a,b,c,d){a.nb=b;a.Va=c;a.Ca=d}
function uq(a,b){var c=!1;if(window&&a.nb&&(!b||a.G)){b=0;var d=a.Ca?a.Ca:8,e=Eq(a);null!=a.Va[0]&&Jq(a,Kq,a.Va[0],b,d,8,a.nb,e)&&(c=!0);b=a.Ca?0:2048;d=a.Ca?a.Ca:9;null!=a.Va[1]&&(Jq(a,Lq,a.Va[1],b,d,14,a.nb,Mq,Nq)&&(c=!0),a.Ca&&Jq(a,a.Ma,a.Va[1],0,a.Ca,14,a.nb,e)&&(c=!0))}return c}function Jq(a,b,c,d,e,f,g,h,l){var m=!1;null!=c&&(Oq(a,b,c,d,e,f,g,h,l)&&(m=!0),a.md&&Oq(a,b<<1,c,d,e,f,g,h,l)&&(m=!0));return m}
function uq(a,b){var c=!1;if(window&&a.nb&&(!b||a.G)){var d=0,e=a.Ca?a.Ca:8,f=Eq(a);null!=a.Va[0]&&Jq(a,Kq,a.Va[0],d,e,8,a.nb,f)&&(c=!0);d=a.Ca?0:2048;e=a.Ca?a.Ca:9;null!=a.Va[1]&&(Jq(a,Lq,a.Va[1],d,e,14,a.nb,Mq,Nq)&&(c=!0),a.Ca&&Jq(a,a.Ma,a.Va[1],0,a.Ca,14,a.nb,f)&&(c=!0))}b||(a.Z=-1,a.ya=-1,a.ua=0);return c}function Jq(a,b,c,d,e,f,g,h,l){var m=!1;null!=c&&(Oq(a,b,c,d,e,f,g,h,l)&&(m=!0),a.md&&Oq(a,b<<1,c,d,e,f,g,h,l)&&(m=!0));return m}
function Oq(a,b,c,d,e,f,g,h,l){var m=!1,q=b&1?0:1,y=a.ta[b],w=16>h.length?h.length:16;y||(y={oc:e<<q,pc:f<<q,ae:Array(w),Xh:h.slice(0,w),De:l,ig:Array(w)});for(l=0;l<w;l++){var z=h[l],B=y.ae[l]?y.Xh[l]:[];if(z[0]!==B[0]||z[1]!==B[1]||z[2]!==B[2]){var m=y,B=l,S=q,X=c,ca=d,$a=e,yb=f,Vh=g,Qt=[0,0,0,0],Pf=document.createElement("canvas");Pf.width=m.oc<<4;Pf.height=m.pc<<4;var Om=Pf.getContext("2d"),Lb,pd,pc,Qf=8>yb||!ca?yb:8,Wh=Om.createImageData(m.oc,m.pc);for(Lb=0;256>Lb;Lb++){for(pc=0;pc<yb;pc++)for(var Rt=
m.De&&B&1&&pc>=yb-2,St=Vh[pc<Qf?X+Lb*Qf+pc:ca+Lb*Qf+pc-Qf],Xh=0;Xh<=S;Xh++)for(pd=0;pd<$a;pd++){var Pm=pd<<S,Qm=(pc<<S)+Xh,Rm=Rt||St&128>>(8<=pd&&192<=Lb&&223>=Lb?7:pd)?z:Qt;Pq(Wh,Pm,Qm,Rm);S&&Pq(Wh,Pm+1,Qm,Rm)}Om.putImageData(Wh,(Lb&15)*m.oc,(Lb>>4)*m.pc)}m.ae[B]="#"+oa(z[0],2)+oa(z[1],2)+oa(z[2],2);m.Xh[B]=z;m.ig[B]=Pf;m=!0}}a.ta[b]=y;return m}function Qq(a){0<a.ua||0<=a.Z?0>a.ya&&(a.ya=0):a.ya=-1}
function Dq(a){if(a.G){for(var b=10;15>=b;b++)if(null==a.B.Oa[b])return;var c=a.B.Oa[10],b=c&31,d=a.B.Oa[11]&31,e=a.B.Oa[9]&31,f=!1;a.B===a.A&&(f=!0,7!=e||4!=b||d||(d=7));if(c&32||b>d&&!f||b>e)Rq(a);else{c=a.B.Oa[15]+((a.B.Oa[14]&63)<<8);a.Z!=c&&(Rq(a),a.Z=c);d=d-b+1;if(a.Uc!=b||a.xc!=d)a.Uc=b,a.xc=d;a.xa=e+1;Qq(a)}}}function Rq(a){if(0<=a.Z){if(void 0!==a.L){var b=Sq<<8,c=a.L[a.Z];if(c&b){var c=c&~b,b=a.Z%a.F,d=a.Z/a.F|0;a.G&&a.ta[a.G]&&(a.Ba&&Tq(a,b,d,c,a.Ba),Tq(a,b,d,c));a.L[a.Z]=c}}a.Z=-1}}