Resolved a problem with the original timer implementation, where a call to setTimer() made in the middle of a CPU burst would not properly account for cycles already executed as part of the current burst

This commit is contained in:
Jeff Parsons 2016-10-12 22:08:45 -07:00 • committed by Jeff Parsons
commit 8bb978d7a9
7 changed files with 423 additions and 406 deletions

View file

@ -682,14 +682,14 @@ function Aa(a){var b;if(window)try{b=window.localStorage.getItem(a)}catch(c){}re
function Ea(a,b){function c(){b(100===d)&&(e=setTimeout(c,d),d=100)}var d=0,e=null,f=!1;a.onmousedown=function(){f||e||(d=500,c())};a.ontouchstart=function(){e||(d=500,c())};a.onmouseup=a.onmouseout=function(){e&&(clearTimeout(e),e=null)};a.ontouchend=a.ontouchcancel=function(){e&&(clearTimeout(e),e=null);f=!0}}var Ia={init:[],show:[],exit:[]},Ja=!1,Ka=!1,La=!0;function Ma(a,b){if(window){var c=window[a];window[a]="function"!==typeof c?b:function(){c&&c();b()}}}function Na(a){Ia.init.push(a)}
function Oa(a){if(La)try{for(var b=0;b<a.length;b++)a[b]()}catch(c){Pa("An unexpected exception occurred:\n\n"+c.message+"\n\nPlease send this information to support@pcjs.org. Thanks.",void 0,void 0)}}function Qa(a){!La&&a?(La=!0,Ja&&Sa("init"),Ka&&Sa("show")):La=a}function Sa(a){Ia[a]&&Oa(Ia[a])}Ma("onload",function(){Ja=!0;Oa(Ia.init)});Ma("onpageshow",function(){Ka=!0;Oa(Ia.show)});Ma(Ca("Opera")||Ca("iOS")?"onunload":"onbeforeunload",function(){Oa(Ia.exit)});
function z(a,b,c,d){this.type=a;b||(b={id:"",name:""});this.id=b.id||"";this.name=b.name;this.ec=b.comment;this.Ld=b;b=this.id.indexOf(".");0>b?this.cb=this.id:(this.Bb=this.id.substr(0,b),this.cb=this.id.substr(b+1));this[a]=c;this.C={ready:!1,sb:!1,Kb:!1,xa:!1,error:!1};this.Eb=null;this.C.error=!1;this.N={};this.H=null;this.ta=d||0;Ta.push(this)}var Ua=void 0,Va={};
if(window){Ua||(Ua=window.location.search.substr(1));for(var Xa,Ya=/\+/g,Za=/([^&=]+)=?([^&]*)/g;Xa=Za.exec(Ua);)Va[decodeURIComponent(Xa[1].replace(Ya," "))]=decodeURIComponent(Xa[2].replace(Ya," "))}function $a(a){function b(){}if(window){if(!a)throw new TypeError;if(Object.create)return Object.create(a);var c=typeof a;if("object"!==c&&"function"!==c)throw new TypeError;}b.prototype=a;return new b}
if(window){Ua||(Ua=window.location.search.substr(1));for(var Wa,Ya=/\+/g,Za=/([^&=]+)=?([^&]*)/g;Wa=Za.exec(Ua);)Va[decodeURIComponent(Wa[1].replace(Ya," "))]=decodeURIComponent(Wa[2].replace(Ya," "))}function $a(a){function b(){}if(window){if(!a)throw new TypeError;if(Object.create)return Object.create(a);var c=typeof a;if("object"!==c&&"function"!==c)throw new TypeError;}b.prototype=a;return new b}
function A(a,b){b||(b=z);a.prototype=$a(b.prototype);a.prototype.constructor=a;a.prototype.parent=b.prototype}if(window){window.PCjs||(window.PCjs={});var ab=window.PCjs.Machines||(window.PCjs.Machines={}),Ta=window.PCjs.Components||(window.PCjs.Components=[])}else ab={},Ta=[];function bb(a,b,c){ab[a]&&b&&(ab[a][b]=c)}function Pa(a,b,c){b||w((c?c+": ":"")+a)}
function cb(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;b<Ta.length;b++){var d=Ta[b];a&&d.id.indexOf(a)||c.push(d)}return c}function db(a){if(void 0!==a){var b;for(b=0;b<Ta.length;b++)if(Ta[b].id===a)return Ta[b]}return null}function eb(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<Ta.length;d++)if(c)c==Ta[d]&&(c=null);else if(!(a!=Ta[d].type||b&&Ta[d].id.indexOf(b)))return Ta[d]}return null}
function B(a){var b=null;if(a=a.getAttribute("data-value"))try{b=eval("("+a+")")}catch(c){w(c.message+" ("+a+")")}return b}function fb(a,b){b=D(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=B(f))&&g.binding&&a.pa(g.type,g.binding,f,g.value),k=h.length}}}}
function D(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}
z.prototype={constructor:z,parent:null,toString:function(){return this.name?this.name:this.id||this.type},pa:function(a,b,c){switch(b){case "clear":return this.N[b]||(this.N[b]=c,c.onclick=function(a){return function(){a.N.print&&(a.N.print.value="")}}(this)),!0;case "print":return this.N[b]||(this.Ga=this.N[b]=c,c.value="",this.g=function(a){return function(b,c){8192<a.value.length&&(a.value=a.value.substr(a.value.length-4096));a.value+=(void 0!==c?c+": ":"")+(b||"")+"\n";a.scrollTop=a.scrollHeight}}(c),
this.ka=function(a){this.g(a,this.cb)}),!0;default:return!1}},log:function(){},g:function(){},status:function(a){this.g(this.cb+": "+a)},ka:function(a,b,c){Pa(a,b,c||this.type)},Ea:function(){return this.C.xa=!0},Ia:function(a,b){b&&(this.C.xa=!1);return!0}};function E(a,b,c,d,e,f,g){a.H&&(!0===g?g=0:null==g&&(g=a.ta),gb(a.H,a,b,c,d,e,f,g))}function hb(a,b){a.H&&ib(a,0)&&a.H.message(b,void 0)}function ib(a,b){if(a.H){a===a.H?b|=0:b=b||a.ta;var c=a.H.ta&b;return!!b&&c===b||!!(c&a.H.Id)}return!1}
function jb(a,b){if(a.C.Kb)return a.C.sb=!1,a.C.Kb=!1;if(a.C.error)return a.g(a.toString()+" error"),!1;a.C.sb=b;return a.C.sb}function kb(a,b){a.C.sb&&(b?a.C.Kb=!0:void 0===b&&a.g(a.toString()+" busy"));return a.C.sb}function F(a){if(!a.C.error&&(a.C.ready=!0,a.C.ready)){var b=a.Eb;a.Eb=null;b&&b()}}function nb(a,b){b&&(a.C.ready?b():a.Eb=b);return a.C.ready}function ob(a,b){a.C.error=!0;a.ka(b)}
function jb(a,b){if(a.C.Kb)return a.C.sb=!1,a.C.Kb=!1;if(a.C.error)return a.g(a.toString()+" error"),!1;a.C.sb=b;return a.C.sb}function kb(a,b){a.C.sb&&(b?a.C.Kb=!0:void 0===b&&a.g(a.toString()+" busy"));return a.C.sb}function F(a){if(!a.C.error&&(a.C.ready=!0,a.C.ready)){var b=a.Eb;a.Eb=null;b&&b()}}function lb(a,b){b&&(a.C.ready?b():a.Eb=b);return a.C.ready}function ob(a,b){a.C.error=!0;a.ka(b)}
Array.prototype.indexOf||(Array.prototype.indexOf=function(a,b){b=b||0;for(var c=this.length;b<c;b++)if(this[b]===a)return b;return-1});
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 pb="undefined"!==typeof ArrayBuffer,qb=[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,
@ -711,15 +711,15 @@ null!=this.F){var d=this.H;ic(d,this.F+a,2,d.D)&&d.qa(!0)}this.N?this.w(a,b,c):t
function wb(a,b,c){a.H=b;a.B=a.j=0;c&&((a.B=c.B)&&hc(a,gc,!1),(a.j=c.j)&&fc(a,gc,!1))}function jc(a,b){b?--a.j||(a.lb=a.N?a.w:a.zb,a.Cc=a.N?a.G:a.Tb):--a.B||(a.jb=a.wb,a.Ac=a.Pb)}function fc(a,b,c){c&&a.j||(a.lb=!a.N&&b[1]||a.w,a.Cc=!a.N&&b[3]||a.G);if(c||void 0===c)a.zb=b[1]||a.w,a.Tb=b[3]||a.G}function hc(a,b,c){c&&a.B||(a.jb=b[0]||a.K,a.Ac=b[2]||a.L);if(c||void 0===c)a.wb=b[0]||a.K,a.Pb=b[2]||a.L}function bc(a,b){b||(b=kc);hc(a,b,void 0);fc(a,b,void 0)}
var kc=[],ec=[H.prototype.Y,H.prototype.la,H.prototype.fa,H.prototype.za],gc=[H.prototype.O,H.prototype.ja,H.prototype.ca,H.prototype.ma];if(pb)var dc=[H.prototype.M,H.prototype.ha,H.prototype.ba,H.prototype.ra],cc=[H.prototype.P,H.prototype.cb,H.prototype.ea,H.prototype.wa];
function lc(a,b){z.call(this,"CPU",a,lc,1);var c=a.multiplier||1;this.Y=a.cycles||b;this.Ra=c;this.ha=Math.round(this.Y/1E4)/100;this.ab=this.ha*this.Ra;this.C.Aa=!1;this.C.Sb=!1;this.C.rb=a.autoStart;this.C.vc=!1;this.C.fb=!1;this.tb=this.O=0;this.ub=a.csStart;this.hb=a.csInterval;this.ib=a.csStop;this.w=[];this.Fa=this.bb.bind(this);F(this)}A(lc);var mc=["power","reset"];l=lc.prototype;
l.Pa=function(a,b,c,d){this.B=a;this.u=b;this.H=d;for(b=0;b<mc.length;b++)(c=this.N[mc[b]])&&this.B.pa(null,mc[b],c);this.I=tb(a,"ChipSet");a=nc(a,"autoStart");null!=a&&(this.C.rb="true"==a?!0:"false"==a?!1:!!a);F(this)};l.reset=function(){};l.save=function(){return null};l.restore=function(){return!1};
l.Pa=function(a,b,c,d){this.B=a;this.u=b;this.H=d;for(b=0;b<mc.length;b++)(c=this.N[mc[b]])&&this.B.pa(null,mc[b],c);this.I=tb(a,"ChipSet");a=zc(a,"autoStart");null!=a&&(this.C.rb="true"==a?!0:"false"==a?!1:!!a);F(this)};l.reset=function(){};l.save=function(){return null};l.restore=function(){return!1};
l.Ea=function(a,b){if(!b){if(a&&this.restore){Ac(this);if(!this.restore(a))return!1;Bc(this)}else this.reset();this.H?(a=this.H,a.g("Type ? for help with PC8080 Debugger commands"),a.Ja(),a.za&&(b=a.za,a.za=null,Cc(a,b))):this.g("No debugger detected")}Dc(this);return!0};l.Ia=function(a){return a?this.save():!0};l.rb=function(){return this.C.rb||!this.H&&void 0===this.N.run?(this.bb(!0),!0):!1};l.yc=function(){return 0};
function Bc(a){void 0===a.ub&&(a.ub=0);void 0===a.hb&&(a.hb=-1);void 0===a.ib&&(a.ib=-1);a.C.fb=0<=a.ub&&0<a.hb;a.C.fb&&(a.tb=0,a.O=a.ub-a.M)}function Ec(a,b){if(a.C.fb){var c=!1;a.tb=a.tb+a.yc()|0;a.O-=b;0>=a.O&&(a.O+=a.hb,c=!0);0<=a.ib&&a.ib<=Fc(a)&&(a.hb=a.ib=-1,Bc(a),a.qa(),c=!0);c&&a.g(Fc(a)+" cycles: checksum="+t(a.tb))}}
l.pa=function(a,b,c){var d=this;a=!1;switch(b){case "power":case "reset":this.N[b]=c;a=!0;break;case "run":this.N[b]=c;c.onclick=function(){var a;if(a=d.B)if(a=d.B,a.C.xa)a=!0;else{var b=null,c,h=cb(a.id);for(c=0;c<h.length&&(b=h[c],b===a||b.C.ready);c++);if(c==h.length)for(c=0;c<h.length&&(b=h[c],b===a||b.C.xa);c++);c==h.length&&(b=a);w("The "+b.type+" component ("+b.id+") is not "+(b.C.ready?"powered yet":"ready yet"+(b.Eb?" (waiting for notification)":""))+".");a=!1}a&&(d.C.Aa?d.qa():d.bb())};
a=!0;break;case "speed":this.N[b]=c;a=!0;break;case "setSpeed":this.N[b]=c,c.onclick=function(){Gc(d,d.Ra<<1,!0)},c.textContent=this.ab.toFixed(2)+"Mhz",a=!0}return a};function Hc(a,b,c){a.M+=b;c&&(a.L=a.b=0)}function Ic(a,b){var c=1;b&&1<a.Ra&&a.J&&(c=a.J/a.ha);a.wa=Math.round(1E3/30);a.fa=Math.floor(a.Y/30*c);b||(a.P=a.fa);a.ja=0}function Fc(a){return a.M+a.G+a.L-a.b}function Ac(a){a.J=0;a.za=0;a.M=a.G=a.L=a.b=0;Bc(a);Gc(a,1)}
function Gc(a,b,c){var d=!1;if(void 0!==b){.8>a.J/a.ab?b=1:d=!0;a.Ra=b;b=a.ha*a.Ra;if(a.ab!=b){a.ab=b;b=a.ab.toFixed(2)+"Mhz";var e=a.N.setSpeed;e&&(e.textContent=b);a.g("target speed: "+b)}c&&a.B&&a.B.xb()}Hc(a,a.G);a.G=0;a.D=qa();a.K=0;Ic(a);return d}function Jc(a,b){var c=a.w.length;a.w.push([-1,b]);return c}function Kc(a,b,c){0<=b&&b<a.w.length&&0>a.w[b][0]&&(c*=a.Y*a.Ra/1E3,a.w[b][0]=c)}function Lc(a){a.L-=a.b;a.b=0}
l.bb=function(a){if(jb(this,!0)){if(!this.C.Aa){Gc(this);this.B&&this.B.start(this.D,Fc(this));this.C.Aa=!0;this.C.Sb=!0;this.I&&this.I.start();var b=this.N.run;b&&(b.textContent="Halt");this.B&&(this.B.Ja(!0),a&&this.B.xb(!0))}this.ja>=this.Y&&Ic(this,!0);this.ba=0;this.ea=qa();this.K&&(a=this.ea-this.K,a>this.wa&&(this.D+=a,this.D>this.ea&&(this.D=this.ea)));try{do{for(var c=this.C.fb?1:this.fa,d=this.w.length-1;0<=d;d--){var e=this.w[d];0>e[0]||c>e[0]&&(c=e[0])}this.kb(c);var f=this.L-this.b;a=
f;for(var g=this.w.length-1;0<=g;g--){var h=this.w[g];0>h[0]||(h[0]-=a,0>=h[0]&&(h[0]=-1,h[1]()))}this.ba+=f;this.G+=f;Hc(this,0,!0);Ec(this,f);this.P-=f;if(0>=this.P){this.P+=this.fa;15<=++this.za&&(this.B&&this.B.Ja(),this.za=0);break}}while(this.C.Aa)}catch(k){this.qa();Dc(this);this.B&&this.B.stop(qa(),Fc(this));jb(this,!1);ob(this,k.stack||k.message);return}c=setTimeout;d=this.Fa;this.K=qa();e=this.wa;this.ba&&(e=Math.round(e*this.ba/this.fa));e-=this.K-this.ea;if(f=this.K-this.D)this.J=Math.round(this.G/
(10*f))/100,864E5<=f&&(this.M=0,Gc(this));if(0>e||this.J<this.ab)-1E3>e&&(this.D-=e),e=0;this.ja+=this.ba;this.K+=e;c(d,e)}else Dc(this),this.B&&this.B.stop(qa(),Fc(this))};l.kb=function(){return 0};l.qa=function(a){kb(this,!0);Lc(this);Hc(this,this.G);this.G=0;if(this.C.Aa){this.C.Aa=!1;this.I&&this.I.stop();var b=this.N.run;b&&(b.textContent="Run")}this.C.complete=a};function Dc(a,b){if(a.B){for(var c=a.B,d=0;d<c.G.length;d++)Mc(c.G[d],b);a.B.Ja(b)}}
function Gc(a,b,c){var d=!1;if(void 0!==b){.8>a.J/a.ab?b=1:d=!0;a.Ra=b;b=a.ha*a.Ra;if(a.ab!=b){a.ab=b;b=a.ab.toFixed(2)+"Mhz";var e=a.N.setSpeed;e&&(e.textContent=b);a.g("target speed: "+b)}c&&a.B&&a.B.xb()}Hc(a,a.G);a.G=0;a.D=qa();a.K=0;Ic(a);return d}function Jc(a,b){var c=a.w.length;a.w.push([-1,b]);return c}function Kc(a,b,c){0<=b&&b<a.w.length&&0>a.w[b][0]&&(c*=a.Y*a.Ra/1E3,a.w[b][0]=c+Lc(a))}function Lc(a,b){var c=a.L-=a.b;a.b=0;b&&(a.L=0);return c}
l.bb=function(a){if(jb(this,!0)){if(!this.C.Aa){Gc(this);this.B&&this.B.start(this.D,Fc(this));this.C.Aa=!0;this.C.Sb=!0;this.I&&this.I.start();var b=this.N.run;b&&(b.textContent="Halt");this.B&&(this.B.Ja(!0),a&&this.B.xb(!0))}this.ja>=this.Y&&Ic(this,!0);this.ba=0;this.ea=qa();this.K&&(a=this.ea-this.K,a>this.wa&&(this.D+=a,this.D>this.ea&&(this.D=this.ea)));try{do{for(var c,d=this.C.fb?1:this.fa,e=this.w.length-1;0<=e;e--){var f=this.w[e];0>f[0]||d>f[0]&&(d=f[0])}c=d;this.kb(c);c=Lc(this,!0);this.ba+=
c;this.G+=c;Ec(this,c);a=c;for(var g=this.w.length-1;0<=g;g--){var h=this.w[g];0>h[0]||(h[0]-=a,0>=h[0]&&(h[0]=-1,h[1]()))}this.P-=c;if(0>=this.P){this.P+=this.fa;15<=++this.za&&(this.B&&this.B.Ja(),this.za=0);break}}while(this.C.Aa)}catch(k){this.qa();Dc(this);this.B&&this.B.stop(qa(),Fc(this));jb(this,!1);ob(this,k.stack||k.message);return}c=setTimeout;d=this.Fa;this.K=qa();e=this.wa;this.ba&&(e=Math.round(e*this.ba/this.fa));e-=this.K-this.ea;if(f=this.K-this.D)this.J=Math.round(this.G/(10*f))/
100,864E5<=f&&(this.M=0,Gc(this));if(0>e||this.J<this.ab)-1E3>e&&(this.D-=e),e=0;this.ja+=this.ba;this.K+=e;c(d,e)}else Dc(this),this.B&&this.B.stop(qa(),Fc(this))};l.kb=function(){return 0};l.qa=function(a){kb(this,!0);Lc(this);Hc(this,this.G);this.G=0;if(this.C.Aa){this.C.Aa=!1;this.I&&this.I.stop();var b=this.N.run;b&&(b.textContent="Run")}this.C.complete=a};function Dc(a,b){if(a.B){for(var c=a.B,d=0;d<c.G.length;d++)Mc(c.G[d],b);a.B.Ja(b)}}
function Nc(a){this.Wd=+a.model||8080;lc.call(this,a,1E6);this.la=Oc;Ac(this);this.C.complete=this.C.Kd=!1;this.ma=0;this.ca=[];this.ra=0;Pc(this)}A(Nc,lc);function Qc(a,b){a.ca.push(b)}l=Nc.prototype;l.reset=function(){this.C.Aa&&this.qa();Pc(this);Ac(this);this.C.error=!1;this.parent.reset.call(this)};function Pc(a){a.i=0;a.S=0;a.T=0;a.U=0;a.V=0;a.W=0;a.Z=0;a.oa=0;I(a,a.ra);Rc(a,0);a.j=0}function Sc(a,b){a.ra=b;I(a,b)}
l.yc=function(){var a=this.i+this.S+this.T+this.U+this.V+this.W+this.Z|0;return a=a+this.oa+this.R+Tc(this)|0};l.save=function(){var a=new J(this);a.set(0,[this.i,this.S,this.T,this.U,this.V,this.W,this.Z,this.oa,this.R,Tc(this)]);a.set(1,[this.j,this.M,this.Ra]);a.set(2,Eb(this.u));return a.data()};
l.restore=function(a){var b=a[0];this.i=b[0];this.S=b[1];this.T=b[2];this.U=b[3];this.V=b[4];this.W=b[5];this.Z=b[6];this.oa=b[7]&65535;I(this,b[8]);Rc(this,b[9]);b=a[1];this.j=b[0];this.M=b[1];Gc(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.M){for(var f=0,g=Array(b.M),h=0;h<e.length-1;)for(var k=e[h++],n=e[h++];k--;)g[f++]=n;e=g}f=b.X[d];if(!f||!f.restore(e)){w("Unable to restore memory block "+d);b=!1;break a}}b=!0}return b};
@ -773,7 +773,7 @@ function Td(a){z.call(this,"ROM",a,Td);this.B=null;this.D=a.addr;this.j=a.size;t
Td.prototype.Ea=function(){if(this.Qa){if(this.H){var a=this.H,b=this.id,c=this.D,d=this.j,e=this.Qa,f=[],g;for(g in e){var h=e[g];"number"==typeof h&&(e[g]=h={o:h});var k=h.o,n=h.a;if(void 0!==k){var p=f,k=[k>>>0,g],q=pa(p,k,a.uc);0>q&&p.splice(-(q+1),0,k)}n&&(h.a=n.replace(/''/g,'"'))}a.G.push({gf:b,F:c,Vd:d,Qa:e,tc:f})}delete this.Qa}return!0};Td.prototype.Ia=function(){return!0};
function Ud(a,b,c,d){if(d)a.ka("Unable to load system ROM (error "+d+": "+b+")");else{bb(a.Bb,b,c);if("["==c.charAt(0)||"{"==c.charAt(0))try{var e=eval("("+c+")"),f=e.bytes,g=e.data;if(f)a.B=f;else if(g)for(a.B=Array(4*g.length),d=c=0;c<g.length;c++)a.B[d++]=g[c]&255,a.B[d++]=g[c]>>8&255,a.B[d++]=g[c]>>16&255,a.B[d++]=g[c]>>24&255;else a.B=e;a.Qa=e.symbols;if(!a.B.length){w("Empty ROM: "+b);return}if(1==a.B.length){w(a.B[0]);return}}catch(h){a.ka("ROM data error: "+h.message);return}else for(b=c.replace(/\n/gm,
" ").replace(/ +$/,"").split(" "),a.B=Array(b.length),e=0;e<b.length;e++)a.B[e]=aa(b[e],16);Wd(a)}}
function Wd(a){if(!nb(a))if(!a.I)F(a);else if(a.B&&a.u){a.j||(a.j=a.B.length);if(a.B.length!=a.j)ob(a,"ROM size ("+t(a.B.length,8,!0)+") does not match specified size ("+t(a.j,8,!0)+")");else if(Xd(a,a.D)){var b=[];"number"==typeof a.w?b.push(a.w):null!=a.w&&a.w.length&&(b=a.w);for(var c=0;c<b.length;c++){for(var d=a,e=b[c],f=d.u,g=d.j,h=[],k=d.D>>>f.ia;0<g&&k<f.X.length;)h.push(f.X[k++]),g-=f.Ha;f=d.u;d=d.j;g=0;for(e>>>=f.ia;0<d&&e<f.X.length;){k=h[g++];if(!k)break;f.X[e++]=k;d-=f.Ha}}delete a.B}F(a)}}
function Wd(a){if(!lb(a))if(!a.I)F(a);else if(a.B&&a.u){a.j||(a.j=a.B.length);if(a.B.length!=a.j)ob(a,"ROM size ("+t(a.B.length,8,!0)+") does not match specified size ("+t(a.j,8,!0)+")");else if(Xd(a,a.D)){var b=[];"number"==typeof a.w?b.push(a.w):null!=a.w&&a.w.length&&(b=a.w);for(var c=0;c<b.length;c++){for(var d=a,e=b[c],f=d.u,g=d.j,h=[],k=d.D>>>f.ia;0<g&&k<f.X.length;)h.push(f.X[k++]),g-=f.Ha;f=d.u;d=d.j;g=0;for(e>>>=f.ia;0<d&&e<f.X.length;){k=h[g++];if(!k)break;f.X[e++]=k;d-=f.Ha}}delete a.B}F(a)}}
function Xd(a,b){if(xb(a.u,b,a.j,a.G?1:ac)){var c;for(c=0;c<a.B.length;c++)Db(a.u,b+c,a.B[c]);if(a.G&&256==b){for(c=0;c<Vd.length;c++)Db(a.u,Vd[c],118);Qc(a.b,function(a){return function(b){if(0<=Vd.indexOf(b)){var c=!1,d=a.b,e=a.H;if(5==b)switch(c=!0,d.T){case 2:Yd(a,String.fromCharCode(d.V));break;case 9:for(var k=Wc(d),n="",p=255;p--;){var q=a.b.aa(k++);if(36==q)break;n+=String.fromCharCode(q)}Yd(a,n);break;default:c=!1}c?Md.call(d):e&&(a.g("\nCP/M vector "+u(b)),I(d,b),e.qa());b=!0}else b=!1;
return b}}(a));Sc(a.b,b)}return!0}return!1}function Yd(a,b){b=b.replace(/\r/g,"");a.Ga&&(a.Ga.value+=b,a.Ga.scrollTop=a.Ga.scrollHeight)}Na(function(){for(var a=D(document,"pc8080","rom"),b=0;b<a.length;b++){var c=a[b],d=B(c),d=new Td(d);fb(d,c)}});function Zd(a){z.call(this,"RAM",a,Zd);this.w=a.addr;this.j=a.size;this.B=!1}A(Zd);l=Zd.prototype;l.Pa=function(a,b,c,d){this.u=b;this.b=c;this.H=d;F(this)};l.Ea=function(a,b){b||this.reset();return!0};l.Ia=function(a){return a?this.save():!0};
l.reset=function(){!this.B&&this.j&&xb(this.u,this.w,this.j,1)&&(this.B=!0);this.B||w("No RAM allocated")};l.save=function(){return null};l.restore=function(){return!0};Na(function(){for(var a=D(document,"pc8080","ram"),b=0;b<a.length;b++){var c=a[b],d=B(c),d=new Zd(d);fb(d,c)}});function $d(a){z.call(this,"Keyboard",a,$d,65536);(a=a.model)&&!ae[a]&&Pa("Unrecognized Keyboard8080 model: "+a);this.u=ae[a]||{};this.reset();F(this)}A($d);var be={};be[m.Ub]=37;be[m.Xb]=39;be[m.Zb]=32;
@ -809,7 +809,7 @@ function pe(a){this.fa=+a.adapter;switch(this.fa){case 0:this.ha=0;this.la=2;bre
var re=[50,75,110,134.5,150,200,300,600,1200,1800,2E3,2400,3600,4800,9600,19200],se=[!1,0,0,133,142,39,238],qe="buffer";l=pe.prototype;
l.pa=function(a,b,c,d){var e=this;switch(b){case qe:return this.N[b]=this.j=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),te(e,b);return!0},c.onkeypress=function(a){a=a||window.event;te(e,a.which||a.keyCode);a.preventDefault&&a.preventDefault();return!0},c.removeAttribute("readonly"),!0;default:if(d)return this.N[b]=c,d=d.replace(/\\e/g,String.fromCharCode(27)),c.onclick=function(){e.Qb(d);return!0},
!0}return!1};l.Pa=function(a,b,c,d){this.B=a;this.u=b;this.b=c;this.H=d;var e=this;this.ra=Jc(this.b,function(){e.Qb()});this.ma=Jc(this.b,function(){e.Da|=5});this.I=tb(a,"ChipSet");Pb(b,this,ue,this.ha);Tb(b,this,ve,this.ha);F(this)};
l.zc=function(){if(!this.J){var a=nc(this.B,"connection");if(a){var b=a.split("->");if(2==b.length){var c=na(b[0]);if(c!=this.cb)return;b=na(b[1]);if(this.J=db(b)){var d=this.J.exports;if(d){var e=d.connect;e&&e.call(this.J);if(this.M=d.receiveData){this.status(this.Bb+"."+c+" connected to "+b);return}}}}this.status("Unable to establish connection: "+a)}}};l.Ea=function(a,b){if(!b)if(this.zc(),!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};
l.zc=function(){if(!this.J){var a=zc(this.B,"connection");if(a){var b=a.split("->");if(2==b.length){var c=na(b[0]);if(c!=this.cb)return;b=na(b[1]);if(this.J=db(b)){var d=this.J.exports;if(d){var e=d.connect;e&&e.call(this.J);if(this.M=d.receiveData){this.status(this.Bb+"."+c+" connected to "+b);return}}}}this.status("Unable to establish connection: "+a)}}};l.Ea=function(a,b){if(!b)if(this.zc(),!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};
l.Ia=function(a){return a?this.save():!0};l.reset=function(){we(this)};l.save=function(){var a=new J(this),b=0,c=[];c[b++]=this.L;c[b++]=this.Y;c[b++]=this.ca;c[b++]=this.Da;c[b++]=this.K;c[b++]=this.P;c[b]=this.O;a.set(0,c);return a.data()};l.restore=function(a){return we(this,a[0])};function we(a,b){var c=0;b||(b=se);a.L=b[c++];a.Y=b[c++];a.ca=b[c++];a.Da=b[c++];a.K=b[c++];a.P=b[c++];a.O=b[c];return!0}
function xe(a,b){var c=a.O&b;b&15||(c>>=4);b=re[c];c=((a.K&12)>>2)+6;a.K&16&&c++;c+=((a.K&192)>>6)+1>>1;return 1E3/Math.round(b/c)}function te(a,b){hb(a,"receiveByte("+ca(b)+"), status="+ca(a.Da));return a.ba||a.Da&2?!1:(a.Y=b,a.Da|=2,Hd(a.b,a.la),!0)}l.Qb=function(a){null!=a&&(this.G="number"!=typeof a?a:this.G+String.fromCharCode(a));this.G&&(te(this,this.G.charCodeAt(0))&&(this.G=this.G.substr(1)),this.G&&this.b&&Kc(this.b,this.ra,xe(this,15)));return!0};
l.Od=function(a,b){var c=this.Y;E(this,a,null,b,"DATA",c);this.Da&=-3;return c};l.Nd=function(a,b){var c=this.Da;E(this,a,null,b,"STATUS",c);return c};
@ -833,7 +833,7 @@ Pe="B C D E H L M A BC DE HL SP PC PS PSW".split(" "),Qe=[[45],[42,2067,32],[71,
18193,529],[66,18193,785],[66,18193,1041],[66,18193,1297],[66,18193,1617],[66,18193,1809],[5,18193,17],[5,18193,273],[5,18193,529],[5,18193,785],[5,18193,1041],[5,18193,1297],[5,18193,1617],[5,18193,1809],[76,18193,17],[76,18193,273],[76,18193,529],[76,18193,785],[76,18193,1041],[76,18193,1297],[76,18193,1617],[76,18193,1809],[46,18193,17],[46,18193,273],[46,18193,529],[46,18193,785],[46,18193,1041],[46,18193,1297],[46,18193,1617],[46,18193,1809],[18,18193,17],[18,18193,273],[18,18193,529],[18,18193,
785],[18,18193,1041],[18,18193,1297],[18,18193,1617],[18,18193,1809],[58],[50,2067],[34,51],[30,51],[11,51],[51,2067],[4,18193,33],[65,128],[62],[54],[38,51],[30,32819],[15,51],[7,51],[1,18193,33],[65,128],[57],[50,2323],[33,51],[48,33,18193],[10,51],[51,2323],[74,18193,33],[65,128],[55],[54,32768],[31,51],[27,18193,33],[8,51],[7,32819],[67,18193,33],[65,128],[61],[50,2579],[37,51],[78,19283,18963],[14,51],[51,2579],[6,18193,33],[65,128],[60],[49,2579],[36,51],[75,18963,18707],[13,51],[7,32819],[77,
18193,33],[65,128],[59],[50,3603],[35,51],[24],[12,51],[51,3603],[47,18193,33],[65,128],[56],[69,19219,18963],[32,51],[25],[9,51],[7,32819],[19,18193,33],[65,128]];l=He.prototype;
l.Pa=function(a,b,c,d){this.u=b;this.b=c;this.B=a;(a=nc(a,"messages"))&&Le(this,a);this.Fa=Qe;Pd(this,64,function(a){a:{var b=d.u.X,c=a[0],e=a=0,k=b.length;if(c){a=Re(Se(d,c));if(-1===a){d.g("invalid address: "+c);break a}e=a>>>d.u.ia;k=1}d.g("blockid physical blockaddr used size type");d.g("-------- --------- ---------- ------ ------ ----");for(var c=-1,n=0;k--;){var p=b[e];p.type==c?n++||d.g("..."):(c=p.type,n=zb[c],p&&d.g(t(p.id)+" %"+t(e<<d.u.ia)+" %%"+t(p.F)+" "+u(p.yb)+" "+
l.Pa=function(a,b,c,d){this.u=b;this.b=c;this.B=a;(a=zc(a,"messages"))&&Le(this,a);this.Fa=Qe;Pd(this,64,function(a){a:{var b=d.u.X,c=a[0],e=a=0,k=b.length;if(c){a=Re(Se(d,c));if(-1===a){d.g("invalid address: "+c);break a}e=a>>>d.u.ia;k=1}d.g("blockid physical blockaddr used size type");d.g("-------- --------- ---------- ------ ------ ----");for(var c=-1,n=0;k--;){var p=b[e];p.type==c?n++||d.g("..."):(c=p.type,n=zb[c],p&&d.g(t(p.id)+" %"+t(e<<d.u.ia)+" %%"+t(p.F)+" "+u(p.yb)+" "+
u(p.size)+" "+n),c!=$b&&(c=-1),n=0);a+=d.u.Ha;e++}}});F(this)};
l.pa=function(a,b,c){var d=this;switch(b){case "debugInput":return this.ha=this.N[b]=c,c.onkeydown=function(a){var b;if(13==a.keyCode)b=c.value,c.value="",Cc(d,b,!0);else if(27==a.keyCode)c.value=b="";else if(38==a.keyCode?(b=null,d.j<d.w.length-1&&(b=d.w[++d.j])):40==a.keyCode&&(0<d.j?b=d.w[--d.j]:(b="",d.j=-1)),null!=b){var e=b.length;c.value=b;c.setSelectionRange(e,e)}null!=b&&a.preventDefault&&a.preventDefault()},!0;case "debugEnter":return this.N[b]=c,Ea(c,function(){if(d.ha){var a=d.ha.value;
d.ha.value="";Cc(d,a,!0);return!0}return!1}),!0;case "step":return this.N[b]=c,Ea(c,function(a){var b=!1;kb(d,!0)||(jb(d,!0),b=d.kb(a?1:0),jb(d,!1));return b}),!0}return!1};l.xb=function(){this.ha&&this.ha.focus()};function Re(a){a=a&&a.F;null==a&&(a=-1);return a}l.aa=function(a,b){var c=255,d=Re(a);-1!==d&&(c=Ab(this.u,d),b&&sf(a,b));return c};l.$a=function(a,b){var c=65535,d=Re(a);-1!==d&&(c=Bb(this.u,d),b&&sf(a,b));return c};
@ -847,7 +847,7 @@ function yf(a,b){b=Ce(a,b);for(var c=0,d,e;0<=(c=b.indexOf("@",c));)e=a.Mb(b,c+1
function gb(a,b,c,d,e,f,g,h){h|=256;null!=f&&(a.ta&h)!=h||a.message(b.cb+"."+(null!=d?"outPort":"inPort")+"("+u(c)+","+(f?f:"unknown")+(null!=d?","+ca(d):"")+")"+(null!=g?": "+ca(g):"")+(null!=e?" at "+Z(e):""))}
function Ke(a){var b;if(Id(a)){if(!a.L||!a.L.length){a.L=Array(1E3);for(b=0;b<a.L.length;b++)a.L[b]=Y();a.fa=0;a.g("instruction history buffer allocated")}if(!a.J||!a.J.length)for(a.J=Array(256),b=0;b<a.J.length;b++)a.J[b]=[b,0]}else a.L&&a.L.length&&a.g("instruction history buffer freed"),a.fa=0,a.L=[],a.J=[]}l.bb=function(a){if(!zf(this))return!1;this.b.bb(a);return!0};
l.kb=function(a,b,c){if(!zf(this))return!1;this.K=0;a||Id(this)&&Jd(this,this.b.R,0);try{var d=this.b.kb(a);0<d&&(this.K+=d,Hc(this.b,d,!0),Ec(this.b,d),this.ba++)}catch(e){"number"!=typeof e&&(this.K=0,ob(this.b,e.stack||e.message))}!1!==c&&Dc(this.b);this.Ja(b||!1);return 0<this.K};l.qa=function(a){this.b&&this.b.qa(a)};l.Ja=function(a){void 0===a&&(a=!0);this.M=Y(this.b.R);a&&1!=this.Y?Af(this):Bf(this)};
function zf(a){var b;if(b=a.b&&nb(a.b))b=a.b,b.C.xa?b=!0:(b.g(b.toString()+" not powered"),b=!1);b&&!kb(a.b)?(a=a.b,a.C.error?(a.g(a.toString()+" error"),a=!0):a=!1,a=!a):a=!1;return a}l.Ea=function(a,b){return!b&&(this.reset(!0),a&&this.restore&&!this.restore(a))?!1:!0};l.Ia=function(a,b){b&&this.g(a?"suspending":"shutting down");return a?this.save():!0};l.reset=function(a){Ke(this);this.ba=this.ma=0;this.la=null;this.K=0;this.M=Y(this.b.R);this.C.Aa=!1;Cf(this);a||this.Ja()};
function zf(a){var b;if(b=a.b&&lb(a.b))b=a.b,b.C.xa?b=!0:(b.g(b.toString()+" not powered"),b=!1);b&&!kb(a.b)?(a=a.b,a.C.error?(a.g(a.toString()+" error"),a=!0):a=!1,a=!a):a=!1;return a}l.Ea=function(a,b){return!b&&(this.reset(!0),a&&this.restore&&!this.restore(a))?!1:!0};l.Ia=function(a,b){b&&this.g(a?"suspending":"shutting down");return a?this.save():!0};l.reset=function(a){Ke(this);this.ba=this.ma=0;this.la=null;this.K=0;this.M=Y(this.b.R);this.C.Aa=!1;Cf(this);a||this.Ja()};
l.save=function(){var a=new J(this);a.set(0,tf(this.M));a.set(1,tf(this.ca));a.set(2,[this.w,this.P,this.ta]);a.set(3,this.G);return a.data()};l.restore=function(a){var b=0;void 0!==a[2]&&(this.M=uf(a[b++]),this.ca=uf(a[b++]),this.w=a[b][0],"string"==typeof this.w&&(this.w=[this.w]),this.P=a[b][1],this.ta|=a[b][2]);a[3]&&(this.G=a[3]);return!0};l.start=function(a,b){this.Y||this.g("running");this.C.Aa=!0;this.nb=a;this.ob=b};
l.stop=function(a,b){if(this.C.Aa){this.C.Aa=!1;this.K=b-this.ob;if(!this.Y){b="stopped";if(this.K){a-=this.nb;var c=0<a?Math.round(1E3*this.K/a):0;b+=" (";Id(this)&&(b+=this.ba+" opcodes, ",this.ma-=this.ba,this.ba=0);b+=this.K+" cycles, "+a+" ms, "+c+" hz)"}else ib(this,-2147483648)&&(b+=" (use the 't' command to execute blocked faults)");this.g(b)}this.Ja(!0);this.xb();Cf(this,this.b.R)}};function Id(a){return 1<a.I.length||!!a.ja}
function Jd(a,b,c){var d=a.b;if(0<c&&(a.ja&&!--a.ja||ic(a,b,1,a.I)))return!0;0<=c&&a.J.length&&(a.ba++,b=Ab(a.u,b),null!=b&&(a.J[b][1]++,b=a.L[a.fa],b.F=d.R,b.Oa=!1,++a.fa==a.L.length&&(a.fa=0)));return!1}function Rb(a,b,c){a.g("break on input from port "+u(b)+": "+t(c));a.qa(!0)}function Vb(a,b,c){a.g("break on output to port "+u(b)+": "+t(c));a.qa(!0)}
@ -869,27 +869,27 @@ case "DE":d.U=f>>8&255;case "E":d.V=f&255;break;case "H":d.W=f&255;break;case "H
case "IF":d.ua=f?d.ua|512:d.ua&-513;break;default:a.g("unknown register: "+e);return}Dc(d);a.g("updated registers:")}a.g(Kf(a));c&&(a.M=Y(d.R),Bf(a,Z(a.M.F)))}}function Rf(a,b){b=na(b);var c=b.match(/^(['"])(.*?)\1$/);c?a.g(yf(a,c[2])):Be(a,b,!0)}function Sf(a,b,c){var d="t"!=b;c=De(a,c,null,!0)||1;var e=1==c?0:1;"tc"==b&&(e=c,c=1);Da(c,function(){return jb(a,!0)&&a.kb(e,d,!1)},function(){Dc(a.b);jb(a,!1)})}
function Bf(a,b,c,d){if(b=Se(a,b,!0)){void 0===d&&(d=1);var e=256;if(void 0!==c){d=Se(a,c,!0);if(!d||d.F<b.F)return;e=d.F-b.F;if(256<e){a.g("range too large");return}d=-1}c=0;for(var f;0<e&&d--;){f=kb(a,!1)||a.Y?a.K:null;var g=null!=f?"cycles":null,h=Lf(a,b),k=b.F;if(h[0]&&d&&(!c&&d||0>h[0].indexOf("+"))){var n=h[0]+":";h[2]&&(n+=" "+h[2]);a.g(n)}h[3]&&(g=h[3],f=null);f=Hf(a,b,g,f);a.g(f);a.M=b;e-=b.F-k;c++}}}
l.Fb=function(a,b,c){if(b)if(a){0>this.j&&this.w.length&&(this.j=0);if(0>this.j||a!=this.w[this.j])this.w.splice(0,0,a),this.j=0;this.j--}else this.P?a="end":a=this.w[this.j+1];b=[];if(a){a=a.toLowerCase().replace(/""/g,"'");var d=0,e=null;c=c||";";for(var f=0;f<=a.length;f++){var g=a.charAt(f);if('"'==g||"'"==g)e?g==e&&(e=null):e=g;else if(g==c&&!e||!g)b.push(na(a.substring(d,f))),d=f+1}}return b};
function Gf(a,b,c){var d=!0;try{b.length&&"end"!=b?c||a.g(">> "+b):(a.P&&(a.g("ended assemble at "+Z(a.ca.F)),a.M=a.ca,a.P=!1),b="");var e=b.charAt(0);if('"'==e||"'"==e)return!0;a.la=null;if(nb(a)&&0<b.length){a.P&&(b="a "+Z(a.ca.F)+" "+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 n=g.charAt(k);if("?"==h||"r"==h||"a">n||"z"<n){f[0]=g.substr(k);f.unshift(g.substr(0,k));break}}switch(f[0].charAt(0)){case "a":var p=Se(a,f[1],!0);if(p)if(a.ca=
function Gf(a,b,c){var d=!0;try{b.length&&"end"!=b?c||a.g(">> "+b):(a.P&&(a.g("ended assemble at "+Z(a.ca.F)),a.M=a.ca,a.P=!1),b="");var e=b.charAt(0);if('"'==e||"'"==e)return!0;a.la=null;if(lb(a)&&0<b.length){a.P&&(b="a "+Z(a.ca.F)+" "+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 n=g.charAt(k);if("?"==h||"r"==h||"a">n||"z"<n){f[0]=g.substr(k);f.unshift(g.substr(0,k));break}}switch(f[0].charAt(0)){case "a":var p=Se(a,f[1],!0);if(p)if(a.ca=
p,void 0===f[2])a.g("begin assemble at "+Z(p.F)),a.P=!0,Dc(a.b);else{var q;a.g("not supported yet");q=[];if(q.length){for(var x=0;x<q.length;x++)a.va(p,q[x],1);a.g(Hf(a,a.ca))}}break;case "b":a:{var v=f[0],r=f[1],y=b;if("?"==r)a.g("breakpoint commands:"),a.g("\tbi [p]\ttoggle break on input port [p]"),a.g("\tbo [p]\ttoggle break on output port [p]"),a.g("\tbp [a]\tset exec breakpoint at addr [a]"),a.g("\tbr [a]\tset read breakpoint at addr [a]"),a.g("\tbw [a]\tset write breakpoint at addr [a]"),a.g("\tbc [a]\tclear breakpoint at addr [a]"),
a.g("\tbl\tlist all breakpoints"),a.g("\tbn [n]\tbreak after [n] instruction(s)");else{var G=v.charAt(1);if("l"==G){var ga;ga=0+Ff(a,a.I);ga+=Ff(a,a.O);(ga+=Ff(a,a.D))||a.g("no breakpoints")}else if("n"==G)a.ja=De(a,r),a.g("break after "+a.ja+" instruction(s)");else if(void 0===r)a.g("missing breakpoint address");else{var C=Y();if("*"!=r&&(C=Se(a,r,!0),!C))break a;r=u(C.F);"c"==G?null==C.F?(Je(a),a.g("all breakpoints cleared")):Df(a,a.I,C)||Df(a,a.O,C)||Df(a,a.D,C)||a.g("breakpoint missing: "+Z(C.F)):
"i"==G?a.g("breakpoint "+(Fb(a.u,C.F)?"enabled":"cleared")+": port "+r+" (input)"):"o"==G?a.g("breakpoint "+(Sb(a.u,C.F)?"enabled":"cleared")+": port "+r+" (output)"):null!=C.F&&(vf(a,C,y),"p"==G?a.Za(a.I,C):"r"==G?a.Za(a.O,C):"w"==G?a.Za(a.D,C):a.g("unknown breakpoint command: "+G))}}}break;case "c":a.Ga&&(a.Ga.value="");break;case "d":a:{var T,da=f[0],X=f[1],ta=f[2],Cb=f[3];if("?"==X){var lb="";for(T in rb)a.wa[T]&&(lb&&(lb+=","),lb+=T);lb+=",state,symbols";a.g("dump memory commands:");a.g("\tdb [a] [#] dump # bytes at address a");
a.g("\tdw [a] [#] dump # words at address a");a.g("\tdd [a] [#] dump # dwords at address a");a.g("\tdh [#] [#] dump # instructions from history");lb.length&&a.g("dump extension commands:\n\t"+lb)}else if("state"==X){var Te=Tf(a.B,!0);"console"==ta?console.log(Te):(a.Ga&&(a.Ga.value=""),a.g(Te))}else if("symbols"==X)for(var jd=0;jd<a.G.length;jd++){var kd=a.G[jd],mb;for(mb in kd.Qa)if("."!=mb.charAt(0)){var Ue=kd.Qa[mb].o;if(void 0!==Ue){var Ve=kd.Qa[mb].l;Ve&&(mb=Ve);a.g(Z(Ue)+" "+mb)}}}else{if("d"==
"i"==G?a.g("breakpoint "+(Fb(a.u,C.F)?"enabled":"cleared")+": port "+r+" (input)"):"o"==G?a.g("breakpoint "+(Sb(a.u,C.F)?"enabled":"cleared")+": port "+r+" (output)"):null!=C.F&&(vf(a,C,y),"p"==G?a.Za(a.I,C):"r"==G?a.Za(a.O,C):"w"==G?a.Za(a.D,C):a.g("unknown breakpoint command: "+G))}}}break;case "c":a.Ga&&(a.Ga.value="");break;case "d":a:{var T,da=f[0],X=f[1],ta=f[2],Cb=f[3];if("?"==X){var mb="";for(T in rb)a.wa[T]&&(mb&&(mb+=","),mb+=T);mb+=",state,symbols";a.g("dump memory commands:");a.g("\tdb [a] [#] dump # bytes at address a");
a.g("\tdw [a] [#] dump # words at address a");a.g("\tdd [a] [#] dump # dwords at address a");a.g("\tdh [#] [#] dump # instructions from history");mb.length&&a.g("dump extension commands:\n\t"+mb)}else if("state"==X){var Te=Tf(a.B,!0);"console"==ta?console.log(Te):(a.Ga&&(a.Ga.value=""),a.g(Te))}else if("symbols"==X)for(var jd=0;jd<a.G.length;jd++){var kd=a.G[jd],nb;for(nb in kd.Qa)if("."!=nb.charAt(0)){var Ue=kd.Qa[nb].o;if(void 0!==Ue){var Ve=kd.Qa[nb].l;Ve&&(nb=Ve);a.g(Z(Ue)+" "+nb)}}}else{if("d"==
da){for(T in rb)if(f[1]==T){var We=a.wa[T];We?(f.shift(),f.shift(),We(f)):a.g("no dump registered for "+X);break a}X||(da=a.qb||"db")}else a.qb=da;if("dh"==da){var Xe=X,Ye=ta,Ze="",$e=0,ua=a.fa,Fa=a.L;if(Fa.length){var ia=+Xe||a.eb,Gb=+Ye||10;isNaN(ia)?ia=Gb:Ze="more ";ia>Fa.length&&(a.g("note: only "+Fa.length+" available"),ia=Fa.length);ua-=ia;0>ua&&(null==Fa[Fa.length-1].F?(ia=ua+ia,ua=0):ua+=Fa.length);var ld=[];"call"==Ye&&(Gb=1E5,ld=["CALL"]);for(void 0!==Xe&&a.g(ia+" instructions earlier:");0<
Gb&&ua!=a.fa;){var af=Fa[ua++];if(null==af.F)break;var Hb=Y(af.F),kg=ia--,bf=Hf(a,Hb,"history",kg);(!ld.length||0<=bf.indexOf(ld[0]))&&a.g(bf);Hb.Lb&&(ua+=Hb.Lb,Gb-=Hb.Lb,ia-=Hb.Lb);ua>=Fa.length&&(ua=0);a.eb=ia;$e++;Gb--}}$e||(a.g("no "+Ze+"history available"),a.eb=void 0)}else{var oc=Se(a,X);if(oc){var pc=0;ta&&("l"==ta.charAt(0)&&(ta=ta.substr(1)||Cb),pc=De(a,ta)>>>0,65536<pc&&(pc=65536));for(var Ib="",qc="dd"==da?4:"dw"==da?2:1,rc=qc*pc||128,lg=rc+15>>4||1;lg--&&0<rc;){var sc=0,md=0,Jb,nd="",
cf="",X=Z(oc.F);for(Jb=16;0<Jb&&0<rc;Jb--){var tc=a.aa(oc,1),sc=sc|tc<<(md++<<3);md==qc&&(nd+=t(sc,2*qc),nd+=1==qc?9==Jb?"-":" ":" ",sc=md=0);cf+=32<=tc&&128>tc?String.fromCharCode(tc):".";rc--}Ib&&(Ib+="\n");Ib+=X+" "+nd+(Jb?"":" "+cf)}Ib&&a.g(Ib);a.Ua=oc}}}}break;case "e":if("else"==f[0])break;var uc=1,df=255,ef=a.aa,ff=a.va;"ew"==f[0]&&(uc=2,df=65535,ef=a.$a,ff=a.Ib);var gf=uc<<1,hf=f[1];if(null==hf)a.g("edit memory commands:"),a.g("\teb [a] [...] edit bytes at address a"),a.g("\tew [a] [...] edit words at address a");
else{var vc=Se(a,hf);if(vc)for(var wc=2;wc<f.length;wc++){var Kb=Be(a,f[wc]);if(void 0===Kb){a.g("unrecognized value: "+f[wc]);break}Kb&~df&&a.g("warning: "+t(Kb)+" exceeds "+uc+"-byte value");var mg=ef.call(a,vc);a.g("changing "+Z(vc.F)+" from "+t(mg,gf,!0)+" to "+t(Kb,gf,!0));ff.call(a,vc,Kb,uc)}}break;case "f":Nf(a,f[1]);break;case "g":a:{var jf=f[1],ng=b;if(void 0!==jf){var od=Se(a,jf,!0);if(!od)break a;vf(a,od,ng);a.Za(a.I,od,!0)}a.bb(!0)||c||a.g("cpu busy or unavailable, run command ignored")}break;
case "h":a:{var pd;if(a.C.Aa)pd="halting",a.qa();else{if(kb(a,!0))break a;pd="already halted"}c||a.g(pd)}break;case "i":if("if"==f[0]){var qd;var Lb=b.substr(2),Lb=na(Lb);Be(a,Lb)?(c||a.g("true: "+Lb),qd=!0):(c||a.g("false: "+Lb),qd=!1);qd||(d=!1);break}if("int"==f[0]){var xc;var og=f[1];if(a.b.ua&512){var rd=Be(a,og);null==rd?xc=!1:(a.g("requesting interrupt level "+rd),Hd(a.b,rd),xc=!0)}else a.g("interrupts disabled (use rif=1 to enable)"),xc=!1;xc||(d=!1);break}var sd=f[1];if(sd&&"?"!=sd){var td=
De(a,sd);if(void 0!==td){var pg=Qb(a.u,td);a.g(u(td)+": "+ca(pg))}}else a.g("input commands:"),a.g("\ti [p]\tread port [p]"),a.g("warning: port accesses can affect hardware state");break;case "k":var qg=f[0];if("?"==f[1])a.g("stack trace commands:"),a.g("\tk\tshow frame addresses"),a.g("\tks\tshow symbol information");else{var ud=0,kf=Y(),Mb=Y(a.b.oa);for(a.g("stack trace for "+Z(Mb.F));10>ud;){for(var Wa=null,rg=256;65536>Mb.F>>>0;){kf.F=a.$a(Mb,2);if(null==Mb.F||!rg--)break;for(var sg=a,yc=kf,lf=
null,Nb=yc.F,mf=Nb,vd=1;6>=vd&&Nb;vd++){if(2<vd){yc.F=Nb;var zc=Hf(sg,yc);if(0<=zc.indexOf("CALL")){var nf=zc.indexOf(" ");if(Nb+(zc.indexOf(" ",nf+1)-nf-1)/2==mf){lf=zc;break}}}Nb--}yc.F=mf;if(Wa=lf)break}if(!Wa||null==Wa)break;var of=null;if("ks"==qg){var pf=Wa.match(/[0-9A-F]+$/);pf&&(of=Pf(a,pf[0]))}Wa=ma(Wa,50)+" ;"+(of||"stack="+Z(Mb.F));a.g(Wa);ud++}ud||a.g("no return addresses found")}break;case "l":"ln"==f[0]&&Pf(a,f[1],!0);break;case "m":a:{var Ga,Ha=null,N=f[1];"?"==N&&(N=void 0);if(void 0!==
Gb&&ua!=a.fa;){var af=Fa[ua++];if(null==af.F)break;var Hb=Y(af.F),kg=ia--,bf=Hf(a,Hb,"history",kg);(!ld.length||0<=bf.indexOf(ld[0]))&&a.g(bf);Hb.Lb&&(ua+=Hb.Lb,Gb-=Hb.Lb,ia-=Hb.Lb);ua>=Fa.length&&(ua=0);a.eb=ia;$e++;Gb--}}$e||(a.g("no "+Ze+"history available"),a.eb=void 0)}else{var nc=Se(a,X);if(nc){var oc=0;ta&&("l"==ta.charAt(0)&&(ta=ta.substr(1)||Cb),oc=De(a,ta)>>>0,65536<oc&&(oc=65536));for(var Ib="",pc="dd"==da?4:"dw"==da?2:1,qc=pc*oc||128,lg=qc+15>>4||1;lg--&&0<qc;){var rc=0,md=0,Jb,nd="",
cf="",X=Z(nc.F);for(Jb=16;0<Jb&&0<qc;Jb--){var sc=a.aa(nc,1),rc=rc|sc<<(md++<<3);md==pc&&(nd+=t(rc,2*pc),nd+=1==pc?9==Jb?"-":" ":" ",rc=md=0);cf+=32<=sc&&128>sc?String.fromCharCode(sc):".";qc--}Ib&&(Ib+="\n");Ib+=X+" "+nd+(Jb?"":" "+cf)}Ib&&a.g(Ib);a.Ua=nc}}}}break;case "e":if("else"==f[0])break;var tc=1,df=255,ef=a.aa,ff=a.va;"ew"==f[0]&&(tc=2,df=65535,ef=a.$a,ff=a.Ib);var gf=tc<<1,hf=f[1];if(null==hf)a.g("edit memory commands:"),a.g("\teb [a] [...] edit bytes at address a"),a.g("\tew [a] [...] edit words at address a");
else{var uc=Se(a,hf);if(uc)for(var vc=2;vc<f.length;vc++){var Kb=Be(a,f[vc]);if(void 0===Kb){a.g("unrecognized value: "+f[vc]);break}Kb&~df&&a.g("warning: "+t(Kb)+" exceeds "+tc+"-byte value");var mg=ef.call(a,uc);a.g("changing "+Z(uc.F)+" from "+t(mg,gf,!0)+" to "+t(Kb,gf,!0));ff.call(a,uc,Kb,tc)}}break;case "f":Nf(a,f[1]);break;case "g":a:{var jf=f[1],ng=b;if(void 0!==jf){var od=Se(a,jf,!0);if(!od)break a;vf(a,od,ng);a.Za(a.I,od,!0)}a.bb(!0)||c||a.g("cpu busy or unavailable, run command ignored")}break;
case "h":a:{var pd;if(a.C.Aa)pd="halting",a.qa();else{if(kb(a,!0))break a;pd="already halted"}c||a.g(pd)}break;case "i":if("if"==f[0]){var qd;var Lb=b.substr(2),Lb=na(Lb);Be(a,Lb)?(c||a.g("true: "+Lb),qd=!0):(c||a.g("false: "+Lb),qd=!1);qd||(d=!1);break}if("int"==f[0]){var wc;var og=f[1];if(a.b.ua&512){var rd=Be(a,og);null==rd?wc=!1:(a.g("requesting interrupt level "+rd),Hd(a.b,rd),wc=!0)}else a.g("interrupts disabled (use rif=1 to enable)"),wc=!1;wc||(d=!1);break}var sd=f[1];if(sd&&"?"!=sd){var td=
De(a,sd);if(void 0!==td){var pg=Qb(a.u,td);a.g(u(td)+": "+ca(pg))}}else a.g("input commands:"),a.g("\ti [p]\tread port [p]"),a.g("warning: port accesses can affect hardware state");break;case "k":var qg=f[0];if("?"==f[1])a.g("stack trace commands:"),a.g("\tk\tshow frame addresses"),a.g("\tks\tshow symbol information");else{var ud=0,kf=Y(),Mb=Y(a.b.oa);for(a.g("stack trace for "+Z(Mb.F));10>ud;){for(var Xa=null,rg=256;65536>Mb.F>>>0;){kf.F=a.$a(Mb,2);if(null==Mb.F||!rg--)break;for(var sg=a,xc=kf,lf=
null,Nb=xc.F,mf=Nb,vd=1;6>=vd&&Nb;vd++){if(2<vd){xc.F=Nb;var yc=Hf(sg,xc);if(0<=yc.indexOf("CALL")){var nf=yc.indexOf(" ");if(Nb+(yc.indexOf(" ",nf+1)-nf-1)/2==mf){lf=yc;break}}}Nb--}xc.F=mf;if(Xa=lf)break}if(!Xa||null==Xa)break;var of=null;if("ks"==qg){var pf=Xa.match(/[0-9A-F]+$/);pf&&(of=Pf(a,pf[0]))}Xa=ma(Xa,50)+" ;"+(of||"stack="+Z(Mb.F));a.g(Xa);ud++}ud||a.g("no return addresses found")}break;case "l":"ln"==f[0]&&Pf(a,f[1],!0);break;case "m":a:{var Ga,Ha=null,N=f[1];"?"==N&&(N=void 0);if(void 0!==
N){var Ra=0;if("all"==N)Ra=1878917119,N=null;else if("on"==N)Ha=!0,N=null;else if("off"==N)Ha=!1,N=null;else{"keys"==N&&(N="key");"kbd"==N&&(N="keyboard");for(Ga in rb)if(N==Ga){Ra=rb[Ga];Ha=!!(a.ta&Ra);break}if(!Ra){a.g("unknown message category: "+N);break a}}if(Ra)if("on"==f[2])a.ta|=Ra,Ha=!0;else if("off"==f[2]&&(a.ta&=~Ra,Ha=!1,1073741824==Ra)){for(var wd=0;wd<a.ra.length;wd++)a.g(a.ra[wd]);a.ra=[]}}var tg=0,Ob="";for(Ga in rb)if(!N||N==Ga){var ug=!!(a.ta&rb[Ga]);if(null===Ha||Ha==ug)Ob&&(Ob+=
","),++tg%10||(Ob+="\n\t"),"key"==Ga&&(Ga="keys"),Ob+=Ga}void 0===N&&a.g("message commands:\n\tm [category] [on|off]\tturn categories on/off");a.g((null!==Ha?Ha?"messages on: ":"messages off: ":"message categories:\n\t")+(Ob||"none"));Ke(a)}break;case "o":var xd=f[1],vg=f[2];if(xd&&"?"!=xd){var yd=De(a,xd,"port #"),zd=De(a,vg);void 0!==yd&&void 0!==zd&&(Ub(a.u,yd,zd),a.g(u(yd)+": "+ca(zd)))}else a.g("output commands:"),a.g("\to [p] [b]\twrite byte [b] to port [p]"),a.g("warning: port accesses can affect hardware state");
break;case "p":if("print"==f[0]){Rf(a,b.substr(5));break}var qf="pr"==f[0]?1:0,wg=1+qf;if(a.Y)a.g("step in progress");else{var Ad=Y(a.b.R);switch(a.aa(Ad)){case 205:a.Y=wg,sf(Ad,3)}a.Y?(a.Za(a.I,Ad,!0),a.bb()||(a.B&&a.B.xb(),a.Y=0)):Sf(a,qf?"tr":"t")}break;case "r":if("reset"==b){a.B&&a.B.reset();break}Af(a,f);break;case "s":Qf(a,f);break;case "t":Sf(a,f[0],f[1]);break;case "u":Bf(a,f[1],f[2],8);break;case "v":if("var"==f[0]){Of(a,b.substr(3))||(d=!1);break}a.g("PC8080 version 1.30.1 ("+a.b.Wd+",RELEASE"+
(pb?",TYPEDARRAYS":",LONGARRAYS")+")");a.g(wa());break;case "?":if(f[1]){Rf(a,b.substr(1));break}var Bd="commands:",Cd;for(Cd in Me)Bd+="\n"+ma(Cd,9)+Me[Cd];Id(a)||(Bd+="\nnote: frequency/history disabled if no exec breakpoints");a.g(Bd);break;default:a.g("unknown command: "+b),d=!1}}}catch(rf){a.g("debugger error: "+(rf.stack||rf.message)),d=!1}return d}function Cc(a,b,c){b=a.Fb(b,c);for(var d in b)if(!Gf(a,b[+d]))return!1;return!0}
Na(function(){for(var a=D(document,"pc8080","debugger"),b=0;b<a.length;b++){var c=a[b],d=B(c),d=new He(d);fb(d,c)}});
function Uf(a,b,c){z.call(this,"Computer",a,Uf,67108864);this.C.xa=!1;Vf(this,b);this.O=nc(this,"autoPower",a);this.w=0;this.ea=a.busWidth||a.buswidth;this.B=Wf;this.L=null;this.J=this.ba=!1;this.fa=nc(this,"url")||"";(Math.random()+.1).toString(36);this.j=Xf(this);if(this.b=eb("CPU",this.id)){this.H=eb("Debugger",this.id);this.G=[];for(b=null;b=tb(this,"Video",b);)this.G.push(b);this.u=new vb({id:this.Bb+".bus",busWidth:this.ea},this.b,this.H);var d,e=cb(this.id);if((this.I=eb("Panel",this.id))&&
this.I.Ga)for(b=0;b<e.length;b++)d=e[b],d.ka=this.I.ka,d.g=this.I.g,d.Ga=this.I.Ga;this.g("PC8080 v1.30.1\nCopyright \u00a9 2012-2016 Jeff Parsons <Jeff@pcjs.org>\nLicense: GPL version 3 or later <http://gnu.org/licenses/gpl.html>");for(b=0;b<e.length;b++)d=e[b],d.Pa&&d.Pa(this,this.u,this.b,this.H);b=null;d=a.resume;void 0!==d&&(1<d.length?b=this.K=d:this.B=parseInt(d,10));var f;if(a=nc(this,"state")||(f=!0,a.state))b=this.P=a,f||(this.J=!0,this.B=Wf),this.B&&(this.M=new J(this,"1.30.1"),Yf(this.M)?
function Uf(a,b,c){z.call(this,"Computer",a,Uf,67108864);this.C.xa=!1;Vf(this,b);this.O=zc(this,"autoPower",a);this.w=0;this.ea=a.busWidth||a.buswidth;this.B=Wf;this.L=null;this.J=this.ba=!1;this.fa=zc(this,"url")||"";(Math.random()+.1).toString(36);this.j=Xf(this);if(this.b=eb("CPU",this.id)){this.H=eb("Debugger",this.id);this.G=[];for(b=null;b=tb(this,"Video",b);)this.G.push(b);this.u=new vb({id:this.Bb+".bus",busWidth:this.ea},this.b,this.H);var d,e=cb(this.id);if((this.I=eb("Panel",this.id))&&
this.I.Ga)for(b=0;b<e.length;b++)d=e[b],d.ka=this.I.ka,d.g=this.I.g,d.Ga=this.I.Ga;this.g("PC8080 v1.30.1\nCopyright \u00a9 2012-2016 Jeff Parsons <Jeff@pcjs.org>\nLicense: GPL version 3 or later <http://gnu.org/licenses/gpl.html>");for(b=0;b<e.length;b++)d=e[b],d.Pa&&d.Pa(this,this.u,this.b,this.H);b=null;d=a.resume;void 0!==d&&(1<d.length?b=this.K=d:this.B=parseInt(d,10));var f;if(a=zc(this,"state")||(f=!0,a.state))b=this.P=a,f||(this.J=!0,this.B=Wf),this.B&&(this.M=new J(this,"1.30.1"),Yf(this.M)?
b=null:delete this.M);!b&&this.B&&(b=Zf(this))&&(this.J=!0);if(b){var g=this;va(b,null,!0,function(a,b,c){c?(g.K=null,g.J=!1,g.ka("Unable to load machine state from server (error "+c+(b?": "+na(b):"")+")")):(g.L=b,g.ba=!0);F(g)})}else F(this);this.N.power||(this.O=!0);!c&&this.O&&$f(this,this.vb)}else w("Unable to find CPU component")}A(Uf);var Wf=0;function Vf(a,b){if(!b){var c;if("object"==typeof resources&&(c=resources.parms))try{b=eval("("+c+")")}catch(d){w(d.message+" ("+c+")")}}a.ca=b}
function nc(a,b,c){var d=b.toLowerCase(),d=Va[b]||Va[d];void 0===d&&a.ca&&(d=a.ca[b]);void 0===d&&c&&(d=c[b]);void 0===d&&"object"==typeof resources&&resources[b]&&(d=b);return d}function $f(a,b,c){for(var d=cb(a.id),e=0;e<=d.length;e++){var f=e<d.length?d[e]:a;if(!nb(f)){nb(f,function(){$f(a,b,c)});return}}b.call(a,c)}
function zc(a,b,c){var d=b.toLowerCase(),d=Va[b]||Va[d];void 0===d&&a.ca&&(d=a.ca[b]);void 0===d&&c&&(d=c[b]);void 0===d&&"object"==typeof resources&&resources[b]&&(d=b);return d}function $f(a,b,c){for(var d=cb(a.id),e=0;e<=d.length;e++){var f=e<d.length?d[e]:a;if(!lb(f)){lb(f,function(){$f(a,b,c)});return}}b.call(a,c)}
function ag(a,b){var c=new J(a,"1.30.1","validate");if(Yf(c)&&bg(c)){var d=c.get("timestamp"),e=b?b.get("timestamp"):"unknown";d!=e&&(a.ka("Machine state may be out-of-date\n("+d+" vs. "+e+")\nCheck your browser's local storage limits"),b||c.clear())}}l=Uf.prototype;
l.vb=function(a){void 0===a&&(a=this.B||(this.L?1:Wf));if(!this.w){this.w++;var b=!1,c=!1;this.Y=!1;var d=this.M||new J(this,"1.30.1");if(-1==a)b=!0;else if(a>Wf){if(Yf(d,this.L)){this.D=new J(this,"1.30.1","failsafe");Yf(this.D)&&(cg(this,d),a=2,dg(this.D));this.D.set("timestamp",ra());eg(this.D);var e=this.B&&!this.J;if(1==a||xa("Click OK to restore the previous PC8080 machine state, or CANCEL to reset the machine.")){if(c=bg(d)){var f=d.get("code"),g=d.get("data");f&&("ok"==f?Yf(d,g):("error"==
f&&"no machine state"!=g?(this.ka("Error: "+g),"unable to verify user"==g&&(Ba("user",""),this.j=null)):this.g(f+": "+g),dg(d),Yf(d)?(c=bg(d),e=!0):c=!1))}e&&ag(this,c?d:null)}else 2==a&&d.clear()}else ag(this);delete this.L;delete this.M}e=cb(this.id);for(f=0;f<e.length;f++)g=e[f],g!==this&&g!=this.b&&(c=fg(this,g,d,b,c));b=[d,a,c];-1!=a?$f(this,this.wc,b):this.wc(b)}};