=lineCount){b="unknown address label at line "+convert(m);break}}if(y<0||0==(2056&c)||y>31&&0==(8&c)){b="bad parameter at line "+convert(m)+" "+s[m];break}f+=A<<12,f+=27262976==(267386880&f)?(y<<7)+L:(L<<16)+y+33554432}}}}else if(0==(1&c)){b="parameters needed at line "+convert(m)+" "+s[m];break}setAddress(4*m,f),++m}if(b){for(var B=0;B<=m;++B)setAddress(4*B,0);message(b),showError(addrToLine[m])}else message("RUN/STEP your program, SELECT, LOAD or edit program")}}function convert(e){return lineAddress?addrToLine[e]:e}function showError(e){var t;if(0==e)r=0,t=0;else if(lineAddress){var n="";e<100&&(n=" "),e<10&&(n=" ");var r=programHTML.indexOf("
"+n+e+" ",0)}else for(r=0;--e>=0&&!((r=programHTML.indexOf("
",r+6))<0););if(r<0)alert("unable to indicate error location");else{t=r+6;var s=programHTML.indexOf("
",t);text("program",programHTML=s<0?programHTML.substring(0,t)+''+programHTML.substring(t)+"":programHTML.substring(0,t)+''+programHTML.substring(t,s)+""+programHTML.substring(s),21,52,12,"black","onclick","openProgram(this)",monospace)}}function regDecode(e){if(2==e.length&&("R"==e[0]||"r"==e[0])&&(t=e[1]-"0")>=0&&t<10)return t;if(3==e.length&&("R"==e[0]||"r"==e[0])&&"1"==e[1]){var t=e[2]-"0";if(t>=0&&t<3)return t+10}return isNaN(e)?20:21}function checkImm(e){var t=parseInt(e);if(isNaN(t)||t<0)return-1;if(0==(4294967040&t))return 255&t;for(var n=0;++n<16;){var r=t>>30&3;if(t<<=2,0==(4294967040&(t|=r)))return(255&t)+(n<<8)}return-1}function decodeImm(e){var t=e>>8&15;for(e&=255;t>0;){var n=3&e;e=e>>2&1073741823,e|=n<<30,--t}return e}function updatePC(e){for(;e<0;)e+=4294967296;for(;e>799;)e-=800;pCounter=e,0==byteOpt&&(e/=4),updateRDisplay(13,e)}function openPC(e){waitingForInput||myTimeout||myTimeout1||myTimeout2||(message("Modifying Program Counter contents"),e.innerHTML='',document.getElementById("PCForm").focus(),document.getElementById("PCForm").setAttribute("onblur","losePC(this)"),waitingForInput=!0)}function PCSubmit(){if(waitingForInput){var e=document.getElementById("PCForm");if(e.removeAttribute("onblur"),isNaN(e.value)||""==e.value)alert("Bad input - must be a number");else if("0"==e.value[0]&&e.value.length>1&&e.value[1]>"9"&&"x"!=e.value[1]&&"X"!=e.value[1])alert("Bad input - only denary and hex allowed");else{var t=parseInt(e.value);isNaN(t)||t>799||t<0||0==byteOpt&&t>199?alert("Bad input - number out of range for PC"):(0==byteOpt&&(t*=4),updatePC(t),updatePCmarker(t),waitingForInput=!1,message(""==programText?"SELECT a program, LOAD a file or alter memory or program":"ASSEMBLE, RUN/STEP or alter memory or program"))}}else alert("Bad input - not waiting for input")}function losePC(e){waitingForInput&&(isNaN(e.value)||""==e.value?(document.getElementById("PCForm").removeAttribute("onblur"),updatePC(pCounter),waitingForInput=!1,message(""==programText?"SELECT a program, LOAD a file or alter memory or program":"ASSEMBLE, RUN/STEP or alter memory or program")):PCSubmit())}function memX(e){return 3==memOpt?e%5*270:e%5*86}function updatePCmarker(e){(e=Math.floor(e/4))!=oldPCMarker&&(document.getElementById("a"+oldPCMarker).style.background="white"),document.getElementById("a"+e).style.background="pink",oldPCMarker=e}function updateR(e,t){if(e>=0&&e<13){for(;t<0;)t+=4294967296;for(;t>4294967295;)t-=4294967296;register[e]=t,updateRDisplay(e,t)}}function updateRDisplay(e,t){e>=0&&e<14&&(0==memOpt&&t>2147483647?t=(t=4294967296-t)<10?" -"+t:t<100?" -"+t:t<1e3?" -"+t:t<1e4?" -"+t:t<1e5?" -"+t:t<1e6?" -"+t:t<1e7?" -"+t:t<1e8?" -"+t:t<1e9?" -"+t:"-"+t:memOpt<2?(t<10?t=" "+t:t<100?t=" "+t:t<1e3?t=" "+t:t<1e4?t=" "+t:t<1e5?t=" "+t:t<1e6?t=" "+t:t<1e7?t=" "+t:t<1e8?t=" "+t:t<1e9&&(t=" "+t),t=" "+t):t=" x"+spacedHex(t),13==e?text("pc",t,300,261-16*e,samsung?13:14,"black","onclick","openPC(this)"):text("R"+e,t,300,261-16*e,samsung?13:14,"black"))}function spacedHex(e){var t=0,n=e;for(e=hex[e%16];++t<8;)n%16==15?(1==t&&(e="f"),(n=Math.floor(n/16))%16!=15&&(e=''+e),e=hex[n%16]+e):e=(n=Math.floor(n/16))%16==15?"f"+e:hex[n%16]+e;return n%16==15&&(e=''+e),e}function setMAR(e){savMAR=e,0==byteOpt&&(e/=4),text("mar",' 0
'+Math.floor(e/100)%10+"
"+Math.floor(e/10)%10+"
"+e%10+"
",485,178,14,"black")}function setMBR(e){var t=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];text("mbr",' '+t[e>>28&15]+"
"+t[e>>24&15]+"
"+t[e>>20&15]+"
"+t[e>>16&15]+"
"+t[e>>12&15]+"
"+t[e>>8&15]+"
"+t[e>>4&15]+"
"+t[e%16]+"
",486,290,14,"black")}function updateFlags(e){flags=15&e;var t=0!=(8&e)?"1":"0";t+=" "+(0!=(4&e)?"1":"0"),t+=" "+(0!=(2&e)?"1":"0"),text("flags",t+=" "+(0!=(1&e)?"1":"0"),365,414,samsung?13:14,"black"),document.getElementById("flags").style.paddingLeft="2px"}function instruction(e){for(var t=0;t<24&&e!=instructions[t];++t);return t<21?t:21==t?5:22==t?7:23==t?6:200}function openAddress(e){if(!waitingForInput&&!(myTimeout||myTimeout1||myTimeout2)){message("Modifying memory contents");var t=3==memOpt?"246":"90";e.innerHTML='',document.getElementById("aForm").focus(),document.getElementById("aForm").setAttribute("onblur","loseAddress(this)"),waitingForInput=!0,savOpenAddress=e}}function checkInput(e){if(!waitingForInput)return!1;if(3==memOpt&&(e=e.replace(" ","")),isNaN(e)||""==e)return!1;if(3==memOpt)for(var t=0;t"1")return!1;++t}else if("0"==e[0]&&e.length>1&&e[1]>"9"&&"x"!=e[1]&&"X"!=e[1])return!1;var n=3==memOpt?parseInt(e,2):parseInt(e);return!(isNaN(n)||n>4294967295||n<-2147483648)}function addressSubmit(){if(waitingForInput){var e=document.getElementById("aForm").value;if(3==memOpt&&(e=e.replace(" ","")),isNaN(e)||""==e)alert("Bad input - must be a number");else{if(3==memOpt)for(n=0;n"1")return void alert("Bad input - invalid binary number");++n}else if("0"==e[0]&&e.length>1&&e[1]>"9"&&"x"!=e[1]&&"X"!=e[1])return void alert("Bad input - only denary and hex allowed");var t=3==memOpt?parseInt(e,2):parseInt(e);if(isNaN(t)||t>4294967295||t<-2147483648)alert("Bad input - number out of range");else{document.getElementById("aForm").removeAttribute("onblur");var n=parseInt(savOpenAddress.id[1]);savOpenAddress.id.length>=3&&(n=10*n+parseInt(savOpenAddress.id[2])),4==savOpenAddress.id.length&&(n=10*n+parseInt(savOpenAddress.id[3])),setAddress(4*n,t),waitingForInput=!1,savOpenAddress=!1,message(""==programText?"SELECT a program, LOAD a file or alter memory or program":"ASSEMBLE, RUN/STEP or alter memory or program")}}}else alert("Bad input - not waiting for input")}function loseAddress(e){if(waitingForInput)if(checkInput(e.value))addressSubmit();else{document.getElementById("aForm").removeAttribute("onblur");var t=parseInt(savOpenAddress.id[1]);savOpenAddress.id.length>=3&&(t=10*t+parseInt(savOpenAddress.id[2])),4==savOpenAddress.id.length&&(t=10*t+parseInt(savOpenAddress.id[3])),setAddress(4*t,address[t]),waitingForInput=!1,savOpenAddress=!1,message("BAD input ignored")}}function setAddress(e,t){if(isNaN(t))alert("attempt to store NaN at "+e);else if(e<0||e>=800)alert("store at bad address "+e);else{for(e=Math.floor(e/4);t<0;)t+=4294967296;for(;t>4294967295;)t-=4294967296;if(address[e]=t,0==memOpt&&t>2147483647)t=(t=4294967296-t)<10?" -"+t:t<100?" -"+t:t<1e3?" -"+t:t<1e4?" -"+t:t<1e5?" -"+t:t<1e6?" -"+t:t<1e7?" -"+t:t<1e8?" -"+t:t<1e9?" -"+t:"-"+t;else if(memOpt<2)t<10?t=" "+t:t<100?t=" "+t:t<1e3?t=" "+t:t<1e4?t=" "+t:t<1e5?t=" "+t:t<1e6?t=" "+t:t<1e7?t=" "+t:t<1e8?t=" "+t:t<1e9&&(t=" "+t),t=" "+t;else if(3==memOpt){for(var n=" ",r=0;r<32;++r)n+=t< ");t=n+""}else t=" x"+(t=spacedHex(t));text("a"+e,t,568+memX(e),74+15*Math.floor(e/5),samsung?13:14,"black","onclick","openAddress(this)")}}function getMode(e){return e<0&&(e+=4294967296),2==memOpt?"x"+spacedHex(e):(e>2147483647&&1!=memOpt&&(e-=4294967296),String(e))}function step3(){oneStep=!0,run2()}function run(){oneStep=!1,run2()}function run2(){waitingForInput||(button("run","STOP",115,610,"stop()"),button("step","<<",164,610,"slower()"),button("gt",">>",192,610,"faster()"),stopping=!1,speed=defaultSpeed,noKeyEffects=!0,document.getElementById("xxbody").focus(),doSpeed(),runContinue())}function slower(){speed>225||(speed>=50?speed+=25:speed>=15?speed+=5:++speed,doSpeed())}function doSpeed(){running=!0;var e=(250-speed)/10;s2T=3,valW=1,speed<=100?text("speed","SPEED "+e,224,616,12,"blue"):(text("speed","SPEED "+e,224,616,12,"blue"),e<5&&(valW=runRate<4.5?8:runRate<12?6:4),4==e&&(s2T=2),e<=3&&(s2T=1),2==e&&(valW*=2),1==e&&(valW*=4),0==e&&(valW*=8))}function faster(){speed<=100&&step2Busy||(speed>=75?speed-=25:speed>=20?speed-=5:speed>1&&--speed,doSpeed())}function runContinuex(){step2Busy?myTimeout=delay(speed,"runContinuex"):speed<125||stopping?runContinue():(message(stepTxt),myTimeout=delay((4*speed+1e3)/(s2T+1),"runContinue"))}function runContinuey(){step2Busy?myTimeout=delay(25,"runContinuey"):(button("run","RUN",115,610,"run()"),button("step","STEP",170,610,"step3()"),remove("gt"),remove("speed"),running=!1,noKeyEffects=!1,message(halted),myTimeout=!1)}function runContinuez(){waitingForInput?myTimeout=delay(speed,"runContinuez"):(message(stepTxt),myTimeout=delay(speed,"runContinue"))}function runContinue(){myTimeout=!1;for(var e=1;;++e){if(stopping&&0==twoCycles)return button("run","RUN",115,610,"run()"),button("step","STEP",170,610,"step3()"),remove("gt"),remove("speed"),running=!1,noKeyEffects=!1,void message(oneStep?stepTxt:"Program stopped. RUN or STEP to continue, RESET to abort.");if(oneStep&&(stopping=!0),speed>100){var t=address[Math.floor(pCounter/4)];return execErr=!1,step2(),4009754624==t||execErr?void(myTimeout=delay(25,"runContinuey")):void(myTimeout=delay(speed,"runContinuex"))}if(4009754624!=address[Math.floor(pCounter/4)]||1==twoCycles){if(step1())return button("run","RUN",115,610,"run()"),button("step","STEP",170,610,"step3()"),remove("gt"),remove("speed"),running=!1,void(noKeyEffects=!1);if(waitingForInput)myTimeout=delay(speed,"runContinuez");else{if(message(stepTxt),speed<11){if(e<11-speed)continue;return void(myTimeout=delay(0,"runContinue"))}myTimeout=delay(4*(speed-10),"runContinue")}}else step1(),button("run","RUN",115,610,"run()"),button("step","STEP",170,610,"step3()"),remove("gt"),remove("speed"),running=!1,noKeyEffects=!1,message(halted);break}}function stop(){stopping=!0,step2Busy&&(s2T?(s2T=0,text("speed","Press STOP again to complete instruction",80,706,12,"red")):doSpeed())}function stop2(){myTimeout&&clearTimeout(myTimeout),myTimeout=!1,myTimeout1&&clearTimeout(myTimeout1),myTimeout1=!1,myTimeout2&&clearTimeout(myTimeout2),myTimeout2=!1,button("run","RUN",115,610,"run()"),button("step","STEP",170,610,"step3()"),remove("gt"),remove("speed"),running=!1,noKeyEffects=!1,remove("au"),remove("red1"),remove("red2"),remove("blue1"),remove("blue2"),step2Busy=!1,twoCycles=0}function reset1(){stop2(),updateR(0,0),updateR(1,0),updateR(2,0),updateR(3,0),updateR(4,0),updateR(5,0),updateR(6,0),updateR(7,0),updateR(8,0),updateR(9,0),updateR(10,0),updateR(11,0),updateR(12,0),updatePC(0),updatePCmarker(0),updateFlags(0),output="",output1="",text("output","",395,558,12,"black");for(var e=0;e<1023;++e)remove("pix"+e);if(videoMem.length=0,lastKey=0,text("ir","",337,290,samsung?14:16,"black"),remove("cu"),savOpenAddress){var t=parseInt(savOpenAddress.id[1]);savOpenAddress.id.length>=3&&(t=10*t+parseInt(savOpenAddress.id[2])),4==savOpenAddress.id.length&&(t=10*t+parseInt(savOpenAddress.id[3])),t>399&&(t=0),setAddress(t,address[Math.floor(t/4)]),waitingForInput=!1,savOpenAddress=!1}modifyingProgram&&(modifyingProgram=!1,textToHtml(),waitingForInput=!1),waitingForInput&&(waitingForInput=!1),remove("inpxx"),text("input","",270,560,16,"black"),message("Reset done, edit & ASSEMBLE, RUN/STEP or alter memory")}function step1(){if(waitingForInput)return 0;twoCycles&&(pCounter-=4),inst=address[Math.floor(pCounter/4)],setMAR(pCounter),setMBR(inst),text("ir"," "+spacedHex(inst),337,290,samsung?14:16,"black"),document.getElementById("ir").style.paddingTop="0",updatePC(pCounter+4),updatePCmarker(pCounter);var e;for(e=0;e<23&&(inst&IMask[e])!=(4294967295&IValue[e]);++e);var t=INmame[e],n="",r=100,s=100,a=NaN,o=1e4,i="";switch(IDecode[e]){case 0:break;case 1:n="Rd,dev",o=15&inst,(r=inst>>12&15)>12&&(i="bad parameter");break;case 2:if(o=4095&inst,r=inst>>12&15,15==(s=inst>>16&15))n="Rd,<label>",0!=(8388608&inst)?o+=pCounter+4:o=pCounter+4-o;else if(s<13){n="Rd,[Rn+<label>]";var u=byteOpt?1:4;0!=(8388608&inst)?o+=register[s]*u:o=register[s]*u-o}else i="bad parameter";if(r>12&&(i="bad parameter"),o>=1024&&o<4096)break;if((o<0||o>799)&&(i="bad address"),0==twoCycles)return++twoCycles,text("cu",t,352,319,12,"white"),stepTxt="Doing instruction "+t+" "+n,0;twoCycles=0;break;case 3:r=inst>>12&15,0!=(33554432&inst)?(n="Rd,#imm",a=decodeImm(4095&inst)):(n="Rd,Rm",(15&inst)<13?a=register[15&inst]:i="bad parameter"),r>12&&(i="bad parameter");break;case 4:s=inst>>16&15,0!=(33554432&inst)?(n="Rn,#imm",a=decodeImm(4095&inst)):(n="Rn,Rm",(15&inst)<13?a=register[15&inst]:i="bad parameter"),s>12&&(i="bad parameter");break;case 5:r=inst>>12&15,s=15&inst,0!=(16&inst)?(n="Rd,Rn,Rm",(inst>>8&15)<13?a=register[inst>>8&15]:i="bad parameter"):(n="Rd,Rn,#imm5",a=inst>>7&31),(r>12||s>12)&&(i="bad parameter");break;case 6:n="<label>",0!=(8388608&(o=16777215&inst))&&(o-=16777216),((o=4*o+pCounter+4)<0||o>799)&&(i="bad address");break;case 7:r=inst>>12&15,s=inst>>16&15,0!=(33554432&inst)?(n="Rd,Rn,#imm",a=decodeImm(4095&inst)):(n="Rd,Rn,Rm",(15&inst)<13?a=register[15&inst]:i="bad parameter"),(r>12||s>12)&&(i="bad parameter");break;case 8:n="Rd,#imm",a=67108863&inst,(r=inst>>28&15)>12&&(i="bad parameter")}if(text("cu",t,352,319,12,"white"),""!=i)return message("Error: "+i+" at address "+(Math.floor(pCounter/4)-1)+" line "+convert(Math.floor(pCounter/4)-1)),1;switch(e){case 1:updatePC(o),updatePCmarker(o);break;case 2:0!=(4&flags)?(updatePC(o),updatePCmarker(o)):n+=" Branch not taken";break;case 3:0==(4&flags)?(updatePC(o),updatePCmarker(o)):n+=" Branch not taken";break;case 4:8==(9&flags)||1==(9&flags)?(updatePC(o),updatePCmarker(o)):n+=" Branch not taken";break;case 5:0!=(4&flags)||9!=(9&flags)&&0!=(9&flags)?n+=" Branch not taken":(updatePC(o),updatePCmarker(o));break;case 6:var p=register[s];a>0&&(p=p>>1&2147483647,--a),a>0&&(p>>=a),updateR(r,p);break;case 7:updateR(r,register[s]<>31&1;0!=d&&(l|=8);var m=register[s]>>31&1,b=-a>>31&1;0==m?1==b&&0==d&&(l|=2):1!=b&&0!=d||(l|=2),m+b!=1&&m!=d&&(l|=1),updateFlags(l);break;case 14:if(o>=1024&&o<4096){void 0===videoMem[g=o-1024>>2]?updateR(r,16777215):updateR(r,videoMem[g]);break}updateR(r,address[Math.floor(o/4)]),setMAR(o),setMBR(address[Math.floor(o/4)]);break;case 15:if(o>=1024&&o<4096){var g=o-1024>>2&1023,c=16777215®ister[r];videoMem[g]=c,16777215==c?remove("pix"+g):rectangle("pix"+g,397+4*(31&g),560+4*(g>>5),4,4,"#"+hex[c>>20&15]+hex[c>>16&15]+hex[c>>12&15]+hex[c>>8&15]+hex[c>>4&15]+hex[c%16]);break}setAddress(o,register[r]),setMAR(o),setMBR(register[r]);break;case 16:updateR(r,register[s]+a);break;case 17:updateR(r,register[s]-a);break;case 18:updateR(r,register[s]&a);break;case 19:updateR(r,register[s]|a);break;case 20:updateR(r,register[s]^a);break;default:return message("Bad instruction at address "+Math.floor(pCounter/4-1)+" Line "+convert(Math.floor(pCounter/4)-1)),1}return stepTxt="Done instruction "+t+" "+n,0}function outputNum(e,t){if(8==t)for(;;){if(e<0||e>199)return;if(0==(255&(n=address[e])))return;if(outputNum(255&n,7),0==(65280&n))return;if(outputNum(n>>8&255,7),0==(16711680&n))return;if(outputNum(n>>16&255,7),0==(4278190080&n))return;outputNum(n>>24&255,7),++e}switch(7!=t&&output1.length>0&&" "!=output1[output1.length-1]&&(output1+=" ",output+=" "),t){case 4:e>2147483647?(output1+="-"+(e=4294967296-e)+" ",output+="-"+e+" "):(output1+=e+" ",output+=e+" ");break;case 5:output1+=e+" ",output+=e+" ";break;case 6:output1+="0x",output+="0x",0!=(4026531840&e)&&(output1+=hex[e>>28&15],output+=hex[e>>28&15]),0!=(4278190080&e)&&(output1+=hex[e>>24&15],output+=hex[e>>24&15]),0!=(4293918720&e)&&(output1+=hex[e>>20&15],output+=hex[e>>20&15]),0!=(4294901760&e)&&(output1+=hex[e>>16&15],output+=hex[e>>16&15]),0!=(4294963200&e)&&(output1+=hex[e>>12&15],output+=hex[e>>12&15]),0!=(4294967040&e)&&(output1+=hex[e>>8&15],output+=hex[e>>8&15]),0!=(4294967280&e)&&(output1+=hex[e>>4&15],output+=hex[e>>4&15]),output1+=hex[e%16]+" ",output+=hex[e%16]+" ";break;case 7:var n=String.fromCharCode(e);10==e?(output1+="\n",output+="
"):"<"==n?(output1+=n,output+="<"):">"==n?(output1+=n,output+=">"):"&"==n?(output1+=n,output+="&"):e>31&&(output1+=n,output+=n);for(var r=output1.length;--r>=0&&" "!=output1[r]&&"\n"!=output1[r];);output1.length-r>11&&(output1+="\n",output+="
")}for(var s=0,a=0,o=0,i=0,u=0;a=output1.length&&o+s>12&&++i,s=0,++i}if(i>5){for(output1=output1.substring(u),a=0,s=0;s"!=output[a];)++a;++a}"<"==(output=output.substring(a))[0]&&(output=output.substring(6))}text("output",output,395,558,14,"black","","",monospace)}function step2(){if(!waitingForInput&&!step2Busy){step2Busy=!0,remove("cu"),message("FETCH CYCLE - get current instruction and add 1 to PC");var e=0==byteOpt?Math.floor(pCounter/4):pCounter;redX=350,redY=49,image("red1",e<100?"red.gif":"red3.gif",redX,redY,"PC"),text("red2",e,redX+4,redY+4,14,"black"),myTimeout1=delay(valW,"step2a1")}}function moveRed(e,t,n){return redX==e&&redY==t||(e>redX?e-redX>s2T?redX+=s2T:redX=e:es2T?redX-=s2T:redX=e),t>redY?t-redY>s2T?redY+=s2T:redY=t:ts2T?redY-=s2T:redY=t),dmove("red1",redX,redY,"red2",redX+4,redY+4),myTimeout1=delay(valW,n),!1)}function moveBlue(e,t,n){return blueX==e&&blueY==t||(e>blueX?e-blueX>s2T?blueX+=s2T:blueX=e:es2T?blueX-=s2T:blueX=e),t>blueY?t-blueY>s2T?blueY+=s2T:blueY=t:ts2T?blueY-=s2T:blueY=t),dmove("blue1",blueX,blueY,"blue2",blueX+4,blueY+4),myTimeout2=delay(valW,n),!1)}function step2a1(){moveRed(350,158,"step2a1")&&step2a2()}function step2a2(){moveRed(443,158,"step2a2")&&(blueVal=0==byteOpt?Math.floor(pCounter/4):pCounter,blueX=redX,blueY=redY+5,image("blue1",blueVal<100?"red.gif":"red3.gif",blueX,blueY,"PC"),text("blue2",blueVal,blueX+4,blueY+4,samsung?13:14,"black"),inst=0,myTimeout2=delay(valW,"step2e"),step2b())}function step2b(){moveRed(443,50,"step2b")&&(button("au","+1",450,53,""),text("red2","+1",redX+4,redY+4,14,"black"),myTimeout1=delay(400/(s2T+1),"step2c"))}function step2c(){var e=0==byteOpt?Math.floor((pCounter+4)/4):pCounter+4;image("red1",e<100?"blue.gif":"blue3.gif",redX,redY,"PC"),text("red2",e,redX+4,redY+4,14,"black"),step2d()}function step2d(){redX<440&&remove("au"),moveRed(355,50,"step2d")&&(myTimeout1=!1,updatePC(pCounter+4),remove("red1"),remove("red2"))}function step2e(){moveBlue(443,195,"step2e")&&step2e0()}function step2e0(){moveBlue(480,195,"step2e0")&&(step2e1(),setMAR(0==byteOpt?4*blueVal:blueVal))}function step2e1(){moveBlue(541,195,"step2e1")&&step2e2()}function step2e2(){var e=0==byteOpt?blueVal:Math.floor(blueVal/4);moveBlue(541,e=72+15*Math.floor(e/5),"step2e2")&&step2f()}function step2f(){var e=0==byteOpt?blueVal:Math.floor(blueVal/4),t=600+memX(e),n=72+15*Math.floor(e/5);if(moveBlue(t,n,"step2f")){var r=getMode(savRes=address[e]);t-=3*(r.length>40?9:r.length)-3,blueX=t,image("blue1",getBlueS(r.length),t,n,"PC"),text("blue2",r,t+4,n+4,samsung?13:14,"black"),myTimeout2=delay(2*valW,"step2g")}}function step2g(){var e=0==byteOpt?blueVal:Math.floor(blueVal/4);moveBlue(541,e=72+15*Math.floor(e/5),"step2g")&&step2g1()}function step2g1(){moveBlue(541,324,"step2g1")&&step2g1a()}function step2g1a(){moveBlue(480,324,"step2g1a")&&(setMBR(savRes),step2g2())}function step2g2(){moveBlue(443,324,"step2g2")&&(inst?14==bFlg&&stepALUb8():(updatePCmarker(pCounter),step2h()))}function step2h(){moveBlue(443,290,"step2h")&&step2h1()}function step2h1(){moveBlue(350,290,"step2h1")&&(message("FETCH done, decoding instruction"),inst=savRes,remove("blue1"),remove("blue2"),text("ir"," "+spacedHex(inst),337,290,samsung?14:16,"black"),document.getElementById("ir").style.paddingTop="0",myTimeout2=delay(600/(s2T+1),"step2i"))}function getBlueS(e){return e<0&&(e=0),e>40&&(e=9),e>12&&(e=12),savBLen=e,getBlue[e]}function startALU(e,t,n,r,s,a,o){if(ALUop=r,savRes=4294967295&s,ALUflg=o,ALUdst=a,e>=0){redX=345;redY=261-16*e,e<13?i=getMode(register[e]):(i=getMode(byteOpt?pCounter:Math.floor(pCounter/4)),redY=53),image("red1",getBlueS(i.length),redX,redY,"PC"),text("red2",i,redX+4,redY+4,samsung?13:14,"black"),busABusy=1,myTimeout1=delay(valW,"stepALUa1")}if(t>15)blueX=370,blueY=312,bFlg=t,blueVal=n,image("blue1",getBlueS((i=getMode(n)).length),blueX,blueY,"IMM"),text("blue2",i,blueX+4,blueY+4,samsung?13:14,"black"),myTimeout2=delay(valW,"stepALUb0");else if(t>=0){blueX=360;var i;blueY=261-16*t,t<13?i=getMode(register[t]):(blueY=53,i=getMode(byteOpt?pCounter:Math.floor(pCounter/4))),image("blue1",getBlueS(i.length),blueX,blueY,"PC"),text("blue2",i,blueX+4,blueY+4,samsung?13:14,"black"),myTimeout2=delay(valW,"stepALUb1")}}function startReg(e,t,n){ALUop=0,ALUdst=n,savRes=t,ALUflg=-1,blueX=360,blueY=230-16*e,n<400&&(t%=400);var r;r=e<8?getMode(t):String(t),n>=400?image("blue1",getBlueS(r.length),blueX,blueY,"DATA"):image("blue1",t<100?"red.gif":"red3.gif",blueX,blueY,"ADDR"),text("blue2",r,blueX+4,blueY+4,samsung?13:14,"black"),myTimeout2=delay(valW,"stepRega")}function startIMM(e,t){ALUop=0,savRes=t,ALUflg=-1,ALUdst=e,blueX=370,blueY=312;var n;n=e<8?getMode(t):String(t),e>99?(image("blue1",t<100?"red.gif":"red3.gif",blueX,blueY,"ADD"),bFlg=e,blueVal=t,ALUdst-=100,savRes=address[t]):(image("blue1",getBlueS(n.length),blueX,blueY,"IMM"),bFlg=222),text("blue2",n,blueX+4,blueY+4,samsung?13:14,"black"),myTimeout2=delay(valW,"stepALUb0")}function startTR(e,t,n){ALUop=0,savRes=n,ALUflg=-1,ALUdst=t,blueX=350,blueY=e>10?278:230-16*e;var r;(r=e<8&&t<8?getMode(n):String(n)).length>3&&(blueX=334),image("blue1",getBlueS(r.length),blueX,blueY,"IMM"),text("blue2",r,blueX+4,blueY+4,samsung?13:14,"black"),myTimeout2=delay(5*valW,"stepALUb10")}function setWrite(e,t,n,r){writeAdd=e,writeDat=t,writeReg=n,writeMode=r,writeDataOnB=!1}function startINP(e,t,n){var r,s=String(e);ALUdst=t,savRes=e,10==n?(button("au","RND",290,495,""),blueX=338,blueY=482,r="stepALUb6"):(blueX=311,blueY=560,r="step2r"),image("blue1",getBlueS(s.length),blueX,blueY,"INPUT"),text("blue2",s,blueX+4,blueY+4,samsung?13:14,"black"),myTimeout2=delay(5*valW,r)}function stepRega(){moveBlue(350,154,"stepRega")&&stepRegb()}function stepRegb(){moveBlue(443,154,"stepRegb")&&(200==ALUdst?step2n():ALUdst>=400?step2t():ALUdst>99&&ALUdst<110?(blueVal=savRes,bFlg=14,ALUdst-=100,savRes=address[savRes],step2e()):(ALUdst<12||301==ALUdst)&&(redX=blueX,redY=blueY,image("red1",savRes<100?"red.gif":"red3.gif",redX,redY,"SP"),text("red2",savRes,blueX+4,blueY+4,14,"black"),myTimeout1=delay(valW,"stepRegc"),301==ALUdst?bFlg=301:(blueVal=savRes,bFlg=14,savRes=address[savRes]),step2e()))}function stepRegc(){moveRed(443,68,"stepRegc")&&(301==ALUdst?button("au","+"+maskCnt,430,68,""):button("au","+1",430,68,""),text("red2","+",redX+4,redY+4,14,"black"),myTimeout1=delay(400/(s2T+1),"stepRegd"))}function stepRegd(){301==ALUdst?(image("red1",blueVal+maskCnt<100?"blue.gif":"blue3.gif",redX,redY,"SP"),text("red2",blueVal+maskCnt,redX+4,redY+4,14,"black")):(image("red1",blueVal<99?"blue.gif":"blue3.gif",redX,redY,"SP"),text("red2",blueVal+1,redX+4,redY+4,14,"black")),stepRege()}function stepRege(){redX<440&&remove("au"),moveRed(350,68,"stepRege")&&stepRegf()}function stepRegf(){moveRed(350,102,"stepRegf")&&(remove("red1"),remove("red2"),myTimeout1=!1)}function step2n(){if(writeMode){if(blueY>220&&!moveBlue(443,220,"step2n"))return;redX=blueX,redY=blueY,image("red1",writeAdd<100?"red.gif":"red3.gif",redX,redY,"ADDR"),text("red2",writeAdd,redX+4,redY+4,14,"black"),myTimeout1=delay(valW,"step2n1")}else step2p();step2o()}function step2n1(){moveRed(443,220,"step2n1")&&step2n2()}function step2n2(){moveRed(350,220,"step2n2")&&step2n3()}function step2n3(){moveRed(350,102,"step2n3")&&(2==writeMode&&maskCnt>1?(remove("red1"),remove("red2")):step2p())}function step2nx0(){if(moveBlue(443,550,"step2nx0")){var e=blueVal-256&1023,t=getMode(savRes=void 0===videoMem[e]?16777215:videoMem[e]);image("blue1",getBlueS(t.length),blueX,blueY,"DATA"),text("blue2",t,blueX+4,blueY+4,samsung?13:14,"black"),myTimeout2=delay(2*valW,"stepALUb8")}}function step2o(){400==ALUdst?moveBlue(443,550,"step2o")&&(myTimeout2=!1):moveBlue(443,195,"step2o")&&step2o0()}function step2o0(){moveBlue(480,195,"step2o0")&&(setMAR(writeAdd),step2o1())}function step2o1(){moveBlue(541,195,"step2o1")&&step2o1a()}function step2o1a(){writeAdd>=380?moveBlue(541,357,"step2o1a")&&(writeDataOnB?step2o2():myTimeout2=delay(valW,"step2o1a")):writeAdd<=160?!writeDataOnB||redY>=240?myTimeout2=delay(valW,"step2o1a"):step2o2():moveBlue(541,72+15*Math.floor(writeAdd/20),"step2o1a")&&(writeDataOnB?step2o2():myTimeout2=delay(valW,"step2o1a"))}function step2o2(){moveBlue(541,72+15*Math.floor(writeAdd/20),"step2o2")&&step2o3()}function step2o3(){moveBlue(600+memX(writeAdd/4),72+15*Math.floor(writeAdd/20),"step2o3")&&(myTimeout2=!1)}function step2ox1(){moveRed(443,158,"step2ox1")&&step2ox2()}function step2ox2(){if(moveRed(443,550,"step2ox2")){var e=writeAdd-1024>>2&1023;videoMem[e]=16777215&writeDat,16777215==(16777215&writeDat)?remove("pix"+e):rectangle("pix"+e,397+4*(31&e),560+4*(e>>5),4,4,"#"+hex[writeDat>>20&15]+hex[writeDat>>16&15]+hex[writeDat>>12&15]+hex[writeDat>>8&15]+hex[writeDat>>4&15]+hex[writeDat%16]),remove("red1"),remove("red2"),remove("blue1"),remove("blue2"),myTimeout1=!1,step2Busy=!1}}function step2p(){redX=360,redY=15==writeReg?53:261-16*writeReg;var e=getMode(writeDat);image("red1",getBlueS(e.length),redX,redY,"DATA"),text("red2",e,redX+4,redY+4,14,"black"),myTimeout1=delay(valW,"step2p1")}function step2p1(){moveRed(360,158,"step2p1")&&(400==ALUdst?step2ox1():step2p2())}function step2p2(){redX>420-5*savBLen&&195!=blueY?myTimeout1=delay(valW,"step2p2"):moveRed(443,158,"step2p2")&&step2p3()}function step2p3(){moveRed(443,324,"step2p3")&&step2p4()}function step2p4(){moveRed(480,324,"step2p4")&&(setMBR(writeDat),writeDataOnB=!0,step2p4a())}function step2p4a(){moveRed(541,324,"step2p4a")&&step2p5()}function step2p5(){moveRed(541,72+15*Math.floor(writeAdd/20),"step2p5")&&step2p6()}function step2p6(){if(writeAdd%20!=0&&blueX<600+5*savBLen)myTimeout1=delay(valW,"step2p6");else{var e=600+memX(writeAdd/4);writeAdd%20!=0&&savBLen>5&&(e-=5*savBLen),moveRed(e,72+15*Math.floor(writeAdd/20),"step2p6")&&(setAddress(writeAdd,writeDat),remove("red1"),remove("red2"),remove("blue1"),remove("blue2"),myTimeout1=!1,step2Busy=!1)}}function stepALUa1(){moveRed(325,253,"stepALUa1")&&stepALUa2()}function stepALUa2(){moveRed(286,253,"stepALUa2")&&stepALUa3()}function stepALUa3(){moveRed(286,430,"stepALUa3")&&(busABusy=2)}function stepALUb0(){moveBlue(370,318,"stepALUb0")&&stepALUb0a()}function stepALUb0a(){moveBlue(443,318,"stepALUb0a")&&(16==bFlg?stepALUb3():222==bFlg?stepALUb8():200==bFlg?step2n():bFlg>99&&bFlg<116&&(bFlg=14,step2e()))}function stepALUb1(){moveBlue(360,158,"stepALUb1")&&stepALUb2()}function stepALUb2(){moveBlue(443,158,"stepALUb2")&&stepALUb3()}function stepALUb3(){moveBlue(443,430,"stepALUb3")&&stepALUb4()}function stepALUb4(){moveBlue(388,430,"stepALUb4")&&(1==busABusy?myTimeout2=delay(valW,"stepALUb4"):stepALUb5())}function stepALUb5(){if(button("au",ALUop,290,495,""),2==busABusy&&dmove("red1",redX+=s2T,redY+=s2T,"red2",redX+4,redY+4),moveBlue(338,482,"stepALUb5")){busABusy&&(remove("red1"),remove("red2"),busABusy=0);var e;if(e=ALUdst<13?getMode(savRes):15==ALUdst?getMode(byteOpt?savRes:Math.floor(savRes/4)):String(savRes),ALUdst>99){var t=savRes;savRes>=256&&(t=savRes-256&1023,e=String(t)),image("blue1",t<100?"red.gif":"red3.gif",blueX,blueY,"AD")}else image("blue1",getBlueS(e.length),blueX,blueY,"DT");text("blue2",e,blueX+4,blueY+4,samsung?13:14,"black"),ALUflg>=0&&updateFlags(ALUflg),myTimeout2=-1==ALUdst?delay(5*valW,"stepALUb5a"):delay(valW,"stepALUb6")}}function stepALUb5a(){remove("blue1"),remove("blue2"),myTimeout2=!1,step2Busy=!1}function stepALUb6(){moveBlue(388,489,"stepALUb6")&&(remove("au"),stepALUb7())}function stepALUb7(){moveBlue(443,489,"stepALUb7")&&(ALUdst<16?stepALUb8():ALUdst>=200?step2n():ALUdst>99&&(blueVal=savRes,bFlg=14,ALUdst-=100,savRes>=256?step2nx0():(savRes=address[savRes],step2e())))}function stepALUb8(){moveBlue(443,222,"stepALUb8")&&stepALUb9()}function stepALUb9(){moveBlue(350,222,"stepALUb9")&&stepALUb10()}function stepALUb10(){var e=261-16*ALUdst;15==ALUdst&&(e=53),moveBlue(blueX,e,"stepALUb10")&&(ALUdst<13?updateR(ALUdst,4294967295&savRes):15==ALUdst&&(updatePC(savRes),updatePCmarker(savRes)),remove("blue1"),remove("blue2"),myTimeout2=!1,step2Busy=!1)}function step2l(){blueX<388?myTimeout1=delay(valW,"step2l"):moveRed(388,489,"step2l")&&step2l1()}function step2l1(){blueX<443?myTimeout1=delay(valW,"step2l1"):moveRed(443,489,"step2l1")&&step2l2()}function step2l2(){moveRed(443,220,"step2l2")&&step2l3()}function step2l3(){moveRed(350,220,"step2l3")&&step2l4()}function step2l4(){moveRed(350,230-16*(ALUdst+1),"step2l4")&&(updateR(ALUdst+1,savRes>>16&4294967295),remove("red1"),remove("red2"),myTimeout1=!1,step2Busy=!1)}function step2i(){if(0!=s2T){myTimeout2=!1;var e;for(e=0;e<23&&(inst&IMask[e])!=(4294967295&IValue[e]);++e);var t=INmame[e],n="",r=100,s=100,a=NaN,o=1e4,i=1e4,u="",p=-1;switch(IDecode[e]){case 0:break;case 1:n="Rd,dev",o=15&inst,(r=inst>>12&15)>12&&(u="bad parameter");break;case 2:i=4095&inst,r=inst>>12&15,s=inst>>16&15;var l=byteOpt?1:4,d=5-l;15==s?(n="Rd,<label>",0!=(8388608&inst)?(p="+"+d+"+",o=i+pCounter+4):(p="+"+d+"-",o=pCounter+4-i)):s<13?(n="Rd,[Rn+<label>]",0!=(8388608&inst)?(p="+",o=i+register[s]*l):(p="-",o=register[s]*l-i)):u="bad parameter",r>12&&(u="bad parameter"),(o<0||o>799&&o<1024||o>=4096)&&(u="bad address"),o=Math.floor(o/l),i=Math.floor(i/l);break;case 3:r=inst>>12&15,0!=(33554432&inst)?(n="Rd,#imm",a=decodeImm(4095&inst),p=16):(n="Rd,Rm",p=15&inst,(15&inst)<13?a=register[15&inst]:u="bad parameter"),r>12&&(u="bad parameter");break;case 4:s=inst>>16&15,0!=(33554432&inst)?(n="Rn,#imm",p=16,a=decodeImm(4095&inst)):(n="Rn,Rm",p=15&inst,(15&inst)<13?a=register[15&inst]:u="bad parameter"),s>12&&(u="bad parameter");break;case 5:r=inst>>12&15,s=15&inst,0!=(16&inst)?(n="Rd,Rn,Rm",p=inst>>8&15,(inst>>8&15)<13?a=register[inst>>8&15]:u="bad parameter"):(n="Rd,Rn,#imm5",p=16,a=inst>>7&31),(r>12||s>12)&&(u="bad parameter");break;case 6:n="<label>",0!=(8388608&(i=16777215&inst))&&(i-=16777216),((o=4*i+pCounter+4)<0||o>799)&&(u="bad address");break;case 7:r=inst>>12&15,s=inst>>16&15,0!=(33554432&inst)?(n="Rd,Rn,#imm",p=16,a=decodeImm(4095&inst)):(n="Rd,Rn,Rm",p=15&inst,(15&inst)<13?a=register[15&inst]:u="bad parameter"),(r>12||s>12)&&(u="bad parameter");break;case 8:n="Rd,#imm",p=16,a=67108863&inst,(r=inst>>28&15)>12&&(u="bad parameter")}if(text("cu",t,352,319,12,"white"),e>=22&&""==u&&(u="Bad instruction"),""==u){switch(e){case 1:startALU(15,16,i,"+"+(byteOpt?4:1)+"+",o,15,-1);break;case 2:0!=(4&flags)?startALU(15,16,i,"+"+(byteOpt?4:1)+"+",o,15,-1):(n+=" Branch not taken",step2Busy=!1);break;case 3:0==(4&flags)?startALU(15,16,i,"+"+(byteOpt?4:1)+"+",o,15,-1):(n+=" Branch not taken",step2Busy=!1);break;case 4:8==(9&flags)||1==(9&flags)?startALU(15,16,i,"+"+(byteOpt?4:1)+"+",o,15,-1):(n+=" Branch not taken",step2Busy=!1);break;case 5:0!=(4&flags)||9!=(9&flags)&&0!=(9&flags)?(n+=" Branch not taken",step2Busy=!1):startALU(15,16,i,"+"+(byteOpt?4:1)+"+",o,15,-1);break;case 6:var m=register[s];a>0&&(m=m>>1&2147483647,--a),a>0&&(m>>=a),startALU(s,p,a,t,m,r,-1);break;case 7:startALU(s,p,a,t,register[s]<>31&1;0!=g&&(b|=8);var c=register[s]>>31&1,f=-a>>31&1;0==c?1==f&&0==g&&(b|=2):1!=f&&0!=g||(b|=2),c+f!=1&&c!=g&&(b|=1),startALU(s,p,a,t,0,-1,b);break;case 14:startALU(s,16,i,p,o,100+r,-1);break;case 15:if(o>=256){setWrite(byteOpt?o:4*o,register[r],r,0),startALU(s,16,i,p,o,400,-1);break}setWrite(byteOpt?o:4*o,register[r],r,0),startALU(s,16,i,p,o,200,-1);break;case 16:startALU(s,p,a,t,register[s]+a,r,-1);break;case 17:startALU(s,p,a,t,register[s]-a,r,-1);break;case 18:startALU(s,p,a,t,register[s]&a,r,-1);break;case 19:startALU(s,p,a,t,register[s]|a,r,-1);break;case 20:startALU(s,p,a,t,register[s]^a,r,-1)}inst&&message("Doing instruction "+t+" "+n),stepTxt="Done instruction "+t+" "+n}else message("Error: "+u+" at address "+(Math.floor(pCounter/4)-1)+" line "+convert(Math.floor(pCounter/4)-1))}else myTimeout2=delay(200,"step2i")}function step2r(){moveBlue(311,523,"step2r")&&step2s()}function step2s(){moveBlue(443,523,"step2s")&&stepALUb8()}function step2t(){moveBlue(443,550,"step2t")&&(outputNum(savRes,ALUdst-400),remove("blue1"),remove("blue2"),myTimeout2=!1,step2Busy=!1)}function step2z(){myTimeout1=!1,step2Busy=!1}function inputSubmit(){var e=document.getElementById("iForm");if(e)if(waitingForInput)if(isNaN(e.value)||""==e.value)alert("Bad input - must be a number");else if("0"==e.value[0]&&e.value.length>1&&e.value[1]>"9"&&"x"!=e.value[1]&&"X"!=e.value[1])alert("Bad input - only denary and hex allowed");else{var t=parseInt(e.value);if(t>4294967295||t<-2147483648)alert("Bad input - number out of range");else{if(remove("inpxx"),text("input",''+t+"
",270,560,14,"black"),noKeyEffects=!0,message("INPUT value loaded into register "+registerToInput),inst){ALUdst=registerToInput,savRes=t,ALUop="",blueX=311,blueY=560;var n=getMode(t);image("blue1",getBlueS(n.length),blueX,blueY,"INPUT"),text("blue2",n,blueX+4,blueY+4,samsung?13:14,"black"),myTimeout2=delay(valW,"step2r")}else updateR(registerToInput,t);waitingForInput=!1}}else alert("Bad input - not waiting for input");else alert("Bad inputSubmit call")}function startIt(){getDimensions(),main()}function getDimensions(){"number"==typeof window.innerWidth?(maxWidth=window.innerWidth,maxHeight=window.innerHeight):(maxWidth=document.documentElement.clientWidth,maxHeight=document.documentElement.clientHeight)}function rectangle(e,t,n,r,s,a,o,i){t=Math.floor(t+.49),n=Math.floor(n+.49),(t<0||n<0||r<=0||s<=0||r>maxWidth-10||s>maxHeight-10)&&console.log("rectangle - warning - not on screen");var u=document.getElementById(e);if(u){if("DIV"!=u.nodeName)return void console.log("rectangle - name already in use for non-rectangle/text")}else(u=document.createElement("div")).id=e,document.body.appendChild(u);u.style.position="absolute",u.style.left=t+"px",u.style.top=n+"px",u.style.width=r+"px",u.style.height=s+"px",u.style.backgroundColor=a,o&&(u.style.border=1==i?"thin solid "+o:2==i?"thick solid "+o:"medium solid "+o)}function text(e,t,n,r,s,a,o,i,u){n=Math.floor(n+.49),r=Math.floor(r+.49),(n<0||r<0||n>maxWidth-10||r>maxHeight-10)&&console.log("text - warning - not on screen");var p=document.getElementById(e);if(p){if("DIV"!=p.nodeName)return void console.log("text - name already in use for non-rectangle/text")}else(p=document.createElement("div")).id=e,document.body.appendChild(p);p.style.position="absolute",p.style.left=n+"px",p.style.top=r+"px",p.style.color=a,p.style.fontSize=s+"px",u&&(p.style.fontFamily=u),o&&p.setAttribute(o,i),p.innerHTML=t}function move(e,t,n){t=Math.floor(t+.49),n=Math.floor(n+.49),(t<0||n<0||t>maxWidth-10||n>maxHeight-10)&&console.log("move - warning - not on screen");var r=document.getElementById(e);r?(r.style.position="absolute",r.style.left=t+"px",r.style.top=n+"px"):console.log("move- name "+e+" does not exist")}function dmove(e,t,n,r,s,a){t=Math.floor(t+.49),n=Math.floor(n+.49),s=Math.floor(s+.49),a=Math.floor(a+.49),(t<0||n<0||t>maxWidth-10||n>maxHeight-10)&&console.log("dmove - warning - not on screen"),(s<0||a<0||s>maxWidth-10||a>maxHeight-10)&&console.log("dmove - warning - not on screen");var o=document.getElementById(e);if(o){var i=document.getElementById(r);i?(o.style.position="absolute",i.style.position="absolute",o.style.left=t+"px",i.style.left=s+"px",o.style.top=n+"px",i.style.top=a+"px"):console.log("dmove - name "+r+" does not exist")}else console.log("dmove - name "+e+" does not exist")}function remove(e){var t=document.getElementById(e);t&&document.body.removeChild(t)}function randomInt(e,t){return Math.floor(Math.random()*(t-e+1)+e)}function button(e,t,n,r,s){text(e,'",n,r,12,"black")}function image(e,t,n,r,s){n=Math.floor(n+.49),r=Math.floor(r+.49),(n<0||r<0||n>maxWidth-10||r>maxHeight-10)&&console.log("image - warning - not on screen");var a=document.getElementById(e);if(a){if("IMG"!=a.nodeName)return void console.log("image- name already in use for non-image")}else(a=document.createElement("img")).id=e,document.body.appendChild(a);a.style.position="absolute",a.style.left=n+"px",a.style.top=r+"px",a.src=t,a.alt=s}function imageOrder(e,t){var n=document.getElementById(e);n?n.style.zIndex=t:console.log("imageOrder - name "+e+" does not exist")}function getMilliseconds(){return(new Date).getTime()}function delay(e,t){for(var n=t+"(",r=2;r2&&(n+=","),n+=arguments[r];return n+=")",setTimeout(n,e)}function trapKey(e,t,n){var r=chrsToMatch.indexOf(e);-1==r&&(r=chrsToMatch.push(e)-1,chrsDown[r]=0),dnFnCall[r]=t,upFnCall[r]=n}function keyDown(e){var t=e.keyCode;if(8==t){var n,r=e.srcElement||e.target;switch(r.tagName.toUpperCase()){case"TEXTAREA":n=r.readOnly||r.disabled;break;case"INPUT":n=r.readOnly||r.disabled||r.attributes.type&&["radio","checkbox","submit","button"].indexOf(r.attributes.type.value.toLowerCase())>=0;break;case"DIV":n=r.readOnly||r.disabled||!(r.attributes.contentEditable&&"true"==r.attributes.contentEditable.value);break;default:n=!0}n&&e.preventDefault()}var s=String.fromCharCode(t);27!=t&&9!=t||(s=t);var a=chrsToMatch.indexOf(s);-1==a?(lastKey=t,noKeyEffects&&e.preventDefault()):(chrsDown[a]=1,dnFnCall[a]&&window[dnFnCall[a]](e))}function keyUp(e){var t=e.keyCode,n=String.fromCharCode(t);27!=t&&9!=t||(n=t);var r=chrsToMatch.indexOf(n);-1!=r&&1==chrsDown[r]&&(chrsDown[r]=0,upFnCall[r]&&window[upFnCall[r]](e))}var myTimeout=!1,myTimeout1=!1,myTimeout2=!1,register=[],flags=0,pCounter=0,programText="",programHTML="",programEdit="",output="",output1="",address=[],instructionTxt=[],addrToLine=[],videoMem=[],speed,defaultSpeed=175,inst,addr,waitingForInput=!1,registerToInput=0,modifyingProgram=!1,s2T=1,stopping,runRate,valW=5,oneStep,monospace='"Courier New Bold",courier,monospace',running=!1,submit,oldPCMarker=0,memOpt=0,byteOpt=0,execErr=!1,stepTxt="",twoCycles=0,savMAR=0,lineAddress=!1,lineCount=0,samsung=!1,hex=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];halted="Program HALTED. RESET, LOAD, SELECT or alter memory";var holdI,program=[];program[1]="\tINP R0,2\n\tINP R1,2\n\tADD R2,R1,R0\n\tOUT R2,4\n\tHALT\n// Output the sum of two numbers\n",program[2]="\tINP R0,2\n\tINP R1,2\n\tCMP R1,R0\n\tBGT HIGHER\n\tOUT R0,4\n\tB DONE\nHIGHER:\n\tOUT R1,4\nDONE:\n\tHALT\n// Input two numbers and output the higher\n\t",program[4]="\tMOV R2,#100\n\tLDR R3,L101\n\tADD R2,R2,R3\n\tLSL R3,R2,#1\n\tHALT\n\t0\n\t0\n\t0\n\t0\nL100:\t23\nL101:\t10\nL102:\t62\nL103:\t18\n",program[5]="MOV R2,#32\nLOOP:\nOUT R2,7\nADD R2,R2,#1\nCMP R2,#127\nBLT LOOP\nMOV R2,#10\nOUT R2,7\nHALT\n// Output all the ASCII print characters\n",program[3]="MOV R4,#250\nMOV R3,#200\nADD R4,R4,#255\nSUB R3,R3,#100\nCMP R3,#100\nX1:\nBNE X1\nBEQ X2\nB X1\nX2:\nADD R5,R4,R3 // 605 0x25D @line 8\nSUB R6,R5,R3 // 505 0x1F9\nX3:\nBNE X3 // test that SUB sets flags or not\nMOV R0,#0xFF\nLSR R7,R5,#4 // 37 0x25\nAND R1,R7,R3 // 0x24\nAND R1,R1,#4 // 4\nEOR R1,R1,#0x35 // 0x31\nORR R0,R1,R7 //0x35 @line16\nAND R0, R0, #32 // test extra spaces\nCMP R0, #33\nX4:\nBEQ X4\nCMP R5, R6\nX5:\nBLT X5\nBGT X6\nB X5\nX6:\nAND R2,R0,R1 //0x20 @line24\nCMP R2,#32\nX7:\nBNE X7\nEOR R4, R5, R1 //0x26C\nLSR R1,R1,#2 // 12 0xC\nLSL R7, R4, R1 // 0x26C000\nADD R7,R7,#15 // 0x26C00F\nLSL R7,R7,#10 // 0x9B003C00\nMOV R9,#960 // 0x3C0 @line32 0x20\nCMP R9,R7 // in ARM LT and GT are signed\nX8:\nBLT X8\nBEQ X8\nBGT X9\nB X8\nX9:\nMVN R10,#157 // NOT 0x9D 0xFFFFFF62\nLSL R11,R10,#28 // 0x20000000\nAND R10,R10,R11 // 0x20000000 @line 40 0x28\nADD R11,R10,R9 // 0x200003C0\nCMP R7,R11\nXA:\nBGT XA\nBEQ XA\nB XE\nXB:\n MVN R10,#157 // used as a data location\nXC:\n0\nXD:\nBGT XG // @line 48 0x30\nB XD\nXE:\nLDR R4,XB // 0xe3e0a09d\nLDR R5,XC // expect to be zero\nMVN R3,R11 // 0xdffffc3f\nSTR R3,XBA\nCMP R5,R4\nBNE XD // testing odd order execution/backward branches\nXF:\nB XF\nXBA:\n0 // so can re-run code\nXG:\n MOV R2,R3 // @line 58 0x3a\nORR R2,R2,#0x300 // test if hex input allowed\nMOV R1,#8\nLSR R1,R2,R1 // test can overwrite op2 reg as well as last instruction type 0x00DFFFFF\nADD R0,R1,R2 // 0xE0DFFF3E\nLDR R10,XBA // @line 63 0x3F\nADD R0,R0,R10 // 0xC0DFFB7D \nMOV R5,#0xC00\nADD R5,R5,#0xD // #0xC0D was invalid\nLSL R5,R5,#8\nADD R5,R5,#255\nLSL R5,R5,#12\nEOR R0,R0,R5 // 0xb7d\nMOV R12,#0xB00\nADD R12,R12,#0x7D\nCMP R0,R12 // #0xB7D invalid\nXH:\nBNE XH\nmov r0,#200 // test extended immediate values\nmov r1,#400 // and higher registers\nmov r2,#0xf000\nmov r3,#0xf0000003\nmov r4,#2\norr r12,r3,#0xff00 // @line 80\neor r11,r12,#0x3d000000 // 0xcd00ff03\nsub r10,r11,#0xf000\nadd r9,r10,#13 // 0xcd000f10\nsub r8,r9,#0xf10\ncmp r8,#0xcd000000\nxi:\nbne xi\nmov r5,#0 // test indirect extensions\nmov r6,#40\nmov r7,#4\nldr r8,[r7+XV] // 1 in word mode 4 in byte mode\nxj:\nldr r4,[r6] // copy a section of code\nstr r4,[r5+XX]\nadd r5,r5,r8\nadd r6,r6,r8\ncmp r5,#40 // copies 10 words in byte\nblt xj // mode or 40 in word mode\nmov r5,#20\t// check reverse way\nldr r4,[r5+XX]\nadd r6,r8,r8\nadd r6,r6,#1\nlsl r6,r6,#6 // get 192 or 576\nstr r4,[r6]\nadd r7,r8,r8\t// 2 or 8\nldr r5,X5\nldr r3,[r7+19] // test word offset\ncmp r5,r3\nxk:\n bne xk\nstr r5,[r7+192]\nHALT\nHALT // PC at 110 or 440 when halted\n// if loops then an error\nXV:\n0\n4\n0x100\n0\n1\nXX:\n0\n// the above program tries to do something sensible with every mode of every instruction\n// try to avoid R0 because you can get the shift wrong and not detect it\n// Tested INP and OUT elsewhere\n",program[6]="// new i/o features - suggest use def fast\nmov r1,#0 // colour black\n// video memory is 256 to 1023\nstr r1,256 // top left\nstr r1,287 // top right\nstr r1,992 // bottom left\nstr r1,1023 // bottom right\ninp r2,8 // get a random pattern\nstr r2,623\ninp r2,8\nstr r2,624 // put in centre\ninp r0,5 // clear any current characters\nmov r3,#type\nout r3,8 // write a text string\nwait:\ninp r0,4 // read a character\ncmp r0,#83\nbne wait\nmov r3,#thanks\nout r3,8 // write a text string\nhalt\ntype:\ndat 0x65707954\ndat 0x206e6120\ndat 0x0a73\nthanks:\ndat 0x6e616854\ndat 0x6f79206b\ndat 0x0a75\n";var menu='',loadText='',inputForm='',options='',instructions=["ADD","SUB","CMP","MOV","AND","ORR","EOR","LSR","LSL","B","BEQ","BNE","BLT","BGT","LDR","STR","HALT","MVN","INP","OUT","DAT","BIS","XOR","OR"],instKey=[264,264,6,6,264,264,264,2304,2304,128,128,128,128,128,528,528,1,6,32,32,1153],inst1=[3766484992,3762290688,3780116480,3785359360,3758096384,3783262208,3759144960,3785359392,3785359360,3925868544,167772160,436207616,3388997632,3120562176,3844014080,3842965504,4009754624,3789553664,4009820160,4009885696,0],savOpenAddress=!1,IMask=[4294905840,4278190080,4278190080,4278190080,4278190080,4278190080,4294901856,4294901856,4294967295,4294905840,4294905840,4261347328,4261347328,4260425728,4285530112,4285530112,4260364288,4260364288,4260364288,4260364288,4260364288,201326592,0],IValue=[3785359360,3925868544,167772160,436207616,3388997632,3120562176,3785359392,3785359360,4009754624,4009820160,4009885696,3785359360,3789553664,3780116480,3843031040,3841982464,3766484992,3762290688,3758096384,3783262208,3759144960,201326592,0],INmame=["MOV","B","BEQ","BNE","BLT","BGT","LSR","LSL","HALT","INP","OUT","MOV","MVN","CMP","LDR","STR","ADD","SUB","AND","ORR","EOR","MOV","ILLEGAL"],IDecode=[3,6,6,6,6,6,5,5,0,1,1,3,3,4,2,2,7,7,7,7,7,8,0],redX,redY,redVal,blueX,blueY,blueVal,step2Busy=!1,busABusy=0,getBlue=["blue.gif","blue.gif","blue.gif","blue3.gif","blue4.gif","blue5.gif","blue6.gif","blue7.gif","blue8.gif","blue9.gif","blue10.gif","blue11.gif","blue12.gif"],savBLen,ALUop,savRes,ALUflg,ALUdst,TRaddr,Bflg,writeAdd,writeDat,writeReg,writeMode,writeDataOnB,maskCnt=0,maxHeight,maxWidth,lastKey=0,noKeyEffects=!1,chrsToMatch=[],dnFnCall=[],upFnCall=[],chrsDown=[];