Added timer support to the PCx86 SerialPort component, so that we can honor the programmed baud rate now

This commit is contained in:
Jeff Parsons 2017-08-23 10:50:31 -07:00 committed by Jeff Parsons
commit 6a3498e666
10 changed files with 800 additions and 714 deletions

View file

@ -56,7 +56,7 @@ function lb(a,b,c){mb[a]&&b&&(mb[a][b]=c)}function nb(){return Date.now()||+new
function rb(a,b){b=sb(b.parentNode,"pc8080-control");for(var c=0;c<b.length;c++)for(var d=b[c].childNodes,e=0;e<d.length;e++){var f=d[e];if(1===f.nodeType){var g=f.getAttribute("class");if(g)for(var h=g.split(" "),k=0;k<h.length;k++)switch(g=h[k],g){case "pc8080-binding":(g=tb(f))&&g.binding&&a.da(g.type,g.binding,f,g.value),k=h.length}}}}function ub(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;b<kb.length;b++){var d=kb[b];a&&d.id.indexOf(a)||c.push(d)}return c}
function vb(a){if(void 0!==a){var b;for(b=0;b<kb.length;b++)if(kb[b].id===a)return kb[b]}return null}function wb(a,b){var c;if(void 0!==a){var d;b&&(b=0<(d=b.indexOf("."))?b.substr(0,d+1):"");for(d=0;d<kb.length;d++)if(c)c==kb[d]&&(c=null);else if(!(a!=kb[d].type||b&&kb[d].id.indexOf(b)))return kb[d]}return null}function tb(a){var b=null;if(a=a.getAttribute("data-value"))try{b=eval("("+a+")")}catch(c){r(c.message+" ("+a+")")}return b}
function sb(a,b,c){c&&(b+="-"+c+"-object");if(a.getElementsByClassName)return a.getElementsByClassName(b);var d;c=[];a=a.getElementsByTagName("*");var e=new RegExp("(^| )"+b+"( |$)");b=0;for(d=a.length;b<d;b++)e.test(a[b].className)&&c.push(a[b]);return c}
function yb(a){for(var b=!0,c=zb[a];c&&c.length;){var d=c.splice(0,1)[0],e=d[0],f=null;0<=Ab.indexOf(e)&&(f=function(){return function(){yb(a)}}());var g=Bb[e];if(g)if(!f)b=g(d[1],d[2],d[3]);else{if(!g(f,d[1],d[2],d[3]))break}else{var b=!1,h=wb(d[1],a);if(h)if(g=Cb[e])b=g(h,d[2],d[3]);else{var k=h.exports;if(k&&(g=k[e]))if(b=!0,!f)b=g.call(h,d[2],d[3]);else if(!g.call(h,f,d[2],d[3]))break}}if(!b){r("Script error: '"+e+(g?" failed":" unrecognized"));break}}c&&!c.length&&delete zb[a];return b}l=u.prototype;
function xb(a){for(var b=!0,c=zb[a];c&&c.length;){var d=c.splice(0,1)[0],e=d[0],f=null;0<=Ab.indexOf(e)&&(f=function(){return function(){xb(a)}}());var g=Bb[e];if(g)if(!f)b=g(d[1],d[2],d[3]);else{if(!g(f,d[1],d[2],d[3]))break}else{var b=!1,h=wb(d[1],a);if(h)if(g=Cb[e])b=g(h,d[2],d[3]);else{var k=h.exports;if(k&&(g=k[e]))if(b=!0,!f)b=g.call(h,d[2],d[3]);else if(!g.call(h,f,d[2],d[3]))break}}if(!b){r("Script error: '"+e+(g?" failed":" unrecognized"));break}}c&&!c.length&&delete zb[a];return b}l=u.prototype;
l.toString=function(){return this.name?this.name:this.id||this.type};
l.da=function(a,b,c){switch(b){case "clear":return this.P[b]||(this.P[b]=c,c.onclick=function(a){return function(){a.P.print&&(a.P.print.value="")}}(this)),!0;case "print":return this.P[b]||(this.P[b]=c,this.aa=function(a){this.i(a,this.type);return!0},c.value="",this.print=function(a){return function(b){qb(a,b)}}(c),this.i=function(a,b){return function(a,c){a||(a="");if(c!=Db.kd||"..."!=a.slice(-3))c&&(a=c+": "+a),qb(b,a+"\n");else{c=b.value;var d=c.lastIndexOf(a);0>d?c+=a+"\n":c=c.substr(0,d)+(a+
".")+c.substr(d+a.length);8192<c.length&&(c=c.substr(c.length-4096));b.value=c;b.scrollTop=b.scrollHeight}}}(this,c)),!0;default:return!1}};l.log=function(){};l.print=function(){};l.i=function(){};l.status=function(a){this.i(this.type+": "+a)};l.aa=function(a,b,c){if(!b){var d=wb("Computer",this.id);if(d&&d.D.Qb)return console.log("ignoring notice during unload: "+a),!1}fb(a,b,c||this.type);return!0};function Eb(a,b){a.D.error=!0;a.aa(b)}
@ -68,8 +68,8 @@ Array.prototype.indexOf||(Array.prototype.indexOf=function(a,b){b=b||0;for(var c
Function.prototype.bind||(Function.prototype.bind=function(a){function b(){return e.apply(this instanceof c&&a?this:a,d.concat(Array.prototype.slice.call(arguments)))}function c(){}if("function"!=typeof this)throw new TypeError("Function.prototype.bind: non-callable object");var d=Array.prototype.slice.call(arguments,1),e=this;c.prototype=this.prototype;b.prototype=new c;return b});
var Mb="undefined"!==typeof ArrayBuffer,Nb=[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,
0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],Ob={cpu:1,bus:64,mem:128,port:256,nvr:16384,chipset:32768,keyboard:65536,key:131072,video:262144,fdc:524288,disk:2097152,serial:8388608,speaker:33554432,computer:67108864,log:536870912,warn:1073741824,halt:-2147483648};function Pb(a){u.call(this,"Panel",a)}aa(Pb,u);
Pb.prototype.da=function(a,b,c,d){return this.R&&this.R.da(a,b,c,d)||this.w&&this.w.da(a,b,c,d)||this.B&&this.B.da(a,b,c,d)||this.K&&this.K.da(a,b,c,d)?!0:u.prototype.da.call(this,a,b,c,d)};Pb.prototype.Fa=function(a,b,c,d){this.R=a;this.I=b;this.w=c;this.K=d;this.B=Qb(a,"Keyboard")};Pb.prototype.va=function(a,b){b||Tb();return!0};Pb.prototype.ua=function(){return!0};
function Tb(){for(var a=!1,b=sb(document,"pc8080","panel"),c=0;c<b.length;c++){var d=b[c],e=tb(d),f=vb(e.id);f||(a=!0,f=new Pb(e));rb(f,d);a&&Gb(f)}}Za(Tb);
Pb.prototype.da=function(a,b,c,d){return this.R&&this.R.da(a,b,c,d)||this.w&&this.w.da(a,b,c,d)||this.B&&this.B.da(a,b,c,d)||this.K&&this.K.da(a,b,c,d)?!0:u.prototype.da.call(this,a,b,c,d)};Pb.prototype.Fa=function(a,b,c,d){this.R=a;this.I=b;this.w=c;this.K=d;this.B=Qb(a,"Keyboard")};Pb.prototype.va=function(a,b){b||Rb();return!0};Pb.prototype.ua=function(){return!0};
function Rb(){for(var a=!1,b=sb(document,"pc8080","panel"),c=0;c<b.length;c++){var d=b[c],e=tb(d),f=vb(e.id);f||(a=!0,f=new Pb(e));rb(f,d);a&&Gb(f)}}Za(Rb);
function Ub(a,b,c){u.call(this,"Bus",a);this.w=b;this.K=c;this.M=a.busWidth||16;this.N=Math.pow(2,this.M);this.C=this.N-1|0;this.g=(this.M>>1)+2;10>this.g&&(this.g=10);15<this.g&&(this.g=15);this.u=1<<this.g;this.O=this.u>>2;this.j=this.u-1;this.L=this.N/this.u|0;this.H=this.L-1;this.A=[];this.B=[];this.F=this.G=!1;this.S=[];this.T=[];a=new A;Vb(a,this.K);this.b=Array(this.L);for(b=0;b<this.L;b++)this.b[b]=a;Gb(this)}aa(Ub,u);Ub.prototype.reset=function(){};
Ub.prototype.va=function(a,b){b||this.reset();return!0};function Wb(a,b,c,d){for(var e=b,f=c,g=e>>>a.g;0<f&&g<a.b.length;){var h=a.b[g],k=g*a.u,p=a.u-(e-k);p>f&&(p=f);if(h&&h.size){if(h.type==d){if(e+f<=h.J)return h.nb+=h.J-e,h.J=e,!0;if(e>=h.J+h.nb){p=h.size-(e-k);p>f&&(p=f);h.nb=e-h.J+p;e=k+a.u;f-=p;g++;continue}}return Xb(Yb,e,f)}e=new A(e,p,a.u,d);Vb(e,a.K,h);a.b[g++]=e;e=k+a.u;f-=p}return 0>=f?(a.status(Math.floor(c/1024)+"Kb "+Zb[d]+" at "+q(b)),!0):Xb($b,b,c)}
function ac(a,b){return a.b[(b&a.C)>>>a.g].mb(b&a.j,b)}function bc(a,b){var c=b&a.j,d=(b&a.C)>>>a.g;return c!=a.j?a.b[d].Hc(c,b):a.b[d++].Wa(c,b)|a.b[d&a.H].Wa(0,b+1)<<8}function cc(a,b){var c=b&a.j,d=(b&a.C)>>>a.g;return c!=a.j?a.b[d].Mb(c,b):a.b[d++].mb(c,b)|a.b[d&a.H].mb(0,b+1)<<8}function dc(a,b,c){a.b[(b&a.C)>>>a.g].ob(b&a.j,c&255,b)}function ec(a,b,c){var d=b&a.j,e=(b&a.C)>>>a.g;d!=a.j?a.b[e].Kc(d,c&65535,b):(a.b[e++].Ya(d,c&255,b),a.b[e&a.H].Ya(0,c>>8&255,b+1))}
@ -84,18 +84,19 @@ l.pb=function(a,b){this.K&&Jb(this.K,129)&&this.K.message("attempt to write "+q(
l.Be=function(a,b){var c=a>>2;a=(a&3)<<3;24>a?this.b[c]=this.b[c]&~(65535<<a)|b<<a:(this.b[c]=this.b[c]&16777215|b<<24,c++,this.b[c]=this.b[c]&-256|b>>8);this.Da=!0};l.he=function(a,b){if(this.K&&null!=this.J){var c=this.K;Mc(c,this.J+a,1,c.M)&&c.ea(!0)}return this.mb(a,b)};l.le=function(a,b){if(this.K&&null!=this.J){var c=this.K;Mc(c,this.J+a,2,c.M)&&c.ea(!0)}return this.Mb(a,b)};
l.ve=function(a,b,c){if(this.K&&null!=this.J){var d=this.K;Mc(d,this.J+a,1,d.B)&&d.ea(!0)}this.w?this.pb(0,b):this.ob(a,b,c)};l.ze=function(a,b,c){if(this.K&&null!=this.J){var d=this.K;Mc(d,this.J+a,2,d.B)&&d.ea(!0)}this.w?this.pb(0,b):this.Sb(a,b,c)};l.ge=function(a){return this.g[a]};l.ie=function(a){return this.g[a]};l.ke=function(a){return this.j.getUint16(a,!0)};l.me=function(a){return a&1?this.g[a]|this.g[a+1]<<8:this.u[a>>1]};l.ue=function(a,b){this.g[a]=b;this.Da=!0};
l.we=function(a,b){this.g[a]=b;this.Da=!0};l.ye=function(a,b){this.j.setUint16(a,b,!0);this.Da=!0};l.Ae=function(a,b){a&1?(this.g[a]=b,this.g[a+1]=b>>8):this.u[a>>1]=b;this.Da=!0};var Bc=0,Cc=2,Zb=["NONE","RAM","ROM","VID","H/W"],Ac=0,Hc=[],Gc=[A.prototype.je,A.prototype.xe,A.prototype.ne,A.prototype.Be],Kc=[A.prototype.he,A.prototype.ve,A.prototype.le,A.prototype.ze];if(Mb)var Fc=[A.prototype.ge,A.prototype.ue,A.prototype.ke,A.prototype.ye],Ec=[A.prototype.ie,A.prototype.we,A.prototype.me,A.prototype.Ae];
function Nc(a,b){u.call(this,"CPU",a,1);var c=a.multiplier||1;this.za=a.cycles||b;this.U=c;this.Sa=Math.round(this.za/1E4)/100;this.Z=this.Sa*this.U;this.D.ka=!1;this.D.Pb=!1;this.D.ib=a.autoStart;this.D.Bc=!1;this.D.Va=!1;this.wa=this.oa=0;this.ya=a.csStart;this.na=a.csInterval;this.sa=a.csStop;this.T=[];this.Bb=this.rb.bind(this);Gb(this)}aa(Nc,u);l=Nc.prototype;
function Nc(a,b){u.call(this,"CPU",a,1);var c=a.multiplier||1;this.za=a.cycles||b;this.T=c;this.Sa=Math.round(this.za/1E4)/100;this.Z=this.Sa*this.T;this.D.ka=!1;this.D.Pb=!1;this.D.ib=a.autoStart;this.D.Bc=!1;this.D.Va=!1;this.wa=this.oa=0;this.ya=a.csStart;this.na=a.csInterval;this.sa=a.csStop;this.U=[];this.Bb=this.rb.bind(this);Gb(this)}aa(Nc,u);l=Nc.prototype;
l.Fa=function(a,b,c,d){this.R=a;this.I=b;this.K=d;for(b=0;b<Oc.length;b++)(c=this.P[Oc[b]])&&this.R.da(null,Oc[b],c);this.W=Qb(a,"ChipSet");a=Pc(a,"autoStart");null!=a&&(this.D.ib="true"==a?!0:"false"==a?!1:!!a);Gb(this)};l.reset=function(){};l.save=function(){return null};l.restore=function(){return!1};
l.va=function(a,b){if(!b){if(a&&this.restore){Qc(this);if(!this.restore(a))return!1;Rc(this)}else this.reset();this.K?(a=this.K,a.i("Type ? for help with PC8080 Debugger commands"),Sc(a),a.na&&(b=a.na,a.na=null,Tc(a,b))):this.i("No debugger detected")}Uc(this);return!0};l.ua=function(a){return a?this.save():!0};l.ib=function(){return this.D.ib||!this.K&&void 0===this.P.run?(this.rb(),!0):!1};l.Ec=function(){return 0};
function Rc(a){void 0===a.ya&&(a.ya=0);void 0===a.na&&(a.na=-1);void 0===a.sa&&(a.sa=-1);a.D.Va=0<=a.ya&&0<a.na;a.D.Va&&(a.wa=0,a.oa=a.ya-a.la)}function Vc(a,b){if(a.D.Va){var c=!1;a.wa=a.wa+a.Ec()|0;a.oa-=b;0>=a.oa&&(a.oa+=a.na,c=!0);0<=a.sa&&a.sa<=Wc(a)&&(a.na=a.sa=-1,Rc(a),a.ea(),c=!0);c&&a.i(Wc(a)+" cycles: checksum="+n(a.wa))}}
l.da=function(a,b,c){var d=this;a=!1;switch(b){case "power":case "reset":this.P[b]=c;a=!0;break;case "run":this.P[b]=c;c.onclick=function(){var a;if(a=d.R)if(a=d.R,a.D.ja)a=!0;else{var b=null,c,h=ub(a.id);for(c=0;c<h.length&&(b=h[c],b===a||b.D.ready);c++);if(c==h.length)for(c=0;c<h.length&&(b=h[c],b===a||b.D.ja);c++);c==h.length&&(b=a);r("The "+b.type+" component ("+b.id+") is not "+(b.D.ready?"powered yet":"ready yet"+(b.xb?" (waiting for notification)":""))+".");a=!1}a&&(d.D.ka?d.ea():d.rb())};
a=!0;break;case "speed":this.P[b]=c;a=!0;break;case "setSpeed":this.P[b]=c,c.onclick=function(){Xc(d,d.U<<1,!0)},c.textContent=this.Z.toFixed(2)+"Mhz",a=!0}return a};function Yc(a,b,c){a.la+=b;c&&(a.fa=a.b=0)}function Zc(a,b){var c=1;b&&1<a.U&&a.Y&&(c=a.Y/a.Sa);a.gb=Math.round(1E3/$c);a.Ma=Math.floor(a.za/$c*c);b||(a.ta=a.Ma);a.Ua=0}function Wc(a){return a.la+a.X+a.fa-a.b}function Qc(a){a.Y=0;a.hb=0;a.la=a.X=a.fa=a.b=0;Rc(a);Xc(a,1)}
function Xc(a,b,c){var d=!1;if(void 0!==b){.8>a.Y/a.Z?b=1:d=!0;a.U=b;b=a.Sa*a.U;if(a.Z!=b){a.Z=b;b=a.Z.toFixed(2)+"Mhz";var e=a.P.setSpeed;e&&(e.textContent=b);a.i("target speed: "+b)}c&&a.R&&a.R.Xa()}Yc(a,a.X);a.X=0;a.V=nb();a.ba=0;Zc(a);return d}function ad(a,b){var c=a.T.length;a.T.push([-1,b]);return c}function bd(a,b,c){0<=b&&b<a.T.length&&0>a.T[b][0]&&(c=a.za*a.U/1E3*c|0,a.D.ka&&(c+=cd(a)),a.T[b][0]=c)}function cd(a,b){var c=a.fa-=a.b;a.b=0;b&&(a.fa=0);return c}
l.rb=function(a){if(Ib(this,!0)){if(!this.D.ka){Xc(this);this.R&&this.R.start(this.V,Wc(this));this.D.ka=!0;this.D.Pb=!0;this.W&&this.W.start();var b=this.P.run;b&&(b.textContent="Halt");this.R&&(dd(this.R,!0),a&&this.R.Xa(!0))}this.Ua>=this.za&&Zc(this,!0);this.Ca=0;this.La=nb();this.ba&&(a=this.La-this.ba,a>this.gb&&(this.V+=a,this.V>this.La&&(this.V=this.La)));try{do{for(var c,d=this.D.Va?1:this.Ma,e=this.T.length-1;0<=e;e--){var f=this.T[e];0>f[0]||d>f[0]&&(d=f[0])}c=d;this.Cb(c);c=cd(this,!0);
this.Ca+=c;this.X+=c;Vc(this,c);a=c;for(var g=this.T.length-1;0<=g;g--){var h=this.T[g];0>h[0]||(h[0]-=a,0>=h[0]&&(h[0]=-1,h[1]()))}this.ta-=c;if(0>=this.ta){this.ta+=this.Ma;++this.hb>=qd&&(this.R&&dd(this.R),this.hb=0);break}}while(this.D.ka)}catch(k){this.ea();Uc(this);this.R&&this.R.stop(nb(),Wc(this));Ib(this,!1);Eb(this,k.stack||k.message);return}c=setTimeout;d=this.Bb;this.ba=nb();e=this.gb;this.Ca&&(e=Math.round(e*this.Ca/this.Ma));e-=this.ba-this.La;if(f=this.ba-this.V)this.Y=Math.round(this.X/
(10*f))/100,864E5<=f&&(this.la=0,Xc(this));if(0>e||this.Y<this.Z)-1E3>e&&(this.V-=e),e=0;this.Ua+=this.Ca;this.ba+=e;c(d,e)}else Uc(this),this.R&&this.R.stop(nb(),Wc(this))};l.Cb=function(){return 0};l.ea=function(a){Hb(this,!0);cd(this);Yc(this,this.X);this.X=0;if(this.D.ka){this.D.ka=!1;this.W&&this.W.stop();var b=this.P.run;b&&(b.textContent="Run")}this.D.complete=a};function Uc(a,b){if(a.R){for(var c=a.R,d=0;d<c.A.length;d++)rd(c.A[d],b);dd(a.R,b)}}var $c=30,qd=15,Oc=["power","reset"];
function sd(a){var b=+a.model||8080;Nc.call(this,a,1E6);this.vb=b;this.cb=td;Qc(this);this.D.complete=this.D.Ad=!1;this.fb=0;this.Ka=[];this.eb=0;ud(this)}aa(sd,Nc);function vd(a,b){a.Ka.push(b)}l=sd.prototype;l.reset=function(){this.D.ka&&this.ea();ud(this);Qc(this);this.D.error=!1;Nc.prototype.reset.call(this)};function ud(a){a.g=0;a.u=0;a.A=0;a.B=0;a.C=0;a.F=0;a.G=0;a.M=0;B(a,a.eb);wd(a,0);a.S=0}function xd(a,b){a.eb=b;B(a,b)}
l.Ec=function(){var a=this.g+this.u+this.A+this.B+this.C+this.F+this.G|0;return a=a+this.M+this.j+yd(this)|0};l.save=function(){var a=new zd(this);a.set(0,[this.g,this.u,this.A,this.B,this.C,this.F,this.G,this.M,this.j,yd(this)]);a.set(1,[this.S,this.la,this.U]);a.set(2,fc(this.I));return a.data()};
a=!0;break;case "speed":this.P[b]=c;a=!0;break;case "setSpeed":this.P[b]=c,c.onclick=function(){Xc(d,d.T<<1,!0)},c.textContent=this.Z.toFixed(2)+"Mhz",a=!0}return a};function Yc(a,b,c){a.la+=b;c&&(a.fa=a.b=0)}function Zc(a,b){var c=1;b&&1<a.T&&a.Y&&(c=a.Y/a.Sa);a.gb=Math.round(1E3/$c);a.Ma=Math.floor(a.za/$c*c);b||(a.ta=a.Ma);a.Ua=0}function Wc(a){return a.la+a.X+a.fa-a.b}function Qc(a){a.Y=0;a.hb=0;a.la=a.X=a.fa=a.b=0;Rc(a);Xc(a,1)}
function Xc(a,b,c){var d=!1;if(void 0!==b){.8>a.Y/a.Z?b=1:d=!0;a.T=b;b=a.Sa*a.T;if(a.Z!=b){a.Z=b;b=a.Z.toFixed(2)+"Mhz";var e=a.P.setSpeed;e&&(e.textContent=b);a.i("target speed: "+b)}c&&a.R&&a.R.Xa()}Yc(a,a.X);a.X=0;a.V=nb();a.ba=0;Zc(a);return d}function ad(a,b,c){var d;d=void 0===d?-1:d;var e=a.U.length;a.U.push([b,-1,d,c]);0<=d&&bd(a,e,d);return e}function bd(a,b,c){0<=b&&b<a.U.length&&(b=a.U[b],0>b[1]&&(c=a.za*a.T/1E3*c|0,a.D.ka&&(c+=cd(a)),b[1]=c))}
function cd(a,b){var c=a.fa-=a.b;a.b=0;b&&(a.fa=0);return c}
l.rb=function(a){if(Ib(this,!0)){if(!this.D.ka){Xc(this);this.R&&this.R.start(this.V,Wc(this));this.D.ka=!0;this.D.Pb=!0;this.W&&this.W.start();var b=this.P.run;b&&(b.textContent="Halt");this.R&&(dd(this.R,!0),a&&this.R.Xa(!0))}this.Ua>=this.za&&Zc(this,!0);this.Ca=0;this.La=nb();this.ba&&(a=this.La-this.ba,a>this.gb&&(this.V+=a,this.V>this.La&&(this.V=this.La)));try{do{for(var c,d=this.D.Va?1:this.Ma,e=this.U.length-1;0<=e;e--){var f=this.U[e];0>f[1]||d>f[1]&&(d=f[1])}c=d;this.Cb(c);c=cd(this,!0);
this.Ca+=c;this.X+=c;Vc(this,c);a=c;for(var g=this.U.length-1;0<=g;g--){var h=this.U[g];0>h[1]||(h[1]-=a,0>=h[1]&&(h[1]=-1,h[3](),0<=h[2]&&bd(this,g,h[2])))}this.ta-=c;if(0>=this.ta){this.ta+=this.Ma;++this.hb>=qd&&(this.R&&dd(this.R),this.hb=0);break}}while(this.D.ka)}catch(k){this.ea();Uc(this);this.R&&this.R.stop(nb(),Wc(this));Ib(this,!1);Eb(this,k.stack||k.message);return}c=setTimeout;d=this.Bb;this.ba=nb();e=this.gb;this.Ca&&(e=Math.round(e*this.Ca/this.Ma));e-=this.ba-this.La;if(f=this.ba-
this.V)this.Y=Math.round(this.X/(10*f))/100,864E5<=f&&(this.la=0,Xc(this));if(0>e||this.Y<this.Z)-1E3>e&&(this.V-=e),e=0;this.Ua+=this.Ca;this.ba+=e;c(d,e)}else Uc(this),this.R&&this.R.stop(nb(),Wc(this))};l.Cb=function(){return 0};l.ea=function(a){Hb(this,!0);cd(this);Yc(this,this.X);this.X=0;if(this.D.ka){this.D.ka=!1;this.W&&this.W.stop();var b=this.P.run;b&&(b.textContent="Run")}this.D.complete=a};function Uc(a,b){if(a.R){for(var c=a.R,d=0;d<c.A.length;d++)rd(c.A[d],b);dd(a.R,b)}}
var $c=30,qd=15,Oc=["power","reset"];function sd(a){var b=+a.model||8080;Nc.call(this,a,1E6);this.vb=b;this.cb=td;Qc(this);this.D.complete=this.D.Ad=!1;this.fb=0;this.Ka=[];this.eb=0;ud(this)}aa(sd,Nc);function vd(a,b){a.Ka.push(b)}l=sd.prototype;l.reset=function(){this.D.ka&&this.ea();ud(this);Qc(this);this.D.error=!1;Nc.prototype.reset.call(this)};function ud(a){a.g=0;a.u=0;a.A=0;a.B=0;a.C=0;a.F=0;a.G=0;a.M=0;B(a,a.eb);wd(a,0);a.S=0}function xd(a,b){a.eb=b;B(a,b)}
l.Ec=function(){var a=this.g+this.u+this.A+this.B+this.C+this.F+this.G|0;return a=a+this.M+this.j+yd(this)|0};l.save=function(){var a=new zd(this);a.set(0,[this.g,this.u,this.A,this.B,this.C,this.F,this.G,this.M,this.j,yd(this)]);a.set(1,[this.S,this.la,this.T]);a.set(2,fc(this.I));return a.data()};
l.restore=function(a){var b=a[0];this.g=b[0];this.u=b[1];this.A=b[2];this.B=b[3];this.C=b[4];this.F=b[5];this.G=b[6];this.M=b[7]&65535;B(this,b[8]);wd(this,b[9]);b=a[1];this.S=b[0];this.la=b[1];Xc(this,b[3]);a:{b=this.I;a=a[2];var c;for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.O){for(var f=0,g=Array(b.O),h=0;h<e.length-1;)for(var k=e[h++],p=e[h++];k--;)g[f++]=p;e=g}f=b.b[d];if(!f||!f.restore(e)){r("Unable to restore memory block "+d);b=!1;break a}}b=!0}return b};
l.da=function(a,b,c){switch(b){case "A":case "B":case "C":case "BC":case "D":case "E":case "DE":case "H":case "L":case "HL":case "SP":case "PC":case "PS":case "IF":case "SF":case "ZF":case "AF":case "PF":case "CF":this.P[b]=c;this.fb++;a=!0;break;default:a=Nc.prototype.da.call(this,a,b,c)}return a};function Ad(a){return a.u<<8|a.A}function Bd(a,b){a.u=b>>8&255;a.A=b&255}function Cd(a){return a.B<<8|a.C}function Dd(a,b){a.B=b>>8&255;a.C=b&255}function D(a){return a.F<<8|a.G}
function Ed(a,b){a.F=b>>8&255;a.G=b&255}function B(a,b){a.j=b&65535}function Fd(a){return a.H&256?1:0}function Gd(a,b){a.H=a.H&255|b}function Hd(a){return Nb[a.L&255]?4:0}function Id(a){return(a.L^a.O)&16?16:0}function Jd(a){return a.H&255?0:64}function Kd(a){return a.L&128?128:0}function yd(a){return a.N&-214|Kd(a)|Jd(a)|Id(a)|Hd(a)|Fd(a)}function wd(a,b){a.H=a.L=a.O=0;b&1&&(a.H|=256);b&4||(a.L|=1);b&16&&(a.O|=16);b&64||(a.H|=255);b&128&&(a.L^=192);a.N=a.N&-726|b&512|2}
@ -134,7 +135,7 @@ l.restore=function(a){var b;if(a&&(b=a[0])&&b.length)switch(this.g.pa){case ge.p
l.Ld=function(a,b){var c=this.A;y(this,a,null,b,"STATUS1",c,!0);return c};l.Md=function(a,b){var c=this.fa;y(this,a,null,b,"STATUS2",c,!0);return c};l.Jd=function(a,b){var c=this.N>>8-this.T&255;y(this,a,null,b,"SHIFT.RESULT",c,!0);return c};l.Xd=function(a,b,c){y(this,a,b,c,"SHIFT.COUNT",null,!0);this.T=b};l.Zd=function(a,b,c){y(this,a,b,c,"SOUND1",null,!0);this.Y=b};l.Yd=function(a,b,c){y(this,a,b,c,"SHIFT.DATA",null,!0);this.N=b<<8|this.N>>8};
l.$d=function(a,b,c){y(this,a,b,c,"SOUND2",null,!0);this.Z=b};l.ae=function(a,b,c){y(this,a,b,c,"WATCHDOG",null,!0)};function he(a){var b=0,c=0,d=~a.M;for(a=0;10>a;a++)d&1&&(b=9-a),d>>=1;for(a=0;10>a;a++)d&1&&(c=9-a),d>>=1;return 10*b+c}
l.Nd=function(a,b){var c=this.F,c=c&~J.xa.jc;if((Wc(this.w)&64)<<1&&(c|=J.xa.jc,c!=this.F)){var d,e;d=this.L&1;e=this.L>>1&7;switch(e){case J.Aa.Ia.od:break;case J.Aa.Ia.Lc:this.M=this.M<<1|d;break;case J.Aa.Ia.Rc:d=he(this);this.j[d]=J.Aa.tb;Kb(this,"doNVRCommand(): erase data at addr "+q(d));break;case J.Aa.Ia.Mc:this.b=this.b<<1|d;break;case J.Aa.Ia.sd:d=he(this);e=this.b&J.Aa.tb;this.j[d]=e;Kb(this,"doNVRCommand(): write data "+q(e)+" to addr "+q(d));break;case J.Aa.Ia.md:d=he(this);e=this.j[d];
null==e&&(e=J.Aa.tb);this.b=e;Kb(this,"doNVRCommand(): read data "+q(e)+" from addr "+q(d));break;case J.Aa.Ia.nd:this.b<<=1;this.S=this.b&J.Aa.tb+1;break;default:Kb(this,"doNVRCommand(): unrecognized command "+na(e))}}c&=~J.xa.kc;this.S&&(c|=J.xa.kc);c&=~J.xa.dc;if(d=this.B){d=this.B;if(e=d.A)e=d.w,e=Wc(d.w)>=d.G+(e.za*e.U/1E3*1.2731488|0);e&&(d.A=!1);d=!d.A}d&&(c|=J.xa.dc);c&=~J.xa.sc;this.C&&this.C.ia&ie&&(c|=J.xa.sc);this.F=c;y(this,a,null,b,"FLAGS",c);return c};
null==e&&(e=J.Aa.tb);this.b=e;Kb(this,"doNVRCommand(): read data "+q(e)+" from addr "+q(d));break;case J.Aa.Ia.nd:this.b<<=1;this.S=this.b&J.Aa.tb+1;break;default:Kb(this,"doNVRCommand(): unrecognized command "+na(e))}}c&=~J.xa.kc;this.S&&(c|=J.xa.kc);c&=~J.xa.dc;if(d=this.B){d=this.B;if(e=d.A)e=d.w,e=Wc(d.w)>=d.G+(e.za*e.T/1E3*1.2731488|0);e&&(d.A=!1);d=!d.A}d&&(c|=J.xa.dc);c&=~J.xa.sc;this.C&&this.C.ia&ie&&(c|=J.xa.sc);this.F=c;y(this,a,null,b,"FLAGS",c);return c};
l.be=function(a,b,c){y(this,a,b,c,"BRIGHTNESS");this.W=b};l.ee=function(a,b,c){y(this,a,b,c,"NVR.LATCH");this.L=b};l.de=function(a,b,c){y(this,a,b,c,"DC012");a=b&3;switch(b>>2&3){case 0:this.u=this.u&-4|a;break;case 1:this.u=this.u&-13|a<<2;this.video&&(b=this.video,a=this.u,Kb(b,"updateScrollOffset("+a+")"),b.sa!==a&&((b.sa=a)?rd(b,!0):b.wa=!0));break;case 2:switch(a){case 0:this.O=~this.O;break;case 2:case 3:this.X=3-a}break;case 3:this.V=a}};
l.ce=function(a,b,c){y(this,a,b,c,"DC011");b&J.Ja.ld?(b&=J.Ja.oc,this.H!=b&&(this.H=b,this.video&&(a=this.video,b=this.H==J.Ja.oc?50:60,Kb(a,"updateRate("+b+")"),a.gb=b))):(b&=J.Ja.Wb,this.G!=b&&(this.G=b,this.video&&(a=this.G==J.Ja.Wb?132:80,b=this.video,Kb(b,"updateDimensions("+a+","+(80<a&&this.F&J.xa.ic?14:24)+")"),b.O=a,b.ga=b.Ca,80<a&&b.ga--,je(b)&&ke(b))))};
var ge={pa:1978.1,qd:{qa:0,hf:1,mf:16,uf:32,Ef:64,Df:128,$a:14},Na:{qa:1,Pc:1,jd:2,ed:4,fd:16,gd:32,hd:64,$a:8},rd:{qa:2,gf:3,Mf:4,jf:8,zf:16,Af:32,Bf:64,kf:128,$a:0},If:{qa:3},Gf:{qa:2,vf:7},Kf:{qa:3,Nf:1,Jf:2,Cf:4,sf:8,lf:16,Ce:32},Hf:{qa:4},Lf:{qa:5,nf:1,pf:2,qf:4,rf:8,Of:16}},J={pa:100,xa:{qa:66,sc:1,ic:2,dd:4,yf:8,xf:16,kc:32,jc:64,dc:128},Oc:{qa:66,INIT:0},Ja:{qa:194,Fe:0,Wb:16,ld:32,oc:48,Uc:0,Vc:32},sb:{qa:162,Ff:0,Xc:0,Tc:0,Wc:0,Sc:0},Aa:{tf:{qa:98},Ia:{Mc:0,Lc:1,nd:2,sd:4,Rc:5,md:6,od:7},
@ -155,7 +156,7 @@ k++);if(36==v)break;p+=String.fromCharCode(v)}a.print(p.replace(/\r/g,""));break
function Qe(a){u.call(this,"Keyboard",a,65536);(a=a.model)&&!Re[a]&&fb("Unrecognized Keyboard8080 model: "+a);this.b=Re[a]||{};this.reset();Gb(this)}aa(Qe,u);l=Qe.prototype;
l.da=function(a,b,c){var d=this,e=a+"-"+b;if(void 0===this.P[e]){if("led"==a&&this.b.bb[b])return this.P[e]=c,!0;switch(b){case "kbd":case "screen":return Ra("iOS")?(c.onkeypress=function(a){var b=!1;if(a=d.b.qb[a.keyCode||a.charCode]){a&128&&(a&=127,b=!0);var c;a:{for(c in d.b.Ra)if(d.b.Ra[c]==a){c=+c;break a}c=0}c&&(b?Se(d,16,!0,!0):Se(d,16,!1),Se(d,c,!0,!0))}return!0},c.onkeydown=function(a){return Te(d,a,!0)},c.onkeyup=function(a){return Te(d,a,!1)}):(c.onkeydown=function(a){return Ue(d,a,!0)},
c.onkeyup=function(a){return Ue(d,a,!1)},c.onkeypress=function(a){a=a.keyCode||a.charCode;a>=m.Za&&a<=m.ub?d.g&(Ve|We)||(d.g|=We,Se(d,20,!0),Xe(d)):a>=m.yc&&a<=m.z&&d.g&We&&(d.g&=~We,Se(d,20,!1),Xe(d));return!0}),c.onpaste=function(a){a:{if(d.C&&d.C.Qa&&(a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),a=a.clipboardData||window.clipboardData)){Ye(d.C,a.getData("Text"));a=!1;break a}a=!0}return a},!0;default:if(this.b.Ta&&void 0!==this.b.Ta[b])return this.P[e]=c,c.onclick=
function(a,b){return function(d){d.preventDefault&&d.preventDefault();d=!0;var e=0;17==b?e=Ze:20==b&&(e=We);if(e){c.style.fontWeight="normal";if(d=!(a.g&e))c.style.fontWeight="bold";$e(a,b,d)}Se(a,b,d,!e);a.R&&a.R.Xa()}}(this,this.b.Ta[b]),!0}}return!1};l.Fa=function(a,b,c,d){this.R=a;this.w=c;this.K=d;var e=this;this.L=ad(this.w,function(){af(e)});this.W=Qb(a,"ChipSet");this.C=Qb(a,"SerialPort");hc(b,this,this.b.zb);lc(b,this,this.b.Ab)};
function(a,b){return function(d){d.preventDefault&&d.preventDefault();d=!0;var e=0;17==b?e=Ze:20==b&&(e=We);if(e){c.style.fontWeight="normal";if(d=!(a.g&e))c.style.fontWeight="bold";$e(a,b,d)}Se(a,b,d,!e);a.R&&a.R.Xa()}}(this,this.b.Ta[b]),!0}}return!1};l.Fa=function(a,b,c,d){this.R=a;this.w=c;this.K=d;var e=this;this.L=ad(this.w,this.id,function(){af(e)});this.W=Qb(a,"ChipSet");this.C=Qb(a,"SerialPort");hc(b,this,this.b.zb);lc(b,this,this.b.Ab)};
l.va=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};l.ua=function(a){return a?this.save():!0};l.reset=function(){this.j=[];this.g=0;this.b.INIT&&!this.restore(this.b.INIT)&&this.aa("reset error")};l.save=function(){var a=new zd(this);switch(this.b.pa){case K.pa:a.set(0,[this.F,this.B,this.A,this.G,-1])}return a.data()};
l.restore=function(a){var b;if(a&&(b=a[0])&&b.length)switch(this.b.pa){case bf.pa:return!0;case K.pa:return this.F=b[0],Xe(this,this.F&K.Ba.ec),this.B=b[1],this.A=b[2],this.G=b[3],this.u=b[4],!0}return!1};function Xe(a,b){var c;null!=b?a.H=b:b=a.H;for(var d in a.b.bb)if(c="led-"+d,c=a.P[c]){var e=a.b.bb[d],f=!!(b&e);e&e-1&&(f=!(b&~e));c.style.backgroundColor=f?"#"+n(16711680,6):"#000000"}if(c=a.P["led-caps-lock"])c.style.backgroundColor=a.g&We?"#"+n(65280,6):"#000000"}
function $e(a,b,c,d){var e=0;switch(b){case 16:e=d?cf:df;break;case 17:e=d?ef:Ze;break;case 18:e=d?ff:gf;break;case 91:e=d?hf:jf;break;case 20:e=We,c=!(a.g&e)}e&&(a.g=c?a.g|e:a.g&~e);return c}
@ -176,7 +177,7 @@ this.H),this.j.rotate(this.u*Math.PI/180),this.j.scale(this.H/this.M,this.M/this
this.S+"&format=bytes"),Ja(this.S,null,!0,function(a,b,c){tf(f,a,b,c)});this.za={}}aa(pf,u);
function je(a){a.C=a.O*a.ga;a.N=a.Z*a.ca;var b=a.C,c=a.N;a.g&&(b=a.N,c=a.C);a.L=0;if(!a.wd&&(a.L=(a.C*a.na>>3)*a.N,!Wb(a.I,a.la,a.L,3)))return!1;a.L?(a.Ua=a.j.createImageData(b,c),a.eb=16/a.na|0,uf(a,a.L>>1)):uf(a,(a.O+1)*a.Z);a.F=document.createElement("canvas");a.F.width=b;a.F.height=c;a.ta=a.F.getContext("2d");a.T={};a.X=1<<a.na;a.U=Array(a.X+vf);a.U[0]=[0,0,0,255];a.U[1]=[255,255,255,255];a.Y==wf&&(a.U[a.X+xf]=[255,255,0,255],a.U[a.X+yf]=[0,255,0,255]);a.Y==zf&&(a.gb=60,a.ya=!1,a.fa=Array(a.O));
return!0}l=pf.prototype;l.da=function(a,b,c){var d=this;if("led"==a||"rled"==a)return this.za[b]=c,!0;switch(b){case "fullScreen":return this.P[b]=c,this.b&&this.b.kb?c.onclick=function(){d.kb()}:c.parentNode.removeChild(c),!0}return!1};
l.Fa=function(a,b,c,d){this.R=a;this.I=b;this.w=c;this.K=d;je(this);if(this.B=Qb(a,"Keyboard")){for(var e in this.za)this.B.da("led",e,this.za[e]);this.G&&this.B.da(this.Dd?"textarea":"canvas","screen",this.V)}var f=this;this.vb=ad(this.w,function(){rd(f)});bd(this.w,this.vb,1E3/Math.max(this.hb,this.oa));this.fb=0;this.S||Gb(this)};
l.Fa=function(a,b,c,d){this.R=a;this.I=b;this.w=c;this.K=d;je(this);if(this.B=Qb(a,"Keyboard")){for(var e in this.za)this.B.da("led",e,this.za[e]);this.G&&this.B.da(this.Dd?"textarea":"canvas","screen",this.V)}var f=this;this.vb=ad(this.w,this.id,function(){rd(f)});bd(this.w,this.vb,1E3/Math.max(this.hb,this.oa));this.fb=0;this.S||Gb(this)};
function tf(a,b,c,d){if(d)a.aa("Unable to load font ROM (error "+d+": "+b+")");else{lb(a.ab,b,c);try{var e=eval("("+c+")"),f=e.bytes||e;if(!f||!f.length){r("Empty font ROM: "+b);return}if(1==f.length){r(f[0]);return}if(2048==f.length)a.ba=f,ke(a);else{a.aa("Unrecognized font data length ("+f.length+")");return}}catch(g){a.aa("Font ROM data error: "+g.message);return}(a.j||a.K)&&Gb(a)}}
function ke(a){a.ba&&(a.Ma=a.Y==zf,a.T[Af]=[Bf(a,a.ga,a.ca),Bf(a,a.ga,a.ca,a.ya)],a.T[Cf]=[Bf(a,2*a.ga,a.ca),Bf(a,2*a.ga,a.ca,a.ya)],a.T[Df]=a.T[Ef]=[Bf(a,2*a.ga,2*a.ca),Bf(a,2*a.ga,2*a.ca,a.ya)])}
function Bf(a,b,c,d){var e=8>=a.Ca?8:16,f=8<e?15:0,g=a.ba.length/e,h=!1===d,k={ga:b,ca:c};k.canvas=document.createElement("canvas");k.canvas.width=16*b;k.canvas.height=g/16*c;k.context=k.canvas.getContext("2d");for(var p=k.context.createImageData(b,c),t=0;t<g;t++){for(var v=0,z=v;v<a.ca;v++)for(var x=t*e+(f+v&e-1),x=d&&8==v?255:a.ba[x],w=0;w<c/a.ca;w++){for(var C=0,T=0,ya=T;T<a.ga;T++){for(var L=x&128>>(7<T?7:T),C=a.Ma&&!L&&C?C:L,za=0;za<b/a.ga;za++)h&&(C=!C),Ff(a,p,ya,z,C?1:0),ya++;C=L}z++}k.context.putImageData(p,
@ -191,10 +192,10 @@ Za(function(){for(var a=sb(document,"pc8080","video"),b=0;b<a.length;b++){var c=
(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());var f=+(d.aspect||Ua("aspect"));f&&.3<=f&&3.33>=f&&(Ya("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");Ra("iOS")&&(f.setAttribute("autocapitalize","off"),f.setAttribute("autocorrect","off"),f.style.fontSize="16px");c.appendChild(f);var g=e.getContext("2d"),d=new pf(d,e,g,f,c);rb(d,c)}});
function Mf(a){u.call(this,"SerialPort",a,8388608);this.T=+a.adapter;switch(this.T){case 0:this.U=0;this.X=2;break;default:r("Unrecognized serial adapter #"+this.T);return}this.g=this.j=null;this.V=a.tabSize;this.S=a.charBOL;this.u=0;this.N=!1;this.F=!0;var b=a.binding;if("console"==b)this.j="";else{var c;a=Nf;b&&(void 0===c&&(c="Panel"),(c=wb(c,this.id))&&(b=c.P[b])&&this.da(null,a,b))}this.A="";this.b=this.Qa=this.H=null;this.exports={connect:this.Fc,receiveData:this.Nb,receiveStatus:this.oe}}
aa(Mf,u);l=Mf.prototype;l.da=function(a,b,c,d){var e=this;switch(b){case Nf:return this.P[b]=this.g=c,c.onkeydown=function(a){a=a||window.event;var b=a.keyCode;if(8===b||a.ctrlKey&&65<=b&&90>=b)a.preventDefault&&a.preventDefault(),64<b&&(b-=64),Of(e,b);return!0},c.onkeypress=function(a){a=a||window.event;Of(e,a.which||a.keyCode);a.preventDefault&&a.preventDefault();return!0},c.removeAttribute("readonly"),!0;default:if(d)return this.P[b]=c,c.onclick=function(){e.Nb(d);return!0},!0}return!1};
l.Fa=function(a,b,c,d){this.R=a;this.I=b;this.w=c;this.K=d;var e=this;this.Y=ad(this.w,function(){e.Nb()});this.Z=ad(this.w,function(){Ye(e)});this.W=Qb(a,"ChipSet");hc(b,this,Pf,this.U);lc(b,this,Qf,this.U);Gb(this)};
l.Fa=function(a,b,c,d){this.R=a;this.I=b;this.w=c;this.K=d;var e=this;this.Y=ad(this.w,this.id+".receive",function(){e.Nb()});this.Z=ad(this.w,this.id+".transmit",function(){Ye(e)});this.W=Qb(a,"ChipSet");hc(b,this,Pf,this.U);lc(b,this,Qf,this.U);Gb(this)};
l.Fc=function(a){if(!this.b){var b=Pc(this.R,"connection");if(b){var c=b.split("->");if(2==c.length){var d=xa(c[0]);if(d!=this.Gb)return;c=xa(c[1]);if(this.b=vb(c)){var e=this.b.exports;if(e){var f=e.connect;f&&f.call(this.b,this.F);if(this.Qa=e.receiveData){this.F=a;this.H=e.receiveStatus;this.status("Connected "+this.ab+"."+d+" to "+c);return}}}}this.status("Unable to establish connection: "+b)}}};
l.va=function(a,b){if(!b)if(this.Fc(this.F),!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};l.ua=function(a){return a?this.save():!0};l.reset=function(){Rf(this)};l.save=function(){var a=new zd(this),b=0,c=[];c[b++]=this.G;c[b++]=this.M;c[b++]=this.O;c[b++]=this.ia;c[b++]=this.B;c[b++]=this.C;c[b]=this.L;a.set(0,c);return a.data()};l.restore=function(a){return Rf(this,a[0])};
function Rf(a,b){var c=0;b||(b=Sf);a.G=b[c++];a.M=b[c++];a.O=b[c++];a.ia=b[c++];a.B=b[c++];a.C=b[c++];a.L=b[c];return!0}function Tf(a,b){var c=a.L&b;b&15||(c>>=4);b=Uf[c];c=((a.B&Vf)>>2)+6;a.B&Wf&&c++;c+=((a.B&Xf)>>6)+1>>1;return 1E3/Math.round(b/c)}function Of(a,b){Kb(a,"receiveByte("+na(b)+"), status="+na(a.ia));return a.N||a.ia&Yf?!1:(a.M=b,a.ia|=Yf,Xd(a.w,a.X),!0)}
function Rf(a,b){var c=0;b||(b=Sf);a.G=b[c++];a.M=b[c++];a.O=b[c++];a.ia=b[c++];a.B=b[c++];a.C=b[c++];a.L=b[c];return!0}function Tf(a,b){var c=a.L&b;b&15||(c>>=4);b=Uf[c];c=((a.B&Vf)>>2)+6;a.B&Wf&&c++;c+=((a.B&Xf)>>6)+1>>1;return 1E3/(b/c)|0}function Of(a,b){Kb(a,"receiveByte("+na(b)+"), status="+na(a.ia));return a.N||a.ia&Yf?!1:(a.M=b,a.ia|=Yf,Xd(a.w,a.X),!0)}
l.Nb=function(a){null!=a&&(this.A="number"!=typeof a?a:this.A+String.fromCharCode(a));this.A&&(Of(this,this.A.charCodeAt(0))&&(this.A=this.A.substr(1)),this.A&&this.w&&bd(this.w,this.Y,Tf(this,Zf)));return!0};l.oe=function(a){this.ia&=~$f;a&64&&(this.ia|=$f)};function Ye(a,b){a.ia=a.ia|ie|ag;b&&a.Qa&&a.Qa.call(a.b,b)}l.Id=function(a,b){var c=this.M;y(this,a,null,b,"DATA",c);this.ia&=~Yf;return c};l.Hd=function(a,b){var c=this.ia;y(this,a,null,b,"STATUS",c);return c};
l.Wd=function(a,b,c){y(this,a,b,c,"DATA");this.O=b;this.ia&=~(ie|ag);Kb(this,"transmitByte("+na(b)+")");if(19==b)this.N=!0;else if(17==b)this.N=!1;else if(this.Qa&&this.Qa.call(this.b,b),this.g)if(8==b)this.g.value=this.g.value.slice(0,-1),0<this.u&&this.u--;else{var d;13!=b&&10!=b&&(d=Ca[b]);a=d=d?"<"+d+">":String.fromCharCode(b);c=a.length;9==b?(b=this.V||8,c=b-this.u%b,this.V&&(a=wa("",c))):13==b&&(this.u=c=0,a="\n");this.S&&!this.u&&c&&(a=String.fromCharCode(this.S)+a);this.g.value+=a;this.g.scrollTop=
this.g.scrollHeight;this.u+=c}else if(null!=this.j){if(10==b||1024<=this.j.length)this.i(this.j),this.j="";10!=b&&(this.j+=String.fromCharCode(b))}this.w&&bd(this.w,this.Z,Tf(this,bg))};l.Vd=function(a,b,c){y(this,a,b,c,"CONTROL");this.G?(this.H&&(b^this.C)&(cg|dg)&&(a=0,this.F?(a|=b&cg?32:0,a|=b&dg?320:0):(a|=b&cg?16:0,a|=b&dg?1048576:0),this.H.call(this.b,a)),this.C=b,this.C&eg&&(this.G=!1)):(this.B=b,this.G=!0)};l.Ud=function(a,b,c){y(this,a,b,c,"BAUDRATES");this.L=b};
@ -244,7 +245,7 @@ function ci(a,b,c){var d=[],e=Ag(b)>>>0;for(b=0;b<a.C.length;b++){var f=a.C[b],g
function ei(a,b){if("?"==b)a.i("frequency commands:"),a.i("\tclear\tclear all frequency counts");else{var c=0;if(a.F)if("clear"==b){for(b=0;b<a.F.length;b++)a.F[b]=[b,0];a.i("frequency data cleared");c++}else if(void 0!==b)a.i("unknown frequency command: "+b),c++;else{var d=a.F.slice();d.sort(function(a,b){return b[1]-a[1]});var e=a.style!=Kh?Lh:Mh;for(b=0;b<d.length;b++){var f=d[b][0],g=d[b][1];g&&(a.i((e[a.oa[f][0]]+" ").substr(0,5)+" ("+na(f)+"): "+g+" times"),c++)}}c||a.i("no frequency data available")}}
function fi(a,b){var c=b.match(/^\s*([A-Z_]?[A-Z0-9_]*)\s*(=?)\s*(.*)$/i);if(c){if(!c[1])return sg(a)||a.i("no variables"),!0;if(!c[2])return sg(a,c[1]);if(!c[3])return delete a.A[c[1]],!0;b=pg(a,c[3]);return void 0!==b?(a.A[c[1]]={value:b,qe:void 0},!0):!1}a.i("invalid assignment:"+b);return!1}
function gi(a,b,c){var d=null;if(b=Bg(a,b,!0)){var e=ci(a,b,!0);if(e.length){var f,g;e[0]&&(g="",(f=b.J-e[1])&&(g=" + "+q(f)),f=e[0]+" ("+fh(e[1])+")"+g,c&&a.i(f),d=f);4<e.length&&e[4]&&(g="",(f=e[5]-b.J)&&(g=" - "+q(f)),f=e[4]+" ("+fh(e[5])+")"+g,c&&a.i(f),d||(d=f))}else c&&a.i("no symbols")}return d}
function hi(a,b){switch(b[1]){case "8080":a.style=ug;break;case "8086":a.style=Kh;break;case "cs":var c;void 0!==b[3]&&(c=+b[3]);switch(b[2]){case "int":a.w.na=c;break;case "start":a.w.ya=c;break;case "stop":a.w.sa=c;break;default:a.i("unknown cs option");return}void 0!==c&&Rc(a.w);a.i("checksums "+(a.w.D.Va?"enabled":"disabled"));return;case "sp":void 0!==b[2]&&(Xc(a.w,+b[2])||a.i("warning: using 1x multiplier, previous target not reached"));a.i("target speed: "+(a.w.Z.toFixed(2)+"Mhz")+" ("+a.w.U+
function hi(a,b){switch(b[1]){case "8080":a.style=ug;break;case "8086":a.style=Kh;break;case "cs":var c;void 0!==b[3]&&(c=+b[3]);switch(b[2]){case "int":a.w.na=c;break;case "start":a.w.ya=c;break;case "stop":a.w.sa=c;break;default:a.i("unknown cs option");return}void 0!==c&&Rc(a.w);a.i("checksums "+(a.w.D.Va?"enabled":"disabled"));return;case "sp":void 0!==b[2]&&(Xc(a.w,+b[2])||a.i("warning: using 1x multiplier, previous target not reached"));a.i("target speed: "+(a.w.Z.toFixed(2)+"Mhz")+" ("+a.w.T+
"x)");return;case "?":a.i("debugger options:");a.i("\t8080\t\tselect 8080-style mnemonics");a.i("\t8086\t\tselect 8086-style mnemonics");a.i("\tcs int #\tset checksum cycle interval to #");a.i("\tcs start #\tset checksum cycle start count to #");a.i("\tcs stop #\tset checksum cycle stop count to #");a.i("\tsp #\t\tset speed multiplier to #");break;default:if(b[1]){a.i("unknown option: "+b[1]);return}}a.i(a.style+"-style mnemonics enabled")}
function Ch(a,b){var c;if(b&&"?"==b[1])a.i("register commands:"),a.i("\tr\tdump registers"),a.i("\trx [#]\tset flag or register x to [#]");else{var d=a.w;null==c&&(c=!0);if(b&&1<b.length){var e=b[1],f=e.indexOf("=");if(0<f)b=e.substr(f+1),e=e.substr(0,f);else if(2<b.length)b=b[2];else{a.i("missing value for "+b[1]);return}f=pg(a,b);if(void 0===f)return;switch(e.toUpperCase()){case "A":d.g=f&255;break;case "B":d.u=f&255;break;case "BC":d.u=f>>8&255;case "C":d.A=f&255;break;case "D":d.B=f&255;break;
case "DE":d.B=f>>8&255;case "E":d.C=f&255;break;case "H":d.F=f&255;break;case "HL":d.F=f>>8&255;case "L":d.G=f&255;break;case "SP":d.M=f&65535;break;case "PC":B(d,f);a.L=vg(d.j);break;case "PS":wd(d,f);break;case "PSW":wd(d,f&255|d.N&-256);d.g=f>>8;break;case "CF":d.H=f?d.H|256:d.H&255;break;case "PF":f?Hd(d)||(d.L^=1):Hd(d)&&(d.L^=1);break;case "AF":d.O=f?~d.L&16|d.O&-17:d.L&16|d.O&-17;break;case "ZF":d.H=f?d.H&-256:d.H|255;break;case "SF":f?Kd(d)||(d.L^=192):Kd(d)&&(d.L^=192);break;case "IF":d.N=
@ -254,15 +255,15 @@ l.yb=function(a,b,c){if(b)if(a){0>this.b&&this.g.length&&(this.b=0);if(0>this.b|
function Ih(a,b,c){var d=!0;try{b.length&&"end"!=b?c||a.i(">> "+b):(a.N&&(a.i("ended assemble at "+fh(a.T.J)),a.L=a.T,a.N=!1),b="");var e=b.charAt(0);if('"'==e||"'"==e)return!0;a.Y=null;if(Fb(a)&&0<b.length){a.N&&(b="a "+fh(a.T.J)+" "+b);var f=b.replace(/ +/g," ").split(" ");if(f&&f.length)for(var g=f[0],h=g.charAt(0),k=1;k<g.length;k++){var p=g.charAt(k);if("?"==h||"r"==h||"a">p||"z"<p){f[0]=g.substr(k);f.unshift(g.substr(0,k));break}}switch(f[0].charAt(0)){case "a":var t=Bg(a,f[1],!0);if(t)if(a.T=
t,void 0===f[2])a.i("begin assemble at "+fh(t.J)),a.N=!0,Uc(a.w);else{var v;a.i("not supported yet");v=[];if(v.length){for(var z=0;z<v.length;z++)a.Xb(t,v[z],1);a.i(Jh(a,a.T))}}break;case "b":a:{var x=f[0],w=f[1],C=b;if("?"==w)a.i("breakpoint commands:"),a.i("\tbi [p]\ttoggle break on input port [p]"),a.i("\tbo [p]\ttoggle break on output port [p]"),a.i("\tbp [a]\tset exec breakpoint at addr [a]"),a.i("\tbr [a]\tset read breakpoint at addr [a]"),a.i("\tbw [a]\tset write breakpoint at addr [a]"),a.i("\tbc [a]\tclear breakpoint at addr [a]"),
a.i("\tbl\tlist all breakpoints"),a.i("\tbn [n]\tbreak after [n] instruction(s)");else{var T=x.charAt(1);if("l"==T){var ya;ya=0+Hh(a,a.j);ya+=Hh(a,a.M);(ya+=Hh(a,a.B))||a.i("no breakpoints")}else if("n"==T)a.X=jg(a,w),a.i("break after "+a.X+" instruction(s)");else if(void 0===w)a.i("missing breakpoint address");else{var L=vg();if("*"!=w&&(L=Bg(a,w,!0),!L))break a;w=q(L.J);"c"==T?null==L.J?(wg(a),a.i("all breakpoints cleared")):Fh(a,a.j,L)||Fh(a,a.M,L)||Fh(a,a.B,L)||a.i("breakpoint missing: "+fh(L.J)):
"i"==T?a.i("breakpoint "+(gc(a.I,L.J)?"enabled":"cleared")+": port "+w+" (input)"):"o"==T?a.i("breakpoint "+(kc(a.I,L.J)?"enabled":"cleared")+": port "+w+" (output)"):null!=L.J&&(eh(a,L,C),"p"==T?a.Oa(a.j,L):"r"==T?a.Oa(a.M,L):"w"==T?a.Oa(a.B,L):a.i("unknown breakpoint command: "+T))}}}break;case "c":var za=a.R;za.B&&(za.B.value="");break;case "d":a:{var sa,Aa=f[0],ta=f[1],Ba=f[2],Oi=f[3];if("?"==ta){var Rb="";for(sa in Ob)a.la[sa]&&(Rb&&(Rb+=","),Rb+=sa);Rb+=",state,symbols";a.i("dump memory commands:");
a.i("\tdb [a] [#] dump # bytes at address a");a.i("\tdw [a] [#] dump # words at address a");a.i("\tdd [a] [#] dump # dwords at address a");a.i("\tdh [#] [#] dump # instructions from history");Rb.length&&a.i("dump extension commands:\n\t"+Rb)}else if("state"==ta){var se=ki(a.R,!0);if("console"==Ba)console.log(se);else{var Dg=a.R;Dg.B&&(Dg.B.value="");se&&a.i(se)}}else if("symbols"==ta)for(var te=0;te<a.C.length;te++){var ue=a.C[te],Sb;for(Sb in ue.ra)if("."!=Sb.charAt(0)){var Eg=ue.ra[Sb].o;
if(void 0!==Eg){var Fg=ue.ra[Sb].l;Fg&&(Sb=Fg);a.i(fh(Eg)+" "+Sb)}}}else{if("d"==Aa){for(sa in Ob)if(f[1]==sa){var Gg=a.la[sa];Gg?(f.shift(),f.shift(),Gg(f)):a.i("no dump registered for "+ta);break a}ta||(Aa=a.Ca||"db")}else a.Ca=Aa;if("dh"==Aa){var Hg=ta,Ig=Ba,Jg="",Kg=0,Oa=a.W,bb=a.H;if(bb.length){var Da=+Hg||a.wa,oc=+Ig||10;isNaN(Da)?Da=oc:Jg="more ";Da>bb.length&&(a.i("note: only "+bb.length+" available"),Da=bb.length);Oa-=Da;0>Oa&&(null==bb[bb.length-1].J?(Da=Oa+Da,Oa=0):Oa+=bb.length);var ve=
"i"==T?a.i("breakpoint "+(gc(a.I,L.J)?"enabled":"cleared")+": port "+w+" (input)"):"o"==T?a.i("breakpoint "+(kc(a.I,L.J)?"enabled":"cleared")+": port "+w+" (output)"):null!=L.J&&(eh(a,L,C),"p"==T?a.Oa(a.j,L):"r"==T?a.Oa(a.M,L):"w"==T?a.Oa(a.B,L):a.i("unknown breakpoint command: "+T))}}}break;case "c":var za=a.R;za.B&&(za.B.value="");break;case "d":a:{var sa,Aa=f[0],ta=f[1],Ba=f[2],Oi=f[3];if("?"==ta){var Sb="";for(sa in Ob)a.la[sa]&&(Sb&&(Sb+=","),Sb+=sa);Sb+=",state,symbols";a.i("dump memory commands:");
a.i("\tdb [a] [#] dump # bytes at address a");a.i("\tdw [a] [#] dump # words at address a");a.i("\tdd [a] [#] dump # dwords at address a");a.i("\tdh [#] [#] dump # instructions from history");Sb.length&&a.i("dump extension commands:\n\t"+Sb)}else if("state"==ta){var se=ki(a.R,!0);if("console"==Ba)console.log(se);else{var Dg=a.R;Dg.B&&(Dg.B.value="");se&&a.i(se)}}else if("symbols"==ta)for(var te=0;te<a.C.length;te++){var ue=a.C[te],Tb;for(Tb in ue.ra)if("."!=Tb.charAt(0)){var Eg=ue.ra[Tb].o;
if(void 0!==Eg){var Fg=ue.ra[Tb].l;Fg&&(Tb=Fg);a.i(fh(Eg)+" "+Tb)}}}else{if("d"==Aa){for(sa in Ob)if(f[1]==sa){var Gg=a.la[sa];Gg?(f.shift(),f.shift(),Gg(f)):a.i("no dump registered for "+ta);break a}ta||(Aa=a.Ca||"db")}else a.Ca=Aa;if("dh"==Aa){var Hg=ta,Ig=Ba,Jg="",Kg=0,Oa=a.W,bb=a.H;if(bb.length){var Da=+Hg||a.wa,oc=+Ig||10;isNaN(Da)?Da=oc:Jg="more ";Da>bb.length&&(a.i("note: only "+bb.length+" available"),Da=bb.length);Oa-=Da;0>Oa&&(null==bb[bb.length-1].J?(Da=Oa+Da,Oa=0):Oa+=bb.length);var ve=
[];"call"==Ig&&(oc=1E5,ve=["CALL"]);for(void 0!==Hg&&a.i(Da+" instructions earlier:");0<oc&&Oa!=a.W;){var Lg=bb[Oa++];if(null==Lg.J)break;var pc=vg(Lg.J),Pi=Da--,Mg=Jh(a,pc,"history",Pi);(!ve.length||0<=Mg.indexOf(ve[0]))&&a.i(Mg);pc.Ib&&(Oa+=pc.Ib,oc-=pc.Ib,Da-=pc.Ib);Oa>=bb.length&&(Oa=0);a.wa=Da;Kg++;oc--}}Kg||(a.i("no "+Jg+"history available"),a.wa=void 0)}else{var ed=Bg(a,ta);if(ed){var fd=0;Ba&&("l"==Ba.charAt(0)&&(Ba=Ba.substr(1)||Oi),fd=jg(a,Ba)>>>0,65536<fd&&(fd=65536));for(var qc="",gd=
"dd"==Aa?4:"dw"==Aa?2:1,hd=gd*fd||128,Qi=hd+15>>4||1;Qi--&&0<hd;){var id=0,we=0,rc,xe="",Ng="",ta=fh(ed.J);for(rc=16;0<rc&&0<hd;rc--){var jd=a.Ga(ed,1),id=id|jd<<(we++<<3);we==gd&&(xe+=n(id,2*gd),xe+=1==gd?9==rc?"-":" ":" ",id=we=0);Ng+=32<=jd&&128>jd?String.fromCharCode(jd):".";hd--}qc&&(qc+="\n");qc+=ta+" "+xe+(rc?"":" "+Ng)}qc&&a.i(qc);a.sa=ed}}}}break;case "e":if("else"==f[0])break;var kd=1,Og=255,Pg=a.Ga,Qg=a.Xb;"ew"==f[0]&&(kd=2,Og=65535,Pg=a.Eb,Qg=a.Qc);var Rg=kd<<1,Sg=f[1];if(null==Sg)a.i("edit memory commands:"),
a.i("\teb [a] [...] edit bytes at address a"),a.i("\tew [a] [...] edit words at address a");else{var ld=Bg(a,Sg);if(ld)for(var md=2;md<f.length;md++){var sc=pg(a,f[md]);if(void 0===sc){a.i("unrecognized value: "+f[md]);break}sc&~Og&&a.i("warning: "+n(sc)+" exceeds "+kd+"-byte value");var Ri=Pg.call(a,ld);a.i("changing "+fh(ld.J)+" from "+n(Ri,Rg,!0)+" to "+n(sc,Rg,!0));Qg.call(a,ld,sc,kd)}}break;case "f":ei(a,f[1]);break;case "g":a:{var Tg=f[1],Si=b;if(void 0!==Tg){var ye=Bg(a,Tg,!0);if(!ye)break a;
eh(a,ye,Si);a.Oa(a.j,ye,!0)}Ah(a,!0)||c||a.i("cpu busy or unavailable, run command ignored")}break;case "h":a:{var ze;if(a.D.ka)ze="halting",a.ea();else{if(Hb(a,!0))break a;ze="already halted"}c||a.i(ze)}break;case "i":if("if"==f[0]){var Ae;var tc=b.substr(2),tc=xa(tc);pg(a,tc)?(c||a.i("true: "+tc),Ae=!0):(c||a.i("false: "+tc),Ae=!1);Ae||(d=!1);break}if("int"==f[0]){var nd;var Ti=f[1];if(a.w.N&512){var Be=pg(a,Ti);null==Be?nd=!1:(a.i("requesting interrupt level "+Be),Xd(a.w,Be),nd=!0)}else a.i("interrupts disabled (use rif=1 to enable)"),
nd=!1;nd||(d=!1);break}var Ce=f[1];if(Ce&&"?"!=Ce){var De=jg(a,Ce);if(void 0!==De){var Ui=ic(a.I,De);a.i(q(De)+": "+na(Ui))}}else a.i("input commands:"),a.i("\ti [p]\tread port [p]"),a.i("warning: port accesses can affect hardware state");break;case "k":var Vi=f[0];if("?"==f[1])a.i("stack trace commands:"),a.i("\tk\tshow frame addresses"),a.i("\tks\tshow symbol information");else{var Ee=0,Ug=vg(),uc=vg(a.w.M);for(a.i("stack trace for "+fh(uc.J));10>Ee;){for(var xb=null,Wi=256;65536>uc.J>>>0;){Ug.J=
a.Eb(uc,2);if(null==uc.J||!Wi--)break;for(var Xi=a,od=Ug,Vg=null,vc=od.J,Wg=vc,Fe=1;6>=Fe&&vc;Fe++){if(2<Fe){od.J=vc;var pd=Jh(Xi,od);if(0<=pd.indexOf("CALL")){var Xg=pd.indexOf(" ");if(vc+(pd.indexOf(" ",Xg+1)-Xg-1)/2==Wg){Vg=pd;break}}}vc--}od.J=Wg;if(xb=Vg)break}if(!xb||null==xb)break;var Yg=null;if("ks"==Vi){var Zg=xb.match(/[0-9A-F]+$/);Zg&&(Yg=gi(a,Zg[0]))}xb=wa(xb,50)+" ;"+(Yg||"stack="+fh(uc.J));a.i(xb);Ee++}Ee||a.i("no return addresses found")}break;case "l":"ln"==f[0]&&gi(a,f[1],!0);break;
nd=!1;nd||(d=!1);break}var Ce=f[1];if(Ce&&"?"!=Ce){var De=jg(a,Ce);if(void 0!==De){var Ui=ic(a.I,De);a.i(q(De)+": "+na(Ui))}}else a.i("input commands:"),a.i("\ti [p]\tread port [p]"),a.i("warning: port accesses can affect hardware state");break;case "k":var Vi=f[0];if("?"==f[1])a.i("stack trace commands:"),a.i("\tk\tshow frame addresses"),a.i("\tks\tshow symbol information");else{var Ee=0,Ug=vg(),uc=vg(a.w.M);for(a.i("stack trace for "+fh(uc.J));10>Ee;){for(var yb=null,Wi=256;65536>uc.J>>>0;){Ug.J=
a.Eb(uc,2);if(null==uc.J||!Wi--)break;for(var Xi=a,od=Ug,Vg=null,vc=od.J,Wg=vc,Fe=1;6>=Fe&&vc;Fe++){if(2<Fe){od.J=vc;var pd=Jh(Xi,od);if(0<=pd.indexOf("CALL")){var Xg=pd.indexOf(" ");if(vc+(pd.indexOf(" ",Xg+1)-Xg-1)/2==Wg){Vg=pd;break}}}vc--}od.J=Wg;if(yb=Vg)break}if(!yb||null==yb)break;var Yg=null;if("ks"==Vi){var Zg=yb.match(/[0-9A-F]+$/);Zg&&(Yg=gi(a,Zg[0]))}yb=wa(yb,50)+" ;"+(Yg||"stack="+fh(uc.J));a.i(yb);Ee++}Ee||a.i("no return addresses found")}break;case "l":"ln"==f[0]&&gi(a,f[1],!0);break;
case "m":a:{var cb,db=null,ba=f[1];"?"==ba&&(ba=void 0);if(void 0!==ba){var ob=0;if("all"==ba)ob=1610481663,ba=null;else if("on"==ba)db=!0,ba=null;else if("off"==ba)db=!1,ba=null;else{"keys"==ba&&(ba="key");"kbd"==ba&&(ba="keyboard");for(cb in Ob)if(ba==cb){ob=Ob[cb];db=!!(a.ha&ob);break}if(!ob){a.i("unknown message category: "+ba);break a}}if(ob)if("on"==f[2])a.ha|=ob,db=!0;else if("off"==f[2]&&(a.ha&=~ob,db=!1,536870912==ob)){for(var Ge=0;Ge<a.Z.length;Ge++)a.i(a.Z[Ge]);a.Z=[]}}var Yi=0,wc="";for(cb in Ob)if(!ba||
ba==cb){var Zi=!!(a.ha&Ob[cb]);if(null===db||db==Zi)wc&&(wc+=","),++Yi%10||(wc+="\n\t"),"key"==cb&&(cb="keys"),wc+=cb}void 0===ba&&a.i("message commands:\n\tm [category] [on|off]\tturn categories on/off");a.i((null!==db?db?"messages on: ":"messages off: ":"message categories:\n\t")+(wc||"none"));xg(a)}break;case "o":var He=f[1],$i=f[2];if(He&&"?"!=He){var Ie=jg(a,He,"port #"),Je=jg(a,$i);void 0!==Ie&&void 0!==Je&&(mc(a.I,Ie,Je),a.i(q(Ie)+": "+na(Je)))}else a.i("output commands:"),a.i("\to [p] [b]\twrite byte [b] to port [p]"),
a.i("warning: port accesses can affect hardware state");break;case "p":if("print"==f[0]){ii(a,b.substr(5));break}var $g="pr"==f[0]?1:0,aj=1+$g;if(a.O)a.i("step in progress");else{var Ke=vg(a.w.j);switch(a.Ga(Ke)){case 205:a.O=aj,ah(Ke,3)}a.O?(a.Oa(a.j,Ke,!0),Ah(a)||(a.R&&a.R.Xa(),a.O=0)):ji(a,$g?"tr":"t")}break;case "r":if("reset"==b){a.R&&a.R.reset();break}Ch(a,f);break;case "s":hi(a,f);break;case "t":ji(a,f[0],f[1]);break;case "u":Dh(a,f[1],f[2],8);break;case "v":if("var"==f[0]){fi(a,b.substr(3))||
@ -308,5 +309,5 @@ function ij(a,b,c){var d;if(d=/<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g.exec(a)){var e=
function jj(a,b,c,d){function e(a){if(void 0===h){var b=g&&sb(g,"machine-warning");h=b&&b[0]||g}h&&(h.innerHTML=ua(a))}function f(a){e("Error: "+a);k&&(--fj||gb(!0));k=!1}var g,h,k=!0;fj++;mb[a]={};try{if(g=document.getElementById(a)){var p;if("object"==typeof resources&&(p=resources.css)){var t=document.head||document.getElementsByTagName("head")[0],v=document.createElement("style");v.type="text/css";v.styleSheet?v.styleSheet.cssText=p:v.appendChild(document.createTextNode(p));t.appendChild(v)}c||
(c="/versions/pc8080/1.36.2/components.xsl");p=function(d,h){h?gj(c,null,null,!1,e,function(d,k){k?(lb(a,c,d),e("Processing "+b+"..."),window.ActiveXObject||"ActiveXObject"in window?(k=h.transformNode(k))?(g.outerHTML=k,--fj||gb(!0)):f("transformNodeToObject failed"):document.implementation&&document.implementation.createDocument?(d=new XSLTProcessor,d.importStylesheet(k),(k=d.transformToFragment(h,document))?g.parentNode?(g.parentNode.replaceChild(k,g),--fj||gb(!0)):f("invalid machine element: "+
a):f("transformToFragment failed")):f("unable to transform XML: unsupported browser")):f(d)}):f(d)};"<"!=b.charAt(0)?gj(b,a,d,!0,e,p):hj(b,null,a,d,!1,e,p)}else f("missing machine element: "+a)}catch(z){f(z.message)}return k}window.embedPC8080=function(a,b,c,d){gb(!1);return jj(a,b,c,d)};
window.commandMachine=function(a,b,c,d,e,f){if("script"==e){d=!1;c+=".machine";if(!f)delete zb[c],d=!0;else if("string"==typeof f&&!zb[c]){d=!0;e=zb;for(var g=c,h=f.length,k=[],p=[],t="",v=null,z=0;z<h;z++){var x=f[z];if('"'==x||"'"==x)v&&x!=v?t+=x:(v?v=null:v=x,t&&(p.push(t),t=""));else{if(!v){if("\r"==x||"\n"==x)x=";";if(" "==x||"\t"==x||";"==x){t&&(p.push(t),t="");";"==x&&p.length&&(k.push(p),p=[]);continue}}t+=x}}t&&p.push(t);p.length&&k.push(p);e[g]=k;yb(c)||(d=!1)}return d?(b&&(a.disabled=!0),
window.commandMachine=function(a,b,c,d,e,f){if("script"==e){d=!1;c+=".machine";if(!f)delete zb[c],d=!0;else if("string"==typeof f&&!zb[c]){d=!0;e=zb;for(var g=c,h=f.length,k=[],p=[],t="",v=null,z=0;z<h;z++){var x=f[z];if('"'==x||"'"==x)v&&x!=v?t+=x:(v?v=null:v=x,t&&(p.push(t),t=""));else{if(!v){if("\r"==x||"\n"==x)x=";";if(" "==x||"\t"==x||";"==x){t&&(p.push(t),t="");";"==x&&p.length&&(k.push(p),p=[]);continue}}t+=x}}t&&p.push(t);p.length&&k.push(p);e[g]=k;xb(c)||(d=!1)}return d?(b&&(a.disabled=!0),
!0):!1}if(d&&(g=wb(d,c+".machine"))&&(h=g.exports)&&(h=h[e]))return h.call(g,f)?(b&&(a.disabled=!0),!0):!1;console.log("unimplemented: commandMachine('"+c+"','"+d+"','"+e+"','"+f+"')");return!1};window.enableEvents=gb;window.sendEvent=ib;})();//# sourceMappingURL=/versions/pc8080/1.36.2/pc8080-dbg.map

File diff suppressed because one or more lines are too long

View file

@ -7131,29 +7131,55 @@ class CPU8080 extends Component {
}
/**
* addTimer(callBack)
* addTimer(id, callBack, ms)
*
* Components that want to have timers that periodically fire after some number of milliseconds call
* addTimer() to create the timer, and then setTimer() every time they want to arm it. There is currently
* Components that want to have timers that fire after some number of milliseconds call addTimer() to create
* the timer, and then setTimer() when they want to arm it. Alternatively, they can specify an automatic timeout
* value (in milliseconds) to have the timer fire automatically at regular intervals. There is currently
* no removeTimer() because these are generally used for the entire lifetime of a component.
*
* Internally, each timer entry is a preallocated Array with two entries: a cycle countdown in element [0]
* and a callback function in element [1]. A timer is initially dormant; dormant timers have a countdown
* value of -1 (although any negative number will suffice) and active timers have a non-negative value.
* Internally, each timer entry is a preallocated Array with the following entries:
*
* [0]: timer ID
* [1]: countdown value, in cycles
* [2]: automatic setTimer value, if any, in milliseconds
* [3]: callback function
*
* A timer is initially dormant; dormant timers have a countdown value of -1 (although any negative number
* will suffice) and active timers have a non-negative value.
*
* Why not use JavaScript's setTimeout() instead? Good question. For a good answer, see setTimer() below.
*
* @this {CPU8080}
* @param {string} id
* @param {function()} callBack
* @param {number} [ms] (if set, enables automatic setTimer calls)
* @return {number} timer index
*/
addTimer(callBack)
addTimer(id, callBack, ms = -1)
{
var iTimer = this.aTimers.length;
this.aTimers.push([-1, callBack]);
this.aTimers.push([id, -1, ms, callBack]);
if (ms >= 0) this.setTimer(iTimer, ms);
return iTimer;
}
/**
* findTimer(id)
*
* @this {CPU8080}
* @param {string} id
* @return {Array|null}
*/
findTimer(id)
{
for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
var timer = this.aTimers[iTimer];
if (timer[0] == id) return timer;
}
return null;
}
/**
* setTimer(iTimer, ms, fReset)
*
@ -7179,18 +7205,19 @@ class CPU8080 extends Component {
{
var nCycles = -1;
if (iTimer >= 0 && iTimer < this.aTimers.length) {
if (fReset || this.aTimers[iTimer][0] < 0) {
var timer = this.aTimers[iTimer];
if (fReset || timer[1] < 0) {
nCycles = this.getMSCycles(ms);
/*
* We must now confront the following problem: if the CPU is currently executing a burst of cycles,
* the number of cycles it has executed in that burst so far must NOT be charged against the cycle
* timeout we're about to set. The simplest way to resolve that is to immediately call endBurst()
* and bias the above cycle timeout by the number of cycles that the burst executed.
* If the CPU is currently executing a burst of cycles, the number of cycles it has executed in
* that burst so far must NOT be charged against the cycle timeout we're about to set. The simplest
* way to resolve that is to immediately call endBurst() and bias the cycle timeout by the number
* of cycles that the burst executed.
*/
if (this.flags.running) {
nCycles += this.endBurst();
}
this.aTimers[iTimer][0] = nCycles;
timer[1] = nCycles;
}
}
return nCycles;
@ -7219,12 +7246,12 @@ class CPU8080 extends Component {
*/
getBurstCycles(nCycles)
{
for (var i = this.aTimers.length - 1; i >= 0; i--) {
var timer = this.aTimers[i];
for (var iTimer = this.aTimers.length - 1; iTimer >= 0; iTimer--) {
var timer = this.aTimers[iTimer];
if (timer[0] < 0) continue;
if (nCycles > timer[0]) {
nCycles = timer[0];
if (timer[1] < 0) continue;
if (nCycles > timer[1]) {
nCycles = timer[1];
}
}
return nCycles;
@ -7242,14 +7269,23 @@ class CPU8080 extends Component {
*/
updateTimers(nCycles)
{
for (var i = this.aTimers.length - 1; i >= 0; i--) {
var timer = this.aTimers[i];
for (var iTimer = this.aTimers.length - 1; iTimer >= 0; iTimer--) {
var timer = this.aTimers[iTimer];
if (timer[0] < 0) continue;
timer[0] -= nCycles;
if (timer[0] <= 0) {
timer[0] = -1; // zero is technically an "active" value, so ensure the timer is dormant now
timer[1](); // safe to invoke the callback function now
if (timer[1] < 0) continue;
timer[1] -= nCycles;
if (timer[1] <= 0) {
if (DEBUG && this.messageEnabled(Messages8080.CPU)) {
this.printMessage("updateTimer(" + nCycles + "): firing " + timer[0] + " with only " + (timer[1] + nCycles) + " cycles left");
}
timer[1] = -1; // zero is technically an "active" value, so ensure the timer is dormant now
timer[3](); // safe to invoke the callback function now
if (timer[2] >= 0) {
this.setTimer(iTimer, timer[2]);
if (DEBUG && this.messageEnabled(Messages8080.CPU)) {
this.printMessage("updateTimer(" + nCycles + "): rearming " + timer[0] + " for " + timer[2] + "ms (" + timer[1] + " cycles)");
}
}
}
}
}
@ -13588,7 +13624,7 @@ class Keyboard8080 extends Component {
this.dbg = dbg; // NOTE: The "dbg" property must be set for the message functions to work
var kbd = this;
this.timerReleaseKeys = this.cpu.addTimer(function() {
this.timerReleaseKeys = this.cpu.addTimer(this.id, function() {
kbd.checkSoftKeysToRelease();
});
@ -15167,7 +15203,7 @@ class Video8080 extends Component {
}
var video = this;
this.timerUpdateNext = this.cpu.addTimer(function() {
this.timerUpdateNext = this.cpu.addTimer(this.id, function() {
video.updateScreen();
});
this.cpu.setTimer(this.timerUpdateNext, this.getRefreshTime());
@ -16593,10 +16629,10 @@ class SerialPort8080 extends Component {
this.dbg = dbg;
var serial = this;
this.timerReceiveNext = this.cpu.addTimer(function() {
this.timerReceiveNext = this.cpu.addTimer(this.id + ".receive", function() {
serial.receiveData();
});
this.timerTransmitNext = this.cpu.addTimer(function() {
this.timerTransmitNext = this.cpu.addTimer(this.id + ".transmit", function() {
serial.transmitData();
});
@ -16803,8 +16839,8 @@ class SerialPort8080 extends Component {
var nBits = ((this.bMode & SerialPort8080.UART8251.MODE.DATA_BITS) >> 2) + 6; // includes an extra +1 for start bit
if (this.bMode & SerialPort8080.UART8251.MODE.PARITY_ENABLE) nBits++;
nBits += ((((this.bMode & SerialPort8080.UART8251.MODE.STOP_BITS) >> 6) + 1) >> 1);
var nBytesPerSecond = Math.round(nBaud / nBits);
return 1000 / nBytesPerSecond;
var nBytesPerSecond = nBaud / nBits;
return (1000 / nBytesPerSecond)|0;
}
/**
@ -16900,10 +16936,8 @@ class SerialPort8080 extends Component {
}
}
if (this.sendData) {
if (this.sendData.call(this.connection, b)) {
fTransmitted = true;
}
if (this.sendData && this.sendData.call(this.connection, b)) {
fTransmitted = true;
}
if (this.echoByte(b)) {
@ -16921,6 +16955,10 @@ class SerialPort8080 extends Component {
* When timerTransmitNext fires, we have honored the programmed XMIT_RATE period, so we can
* set XMIT_READY (and XMIT_EMPTY), which signals the firmware that another byte can be transmitted.
*
* The sData parameter is not used when we're called via the timer; it's an optional parameter used by
* the Keyboard component to deliver data pasted via the clipboard, and is currently only useful when
* the SerialPort is connected to another machine. TODO: Define a separate interface for that feature.
*
* @this {SerialPort8080}
* @param {string} [sData]
* @return {boolean} true if successful, false if not

View file

@ -77,19 +77,19 @@ function Pb(a,b,c){c&&a.f||(a.Ua=!a.w&&b[1]||a.hc,a.Td=!a.w&&b[3]||a.ic);if(c||v
k.Jd=function(a){var b=a>>2;a=(a&3)<<3;var c=this.a[b]>>a;return 24>a?c&65535:c&255|(this.a[b+1]&255)<<8};k.Sd=function(a,b){var c=a>>2;a=(a&3)<<3;this.a[c]=this.a[c]&~(255<<a)|b<<a;this.ka=!0};k.Xd=function(a,b){var c=a>>2;a=(a&3)<<3;24>a?this.a[c]=this.a[c]&~(65535<<a)|b<<a:(this.a[c]=this.a[c]&16777215|b<<24,c++,this.a[c]=this.a[c]&-256|b>>8);this.ka=!0};k.Cd=function(a,b){return this.fb(a,b)};k.Hd=function(a,b){return this.ec(a,b)};k.Qd=function(a,b,c){this.w||this.gc(a,b,c)};
k.Vd=function(a,b,c){this.w||this.i(a,b,c)};k.Bd=function(a){return this.b[a]};k.Dd=function(a){return this.b[a]};k.Gd=function(a){return this.u.getUint16(a,!0)};k.Id=function(a){return a&1?this.b[a]|this.b[a+1]<<8:this.g[a>>1]};k.Pd=function(a,b){this.b[a]=b;this.ka=!0};k.Rd=function(a,b){this.b[a]=b;this.ka=!0};k.Ud=function(a,b){this.u.setUint16(a,b,!0);this.ka=!0};k.Wd=function(a,b){a&1?(this.b[a]=b,this.b[a+1]=b>>8):this.g[a>>1]=b;this.ka=!0};
var Hb=0,Ib=2,ub=["NONE","RAM","ROM","VID","H/W"],Gb=0,Nb=[],Mb=[C.prototype.Ed,C.prototype.Sd,C.prototype.Jd,C.prototype.Xd],Qb=[C.prototype.Cd,C.prototype.Qd,C.prototype.Hd,C.prototype.Vd];if(jb)var Lb=[C.prototype.Bd,C.prototype.Pd,C.prototype.Gd,C.prototype.Ud],Kb=[C.prototype.Dd,C.prototype.Rd,C.prototype.Id,C.prototype.Wd];
function Rb(a,b){v.call(this,"CPU",a);var c=a.multiplier||1;this.na=a.cycles||b;this.O=c;this.Da=Math.round(this.na/1E4)/100;this.X=this.Da*this.O;this.h.ga=!1;this.h.fc=!1;this.h.Qa=a.autoStart;this.h.Xb=!1;this.h.$a=!1;this.va=this.ea=0;this.wa=a.csStart;this.ia=a.csInterval;this.la=a.csStop;this.H=[];this.kb=this.hb.bind(this);B(this)}l(Rb,v);k=Rb.prototype;
function Rb(a,b){v.call(this,"CPU",a);var c=a.multiplier||1;this.na=a.cycles||b;this.O=c;this.Da=Math.round(this.na/1E4)/100;this.X=this.Da*this.O;this.h.ga=!1;this.h.fc=!1;this.h.Qa=a.autoStart;this.h.Xb=!1;this.h.$a=!1;this.va=this.ea=0;this.wa=a.csStart;this.ia=a.csInterval;this.la=a.csStop;this.I=[];this.kb=this.hb.bind(this);B(this)}l(Rb,v);k=Rb.prototype;
k.pa=function(a,b,c,d){this.D=a;this.u=b;this.K=d;for(b=0;b<Sb.length;b++)(c=this.w[Sb[b]])&&this.D.S(null,Sb[b],c);this.N=mb(a,"ChipSet");a=Tb(a,"autoStart");null!=a&&(this.h.Qa="true"==a?!0:"false"==a?!1:!!a);B(this)};k.reset=function(){};k.save=function(){return null};k.restore=function(){return!1};k.ca=function(a,b){if(!b){if(a&&this.restore){Ub(this);if(!this.restore(a))return!1;Vb(this)}else this.reset();this.aa("No debugger detected")}Wb(this);return!0};
k.ba=function(a){return a?this.save():!0};k.Qa=function(){return this.h.Qa||void 0===this.w.run?(this.hb(),!0):!1};k.$b=function(){return 0};function Vb(a){void 0===a.wa&&(a.wa=0);void 0===a.ia&&(a.ia=-1);void 0===a.la&&(a.la=-1);a.h.$a=0<=a.wa&&0<a.ia;a.h.$a&&(a.va=0,a.ea=a.wa-a.I)}
k.ba=function(a){return a?this.save():!0};k.Qa=function(){return this.h.Qa||void 0===this.w.run?(this.hb(),!0):!1};k.$b=function(){return 0};function Vb(a){void 0===a.wa&&(a.wa=0);void 0===a.ia&&(a.ia=-1);void 0===a.la&&(a.la=-1);a.h.$a=0<=a.wa&&0<a.ia;a.h.$a&&(a.va=0,a.ea=a.wa-a.H)}
k.S=function(a,b,c){var d=this;a=!1;switch(b){case "power":case "reset":this.w[b]=c;a=!0;break;case "run":this.w[b]=c;c.onclick=function(){var a;if(a=d.D)if(a=d.D,a.h.V)a=!0;else{var b=null,c,h=Za(a.id);for(c=0;c<h.length&&(b=h[c],b===a||b.h.ready);c++);if(c==h.length)for(c=0;c<h.length&&(b=h[c],b===a||b.h.V);c++);c==h.length&&(b=a);t("The "+b.type+" component ("+b.id+") is not "+(b.h.ready?"powered yet":"ready yet"+(b.bb?" (waiting for notification)":""))+".");a=!1}a&&(d.h.ga?Xb(d):d.hb())};a=!0;
break;case "speed":this.w[b]=c;a=!0;break;case "setSpeed":this.w[b]=c,c.onclick=function(){Yb(d,d.O<<1,!0)},c.textContent=this.X.toFixed(2)+"Mhz",a=!0}return a};function Zb(a,b){var c=1;b&&1<a.O&&a.R&&(c=a.R/a.Da);a.Na=Math.round(1E3/$b);a.xa=Math.floor(a.na/$b*c);b||(a.ma=a.xa);a.Ea=0}function ac(a){return a.I+a.P+a.da-a.a}function Ub(a){a.R=0;a.Oa=0;a.I=a.P=a.da=a.a=0;Vb(a);Yb(a,1)}
function Yb(a,b,c){if(void 0!==b){.8>a.R/a.X&&(b=1);a.O=b;b=a.Da*a.O;if(a.X!=b){a.X=b;b=a.X.toFixed(2)+"Mhz";var d=a.w.setSpeed;d&&(d.textContent=b);a.aa("target speed: "+b)}c&&a.D&&bc(a.D)}a.I+=a.P;a.P=0;a.J=Ua();a.W=0;Zb(a)}function cc(a,b){var c=a.H.length;a.H.push([-1,b]);return c}function dc(a,b,c){0<=b&&b<a.H.length&&0>a.H[b][0]&&(c=a.na*a.O/1E3*c|0,a.h.ga&&(c+=ec(a)),a.H[b][0]=c)}function ec(a,b){var c=a.da-=a.a;a.a=0;b&&(a.da=0);return c}
k.hb=function(a){if(ib(this,!0)){if(!this.h.ga){Yb(this);this.D&&this.D.start(this.J,ac(this));this.h.ga=!0;this.h.fc=!0;this.N&&this.N.start();var b=this.w.run;b&&(b.textContent="Halt");this.D&&(gc(this.D,!0),a&&bc(this.D,!0))}this.Ea>=this.na&&Zb(this,!0);this.oa=0;this.ua=Ua();this.W&&(a=this.ua-this.W,a>this.Na&&(this.J+=a,this.J>this.ua&&(this.J=this.ua)));try{do{for(var c,d=this.h.$a?1:this.xa,e=this.H.length-1;0<=e;e--){var f=this.H[e];0>f[0]||d>f[0]&&(d=f[0])}c=d;this.ub(c);c=ec(this,!0);
this.oa+=c;this.P+=c;a=c;this.h.$a&&(b=!1,this.va=this.va+this.$b()|0,this.ea-=a,0>=this.ea&&(this.ea+=this.ia,b=!0),0<=this.la&&this.la<=ac(this)&&(this.ia=this.la=-1,Vb(this),Xb(this),b=!0),b&&this.aa(ac(this)+" cycles: checksum="+p(this.va)));a=c;for(var g=this.H.length-1;0<=g;g--){var h=this.H[g];0>h[0]||(h[0]-=a,0>=h[0]&&(h[0]=-1,h[1]()))}this.ma-=c;if(0>=this.ma){this.ma+=this.xa;++this.Oa>=hc&&(this.D&&gc(this.D),this.Oa=0);break}}while(this.h.ga)}catch(m){Xb(this);Wb(this);this.D&&this.D.stop(Ua(),
ac(this));ib(this,!1);c=m.stack||m.message;this.h.error=!0;this.G(c);return}c=setTimeout;d=this.kb;this.W=Ua();e=this.Na;this.oa&&(e=Math.round(e*this.oa/this.xa));e-=this.W-this.ua;if(f=this.W-this.J)this.R=Math.round(this.P/(10*f))/100,864E5<=f&&(this.I=0,Yb(this));if(0>e||this.R<this.X)-1E3>e&&(this.J-=e),e=0;this.Ea+=this.oa;this.W+=e;c(d,e)}else Wb(this),this.D&&this.D.stop(Ua(),ac(this))};k.ub=function(){return 0};
function Xb(a){a.h.Za&&(a.h.lb=!0);ec(a);a.I+=a.P;a.P=0;if(a.h.ga){a.h.ga=!1;a.N&&a.N.stop();var b=a.w.run;b&&(b.textContent="Run")}a.h.complete=void 0}function Wb(a){if(a.D){for(var b=a.D,c=0;c<b.g.length;c++)ic(b.g[c],void 0);gc(a.D,void 0)}}var $b=30,hc=15,Sb=["power","reset"];function jc(a){Rb.call(this,a,1E6);this.Ka=kc;Ub(this);this.h.complete=this.h.Wc=!1;this.Ma=0;this.qa=[];this.La=0;lc(this)}l(jc,Rb);function mc(a,b){a.qa.push(b)}k=jc.prototype;
break;case "speed":this.w[b]=c;a=!0;break;case "setSpeed":this.w[b]=c,c.onclick=function(){Yb(d,d.O<<1,!0)},c.textContent=this.X.toFixed(2)+"Mhz",a=!0}return a};function Zb(a,b){var c=1;b&&1<a.O&&a.R&&(c=a.R/a.Da);a.Na=Math.round(1E3/$b);a.xa=Math.floor(a.na/$b*c);b||(a.ma=a.xa);a.Ea=0}function ac(a){return a.H+a.P+a.da-a.a}function Ub(a){a.R=0;a.Oa=0;a.H=a.P=a.da=a.a=0;Vb(a);Yb(a,1)}
function Yb(a,b,c){if(void 0!==b){.8>a.R/a.X&&(b=1);a.O=b;b=a.Da*a.O;if(a.X!=b){a.X=b;b=a.X.toFixed(2)+"Mhz";var d=a.w.setSpeed;d&&(d.textContent=b);a.aa("target speed: "+b)}c&&a.D&&bc(a.D)}a.H+=a.P;a.P=0;a.J=Ua();a.W=0;Zb(a)}function cc(a,b,c){var d;d=void 0===d?-1:d;var e=a.I.length;a.I.push([b,-1,d,c]);0<=d&&dc(a,e,d);return e}function dc(a,b,c){0<=b&&b<a.I.length&&(b=a.I[b],0>b[1]&&(c=a.na*a.O/1E3*c|0,a.h.ga&&(c+=ec(a)),b[1]=c))}function ec(a,b){var c=a.da-=a.a;a.a=0;b&&(a.da=0);return c}
k.hb=function(a){if(ib(this,!0)){if(!this.h.ga){Yb(this);this.D&&this.D.start(this.J,ac(this));this.h.ga=!0;this.h.fc=!0;this.N&&this.N.start();var b=this.w.run;b&&(b.textContent="Halt");this.D&&(gc(this.D,!0),a&&bc(this.D,!0))}this.Ea>=this.na&&Zb(this,!0);this.oa=0;this.ua=Ua();this.W&&(a=this.ua-this.W,a>this.Na&&(this.J+=a,this.J>this.ua&&(this.J=this.ua)));try{do{for(var c,d=this.h.$a?1:this.xa,e=this.I.length-1;0<=e;e--){var f=this.I[e];0>f[1]||d>f[1]&&(d=f[1])}c=d;this.ub(c);c=ec(this,!0);
this.oa+=c;this.P+=c;a=c;this.h.$a&&(b=!1,this.va=this.va+this.$b()|0,this.ea-=a,0>=this.ea&&(this.ea+=this.ia,b=!0),0<=this.la&&this.la<=ac(this)&&(this.ia=this.la=-1,Vb(this),Xb(this),b=!0),b&&this.aa(ac(this)+" cycles: checksum="+p(this.va)));a=c;for(var g=this.I.length-1;0<=g;g--){var h=this.I[g];0>h[1]||(h[1]-=a,0>=h[1]&&(h[1]=-1,h[3](),0<=h[2]&&dc(this,g,h[2])))}this.ma-=c;if(0>=this.ma){this.ma+=this.xa;++this.Oa>=hc&&(this.D&&gc(this.D),this.Oa=0);break}}while(this.h.ga)}catch(m){Xb(this);
Wb(this);this.D&&this.D.stop(Ua(),ac(this));ib(this,!1);c=m.stack||m.message;this.h.error=!0;this.G(c);return}c=setTimeout;d=this.kb;this.W=Ua();e=this.Na;this.oa&&(e=Math.round(e*this.oa/this.xa));e-=this.W-this.ua;if(f=this.W-this.J)this.R=Math.round(this.P/(10*f))/100,864E5<=f&&(this.H=0,Yb(this));if(0>e||this.R<this.X)-1E3>e&&(this.J-=e),e=0;this.Ea+=this.oa;this.W+=e;c(d,e)}else Wb(this),this.D&&this.D.stop(Ua(),ac(this))};k.ub=function(){return 0};
function Xb(a){a.h.Za&&(a.h.lb=!0);ec(a);a.H+=a.P;a.P=0;if(a.h.ga){a.h.ga=!1;a.N&&a.N.stop();var b=a.w.run;b&&(b.textContent="Run")}a.h.complete=void 0}function Wb(a){if(a.D){for(var b=a.D,c=0;c<b.g.length;c++)ic(b.g[c],void 0);gc(a.D,void 0)}}var $b=30,hc=15,Sb=["power","reset"];function jc(a){Rb.call(this,a,1E6);this.Ka=kc;Ub(this);this.h.complete=this.h.Wc=!1;this.Ma=0;this.qa=[];this.La=0;lc(this)}l(jc,Rb);function mc(a,b){a.qa.push(b)}k=jc.prototype;
k.reset=function(){this.h.ga&&Xb(this);lc(this);Ub(this);this.h.error=!1;Rb.prototype.reset.call(this)};function lc(a){a.b=0;a.g=0;a.c=0;a.i=0;a.f=0;a.j=0;a.l=0;a.A=0;D(a,a.La);nc(a,0);a.C=0}function oc(a,b){a.La=b;D(a,b)}k.$b=function(){var a=this.b+this.g+this.c+this.i+this.f+this.j+this.l|0;return a=a+this.A+this.s+pc(this)|0};
k.save=function(){var a=new E(this);a.set(0,[this.b,this.g,this.c,this.i,this.f,this.j,this.l,this.A,this.s,pc(this)]);a.set(1,[this.C,this.I,this.O]);a.set(2,Ab(this.u));return a.data()};
k.restore=function(a){var b=a[0];this.b=b[0];this.g=b[1];this.c=b[2];this.i=b[3];this.f=b[4];this.j=b[5];this.l=b[6];this.A=b[7]&65535;D(this,b[8]);nc(this,b[9]);b=a[1];this.C=b[0];this.I=b[1];Yb(this,b[3]);a:{b=this.u;a=a[2];var c;for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.A){for(var f=0,g=Array(b.A),h=0;h<e.length-1;)for(var m=e[h++],q=e[h++];m--;)g[f++]=q;e=g}f=b.a[d];if(!f||!f.restore(e)){t("Unable to restore memory block "+d);b=!1;break a}}b=!0}return b};
k.save=function(){var a=new E(this);a.set(0,[this.b,this.g,this.c,this.i,this.f,this.j,this.l,this.A,this.s,pc(this)]);a.set(1,[this.C,this.H,this.O]);a.set(2,Ab(this.u));return a.data()};
k.restore=function(a){var b=a[0];this.b=b[0];this.g=b[1];this.c=b[2];this.i=b[3];this.f=b[4];this.j=b[5];this.l=b[6];this.A=b[7]&65535;D(this,b[8]);nc(this,b[9]);b=a[1];this.C=b[0];this.H=b[1];Yb(this,b[3]);a:{b=this.u;a=a[2];var c;for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.A){for(var f=0,g=Array(b.A),h=0;h<e.length-1;)for(var m=e[h++],q=e[h++];m--;)g[f++]=q;e=g}f=b.a[d];if(!f||!f.restore(e)){t("Unable to restore memory block "+d);b=!1;break a}}b=!0}return b};
k.S=function(a,b,c){switch(b){case "A":case "B":case "C":case "BC":case "D":case "E":case "DE":case "H":case "L":case "HL":case "SP":case "PC":case "PS":case "IF":case "SF":case "ZF":case "AF":case "PF":case "CF":this.w[b]=c;this.Ma++;a=!0;break;default:a=Rb.prototype.S.call(this,a,b,c)}return a};function qc(a){return a.g<<8|a.c}function rc(a,b){a.g=b>>8&255;a.c=b&255}function sc(a){return a.i<<8|a.f}function tc(a,b){a.i=b>>8&255;a.f=b&255}function H(a){return a.j<<8|a.l}
function I(a,b){a.j=b>>8&255;a.l=b&255}function D(a,b){a.s=b&65535}function J(a){return a.o&256?1:0}function uc(a,b){a.o=a.o&255|b}function vc(a){return kb[a.v&255]?4:0}function pc(a){return a.F&-214|(a.v&128?128:0)|(a.o&255?0:64)|((a.v^a.B)&16?16:0)|vc(a)|J(a)}function nc(a,b){a.o=a.v=a.B=0;b&1&&(a.o|=256);b&4||(a.v|=1);b&16&&(a.B|=16);b&64||(a.o|=255);b&128&&(a.v^=192);a.F=a.F&-726|b&512|2}function wc(a,b){a.B=a.b^b;return a.v=(a.o=a.b+b)&255}
function xc(a,b){a.B=a.b^b;return a.v=(a.o=a.b+b+(a.o&256?1:0))&255}function yc(a,b){a.o=a.v=a.B=a.b&b;(a.b|b)&8&&(a.B^=16);return a.o}function zc(a,b){a.B=b^255;b=a.v=b+255&255;a.o=a.o&-256|b;return b}function Ac(a,b){a.B=b;b=a.v=b+1&255;a.o=a.o&-256|b;return b}function Bc(a,b){return a.v=a.o=a.B=a.b|b}function K(a,b){b^=255;a.B=a.b^b;return a.v=(a.o=a.b+b+1^256)&255}function Cc(a,b){b^=255;a.B=a.b^b;return a.v=(a.o=a.b+b+(a.o&256?0:1)^256)&255}function Dc(a,b){return a.v=a.o=a.B=a.b^b}
@ -145,7 +145,7 @@ m++);if(36==y)break;q+=String.fromCharCode(y)}a.print(q.replace(/\r/g,""));break
function Zc(a){v.call(this,"Keyboard",a);(a=a.model)&&!$c[a]&&Na("Unrecognized Keyboard8080 model: "+a);this.a=$c[a]||{};this.reset();B(this)}l(Zc,v);k=Zc.prototype;
k.S=function(a,b,c){var d=this,e=a+"-"+b;if(void 0===this.w[e]){if("led"==a&&this.a.Ja[b])return this.w[e]=c,!0;switch(b){case "kbd":case "screen":return Da("iOS")?(c.onkeypress=function(a){var b=!1;if(a=d.a.Va[a.keyCode||a.charCode]){a&128&&(a&=127,b=!0);var c;a:{for(c in d.a.Ca)if(d.a.Ca[c]==a){c=+c;break a}c=0}c&&(b?ad(d,16,!0,!0):ad(d,16,!1),ad(d,c,!0,!0))}return!0},c.onkeydown=function(a){return bd(d,a,!0)},c.onkeyup=function(a){return bd(d,a,!1)}):(c.onkeydown=function(a){return cd(d,a,!0)},
c.onkeyup=function(a){return cd(d,a,!1)},c.onkeypress=function(a){a=a.keyCode||a.charCode;a>=n.Ga&&a<=n.Ya?d.b&(dd|ed)||(d.b|=ed,ad(d,20,!0),fd(d)):a>=n.Wb&&a<=n.z&&d.b&ed&&(d.b&=~ed,ad(d,20,!1),fd(d));return!0}),c.onpaste=function(a){a:{if(d.g&&d.g.Aa&&(a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),a=a.clipboardData||window.clipboardData)){gd(d.g,a.getData("Text"));a=!1;break a}a=!0}return a},!0;default:if(this.a.Fa&&void 0!==this.a.Fa[b])return this.w[e]=c,c.onclick=
function(a,b){return function(d){d.preventDefault&&d.preventDefault();d=!0;var e=0;17==b?e=hd:20==b&&(e=ed);if(e){c.style.fontWeight="normal";if(d=!(a.b&e))c.style.fontWeight="bold";id(a,b,d)}ad(a,b,d,!e);a.D&&bc(a.D)}}(this,this.a.Fa[b]),!0}}return!1};k.pa=function(a,b,c,d){this.D=a;this.m=c;this.K=d;var e=this;this.v=cc(this.m,function(){jd(e)});this.N=mb(a,"ChipSet");this.g=mb(a,"SerialPort");Bb(b,this,this.a.cb);Cb(b,this,this.a.eb)};
function(a,b){return function(d){d.preventDefault&&d.preventDefault();d=!0;var e=0;17==b?e=hd:20==b&&(e=ed);if(e){c.style.fontWeight="normal";if(d=!(a.b&e))c.style.fontWeight="bold";id(a,b,d)}ad(a,b,d,!e);a.D&&bc(a.D)}}(this,this.a.Fa[b]),!0}}return!1};k.pa=function(a,b,c,d){this.D=a;this.m=c;this.K=d;var e=this;this.v=cc(this.m,this.id,function(){jd(e)});this.N=mb(a,"ChipSet");this.g=mb(a,"SerialPort");Bb(b,this,this.a.cb);Cb(b,this,this.a.eb)};
k.ca=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};k.ba=function(a){return a?this.save():!0};k.reset=function(){this.c=[];this.b=0;this.a.INIT&&!this.restore(this.a.INIT)&&this.G("reset error")};k.save=function(){var a=new E(this);switch(this.a.Y){case W.Y:a.set(0,[this.l,this.j,this.i,this.o,-1])}return a.data()};
k.restore=function(a){var b;if(a&&(b=a[0])&&b.length)switch(this.a.Y){case kd.Y:return!0;case W.Y:return this.l=b[0],fd(this,this.l&W.fa.Cb),this.j=b[1],this.i=b[2],this.o=b[3],this.f=b[4],!0}return!1};function fd(a,b){var c;null!=b?a.s=b:b=a.s;for(var d in a.a.Ja)if(c="led-"+d,c=a.w[c]){var e=a.a.Ja[d],f=!!(b&e);e&e-1&&(f=!(b&~e));c.style.backgroundColor=f?"#"+p(16711680,6):"#000000"}if(c=a.w["led-caps-lock"])c.style.backgroundColor=a.b&ed?"#"+p(65280,6):"#000000"}
function id(a,b,c,d){var e=0;switch(b){case 16:e=d?md:nd;break;case 17:e=d?od:hd;break;case 18:e=d?pd:qd;break;case 91:e=d?rd:sd;break;case 20:e=ed,c=!(a.b&e)}e&&(a.b=c?a.b|e:a.b&~e);return c}
@ -166,7 +166,7 @@ this.s),this.c.rotate(this.f*Math.PI/180),this.c.scale(this.s/this.A,this.A/this
this.F+"&format=bytes"),wa(this.F,null,!0,function(a,b,c){Cd(f,a,b,c)});this.qa={}}l(yd,v);
function Nc(a){a.j=a.C*a.M;a.B=a.R*a.L;var b=a.j,c=a.B;a.b&&(b=a.B,c=a.j);a.v=0;if(!a.Rc&&(a.v=(a.j*a.ea>>3)*a.B,!qb(a.u,a.da,a.v,3)))return!1;a.v?(a.Ea=a.c.createImageData(b,c),a.La=16/a.ea|0,Dd(a,a.v>>1)):Dd(a,(a.C+1)*a.R);a.l=document.createElement("canvas");a.l.width=b;a.l.height=c;a.ma=a.l.getContext("2d");a.H={};a.O=1<<a.ea;a.I=Array(a.O+Ed);a.I[0]=[0,0,0,255];a.I[1]=[255,255,255,255];a.P==Fd&&(a.I[a.O+Gd]=[255,255,0,255],a.I[a.O+Hd]=[0,255,0,255]);a.P==Id&&(a.bc=60,a.oa=!1,a.X=Array(a.C));
return!0}k=yd.prototype;k.S=function(a,b,c){var d=this;if("led"==a||"rled"==a)return this.qa[b]=c,!0;switch(b){case "fullScreen":return this.w[b]=c,this.a&&this.a.Ra?c.onclick=function(){d.Ra()}:c.parentNode.removeChild(c),!0}return!1};
k.pa=function(a,b,c,d){this.D=a;this.u=b;this.m=c;this.K=d;Nc(this);if(this.i=mb(a,"Keyboard")){for(var e in this.qa)this.i.S("led",e,this.qa[e]);this.o&&this.i.S(this.Xc?"textarea":"canvas","screen",this.J)}var f=this;this.Oa=cc(this.m,function(){ic(f)});dc(this.m,this.Oa,1E3/Math.max(this.Na,this.ia));this.Ma=0;this.F||B(this)};
k.pa=function(a,b,c,d){this.D=a;this.u=b;this.m=c;this.K=d;Nc(this);if(this.i=mb(a,"Keyboard")){for(var e in this.qa)this.i.S("led",e,this.qa[e]);this.o&&this.i.S(this.Xc?"textarea":"canvas","screen",this.J)}var f=this;this.Oa=cc(this.m,this.id,function(){ic(f)});dc(this.m,this.Oa,1E3/Math.max(this.Na,this.ia));this.Ma=0;this.F||B(this)};
function Cd(a,b,c,d){if(d)a.G("Unable to load font ROM (error "+d+": "+b+")");else{Sa(a.Ia,b,c);try{var e=eval("("+c+")"),f=e.bytes||e;if(!f||!f.length){t("Empty font ROM: "+b);return}if(1==f.length){t(f[0]);return}if(2048==f.length)a.W=f,Oc(a);else{a.G("Unrecognized font data length ("+f.length+")");return}}catch(g){a.G("Font ROM data error: "+g.message);return}(a.c||a.K)&&B(a)}}
function Oc(a){a.W&&(a.xa=a.P==Id,a.H[Jd]=[Kd(a,a.M,a.L),Kd(a,a.M,a.L,a.oa)],a.H[Ld]=[Kd(a,2*a.M,a.L),Kd(a,2*a.M,a.L,a.oa)],a.H[Md]=a.H[Nd]=[Kd(a,2*a.M,2*a.L),Kd(a,2*a.M,2*a.L,a.oa)])}
function Kd(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:b,L:c};m.canvas=document.createElement("canvas");m.canvas.width=16*b;m.canvas.height=g/16*c;m.context=m.canvas.getContext("2d");for(var q=m.context.createImageData(b,c),r=0;r<g;r++){for(var y=0,F=y;y<a.L;y++)for(var u=r*e+(f+y&e-1),u=d&&8==y?255:a.W[u],x=0;x<c/a.L;x++){for(var G=0,U=0,Z=U;U<a.M;U++){for(var da=u&128>>(7<U?7:U),G=a.xa&&!da&&G?G:da,xa=0;xa<b/a.M;xa++)h&&(G=!G),Od(a,q,Z,F,G?1:0),Z++;G=da}F++}m.context.putImageData(q,
@ -181,10 +181,10 @@ Ja(function(){for(var a=z(document,"pc8080","video"),b=0;b<a.length;b++){var c=a
(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());var f=+(d.aspect||Ga("aspect"));f&&.3<=f&&3.33>=f&&(Ia("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");Da("iOS")&&(f.setAttribute("autocapitalize","off"),f.setAttribute("autocorrect","off"),f.style.fontSize="16px");c.appendChild(f);var g=e.getContext("2d"),d=new yd(d,e,g,f,c);Xa(d,c)}});
function Vd(a){v.call(this,"SerialPort",a);this.H=+a.adapter;switch(this.H){case 0:this.I=0;this.O=2;break;default:t("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=Wd;b&&(void 0===c&&(c="Panel"),(c=ab(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(Vd,v);
k=Vd.prototype;k.S=function(a,b,c,d){var e=this;switch(b){case Wd:return this.w[b]=this.b=c,c.onkeydown=function(a){a=a||window.event;var b=a.keyCode;if(8===b||a.ctrlKey&&65<=b&&90>=b)a.preventDefault&&a.preventDefault(),64<b&&(b-=64),Xd(e,b);return!0},c.onkeypress=function(a){a=a||window.event;Xd(e,a.which||a.keyCode);a.preventDefault&&a.preventDefault();return!0},c.removeAttribute("readonly"),!0;default:if(d)return this.w[b]=c,c.onclick=function(){e.nb(d);return!0},!0}return!1};
k.pa=function(a,b,c,d){this.D=a;this.u=b;this.m=c;this.K=d;var e=this;this.P=cc(this.m,function(){e.nb()});this.R=cc(this.m,function(){gd(e)});this.N=mb(a,"ChipSet");Bb(b,this,Yd,this.I);Cb(b,this,Zd,this.I);B(this)};
k.pa=function(a,b,c,d){this.D=a;this.u=b;this.m=c;this.K=d;var e=this;this.P=cc(this.m,this.id+".receive",function(){e.nb()});this.R=cc(this.m,this.id+".transmit",function(){gd(e)});this.N=mb(a,"ChipSet");Bb(b,this,Yd,this.I);Cb(b,this,Zd,this.I);B(this)};
k.ac=function(a){if(!this.a){var b=Tb(this.D,"connection");if(b){var c=b.split("->");if(2==c.length){var d=ra(c[0]);if(d!=this.Tb)return;c=ra(c[1]);if(this.a=$a(c)){var e=this.a.exports;if(e){var f=e.connect;f&&f.call(this.a,this.l);if(this.Aa=e.receiveData){this.l=a;this.s=e.receiveStatus;this.status("Connected "+this.Ia+"."+d+" to "+c);return}}}}this.status("Unable to establish connection: "+b)}}};
k.ca=function(a,b){if(!b)if(this.ac(this.l),!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};k.ba=function(a){return a?this.save():!0};k.reset=function(){$d(this)};k.save=function(){var a=new E(this),b=0,c=[];c[b++]=this.o;c[b++]=this.A;c[b++]=this.C;c[b++]=this.U;c[b++]=this.i;c[b++]=this.j;c[b]=this.v;a.set(0,c);return a.data()};k.restore=function(a){return $d(this,a[0])};
function $d(a,b){var c=0;b||(b=ae);a.o=b[c++];a.A=b[c++];a.C=b[c++];a.U=b[c++];a.i=b[c++];a.j=b[c++];a.v=b[c];return!0}function be(a,b){var c=a.v&b;b&15||(c>>=4);b=ce[c];c=((a.i&de)>>2)+6;a.i&ee&&c++;c+=((a.i&fe)>>6)+1>>1;return 1E3/Math.round(b/c)}function Xd(a,b){return a.B||a.U&ge?!1:(a.A=b,a.U|=ge,Fc(a.m,a.O),!0)}
function $d(a,b){var c=0;b||(b=ae);a.o=b[c++];a.A=b[c++];a.C=b[c++];a.U=b[c++];a.i=b[c++];a.j=b[c++];a.v=b[c];return!0}function be(a,b){var c=a.v&b;b&15||(c>>=4);b=ce[c];c=((a.i&de)>>2)+6;a.i&ee&&c++;c+=((a.i&fe)>>6)+1>>1;return 1E3/(b/c)|0}function Xd(a,b){return a.B||a.U&ge?!1:(a.A=b,a.U|=ge,Fc(a.m,a.O),!0)}
k.nb=function(a){null!=a&&(this.g="number"!=typeof a?a:this.g+String.fromCharCode(a));this.g&&(Xd(this,this.g.charCodeAt(0))&&(this.g=this.g.substr(1)),this.g&&this.m&&dc(this.m,this.P,be(this,he)));return!0};k.Kd=function(a){this.U&=~ie;a&64&&(this.U|=ie)};function gd(a,b){a.U=a.U|Mc|je;b&&a.Aa&&a.Aa.call(a.a,b)}k.cd=function(){var a=this.A;this.U&=~ge;return a};k.bd=function(){return this.U};
k.qd=function(a,b){this.C=b;this.U&=~(Mc|je);if(19==b)this.B=!0;else if(17==b)this.B=!1;else if(this.Aa&&this.Aa.call(this.a,b),this.b)if(8==b)this.b.value=this.b.value.slice(0,-1),0<this.f&&this.f--;else{var c;13!=b&&10!=b&&(c=sa[b]);a=c=c?"<"+c+">":String.fromCharCode(b);c=a.length;9==b?(b=this.J||8,c=b-this.f%b,this.J&&(a=" ".slice(0,c))):13==b&&(this.f=c=0,a="\n");this.F&&!this.f&&c&&(a=String.fromCharCode(this.F)+a);this.b.value+=a;this.b.scrollTop=this.b.scrollHeight;
this.f+=c}else if(null!=this.c){if(10==b||1024<=this.c.length)this.aa(this.c),this.c="";10!=b&&(this.c+=String.fromCharCode(b))}this.m&&dc(this.m,this.R,be(this,ke))};k.pd=function(a,b){this.o?(this.s&&(b^this.j)&(le|me)&&(a=0,this.l?(a|=b&le?32:0,a|=b&me?320:0):(a|=b&le?16:0,a|=b&me?1048576:0),this.s.call(this.a,a)),this.j=b,this.j&ne&&(this.o=!1)):(this.i=b,this.o=!0)};k.od=function(a,b){this.v=b};

File diff suppressed because one or more lines are too long