From ea95de49396d47e8b12fec4aaed03a4ac0c8360a Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 5 Apr 2017 20:42:44 -0700 Subject: [PATCH] Fixed (or rather, band-aided) a MACRO-10 regression assembling the nested macro test (/apps/pdp10/tests/macro10/TEST.MAC) --- apps/pdp10/tests/macro10/README.md | 2 +- docs/pcx86/examples/pcx86-dbg.js | 2 +- modules/pdp10/lib/macro10.js | 14 +++++++ modules/shared/lib/debugger.js | 4 +- versions/pc8080/1.34.3/pc8080-dbg.js | 2 +- versions/pcx86/1.34.3/pcx86-dbg.js | 2 +- versions/pdpjs/1.34.3/pdp10-dbg.js | 56 ++++++++++++++-------------- versions/pdpjs/1.34.3/pdp11-dbg.js | 2 +- 8 files changed, 49 insertions(+), 35 deletions(-) diff --git a/apps/pdp10/tests/macro10/README.md b/apps/pdp10/tests/macro10/README.md index 61e012e41..d38b49b12 100644 --- a/apps/pdp10/tests/macro10/README.md +++ b/apps/pdp10/tests/macro10/README.md @@ -7,7 +7,7 @@ machines: type: pdp10 config: /devices/pdp10/machine/ka10/test/debugger/machine.xml debugger: true - commands: a 100 /apps/pdp10/tests/macro10/TEXT.MAC + commands: a 100 /apps/pdp10/tests/macro10/TEXT.MAC;db 100 l4 --- PDPjs MACRO-10 Mini-Assembler Tests diff --git a/docs/pcx86/examples/pcx86-dbg.js b/docs/pcx86/examples/pcx86-dbg.js index cab14c2bd..8b35b9d77 100644 --- a/docs/pcx86/examples/pcx86-dbg.js +++ b/docs/pcx86/examples/pcx86-dbg.js @@ -721,7 +721,7 @@ function Xx(a,b,c){for(c=void 0===c?-1:c;c--&&b.length;){var d=b.pop();if(2>a.le f;break;case "!":case "|":e|=f;break;case "^!":e|=f;break;case "&&":e=e&&f?1:0;break;case "||":e=e||f?1:0;break;case ",,":e=Wx(e,18,!0)*Math.pow(2,18)+Wx(f,18,!0);break;case "_":case "^_":"^_"==d&&(f=35-(f&255));f&&(e=Wx(e,0,!0),e=0=|>>>|>>|>|<=|<<|<|-|\+|\^\/|\/|\*|,,| )/);d=Yx(a,b,0,b.length,a.D,c);void 0!==d&&e&&fy(a,null,d)}return d} function gy(a,b){var c,d=a.ha[0],e=a.ha[1];c="("==d||"{"==d||"["==d?"\\":"";for(var f="["==d?"\\":"",f=new RegExp(c+d+"([^"+f+d+f+e+"]+)"+c+e);c=b.match(f);){var g=ey(a,c[1]);if(void 0===g)return;b=b.replace(d+c[1]+e,null!=g?dy(a,g):"undefined")}if(a.Aa.length)for(d=a.Aa[0],e=a.Aa[1],c="("==d||"{"==d||"["==d?"\\":"",f="["==d?"\\":"",f=new RegExp(c+d+"([^"+f+d+f+e+"]+)"+c+e);c=b.match(f);)b=a.Pk(b,c[1]);for(;d=b.match(/\$([a-z]+)/i);){e=null;switch(d[1].toLowerCase()){case "ops":e=a.Z-a.la}if(null== e)break;b=b.replace(d[0],e.toString())}return b}function $x(a,b){for(;b;){switch(b&3){case 1:a=-Wx(a);break;case 2:a|=-1;break;case 3:for(var c=35;0<=c&&!(a&Math.pow(2,c));)c--;a=35-c}b>>>=2}return a} diff --git a/modules/pdp10/lib/macro10.js b/modules/pdp10/lib/macro10.js index 9dace82a0..398fe2af6 100644 --- a/modules/pdp10/lib/macro10.js +++ b/modules/pdp10/lib/macro10.js @@ -570,12 +570,26 @@ class Macro10 { } fParse = false; sOperator = matchLine[2].toUpperCase(); + + /* + * TODO: The following kludge needs to be fixed at some point. The goal here is to prevent any + * of the caller's parameters from replacing any IRP/IRPC call parameters, but the goal is actually + * much bigger than that, because it's not just IRP/IRPC call parameters that must be left intact, + * but ANY macro call parameters; IRP/IRPC macros are just easier to pick out. Unfortunately, as + * the code is currently structured, we won't know if we're dealing with any macro call parameters + * on this line until parseMacro() is called, below. + */ if (sOperator == Macro10.PSEUDO_OP.IRP || sOperator == Macro10.PSEUDO_OP.IRPC) { aParms = null; } + if (aParms) { for (var iParm = 0; iParm < aParms.length; iParm++) { var sParm = aParms[iParm]; + + var macroDef = this.tblMacros[this.sMacroDef]; + if (macroDef && macroDef.aParms.indexOf(sParm) >= 0) continue; + var sReplace = aValues[iParm] || aDefaults[iParm] || ""; var iSearch = 0; var iLimit = sLine.length - matchLine[5].length; // set the limit at the start of the comment, if any diff --git a/modules/shared/lib/debugger.js b/modules/shared/lib/debugger.js index 9c722cb05..bfb75b0a0 100644 --- a/modules/shared/lib/debugger.js +++ b/modules/shared/lib/debugger.js @@ -792,7 +792,7 @@ class Debugger extends Component * @param {string} chDelim * @param {number} nBits * @param {number} cchMax - * @return {string} + * @return {string|undefined} */ parseASCII(sExp, chDelim, nBits, cchMax) { @@ -819,7 +819,7 @@ class Debugger extends Component } if (cch >= 0) { this.println("parse error (" + chDelim + sExp + chDelim + ")"); - break; + return undefined; } else { sExp = sExp.substr(0, i) + this.toStrBase(v, -1) + sExp.substr(j); } diff --git a/versions/pc8080/1.34.3/pc8080-dbg.js b/versions/pc8080/1.34.3/pc8080-dbg.js index f2ff00214..ac78c7779 100644 --- a/versions/pc8080/1.34.3/pc8080-dbg.js +++ b/versions/pc8080/1.34.3/pc8080-dbg.js @@ -203,7 +203,7 @@ function cg(a,b,c){for(c=void 0===c?-1:c;c--&&b.length;){var d=b.pop();if(2>a.le f;break;case "!":case "|":e|=f;break;case "^!":e|=f;break;case "&&":e=e&&f?1:0;break;case "||":e=e||f?1:0;break;case ",,":e=bg(e,18,!0)*Math.pow(2,18)+bg(f,18,!0);break;case "_":case "^_":"^_"==d&&(f=35-(f&255));f&&(e=bg(e,0,!0),e=0=|>>>|>>|>|<=|<<|<|-|\+|\^\/|\/|\*|,,| )/);d=dg(a,b,0,b.length,a.A,c);void 0!==d&&e&&lg(a,null,d)}return d} function mg(a,b){var c,d=a.U[0],e=a.U[1];c="("==d||"{"==d||"["==d?"\\":"";for(var f="["==d?"\\":"",f=new RegExp(c+d+"([^"+f+d+f+e+"]+)"+c+e);c=b.match(f);){var g=kg(a,c[1]);if(void 0===g)return;b=b.replace(d+c[1]+e,null!=g?jg(a,g):"undefined")}if(a.fa.length)for(d=a.fa[0],e=a.fa[1],c="("==d||"{"==d||"["==d?"\\":"",f="["==d?"\\":"",f=new RegExp(c+d+"([^"+f+d+f+e+"]+)"+c+e);c=b.match(f);)b=b.replace("["+c[1]+"]","unimplemented");for(;d=b.match(/\$([a-z]+)/i);){e=null;switch(d[1].toLowerCase()){case "ops":e= a.S-a.ba}if(null==e)break;b=b.replace(d[0],e.toString())}return b}function fg(a,b){for(;b;){switch(b&3){case 1:a=-bg(a);break;case 2:a|=-1;break;case 3:for(var c=35;0<=c&&!(a&Math.pow(2,c));)c--;a=35-c}b>>>=2}return a} diff --git a/versions/pcx86/1.34.3/pcx86-dbg.js b/versions/pcx86/1.34.3/pcx86-dbg.js index cab14c2bd..8b35b9d77 100644 --- a/versions/pcx86/1.34.3/pcx86-dbg.js +++ b/versions/pcx86/1.34.3/pcx86-dbg.js @@ -721,7 +721,7 @@ function Xx(a,b,c){for(c=void 0===c?-1:c;c--&&b.length;){var d=b.pop();if(2>a.le f;break;case "!":case "|":e|=f;break;case "^!":e|=f;break;case "&&":e=e&&f?1:0;break;case "||":e=e||f?1:0;break;case ",,":e=Wx(e,18,!0)*Math.pow(2,18)+Wx(f,18,!0);break;case "_":case "^_":"^_"==d&&(f=35-(f&255));f&&(e=Wx(e,0,!0),e=0=|>>>|>>|>|<=|<<|<|-|\+|\^\/|\/|\*|,,| )/);d=Yx(a,b,0,b.length,a.D,c);void 0!==d&&e&&fy(a,null,d)}return d} function gy(a,b){var c,d=a.ha[0],e=a.ha[1];c="("==d||"{"==d||"["==d?"\\":"";for(var f="["==d?"\\":"",f=new RegExp(c+d+"([^"+f+d+f+e+"]+)"+c+e);c=b.match(f);){var g=ey(a,c[1]);if(void 0===g)return;b=b.replace(d+c[1]+e,null!=g?dy(a,g):"undefined")}if(a.Aa.length)for(d=a.Aa[0],e=a.Aa[1],c="("==d||"{"==d||"["==d?"\\":"",f="["==d?"\\":"",f=new RegExp(c+d+"([^"+f+d+f+e+"]+)"+c+e);c=b.match(f);)b=a.Pk(b,c[1]);for(;d=b.match(/\$([a-z]+)/i);){e=null;switch(d[1].toLowerCase()){case "ops":e=a.Z-a.la}if(null== e)break;b=b.replace(d[0],e.toString())}return b}function $x(a,b){for(;b;){switch(b&3){case 1:a=-Wx(a);break;case 2:a|=-1;break;case 3:for(var c=35;0<=c&&!(a&Math.pow(2,c));)c--;a=35-c}b>>>=2}return a} diff --git a/versions/pdpjs/1.34.3/pdp10-dbg.js b/versions/pdpjs/1.34.3/pdp10-dbg.js index d17d48927..bd1b949fb 100644 --- a/versions/pdpjs/1.34.3/pdp10-dbg.js +++ b/versions/pdpjs/1.34.3/pdp10-dbg.js @@ -81,7 +81,7 @@ function Ac(a,b){var c=a.b[(b&a.j)>>>a.i];a.w++;b=c.w(b&16383,b);a.w--;return b} m.Jb=function(a){if(!this.w)throw this.D&&Qb(this.D,4)&&Rb(this.D,"memory fault on "+L(this.D,a),!0,!0),this.v.Y(),-1;};function Gc(a,b,c){r("Memory block error ("+a+": "+n(b)+","+n(c)+")");return!1}var Hc=1,Jc=2;function Kc(a){t.call(this,"Device",a,256)}la(Kc,t);m=Kc.prototype;m.Ma=function(a,b,c,d){this.G=b;this.H=a;this.v=c;this.D=d;Db(this)};m.Ba=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};m.ra=function(a){return a?this.save():!0};m.reset=function(){}; m.save=function(){return(new G(this)).data()};m.restore=function(){return!0};$a(function(){for(var a=w(document,v,"device"),b=0;bb. 0;break;case "&":f=Qe(a,f,g);break;case "!":case "|":e=a;32>=e.L?f|=g:(f=X(e,f,0,!0),g=X(e,g,0,!0),f=(f/Re|0|g/Re|0)*Re+((f|g)>>>0));break;case "^!":f=Se(a,f,g);break;case "&&":f=f&&g?1:0;break;case "||":f=f||g?1:0;break;case ",,":f=X(a,f,18,!0)*Math.pow(2,18)+X(a,g,18,!0);break;case "_":case "^_":"^_"==e&&(g=35-(g&255));g&&(f=X(a,f,0,!0),f=0=|>>>|>>|>|<=|<<|<|-|\+|\^\/|\/|\*|,,| )/);d=Ue(a,b,0,b.length,a.U,c);void 0!==d&&e&&af(a,null,d)}return d} function We(a,b,c){for(;c;){switch(c&3){case 1:b=-X(a,b);break;case 2:b=Se(a,b,-1);break;case 3:for(var d=35;0<=d&&!Qe(a,b,Math.pow(2,d));)d--;b=35-d}c>>>=2}return b} function Ve(a,b,c,d,e){e=void 0===e?0:e;var f,g=Array.isArray(d)?d:void 0;if(null!=b){f=a.tb(b);if(0<=f)f=a.ub(f);else if(f=b,a.b[f]?f=a.b[f].value:(f=f.substr(0,6),f=a.b[f]&&a.b[f].value),null!=f){var h=a.b[b]&&a.b[b].Mb;h&&(g?g.push(h):(g=$e(a,h,d),void 0!==g?f+=g:(d||a.u("undefined "+(c||"value")+": "+b+" ("+h+")"),f=void 0)))}else f=oa(b,1Of&&(J="B");if(k==Pf[h]+J){f=29248!=g?F:(F&3)<<1|(F&12)<<2;f=(D|f<<6)*Zb;break}}if(0<=f)break}if(0<=f)break}!(0>f)||c&&c.match(/^[0-9A-Z$%.?]/i)|| (c=b+c,b="",f=0)}else c&&(f=g=0);if(0<=f&&c)for(k=c.split(","),2h||127h||15h||262143f&&!e&&a.u("unknown instruction: "+b+" "+c);return f}function ef(a){var b,c;a.i=["bp"];if(a.N)for(b=1;b>>d.i],!1)}a.N=["br"];if(a.K)for(b=1;b>>d.i],!0);a.K=["bw"];a.xa=0;a.pa=0} -m.Ra=function(a,b,c){var d=!0;c||Sf(this,a,b,!1,!0);if(a!=this.i){var e=hf(b);if(-1===e)this.u("invalid address: "+L(this,b.B,18)),d=!1;else{var f=this.G;f.b[e>>>f.i].Ra(e&16383,a==this.K)}}d&&(a.push(b),c?b.qa=!0:(Tf(this,a,a.length-1,"set"),ff(this)));return d};function Sf(a,b,c,d,e){var f=!1;c=hf(c);for(var g=1;g>>d.i],b==a.K));h.qa||ff(a);break}}return f} +m.Sa=function(a,b,c){var d=!0;c||Sf(this,a,b,!1,!0);if(a!=this.i){var e=hf(b);if(-1===e)this.u("invalid address: "+L(this,b.B,18)),d=!1;else{var f=this.G;f.b[e>>>f.i].Sa(e&16383,a==this.K)}}d&&(a.push(b),c?b.qa=!0:(Tf(this,a,a.length-1,"set"),ff(this)));return d};function Sf(a,b,c,d,e){var f=!1;c=hf(c);for(var g=1;g>>d.i],b==a.K));h.qa||ff(a);break}}return f} function Uf(a,b){for(var c=1;cd;d++){!d||d&3||(c+="\n");var e=a,f=wa(d,2);jf(e.Ia,d);f+="="+L(e,e.Na(e.Ia),36)+" ";c+=f}if(b){b="";for(d=0;d=wf?1:d==tf?23:18)+" "),b+=e;c+="\n"+b}return c}m.Gb=function(a,b){return a[0]>b[0]?1:a[0]h[0].indexOf("+"))){var l=h[0]+":";h[2]&&(l+=" "+h[2]);a.u(l)}h[3]&&(g=h[3],f=null);h=a.ha;l=b;h.B=l.B;h.eb=l.eb;h.qa=l.qa;h.U=l.U;a.u(Jf(a,b,g,f));e-=b.B-k;c++}} function Vf(a,b,c){var d=!0;try{b.length&&"end"!=b?c||a.u(Ff+b):(a.V&&(a.u("ended assemble at "+L(a,a.ha.B,18)),a.V=!1),b="");var e=b.charAt(0);if('"'==e||"'"==e)return!0;a.Z=null;if(Cb(a)&&0D||"z"sa.length&&(a.u("note: only "+sa.length+" available"),ga=sa.length);ka-=ga;0>ka&&(null==sa[sa.length-1].B?(ga=ka+ga,ka=0):ka+=sa.length);var Vd=[];"call"==gg&&(Fb=1E5,Vd=["CALL"]);for(void 0!==fg&&a.u(ga+" instructions earlier:");0=sa.length&&(ka=0);a.Ca=ga;ig++;Fb--}}ig||(a.u("no "+hg+"history available"), a.Ca=void 0)}else{var Qa=0,lg="ds"==lb,Hb=nf(a,ra,a.oa);Ga&&("l"==Ga.charAt(0)?(Ga=Ga.substr(1)||Zh,Qa=Ve(a,Ga)):Qa=nf(a,Ga).B-Hb.B,0>Qa&&(Qa=0),65536Ib?".":String.fromCharCode(Ib)),Mc=Mc-7}Ra&&(Ra+="\n");Ra=lg?Ra+(ta+","):Ra+(ra+": "+ta+(0>ng?" "+Yd:""))}Ra&&a.u(Ra);a.U=ai}}}break;case "e":if("else"==k[0])break;var og,pg,qg=k[0],$d=k[1];"e"==qg||"ew"==qg?(og=a.Na,pg=a.yb):$d=null;if(null==$d)a.u("edit memory commands:"),a.u("\tew [a] [...] edit words at address a");else for(var ae=nf(a,$d,a.oa),be=2;bede;){for(var Sa=null,fi=256;65536>Lb.B>>>0;){ee.B=a.Na(Lb,2);if(null==Lb.B||!fi--)break;if(!(ee.B&1)){for(var gi=a,Nc=ee,tg=null,Mb=Nc.B,ug=Mb,fe=1;6>=fe&&Mb;fe++){if(2Ag)a.u("step commands:"),a.u("\tp\tstep over instruction"),a.u("\tpr\tstep over instruction with register update");else if(a.O)a.u("step in progress");else{var Bg=Y(a.v.i);a.Na(Bg);a.O?(a.Ra(a.i,Bg,!0),Df(a)||(a.H&&ld(a.H),a.O=0)):Hg(a,Ag?"tr":"t")}break;case "r":if("reset"==b){a.H&&a.H.reset();break}Gf(a,k);break;case "s":a:switch(k[1]){case "base":if(k[2]){var ob=+k[2];if(2==ob||8==ob||10==ob||16==ob)a.U=ob;else{a.u("invalid base: "+ +k[0]){Gg(a,b.substr(5));break}var zg=k[0],Ag="p"==zg?0:"pr"==zg?1:-1;if("?"==k[1]||0>Ag)a.u("step commands:"),a.u("\tp\tstep over instruction"),a.u("\tpr\tstep over instruction with register update");else if(a.O)a.u("step in progress");else{var Bg=Y(a.v.i);a.Na(Bg);a.O?(a.Sa(a.i,Bg,!0),Df(a)||(a.H&&ld(a.H),a.O=0)):Hg(a,Ag?"tr":"t")}break;case "r":if("reset"==b){a.H&&a.H.reset();break}Gf(a,k);break;case "s":a:switch(k[1]){case "base":if(k[2]){var ob=+k[2];if(2==ob||8==ob||10==ob||16==ob)a.U=ob;else{a.u("invalid base: "+ ob);break}}a.u("default base: "+a.U);break;case "cs":var Ob;void 0!==k[3]&&(Ob=+k[3]);switch(k[2]){case "int":a.v.pa=Ob;break;case "start":a.v.Ia=Ob;break;case "stop":a.v.ua=Ob;break;default:a.u("unknown cs option");break a}void 0!==Ob&&dd(a.v);a.u("checksums "+(a.v.A.Ua?"enabled":"disabled"));break;case "sp":void 0!==k[2]&&(id(a.v,+k[2])||a.u("warning: using 1x multiplier, previous target not reached"));a.u("target speed: "+(a.v.ga.toFixed(2)+"Mhz")+" ("+a.v.ha+"x)");break;default:if(k[1]){a.u("unknown option: "+ k[1]);break}case "?":a.u("debugger options:"),a.u("\tbase #\t\tset default base to #"),a.u("\tcs int #\tset checksum cycle interval to #"),a.u("\tcs start #\tset checksum cycle start count to #"),a.u("\tcs stop #\tset checksum cycle stop count to #"),a.u("\tsp #\t\tset speed multiplier to #")}break;case "t":Hg(a,k[0],k[1]);break;case "u":Hf(a,k[1],k[2],8);break;case "v":if("var"==k[0]){Eg(a,b.substr(3))||(d=!1);break}if("ver"==k[0]){a.u((Sb||"PDP10")+" version 1.34.3 ("+a.v.mb+",RELEASE)");a.u(window? window.navigator.userAgent:"");break}f=!0;break;case "?":if(k[1]){Gg(a,b.substr(1));break}var ge="commands:",he;for(he in Jg)ge+="\n"+Da(he,9)+Jg[he];wd(a)||(ge+="\nnote: history disabled if no exec breakpoints");a.u(ge);break;default:f=!0}f&&(a.u("unknown command: "+b),d=!1)}}catch(Dg){a.u("Debugger "+(Dg.stack||Dg.message)),d=!1}return d}function gd(a,b,c){null!=b&&(a.Ha=Pe(a,b,c));for(;b=a.Ha.shift();)if(!Vf(a,b))return!1;return!0} @@ -239,33 +239,33 @@ var Jg={"?":"help/print","a [#]":"assemble","b [#]":"breakpoint",c:"clear output sf=0,tf=1,uf=2,vf=3,wf=4,xf=5,yf=6,zf=7,Af=8,Bf=9,rf="PC RA EA PS OV C0 C1 BI ND PD".split(" "),Kg={},Kf=(Kg[28672]={0:101},Kg[32704]={5632:64,5696:63,5760:58,5824:27,5888:28,5952:25,6016:29,6080:26,10240:56,10304:48,10368:46,10432:84,10496:57,10560:49,10624:47,10752:21,10816:22,10880:69,10944:70,11008:88,11072:85,11136:83,11264:91,11328:23,11392:24,11456:92,11520:86,11584:87,11648:89,11712:90},Kg[32512]={6144:65,6400:59,6656:66,6912:60,7168:67,7424:61,7680:68,7936:62,8192:17,8448:18,8704:19,8960:Of, 9216:53,9472:52,9728:55,9984:54,11776:50,12032:51,16384:30,16640:36,16896:37,17152:34,17408:38,17664:32,17920:44,18176:40,18432:39,18688:45,18944:33,19200:41,19456:35,19712:42,19968:43,20224:31,20480:1,20736:5,20992:2,21248:6,21504:3,21760:7,22016:4,22272:8,22528:9,22784:13,23040:10,23296:14,23552:11,23808:15,24064:12,24320:16},Kg[32256]={12288:71,12800:72,13312:73,13824:74,14336:75,14848:76,15360:77,15872:78},Kg[29248]={24576:79,24640:80,25088:81,25152:82},Kg[28700]={28672:93,28676:94,28680:95,28684:96, 28688:97,28692:98,28696:99,28700:100},Kg),Lf=["","I","M","S"],Mf=" L E LE A GE N G".split(" "),Nf="N NE NA NN Z ZE ZA ZN C CE CA CN O OE OA ON".split(" "),Qf=[{0:85,8:102,4:103,2:104,6:105,1:106},{0:88,4:107,2:108,10:109}],Cf=1E3,Ff=">> ";$a(function(){for(var a=w(document,v,"debugger"),b=0;bb.indexOf(":")&&0<=".MAC.KLM".indexOf(b.slice(-4).toUpperCase())&&(b+=".txt");Ja(b,null,!0,function(b,d,e){if(e)a.done&&a.done(e,b);else{e=d;if(Aa(b,".html")){e="";var c;for(b=/
([\s\S]*?)<\/pre>/gi;c=b.exec(d);)c=c[1],0<=c.indexOf("&")&&(c=c.replace(/</gi,"<").replace(/>/gi,">").replace(/&/gi,"&")),e+=c;(c=e.match(/&[a-z]+;/i))&&Og(a,"unrecognized HTML entity '"+c[0]+"'")}d=e.split(/(\r?\n)/);
-if(d.length&1){if(c=d.pop())Og(a,"unexpected line '"+c+"'"),d.push(c),d.push("")}else Og(a,"unexpected number of lines ("+d.length+")");a.D=a.D.concat(d);a.M[a.O]=d.length>>1;a.O++;setTimeout(function(){Ng(a)},0)}})}}
-function Mg(a){if(0<=a.W.indexOf("p"))a.u(a.D.join(""));else{var b=bf(a.b);Pg(a,"APR",0);Pg(a,"PI",4);try{for(var c=0;ca.W.indexOf("d")&&(a.b.b=b)}}
-function Rg(a,b,c,d,e){var f,g;null!=a.w&&(b=Wg(a,b));for(var h=!0,k="";h;){g=b.match(a.ha);if(!g||g[5]&&";"!=g[5].slice(0,1))return a.error("failed to parse line '"+b+"'"),!1;h=!1;k=g[2].toUpperCase();if(k==Xg||k==Yg)c=null;if(c){for(f=0;fF)break;var q=F+1,J=F+l.length,Lc="",qa="";F&&(Lc=b[F-1]).match(/[0-9A-Z$%.]/i)||!(J>=b.length)&&(qa=b[J]).match(/[0-9A-Z$%.]/i)||("'"==Lc&&F--,"'"==qa&&J++,
-b=b.substr(0,F)+p+b.substr(J),q=F+p.length,h=!0)}c=null}if(a.i&&(1==a.i&&(f=b.indexOf(a.C),0<=f?(a.i++,b=b.substr(f+1)):a.error("expected "+a.S+" definition in '"+b+"'")),1=I?a.X+=I:a.error("unrecognized BLOCK expression '"+k+"'");break;case lh:k=c;b=g=0;for(c=36;I=mh(a,k);){k=k.substr(I.length).trim();d=I;if(e=I.match(/^\((.*)\)\s*(.*)$/))e[1]&&(g=Ug(a,"^D"+e[1])),d=e[2];if(g){d=d?Ug(a,d):0;if(void 0===d||0>g||36c&&
-nh(a,b);break;case oh:(k=c)?(a.J=Ug(a,k),void 0===a.J&&a.error("unrecognized END expression '"+k+"'")):a.J=a.la;break;case ph:qh(a,c);break;case rh:Sg(a);break;case sh:a.X=Ug(a,c)||0;break;case th:Tg(a);break;case uh:qh(a,c.replace(",",",,"));break;case vh:case wh:case xh:case yh:case zh:case Ah:case Bh:case Ch:case Dh:case Eh:case Fh:case Gh:case Xg:case Yg:case Hh:case Ih:dh(a,k,g);break;case Jh:k=Kh(a,c);for(I=0;Id.Fa&&Z(a,d.ka);break;case Eh:0>=d.Fa&&Z(a,d.ka);break;case wh:case Fh:case xh:case Ch:d.Fa&&Z(a,d.ka);break;case Xg:case Yg:for(b=0;ba.Ea&&(a.Ea=a.X);a.X=0}function Vh(a){if(a.G.length){var b=a.G[a.G.length-1].name;b&&a.L.push({name:b,T:a.T,ea:a.ea});b=a.G.pop();a.T=b.T;a.ea=b.ea;a.X=b.X;a.Ea=b.Ea;a.G.length||-1==a.Ea||a.error("scope restore error")}else a.error("scope nesting error")}
+function Lg(a,b,c,d){a.la=b;a.W=(c||"").toLowerCase();a.done=d;a.R=0;a.H=[];a.N=[];a.D=[];a.v={};a.K={};a.M=[];a.L=[];a.T=[];a.ea=[];a.Z=[];a.ia=0;a.V=0;a.ga=0;a.X=a.la||0;a.Ea=-1;a.G=[];a.S=null;a.i=0;a.I=null;a.C=a.O="";a.ha=/^[ \t]*([A-Z$%.?][0-9A-Z$%.]*:|)[ \t]*([A-Z$%.][0-9A-Z$%.]*|)([ \t]*)([^;]+|)(;?[\s\S]*)/i;a.j=null;a.w=null;a.F="";a.J=null}
+function Cg(a,b,c,d,e){d&&0<=d.indexOf("s")?(Lg(a,c,d,e),a.D=b.split(/(\r?\n)/),a.N.push(a.D.length),Mg(a),a.done&&a.done(a.V)):(Lg(a,c,d,e),a.H=b.split(";"),Ng(a))}
+function Ng(a){if(a.R==a.H.length)Mg(a),a.done&&a.done(a.V);else{var b=a.H[a.R];a.u("loading "+ya(b));0>b.indexOf(":")&&0<=".MAC.KLM".indexOf(b.slice(-4).toUpperCase())&&(b+=".txt");Ja(b,null,!0,function(b,d,e){if(e)a.done&&a.done(e,b);else{e=d;if(Aa(b,".html")){e="";var c;for(b=/
([\s\S]*?)<\/pre>/gi;c=b.exec(d);)c=c[1],0<=c.indexOf("&")&&(c=c.replace(/</gi,"<").replace(/>/gi,">").replace(/&/gi,"&")),e+=c;(c=e.match(/&[a-z]+;/i))&&Og(a,"unrecognized HTML entity '"+c[0]+"'")}d=e.split(/(\r?\n)/);
+if(d.length&1){if(c=d.pop())Og(a,"unexpected line '"+c+"'"),d.push(c),d.push("")}else Og(a,"unexpected number of lines ("+d.length+")");a.D=a.D.concat(d);a.N[a.R]=d.length>>1;a.R++;setTimeout(function(){Ng(a)},0)}})}}
+function Mg(a){if(0<=a.W.indexOf("p"))a.u(a.D.join(""));else{var b=bf(a.b);Pg(a,"APR",0);Pg(a,"PI",4);try{for(var c=0;ca.W.indexOf("d")&&(a.b.b=b)}}
+function Rg(a,b,c,d,e){var f,g;null!=a.w&&(b=Wg(a,b));for(var h=!0,k="";h;){g=b.match(a.ha);if(!g||g[5]&&";"!=g[5].slice(0,1))return a.error("failed to parse line '"+b+"'"),!1;h=!1;k=g[2].toUpperCase();if(k==Xg||k==Yg)c=null;if(c){for(f=0;fF)break;var q=F+1,J=F+l.length,Lc="",qa="";F&&(Lc=b[F-1]).match(/[0-9A-Z$%.]/i)||!(J>=b.length)&&(qa=b[J]).match(/[0-9A-Z$%.]/i)||
+("'"==Lc&&F--,"'"==qa&&J++,b=b.substr(0,F)+p+b.substr(J),q=F+p.length,h=!0)}}c=null}if(a.i&&(1==a.i&&(f=b.indexOf(a.C),0<=f?(a.i++,b=b.substr(f+1)):a.error("expected "+a.S+" definition in '"+b+"'")),1=I?a.X+=I:a.error("unrecognized BLOCK expression '"+k+"'");break;case lh:k=c;b=g=0;for(c=36;I=mh(a,k);){k=k.substr(I.length).trim();d=I;if(e=I.match(/^\((.*)\)\s*(.*)$/))e[1]&&(g=Ug(a,"^D"+e[1])),d=e[2];if(g){d=d?Ug(a,d):0;if(void 0===d||0>g||36c&&nh(a,b);break;case oh:(k=c)?(a.J=Ug(a,k),void 0===a.J&&a.error("unrecognized END expression '"+k+"'")):a.J=a.la;break;case ph:qh(a,c);break;case rh:Sg(a);break;case sh:a.X=Ug(a,c)||0;break;case th:Tg(a);break;case uh:qh(a,c.replace(",",",,"));break;case vh:case wh:case xh:case yh:case zh:case Ah:case Bh:case Ch:case Dh:case Eh:case Fh:case Gh:case Xg:case Yg:case Hh:case Ih:dh(a,k,g);break;case Jh:k=Kh(a,c);for(I=0;Id.Fa&&Z(a,d.ka);break;case Eh:0>=d.Fa&&Z(a,d.ka);break;case wh:case Fh:case xh:case Ch:d.Fa&&Z(a,d.ka);break;case Xg:case Yg:for(b=0;ba.Ea&&(a.Ea=a.X);a.X=0}function Vh(a){if(a.G.length){var b=a.G[a.G.length-1].name;b&&a.M.push({name:b,T:a.T,ea:a.ea});b=a.G.pop();a.T=b.T;a.ea=b.ea;a.X=b.X;a.Ea=b.Ea;a.G.length||-1==a.Ea||a.error("scope restore error")}else a.error("scope nesting error")}
 function mh(a,b){var c;c=void 0===c?",":c;for(var d=0,e=!1,f=null,g=0;d"==h&&0>--g){a.error("missing bracket(s) in '"+b+"'");break}}}g?0f&&(g=g.replace(/\.([^0-9]|$)/g,L(a.b,d,-1)+"$1"),f=$e(a.b,g,c),void 0===f&&a.error("unable to parse expression '"+b+"'",e));return f}
-function ch(a,b){for(var c=0,d="",e=0,f=-1,g=b.length;e=--c){g=e;break}}0>c&&a.error("missing bracket(s) in '"+b+"'");0<=f&&(d=b.substr(f,g-f));return d}function Qg(a,b){b=void 0===b?a.ia:b;for(var c=0;b>a.M[c];)if(b-=a.M[c],c=--c){g=e;break}}0>c&&a.error("missing bracket(s) in '"+b+"'");0<=f&&(d=b.substr(f,g-f));return d}function Qg(a,b){b=void 0===b?a.ia:b;for(var c=0;b>a.N[c];)if(b-=a.N[c],cd?c="":(c=b.substr(d+1),b=b.substr(0,d),a.w=null);a.F+=b}if(null==a.w){var d=b=0,e,f,g=a.F.length;a.S==ih&&g++;for(var h=0;h=k&&(k-=32),k=k+32&63);d+=k*Math.pow(2,f);f-=e;b++;0>f&&(nh(a,d),b=0)}b&&nh(a,d)}return c}
-function dh(a,b,c){var d,e,f,g,h,k;a.C="<";a.N=">";g=h=k=[];if(b==vh){e=c.match(/([A-Z$%.][0-9A-Z$%.]*)\s*(\([^)]*\)|)\s*,?\s*(<|)([\s\S]*)/i);if(!e)return a.error("unrecognized "+b+" in '"+c+"'"),c;f=e[1];if(e[2]&&","!=e[2]){h=g=Kh(a,e[2],!0);b=[];for(c=0;c");0>l&&(l=h[c].length);b[c]=h[c].substr(d,l-d);h[c]=h[c].substr(0,d)}h=b}d=Xh;b=3}else if(b==Hh){a.C="[";a.N="]";e=c.match(/([A-Z$%.][0-9A-Z$%.]*)\s*(\[)([\s\S]*)/i);if(!e)return a.error("unrecognized "+
-b+" in '"+c+"'"),c;f=e[1];d=Th;b=2}else if(b==eh)a.C="[",a.N="]",f="?"+xa(++a.ga,5),a.v[f]&&a.error("literal symbol '"+f+"' redefined"),e=[c[0],c.substr(1)],d=Yh,b=0;else if(b==Xg||b==Yg){a.j||a.error(b+" outside of macro");e=c.match(/([A-Z$%.][0-9A-Z$%.]*)\s*,\s*(<|)([\s\S]*)/i);if(!e)return a.error("unrecognized "+b+" operands '"+c+"'"),c;for(d=0;d");0>l&&(l=h[c].length);b[c]=h[c].substr(d,l-d);h[c]=h[c].substr(0,d)}h=b}d=Xh;b=3}else if(b==Hh){a.C="[";a.O="]";e=c.match(/([A-Z$%.][0-9A-Z$%.]*)\s*(\[)([\s\S]*)/i);if(!e)return a.error("unrecognized "+
+b+" in '"+c+"'"),c;f=e[1];d=Th;b=2}else if(b==eh)a.C="[",a.O="]",f="?"+xa(++a.ga,5),a.v[f]&&a.error("literal symbol '"+f+"' redefined"),e=[c[0],c.substr(1)],d=Yh,b=0;else if(b==Xg||b==Yg){a.j||a.error(b+" outside of macro");e=c.match(/([A-Z$%.][0-9A-Z$%.]*)\s*,\s*(<|)([\s\S]*)/i);if(!e)return a.error("unrecognized "+b+" operands '"+c+"'"),c;for(d=0;d=C)&&Og(a,"truncated value "+wa(b)+" at location "+wa(c)+" to "+wa(d));return d}ag.prototype.error=function(a,b){throw Error("error in "+Qg(this,b)+": "+a);};
+function Sg(a){for(var b=a.X,c={},d=0;d=C)&&Og(a,"truncated value "+wa(b)+" at location "+wa(c)+" to "+wa(d));return d}ag.prototype.error=function(a,b){throw Error("error in "+Qg(this,b)+": "+a);};
 function Og(a,b){a.u("warning in "+Qg(a,void 0)+": "+b)}ag.prototype.u=function(a){this.b?this.b.u(a):console.log(a)};
 var $g=1,ah=2,bh=4,hh="ASCII",ih="ASCIZ",kh="BLOCK",lh="BYTE",vh="DEFINE",oh="END",ph="EXP",wh="IF1",xh="IFDEF",yh="IFDIF",zh="IFE",Ah="IFG",Bh="IFGE",Ch="IFIDN",Dh="IFL",Eh="IFLE",Fh="IFN",Gh="IFNDEF",Xg="IRP",Yg="IRPC",Lh="LALL",rh="LIT",eh="LITERAL",Mh="LIST",sh="LOC",Nh="NOSYM",Hh="OPDEF",Oh="PAGE",Jh="PURGE",Ih="REPEAT",jh="SIXBIT",Ph="SUBTTL",Qh="TITLE",th="VAR",Rh="XALL",uh="XWD",Sh="XLIST",Xh=-1,Th=-2,Yh=-3,Wh=-4;
 function ji(a,b,c){t.call(this,"Computer",a,33554432);this.A.ba=!1;this.R=null;ki(this,b);this.N=bd(this,"autoPower",a,6);this.w=0;this.W=+a.busWidth||+a.buswidth;this.L=this.F=this.M=null;this.K=this.V=!1;this.I=this.C=null;this.S=this.O=!1;this.Z=bd(this,"url")||"";(Math.random()+.1).toString(36);this.i=li(this);if(this.v=tb("CPU",this.id)){this.D=tb("Debugger",this.id);this.G=new Bc({id:this.bb+".bus",busWidth:this.W},this.v,this.D);var d,e=rb(this.id);if((this.j=tb("Panel",this.id))&&this.j.za)for(b=
diff --git a/versions/pdpjs/1.34.3/pdp11-dbg.js b/versions/pdpjs/1.34.3/pdp11-dbg.js
index 9942d51af..4fa8d4bdc 100644
--- a/versions/pdpjs/1.34.3/pdp11-dbg.js
+++ b/versions/pdpjs/1.34.3/pdp11-dbg.js
@@ -295,7 +295,7 @@ function Aj(a,b,c){for(c=void 0===c?-1:c;c--&&b.length;){var d=b.pop();if(2>a.le
 f;break;case "!":case "|":e|=f;break;case "^!":e|=f;break;case "&&":e=e&&f?1:0;break;case "||":e=e||f?1:0;break;case ",,":e=zj(e,18,!0)*Math.pow(2,18)+zj(f,18,!0);break;case "_":case "^_":"^_"==d&&(f=35-(f&255));f&&(e=zj(e,0,!0),e=0=|>>>|>>|>|<=|<<|<|-|\+|\^\/|\/|\*|,,| )/);d=Bj(a,b,0,b.length,a.W,c);void 0!==d&&e&&Ij(a,null,d)}return d}
 function Dj(a,b){for(;b;){switch(b&3){case 1:a=-zj(a);break;case 2:a|=-1;break;case 3:for(var c=35;0<=c&&!(a&Math.pow(2,c));)c--;a=35-c}b>>>=2}return a}
 function Cj(a,b,c,d,e){e=void 0===e?0:e;var f,g=Array.isArray(d)?d:void 0;if(null!=b){f=a.re(b);if(0<=f)f=a.Bd(f);else if(f=b,a.i[f]?f=a.i[f].value:(f=f.substr(0,6),f=a.i[f]&&a.i[f].value),null!=f){var k=a.i[b]&&a.i[b].ih;k&&(g?g.push(k):(g=Hj(a,k,d),void 0!==g?f+=g:(d||a.v("undefined "+(c||"value")+": "+b+" ("+k+")"),f=void 0)))}else f=ma(b,1