function main(){window.document.title="AQA Assembly Language Simulator by Peter Higginson",trapKey(9,"tabKey",null),trapKey(27,"escKey",null),rectangle("background",0,0,1021,719,"white","lightBlue"),image("layout","layout7.png",2,2,"Computer System layout"),samsung=navigator.userAgent.indexOf("SamsungBrowser")>=0,rectangle("memory",535,48,470,630,"white","#5B81A8"),rectangle("program",21,52,227,545,"white","green"),rectangle("output",395,558,127,95,"white","blue"),rectangle("input",270,560,89,16,"white","blue"),rectangle("ir",337,290,76,20,"white","#BE5050"),rectangle("flags",365,414,41,16,"white","#BE5050"),rectangle("mar",485,178,16,55,"white","blue"),rectangle("mbr",486,290,16,103,"white","blue");var e=53;rectangle("R0",300,251,82,16,"white",""),rectangle("R1",300,235,82,16,"white",""),rectangle("R2",300,219,82,16,"white",""),rectangle("R3",300,203,82,16,"white",""),rectangle("R4",300,187,82,16,"white",""),rectangle("R5",300,171,82,16,"white",""),rectangle("R6",300,155,82,16,"white",""),rectangle("R7",300,149,82,16,"white",""),rectangle("R8",300,133,82,16,"white",""),rectangle("R9",300,117,82,16,"white",""),rectangle("R10",300,101,82,16,"white",""),rectangle("R11",300,85,82,16,"white",""),rectangle("R12",300,69,82,16,"white",""),rectangle("pc",300,e,82,16,"white",""),rectangle("message",25,679,484,18,"white",""),button("assemble","ASSEMBLE",19,610,"assemble()"),button("run","RUN",115,610,"run()"),button("step","STEP",170,610,"step3()"),button("reset","RESET",19,638,"reset1()"),window.File&&window.FileReader?text("load",loadText,79,638,12,"black"):alert("The File APIs are not supported in this browser."),button("info","INFO",130,638,"window.open('info.html')"),text("ch",menu,184,640,10,"black"),text("op",options,272,640,10,"black"),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),updateFlags(0),updatePC(0),text("program","",21,52,12,"black","onclick","openProgram(this)",monospace),message("Please click INFO for information"),rectangle("ver1",530,690,300,18,"white",""),rectangle("ver2",830,690,180,18,"white",""),text("ver1","AQA Assembly Language Simulator V0.08",530,690,16,"black"),text("ver2","© Peter L Higginson 2018",830,690,16,"black"),rectangle("mode",750,24,220,18,"white",""),text("mode","(32 bit words as signed)",752,24,16,"black"),rewriteHeadings(),rewriteSide(),delay(1,"main1")}function main1(){holdI=0,runRate=getMilliseconds(),main2()}function main2(){for(var e=0;e<5;++e)rectangle("a"+holdI,568+holdI%5*86,74+15*Math.floor(holdI/5),82,14,"white","white",1),setAddress(4*holdI,0),++holdI;holdI>=200?(updatePCmarker(0),delay(1,"main3")):delay(1,"main2")}function main3(){runRate=(getMilliseconds()-runRate)/20,console.log("runRate for updates is "+runRate),delay(3e3,"main4")}function main4(){message("SELECT or enter a program, LOAD a file or alter memory")}function blinkoff(){waitingForInput&&(text("inpxx","",261,541,12,"red"),delay(500,"blinkon"))}function blinkon(){waitingForInput&&(text("inpxx","   INPUT NEEDED",261,541,12,"red"),delay(1e3,"blinkoff"))}function escKey(e){if(waitingForInput&&!(myTimeout||myTimeout1||myTimeout2)){if(e.preventDefault(),waitingForInput=!1,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<200&&setAddress(4*t,address[t]),savOpenAddress=!1}else modifyingProgram?(modifyingProgram=!1,textToHtml()):(updatePC(pCounter),updatePCmarker(pCounter));message("ESC pressed to abort input")}}function tabKey(e){if(e.preventDefault(),waitingForInput&&!(myTimeout||myTimeout1||myTimeout2))if(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]));var n=checkInput((i=document.getElementById("aForm")).value);if(loseAddress(i),t<199){++t,n&&message("Modifying memory contents");var r=document.getElementById("a"+t),s=3==memOpt?"246":"90";r.innerHTML='
',document.getElementById("aForm").focus(),document.getElementById("aForm").setAttribute("onblur","loseAddress(this)"),waitingForInput=!0,savOpenAddress=r}}else if(modifyingProgram){var a=document.getElementById("pForm"),o=a.selectionStart;a.value=a.value.substring(0,a.selectionStart)+"\t"+a.value.substring(a.selectionEnd),a.selectionEnd=o+1}else{var i=document.getElementById("PCForm");losePC(i)}}function openProgram(e){waitingForInput||myTimeout||myTimeout1||myTimeout2||(submit=!0,message("Modifying Program Area"),e.style.overflow="initial",e.innerHTML='
',document.getElementById("pForm").focus(),waitingForInput=!0,modifyingProgram=!0)}function programSubmit(){if(!waitingForInput)return alert("Bad input - not waiting for input"),!1;var e=document.getElementById("pForm");waitingForInput=!1,modifyingProgram=!1,submit?(programText=e.value,textToHtml(),assemble()):(text("program",programHTML,21,52,12,"black","onclick","openProgram(this)",monospace),document.getElementById("program").style.overflow="auto")}function programCancel(){submit=!1}function ch2(){reset1();var e=document.getElementById("ch1").value;e>0&&e<7?(programText=program[e],textToHtml(),assemble()):message("Bad selection")}function op2(){var e=document.getElementById("op1").value;if(1==e){for(n=0;n<200;++n)setAddress(4*n,0);text("op",options,272,640,10,"black")}else if(e>1&&e<6){0==(memOpt=e-2)?text("mode","(32 bit words as signed)",752,24,16,"black"):1==memOpt?text("mode","(32 bit words as unsigned)",752,24,16,"black"):3==memOpt?text("mode","(32 bit words as binary)",752,24,16,"black"):text("mode","(32 bit words as hexadecimal)",740,24,16,"black"),rectangle("background",0,0,3==memOpt?1935:1021,719,"white","lightBlue"),rectangle("memory",535,48,3==memOpt?1385:470,630,"white","#5B81A8"),rewriteHeadings();var t=250;samsung&&(t=270),3!=memOpt&&(t=82);for(n=0;n<200;++n)rectangle("a"+n,568+memX(n),74+15*Math.floor(n/5),t,14,"white","white",1),setAddress(4*n,address[n]);for(var n=0;n<13;++n)updateR(n,register[n]);updatePC(pCounter),updatePCmarker(pCounter)}else e>5&&e<10&&(defaultSpeed=175,6==e&&(defaultSpeed=10),7==e&&(defaultSpeed=100),9==e&&(defaultSpeed=250),running&&(speed=defaultSpeed,doSpeed()));e>9&&e<12&&(byteOpt=e-10,rewriteHeadings(),rewriteSide(),updatePC(pCounter),savMAR&&setMAR(savMAR)),e>11&&e<14&&(lineAddress=e-12==0,textToHtml())}function rewriteHeadings(){for(var e=3==memOpt?800:620,t=byteOpt?4:1,n=0;n<=4;++n)n<3&&1==byteOpt?text("memt"+n,"0"+n*t+"",e+memX(n),58,14,"black"):text("memt"+n,""+n*t+"",e+memX(n),58,14,"black")}function rewriteSide(){for(var e=byteOpt?20:5,n=0;n<=39;++n)t=0==n?"000":n*e<10?"00"+n*e+"":n*e<100?"0"+n*e+"":""+n*e+"",text("meml"+n,t,544,76+15*n,14,"black")}function read_chg(e){reset1();var t=e.files;if(t){var n=new FileReader;n.readAsText(t[0],"utf-8"),n.onload=function(){programText=n.result,textToHtml(),assemble(),text("ch",menu,184,640,10,"black"),text("load",loadText,79,638,12,"black")}}else alert("BAD FILE SELECTION RETURN")}function textToHtml(){programHTML="",programEdit="";var e=0,t=0,n="",r=!1,s=!1,a=programText.length;"\n"!=programText[a-1]&&(programText+="\n",++a);for(var o=0;o" "&&(u+=programText[o+p],":"!=programText[o+p]);)++p;if(":"!=programText[o+p])n+="      ",programEdit+=" ",t=5;else for(++p;o+p" ")break;++p}}for(;t<5&&" "==i&&programText[o+1]>" ";)programEdit+=" ",n+=" ",++t;"\n"==i?(r?programHTML+=n:s&&!lineAddress?programHTML+="    "+n:(e<10&&(programHTML+=" "),e<100&&(programHTML+=" "),programHTML+=e+" "+n,++e),n="",o+1"),programEdit+="\n",t=0,r=!1,s=!1):(++t,n+=i,programEdit+=i)}}text("program",programHTML,21,52,12,"black","onclick","openProgram(this)",monospace),document.getElementById("program").style.overflow="auto"}function message(e){text("message",e,25,679,14,"#FF0000")}function assemble(){if(!waitingForInput){reset1();for(B=0;B<800;B+=4)setAddress(B,0);var e=programText.length;"\n"!=programText[e-1]&&(programText+="\n",++e),lineCount=0;var t=0,n="",r=[],s=[],a=[],o=!1,i=!1,u=!1,p=0;addrToLine=[];for(var l=0;l2&&(a[lineCount]+=n),n="",++t),"\n"==d&&(t>0?(1==t&&(s[lineCount]=0),t<3&&(a[lineCount]=0),t=0,addrToLine[lineCount]=lineCount+p,++lineCount):o&&++p,o=!1),d>" "&&(n+=d)}else{if(0!=t)return message(r[lineCount]?"cannot have two labels at one address "+n:"label must be first item on a line "+n),void showError(lineCount+p);if(("R"==n[0]||"r"==n[0])&&(3==n.length&&"1"==n[1]&&n[2]>="0"&&n[2]<="2"||2==n.length&&n[1]>="0"&&n[1]<="9"))return message("cannot use a register as a label "+n),void showError(lineCount+p);for(y=0;y200)return message("program too long - found "+lineCount+" lines. Max is 200"),void showError(200+p);for(var m=0,b=!1;m4294967295||y<-4294967296){b="bad parameter at line "+convert(m)+" "+s[m];break}f+=y}else if(20==R){for(y=0;y=lineCount){b="unknown address label at line "+convert(m);break}if(0==(128&c)){b="bad parameter at line "+convert(m)+" "+s[m];break}var x=y-m-2&16777215;0==f?f=y:f+=x}else{if(R>12){b="bad parameter at line "+convert(m)+" "+s[m];break}if(0==(64&c)){b="bad parameter at line "+convert(m)+" "+s[m];break}f+=R}}else{var h=a[m].indexOf(",",v+1),A=regDecode(a[m].substring(0,v));if(-1==h){L=regDecode(a[m].substring(v+1));if(A>12){b="bad parameter at line "+convert(m)+" "+s[m];break}if(L<13){if(0==(2&c)){b="bad parameter at line "+convert(m)+" "+s[m];break}2==g&&(A*=16),f+=(A<<12)+L}else if(21==L)if(y=parseInt(a[m].substring(v+1)),0!=(32&c)&&!isNaN(y)&&y<16&&y>=0)f+=(A<<12)+y;else{if(!(0!=(16&c)&&!isNaN(y)&&y<4096&&y>=0&&(1==byteOpt||y<1024))){b="bad parameter at line "+convert(m)+" "+s[m];break}0==byteOpt&&(y*=4),f+=(y-=4*(m+2))>=0?8388608+y:-y,f+=A<<12}else{if(20!=L){b="unknown problem at line "+convert(m);break}var T=a[m].substring(v+1,v+2);if("#"==T)if((T=a[m].substring(v+2,v+3))>="0"&&T<="9")if((y=checkImm(a[m].substring(v+2)))<0&&3==g){if(y=parseInt(a[m].substring(v+2)),isNaN(y)||y<0||y>67108863){b="bad parameter at line "+convert(m)+" "+s[m];break}f=201326592+(A<<28)+y}else{if(y<0||0==(4&c)){b="bad parameter at line "+convert(m)+" "+s[m];break}2==g&&(A*=16),f+=(A<<12)+y+33554432}else{for(y=0;y=lineCount||0==(4&c)){b="unknown address label at line "+convert(m);break}2==g&&(A*=16),f+=(A<<12)+y+33554432}else if("["==T){var w=a[m].indexOf("]",h+1),k=a[m].indexOf("+",h+1);if(-1==w||0==(512&c)){b="bad parameter at line "+convert(m)+" "+s[m];break}if(-1!=k&&k>w&&(k=-1),-1==k)L=regDecode(a[m].substring(v+2,w)),y=0;else if(L=regDecode(a[m].substring(v+2,k)),(T=a[m].substring(k+1,k+2))>="0"&&T<="9"){if(y=parseInt(a[m].substring(k+1,w)),isNaN(y)||y<0||y>1023){b="bad parameter at line "+convert(m)+" "+s[m];break}}else{u=a[m].substring(k+1,w);for(y=0;y=lineCount){b="unknown address label at line "+convert(m);break}}if(L>12){b="unknown indirect register at line "+convert(m);break}if(y>1023||y<0){b="problem with offset calculation at line "+convert(m);break}f=(4293918720&f)+(L<<16)+(A<<12)+8388608+4*y}else{u=a[m].substring(v+1);for(y=0;y=lineCount){b="unknown address label at line "+convert(m);break}f+=(y-=m+2)>=0?8388608+4*y:4*-y,f+=A<<12}}}else{var L=regDecode(a[m].substring(v+1,h)),C=regDecode(a[m].substring(h+1));if(L>12){b="2nd parameter not a valid register at line "+convert(m);break}if(C<13){if(0==(256&c)){b="bad parameter at line "+convert(m)+" "+s[m];break}f+=A<<12,f+=27262976==(267386880&f)?16+(C<<8)+L:(L<<16)+C}else{if(20!=C||"#"!=a[m].substring(h+1,h+2)){b="bad parameter at line "+convert(m)+" "+s[m];break}if((T=a[m].substring(h+2,h+3))>="0"&&T<="9")y=checkImm(a[m].substring(h+2));else{for(y=0;y=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=[];