friscjs
Version:
FRISC processor simulator in JavaScript
1 lines • 54.3 kB
JavaScript
function convertIntToBinary(e,t){var n=new Array(t);for(var r=0;r<t;r++)n[t-r-1]=e&1<<r?1:0;return n.join("")}function convertBinaryToInt(e,t){if(e.length===0)throw"'value' must be nonempty";var n=0,r;typeof t=="undefined"&&(t=0);if(t!==0&&t!==1&&t!==!0&&t!==!1)throw"invalid 'signed' value "+t.toString();for(var i=0,s=e.length;i<s-t;i++){r=e[s-1-i];if(r!=="0"&&r!=="1")throw"invalid bit in binary string 'value' at position "+(s-1-i)+" ("+r+")";n+=(e[s-i-1]==="1")*Math.pow(2,i)}return t&&e[0]==="1"?(Math.pow(2,e.length-1)-n)*-1:n}function getBitString(e,t,n){return typeof e=="string"?e.substring(e.length-n-1,e.length-t):typeof e=="number"?getBitString(convertIntToBinary(e,32),t,n):null}function extend(e,t,n){var r=n?e[0]:"0",i=e.length,s="";for(var o=0;o<t-i;o++)s+=r;return s+e}function twosComplement(e,t){return~e+1&t}function generateStringOfCharacters(e,t){var n=[];if(typeof t!="number"||t<0)throw new Error("stringLength must be a non-negative integer");for(var r=0;r<t;r++)n.push(e);return n.join("")}frisc_asm=function(){function e(e){return'"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g,escape)+'"'}var t={parse:function(t,n){function a(e,t,n){var r=e,i=n-e.length;for(var s=0;s<i;s++)r=t+r;return r}function f(e){var t=e.charCodeAt(0),n,r;return t<=255?(n="x",r=2):(n="u",r=4),"\\"+n+a(t.toString(16).toUpperCase(),"0",r)}function l(e){if(i<o)return;i>o&&(o=i,u=[]),u.push(e)}function c(){var e,t;return t=i,e=h(),e!==null&&(e=function(e,t){function o(e,t){if(e.type==="label"){var n=ht[e.value];typeof n!="undefined"?(e.type="num",e.value=typeof t=="undefined"?n:n-t):(i.push(e.value),e.value=null)}}var n=[],r=[],i=[];for(var s=0;s<t.length;s++)typeof t[s][0].op!="undefined"&&t[s][0].op!==""&&n.push(t[s][0]);for(var s=0;s<n.length;s++)if(n[s].op in gt||n[s].op in yt||n[s].op in mt)o(n[s].alusrc2);else if(n[s].op in wt)n[s].op==="JR"?o(n[s].addr,n[s].curloc):o(n[s].addr);else if(n[s].op in Et)o(n[s].mem);else if(n[s].op in At){var u=[];for(var a=0;a<n[s].values.length;a++)o(n[s].values[a]),u.push(n[s].values[a].value);n[s].values=u}if(i.length>0)throw new Error("Unknown labels: "+i.toString());for(var s=0;s<n.length;s++)Dt(n[s]),r.push(n[s]);var f=[],l=function(e,t,n){if(e.length%8!==0)throw new Error("Memory string has wrong length");var r=e.match(/.{8}/g);for(var i=0;i<r.length;i++)n[t+i]=r[r.length-i-1];return t+r.length};for(var c=0,h=0;c<r.length;)if(typeof r[c].curloc=="undefined")c++;else if(r[c].curloc>h)h=l("00000000",h,f);else{if(typeof r[c].machineCode=="string")h=l(r[c].machineCode,h,f);else for(var a=0;a<r[c].machineCode.length;a++)h=l(r[c].machineCode[a],h,f);c+=1}return{ast:r,mem:f}}(t,e)),e===null&&(i=t),e}function h(){var e,n,r,o,u,a;o=i,u=i,a=i,n=d(),n!==null?(r=function(e){return vt++,!0}(i)?"":null,r!==null?n=[n,r]:(n=null,i=a)):(n=null,i=a);if(n!==null){e=[];while(n!==null)e.push(n),a=i,n=d(),n!==null?(r=function(e){return vt++,!0}(i)?"":null,r!==null?n=[n,r]:(n=null,i=a)):(n=null,i=a)}else e=null;if(e!==null){a=i,s++,t.length>i?(r=t.charAt(i),i++):(r=null,s===0&&l("any character"));if(r!==null){n=[];while(r!==null)n.push(r),t.length>i?(r=t.charAt(i),i++):(r=null,s===0&&l("any character"))}else n=null;s--,n===null?n="":(n=null,i=a),n!==null?e=[e,n]:(e=null,i=u)}else e=null,i=u;return e!==null&&(e=function(e,t){return t}(o,e[0])),e===null&&(i=o),e}function p(){var e;return t.charCodeAt(i)===10?(e="\n",i++):(e=null,s===0&&l('"\\n"')),e===null&&(t.substr(i,2)==="\r\n"?(e="\r\n",i+=2):(e=null,s===0&&l('"\\r\\n"')),e===null&&(t.charCodeAt(i)===13?(e="\r",i++):(e=null,s===0&&l('"\\r"')),e===null&&(t.substr(i,2)==="\n\r"?(e="\n\r",i+=2):(e=null,s===0&&l('"\\n\\r"'))))),e}function d(){var e,t,n,r;return n=i,e=v(),e!==null&&(e=function(e,t){var n=t;return n.line=vt-1,{}}(n,e)),e===null&&(i=n),e===null&&(n=i,r=i,e=m(),e!==null?(t=p(),t!==null?e=[e,t]:(e=null,i=r)):(e=null,i=r),e!==null&&(e=function(e,t){var n=t;return n.line=vt,n}(n,e[0])),e===null&&(i=n)),e}function v(){var e,n,r,o,u,a,f,c,h,d;c=i,h=i,e=g(),e=e!==null?e:"";if(e!==null){r=rt();if(r!==null){n=[];while(r!==null)n.push(r),r=rt()}else n=null;if(n!==null){r=Z();if(r!==null){o=nt(),o=o!==null?o:"";if(o!==null){d=i,u=p();if(u!==null){a=[],t.length>i?(f=t.charAt(i),i++):(f=null,s===0&&l("any character"));while(f!==null)a.push(f),t.length>i?(f=t.charAt(i),i++):(f=null,s===0&&l("any character"));a!==null?u=[u,a]:(u=null,i=d)}else u=null,i=d;u=u!==null?u:"",u!==null?e=[e,n,r,o,u]:(e=null,i=h)}else e=null,i=h}else e=null,i=h}else e=null,i=h}else e=null,i=h;return e!==null&&(e=function(e,t,n,r){return n}(c,e[0],e[2],e[3])),e===null&&(i=c),e}function m(){var e,t,n,r,s;return r=i,s=i,e=g(),e=e!==null?e:"",e!==null?(t=y(),t=t!==null?t:"",t!==null?(n=nt(),n=n!==null?n:"",n!==null?e=[e,t,n]:(e=null,i=s)):(e=null,i=s)):(e=null,i=s),e!==null&&(e=function(e,t,n,r){if(n===null||n==="")return t!==null&&t!==""&&_t(t,ct),{};n.op in Tt||n.op in Nt||n.op in kt||(ct=ct%4===0?ct:ct+(4-ct%4)),t!==null&&t!==""&&(n.op in Lt||n.op in kt||n.op in xt||n.op in Nt?n.op in Nt&&_t(t,n.value):_t(t,ct)),n.curloc=ct;if(n.op in gt||n.op in yt||n.op in mt||n.op in wt||n.op in bt||n.op in Et||n.op in St)ct+=4;else if(n.op in xt){if(n.value<ct){var i=new Error("ORG op must not point to previous addresses.");throw i.line=vt,i.column=1,i}ct=n.value}else n.op in Tt?ct+=n.values.length:n.op in Nt?ct=ct:n.op in kt?ct=ct:n.op in Ct?ct+=n.value:n.op in At&&(ct+=n.size*n.values.length);return n.op in Lt&&(lt=n.value),n.op in kt||n.op in Nt||n.op in xt||n.op in Lt?{}:n}(r,e[0],e[1],e[2])),e===null&&(i=r),e}function g(){var e,n,r,o,u;o=i,u=i,/^[a-zA-Z]/.test(t.charAt(i))?(e=t.charAt(i),i++):(e=null,s===0&&l("[a-zA-Z]"));if(e!==null){n=[],/^[0-9a-zA-Z_]/.test(t.charAt(i))?(r=t.charAt(i),i++):(r=null,s===0&&l("[0-9a-zA-Z_]"));while(r!==null)n.push(r),/^[0-9a-zA-Z_]/.test(t.charAt(i))?(r=t.charAt(i),i++):(r=null,s===0&&l("[0-9a-zA-Z_]"));n!==null?e=[e,n]:(e=null,i=u)}else e=null,i=u;return e!==null&&(e=function(e,t,n){return t+n.join("")}(o,e[0],e[1])),e===null&&(i=o),e}function y(){var e,t,n,r;n=i,r=i,t=rt();if(t!==null){e=[];while(t!==null)e.push(t),t=rt()}else e=null;return e!==null?(t=b(),t!==null?e=[e,t]:(e=null,i=r)):(e=null,i=r),e!==null&&(e=function(e,t){return t}(n,e[1])),e===null&&(i=n),e}function b(){var e;return e=tt(),e===null&&(e=et(),e===null&&(e=Y(),e===null&&(e=G(),e===null&&(e=Q(),e===null&&(e=K(),e===null&&(e=J(),e===null&&(e=$(),e===null&&(e=X(),e===null&&(e=W(),e===null&&(e=z(),e===null&&(e=U()))))))))))),e}function w(){var e,t;return t=i,e=it(),e!==null&&(e=function(e,t){return{type:"reg",value:t}}(t,e)),e===null&&(i=t),e}function E(){var e,n,r,o;return r=i,o=i,/^[sS]/.test(t.charAt(i))?(e=t.charAt(i),i++):(e=null,s===0&&l("[sS]")),e!==null?(/^[rR]/.test(t.charAt(i))?(n=t.charAt(i),i++):(n=null,s===0&&l("[rR]")),n!==null?e=[e,n]:(e=null,i=o)):(e=null,i=o),e!==null&&(e=function(e,t){return{type:"sr",value:"sr"}}(r,e)),e===null&&(i=r),e}function S(){var e,t;return t=i,e=g(),e!==null&&(e=function(e,t){return{type:"label",value:t}}(t,e)),e===null&&(i=t),e===null&&(t=i,e=st(),e!==null&&(e=function(e,t){return{type:"num",value:t}}(t,e)),e===null&&(i=t)),e}function x(){var e,n,r,o,u;return o=i,u=i,t.charCodeAt(i)===40?(e="(",i++):(e=null,s===0&&l('"("')),e!==null?(n=g(),n!==null?(t.charCodeAt(i)===41?(r=")",i++):(r=null,s===0&&l('")"')),r!==null?e=[e,n,r]:(e=null,i=u)):(e=null,i=u)):(e=null,i=u),e!==null&&(e=function(e,t){return{type:"label",value:t}}(o,e[1])),e===null&&(i=o),e===null&&(o=i,u=i,t.charCodeAt(i)===40?(e="(",i++):(e=null,s===0&&l('"("')),e!==null?(n=st(),n!==null?(t.charCodeAt(i)===41?(r=")",i++):(r=null,s===0&&l('")"')),r!==null?e=[e,n,r]:(e=null,i=u)):(e=null,i=u)):(e=null,i=u),e!==null&&(e=function(e,t){return{type:"num",value:t}}(o,e[1])),e===null&&(i=o)),e}function T(){var e,n,r,o,u;return o=i,u=i,t.charCodeAt(i)===40?(e="(",i++):(e=null,s===0&&l('"("')),e!==null?(n=w(),n!==null?(t.charCodeAt(i)===41?(r=")",i++):(r=null,s===0&&l('")"')),r!==null?e=[e,n,r]:(e=null,i=u)):(e=null,i=u)):(e=null,i=u),e!==null&&(e=function(e,t){return t}(o,e[1])),e===null&&(i=o),e}function N(){var e,n,r,o,u,a;return u=i,a=i,t.charCodeAt(i)===40?(e="(",i++):(e=null,s===0&&l('"("')),e!==null?(n=it(),n!==null?(r=ut(),r===null&&(r=""),r!==null?(t.charCodeAt(i)===41?(o=")",i++):(o=null,s===0&&l('")"')),o!==null?e=[e,n,r,o]:(e=null,i=a)):(e=null,i=a)):(e=null,i=a)):(e=null,i=a),e!==null&&(e=function(e,t,n){return{type:"regoff",value:t,offset:n===""?0:n}}(u,e[1],e[2])),e===null&&(i=u),e}function C(){var e,n,r,o,u;u=i,e=[],n=rt();while(n!==null)e.push(n),n=rt();if(e!==null){t.charCodeAt(i)===44?(n=",",i++):(n=null,s===0&&l('","'));if(n!==null){r=[],o=rt();while(o!==null)r.push(o),o=rt();r!==null?e=[e,n,r]:(e=null,i=u)}else e=null,i=u}else e=null,i=u;return e}function k(){var e;return t.substr(i,4)==="MOVE"?(e="MOVE",i+=4):(e=null,s===0&&l('"MOVE"')),e}function L(){var e;return t.substr(i,2)==="OR"?(e="OR",i+=2):(e=null,s===0&&l('"OR"')),e===null&&(t.substr(i,3)==="AND"?(e="AND",i+=3):(e=null,s===0&&l('"AND"')),e===null&&(t.substr(i,3)==="XOR"?(e="XOR",i+=3):(e=null,s===0&&l('"XOR"')),e===null&&(t.substr(i,3)==="ADD"?(e="ADD",i+=3):(e=null,s===0&&l('"ADD"')),e===null&&(t.substr(i,3)==="ADC"?(e="ADC",i+=3):(e=null,s===0&&l('"ADC"')),e===null&&(t.substr(i,3)==="SUB"?(e="SUB",i+=3):(e=null,s===0&&l('"SUB"')),e===null&&(t.substr(i,3)==="SBC"?(e="SBC",i+=3):(e=null,s===0&&l('"SBC"')),e===null&&(t.substr(i,4)==="ROTL"?(e="ROTL",i+=4):(e=null,s===0&&l('"ROTL"')),e===null&&(t.substr(i,4)==="ROTR"?(e="ROTR",i+=4):(e=null,s===0&&l('"ROTR"')),e===null&&(t.substr(i,3)==="SHL"?(e="SHL",i+=3):(e=null,s===0&&l('"SHL"')),e===null&&(t.substr(i,3)==="SHR"?(e="SHR",i+=3):(e=null,s===0&&l('"SHR"')),e===null&&(t.substr(i,4)==="ASHR"?(e="ASHR",i+=4):(e=null,s===0&&l('"ASHR"'))))))))))))),e}function A(){var e;return t.substr(i,3)==="CMP"?(e="CMP",i+=3):(e=null,s===0&&l('"CMP"')),e}function O(){var e;return t.substr(i,4)==="RETI"?(e="RETI",i+=4):(e=null,s===0&&l('"RETI"')),e===null&&(t.substr(i,4)==="RETN"?(e="RETN",i+=4):(e=null,s===0&&l('"RETN"')),e===null&&(t.substr(i,3)==="RET"?(e="RET",i+=3):(e=null,s===0&&l('"RET"')),e===null&&(t.substr(i,4)==="HALT"?(e="HALT",i+=4):(e=null,s===0&&l('"HALT"'))))),e}function M(){var e;return t.substr(i,2)==="JP"?(e="JP",i+=2):(e=null,s===0&&l('"JP"')),e===null&&(t.substr(i,4)==="CALL"?(e="CALL",i+=4):(e=null,s===0&&l('"CALL"')),e===null&&(t.substr(i,2)==="JR"?(e="JR",i+=2):(e=null,s===0&&l('"JR"')))),e}function _(){var e;return t.substr(i,5)==="LOADB"?(e="LOADB",i+=5):(e=null,s===0&&l('"LOADB"')),e===null&&(t.substr(i,6)==="STOREB"?(e="STOREB",i+=6):(e=null,s===0&&l('"STOREB"')),e===null&&(t.substr(i,5)==="LOADH"?(e="LOADH",i+=5):(e=null,s===0&&l('"LOADH"')),e===null&&(t.substr(i,6)==="STOREH"?(e="STOREH",i+=6):(e=null,s===0&&l('"STOREH"')),e===null&&(t.substr(i,4)==="LOAD"?(e="LOAD",i+=4):(e=null,s===0&&l('"LOAD"')),e===null&&(t.substr(i,5)==="STORE"?(e="STORE",i+=5):(e=null,s===0&&l('"STORE"'))))))),e}function D(){var e;return t.substr(i,3)==="POP"?(e="POP",i+=3):(e=null,s===0&&l('"POP"')),e===null&&(t.substr(i,4)==="PUSH"?(e="PUSH",i+=4):(e=null,s===0&&l('"PUSH"'))),e}function P(){var e;return t.substr(i,4)==="`ORG"?(e="`ORG",i+=4):(e=null,s===0&&l('"`ORG"')),e}function H(){var e;return t.substr(i,3)==="`DW"?(e="`DW",i+=3):(e=null,s===0&&l('"`DW"')),e}function B(){var e;return t.substr(i,4)==="`EQU"?(e="`EQU",i+=4):(e=null,s===0&&l('"`EQU"')),e}function j(){var e;return t.substr(i,3)==="`DS"?(e="`DS",i+=3):(e=null,s===0&&l('"`DS"')),e}function F(){var e;return t.substr(i,4)==="`END"?(e="`END",i+=4):(e=null,s===0&&l('"`END"')),e}function I(){var e;return t.substr(i,5)==="`BASE"?(e="`BASE",i+=5):(e=null,s===0&&l('"`BASE"')),e}function q(){var e;return t.substr(i,2)==="DW"?(e="DW",i+=2):(e=null,s===0&&l('"DW"')),e===null&&(t.substr(i,2)==="DH"?(e="DH",i+=2):(e=null,s===0&&l('"DH"')),e===null&&(t.substr(i,2)==="DB"?(e="DB",i+=2):(e=null,s===0&&l('"DB"')))),e}function R(){var e;return t.charCodeAt(i)===77?(e="M",i++):(e=null,s===0&&l('"M"')),e===null&&(t.substr(i,2)==="NN"?(e="NN",i+=2):(e=null,s===0&&l('"NN"')),e===null&&(t.substr(i,2)==="NV"?(e="NV",i+=2):(e=null,s===0&&l('"NV"')),e===null&&(t.substr(i,2)==="NZ"?(e="NZ",i+=2):(e=null,s===0&&l('"NZ"')),e===null&&(t.substr(i,2)==="NE"?(e="NE",i+=2):(e=null,s===0&&l('"NE"')),e===null&&(t.substr(i,2)==="NC"?(e="NC",i+=2):(e=null,s===0&&l('"NC"')),e===null&&(t.charCodeAt(i)===78?(e="N",i++):(e=null,s===0&&l('"N"')),e===null&&(t.charCodeAt(i)===80?(e="P",i++):(e=null,s===0&&l('"P"')),e===null&&(t.charCodeAt(i)===67?(e="C",i++):(e=null,s===0&&l('"C"')),e===null&&(t.substr(i,3)==="ULT"?(e="ULT",i+=3):(e=null,s===0&&l('"ULT"')),e===null&&(t.substr(i,3)==="UGE"?(e="UGE",i+=3):(e=null,s===0&&l('"UGE"')),e===null&&(t.charCodeAt(i)===86?(e="V",i++):(e=null,s===0&&l('"V"')),e===null&&(t.charCodeAt(i)===90?(e="Z",i++):(e=null,s===0&&l('"Z"')),e===null&&(t.substr(i,2)==="EQ"?(e="EQ",i+=2):(e=null,s===0&&l('"EQ"')),e===null&&(t.substr(i,3)==="ULE"?(e="ULE",i+=3):(e=null,s===0&&l('"ULE"')),e===null&&(t.substr(i,3)==="UGT"?(e="UGT",i+=3):(e=null,s===0&&l('"UGT"')),e===null&&(t.substr(i,3)==="SLT"?(e="SLT",i+=3):(e=null,s===0&&l('"SLT"')),e===null&&(t.substr(i,3)==="SLE"?(e="SLE",i+=3):(e=null,s===0&&l('"SLE"')),e===null&&(t.substr(i,3)==="SGE"?(e="SGE",i+=3):(e=null,s===0&&l('"SGE"')),e===null&&(t.substr(i,3)==="SGT"?(e="SGT",i+=3):(e=null,s===0&&l('"SGT"'))))))))))))))))))))),e}function U(){var e,t,n,r,s,o,u,a,f;a=i,f=i,e=L();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=w(),n!==null?(r=C(),r!==null?(s=w(),s===null&&(s=S()),s!==null?(o=C(),o!==null?(u=w(),u!==null?e=[e,t,n,r,s,o,u]:(e=null,i=f)):(e=null,i=f)):(e=null,i=f)):(e=null,i=f)):(e=null,i=f)):(e=null,i=f)}else e=null,i=f;return e!==null&&(e=function(e,t,n,r,i){return{op:t,optype:"aluop",alusrc1:n,alusrc2:r,aludest:i}}(a,e[0],e[2],e[4],e[6])),e===null&&(i=a),e}function z(){var e,t,n,r,s,o,u;o=i,u=i,e=A();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=w(),n!==null?(r=C(),r!==null?(s=w(),s===null&&(s=S()),s!==null?e=[e,t,n,r,s]:(e=null,i=u)):(e=null,i=u)):(e=null,i=u)):(e=null,i=u)}else e=null,i=u;return e!==null&&(e=function(e,t,n,r){return{op:t,optype:"cmpop",alusrc1:n,alusrc2:r}}(o,e[0],e[2],e[4])),e===null&&(i=o),e}function W(){var e,t,n,r,s,o,u;o=i,u=i,e=k();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=w(),n===null&&(n=E(),n===null&&(n=S())),n!==null?(r=C(),r!==null?(s=w(),s===null&&(s=E()),s!==null?e=[e,t,n,r,s]:(e=null,i=u)):(e=null,i=u)):(e=null,i=u)):(e=null,i=u)}else e=null,i=u;return e!==null&&(e=function(e,t,n,r){return{op:t,optype:"moveop",alusrc2:n,aludest:r}}(o,e[0],e[2],e[4])),e===null&&(i=o),e}function X(){var e,t,n,r,s,o;s=i,o=i,e=M();if(e!==null){t=V();if(t!==null){r=rt();if(r!==null){n=[];while(r!==null)n.push(r),r=rt()}else n=null;n!==null?(r=S(),r===null&&(r=T()),r!==null?e=[e,t,n,r]:(e=null,i=o)):(e=null,i=o)}else e=null,i=o}else e=null,i=o;return e!==null&&(e=function(e,t,n,r){return{op:t,optype:"jmpop",flag:n,addr:r}}(s,e[0],e[1],e[3])),e===null&&(i=s),e===null&&(s=i,o=i,e=O(),e!==null?(t=V(),t!==null?e=[e,t]:(e=null,i=o)):(e=null,i=o),e!==null&&(e=function(e,t,n){return{op:t,optype:"rethaltop",flag:n}}(s,e[0],e[1])),e===null&&(i=s)),e}function V(){var e,n,r,o;return r=i,o=i,t.charCodeAt(i)===95?(e="_",i++):(e=null,s===0&&l('"_"')),e!==null?(n=R(),n!==null?e=[e,n]:(e=null,i=o)):(e=null,i=o),e!==null&&(e=function(e,t){return t}(r,e[1])),e===null&&(i=r),e===null&&(r=i,e="",e!==null&&(e=function(e,t){return t}(r,e)),e===null&&(i=r)),e}function $(){var e,t,n,r,s,o,u;o=i,u=i,e=_();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=w(),n!==null?(r=C(),r!==null?(s=N(),s===null&&(s=x()),s!==null?e=[e,t,n,r,s]:(e=null,i=u)):(e=null,i=u)):(e=null,i=u)):(e=null,i=u)}else e=null,i=u;return e!==null&&(e=function(e,t,n,r){return{op:t,optype:"memop",reg:n,mem:r}}(o,e[0],e[2],e[4])),e===null&&(i=o),e}function J(){var e,t,n,r,s;r=i,s=i,e=D();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=w(),n!==null?e=[e,t,n]:(e=null,i=s)):(e=null,i=s)}else e=null,i=s;return e!==null&&(e=function(e,t,n){return{op:t,optype:"stackop",reg:n}}(r,e[0],e[2])),e===null&&(i=r),e}function K(){var e,t,n,r,s;r=i,s=i,e=P();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=st(),n!==null?e=[e,t,n]:(e=null,i=s)):(e=null,i=s)}else e=null,i=s;return e!==null&&(e=function(e,t,n){return{op:t,optype:"orgop",value:n}}(r,e[0],e[2])),e===null&&(i=r),e}function Q(){var e,n,r,o,u,a,f,c,h,p,d;c=i,h=i,e=H();if(e!==null){r=rt();if(r!==null){n=[];while(r!==null)n.push(r),r=rt()}else n=null;if(n!==null){p=i,o=st();if(o!==null){d=i,t.charCodeAt(i)===44?(u=",",i++):(u=null,s===0&&l('","'));if(u!==null){a=[],f=rt();while(f!==null)a.push(f),f=rt();a!==null?u=[u,a]:(u=null,i=d)}else u=null,i=d;u===null&&(u=""),u!==null?o=[o,u]:(o=null,i=p)}else o=null,i=p;if(o!==null){r=[];while(o!==null){r.push(o),p=i,o=st();if(o!==null){d=i,t.charCodeAt(i)===44?(u=",",i++):(u=null,s===0&&l('","'));if(u!==null){a=[],f=rt();while(f!==null)a.push(f),f=rt();a!==null?u=[u,a]:(u=null,i=d)}else u=null,i=d;u===null&&(u=""),u!==null?o=[o,u]:(o=null,i=p)}else o=null,i=p}}else r=null;r!==null?e=[e,n,r]:(e=null,i=h)}else e=null,i=h}else e=null,i=h;return e!==null&&(e=function(e,t,n){var r=[];for(var i=0;i<n.length;i++)r.push(n[i][0]);return{op:t,optype:"dwop",values:r}}(c,e[0],e[2])),e===null&&(i=c),e}function G(){var e,t,n,r,s;r=i,s=i,e=B();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=st(),n!==null?e=[e,t,n]:(e=null,i=s)):(e=null,i=s)}else e=null,i=s;return e!==null&&(e=function(e,t,n){return{op:t,optype:"equop",value:n}}(r,e[0],e[2])),e===null&&(i=r),e}function Y(){var e,t,n,r,s;r=i,s=i,e=j();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=st(),n!==null?e=[e,t,n]:(e=null,i=s)):(e=null,i=s)}else e=null,i=s;return e!==null&&(e=function(e,t,n){return{op:t,optype:"dsop",value:n}}(r,e[0],e[2])),e===null&&(i=r),e}function Z(){var e,t;return t=i,e=F(),e!==null&&(e=function(e,t){return{op:t,optype:"endop"}}(t,e)),e===null&&(i=t),e}function et(){var e,t,n,r,s;r=i,s=i,e=I();if(e!==null){n=rt();if(n!==null){t=[];while(n!==null)t.push(n),n=rt()}else t=null;t!==null?(n=ot(),n!==null?e=[e,t,n]:(e=null,i=s)):(e=null,i=s)}else e=null,i=s;return e!==null&&(e=function(e,t,n){return{op:t,optype:"baseop",value:n}}(r,e[0],e[2])),e===null&&(i=r),e}function tt(){var e,n,r,o,u,a,f,c,h,p,d;c=i,h=i,e=q();if(e!==null){r=rt();if(r!==null){n=[];while(r!==null)n.push(r),r=rt()}else n=null;if(n!==null){p=i,o=S();if(o!==null){d=i,t.charCodeAt(i)===44?(u=",",i++):(u=null,s===0&&l('","'));if(u!==null){a=[],f=rt();while(f!==null)a.push(f),f=rt();a!==null?u=[u,a]:(u=null,i=d)}else u=null,i=d;u===null&&(u=""),u!==null?o=[o,u]:(o=null,i=p)}else o=null,i=p;if(o!==null){r=[];while(o!==null){r.push(o),p=i,o=S();if(o!==null){d=i,t.charCodeAt(i)===44?(u=",",i++):(u=null,s===0&&l('","'));if(u!==null){a=[],f=rt();while(f!==null)a.push(f),f=rt();a!==null?u=[u,a]:(u=null,i=d)}else u=null,i=d;u===null&&(u=""),u!==null?o=[o,u]:(o=null,i=p)}else o=null,i=p}}else r=null;r!==null?e=[e,n,r]:(e=null,i=h)}else e=null,i=h}else e=null,i=h;return e!==null&&(e=function(e,t,n){var r=[];for(var i=0;i<n.length;i++)r.push(n[i][0]);var s=t==="DW"?4:t==="DH"?2:1;return{op:t,optype:"dwhbop",values:r,size:s}}(c,e[0],e[2])),e===null&&(i=c),e}function nt(){var e,n,r,o,u,a;u=i,e=[],n=rt();while(n!==null)e.push(n),n=rt();if(e!==null){a=i,t.charCodeAt(i)===59?(n=";",i++):(n=null,s===0&&l('";"'));if(n!==null){r=[],/^[^\n]/.test(t.charAt(i))?(o=t.charAt(i),i++):(o=null,s===0&&l("[^\\n]"));while(o!==null)r.push(o),/^[^\n]/.test(t.charAt(i))?(o=t.charAt(i),i++):(o=null,s===0&&l("[^\\n]"));r!==null?n=[n,r]:(n=null,i=a)}else n=null,i=a;n=n!==null?n:"",n!==null?e=[e,n]:(e=null,i=u)}else e=null,i=u;return e}function rt(){var e;return t.charCodeAt(i)===32?(e=" ",i++):(e=null,s===0&&l('" "')),e===null&&(t.charCodeAt(i)===9?(e=" ",i++):(e=null,s===0&&l('"\\t"'))),e}function it(){var e,n,r,o;return r=i,o=i,/^[rR]/.test(t.charAt(i))?(e=t.charAt(i),i++):(e=null,s===0&&l("[rR]")),e!==null?(/^[0-7]/.test(t.charAt(i))?(n=t.charAt(i),i++):(n=null,s===0&&l("[0-7]")),n!==null?e=[e,n]:(e=null,i=o)):(e=null,i=o),e!==null&&(e=function(e,t){return parseInt(t,10)}(r,e[1])),e===null&&(i=r),e===null&&(r=i,o=i,/^[sS]/.test(t.charAt(i))?(e=t.charAt(i),i++):(e=null,s===0&&l("[sS]")),e!==null?(/^[pP]/.test(t.charAt(i))?(n=t.charAt(i),i++):(n=null,s===0&&l("[pP]")),n!==null?e=[e,n]:(e=null,i=o)):(e=null,i=o),e!==null&&(e=function(e){return 7}(r)),e===null&&(i=r)),e}function st(){var e,n,r,o,u,a,f,c;a=i,f=i,c=i,t.charCodeAt(i)===37?(e="%",i++):(e=null,s===0&&l('"%"'));if(e!==null){n=ot();if(n!==null){t.charCodeAt(i)===32?(o=" ",i++):(o=null,s===0&&l('" "'));if(o!==null){r=[];while(o!==null)r.push(o),t.charCodeAt(i)===32?(o=" ",i++):(o=null,s===0&&l('" "'))}else r=null;r!==null?e=[e,n,r]:(e=null,i=c)}else e=null,i=c}else e=null,i=c;e===null&&(e="");if(e!==null){/^[+\-]/.test(t.charAt(i))?(n=t.charAt(i),i++):(n=null,s===0&&l("[+\\-]")),n=n!==null?n:"";if(n!==null){/^[0-9]/.test(t.charAt(i))?(r=t.charAt(i),i++):(r=null,s===0&&l("[0-9]"));if(r!==null){o=[],/^[0-9a-hA-H]/.test(t.charAt(i))?(u=t.charAt(i),i++):(u=null,s===0&&l("[0-9a-hA-H]"));while(u!==null)o.push(u),/^[0-9a-hA-H]/.test(t.charAt(i))?(u=t.charAt(i),i++):(u=null,s===0&&l("[0-9a-hA-H]"));o!==null?e=[e,n,r,o]:(e=null,i=f)}else e=null,i=f}else e=null,i=f}else e=null,i=f;return e!==null&&(e=function(e,t,n,r,i){var s=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],o=t===""?lt:t[1],u=[r].concat(i);for(var a=0;a<u.length;a++){var f=!1;for(var l=0;l<o;l++)if(u[a].toLowerCase()===s[l]){f=!0;break}if(!f)return null}var c=n==="-"?-1:1;return c*parseInt(u.join(""),o)}(a,e[0],e[1],e[2],e[3])),e===null&&(i=a),e}function ot(){var e,n;return n=i,/^[bBoOdDhH]/.test(t.charAt(i))?(e=t.charAt(i),i++):(e=null,s===0&&l("[bBoOdDhH]")),e!==null&&(e=function(e,t){t=t.toLowerCase();if(t==="b")return 2;if(t==="o")return 8;if(t==="d")return 10;if(t==="h")return 16}(n,e)),e===null&&(i=n),e}function ut(){var e,n,r,o,u,a;u=i,a=i,/^[+\-]/.test(t.charAt(i))?(e=t.charAt(i),i++):(e=null,s===0&&l("[+\\-]"));if(e!==null){/^[0-9]/.test(t.charAt(i))?(n=t.charAt(i),i++):(n=null,s===0&&l("[0-9]"));if(n!==null){r=[],/^[0-9a-hA-H]/.test(t.charAt(i))?(o=t.charAt(i),i++):(o=null,s===0&&l("[0-9a-hA-H]"));while(o!==null)r.push(o),/^[0-9a-hA-H]/.test(t.charAt(i))?(o=t.charAt(i),i++):(o=null,s===0&&l("[0-9a-hA-H]"));r!==null?e=[e,n,r]:(e=null,i=a)}else e=null,i=a}else e=null,i=a;return e!==null&&(e=function(e,t,n,r){return(t==="-"?-1:1)*parseInt(n+r.join(""),lt)}(u,e[0],e[1],e[2])),e===null&&(i=u),e}function at(e){e.sort();var t=null,n=[];for(var r=0;r<e.length;r++)e[r]!==t&&(n.push(e[r]),t=e[r]);return n}function ft(){var e=1,n=1,r=!1;for(var s=0;s<Math.max(i,o);s++){var u=t.charAt(s);u==="\n"?(r||e++,n=1,r=!1):u==="\r"||u==="\u2028"||u==="\u2029"?(e++,n=1,r=!0):(n++,r=!1)}return{line:e,column:n}}function Ht(e,t){var n=new Array(t);for(var r=0;r<t;r++)n[t-r-1]=Math.pow(2,r)&e?1:0;return n.join("")}var r={instructions_main:c,instructions:h,newline:p,instruction_or_end:d,instruction_end:v,instruction:m,label:g,operationPart:y,operation:b,regaddr:w,sraddr:E,immaddr:S,absaddr_mem:x,rinaddr:T,rinaddroff:N,delimiter:C,moveop_name:k,aluop_name:L,cmpop_name:A,nonjmpop_name:O,jmpop_name:M,memop_name:_,stackop_name:D,orgop_name:P,dwop_name:H,equop_name:B,dsop_name:j,endop_name:F,baseop_name:I,dwhbop_name:q,flag_name:R,aluop:U,cmpop:z,moveop:W,uprop:X,flag:V,memop:$,stackop:J,orgop:K,dwop:Q,equop:G,dsop:Y,endop:Z,baseop:et,dwhbop:tt,commentPart:nt,whitespace:rt,register:it,number:st,base:ot,numberWithoutBase:ut};if(n!==undefined){if(r[n]===undefined)throw new Error("Invalid rule name: "+e(n)+".")}else n="instructions_main";var i=0,s=0,o=0,u=[],lt=16,ct=0,ht={},pt=[],dt={},vt=1,mt={MOVE:"00000"},gt={OR:"00001",AND:"00010",XOR:"00011",ADD:"00100",ADC:"00101",SUB:"00110",SBC:"00111",ROTL:"01000",ROTR:"01001",SHL:"01010",SHR:"01011",ASHR:"01100"},yt={CMP:"01101"},bt={RET:"11011",RETI:"11011",RETN:"11011",HALT:"11111"},wt={JP:"11000",CALL:"11001",JR:"11010"},Et={LOAD:"10110",STORE:"10111",LOADB:"10010",STOREB:"10011",LOADH:"10100",STOREH:"10101"},St={POP:"10000",PUSH:"10001"},xt={"`ORG":""},Tt={"`DW":""},Nt={"`EQU":""},Ct={"`DS":""},kt={"`END":""},Lt={"`BASE":""},At={DW:"",DH:"",DB:""},Ot={"":"0000",N:"0001",M:"0001",NN:"0010",P:"0010",C:"0011",ULT:"0011",NC:"0100",UGE:"0100",V:"0101",NV:"0110",Z:"0111",EQ:"0111",NZ:"1000",NE:"1000",ULE:"1001",UGT:"1010",SLT:"1011",SLE:"1100",SGE:"1101",SGT:"1110"},Mt={aluop:gt,moveop:mt,cmpop:yt,memop:Et,stackop:St,jmpop:wt,rethaltop:bt,equop:Nt,dwop:Tt,orgop:xt,dsop:Ct,endop:kt,dwhbop:At,baseop:Lt},_t=function(e,t){e=e.trim();if(typeof ht[e]!="undefined"){var n=new Error("Existing label: "+e);throw n.line=vt,n.column=1,n}ht[e]=t},Dt=function(e){if(typeof e=="undefined"||typeof e.op=="undefined"||typeof e.optype=="undefined"||typeof Mt[e.optype]=="undefined"||typeof Mt[e.optype][e.op]=="undefined")throw new Error("Undefined instruction, operation or operation type."+JSON.stringify(e));var t=null;e.optype in{cmpop:null,aluop:null,moveop:null,memop:null,stackop:null,jmpop:null,rethaltop:null}?(t="00000000000000000000000000000000".split(""),Pt(t,27,31,Mt[e.optype][e.op])):t=[];switch(e.optype){case"cmpop":case"aluop":e.optype==="aluop"&&Pt(t,23,25,Ht(e.aludest.value,3)),Pt(t,20,22,Ht(e.alusrc1.value,3)),e.alusrc2.type==="reg"?(Pt(t,26,26,"0"),Pt(t,17,19,Ht(e.alusrc2.value,3)),Pt(t,0,16,"00000000000000000")):(Pt(t,26,26,"1"),Pt(t,0,19,Ht(e.alusrc2.value,20)));break;case"moveop":e.aludest.type!=="reg"||e.alusrc2.type!=="reg"&&e.alusrc2.type!=="num"?e.aludest.type==="sr"?(Pt(t,20,22,"001"),e.alusrc2.type==="reg"?(Pt(t,26,26,"0"),Pt(t,17,19,Ht(e.alusrc2.value,3))):(Pt(t,26,26,"1"),Pt(t,0,19,Ht(e.alusrc2.value,20)))):e.alusrc2.type==="sr"&&(Pt(t,20,22,"010"),Pt(t,23,25,Ht(e.aludest.value,3)),Pt(t,0,19,"00000000000000000000")):(Pt(t,23,25,Ht(e.aludest.value,3)),Pt(t,20,22,"000"),e.alusrc2.type==="reg"?(Pt(t,26,26,"0"),Pt(t,17,19,Ht(e.alusrc2.value,3))):(Pt(t,26,26,"1"),Pt(t,0,19,Ht(e.alusrc2.value,20))));break;case"jmpop":Pt(t,20,21,"00"),Pt(t,22,25,Ot[e.flag]),e.addr.type==="num"?(Pt(t,26,26,"1"),Pt(t,0,19,Ht(e.addr.value,20))):(Pt(t,26,26,"0"),Pt(t,17,19,Ht(e.addr.value,3)));break;case"rethaltop":Pt(t,22,25,Ot[e.flag]),e.op==="RET"?(Pt(t,0,0,"0"),Pt(t,1,1,"0")):e.op==="RETI"?(Pt(t,0,0,"1"),Pt(t,1,1,"0")):e.op==="RETN"&&(Pt(t,0,0,"1"),Pt(t,1,1,"1"));break;case"memop":Pt(t,23,25,Ht(e.reg.value,3)),e.mem.type==="regoff"?(Pt(t,26,26,"1"),Pt(t,20,22,Ht(e.mem.value,3)),Pt(t,0,19,Ht(e.mem.offset,20))):(Pt(t,26,26,"0"),Pt(t,0,19,Ht(e.mem.value,20)));break;case"stackop":Pt(t,23,25,Ht(e.reg.value,3));break;case"dwop":for(var n=0;n<e.values.length;n++)t.push(Ht(e.values[n],8));break;case"dsop":for(var n=0;n<e.value;n++)t.push(Ht(0,8));break;case"dwhbop":for(var n=0;n<e.values.length;n++)t.push(Ht(e.values[n],e.size*8))}e.optype in{cmpop:null,aluop:null,moveop:null,memop:null,stackop:null,jmpop:null,rethaltop:null}?e.machineCode=t.join(""):e.machineCode=t},Pt=function(e,t,n,r){var i=e.length;for(var s=0;s<t-n+1||s<r.length;s++)e[i-n-1+s]=r[s];return e},Bt=r[n]();if(Bt===null||i!==t.length){var jt=Math.max(i,o),Ft=jt<t.length?t.charAt(jt):null,It=ft();throw new this.SyntaxError(at(u),Ft,jt,It.line,It.column)}return Bt},toSource:function(){return this._source}};return t.SyntaxError=function(t,n,r,i,s){function o(t,n){var r,i;switch(t.length){case 0:r="end of input";break;case 1:r=t[0];break;default:r=t.slice(0,t.length-1).join(", ")+" or "+t[t.length-1]}return i=n?e(n):"end of input","Expected "+r+" but "+i+" found."}this.name="SyntaxError",this.expected=t,this.found=n,this.message=o(t,n),this.offset=r,this.line=i,this.column=s},t.SyntaxError.prototype=Error.prototype,t}(),typeof module!="undefined"&&typeof module.exports!="undefined"&&(module.exports=frisc_asm);var FRISC=function(){var e={_size:262144,_memory:[],readb:function(e){e<0&&(e=convertBinaryToInt(convertIntToBinary(e,32),0));var t=n.testMemoryOverlap(e);return t===null?255&this._memory[e]:255&t.readb(e)},readw:function(e){e<0&&(e=convertBinaryToInt(convertIntToBinary(e,32),0));var t=n.testMemoryOverlap(e);if(t===null){var r=(255&this._memory[e+0])<<0,i=(255&this._memory[e+1])<<8;return r+i}return 65535&t.readw(e)},read:function(e){e<0&&(e=convertBinaryToInt(convertIntToBinary(e,32),0));var t=n.testMemoryOverlap(e);if(t===null){var r=(255&this._memory[e+0])<<0,i=(255&this._memory[e+1])<<8,s=(255&this._memory[e+2])<<16,o=(255&this._memory[e+3])<<24;return r+i+s+o}return 4294967295&t.read(e)},writeb:function(e,t){e<0&&(e=convertBinaryToInt(convertIntToBinary(e,32),0));var r=n.testMemoryOverlap(e);r===null?this._memory[e]=255&t:r.writeb(e,255&t),typeof this.onMemoryWrite!="undefined"&&this.onMemoryWrite(e,255&t,1)},writew:function(e,t){e<0&&(e=convertBinaryToInt(convertIntToBinary(e,32),0));var r=n.testMemoryOverlap(e);r===null?(this._memory[e+0]=255&t>>0,this._memory[e+1]=255&t>>8):r.writew(e,65535&t),typeof this.onMemoryWrite!="undefined"&&this.onMemoryWrite(e,65535&t,2)},write:function(e,t){e<0&&(e=convertBinaryToInt(convertIntToBinary(e,32),0));var r=n.testMemoryOverlap(e);r===null?(this._memory[e+0]=255&t>>0,this._memory[e+1]=255&t>>8,this._memory[e+2]=255&t>>16,this._memory[e+3]=255&t>>24):r.write(e,4294967295&t),typeof this.onMemoryWrite!="undefined"&&this.onMemoryWrite(e,4294967295&t,4)},reset:function(){this._memory=[];for(var e=0;e<this._size;e++)this._memory[e]=0},loadByteString:function(e){this.reset();if(this._size<e.length)throw new Error("Memory too small to fit program.");for(var t=0;t<e.length;t++)this._memory[t]=e.charCodeAt(t)},loadBytes:function(e){this.reset();if(this._size<e.length)throw new Error("Memory too small to fit program.");for(var t=0;t<e.length;t++)this._memory[t]=e[t]},loadBinaryString:function(e){this.reset();if(this._size<e.length)throw new Error("Memory too small to fit program.");for(var t=0;t<e.length;t++)this._memory[t]=parseInt(e[t],2)}},t={_r:{r0:0,r1:0,r2:0,r3:0,r4:0,r5:0,r6:0,r7:0,pc:0,sr:0,iif:1},_regMap:{"000":"r0","001":"r1","010":"r2","011":"r3",100:"r4",101:"r5",110:"r6",111:"r7"},_f:{INT2:1024,INT1:512,INT0:256,GIE:128,EINT2:64,EINT1:32,EINT0:16,Z:8,V:4,C:2,N:1},_frequency:1,_SIGN_BIT:2147483648,_NONSIGN_BITS:2147483647,_WORD_BITS:4294967295,_SHIFT_BITS:31,_setFlag:function(e,t){this._r.sr=t?this._r.sr|e:this._r.sr&~e},_getFlag:function(e){return((this._r.sr&e)!==0)+0},_testCond:function(e){var t=!0;if(e==="")t=!0;else if(e==="_N/M")t=!!this._getFlag(this._f.N);else if(e==="_NN/P")t=!this._getFlag(this._f.N);else if(e==="_C/ULT")t=!!this._getFlag(this._f.C);else if(e==="_NC/UGE")t=!this._getFlag(this._f.C);else if(e==="_V")t=!!this._getFlag(this._f.V);else if(e==="_NV")t=!this._getFlag(this._f.V);else if(e==="_Z/EQ")t=!!this._getFlag(this._f.Z);else if(e==="_NZ/NE")t=!this._getFlag(this._f.Z);else if(e==="_ULE")t=!!this._getFlag(this._f.C)||!!this._getFlag(this._f.Z);else if(e==="_UGT")t=!this._getFlag(this._f.C)||!this._getFlag(this._f.Z);else if(e==="_SLT")t=!!this._getFlag(this._f.N)!=!!this._getFlag(this._f.V);else if(e==="_SLE")t=!!this._getFlag(this._f.N)!=!!this._getFlag(this._f.V)||!!this._getFlag(this._f.Z);else if(e==="_SGE")t=!!this._getFlag(this._f.N)==!!this._getFlag(this._f.V);else{if(e!=="_SGT")throw new Error("Undefined test condition.");t=!!this._getFlag(this._f.N)==!!this._getFlag(this._f.V)&&!this._getFlag(this._f.Z)}return t},_decode:function(e){var t=getBitString(e,27,31),n=this._instructionMap[t],r=[];if(typeof n=="undefined")return{op:null,args:null};if(n==="MOVE"){var i=getBitString(e,21,21);i==="1"?i="sr":(i=getBitString(e,26,26),i==="0"?(i=getBitString(e,17,19),i=this._regMap[i]):(i=getBitString(e,0,19),i=extend(i,32,1),i=convertBinaryToInt(i,1)));var s=getBitString(e,20,20);s==="1"?s="sr":(s=getBitString(e,23,25),s=this._regMap[s]),r.push(i),r.push(s)}else if(n==="OR"||n==="AND"||n==="XOR"||n==="ADD"||n==="ADC"||n==="SUB"||n==="SBC"||n==="ROTL"||n==="ROTR"||n==="SHL"||n==="SHR"||n==="ASHR"){var o=getBitString(e,20,22);o=this._regMap[o];var u=getBitString(e,26,26);u==="0"?(u=getBitString(e,17,19),u=this._regMap[u]):(u=getBitString(e,0,19),u=extend(u,32,1),u=convertBinaryToInt(u,1));var s=getBitString(e,23,25);s=this._regMap[s],r.push(o),r.push(u),r.push(s)}else if(n==="CMP"){var o=getBitString(e,20,22);o=this._regMap[o];var u=getBitString(e,26,26);u==="0"?(u=getBitString(e,17,19),u=this._regMap[u]):(u=getBitString(e,0,19),u=extend(u,32,1),u=convertBinaryToInt(u,1)),r.push(o),r.push(u)}else if(n==="JP"||n==="CALL"){var a=getBitString(e,22,25);a=this._conditionMap[a];if(typeof a=="undefined")r=null;else{var s=getBitString(e,26,26);s==="0"?(s=getBitString(e,17,19),s=this._regMap[s]):(s=getBitString(e,0,19),s=extend(s,32,1),s=convertBinaryToInt(s,1)),r.push(a),r.push(s)}}else if(n==="JR"){var a=getBitString(e,22,25);a=this._conditionMap[a];if(typeof a=="undefined")r=null;else{var s=getBitString(e,0,19);s=extend(s,32,1),s=convertBinaryToInt(s,1),r.push(a),r.push(s)}}else if(n==="RET"){var a=getBitString(e,22,25);a=this._conditionMap[a];if(typeof a=="undefined")r=null;else{var f=getBitString(e,0,0)==="1"&&getBitString(e,1,1)==="0",l=getBitString(e,0,0)==="1"&&getBitString(e,1,1)==="1";r.push(a),r.push(f),r.push(l)}}else if(n==="LOAD"||n==="STORE"||n==="LOADB"||n==="STOREB"||n==="LOADH"||n==="STOREH"){var c=getBitString(e,26,26),h=0;c==="0"?c=0:(c=getBitString(e,20,22),c=this._regMap[c]),h=getBitString(e,0,19),h=extend(h,32,1),h=convertBinaryToInt(h,1);var p=getBitString(e,23,25);p=this._regMap[p],r.push(p),r.push(c),r.push(h)}else if(n==="POP"||n==="PUSH"){var p=getBitString(e,23,25);p=this._regMap[p],r.push(p)}else if(n==="HALT"){var a=getBitString(e,22,25);a=this._conditionMap[a],typeof a=="undefined"?r=null:r.push(a)}return{op:n,args:r}},_ADD_three:function(e,t,n,r){var i=e+t+n&this._WORD_BITS,s=e&this._NONSIGN_BITS,o=t&this._NONSIGN_BITS,u=n&this._NONSIGN_BITS,a=s+o+u>>31&1,f=e>>31&1,l=t>>31&1,c=n>>31&1,h=f+l+c+a>1?1:0;this._setFlag(this._f.C,h),this._setFlag(this._f.V,a^h),this._setFlag(this._f.N,!!(i&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(i&this._WORD_BITS)+0),this._r[r]=i},_SUB_internal:function(e,t,n,r){this._ADD_three(this._r[e],twosComplement(typeof t=="number"?t:this._r[t],this._WORD_BITS),twosComplement(n,this._WORD_BITS),r),this._setFlag(this._f.C,1-this._getFlag(this._f.C))},_i:{POP:function(t){this._r[t]=e.read(this._r.r7&-4),this._r.r7+=4},PUSH:function(t){this._r.r7-=4,e.write(this._r.r7&-4,this._r[t])},ADD:function(e,t,n){this._ADD_three(this._r[e],typeof t=="number"?t:this._r[t],0,n)},ADC:function(e,t,n){this._ADD_three(this._r[e],typeof t=="number"?t:this._r[t],this._getFlag(this._f.C),n)},SUB:function(e,t,n){this._SUB_internal(e,t,0,n)},SBC:function(e,t,n){this._SUB_internal(e,t,this._getFlag(this._f.C),n)},CMP:function(e,t){var n=this._r[e]-(typeof t=="number"?t:this._r[t]);this._setFlag(this._f.C,(n>this._WORD_BITS)+0),this._setFlag(this._f.V,(n>this._WORD_BITS)+0),this._setFlag(this._f.N,!!(n&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(n&this._WORD_BITS)+0)},AND:function(e,t,n){var r=this._r[e]&(typeof t=="number"?t:this._r[t]);this._setFlag(this._f.C,0),this._setFlag(this._f.V,0),this._setFlag(this._f.N,!!(r&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(r&this._WORD_BITS)+0),this._r[n]=r&this._WORD_BITS},OR:function(e,t,n){var r=this._r[e]|(typeof t=="number"?t:this._r[t]);this._setFlag(this._f.C,0),this._setFlag(this._f.V,0),this._setFlag(this._f.N,!!(r&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(r&this._WORD_BITS)+0),this._r[n]=r&this._WORD_BITS},XOR:function(e,t,n){var r=this._r[e]^(typeof t=="number"?t:this._r[t]);this._setFlag(this._f.C,0),this._setFlag(this._f.V,0),this._setFlag(this._f.N,!!(r&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(r&this._WORD_BITS)+0),this._r[n]=r&this._WORD_BITS},SHL:function(e,t,n){t=typeof t=="number"?t:this._r[t],t&=this._SHIFT_BITS,e=convertIntToBinary(this._r[e],32),e+=generateStringOfCharacters("0",t);var r=t===0?0:e[t-1]==="1"?1:0,i=convertBinaryToInt(e.substring(t));this._setFlag(this._f.C,r),this._setFlag(this._f.V,0),this._setFlag(this._f.N,!!(i&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(i&this._WORD_BITS)+0),this._r[n]=i&this._WORD_BITS},SHR:function(e,t,n){t=typeof t=="number"?t:this._r[t],t&=this._SHIFT_BITS,e=convertIntToBinary(this._r[e],32),e=generateStringOfCharacters("0",t)+e;var r=t===0?0:e[32]==="1"?1:0,i=convertBinaryToInt(e.substring(0,32));this._setFlag(this._f.C,r),this._setFlag(this._f.V,0),this._setFlag(this._f.N,!!(i&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(i&this._WORD_BITS)+0),this._r[n]=i&this._WORD_BITS},ASHR:function(e,t,n){t=typeof t=="number"?t:this._r[t],t&=this._SHIFT_BITS,e=convertIntToBinary(this._r[e],32),e=generateStringOfCharacters(e[0],t)+e;var r=t===0?0:e[32]==="1"?1:0,i=convertBinaryToInt(e.substring(0,32));this._setFlag(this._f.C,r),this._setFlag(this._f.V,0),this._setFlag(this._f.N,!!(i&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(i&this._WORD_BITS)+0),this._r[n]=i&this._WORD_BITS},ROTL:function(e,t,n){t=typeof t=="number"?t:this._r[t],t&=this._SHIFT_BITS,e=convertIntToBinary(this._r[e],32);var r=t===0?0:e[(t-1)%32]==="1"?1:0;t%=32;var i=convertBinaryToInt(e.substring(t)+e.substring(0,t));this._setFlag(this._f.C,r),this._setFlag(this._f.V,0),this._setFlag(this._f.N,!!(i&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(i&this._WORD_BITS)+0),this._r[n]=i&this._WORD_BITS},ROTR:function(e,t,n){t=typeof t=="number"?t:this._r[t],t&=this._SHIFT_BITS,e=convertIntToBinary(this._r[e],32);var r=t===0?0:e[32-t]==="1"?1:0;t%=32;var i=convertBinaryToInt(e.substring(32-t)+e.substring(0,32-t));this._setFlag(this._f.C,r),this._setFlag(this._f.V,0),this._setFlag(this._f.N,!!(i&this._SIGN_BIT)+0),this._setFlag(this._f.Z,!(i&this._WORD_BITS)+0),this._r[n]=i&this._WORD_BITS},MOVE:function(e,t){e==="sr"?this._r[t]=this._r[e]&255:t==="sr"?this._r[t]=(typeof e=="number"?e:this._r[e])&255:this._r[t]=typeof e=="number"?e:this._r[e]},LOAD:function(t,n,r){var i=(typeof n=="string"?this._r[n]:0)+(typeof r=="number"?r:0);i&=-4,this._r[t]=e.read(i)},LOADH:function(t,n,r){var i=(typeof n=="string"?this._r[n]:0)+(typeof r=="number"?r:0);i&=-2,this._r[t]=e.readw(i)},LOADB:function(t,n,r){var i=(typeof n=="string"?this._r[n]:0)+(typeof r=="number"?r:0);this._r[t]=e.readb(i)},STORE:function(t,n,r){var i=(typeof n=="string"?this._r[n]:0)+(typeof r=="number"?r:0);i&=-4,e.write(i,this._r[t])},STOREH:function(t,n,r){var i=(typeof n=="string"?this._r[n]:0)+(typeof r=="number"?r:0);i&=-2,e.writew(i,this._r[t])},STOREB:function(t,n,r){var i=(typeof n=="string"?this._r[n]:0)+(typeof r=="number"?r:0);e.writeb(i,this._r[t])},JP:function(e,t){this._testCond(e)&&(this._r.pc=((typeof t=="string"?this._r[t]:t)&-4)-4)},JR:function(e,t){this._testCond(e)&&(this._r.pc=(this._r.pc+t&-4)-4)},CALL:function(t,n){this._testCond(t)&&(this._r.r7-=4,e.write(this._r.r7,this._r.pc&-4),this._r.pc=((typeof n=="string"?this._r[n]:n)&-4)-4)},RET:function(t,n,r){this._testCond(t)&&(this._r.pc=e.read(this._r.r7)&-4,this._r.r7+=4,n?this._setFlag(this._f.GIE,1):r&&(this._r.iif=1))},HALT:function(e){this._testCond(e)&&this.stop()}},acceptNonmaskableInterrupt:function(){n.sendIack(),this._r.iif=1,this._r.r7-=4,e.write(this._r.r7&-4,this._r.pc-4),this._r.pc=e.read(12)},acceptMaskableInterrupt:function(){this._setFlag(this._f.GIE,0),this._r.r7-=4,e.write(this._r.r7&-4,this._r.pc-4),this._r.pc=e.read(8)},acceptInterrupt:function(){this._setFlag(this._f.INT2,n.testInterrupt(2)),this._setFlag(this._f.INT1,n.testInterrupt(1)),this._setFlag(this._f.INT0,n.testInterrupt(0));if(this._r.iif===0)return;if(n.testInterrupt(3))this.acceptNonmaskableInterrupt();else{if(this._getFlag(this._f.GIE)===0)return;(this._getFlag(this._f.INT2)&&this._getFlag(this._f.EINT2)||this._getFlag(this._f.INT1)&&this._getFlag(this._f.EINT1)||this._getFlag(this._f.INT0)&&this._getFlag(this._f.EINT0))&&this.acceptMaskableInterrupt()}},run:function(){typeof this.onBeforeRun!="undefined"&&this.onBeforeRun(),this._runTimer=setInterval(this.performCycle.bind(this),1/this._frequency*1e3)},pause:function(){typeof this._runTimer!="undefined"&&clearInterval(this._runTimer)},stop:function(){typeof this._runTimer!="undefined"&&clearInterval(this._runTimer),typeof this.onStop!="undefined"&&this.onStop()},performCycle:function(){if(typeof this.onBeforeCycle!="undefined"){var t=this.onBeforeCycle();if(typeof t!="undefined"&&t===!1)return}var n=e.read(this._r.pc),r=this._decode(n);if(r.op===null||r.args===null)throw this.stop(),new Error("undefined operation code or wrongly defined arguments");typeof this.onBeforeExecute!="undefined"&&this.onBeforeExecute(r),this._i[r.op].apply(this,r.args),this._r.pc+=4,this.acceptInterrupt(),typeof this.onAfterCycle!="undefined"&&this.onAfterCycle()},reset:function(){this._r={r0:0,r1:0,r2:0,r3:0,r4:0,r5:0,r6:0,r7:0,pc:0,sr:0,iif:1}},_instructionMap:{"00000":"MOVE","00001":"OR","00010":"AND","00011":"XOR","00100":"ADD","00101":"ADC","00110":"SUB","00111":"SBC","01000":"ROTL","01001":"ROTR","01010":"SHL","01011":"SHR","01100":"ASHR","01101":"CMP",11e3:"JP",11001:"CALL",11010:"JR",11011:"RET",10110:"LOAD",10111:"STORE",10010:"LOADB",10011:"STOREB",10100:"LOADH",10101:"STOREH",1e4:"POP",10001:"PUSH",11111:"HALT"},_conditionMap:{"0000":"","0001":"_N/M","0010":"_NN/P","0011":"_C/ULT","0100":"_NC/UGE","0101":"_V","0110":"_NV","0111":"_Z/EQ",1e3:"_NZ/NE",1001:"_ULE",1010:"_UGT",1011:"_SLT",1100:"_SLE",1101:"_SGE",1110:"_SGT"}},n={_units:{interrupt:[[],[],[],[]],noninterrupt:[]},sendIack:function(){typeof this._units.interrupt[3][0]!="undefined"&&(this._units.interrupt[3][0].interruptState=0,this._units.interrupt[3][0].onStateChangeInternal())},testInterrupt:function(e){var t=0;for(var n=0;n<this._units.interrupt[e].length;n++)t|=this._units.interrupt[e][n].interruptState;return t},createFriscCtIoUnit:function(e,t){var n=this.createIoUnit(e,t);if(typeof t.frequency=="undefined")throw new Error("FRISC CT unit must be defined with a frequency parameter.");if(t.frequency<1||t.frequency>1e4)throw new Error("FRISC CT unit must have frequency < 10000 and > 0.");return n.frequency=t.frequency,n.onStateChangeInternal=function(e,t){typeof n.onStateChange!="undefined"&&n.onStateChange!==null&&n.onStateChange()},n.determineLocationAndOffset=function(e){return{location:(e-n.memMapAddrStart)/4,offset:e%4}},n.readb=function(e){var t=n.read(e),r=n.determineLocationAndOffset(e);return 255&t>>r.offset*8},n.readw=function(e){var t=n.read(e),r=n.determineLocationAndOffset(e);return 65535&t>>r.offset*8},n.read=function(e){var t=n.determineLocationAndOffset(e);if(t.location===0)return n.dc;if(t.location===1)return n.readyStatus;if(t.location===2||t.location===3)return 0},n.writeb=function(e,t){var r=n.determineLocationAndOffset(e);n.write(e,t<<r.offset*8)},n.writew=function(e,t){var r=n.determineLocationAndOffset(e);n.write(e,t<<r.offset*8)},n.write=function(e,t){var r=n.determineLocationAndOffset(e);r.location===0?(n.lr=65535&t,n.dc=65535&t):r.location===1?(n.cr=t,n.shouldInterrupt=((n.cr&1)!==0)+0,n.shouldCount=((n.cr&2)!==0)+0):r.location===2?(n.readyStatus=0,n.interruptState=0):r.location===3&&(n.shouldEndBeSignaled=0),n.onStateChangeInternal(e,t)},n.init=function(){n.counterThread=setInterval(function(){n.shouldCount===1&&(n.dc-=1,n.dc===0&&(n.dc=n.lr,n.shouldEndBeSignaled===0&&(n.readyStatus=1,n.shouldEndBeSignaled=1,n.shouldInterrupt&&(n.interruptState=1))),n.onStateChangeInternal())},1/n.frequency)},n.reset=function(){for(var e=0;e<n.memMapAddrCount*4;e+=1)n._memory[e]=0;n.interruptState=0,n.readyStatus=0,n.cr=0,n.lr=0,n.dc=0,n.shouldInterrupt=0,n.shouldEndBeSignaled=0,n.shouldCount=0,n.onStateChangeInternal()},n.remove=function(){clearInterval(n.counterThread)},n.reset(),n},createFriscPioIoUnit:function(e,t){var n=this.createIoUnit(e,t);return n.onStateChangeInternal=function(e,t){typeof n.onStateChange!="undefined"&&n.onStateChange!==null&&n.onStateChange()},n.determineLocationAndOffset=function(e){return{location:(e-n.memMapAddrStart)/4,offset:e%4}},n.readb=function(e){var t=n.read(e),r=n.determineLocationAndOffset(e);return 255&t>>r.offset*8},n.readw=function(e){var t=n.read(e),r=n.determineLocationAndOffset(e);return 65535&t>>r.offset*8},n.read=function(e){var t=n.determineLocationAndOffset(e);if(t.location===0)return n.readyStatus;if(t.location===1)return 255&n.dr;if(t.location===2||t.location===3)return 0},n.writeb=function(e,t){var r=n.determineLocationAndOffset(e);n.write(e,t<<r.offset*8)},n.writew=function(e,t){var r=n.determineLocationAndOffset(e);n.write(e,t<<r.offset*8)},n.write=function(e,t){var r=n.determineLocationAndOffset(e);r.location===0?n.maskFollows===1?(n.maskFollows=0,n.mask=t):(n.cr=t,n.isInputMode=((n.cr&1)!==0)+0,n.shouldInterrupt=((n.cr&2)!==0)+0,n.transferMode=((n.cr&4)!==0)+0,n.isInputMode===1&&n.transferMode===1&&(n.maskFollows=((n.cr&8)!==0)+0,n.activeBit=((n.cr&16)!==0)+0,n.andOrOr=((n.cr&32)!==0)+0)):r.location===1?n.dr=255&t:r.location===2?(n.readyStatus=0,n.interruptState=0):r.location===3&&(n.shouldEndBeSignaled=0),n.onStateChangeInternal(e,t)},n.init=function(){n.dataThread=setInterval(function(){if(n.isInputMode===1){if(n.transferMode===0)n.shouldEndBeSignaled===0&&(n.dr=255&parseInt(Math.random()*256),n.readyStatus=1,n.shouldInterrupt===1&&(n.interruptState=1),n.shouldEndBeSignaled=1);else if(n.shouldEndBeSignaled===0){n.dr=255&parseInt(Math.random()*256);var e=n.activeBit===0?255&~dr:dr;n.andOrOr===1?e=(e&n.mask^n.mask)!==0:e=(e&n.mask)!==0,e===!0&&(n.readyStatus=1,n.shouldInterrupt===1&&(n.interruptState=1),n.shouldEndBeSignaled=1)}}else n.isInputMode===0&&n.transferMode===0&&n.shouldEndBeSignaled===0&&(n.readyStatus=1,n.shouldInterrupt===1&&(n.interruptState=1),n.shouldEndBeSignaled=1);n.onStateChangeInternal()},1/n.frequency)},n.reset=function(){n.isInputMode=null,n.shouldInterrupt=0,n.transferMode=0,n.maskFollows=0,n.mask=0,n.activeBit=0,n.andOrOr=0,n.dr=0,n.cr=0,n.readyStatus=0,n.interruptState=0,n.shouldEndBeSignaled=0,n.onStateChangeInternal()},n.remove=function(){clearInterval(n.dataThread)},n.reset(),n},createFriscDmaIoUnit:function(n,r){var i=this.createGenericIoUnit(n,r);return i.onStateChangeInternal=function(e,t){typeof i.onStateChange!="undefined"&&i.onStateChange!==null&&i.onStateChange()},i.determineLocationAndOffset=function(e){return{location:(e-i.memMapAddrStart)/4,offset:e%4}},i.readb=function(e){var t=i.read(e),n=i.determineLocationAndOffset(e);return 255&t>>n.offset*8},i.readw=function(e){var t=i.read(e),n=i.determineLocationAndOffset(e);return 65535&t>>n.offset*8},i.read=function(e){var t=i.determineLocationAndOffset(e);if(t.location===0)return i.srcAddr;if(t.location===1)return i.destAddr;if(t.location===2)return i.counter;if(t.location===3)return i.readyStatus;if(t.location===4)return 0;if(t.location===5)return 0},i.writeb=function(e,t){var n=i.determineLocationAndOffset(e);i.write(e,t<<n.offset*8)},i.writew=function(e,t){var n=i.determineLocationAndOffset(e);i.write(e,t<<n.offset*8)},i.write=function(e,n){var r=i.determineLocationAndOffset(e);if(r.location===0)i.srcAddr=n;else if(r.location===1)i.destAddr=n;else if(r.location===2)i.counter=n;else if(r.location===3)i.cr=n,i.shouldInterrupt=((i.cr&1)!==0)+0,i.transferMode=((i.cr&2)!==0)+0,i.srcType=((i.cr&4)!==0)+0,i.destType=((i.cr&8)!==0)+0;else if(r.location===4)if(i.transferMode===0){while(i.counter>0)i.transferData();i.readyStatus=1,i.shouldInterrupt&&(i.interruptState=1)}else{var s=t._frequency;i.counter>0&&i.transferData(),i.counter===0?(i.readyStatus=1,i.shouldInterrupt&&(i.interruptState=1)):i.counterThread=setInterval(function(){i.counter>0?i.transferData():(i.readyStatus=1,i.shouldInterrupt&&(i.interruptState=1),clearInterval(i.counterThread),i.counterThread=null),i.onStateChangeInternal()},1/s)}else r.location===5&&(i.readyStatus=0,i.interruptState=0);i.onStateChangeInternal(e,n)},i.transferData=function(){var t=e.read(i.srcAddr);e.write(i.destAddr,t),i.srcType===0&&(i.srcAddr+=4),i.destType===0&&(i.destAddr+=4),i.counter-=1},i.init=function(){},i.reset=function(){for(var e=0;e<i.memMapAddrCount*4;e+=1)i._memory[e]=0;i.interruptState=0,i.readyStatus=0,i.counter=0,i.cr=0,i.shouldInterrupt=0,i.transferMode=0,i.srcType=0,i.destType=0,i.srcAddr=0,i.destAddr=0,i.counterThread!==null&&(clearInterval(i.counterThread),i.counterThread=null),i.onStateChangeInternal()},i.remove=function(){},i.reset(),i},createGenericIoUnit:function(e,t){var n=this.createIoUnit(e,t);return n.onStateChangeInternal=function(e,t){typeof n.onStateChange!="undefined"&&n.onStateChange()},n.readb=function(e){return 255&this._memory[e-this.memMapAddrStart]},n.readw=function(e){var t=(255&this._memory[e+0-this.memMapAddrStart])<<0,n=(255&this._memory[e+1-this.memMapAddrStart])<<8;return t+n},n.read=function(e){var t=(255&this._memory[e+0-this.memMapAddrStart])<<0,n=(255&this._memory[e+1-this.memMapAddrStart])<<8,r=(255&this._memory[e+2-this.memMapAddrStart])<<16,i=(255&this._memory[e+3-this.memMapAddrStart])<<24;return t+n+r+i},n.writeb=function(e,t){this._memory[e-this.memMapAddrStart]=255&t,n.onStateChangeInternal(e,t)},n.writew=function(e,t){this._memory[e+0-this.memMapAddrStart]=255&t>>0,this._memory[e+1-this.memMapAddrStart]=255&t>>8,n.onStateChangeInternal(e,t)},n.write=function(e,t){this._memory[e+0-this.memMapAddrStart]=255&t>>0,this._memory[e+1-this.memMapAddrStart]=255&t>>8,this._memory[e+2-this.memMapAddrStart]=255&t>>16,this._memory[e+3-this.memMapAddrStart]=255&t>>24,n.onStateChangeInternal(e,t)},n.init=function(){},n.reset=function(){for(var e=0;e<n.memMapAddrCount*4;e+=1)n._memory[e]=0;n.interruptState