var Y6=31,Z8=0,l8=1,d8=2,a8=3,r8=4,s8=5,uq=6,gq=7,i8=8,m6=9,D6=10,K8=11,U0=12,k0=13,G6=14,_J=15,t8=16,SJ=17;var xq=20,pq=21,mq=22,nq=23,oq=24,cq=25,nZ=26,oZ=27,cZ=28,lZ=29,e8=30,lq=31,dq=2,dZ=0,aZ=1,aq=2,rq=3,rZ=4,sZ=5;var iZ=8,tZ=9,eZ=10,JK=11,qK=12,QK=13;var YK=15;function XK(J){switch(J){case 67:case 68:case 70:case 72:case 73:case 76:case 80:case 83:case 85:case 87:case 88:case 89:case 96:return 0;case 66:return 2;case 55:case 65:case 69:case 71:case 74:case 75:case 78:return 1}return 1}function WK(J){const q=String.fromCharCode(J),Q=qz.get(q);if(Q)return Q;return`unknown code ${q}`}var X8=0,qJ=1,ZK=2;var KK=69;var qz=new Map([["N","Game Pak"],["D","64DD Disk"],["C","Expandable Game: Game Pak Part"],["E","Expandable Game: 64DD Disk Part"],["Z","Aleck64 Game Pak"]]);function $K(J,q,Q){const Y=q.sp_mem.subRegion(4096,4096);J.setControlU64(U0,0x00000000_34000000n),J.setControlU64(t8,0x00000000_7006e463n),J.setControlU64(m6,0x00000000_00005000n),J.setControlU64(k0,0x00000000_0000005cn),J.setControlU64(_J,0x00000000_00000b22n),J.setControlU64(r8,0x00000000_007ffff0n),J.setControlU64(G6,0xffffffff_ffffffffn),J.setControlU64(i8,0xffffffff_ffffffffn),J.setControlU64(e8,0xffffffff_ffffffffn),J.cop1ControlChanged();const Z=0x00000000_00000000n;if(J.setRegU64(0,Z),J.setRegU64(1,Z),J.setRegU64(2,0xffffffff_d1731be9n),J.setRegU64(3,0xffffffff_d1731be9n),J.setRegU64(4,0x00000000_00001be9n),J.setRegU64(5,0xffffffff_f45231e5n),J.setRegU64(6,0xffffffff_a4001f0cn),J.setRegU64(7,0xffffffff_a4001f08n),J.setRegU64(8,0x00000000_000000c0n),J.setRegU64(9,Z),J.setRegU64(10,0x00000000_00000040n),J.setRegU64(11,0xffffffff_a4000040n),J.setRegU64(16,Z),J.setRegU64(17,Z),J.setRegU64(18,Z),J.setRegU64(19,Z),J.setRegU64(20,BigInt(Q.tvType)),J.setRegU64(21,Z),J.setRegU64(23,0x00000000_00000006n),J.setRegU64(24,Z),J.setRegU64(25,0xffffffff_d73f2993n),J.setRegU64(26,Z),J.setRegU64(27,Z),J.setRegU64(28,Z),J.setRegU64(29,0xffffffff_a4001ff0n),J.setRegU64(30,Z),J.setRegU64(31,0xffffffff_a4001554n),Q.tvType==X8){switch(Q.cic){case"6102":J.setRegU64(5,0xffffffff_c0f1d859n),J.setRegU64(14,0x00000000_2de108ean),J.setRegU64(24,Z);break;case"6103":J.setRegU64(5,0xffffffff_d4646273n),J.setRegU64(14,0x00000000_1af99984n),J.setRegU64(24,Z);break;case"6105":J.setRegU64(5,0xffffffff_decaaad1n),J.setRegU64(14,0x00000000_0cf85c13n),J.setRegU64(24,0x00000000_00000002n);break;case"6106":J.setRegU64(5,0xffffffff_b04dc903n),J.setRegU64(14,0x00000000_1af99984n),J.setRegU64(24,0x00000000_00000002n);break;default:break}J.setRegU64(20,Z),J.setRegU64(23,0x00000000_00000006n),J.setRegU64(31,0xffffffff_a4001554n)}else{switch(Q.cic){case"6102":J.setRegU64(5,0xffffffff_c95973d5n),J.setRegU64(14,0x00000000_2449a366n);break;case"6103":J.setRegU64(5,0xffffffff_95315a28n),J.setRegU64(14,0x00000000_5baca1dfn);break;case"6105":J.setRegU64(5,0x00000000_5493fb9an),J.setRegU64(14,0xffffffff_c2c20384n);break;case"6106":J.setRegU64(5,0xffffffff_e067221fn),J.setRegU64(14,0x00000000_5cd2b70fn);break;default:break}J.setRegU64(20,0x00000000_00000001n),J.setRegU64(23,Z),J.setRegU64(24,0x00000000_00000003n),J.setRegU64(31,0xffffffff_a4001550n)}switch(Q.cic){case"6101":J.setRegU64(22,0x00000000_0000003fn);break;case"6102":J.setRegU64(1,0x00000000_00000001n),J.setRegU64(2,0x00000000_0ebda536n),J.setRegU64(3,0x00000000_0ebda536n),J.setRegU64(4,0x00000000_0000a536n),J.setRegU64(12,0xffffffff_ed10d0b3n),J.setRegU64(13,0x00000000_1402a4ccn),J.setRegU64(15,0x00000000_3103e121n),J.setRegU64(22,0x00000000_0000003fn),J.setRegU64(25,0xffffffff_9debb54fn);break;case"6103":J.setRegU64(1,0x00000000_00000001n),J.setRegU64(2,0x00000000_49a5ee96n),J.setRegU64(3,0x00000000_49a5ee96n),J.setRegU64(4,0x00000000_0000ee96n),J.setRegU64(12,0xffffffff_ce9dfbf7n),J.setRegU64(13,0xffffffff_ce9dfbf7n),J.setRegU64(15,0x00000000_18b63d28n),J.setRegU64(22,0x00000000_00000078n),J.setRegU64(25,0xffffffff_825b21c9n);break;case"6105":Y.set32(0,1007534016),Y.set32(4,Q.tvType==X8?3181905916:2376599548),Y.set32(8,632096704),Y.set32(12,822608000),Y.set32(16,1426128892),Y.set32(20,1007534016),Y.set32(24,2376597540),Y.set32(28,1007398912),J.setRegU64(1,Z),J.setRegU64(2,0xffffffff_f58b0fbfn),J.setRegU64(3,0xffffffff_f58b0fbfn),J.setRegU64(4,0x00000000_00000fbfn),J.setRegU64(12,0xffffffff_9651f81en),J.setRegU64(13,0x00000000_2d42aac5n),J.setRegU64(15,0x00000000_56584d60n),J.setRegU64(22,0x00000000_00000091n),J.setRegU64(25,0xffffffff_cdce565fn);break;case"6106":J.setRegU64(1,Z),J.setRegU64(2,0xffffffff_a95930a4n),J.setRegU64(3,0xffffffff_a95930a4n),J.setRegU64(4,0x00000000_000030a4n),J.setRegU64(12,0xffffffff_bcb59510n),J.setRegU64(13,0xffffffff_bcb59510n),J.setRegU64(15,0x00000000_7a3c07f4n),J.setRegU64(22,0x00000000_00000085n),J.setRegU64(25,0x00000000_465e3f72n);break;default:break}J.pc=2751463488}class W8{constructor(){this.buttons=0,this.stick_x=0,this.stick_y=0}}class sq{constructor(){this.inputs=[new W8,new W8,new W8,new W8]}handleKey(J,q,Q){switch(q){case"a":this.setButton(J,4096,Q);break;case"s":this.setButton(J,32768,Q);break;case"x":this.setButton(J,16384,Q);break;case"z":this.setButton(J,8192,Q);break;case"y":this.setButton(J,8192,Q);break;case"c":this.setButton(J,32,Q);break;case"v":this.setButton(J,16,Q);break;case"t":this.setButton(J,2048,Q);break;case"g":this.setButton(J,1024,Q);break;case"f":this.setButton(J,512,Q);break;case"h":this.setButton(J,256,Q);break;case"i":this.setButton(J,8,Q);break;case"k":this.setButton(J,4,Q);break;case"j":this.setButton(J,2,Q);break;case"l":this.setButton(J,1,Q);break;case"ArrowLeft":this.setStickX(J,Q?-80:0);break;case"ArrowRight":this.setStickX(J,Q?80:0);break;case"ArrowDown":this.setStickY(J,Q?-80:0);break;case"ArrowUp":this.setStickY(J,Q?80:0);break}}setStickX(J,q){this.inputs[J].stick_x=q}setStickY(J,q){this.inputs[J].stick_y=q}setButton(J,q,Q){let Y=this.inputs[J].buttons;if(Q)Y|=q;else Y&=~q;this.inputs[J].buttons=Y}}function zK(J,q){v0=J,QJ=q}function HK(){if(v0)v0.html("")}function M(J){if(QJ)J=`${QJ()}: ${J}`;if(console.log(J),v0)v0.append(`${J}
`),v0.scrollTop(v0[0].scrollHeight)}function FK(J){if(QJ)J=`${QJ()}: ${J}`;if(console.warn(J),v0)v0.append(`${J}
`),v0.scrollTop(v0[0].scrollHeight)}function jK(J){if(v0)v0.append(J)}var v0,QJ;function NK(J,q){var Q=J.toString();while(Q.length>>0}let Y=Q.toString(16);if(q){const Z=q>>2;while(Y.length>3&1;let z=((X==1?~q[K]:q[K])&7)%3==1?X:1-X;if(Z==UK){if(q[K]==1||q[K]==9)z=1;if(q[K]==11||q[K]==14)z=0}Z=z==1?UK:VK}}var VK=[4,7,10,7,14,5,14,1,12,15,8,15,6,3,6,9],UK=[4,1,10,7,14,5,14,1,12,9,8,5,6,3,12,9];var CK=function(J,q,Q){let Y=0;for(let Z=0;Z>>7-X&1)^(Y&128?133:0)}for(let Z=8;Z!==0;Z--)Y=Y<<1^(Y&128?133:0);return Y&255},DK=function(J){let q=0;for(let Q=0;Q<16;Q++)q=(q<<1|J>>>15-Q&1)^(q&16?21:0);return q&31};var Yz=5,YJ=64,OK=63,yK=0,Zz=1,Kz=2,Xz=3,Wz=4,$z=5,zz=6,Hz=7,Fz=8,IK=255,jz=0,Nz=253,AK=254,Gz=255,hK=0,iq=1,EK=2,wK=16,Pz=128,Lz=192,kK=1280;var Vz=64,Uz=128;class tq{constructor(J,q){this.hardware=J,this.pifRam=this.hardware.pif_mem.subRegion(1984,64);const Q=new ZJ(q[0]);Q.present=!0,Q.attachControllerPack(J.mempacks[0]),this.channels=[Q,new ZJ(q[1]),new ZJ(q[2]),new ZJ(q[3]),new BK(J)]}get controlByte(){return this.pifRam.getU8(OK)}set controlByte(J){this.pifRam.set8(OK,J)}cpuRead(J){}cpuWrite(J){}dmaWrite(J,q){if(this.pifRam.copy(0,J,q,YJ),this.controlByte&1)this.controlByte&=~1,this.configure()}dmaRead(J,q){if(this.controlByte&2)this.processCICChallenge();else this.execute();J.copy(q,this.pifRam,0,YJ)}processCICChallenge(){const J=new Uint8Array(30),q=new Uint8Array(30);for(let Q=0;Q<15;++Q)J[Q*2+0]=this.pifRam.u8[48+Q]>>>4&15,J[Q*2+1]=this.pifRam.u8[48+Q]>>>0&15;MK(J,q,30);for(let Q=0;Q<15;++Q)this.pifRam.u8[48+Q]=(q[Q*2]<<4)+q[Q*2+1];this.pifRam.u8[46]=0,this.pifRam.u8[47]=0}configure(){for(let Q of this.channels)Q.init();let J=0,q=0;while(J=YJ)break;const Z=Q[1];if(J++,Z==AK)break;const K=Y&63,X=J;J+=K;const W=Z&63,z=J;if(J+=W,J>=YJ)break;const F=this.pifRam.u8.subarray(X,X+K),j=this.pifRam.u8.subarray(z,z+W);this.channels[q].joybusConfigure(Q,K,W,F,j),q++}}execute(){for(let J of this.channels){if(J.reset)continue;if(J.skip)continue;const q=J.frame[0],Q=J.frame[1];if(q&128)continue;if(q&64)continue;const Y=q&63,Z=Q&63,K=J.joybusCommand(Y,Z,J.txBuf,J.rxBuf);if(KZ)J.frame[1]|=Vz}}}class eq{constructor(){this.init()}expectTx(J,q,Q){if(q!=Q)M(`${J}: got tx ${q} but expect ${Q}`)}init(){this.frame=0,this.tx=0,this.rx=0,this.txBuf=null,this.rxBuf=null,this.skip=!0,this.reset=!1}joybusConfigure(J,q,Q,Y,Z){this.frame=J,this.tx=q,this.rx=Q,this.txBuf=Y,this.rxBuf=Z,this.skip=!1}}class ZJ extends eq{constructor(J){super();this.inputs=J,this.present=!1,this.attachment=hK,this.memory=null,this.rumbleActive=!1}attachControllerPack(J){this.attachment=iq,this.memory=J}joybusCommand(J,q,Q,Y){if(!this.present)return 0;const Z=Q[0];switch(Z){case IK:return this.getStatus(J,q,Q,Y);case yK:return this.getStatus(J,q,Q,Y);case Zz:return this.readController(J,q,Q,Y);case Kz:return this.readAccessory(J,q,Q,Y);case Xz:return this.writeAccessory(J,q,Q,Y)}return n64js.halt("Unknown controller command "+Z),0}getStatus(J,q,Q,Y){return this.expectTx("kCmdGetStatus",J,1),Y[0]=kK>>>8,Y[1]=kK&255,Y[2]=this.attachment==hK?2:1,3}readController(J,q,Q,Y){this.expectTx("kCmdControllerRead",J,1);let Z=this.inputs.buttons,K=this.inputs.stick_x,X=this.inputs.stick_y;if(Z6)Z6.sync32(3203395597,"input"),Z=Z6.reflect32(Z),K=Z6.reflect32(K),X=Z6.reflect32(X);return Y[0]=Z>>>8,Y[1]=Z&255,Y[2]=K,Y[3]=X,4}readAccessory(J,q,Q,Y){this.expectTx("kCmdControllerAccessoryRead",J,3);const Z=Q[1]<<8|Q[2]&224;if((Q[2]&31)!=DK(Z))return 0;switch(this.attachment){case iq:const X=this.memory.data;for(let W=0,z=Z;W=49152)this.rumbleActive=Q[3]&1;break;default:return 0}return Y[q-1]=CK(Q,3,J-3),q}}class BK extends eq{constructor(J){super();this.hardware=J}joybusCommand(J,q,Q,Y){const Z=Q[0];switch(Z){case IK:return this.getStatus(J,q,Q,Y);case yK:return this.getStatus(J,q,Q,Y);case Wz:return this.readEeprom(J,q,Q,Y);case $z:return this.writeEeprom(J,q,Q,Y);case zz:return this.rtcStatus(J,q,Q,Y);case Hz:return this.rtcRead(J,q,Q,Y);case Fz:return this.rtcWrite(J,q,Q,Y)}return n64js.halt(`Unknown cartridge command: ${Z}`),0}getEepromID(){switch(this.hardware.saveType){case"Eeprom4k":return Pz;case"Eeprom16k":return Lz}return 0}getEeprom(){switch(this.hardware.saveType){case"Eeprom4k":case"Eeprom16k":return this.hardware.saveMem}return null}getStatus(J,q,Q,Y){this.expectTx("kCmdGetStatus",J,1);const Z=this.getEepromID();if(!Z)return 0;return Y[0]=Z>>>8,Y[1]=Z&255,Y[2]=0,3}readEeprom(J,q,Q,Y){this.expectTx("kCmdEepromRead",J,2);const Z=this.getEeprom();if(!Z)return 0;const K=Q[1]*8;for(let X=0;X>>8,Y[1]=wK&255,Y[2]=0,3}rtcRead(J,q,Q,Y){return n64js.warn("rtc read unhandled"),0}rtcWrite(J,q,Q,Y){return n64js.warn("rtc write unhandled"),0}}function a(J,q){if(!J)throw new RK(q)}class RK{constructor(J){this.message=J}toString(){return"AssertException: "+this.message}}function $8(J){return J>>>26&63}function z8(J){return J>>>16&31}function H8(J){return J&63}function f0(J){return J>>>21&31}function bK(J){return J>>>16&3}function u0(J){return J&63}function P6(J){return J>>>6&31}function J0(J){return J>>>11&31}function K6(J){return J>>>16&31}function q0(J){return(J&65535)<<16>>16}function R0(J){return J>>>6&31}function R(J){return J>>>11&31}function A(J){return J>>>16&31}function D(J){return J>>>21&31}function F8(J){return J&63}function Mz(J){return J&67108863}function L6(J){return J&65535}function b(J){return(J&65535)<<16>>16}function u(J){return J>>>21&31}function C0(J,q){return J+4+q0(q)*4>>>0}function I6(J,q){return(J&4026531840|Mz(q)*4)>>>0}var Oz=function(J){return q0(J)&65535},TK=function(J){return q0(J)<<16>>16},hz=function(J){return SK[H8(J.opcode)](J)},Ez=function(J){return vK[f0(J.opcode)](J)},wz=function(J){switch(a((J.opcode>>>18&7)===0,"cc bit is not 0"),bK(J.opcode)){case 0:return`BC1F !c ? --> ${J.branchAddress}`;case 1:return`BC1T c ? --> ${J.branchAddress}`;case 2:return`BC1FL !c ? --> ${J.branchAddress}`;case 3:return`BC1TL c ? --> ${J.branchAddress}`}return"???"},vJ=function(J,q){var Q=q.toUpperCase();switch(u0(J.opcode)){case 0:return`ADD.${Q} ${J.fd(q)} = ${J.fs(q)} + ${J.ft(q)}`;case 1:return`SUB.${Q} ${J.fd(q)} = ${J.fs(q)} - ${J.ft(q)}`;case 2:return`MUL.${Q} ${J.fd(q)} = ${J.fs(q)} * ${J.ft(q)}`;case 3:return`DIV.${Q} ${J.fd(q)} = ${J.fs(q)} / ${J.ft(q)}`;case 4:return`SQRT.${Q} ${J.fd(q)} = sqrt(${J.fs(q)})`;case 5:return`ABS.${Q} ${J.fd(q)} = abs(${J.fs(q)})`;case 6:return`MOV.${Q} ${J.fd(q)} = ${J.fs(q)}`;case 7:return`NEG.${Q} ${J.fd(q)} = -${J.fs(q)}`;case 8:return`ROUND.L.${Q} ${J.fd("l")} = round.l(${J.fs(q)})`;case 9:return`TRUNC.L.${Q} ${J.fd("l")} = trunc.l(${J.fs(q)})`;case 10:return`CEIL.L.${Q} ${J.fd("l")} = ceil.l(${J.fs(q)})`;case 11:return`FLOOR.L.${Q} ${J.fd("l")} = floor.l(${J.fs(q)})`;case 12:return`ROUND.W.${Q} ${J.fd("w")} = round.w(${J.fs(q)})`;case 13:return`TRUNC.W.${Q} ${J.fd("w")} = trunc.w(${J.fs(q)})`;case 14:return`CEIL.W.${Q} ${J.fd("w")} = ceil.w(${J.fs(q)})`;case 15:return`FLOOR.W.${Q} ${J.fd("w")} = floor.w(${J.fs(q)})`;case 32:return`CVT.S.${Q} ${J.fd("s")} = (s)${J.fs(q)}`;case 33:return`CVT.D.${Q} ${J.fd("d")} = (d)${J.fs(q)}`;case 36:return`CVT.W.${Q} ${J.fd("w")} = (w)${J.fs(q)}`;case 37:return`CVT.L.${Q} ${J.fd("l")} = (l)${J.fs(q)}`;case 48:return`C.F.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 49:return`C.UN.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 50:return`C.EQ.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 51:return`C.UEQ.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 52:return`C.OLT.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 53:return`C.ULT.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 54:return`C.OLE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 55:return`C.ULE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 56:return`C.SF.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 57:return`C.NGLE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 58:return`C.SEQ.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 59:return`C.NGL.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 60:return`C.LT.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 61:return`C.NGE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 62:return`C.LE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 63:return`C.NGT.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`}return`Cop1.${q}${B(u0(J.opcode),8)}?`},kz=function(J){return vJ(J,"s")},Cz=function(J){return vJ(J,"d")},Dz=function(J){return vJ(J,"w")},yz=function(J){return vJ(J,"l")},Iz=function(J){return fK[f0(J.opcode)](J)},Bz=function(J){return f,uK[f0(J.opcode)](J)},Rz=function(J){return gK[f0(J.opcode)](J)},bz=function(J){switch(F8(J.opcode)){case 1:return"TLBR";case 2:return"TLBWI";case 6:return"TLBWR";case 8:return"TLBP";case 24:return"ERET"}return"Unk"},Tz=function(J){return xK[z8(J.opcode)](J)};function fJ(J,q,Q){const Y=new _K(J,q,Q),Z=pK[$8(q)](Y);return{instruction:Y,disassembly:Z,isJumpTarget:!1}}function mK(J,q,Q){const Y=[],Z=new Set;for(let K=J;K${B(J,32)}`;return B(J,32)}makeRegSpan(J){if(this.outputHTML)return`${J}`;return J}makeFPRegSpan(J){const q=J.replace("-",".");if(this.outputHTML)return`${q}`;return q}}var SK=[(J)=>{if(J.opcode===0)return"NOP";return`SLL ${J.rd} = ${J.rt} << ${J.sa}`},(J)=>"Unk",(J)=>`SRL ${J.rd} = ${J.rt} >>> ${J.sa}`,(J)=>`SRA ${J.rd} = ${J.rt} >> ${J.sa}`,(J)=>`SLLV ${J.rd} = ${J.rt} << ${J.rs}`,(J)=>"Unk",(J)=>`SRLV ${J.rd} = ${J.rt} >>> ${J.rs}`,(J)=>`SRAV ${J.rd} = ${J.rt} >> ${J.rs}`,(J)=>`JR ${J.rs}`,(J)=>`JALR ${J.rd}, ${J.rs}`,(J)=>"Unk",(J)=>"Unk",(J)=>`SYSCALL ${B(J.opcode>>6&1048575,20)}`,(J)=>`BREAK ${B(J.opcode>>6&1048575,20)}`,(J)=>"Unk",(J)=>"SYNC",(J)=>`MFHI ${J.rd} = MultHi`,(J)=>`MTHI MultHi = ${J.rs}`,(J)=>`MFLO ${J.rd} = MultLo`,(J)=>`MTLO MultLo = ${J.rs}`,(J)=>`DSLLV ${J.rd} = ${J.rt} << ${J.rs}`,(J)=>"Unk",(J)=>`DSRLV ${J.rd} = ${J.rt} >>> ${J.rs}`,(J)=>`DSRAV ${J.rd} = ${J.rt} >> ${J.rs}`,(J)=>`MULT ${J.rs} * ${J.rt}`,(J)=>`MULTU ${J.rs} * ${J.rt}`,(J)=>`DIV ${J.rs} / ${J.rt}`,(J)=>`DIVU ${J.rs} / ${J.rt}`,(J)=>`DMULT ${J.rs} * ${J.rt}`,(J)=>`DMULTU ${J.rs} * ${J.rt}`,(J)=>`DDIV ${J.rs} / ${J.rt}`,(J)=>`DDIVU ${J.rs} / ${J.rt}`,(J)=>`ADD ${J.rd} = ${J.rs} + ${J.rt}`,(J)=>`ADDU ${J.rd} = ${J.rs} + ${J.rt}`,(J)=>`SUB ${J.rd} = ${J.rs} - ${J.rt}`,(J)=>`SUBU ${J.rd} = ${J.rs} - ${J.rt}`,(J)=>`AND ${J.rd} = ${J.rs} & ${J.rt}`,(J)=>{if(A(J.opcode)===0)if(D(J.opcode)===0)return`CLEAR ${J.rd} = 0`;else return`MOV ${J.rd} = ${J.rs}`;return`OR ${J.rd} = ${J.rs} | ${J.rt}`},(J)=>`XOR ${J.rd} = ${J.rs} ^ ${J.rt}`,(J)=>`NOR ${J.rd} = ~( ${J.rs} | ${J.rt} )`,(J)=>"Unk",(J)=>"Unk",(J)=>`SLT ${J.rd} = ${J.rs} < ${J.rt}`,(J)=>`SLTU ${J.rd} = ${J.rs} < ${J.rt}`,(J)=>`DADD ${J.rd} = ${J.rs} + ${J.rt}`,(J)=>`DADDU ${J.rd} = ${J.rs} + ${J.rt}`,(J)=>`DSUB ${J.rd} = ${J.rs} - ${J.rt}`,(J)=>`DSUBU ${J.rd} = ${J.rs} - ${J.rt}`,(J)=>`TGE trap( ${J.rs} >= ${J.rt} )`,(J)=>`TGEU trap( ${J.rs} >= ${J.rt} )`,(J)=>`TLT trap( ${J.rs} < ${J.rt} )`,(J)=>`TLTU trap( ${J.rs} < ${J.rt} )`,(J)=>`TEQ trap( ${J.rs} == ${J.rt} )`,(J)=>"Unk",(J)=>`TNE trap( ${J.rs} != ${J.rt} )`,(J)=>"Unk",(J)=>`DSLL ${J.rd} = ${J.rt} << ${J.sa}`,(J)=>"Unk",(J)=>`DSRL ${J.rd} = ${J.rt} >>> ${J.sa}`,(J)=>`DSRA ${J.rd} = ${J.rt} >> ${J.sa}`,(J)=>`DSLL32 ${J.rd} = ${J.rt} << (32+${J.sa})`,(J)=>"Unk",(J)=>`DSRL32 ${J.rd} = ${J.rt} >>> (32+${J.sa})`,(J)=>`DSRA32 ${J.rd} = ${J.rt} >> (32+${J.sa})`];if(SK.length!=64)throw"Oops, didn't build the special table correctly";var vK=[(J)=>`MFC0 ${J.rt} <- ${j8[J0(J.opcode)]}`,(J)=>`DMFC0 ${J.rt} <- ${j8[J0(J.opcode)]}`,(J)=>"Unk",(J)=>"Unk",(J)=>`MTC0 ${J.rt} -> ${j8[J0(J.opcode)]}`,(J)=>`DMTC0 ${J.rt} -> ${j8[J0(J.opcode)]}`,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",bz,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk"];if(vK.length!=32)throw"Oops, didn't build the cop0 table correctly";var fK=[(J)=>`MFC1 ${J.rt_d} = ${J.fs()}`,(J)=>`DMFC1 ${J.rt_d} = ${J.fs()}`,(J)=>`CFC1 ${J.rt_d} = CCR${R(J.opcode)}`,(J)=>`DCFC1 ${J.rt_d} = CCR${R(J.opcode)}`,(J)=>`MTC1 ${J.fs_d()} = ${J.rt}`,(J)=>`DMTC1 ${J.fs_d()} = ${J.rt}`,(J)=>`CTC1 CCR${R(J.opcode)} = ${J.rt}`,(J)=>`DCTC1 CCR${R(J.opcode)} = ${J.rt}`,wz,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",kz,Cz,(J)=>"Unk",(J)=>"Unk",Dz,yz,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk"];if(fK.length!=32)throw"Oops, didn't build the cop1 table correctly";var uK=[(J)=>`MFC2 ${J.rt_d} = ${J.fs()}`,(J)=>`DMFC2 ${J.rt_d} = ${J.fs()}`,(J)=>`CFC2 ${J.rt_d} = CCR${R(J.opcode)}`,(J)=>`DCFC2 ${J.rt_d} = CCR${R(J.opcode)}`,(J)=>`MTC2 ${J.fs_d()} = ${J.rt}`,(J)=>`DMTC2 ${J.fs_d()} = ${J.rt}`,(J)=>`CTC2 CCR${R(J.opcode)} = ${J.rt}`,(J)=>`DCTC2 CCR${R(J.opcode)} = ${J.rt}`,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk"];if(uK.length!=32)throw"Oops, didn't build the cop2 table correctly";var gK=[(J)=>`MFC3 ${J.rt_d} = ${J.fs()}`,(J)=>`DMFC3 ${J.rt_d} = ${J.fs()}`,(J)=>`CFC3 ${J.rt_d} = CCR${R(J.opcode)}`,(J)=>`DCFC3 ${J.rt_d} = CCR${R(J.opcode)}`,(J)=>`MTC3 ${J.fs_d()} = ${J.rt}`,(J)=>`DMTC3 ${J.fs_d()} = ${J.rt}`,(J)=>`CTC3 CCR${R(J.opcode)} = ${J.rt}`,(J)=>`DCTC3 CCR${R(J.opcode)} = ${J.rt}`,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk"];if(gK.length!=32)throw"Oops, didn't build the cop3 table correctly";var xK=[(J)=>`BLTZ ${J.rs} < 0 --> ${J.branchAddress}`,(J)=>`BGEZ ${J.rs} >= 0 --> ${J.branchAddress}`,(J)=>`BLTZL ${J.rs} < 0 --> ${J.branchAddress}`,(J)=>`BGEZL ${J.rs} >= 0 --> ${J.branchAddress}`,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>`TGEI ${J.rs} >= ${J.rt} --> trap `,(J)=>`TGEIU ${J.rs} >= ${J.rt} --> trap `,(J)=>`TLTI ${J.rs} < ${J.rt} --> trap `,(J)=>`TLTIU ${J.rs} < ${J.rt} --> trap `,(J)=>`TEQI ${J.rs} == ${J.rt} --> trap `,(J)=>"Unk",(J)=>`TNEI ${J.rs} != ${J.rt} --> trap `,(J)=>"Unk",(J)=>`BLTZAL ${J.rs} < 0 --> ${J.branchAddress}${J.writesRA()}`,(J)=>`BGEZAL ${J.rs} >= 0 --> ${J.branchAddress}${J.writesRA()}`,(J)=>`BLTZALL ${J.rs} < 0 --> ${J.branchAddress}${J.writesRA()}`,(J)=>`BGEZALL ${J.rs} >= 0 --> ${J.branchAddress}${J.writesRA()}`,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk"];if(xK.length!=32)throw"Oops, didn't build the special table correctly";var pK=[hz,Tz,(J)=>`J --> ${J.jumpAddress}`,(J)=>`JAL --> ${J.jumpAddress}${J.writesRA()}`,(J)=>{if(D(J.opcode)==A(J.opcode))return`B --> ${J.branchAddress}`;return`BEQ ${J.rs} == ${J.rt} --> ${J.branchAddress}`},(J)=>`BNE ${J.rs} != ${J.rt} --> ${J.branchAddress}`,(J)=>`BLEZ ${J.rs} <= 0 --> ${J.branchAddress}`,(J)=>`BGTZ ${J.rs} > 0 --> ${J.branchAddress}`,(J)=>`ADDI ${J.rt_d} = ${J.rs} + ${J.imm}`,(J)=>`ADDIU ${J.rt_d} = ${J.rs} + ${J.imm}`,(J)=>`SLTI ${J.rt_d} = (${J.rs} < ${J.imm})`,(J)=>`SLTIU ${J.rt_d} = (${J.rs} < ${J.imm})`,(J)=>`ANDI ${J.rt_d} = ${J.rs} & ${J.imm}`,(J)=>`ORI ${J.rt_d} = ${J.rs} | ${J.imm}`,(J)=>`XORI ${J.rt_d} = ${J.rs} ^ ${J.imm}`,(J)=>`LUI ${J.rt_d} = ${J.imm} << 16`,Ez,Iz,Bz,Rz,(J)=>`BEQL ${J.rs} == ${J.rt} --> ${J.branchAddress}`,(J)=>`BNEL ${J.rs} != ${J.rt} --> ${J.branchAddress}`,(J)=>`BLEZL ${J.rs} <= 0 --> ${J.branchAddress}`,(J)=>`BGTZL ${J.rs} > 0 --> ${J.branchAddress}`,(J)=>`DADDI ${J.rt_d} = ${J.rs} + ${J.imm}`,(J)=>`DADDIU ${J.rt_d} = ${J.rs} + ${J.imm}`,(J)=>`LDL ${J.rt_d} <- ${J.memload()}`,(J)=>`LDR ${J.rt_d} <- ${J.memload()}`,(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>"Unk",(J)=>`LB ${J.rt_d} <- ${J.memload()}`,(J)=>`LH ${J.rt_d} <- ${J.memload()}`,(J)=>`LWL ${J.rt_d} <- ${J.memload()}`,(J)=>`LW ${J.rt_d} <- ${J.memload()}`,(J)=>`LBU ${J.rt_d} <- ${J.memload()}`,(J)=>`LHU ${J.rt_d} <- ${J.memload()}`,(J)=>`LWR ${J.rt_d} <- ${J.memload()}`,(J)=>`LWU ${J.rt_d} <- ${J.memload()}`,(J)=>`SB ${J.rt} -> ${J.memstore()}`,(J)=>`SH ${J.rt} -> ${J.memstore()}`,(J)=>`SWL ${J.rt} -> ${J.memstore()}`,(J)=>`SW ${J.rt} -> ${J.memstore()}`,(J)=>`SDL ${J.rt} -> ${J.memstore()}`,(J)=>`SDR ${J.rt} -> ${J.memstore()}`,(J)=>`SWR ${J.rt} -> ${J.memstore()}`,(J)=>`CACHE ${B(A(J.opcode),8)}, ${J.memaccess()}`,(J)=>`LL ${J.rt_d} <- ${J.memload()}`,(J)=>`LWC1 ${J.ft_d()} <- ${J.memload()}`,(J)=>"Unk",(J)=>"Unk",(J)=>`LLD ${J.rt_d} <- ${J.memload()}`,(J)=>`LDC1 ${J.ft_d()} <- ${J.memload()}`,(J)=>`LDC2 ${J.gt_d} <- ${J.memload()}`,(J)=>`LD ${J.rt_d} <- ${J.memload()}`,(J)=>`SC ${J.rt} -> ${J.memstore()}`,(J)=>`SWC1 ${J.ft()} -> ${J.memstore()}`,(J)=>"BREAKPOINT",(J)=>"Unk",(J)=>`SCD ${J.rt} -> ${J.memstore()}`,(J)=>`SDC1 ${J.ft()} -> ${J.memstore()}`,(J)=>`SDC2 ${J.gt} -> ${J.memstore()}`,(J)=>`SD ${J.rt} -> ${J.memstore()}`];if(pK.length!=64)throw"Oops, didn't build the simple table correctly";var sK=function(J){return J&63},_z=function(J){return J>>>6&31},o6=function(J){return J>>>11&31},gJ=function(J){return J>>>16&31},uJ=function(J){return J>>>21&31},Sz=function(J){return J>>>26&63},nK=function(J){return J>>>21&31},vz=function(J){return J>>>16&31},KJ=function(J){return J>>>7&15},oK=function(J){return(J&127)<<25>>25},cK=function(J){return J>>>21&15},fz=function(J){return J>>>11&31},uz=function(J){return J>>>16&31},gz=function(J){return J>>>11&31},xz=function(J){return J>>>6&31},pz=function(J){return J&67108863},QQ=function(J){return J&65535},mz=function(J){return QQ(J)<<16>>16},lK=function(J){return J>>>21&31},dK=function(J){return QQ(J)<<16>>16},nz=function(J){return J&65535},oz=function(J,q){return J+4+mz(q)*4},cz=function(J,q){return J&4026531840|pz(q)*4},aK=function(J){return B(J,16)},N8=function(J){return J},JH=function(J){return ez[sK(J.opcode)](J)},B6=function(J){return`unknown: ${N(J.opcode)}`};function XJ(J,q){const Q=new iK(J,q),Y=YH[Sz(q)](Q);return{address:J,instruction:Q,disassembly:Y,isJumpTarget:!1}}function xJ(J,q,Q){return ZQ(J,q,q,Q-q)}function ZQ(J,q,Q,Y){const Z=[],K=new Set,X=J.length-1;for(let W=0;W=0?"+":"")+q.toString()}}var rz=(()=>{let J=[];for(let q=0;q<64;q++)J[q]=B6;return J[0]=(q)=>{if(q.opcode===0)return"NOP";return`SLL ${q.rd} = ${q.rt} << ${q.sa}`},J[2]=(q)=>`SRL ${q.rd} = ${q.rt} >>> ${q.sa}`,J[3]=(q)=>`SRA ${q.rd} = ${q.rt} >> ${q.sa}`,J[4]=(q)=>`SLLV ${q.rd} = ${q.rt} << ${q.rs}`,J[6]=(q)=>`SRLV ${q.rd} = ${q.rt} >>> ${q.rs}`,J[7]=(q)=>`SRAV ${q.rd} = ${q.rt} >> ${q.rs}`,J[8]=(q)=>`JR ${q.rs}`,J[9]=(q)=>`JALR ${q.rd}, ${q.rs}`,J[13]=(q)=>`BREAK ${B(q.opcode>>6&1048575,20)}`,J[32]=(q)=>`ADD ${q.rd} = ${q.rs} + ${q.rt}`,J[33]=(q)=>`ADDU ${q.rd} = ${q.rs} + ${q.rt}`,J[34]=(q)=>`SUB ${q.rd} = ${q.rs} - ${q.rt}`,J[35]=(q)=>`SUBU ${q.rd} = ${q.rs} - ${q.rt}`,J[36]=(q)=>`AND ${q.rd} = ${q.rs} & ${q.rt}`,J[37]=(q)=>`OR ${q.rd} = ${q.rs} | ${q.rt}`,J[38]=(q)=>`XOR ${q.rd} = ${q.rs} ^ ${q.rt}`,J[39]=(q)=>`NOR ${q.rd} = ~( ${q.rs} | ${q.rt} )`,J[42]=(q)=>`SLT ${q.rd} = ${q.rs} < ${q.rt}`,J[43]=(q)=>`SLTU ${q.rd} = ${q.rs} < ${q.rt}`,J})(),sz=(()=>{let J=[];for(let q=0;q<32;q++)J.push(B6);return J[0]=(q)=>`BLTZ ${q.rs} < 0 --> ${q.branchAddress}`,J[1]=(q)=>`BGEZ ${q.rs} >= 0 --> ${q.branchAddress}`,J[16]=(q)=>`BLTZAL ${q.rs} < 0 --> ${q.branchAddress}${q.writesRA()}`,J[17]=(q)=>`BGEZAL ${q.rs} >= 0 --> ${q.branchAddress}${q.writesRA()}`,J})(),iz=(()=>{let J=[];for(let q=0;q<32;q++)J.push(B6);return J[0]=(q)=>`MFC0 ${q.rt_d} <- ${q.c0reg}`,J[4]=(q)=>`MTC0 ${q.rt} -> ${q.c0reg}`,J})(),tz=(()=>{let J=[];for(let q=0;q<32;q++)J.push(B6);J[0]=(q)=>`MFC2 ${q.rt_d} = ${o6(q.opcode)}[${KJ(q.opcode)}]`,J[2]=(q)=>`CFC2 ${q.rt_d} = ${q.c2flag}`,J[4]=(q)=>`MTC2 V${o6(q.opcode)}[${KJ(q.opcode)}] = ${q.rt}`,J[6]=(q)=>`CTC2 ${q.c2flag} = ${q.rt}`;for(let q=16;q<32;q++)J[q]=JH;return J})(),ez=(()=>{let J=[];for(let q=0;q<64;q++)J.push(B6);return J[0]=(q)=>`VMULF ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[1]=(q)=>`VMULU ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[2]=(q)=>`VRNDP ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[3]=(q)=>`VMULQ ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[4]=(q)=>`VMUDL ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[5]=(q)=>`VMUDM ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[6]=(q)=>`VMUDN ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[7]=(q)=>`VMUDH ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[8]=(q)=>`VMACF ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[9]=(q)=>`VMACU ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[10]=(q)=>`VRNDN ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[11]=(q)=>`VMACQ ${q.cop2VD}, ACC = oddify(ACC)`,J[12]=(q)=>`VMADL ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[13]=(q)=>`VMADM ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[14]=(q)=>`VMADN ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[15]=(q)=>`VMADH ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[16]=(q)=>`VADD ${q.cop2VD} = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[17]=(q)=>`VSUB ${q.cop2VD} = ${q.cop2VS} - ${q.cop2VT}[${q.cop2VecSelect}]`,J[18]=(q)=>`VSUT ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[19]=(q)=>`VABS ${q.cop2VD} = sign(${q.cop2VS}) * ${q.cop2VT}[${q.cop2VecSelect}]`,J[20]=(q)=>`VADDC ${q.cop2VD} = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[21]=(q)=>`VSUBC ${q.cop2VD} = ${q.cop2VS} - ${q.cop2VT}[${q.cop2VecSelect}]`,J[22]=(q)=>`VADDB ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[23]=(q)=>`VSUBB ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[24]=(q)=>`VACCB ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[25]=(q)=>`VSUCB ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[26]=(q)=>`VSAD ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[27]=(q)=>`VSAC ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[28]=(q)=>`VSUM ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[29]=(q)=>`VSAR ${q.cop2VD}, ${q.cop2VS}, ${q.cop2VT}[${q.cop2E}]`,J[30]=(q)=>`V30 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[31]=(q)=>`V31 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[32]=(q)=>`VLT ${q.cop2VD}, CC = cmpLT(${q.cop2VS}, ${q.cop2VT}[${q.cop2VecSelect}])`,J[33]=(q)=>`VEQ ${q.cop2VD}, CC = cmpEQ(${q.cop2VS}, ${q.cop2VT}[${q.cop2VecSelect}])`,J[34]=(q)=>`VNE ${q.cop2VD}, CC = cmpNE(${q.cop2VS}, ${q.cop2VT}[${q.cop2VecSelect}])`,J[35]=(q)=>`VGE ${q.cop2VD}, CC = cmpGE(${q.cop2VS}, ${q.cop2VT}[${q.cop2VecSelect}])`,J[36]=(q)=>`VCL ${q.cop2VD}, ACC = ${q.cop2VS} clip ${q.cop2VT}[${q.cop2VecSelect}]`,J[37]=(q)=>`VCH ${q.cop2VD}, ACC = ${q.cop2VS} clip ${q.cop2VT}[${q.cop2VecSelect}]`,J[38]=(q)=>`VCR ${q.cop2VD}, ACC = ${q.cop2VS} crimp ${q.cop2VT}[${q.cop2VecSelect}]`,J[39]=(q)=>`VMRG ${q.cop2VD} = VCC ? ${q.cop2VS} : ${q.cop2VT}[${q.cop2VecSelect}]`,J[40]=(q)=>`VAND ${q.cop2VD} = ${q.cop2VS} & ${q.cop2VT}[${q.cop2VecSelect}]`,J[41]=(q)=>`VNAND ${q.cop2VD} = ~(${q.cop2VS} & ${q.cop2VT}[${q.cop2VecSelect}])`,J[42]=(q)=>`VOR ${q.cop2VD} = ${q.cop2VS} | ${q.cop2VT}[${q.cop2VecSelect}]`,J[43]=(q)=>`VNOR ${q.cop2VD} = ~(${q.cop2VS} | ${q.cop2VT}[${q.cop2VecSelect}])`,J[44]=(q)=>`VXOR ${q.cop2VD} = ${q.cop2VS} ^ ${q.cop2VT}[${q.cop2VecSelect}]`,J[45]=(q)=>`VNXOR ${q.cop2VD} = ~(${q.cop2VS} ^ ${q.cop2VT}[${q.cop2VecSelect}])`,J[46]=(q)=>`V46 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[47]=(q)=>`V47 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[48]=(q)=>`VRCP ${q.cop2VD}[${q.cop2DE}] = 1/${q.cop2VT}[${q.cop2VecSelect}]`,J[49]=(q)=>`VRCPL ${q.cop2VD}[${q.cop2DE}] = 1/${q.cop2VT}[${q.cop2VecSelect}]`,J[50]=(q)=>`VRCPH ${q.cop2VD}[${q.cop2DE}], DIVIN = DIVOUT, ${q.cop2VT}[${q.cop2VecSelect}]`,J[51]=(q)=>`VMOV ${q.cop2VD}[${q.cop2DE}] = ${q.cop2VT}[${q.cop2VecSelect}]`,J[52]=(q)=>`VRSQ ${q.cop2VD}[${q.cop2DE}] = 1/sqrt(${q.cop2VT}[${q.cop2VecSelect}])`,J[53]=(q)=>`VRSQL ${q.cop2VD}[${q.cop2DE}] = 1/sqrt(${q.cop2VT}[${q.cop2VecSelect}])`,J[54]=(q)=>`VRSQH ${q.cop2VD}[${q.cop2DE}], DIVIN = DIVOUT, ${q.cop2VT}[${q.cop2VecSelect}]`,J[55]=(q)=>"VNOP",J[56]=(q)=>`VEXTT ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[57]=(q)=>`VEXTQ ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[58]=(q)=>`VEXTN ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[59]=(q)=>`V59 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[60]=(q)=>`VINST ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[61]=(q)=>`VINSQ ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[62]=(q)=>`VINSN ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[63]=(q)=>"VNULL",J})(),qH=(()=>{let J=[];for(let q=0;q<32;q++)J.push(B6);return J[0]=(q)=>`LBV ${q.vmemVT}${q.vmemEls(1)} <- ${q.vmemload(1)}`,J[1]=(q)=>`LSV ${q.vmemVT}${q.vmemEls(2)} <- ${q.vmemload(2)}`,J[2]=(q)=>`LLV ${q.vmemVT}${q.vmemEls(3)} <- ${q.vmemload(4)}`,J[3]=(q)=>`LDV ${q.vmemVT}${q.vmemEls(4)} <- ${q.vmemload(8)}`,J[4]=(q)=>`LQV ${q.vmemVT} <- ${q.vmemload(16)}`,J[5]=(q)=>`LRV ${q.vmemVT} <- ${q.vmemload(16)}`,J[6]=(q)=>`LPV ${q.vmemVT} <- ${q.vmemload(8)}`,J[7]=(q)=>`LUV ${q.vmemVT} <- ${q.vmemload(8)}`,J[8]=(q)=>`LHV ${q.vmemVT} <- ${q.vmemload(16)}`,J[9]=(q)=>`LFV ${q.vmemVT} <- ${q.vmemload(16)}`,J[10]=(q)=>`LWV ${q.vmemVT} <- ${q.vmemload(16)}`,J[11]=(q)=>`LTV ${q.vmemVT} <- ${q.vmemload(16)}`,J})(),QH=(()=>{let J=[];for(let q=0;q<32;q++)J.push(B6);return J[0]=(q)=>`SBV ${q.vmemVT}${q.vmemEls(1)} -> ${q.vmemstore(1)}`,J[1]=(q)=>`SSV ${q.vmemVT}${q.vmemEls(2)} -> ${q.vmemstore(2)}`,J[2]=(q)=>`SLV ${q.vmemVT}${q.vmemEls(4)} -> ${q.vmemstore(4)}`,J[3]=(q)=>`SDV ${q.vmemVT}${q.vmemEls(8)} -> ${q.vmemstore(8)}`,J[4]=(q)=>`SQV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[5]=(q)=>`SRV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[6]=(q)=>`SPV ${q.vmemVT} -> ${q.vmemstore(8)}`,J[7]=(q)=>`SUV ${q.vmemVT} -> ${q.vmemstore(8)}`,J[8]=(q)=>`SHV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[9]=(q)=>`SFV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[10]=(q)=>`SWV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[11]=(q)=>`STV ${q.vmemVT} -> ${q.vmemstore(16)}`,J})(),YH=(()=>{let J=[];for(let q=0;q<64;q++)J.push(B6);return J[0]=(q)=>rz[sK(q.opcode)](q),J[1]=(q)=>sz[gJ(q.opcode)](q),J[2]=(q)=>`J --> ${q.jumpAddress}`,J[3]=(q)=>`JAL --> ${q.jumpAddress}${q.writesRA()}`,J[4]=(q)=>{if(uJ(q.opcode)==gJ(q.opcode))return`B --> ${q.branchAddress}`;return`BEQ ${q.rs} == ${q.rt} --> ${q.branchAddress}`},J[5]=(q)=>`BNE ${q.rs} != ${q.rt} --> ${q.branchAddress}`,J[6]=(q)=>`BLEZ ${q.rs} <= 0 --> ${q.branchAddress}`,J[7]=(q)=>`BGTZ ${q.rs} > 0 --> ${q.branchAddress}`,J[8]=(q)=>`ADDI ${q.rt_d} = ${q.rs} + ${q.imm}`,J[9]=(q)=>`ADDIU ${q.rt_d} = ${q.rs} + ${q.imm}`,J[10]=(q)=>`SLTI ${q.rt_d} = (${q.rs} < ${q.imm})`,J[11]=(q)=>`SLTIU ${q.rt_d} = (${q.rs} < ${q.imm})`,J[12]=(q)=>`ANDI ${q.rt_d} = ${q.rs} & ${q.imm}`,J[13]=(q)=>`ORI ${q.rt_d} = ${q.rs} | ${q.imm}`,J[14]=(q)=>`XORI ${q.rt_d} = ${q.rs} ^ ${q.imm}`,J[15]=(q)=>`LUI ${q.rt_d} = ${q.imm} << 16`,J[16]=(q)=>iz[uJ(q.opcode)](q),J[18]=(q)=>tz[uJ(q.opcode)](q),J[32]=(q)=>`LB ${q.rt_d} <- ${q.memload()}`,J[33]=(q)=>`LH ${q.rt_d} <- ${q.memload()}`,J[35]=(q)=>`LW ${q.rt_d} <- ${q.memload()}`,J[36]=(q)=>`LBU ${q.rt_d} <- ${q.memload()}`,J[37]=(q)=>`LHU ${q.rt_d} <- ${q.memload()}`,J[39]=(q)=>`LWU ${q.rt_d} <- ${q.memload()}`,J[40]=(q)=>`SB ${q.rt} -> ${q.memstore()}`,J[41]=(q)=>`SH ${q.rt} -> ${q.memstore()}`,J[43]=(q)=>`SW ${q.rt} -> ${q.memstore()}`,J[50]=(q)=>qH[o6(q.opcode)](q),J[58]=(q)=>QH[o6(q.opcode)](q),J})();var KQ=function(J){let q,Q;if(q=J.match(/(#|0x)?([a-f0-9]{6})/i))Q=q[2];else if(q=J.match(/rgb\(\s*(\d*)\s*,\s*(\d*)\s*,\s*(\d*)\s*\)/))Q=parseInt(q[1]).toString(16).padStart(2,0)+parseInt(q[2]).toString(16).padStart(2,0)+parseInt(q[3]).toString(16).padStart(2,0);else if(q=J.match(/^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i))Q=q[1]+q[1]+q[2]+q[2]+q[3]+q[3];if(Q)return"#"+Q;return!1},$H=function(J){return WH.find((q)=>q.match(J))},HH=function(J){const q=document.createElement("style");q.innerHTML=J;const Q=document.querySelector("head link[rel=stylesheet], head style");if(Q)document.head.insertBefore(q,Q);else document.head.appendChild(q)};class X6{constructor(J,q,Q,Y,Z="div"){this.parent=J,this.object=q,this.property=Q,this._disabled=!1,this._hidden=!1,this.initialValue=this.getValue(),this.domElement=document.createElement("div"),this.domElement.classList.add("controller"),this.domElement.classList.add(Y),this.$name=document.createElement("div"),this.$name.classList.add("name"),X6.nextNameID=X6.nextNameID||0,this.$name.id=`lil-gui-name-${++X6.nextNameID}`,this.$widget=document.createElement(Z),this.$widget.classList.add("widget"),this.$disable=this.$widget,this.domElement.appendChild(this.$name),this.domElement.appendChild(this.$widget),this.domElement.addEventListener("keydown",(K)=>K.stopPropagation()),this.domElement.addEventListener("keyup",(K)=>K.stopPropagation()),this.parent.children.push(this),this.parent.controllers.push(this),this.parent.$children.appendChild(this.domElement),this._listenCallback=this._listenCallback.bind(this),this.name(Q)}name(J){return this._name=J,this.$name.innerHTML=J,this}onChange(J){return this._onChange=J,this}_callOnChange(){if(this.parent._callOnChange(this),this._onChange!==void 0)this._onChange.call(this,this.getValue());this._changed=!0}onFinishChange(J){return this._onFinishChange=J,this}_callOnFinishChange(){if(this._changed){if(this.parent._callOnFinishChange(this),this._onFinishChange!==void 0)this._onFinishChange.call(this,this.getValue())}this._changed=!1}reset(){return this.setValue(this.initialValue),this._callOnFinishChange(),this}enable(J=!0){return this.disable(!J)}disable(J=!0){if(J===this._disabled)return this;return this._disabled=J,this.domElement.classList.toggle("disabled",J),this.$disable.toggleAttribute("disabled",J),this}show(J=!0){return this._hidden=!J,this.domElement.style.display=this._hidden?"none":"",this}hide(){return this.show(!1)}options(J){const q=this.parent.add(this.object,this.property,J);return q.name(this._name),this.destroy(),q}min(J){return this}max(J){return this}step(J){return this}decimals(J){return this}listen(J=!0){if(this._listening=J,this._listenCallbackID!==void 0)cancelAnimationFrame(this._listenCallbackID),this._listenCallbackID=void 0;if(this._listening)this._listenCallback();return this}_listenCallback(){this._listenCallbackID=requestAnimationFrame(this._listenCallback);const J=this.save();if(J!==this._listenPrevValue)this.updateDisplay();this._listenPrevValue=J}getValue(){return this.object[this.property]}setValue(J){return this.object[this.property]=J,this._callOnChange(),this.updateDisplay(),this}updateDisplay(){return this}load(J){return this.setValue(J),this._callOnFinishChange(),this}save(){return this.getValue()}destroy(){this.listen(!1),this.parent.children.splice(this.parent.children.indexOf(this),1),this.parent.controllers.splice(this.parent.controllers.indexOf(this),1),this.parent.$children.removeChild(this.domElement)}}class qX extends X6{constructor(J,q,Q){super(J,q,Q,"boolean","label");this.$input=document.createElement("input"),this.$input.setAttribute("type","checkbox"),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$widget.appendChild(this.$input),this.$input.addEventListener("change",()=>{this.setValue(this.$input.checked),this._callOnFinishChange()}),this.$disable=this.$input,this.updateDisplay()}updateDisplay(){return this.$input.checked=this.getValue(),this}}var ZH={isPrimitive:!0,match:(J)=>typeof J==="string",fromHexString:KQ,toHexString:KQ},WJ={isPrimitive:!0,match:(J)=>typeof J==="number",fromHexString:(J)=>parseInt(J.substring(1),16),toHexString:(J)=>"#"+J.toString(16).padStart(6,0)},KH={isPrimitive:!1,match:(J)=>Array.isArray(J),fromHexString(J,q,Q=1){const Y=WJ.fromHexString(J);q[0]=(Y>>16&255)/255*Q,q[1]=(Y>>8&255)/255*Q,q[2]=(Y&255)/255*Q},toHexString([J,q,Q],Y=1){Y=255/Y;const Z=J*Y<<16^q*Y<<8^Q*Y<<0;return WJ.toHexString(Z)}},XH={isPrimitive:!1,match:(J)=>Object(J)===J,fromHexString(J,q,Q=1){const Y=WJ.fromHexString(J);q.r=(Y>>16&255)/255*Q,q.g=(Y>>8&255)/255*Q,q.b=(Y&255)/255*Q},toHexString({r:J,g:q,b:Q},Y=1){Y=255/Y;const Z=J*Y<<16^q*Y<<8^Q*Y<<0;return WJ.toHexString(Z)}},WH=[ZH,WJ,KH,XH];class QX extends X6{constructor(J,q,Q,Y){super(J,q,Q,"color");this.$input=document.createElement("input"),this.$input.setAttribute("type","color"),this.$input.setAttribute("tabindex",-1),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$text=document.createElement("input"),this.$text.setAttribute("type","text"),this.$text.setAttribute("spellcheck","false"),this.$text.setAttribute("aria-labelledby",this.$name.id),this.$display=document.createElement("div"),this.$display.classList.add("display"),this.$display.appendChild(this.$input),this.$widget.appendChild(this.$display),this.$widget.appendChild(this.$text),this._format=$H(this.initialValue),this._rgbScale=Y,this._initialValueHexString=this.save(),this._textFocused=!1,this.$input.addEventListener("input",()=>{this._setValueFromHexString(this.$input.value)}),this.$input.addEventListener("blur",()=>{this._callOnFinishChange()}),this.$text.addEventListener("input",()=>{const Z=KQ(this.$text.value);if(Z)this._setValueFromHexString(Z)}),this.$text.addEventListener("focus",()=>{this._textFocused=!0,this.$text.select()}),this.$text.addEventListener("blur",()=>{this._textFocused=!1,this.updateDisplay(),this._callOnFinishChange()}),this.$disable=this.$text,this.updateDisplay()}reset(){return this._setValueFromHexString(this._initialValueHexString),this}_setValueFromHexString(J){if(this._format.isPrimitive){const q=this._format.fromHexString(J);this.setValue(q)}else this._format.fromHexString(J,this.getValue(),this._rgbScale),this._callOnChange(),this.updateDisplay()}save(){return this._format.toHexString(this.getValue(),this._rgbScale)}load(J){return this._setValueFromHexString(J),this._callOnFinishChange(),this}updateDisplay(){if(this.$input.value=this._format.toHexString(this.getValue(),this._rgbScale),!this._textFocused)this.$text.value=this.$input.value.substring(1);return this.$display.style.backgroundColor=this.$input.value,this}}class pJ extends X6{constructor(J,q,Q){super(J,q,Q,"function");this.$button=document.createElement("button"),this.$button.appendChild(this.$name),this.$widget.appendChild(this.$button),this.$button.addEventListener("click",(Y)=>{Y.preventDefault(),this.getValue().call(this.object),this._callOnChange()}),this.$button.addEventListener("touchstart",()=>{},{passive:!0}),this.$disable=this.$button}}class YX extends X6{constructor(J,q,Q,Y,Z,K){super(J,q,Q,"number");this._initInput(),this.min(Y),this.max(Z);const X=K!==void 0;this.step(X?K:this._getImplicitStep(),X),this.updateDisplay()}decimals(J){return this._decimals=J,this.updateDisplay(),this}min(J){return this._min=J,this._onUpdateMinMax(),this}max(J){return this._max=J,this._onUpdateMinMax(),this}step(J,q=!0){return this._step=J,this._stepExplicit=q,this}updateDisplay(){const J=this.getValue();if(this._hasSlider){let q=(J-this._min)/(this._max-this._min);q=Math.max(0,Math.min(q,1)),this.$fill.style.width=q*100+"%"}if(!this._inputFocused)this.$input.value=this._decimals===void 0?J:J.toFixed(this._decimals);return this}_initInput(){if(this.$input=document.createElement("input"),this.$input.setAttribute("type","text"),this.$input.setAttribute("aria-labelledby",this.$name.id),window.matchMedia("(pointer: coarse)").matches)this.$input.setAttribute("type","number"),this.$input.setAttribute("step","any");this.$widget.appendChild(this.$input),this.$disable=this.$input;const q=()=>{let w=parseFloat(this.$input.value);if(isNaN(w))return;if(this._stepExplicit)w=this._snap(w);this.setValue(this._clamp(w))},Q=(w)=>{const y=parseFloat(this.$input.value);if(isNaN(y))return;this._snapClampSetValue(y+w),this.$input.value=this.getValue()},Y=(w)=>{if(w.key==="Enter")this.$input.blur();if(w.code==="ArrowUp")w.preventDefault(),Q(this._step*this._arrowKeyMultiplier(w));if(w.code==="ArrowDown")w.preventDefault(),Q(this._step*this._arrowKeyMultiplier(w)*-1)},Z=(w)=>{if(this._inputFocused)w.preventDefault(),Q(this._step*this._normalizeMouseWheel(w))};let K=!1,X,W,z,F,j;const G=5,P=(w)=>{X=w.clientX,W=z=w.clientY,K=!0,F=this.getValue(),j=0,window.addEventListener("mousemove",L),window.addEventListener("mouseup",U)},L=(w)=>{if(K){const y=w.clientX-X,S=w.clientY-W;if(Math.abs(S)>G)w.preventDefault(),this.$input.blur(),K=!1,this._setDraggingStyle(!0,"vertical");else if(Math.abs(y)>G)U()}if(!K){const y=w.clientY-z;if(j-=y*this._step*this._arrowKeyMultiplier(w),F+j>this._max)j=this._max-F;else if(F+j{this._setDraggingStyle(!1,"vertical"),this._callOnFinishChange(),window.removeEventListener("mousemove",L),window.removeEventListener("mouseup",U)},O=()=>{this._inputFocused=!0},E=()=>{this._inputFocused=!1,this.updateDisplay(),this._callOnFinishChange()};this.$input.addEventListener("input",q),this.$input.addEventListener("keydown",Y),this.$input.addEventListener("wheel",Z,{passive:!1}),this.$input.addEventListener("mousedown",P),this.$input.addEventListener("focus",O),this.$input.addEventListener("blur",E)}_initSlider(){this._hasSlider=!0,this.$slider=document.createElement("div"),this.$slider.classList.add("slider"),this.$fill=document.createElement("div"),this.$fill.classList.add("fill"),this.$slider.appendChild(this.$fill),this.$widget.insertBefore(this.$slider,this.$input),this.domElement.classList.add("hasSlider");const J=(E,w,y,S,g)=>{return(E-w)/(y-w)*(g-S)+S},q=(E)=>{const w=this.$slider.getBoundingClientRect();let y=J(E,w.left,w.right,this._min,this._max);this._snapClampSetValue(y)},Q=(E)=>{this._setDraggingStyle(!0),q(E.clientX),window.addEventListener("mousemove",Y),window.addEventListener("mouseup",Z)},Y=(E)=>{q(E.clientX)},Z=()=>{this._callOnFinishChange(),this._setDraggingStyle(!1),window.removeEventListener("mousemove",Y),window.removeEventListener("mouseup",Z)};let K=!1,X,W;const z=(E)=>{E.preventDefault(),this._setDraggingStyle(!0),q(E.touches[0].clientX),K=!1},F=(E)=>{if(E.touches.length>1)return;if(this._hasScrollBar)X=E.touches[0].clientX,W=E.touches[0].clientY,K=!0;else z(E);window.addEventListener("touchmove",j,{passive:!1}),window.addEventListener("touchend",G)},j=(E)=>{if(K){const w=E.touches[0].clientX-X,y=E.touches[0].clientY-W;if(Math.abs(w)>Math.abs(y))z(E);else window.removeEventListener("touchmove",j),window.removeEventListener("touchend",G)}else E.preventDefault(),q(E.touches[0].clientX)},G=()=>{this._callOnFinishChange(),this._setDraggingStyle(!1),window.removeEventListener("touchmove",j),window.removeEventListener("touchend",G)},P=this._callOnFinishChange.bind(this),L=400;let U;const O=(E)=>{if(Math.abs(E.deltaX)this._max)J=this._max;return J}_snapClampSetValue(J){this.setValue(this._clamp(this._snap(J)))}get _hasScrollBar(){const J=this.parent.root.$children;return J.scrollHeight>J.clientHeight}get _hasMin(){return this._min!==void 0}get _hasMax(){return this._max!==void 0}}class ZX extends X6{constructor(J,q,Q,Y){super(J,q,Q,"option");this.$select=document.createElement("select"),this.$select.setAttribute("aria-labelledby",this.$name.id),this.$display=document.createElement("div"),this.$display.classList.add("display"),this._values=Array.isArray(Y)?Y:Object.values(Y),this._names=Array.isArray(Y)?Y:Object.keys(Y),this._names.forEach((Z)=>{const K=document.createElement("option");K.innerHTML=Z,this.$select.appendChild(K)}),this.$select.addEventListener("change",()=>{this.setValue(this._values[this.$select.selectedIndex]),this._callOnFinishChange()}),this.$select.addEventListener("focus",()=>{this.$display.classList.add("focus")}),this.$select.addEventListener("blur",()=>{this.$display.classList.remove("focus")}),this.$widget.appendChild(this.$select),this.$widget.appendChild(this.$display),this.$disable=this.$select,this.updateDisplay()}updateDisplay(){const J=this.getValue(),q=this._values.indexOf(J);return this.$select.selectedIndex=q,this.$display.innerHTML=q===-1?J:this._names[q],this}}class KX extends X6{constructor(J,q,Q){super(J,q,Q,"string");this.$input=document.createElement("input"),this.$input.setAttribute("type","text"),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$input.addEventListener("input",()=>{this.setValue(this.$input.value)}),this.$input.addEventListener("keydown",(Y)=>{if(Y.code==="Enter")this.$input.blur()}),this.$input.addEventListener("blur",()=>{this._callOnFinishChange()}),this.$widget.appendChild(this.$input),this.$disable=this.$input,this.updateDisplay()}updateDisplay(){return this.$input.value=this.getValue(),this}}var zH=`.lil-gui { font-family: var(--font-family); font-size: var(--font-size); line-height: 1; font-weight: normal; font-style: normal; text-align: left; background-color: var(--background-color); color: var(--text-color); user-select: none; -webkit-user-select: none; touch-action: manipulation; --background-color: #1f1f1f; --text-color: #ebebeb; --title-background-color: #111111; --title-text-color: #ebebeb; --widget-color: #424242; --hover-color: #4f4f4f; --focus-color: #595959; --number-color: #2cc9ff; --string-color: #a2db3c; --font-size: 11px; --input-font-size: 11px; --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace; --padding: 4px; --spacing: 4px; --widget-height: 20px; --title-height: calc(var(--widget-height) + var(--spacing) * 1.25); --name-width: 45%; --slider-knob-width: 2px; --slider-input-width: 27%; --color-input-width: 27%; --slider-input-min-width: 45px; --color-input-min-width: 45px; --folder-indent: 7px; --widget-padding: 0 0 0 3px; --widget-border-radius: 2px; --checkbox-size: calc(0.75 * var(--widget-height)); --scrollbar-width: 5px; } .lil-gui, .lil-gui * { box-sizing: border-box; margin: 0; padding: 0; } .lil-gui.root { width: var(--width, 245px); display: flex; flex-direction: column; } .lil-gui.root > .title { background: var(--title-background-color); color: var(--title-text-color); } .lil-gui.root > .children { overflow-x: hidden; overflow-y: auto; } .lil-gui.root > .children::-webkit-scrollbar { width: var(--scrollbar-width); height: var(--scrollbar-width); background: var(--background-color); } .lil-gui.root > .children::-webkit-scrollbar-thumb { border-radius: var(--scrollbar-width); background: var(--focus-color); } @media (pointer: coarse) { .lil-gui.allow-touch-styles, .lil-gui.allow-touch-styles .lil-gui { --widget-height: 28px; --padding: 6px; --spacing: 6px; --font-size: 13px; --input-font-size: 16px; --folder-indent: 10px; --scrollbar-width: 7px; --slider-input-min-width: 50px; --color-input-min-width: 65px; } } .lil-gui.force-touch-styles, .lil-gui.force-touch-styles .lil-gui { --widget-height: 28px; --padding: 6px; --spacing: 6px; --font-size: 13px; --input-font-size: 16px; --folder-indent: 10px; --scrollbar-width: 7px; --slider-input-min-width: 50px; --color-input-min-width: 65px; } .lil-gui.autoPlace { max-height: 100%; position: fixed; top: 0; right: 15px; z-index: 1001; } .lil-gui .controller { display: flex; align-items: center; padding: 0 var(--padding); margin: var(--spacing) 0; } .lil-gui .controller.disabled { opacity: 0.5; } .lil-gui .controller.disabled, .lil-gui .controller.disabled * { pointer-events: none !important; } .lil-gui .controller > .name { min-width: var(--name-width); flex-shrink: 0; white-space: pre; padding-right: var(--spacing); line-height: var(--widget-height); } .lil-gui .controller .widget { position: relative; display: flex; align-items: center; width: 100%; min-height: var(--widget-height); } .lil-gui .controller.string input { color: var(--string-color); } .lil-gui .controller.boolean .widget { cursor: pointer; } .lil-gui .controller.color .display { width: 100%; height: var(--widget-height); border-radius: var(--widget-border-radius); position: relative; } @media (hover: hover) { .lil-gui .controller.color .display:hover:before { content: " "; display: block; position: absolute; border-radius: var(--widget-border-radius); border: 1px solid #fff9; top: 0; right: 0; bottom: 0; left: 0; } } .lil-gui .controller.color input[type=color] { opacity: 0; width: 100%; height: 100%; cursor: pointer; } .lil-gui .controller.color input[type=text] { margin-left: var(--spacing); font-family: var(--font-family-mono); min-width: var(--color-input-min-width); width: var(--color-input-width); flex-shrink: 0; } .lil-gui .controller.option select { opacity: 0; position: absolute; width: 100%; max-width: 100%; } .lil-gui .controller.option .display { position: relative; pointer-events: none; border-radius: var(--widget-border-radius); height: var(--widget-height); line-height: var(--widget-height); max-width: 100%; overflow: hidden; word-break: break-all; padding-left: 0.55em; padding-right: 1.75em; background: var(--widget-color); } @media (hover: hover) { .lil-gui .controller.option .display.focus { background: var(--focus-color); } } .lil-gui .controller.option .display.active { background: var(--focus-color); } .lil-gui .controller.option .display:after { font-family: "lil-gui"; content: "\u2195"; position: absolute; top: 0; right: 0; bottom: 0; padding-right: 0.375em; } .lil-gui .controller.option .widget, .lil-gui .controller.option select { cursor: pointer; } @media (hover: hover) { .lil-gui .controller.option .widget:hover .display { background: var(--hover-color); } } .lil-gui .controller.number input { color: var(--number-color); } .lil-gui .controller.number.hasSlider input { margin-left: var(--spacing); width: var(--slider-input-width); min-width: var(--slider-input-min-width); flex-shrink: 0; } .lil-gui .controller.number .slider { width: 100%; height: var(--widget-height); background-color: var(--widget-color); border-radius: var(--widget-border-radius); padding-right: var(--slider-knob-width); overflow: hidden; cursor: ew-resize; touch-action: pan-y; } @media (hover: hover) { .lil-gui .controller.number .slider:hover { background-color: var(--hover-color); } } .lil-gui .controller.number .slider.active { background-color: var(--focus-color); } .lil-gui .controller.number .slider.active .fill { opacity: 0.95; } .lil-gui .controller.number .fill { height: 100%; border-right: var(--slider-knob-width) solid var(--number-color); box-sizing: content-box; } .lil-gui-dragging .lil-gui { --hover-color: var(--widget-color); } .lil-gui-dragging * { cursor: ew-resize !important; } .lil-gui-dragging.lil-gui-vertical * { cursor: ns-resize !important; } .lil-gui .title { height: var(--title-height); line-height: calc(var(--title-height) - 4px); font-weight: 600; padding: 0 var(--padding); -webkit-tap-highlight-color: transparent; cursor: pointer; outline: none; text-decoration-skip: objects; } .lil-gui .title:before { font-family: "lil-gui"; content: "\u25BE"; padding-right: 2px; display: inline-block; } .lil-gui .title:active { background: var(--title-background-color); opacity: 0.75; } @media (hover: hover) { body:not(.lil-gui-dragging) .lil-gui .title:hover { background: var(--title-background-color); opacity: 0.85; } .lil-gui .title:focus { text-decoration: underline var(--focus-color); } } .lil-gui.root > .title:focus { text-decoration: none !important; } .lil-gui.closed > .title:before { content: "\u25B8"; } .lil-gui.closed > .children { transform: translateY(-7px); opacity: 0; } .lil-gui.closed:not(.transition) > .children { display: none; } .lil-gui.transition > .children { transition-duration: 300ms; transition-property: height, opacity, transform; transition-timing-function: cubic-bezier(0.2, 0.6, 0.35, 1); overflow: hidden; pointer-events: none; } .lil-gui .children:empty:before { content: "Empty"; padding: 0 var(--padding); margin: var(--spacing) 0; display: block; height: var(--widget-height); font-style: italic; line-height: var(--widget-height); opacity: 0.5; } .lil-gui.root > .children > .lil-gui > .title { border: 0 solid var(--widget-color); border-width: 1px 0; transition: border-color 300ms; } .lil-gui.root > .children > .lil-gui.closed > .title { border-bottom-color: transparent; } .lil-gui + .controller { border-top: 1px solid var(--widget-color); margin-top: 0; padding-top: var(--spacing); } .lil-gui .lil-gui .lil-gui > .title { border: none; } .lil-gui .lil-gui .lil-gui > .children { border: none; margin-left: var(--folder-indent); border-left: 2px solid var(--widget-color); } .lil-gui .lil-gui .controller { border: none; } .lil-gui input { -webkit-tap-highlight-color: transparent; border: 0; outline: none; font-family: var(--font-family); font-size: var(--input-font-size); border-radius: var(--widget-border-radius); height: var(--widget-height); background: var(--widget-color); color: var(--text-color); width: 100%; } @media (hover: hover) { .lil-gui input:hover { background: var(--hover-color); } .lil-gui input:active { background: var(--focus-color); } } .lil-gui input:disabled { opacity: 1; } .lil-gui input[type=text], .lil-gui input[type=number] { padding: var(--widget-padding); } .lil-gui input[type=text]:focus, .lil-gui input[type=number]:focus { background: var(--focus-color); } .lil-gui input::-webkit-outer-spin-button, .lil-gui input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } .lil-gui input[type=number] { -moz-appearance: textfield; } .lil-gui input[type=checkbox] { appearance: none; -webkit-appearance: none; height: var(--checkbox-size); width: var(--checkbox-size); border-radius: var(--widget-border-radius); text-align: center; cursor: pointer; } .lil-gui input[type=checkbox]:checked:before { font-family: "lil-gui"; content: "\u2713"; font-size: var(--checkbox-size); line-height: var(--checkbox-size); } @media (hover: hover) { .lil-gui input[type=checkbox]:focus { box-shadow: inset 0 0 0 1px var(--focus-color); } } .lil-gui button { -webkit-tap-highlight-color: transparent; outline: none; cursor: pointer; font-family: var(--font-family); font-size: var(--font-size); color: var(--text-color); width: 100%; height: var(--widget-height); text-transform: none; background: var(--widget-color); border-radius: var(--widget-border-radius); border: 1px solid var(--widget-color); text-align: center; line-height: calc(var(--widget-height) - 4px); } @media (hover: hover) { .lil-gui button:hover { background: var(--hover-color); border-color: var(--hover-color); } .lil-gui button:focus { border-color: var(--focus-color); } } .lil-gui button:active { background: var(--focus-color); } @font-face { font-family: "lil-gui"; src: url("data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUsAAsAAAAACJwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAH4AAADAImwmYE9TLzIAAAGIAAAAPwAAAGBKqH5SY21hcAAAAcgAAAD0AAACrukyyJBnbHlmAAACvAAAAF8AAACEIZpWH2hlYWQAAAMcAAAAJwAAADZfcj2zaGhlYQAAA0QAAAAYAAAAJAC5AHhobXR4AAADXAAAABAAAABMAZAAAGxvY2EAAANsAAAAFAAAACgCEgIybWF4cAAAA4AAAAAeAAAAIAEfABJuYW1lAAADoAAAASIAAAIK9SUU/XBvc3QAAATEAAAAZgAAAJCTcMc2eJxVjbEOgjAURU+hFRBK1dGRL+ALnAiToyMLEzFpnPz/eAshwSa97517c/MwwJmeB9kwPl+0cf5+uGPZXsqPu4nvZabcSZldZ6kfyWnomFY/eScKqZNWupKJO6kXN3K9uCVoL7iInPr1X5baXs3tjuMqCtzEuagm/AAlzQgPAAB4nGNgYRBlnMDAysDAYM/gBiT5oLQBAwuDJAMDEwMrMwNWEJDmmsJwgCFeXZghBcjlZMgFCzOiKOIFAB71Bb8AeJy1kjFuwkAQRZ+DwRAwBtNQRUGKQ8OdKCAWUhAgKLhIuAsVSpWz5Bbkj3dEgYiUIszqWdpZe+Z7/wB1oCYmIoboiwiLT2WjKl/jscrHfGg/pKdMkyklC5Zs2LEfHYpjcRoPzme9MWWmk3dWbK9ObkWkikOetJ554fWyoEsmdSlt+uR0pCJR34b6t/TVg1SY3sYvdf8vuiKrpyaDXDISiegp17p7579Gp3p++y7HPAiY9pmTibljrr85qSidtlg4+l25GLCaS8e6rRxNBmsnERunKbaOObRz7N72ju5vdAjYpBXHgJylOAVsMseDAPEP8LYoUHicY2BiAAEfhiAGJgZWBgZ7RnFRdnVJELCQlBSRlATJMoLV2DK4glSYs6ubq5vbKrJLSbGrgEmovDuDJVhe3VzcXFwNLCOILB/C4IuQ1xTn5FPilBTj5FPmBAB4WwoqAHicY2BkYGAA4sk1sR/j+W2+MnAzpDBgAyEMQUCSg4EJxAEAwUgFHgB4nGNgZGBgSGFggJMhDIwMqEAYAByHATJ4nGNgAIIUNEwmAABl3AGReJxjYAACIQYlBiMGJ3wQAEcQBEV4nGNgZGBgEGZgY2BiAAEQyQWEDAz/wXwGAAsPATIAAHicXdBNSsNAHAXwl35iA0UQXYnMShfS9GPZA7T7LgIu03SSpkwzYTIt1BN4Ak/gKTyAeCxfw39jZkjymzcvAwmAW/wgwHUEGDb36+jQQ3GXGot79L24jxCP4gHzF/EIr4jEIe7wxhOC3g2TMYy4Q7+Lu/SHuEd/ivt4wJd4wPxbPEKMX3GI5+DJFGaSn4qNzk8mcbKSR6xdXdhSzaOZJGtdapd4vVPbi6rP+cL7TGXOHtXKll4bY1Xl7EGnPtp7Xy2n00zyKLVHfkHBa4IcJ2oD3cgggWvt/V/FbDrUlEUJhTn/0azVWbNTNr0Ens8de1tceK9xZmfB1CPjOmPH4kitmvOubcNpmVTN3oFJyjzCvnmrwhJTzqzVj9jiSX911FjeAAB4nG3HMRKCMBBA0f0giiKi4DU8k0V2GWbIZDOh4PoWWvq6J5V8If9NVNQcaDhyouXMhY4rPTcG7jwYmXhKq8Wz+p762aNaeYXom2n3m2dLTVgsrCgFJ7OTmIkYbwIbC6vIB7WmFfAAAA==") format("woff"); }`,JX=!1;class XQ{constructor({parent:J,autoPlace:q=J===void 0,container:Q,width:Y,title:Z="Controls",closeFolders:K=!1,injectStyles:X=!0,touchStyles:W=!0}={}){if(this.parent=J,this.root=J?J.root:this,this.children=[],this.controllers=[],this.folders=[],this._closed=!1,this._hidden=!1,this.domElement=document.createElement("div"),this.domElement.classList.add("lil-gui"),this.$title=document.createElement("div"),this.$title.classList.add("title"),this.$title.setAttribute("role","button"),this.$title.setAttribute("aria-expanded",!0),this.$title.setAttribute("tabindex",0),this.$title.addEventListener("click",()=>this.openAnimated(this._closed)),this.$title.addEventListener("keydown",(z)=>{if(z.code==="Enter"||z.code==="Space")z.preventDefault(),this.$title.click()}),this.$title.addEventListener("touchstart",()=>{},{passive:!0}),this.$children=document.createElement("div"),this.$children.classList.add("children"),this.domElement.appendChild(this.$title),this.domElement.appendChild(this.$children),this.title(Z),this.parent){this.parent.children.push(this),this.parent.folders.push(this),this.parent.$children.appendChild(this.domElement);return}if(this.domElement.classList.add("root"),W)this.domElement.classList.add("allow-touch-styles");if(!JX&&X)HH(zH),JX=!0;if(Q)Q.appendChild(this.domElement);else if(q)this.domElement.classList.add("autoPlace"),document.body.appendChild(this.domElement);if(Y)this.domElement.style.setProperty("--width",Y+"px");this._closeFolders=K}add(J,q,Q,Y,Z){if(Object(Q)===Q)return new ZX(this,J,q,Q);const K=J[q];switch(typeof K){case"number":return new YX(this,J,q,Q,Y,Z);case"boolean":return new qX(this,J,q);case"string":return new KX(this,J,q);case"function":return new pJ(this,J,q)}console.error(`gui.add failed property:`,q,` object:`,J,` value:`,K)}addColor(J,q,Q=1){return new QX(this,J,q,Q)}addFolder(J){const q=new XQ({parent:this,title:J});if(this.root._closeFolders)q.close();return q}load(J,q=!0){if(J.controllers)this.controllers.forEach((Q)=>{if(Q instanceof pJ)return;if(Q._name in J.controllers)Q.load(J.controllers[Q._name])});if(q&&J.folders)this.folders.forEach((Q)=>{if(Q._title in J.folders)Q.load(J.folders[Q._title])});return this}save(J=!0){const q={controllers:{},folders:{}};if(this.controllers.forEach((Q)=>{if(Q instanceof pJ)return;if(Q._name in q.controllers)throw new Error(`Cannot save GUI with duplicate property "${Q._name}"`);q.controllers[Q._name]=Q.save()}),J)this.folders.forEach((Q)=>{if(Q._title in q.folders)throw new Error(`Cannot save GUI with duplicate folder "${Q._title}"`);q.folders[Q._title]=Q.save()});return q}open(J=!0){return this._setClosed(!J),this.$title.setAttribute("aria-expanded",!this._closed),this.domElement.classList.toggle("closed",this._closed),this}close(){return this.open(!1)}_setClosed(J){if(this._closed===J)return;this._closed=J,this._callOnOpenClose(this)}show(J=!0){return this._hidden=!J,this.domElement.style.display=this._hidden?"none":"",this}hide(){return this.show(!1)}openAnimated(J=!0){return this._setClosed(!J),this.$title.setAttribute("aria-expanded",!this._closed),requestAnimationFrame(()=>{const q=this.$children.clientHeight;this.$children.style.height=q+"px",this.domElement.classList.add("transition");const Q=(Z)=>{if(Z.target!==this.$children)return;this.$children.style.height="",this.domElement.classList.remove("transition"),this.$children.removeEventListener("transitionend",Q)};this.$children.addEventListener("transitionend",Q);const Y=!J?0:this.$children.scrollHeight;this.domElement.classList.toggle("closed",!J),requestAnimationFrame(()=>{this.$children.style.height=Y+"px"})}),this}title(J){return this._title=J,this.$title.innerHTML=J,this}reset(J=!0){return(J?this.controllersRecursive():this.controllers).forEach((Q)=>Q.reset()),this}onChange(J){return this._onChange=J,this}_callOnChange(J){if(this.parent)this.parent._callOnChange(J);if(this._onChange!==void 0)this._onChange.call(this,{object:J.object,property:J.property,value:J.getValue(),controller:J})}onFinishChange(J){return this._onFinishChange=J,this}_callOnFinishChange(J){if(this.parent)this.parent._callOnFinishChange(J);if(this._onFinishChange!==void 0)this._onFinishChange.call(this,{object:J.object,property:J.property,value:J.getValue(),controller:J})}onOpenClose(J){return this._onOpenClose=J,this}_callOnOpenClose(J){if(this.parent)this.parent._callOnOpenClose(J);if(this._onOpenClose!==void 0)this._onOpenClose.call(this,J)}destroy(){if(this.parent)this.parent.children.splice(this.parent.children.indexOf(this),1),this.parent.folders.splice(this.parent.folders.indexOf(this),1);if(this.domElement.parentElement)this.domElement.parentElement.removeChild(this.domElement);Array.from(this.children).forEach((J)=>J.destroy())}controllersRecursive(){let J=Array.from(this.controllers);return this.folders.forEach((q)=>{J=J.concat(q.controllersRecursive())}),J}foldersRecursive(){let J=Array.from(this.folders);return this.folders.forEach((q)=>{J=J.concat(q.foldersRecursive())}),J}}var XX=XQ;function FH(){g0.show()}function jH(){g0.hide()}function WX(J){if(J)FH();else jH()}var g0=new XX;g0.title("Options");g0.hide();function HX(){WQ=new Map,mJ=new Map,$Q=[]}function zQ(){return mJ}function G8(J){let q=mJ.get(J);if(!q){if(!$X.enableDynarec)return null;let Q=WQ.get(J)||0;if(Q++,WQ.set(J,Q),Q0&&!Q.func)Q.invalidate();return Q}}function aJ(J){var q="";if(J&$0.AA_EN)q+="|AA_EN";if(J&$0.Z_CMP)q+="|Z_CMP";if(J&$0.Z_UPD)q+="|Z_UPD";if(J&$0.IM_RD)q+="|IM_RD";if(J&$0.CLR_ON_CVG)q+="|CLR_ON_CVG";var Q=J&768;if(Q===$0.CVG_DST_CLAMP)q+="|CVG_DST_CLAMP";else if(Q===$0.CVG_DST_WRAP)q+="|CVG_DST_WRAP";else if(Q===$0.CVG_DST_FULL)q+="|CVG_DST_FULL";else if(Q===$0.CVG_DST_SAVE)q+="|CVG_DST_SAVE";var Y=J&3072;if(Y===$0.ZMODE_OPA)q+="|ZMODE_OPA";else if(Y===$0.ZMODE_INTER)q+="|ZMODE_INTER";else if(Y===$0.ZMODE_XLU)q+="|ZMODE_XLU";else if(Y===$0.ZMODE_DEC)q+="|ZMODE_DEC";if(J&$0.CVG_X_ALPHA)q+="|CVG_X_ALPHA";if(J&$0.ALPHA_CVG_SEL)q+="|ALPHA_CVG_SEL";if(J&$0.FORCE_BL)q+="|FORCE_BL";var Z=q.length>0?q.substr(1):"0",K=J>>>PQ,X="GBL_c1("+dJ(K>>>2)+") | GBL_c2("+dJ(K)+") /*"+r(K)+"*/";return Z+", "+X}function h0(J){var q=J;if(J===UQ)q="G_TX_LOADTILE";if(J===LH)q="G_TX_RENDERTILE";return q}function A8(J){switch(J){case VH:return"G_TX_WRAP";case FJ:return"G_TX_MIRROR";case R6:return"G_TX_CLAMP";case FJ|R6:return"G_TX_MIRROR|G_TX_CLAMP"}return J}function h8(J,q){var Q="";if(q&J.G_ZBUFFER)Q+="|G_ZBUFFER";if(q&J.G_TEXTURE_ENABLE)Q+="|G_TEXTURE_ENABLE";if(q&J.G_SHADE)Q+="|G_SHADE";if(q&J.G_SHADING_SMOOTH)Q+="|G_SHADING_SMOOTH";var Y=q&J.G_CULL_BOTH;if(Y===J.G_CULL_FRONT)Q+="|G_CULL_FRONT";else if(Y===J.G_CULL_BACK)Q+="|G_CULL_BACK";else if(Y===J.G_CULL_BOTH)Q+="|G_CULL_BOTH";if(q&J.G_FOG)Q+="|G_FOG";if(q&J.G_LIGHTING)Q+="|G_LIGHTING";if(q&J.G_TEXTURE_GEN)Q+="|G_TEXTURE_GEN";if(q&J.G_TEXTURE_GEN_LINEAR)Q+="|G_TEXTURE_GEN_LINEAR";if(q&J.G_LOD)Q+="|G_LOD";return Q.length>0?Q.substr(1):"0"}var Y0=function(J){return J.nameOf=(q)=>{for(var Q in J)if(Object.prototype.hasOwnProperty.call(J,Q)&&J[Q]===q)return Q;return N(q)},Object.freeze(J)};function dJ(J){var q=J>>>12&3,Q=J>>>8&3,Y=J>>>4&3,Z=J>>>0&3;return NX[q]+","+UH[Q]+","+NX[Y]+","+MH[Z]}var $0={AA_EN:8,Z_CMP:16,Z_UPD:32,IM_RD:64,CLR_ON_CVG:128,CVG_DST_CLAMP:0,CVG_DST_WRAP:256,CVG_DST_FULL:512,CVG_DST_SAVE:768,ZMODE_OPA:0,ZMODE_INTER:1024,ZMODE_XLU:2048,ZMODE_DEC:3072,CVG_X_ALPHA:4096,ALPHA_CVG_SEL:8192,FORCE_BL:16384,TEX_EDGE:0},HQ=0,jX=2;var PQ=16,P8=3,rJ=4,GX=4294967288,PX=0,$J=4,zJ=6,FQ=8,nJ=9,oJ=12,cJ=14,jQ=16,lJ=17,NQ=19,HJ=20;var GQ=23,x0=Y0({G_GBI2_MV_VIEWPORT:8,G_GBI2_MV_LIGHT:10,G_GBI2_MV_POINT:12,G_GBI2_MV_MATRIX:14,G_GBI2_MVO_LOOKATX:0,G_GBI2_MVO_LOOKATY:24,G_GBI2_MVO_L0:48,G_GBI2_MVO_L1:72,G_GBI2_MVO_L2:96,G_GBI2_MVO_L3:120,G_GBI2_MVO_L4:144,G_GBI2_MVO_L5:168,G_GBI2_MVO_L6:192,G_GBI2_MVO_L7:216}),sJ=1<>>8&255;let Q=J&255;return q<<24|q<<16|q<<8|Q}function AQ(J){let q=C8[J>>>11&31],Q=C8[J>>>6&31],Y=C8[J>>>1&31],Z=J&1?255:0;return q<<24|Q<<16|Y<<8|Z}var AH=function(J,q,Q){const Y=J.data,Z=J.width*4;let K=0;const X=Q.line<<4;let W=Q.tmem<<3,z=0;for(let F=0;F>>11&31],Y[G+1]=C8[U>>>6&31],Y[G+2]=C8[U>>>1&31],Y[G+3]=U&1?255:0,j+=2,G+=4}W+=X,K+=Z,z^=4}},EH=function(J,q,Q){let Y=J.data,Z=J.width*4,K=0,X=Q.line<<3,W=Q.tmem<<3,z=0;for(let F=0;F>>4&15],E=jJ[U&15];Y[G+0]=O,Y[G+1]=O,Y[G+2]=O,Y[G+3]=E,j+=1,G+=4}W+=X,K+=Z,z^=4}},kH=function(J,q,Q){let Y=J.data,Z=J.width*4,K=0,X=Q.line<<3,W=Q.tmem<<3,z=0;for(let F=0;F>>5],E=MQ[(U&16)>>>4],w=OQ[(U&14)>>>1],y=MQ[(U&1)>>>0];Y[G+0]=O,Y[G+1]=O,Y[G+2]=O,Y[G+3]=E,Y[G+4]=w,Y[G+5]=w,Y[G+6]=w,Y[G+7]=y,j+=1,G+=8}if(Q.width&1){let P=j^z,L=q[P],U=OQ[(L&224)>>>5],O=MQ[(L&16)>>>4];Y[G+0]=U,Y[G+1]=U,Y[G+2]=U,Y[G+3]=O,j+=1,G+=4}W+=X,K+=Z,z^=4}},CH=function(J,q,Q){let Y=J.data,Z=J.width*4,K=0,X=Q.line<<3,W=Q.tmem<<3,z=0;for(let F=0;F>>4],O=jJ[(L&15)>>>0];Y[G+0]=U,Y[G+1]=U,Y[G+2]=U,Y[G+3]=U,Y[G+4]=O,Y[G+5]=O,Y[G+6]=O,Y[G+7]=O,j+=1,G+=8}if(Q.width&1){let P=q[j^z],L=jJ[(P&240)>>>4];Y[G+0]=L,Y[G+1]=L,Y[G+2]=L,Y[G+3]=L,j+=1,G+=4}W+=X,K+=Z,z^=4}},UX=function(J,q,Q,Y){const Z=J.data,K=J.width*4;let X=0;const W=Q.line<<3;let z=Q.tmem<<3;const F=0;for(let G=0;G<256;++G){const U=2048+(G*4+F)*2,O=q[U+0]<<8|q[U+1];k8[G]=Y(O)}let j=0;for(let G=0;G>24&255,Z[L+1]=O>>16&255,Z[L+2]=O>>8&255,Z[L+3]=O&255,P+=1,L+=4}z+=W,X+=K,j^=4}},MX=function(J,q,Q,Y,Z){const K=J.data,X=J.width*4;let W=0;const z=Q.line<<3;let F=Q.tmem<<3;const j=0;for(let P=0;P<16;++P){const O=2048+((Y*16|P)*4+j)*2,E=q[O+0]<<8|q[O+1];k8[P]=Z(E)}let G=0;for(let P=0;P>>4],y=k8[(E&15)>>>0];K[U+0]=w>>24&255,K[U+1]=w>>16&255,K[U+2]=w>>8&255,K[U+3]=w&255,K[U+4]=y>>24&255,K[U+5]=y>>16&255,K[U+6]=y>>8&255,K[U+7]=y&255,L+=1,U+=8}if(Q.width&1){let O=q[L^G],E=k8[(O&240)>>>4];K[U+0]=E>>24&255,K[U+1]=E>>16&255,K[U+2]=E>>8&255,K[U+3]=E&255,L+=1,U+=4}F+=z,W+=X,G^=4}};function OX(J,q,Q,Y){var Z=Y===E8.G_TT_IA16?OH:AQ;switch(Q.format){case Z0.G_IM_FMT_RGBA:switch(Q.size){case p.G_IM_SIZ_32b:return AH(J,q,Q),!0;case p.G_IM_SIZ_16b:return hH(J,q,Q),!0;case p.G_IM_SIZ_8b:return UX(J,q,Q,Z),!0;case p.G_IM_SIZ_4b:return MX(J,q,Q,Q.palette,Z),!0}break;case Z0.G_IM_FMT_IA:switch(Q.size){case p.G_IM_SIZ_16b:return EH(J,q,Q),!0;case p.G_IM_SIZ_8b:return wH(J,q,Q),!0;case p.G_IM_SIZ_4b:return kH(J,q,Q),!0}break;case Z0.G_IM_FMT_I:switch(Q.size){case p.G_IM_SIZ_8b:return CH(J,q,Q),!0;case p.G_IM_SIZ_4b:return DH(J,q,Q),!0}break;case Z0.G_IM_FMT_CI:switch(Q.size){case p.G_IM_SIZ_8b:return UX(J,q,Q,Z),!0;case p.G_IM_SIZ_4b:return MX(J,q,Q,Q.palette,Z),!0}break}return!1}var MQ=[0,255],OQ=[0,36,73,109,146,182,219,255],jJ=[0,17,34,51,68,85,102,119,136,153,170,187,204,221,238,255],C8=[0,8,16,24,33,41,49,57,66,74,82,90,99,107,115,123,132,140,148,156,165,173,181,189,198,206,214,222,231,239,247,255],k8=new Uint32Array(256);function E9(J,q,Q){let Y;switch(q){case P8:Y=`gsDPSetAlphaCompare(${c6.nameOf(Q)});`;break;case rJ:Y=`gsDPSetDepthSource(${l6.nameOf(Q)});`;break;case GX:Y=`gsDPSetRenderMode(${aJ(Q)});`;break;default:Y=`gsSPSetOtherMode(G_SETOTHERMODE_L, ${N(q)}, ${N(Q)}`;break}J.text(Y)}function w9(J,q,Q,Y,Z){let K;switch(q){case PX:break;case Y9:K=`gsDPSetAlphaDither(${h9.nameOf(Z)});`;break;case Q9:K=`gsDPSetColorDither(${A9.nameOf(Z)});`;break;case q9:K=`gsDPSetCombineKey(${O9.nameOf(Z)});`;break;case J9:K=`gsDPSetTextureConvert(${M9.nameOf(Z)});`;break;case U8:K=`gsDPSetTextureFilter(${w8.nameOf(Z)});`;break;case eJ:K=`gsDPSetTextureLOD(${U9.nameOf(Z)});`;break;case V8:K=`gsDPSetTextureLUT(${E8.nameOf(Z)});`;break;case tJ:K=`gsDPSetTextureDetail(${V9.nameOf(Z)});`;break;case iJ:K=`gsDPSetTexturePersp(${L9.nameOf(Z)});`;break;case L8:K=`gsDPSetCycleType(${K0.nameOf(Z)});`;break;case sJ:K=`gsDPPipelineMode(${P9.nameOf(Z)});`;break;default:K=`gsSPSetOtherMode(G_SETOTHERMODE_H, ${N(q)}, ${N(Z)});`;break}J.text(K)}var AX=function(J,q,Q,Y){const Z=`${J}, ${q}, ${Q}`,K=`${Z}, ${Y}`;if(J<128&&q<128||q<128&&Q<128||Q<128&&J<128)return`${K}`;return`${K}`};function b6(J){const q=J>>>24&255,Q=J>>>16&255,Y=J>>>8&255,Z=J&255;return AX(q,Q,Y,Z)}function k9(J){const q=J&255,Q=J>>>8&255,Y=J>>>16&255,Z=J>>>24&255;return AX(q,Q,Y,Z)}function hX(J){return b6(AQ(J))}function kQ(J,q,Q){let Y=wQ(J,q),Z=wQ(J,Q),K=J.createProgram();if(J.attachShader(K,Y),J.attachShader(K,Z),J.linkProgram(K),!J.getProgramParameter(K,J.LINK_STATUS))a(!1,"Unable to initialize the shader program.");return K}var wQ=function(J,q){let Q=document.getElementById(q);if(!Q)return null;let Y=yX(Q),Z;if(Q.type==="x-shader/x-fragment")Z=J.FRAGMENT_SHADER;else if(Q.type==="x-shader/x-vertex")Z=J.VERTEX_SHADER;else return null;return IX(J,Y,Z)},yX=function(J){let q="",Q=J.firstChild;while(Q){if(Q.nodeType==Node.TEXT_NODE)q+=Q.textContent;Q=Q.nextSibling}return q},IX=function(J,q,Q){let Y=J.createShader(Q);if(J.shaderSource(Y,q),J.compileShader(Y),!J.getShaderParameter(Y,J.COMPILE_STATUS))return a(!1,"An error occurred compiling the shaders: "+J.getShaderInfoLog(Y)),null;return Y};function RX(J,q,Q,Y,Z){let K=Y>>20&15,z=Q>>>28&15,F=q>>>15&31,j=Q>>>15&7,G=q>>>12&7,P=Q>>>12&7,L=q>>>9&7,U=Q>>>9&7,O=q>>>5&15,E=Q>>>24&15,w=q>>>0&31,y=Q>>>6&7,S=Q>>>21&7,g=Q>>>3&7,x=Q>>>18&7,H0=Q>>>0&7,w0;if(Y===K0.G_CYC_FILL)w0="col = shade;\n";else if(Y===K0.G_CYC_COPY)w0="col = tex0;\n";else if(Y===K0.G_CYC_1CYCLE)w0="",w0+="col.rgb = ("+C9[W]+" - "+C9[z]+") * "+kX[F]+" + "+DX[j]+";\n",w0+="col.a = ("+T6[G]+" - "+T6[P]+") * "+T6[L]+" + "+T6[U]+";\n";else w0="",w0+="col.rgb = ("+C9[W]+" - "+C9[z]+") * "+kX[F]+" + "+DX[j]+";\n",w0+="col.a = ("+T6[G]+" - "+T6[P]+") * "+T6[L]+" + "+T6[U]+";\n",w0+="combined = vec4(col.rgb, col.a);\n",w0+="col.rgb = ("+CX[O]+" - "+CX[E]+") * "+IH[w]+" + "+BH[y]+";\n",w0+="col.a = ("+D9[S]+" - "+D9[g]+") * "+D9[x]+" + "+D9[H0]+";\n";if(Z)w0+="if(col.a <= uAlphaThreshold) discard;\n";let o8=hQ.replace("{{body}}",w0);if(yH){let C6="\n";C6+="\tRGB0 = ("+I9[W]+" - "+B9[z]+") * "+y9[F]+" + "+R9[j]+"\n",C6+="\t A0 = ("+_6[G]+" - "+_6[P]+") * "+b9[L]+" + "+T9[U]+"\n",C6+="\tRGB1 = ("+I9[O]+" - "+B9[E]+") * "+y9[w]+" + "+R9[y]+"\n",C6+="\t A1 = ("+_6[S]+" - "+_6[g]+") * "+b9[x]+" + "+T9[H0]+"\n";let Jz=o8.split("\n").join("
");M("Compiled "+C6+"\nto\n"+Jz)}let mZ=IX(J,o8,J.FRAGMENT_SHADER);if(!mZ)return null;let c8=J.createProgram();if(J.attachShader(c8,EQ),J.attachShader(c8,mZ),J.linkProgram(c8),!J.getProgramParameter(c8,J.LINK_STATUS))a(!1,"Unable to initialize the shader program.");return X=new BX(J,c8,o8),wX.set(K,X),X}function _9(J,q){let Q=J>>>20&15,Y=q>>>28&15,Z=J>>>15&31,K=q>>>15&7,X=J>>>12&7,W=q>>>12&7,z=J>>>9&7,F=q>>>9&7,j=J>>>5&15,G=q>>>24&15,P=J>>>0&31,L=q>>>6&7,U=q>>>21&7,O=q>>>3&7,E=q>>>18&7,w=q>>>0&7,y="";return y+="RGB0 = ("+I9[Q]+" - "+B9[Y]+") * "+y9[Z]+" + "+R9[K]+"\n",y+=" A0 = ("+_6[X]+" - "+_6[W]+") * "+b9[z]+" + "+T9[F]+"\n",y+="RGB1 = ("+I9[j]+" - "+B9[G]+") * "+y9[P]+" + "+R9[L]+"\n",y+=" A1 = ("+_6[U]+" - "+_6[O]+") * "+b9[E]+" + "+T9[w]+"\n",y}var yH=!1,wX=new Map,hQ=null,EQ=null,kX=["combined.rgb","tex0.rgb","tex1.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","combined.a","tex0.a","tex1.a","prim.a","shade.a","env.a","lod_frac","prim_lod_frac","k5","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","zero.rgb"],IH=["combined.rgb","tex1.rgb","tex0.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","combined.a","tex1.a","tex0.a","prim.a","shade.a","env.a","lod_frac","prim_lod_frac","k5","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","zero.rgb"],C9=["combined.rgb","tex0.rgb","tex1.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","combined.a","tex0.a","tex1.a","prim.a","shade.a","env.a","lod_frac","prim_lod_frac","zero.rgb"],CX=["combined.rgb","tex1.rgb","tex0.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","combined.a","tex1.a","tex0.a","prim.a","shade.a","env.a","lod_frac","prim_lod_frac","zero.rgb"],DX=["combined.rgb","tex0.rgb","tex1.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","zero.rgb"],BH=["combined.rgb","tex1.rgb","tex0.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","zero.rgb"],T6=["combined.a","tex0.a","tex1.a","prim.a","shade.a","env.a","one.a","zero.a"],D9=["combined.a","tex1.a","tex0.a","prim.a","shade.a","env.a","one.a","zero.a"],y9=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","KeyScale ","CombinedAlph","Texel0_Alpha","Texel1_Alpha","Prim_Alpha ","Shade_Alpha ","Env_Alpha ","LOD_Frac ","PrimLODFrac ","K5 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 "],I9=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","1 ","Noise ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 "],B9=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","KeyCenter ","K4 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 "],R9=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","1 ","0 "],_6=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","PrimLODFrac ","0 "],b9=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","1 ","0 "],T9=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","1 ","0 "];class BX{constructor(J,q,Q){this.program=q,this.shaderSource=Q,this.vertexPositionAttribute=J.getAttribLocation(q,"aVertexPosition"),this.vertexColorAttribute=J.getAttribLocation(q,"aVertexColor"),this.texCoordAttribute=J.getAttribLocation(q,"aTextureCoord"),this.uSamplerUniform0=J.getUniformLocation(q,"uSampler0"),this.uSamplerUniform1=J.getUniformLocation(q,"uSampler1"),this.uTexScaleUniform0=J.getUniformLocation(q,"uTexScale0"),this.uTexScaleUniform1=J.getUniformLocation(q,"uTexScale1"),this.uTexOffsetUniform0=J.getUniformLocation(q,"uTexOffset0"),this.uTexOffsetUniform1=J.getUniformLocation(q,"uTexOffset1"),this.uPrimColorUniform=J.getUniformLocation(q,"uPrimColor"),this.uEnvColorUniform=J.getUniformLocation(q,"uEnvColor"),this.uAlphaThresholdUniform=J.getUniformLocation(q,"uAlphaThresholdUniform")}}var bH=function(J){const q=DQ("x",J,z9,X9),Q=DQ("y",J,H9,W9),Y=DQ("z",J,F9,$9);return`${q} ${Q} ${Y}`},DQ=function(J,q,Q,Y){const Z=q&Q,K=q&Y;let X="",W="";if(Z&&K)X="clip-err",W="!";else if(Z)X="clip-pos",W=">";else if(K)X="clip-neg",W="<";else X="clip-none",W="0";return`${J}${W}`},S9,D8,S6,bX=$("#dlist-content"),RH=0,TX="";class yQ{constructor(J,q){this.state=J,this.processDList=q,this.currentOp=0,this.numOps=0,this.bailAfter=-1,this.lastTask,this.stateTimeShown=-1,this.running=!1,this.requested=!1,this.dlFocusCounter=0}onNewTask(J){if(this.lastTask=J,this.requested){if(TX==""||J.detectVersionString().includes(TX)){if(this.dlFocusCounter==RH)this.requested=!1,n64js.breakEmulationForDisplayListDebug(),this.stateTimeShown=-1,this.running=!0;this.dlFocusCounter++}}else this.dlFocusCounter=0}toggle(){if(this.running)this.hideUI(),this.bailAfter=-1,this.running=!1,n64js.toggleRun();else this.showUI(),this.requested=!0}halt(){this.showUI(),this.requested=!1,this.running=!0,this.bailAfter=this.currentOp,this.stateTimeShown=-1}debugDisplayList(){if(this.stateTimeShown==-1){const J=new _X(this);this.processDList(this.lastTask,J,-1),J.finalise(),this.numOps=J.numOps>0?J.numOps-1:0,this.setScrubRange(this.numOps);const q=this.bailAfter==-1?this.numOps:this.bailAfter;this.setScrubTime(q)}if(this.processDList(this.lastTask,null,this.bailAfter),this.stateTimeShown!==this.bailAfter)this.updateStateUI(),this.stateTimeShown=this.bailAfter}postOp(J){if(J>-1&&this.currentOp>=J)return!0;return this.currentOp++,!1}updateStateUI(){D8.find("#dl-geometrymode-content").html(this.buildStateTab()),D8.find("#dl-vertices-content").html(this.buildVerticesTab()),D8.find("#dl-tiles-content").html(this.buildTilesTab()),D8.find("#dl-combiner-content").html(this.buildCombinerTab()),D8.find("#dl-rdp-content").html(this.buildRDPTab())}setScrubText(J,q){S9.find(".scrub-text").html(`uCode op ${J}/${q}.`)}setScrubRange(J){S9.find("input").attr({min:0,max:J,value:J}),this.setScrubText(J,J)}setScrubTime(J){this.bailAfter=J,this.setScrubText(this.bailAfter,this.numOps);const q=S6.find(`#I${this.bailAfter}`);S6.scrollTop(S6.scrollTop()+q.position().top-S6.height()/2+q.height()/2);const Q="hle-cur-instr";S6.find(".hle-instr").removeClass(Q),q.addClass(Q)}initUI(){const J=bX.find("#controls");this.bailAfter=-1,this.numOps=0;const q=this;J.find("#rwd").click(()=>{if(q.running&&q.bailAfter>0)q.setScrubTime(q.bailAfter-1)}),J.find("#fwd").click(()=>{if(q.running&&q.bailAfter{this.toggle()}),S9=J.find(".scrub"),S9.find("input").change(function(){q.setScrubTime($(this).val()|0)}),this.setScrubRange(0),D8=bX.find(".hle-state"),S6=$('
'),$("#adjacent-debug").empty().append(S6)}showUI(){n64js.debugger().show(),$("#dlist-tab").tab("show")}hideUI(){n64js.debugger().hide()}setDisplayListOutput(J){S6.html(J),J.find(".dl-tip").parent().click(function(){$(this).find(".dl-tip").toggle()})}buildStateTab(){const J=$('
'),q=$("");for(let Q in this.state.geometryMode)if(Object.prototype.hasOwnProperty.call(this.state.geometryMode,Q)){const Y=$(`${Q}`);Y.addClass(this.state.geometryMode[Q]?"dl-debug-geommode-enabled":"dl-debug-geommode-disabled"),q.append(Y)}return J.append(q),J}buildRDPTab(){const J=this.state.rdpOtherModeL,q=this.state.rdpOtherModeH,Q=this.state.textureImage,Y=new Map([["alphaCompare",c6.nameOf(J&P8)],["depthSource",l6.nameOf(J&rJ)],["renderMode",aJ(J)],["alphaDither",h9.nameOf(q&Y9)],["colorDither",A9.nameOf(q&Q9)],["combineKey",O9.nameOf(q&q9)],["textureConvert",M9.nameOf(q&J9)],["textureFilter",w8.nameOf(q&U8)],["textureLUT",E8.nameOf(q&V8)],["textureLOD",U9.nameOf(q&eJ)],["texturePersp",L9.nameOf(q&iJ)],["textureDetail",V9.nameOf(q&tJ)],["cycleType",K0.nameOf(q&L8)],["pipelineMode",P9.nameOf(q&sJ)],[""," "],["TI.format",Z0.nameOf(Q.format)],["TI.size",p.nameOf(Q.size)],["TI.width",Q.width],["TI.address",N(Q.address)]]),Z=$('
');for(let[K,X]of Y){let W=$(`${K}${X}`);Z.append(W)}return Z}buildColorsTable(){const J=["fillColor","envColor","primColor","blendColor","fogColor"],q=$('
');for(let Q of J){let Y=$(`${Q}${b6(this.state[Q])}`);q.append(Y)}return q}buildCombinerTab(){const J=$('
');J.append(K0.nameOf(this.state.getCycleType())+"\n"),J.append(this.buildColorsTable()),J.append(_9(this.state.combine.hi,this.state.combine.lo));const q=this.renderer.getCurrentN64Shader();if(q)J.append(q.shaderSource);return J}buildTexture(J){const q=this.renderer.lookupTexture(J);if(q)return q.createScaledCanvas(8)}buildTilesTab(){const J=$("
");J.append(this.buildTilesTable());const q=[],Q=$("");for(let Z=0;Z<8;++Z){let K=this.buildTexture(Z);q.push(h0(Z));let X=$("");X.append(K?K:""),Q.append(X)}const Y=$('
');return Y.append($(`${q.join("")}`)),Y.append(Q),J.append(Y),J}buildTilesTable(){const J=["tile #","format","size","line","tmem","palette","cmS","maskS","shiftS","cmT","maskT","shiftT","left","top","right","bottom","width","height","unmasked w","unmasked h"],q=$('
'),Q=$(`${J.join("")}`);q.append(Q);for(let Y=0;Y${K.join("")}`);q.append(X)}return q}buildVerticesTab(){const J=["vtx #","x","y","z","px","py","pz","pw","color","u","v","clip"],q=$('
'),Q=$(`${J.join("")}`);q.append(Q);for(let Y=0;Y${z.join("")}`);q.append(F)}return q}}class _X{constructor(J){this.debugController=J,this.$currentDis=$("
"),this.$span=void 0,this.numOps=0}begin(J,q,Q){const Y=new Array(Q+1).join("  ");this.$span=$(``),this.$span.append(`${NK(this.numOps,5)} ${B(J,32)}${B(q,32)} ${Y}`),this.$currentDis.append(this.$span)}text(J){this.$span.append(J)}tip(J){const q=$(`
${J}
`);q.hide(),this.$span.append(q)}end(){this.$span.append("
"),this.numOps++}finalise=function(){this.debugController.setDisplayListOutput(this.$currentDis)};rgba8888(J){return b6(J)}rgba5551(J){return hX(J)}}class X0{constructor(J,q,Q){if(Q!==void 0)this.elems=new Float32Array(3),this.elems[0]=J,this.elems[1]=q,this.elems[2]=Q;else this.elems=J||new Float32Array(3)}get x(){return this.elems[0]}get y(){return this.elems[1]}get z(){return this.elems[2]}set x(J){this.elems[0]=J}set y(J){this.elems[1]=J}set z(J){this.elems[2]=J}set(J,q,Q){return this.x=J,this.y=q,this.z=Q,this}dot(J){let q=0;for(let Q=0;Q0)return this.scaleInPlace(1/J);return this}static create(J){let q=new X0;return q.elems[0]=J[0],q.elems[1]=J[1],q.elems[2]=J[2],q}}class y0{constructor(J){this.elems=J||new Float32Array(16)}multiply(J){let q=this.elems,Q=J.elems,Y=new Float32Array(16);for(let Z=0;Z<4;++Z)for(let K=0;K<4;++K)Y[Z*4+K]+=q[Z*4+0]*Q[0+K],Y[Z*4+K]+=q[Z*4+1]*Q[4+K],Y[Z*4+K]+=q[Z*4+2]*Q[8+K],Y[Z*4+K]+=q[Z*4+3]*Q[12+K];return new y0(Y)}transformNormal(J,q){let Q=this.elems,Y=J.elems,Z=Y[0],K=Y[1],X=Y[2];q.elems[0]=Q[0]*Z+Q[1]*K+Q[2]*X,q.elems[1]=Q[4]*Z+Q[5]*K+Q[6]*X,q.elems[2]=Q[8]*Z+Q[9]*K+Q[10]*X}transformPoint(J,q){let Q=this.elems,Y=J.elems,Z=Y[0],K=Y[1],X=Y[2];q.elems[0]=Q[0]*Z+Q[1]*K+Q[2]*X+Q[3],q.elems[1]=Q[4]*Z+Q[5]*K+Q[6]*X+Q[7],q.elems[2]=Q[8]*Z+Q[9]*K+Q[10]*X+Q[11],q.elems[3]=Q[12]*Z+Q[13]*K+Q[14]*X+Q[15]}static identity(){let J=new Float32Array(16);return J[0]=1,J[5]=1,J[10]=1,J[15]=1,new y0(J)}copy(){let J=new Float32Array(16);for(let q=0;q<16;q++)J[q]=this.elems[q];return new y0(J)}static makeOrtho(J,q,Q,Y,Z,K){let X=-(q+J)/(q-J),W=-(Y+Q)/(Y-Q),z=-(K+Z)/(K-Z),F=new Float32Array(16);return F[0]=2/(q-J),F[1]=0,F[2]=0,F[3]=0,F[4]=0,F[5]=2/(Y-Q),F[6]=0,F[7]=0,F[8]=0,F[9]=0,F[10]=-2/(K-Z),F[11]=0,F[12]=X,F[13]=W,F[14]=z,F[15]=1,new y0(F)}}var W6={canvasScale:1,haltOnWarning:!1,dumpMicrocodeSubstring:""},IQ=g0.addFolder("Graphics");IQ.add(W6,"canvasScale").name("Canvas Scale").min(1).max(4).step(0.25);IQ.add(W6,"haltOnWarning").name("Halt on Warning");IQ.add(W6,"dumpMicrocodeSubstring").name("Dump Microcode");function y8(J,q){return(J>>>2)-(q>>>2)+1&1023}var SX=function(J,q){return q?Math.min(1<=this.maxTris)return!1;var Y=this.numTris*3*4,Z=this.numTris*3*1,K=this.numTris*3*2,X=J.pos,W=q.pos,z=Q.pos;return this.positions[Y+0]=X.x,this.positions[Y+1]=X.y,this.positions[Y+2]=X.z,this.positions[Y+3]=X.w,this.positions[Y+4]=W.x,this.positions[Y+5]=W.y,this.positions[Y+6]=W.z,this.positions[Y+7]=W.w,this.positions[Y+8]=z.x,this.positions[Y+9]=z.y,this.positions[Y+10]=z.z,this.positions[Y+11]=z.w,this.colours[Z+0]=J.color,this.colours[Z+1]=q.color,this.colours[Z+2]=Q.color,this.coords[K+0]=J.u,this.coords[K+1]=J.v,this.coords[K+2]=q.u,this.coords[K+3]=q.v,this.coords[K+4]=Q.u,this.coords[K+5]=Q.v,this.numTris++,!0}pushTriWithUV(J,q,Q,Y,Z,K,X,W,z){if(this.numTris>=this.maxTris)return!1;var F=this.numTris*3*4,j=this.numTris*3*1,G=this.numTris*3*2,P=J.pos,L=q.pos,U=Q.pos;return this.positions[F+0]=P.x,this.positions[F+1]=P.y,this.positions[F+2]=P.z,this.positions[F+3]=P.w,this.positions[F+4]=L.x,this.positions[F+5]=L.y,this.positions[F+6]=L.z,this.positions[F+7]=L.w,this.positions[F+8]=U.x,this.positions[F+9]=U.y,this.positions[F+10]=U.z,this.positions[F+11]=U.w,this.colours[j+0]=J.color,this.colours[j+1]=q.color,this.colours[j+2]=Q.color,this.coords[G+0]=Y,this.coords[G+1]=Z,this.coords[G+2]=K,this.coords[G+3]=X,this.coords[G+4]=W,this.coords[G+5]=z,this.numTris++,!0}}var _H=function(J){return{r:(J>>>11&31)/31,g:(J>>>6&31)/31,b:(J>>>1&31)/31,a:(J>>>0&1)/1}},uX=function(J){return{r:(J>>>24&255)/255,g:(J>>>16&255)/255,b:(J>>>8&255)/255,a:(J>>>0&255)/255}},TH=!0,vX=new Map,fX=new Map;class NJ{constructor(J,q){this.state=J,this.ramDV=q,this.vertexStride=2,this.version="",this.triangleBuffer=new RQ(64),this.onLoadUcodeHandler=null,this.gbiCommonCommands=new Map([[228,this.executeTexRect.bind(this)],[229,this.executeTexRectFlip.bind(this)],[230,this.executeRDPLoadSync.bind(this)],[231,this.executeRDPPipeSync.bind(this)],[232,this.executeRDPTileSync.bind(this)],[233,this.executeRDPFullSync.bind(this)],[234,this.executeSetKeyGB.bind(this)],[235,this.executeSetKeyR.bind(this)],[236,this.executeSetConvert.bind(this)],[237,this.executeSetScissor.bind(this)],[238,this.executeSetPrimDepth.bind(this)],[239,this.executeSetRDPOtherMode.bind(this)],[240,this.executeLoadTLut.bind(this)],[242,this.executeSetTileSize.bind(this)],[243,this.executeLoadBlock.bind(this)],[244,this.executeLoadTile.bind(this)],[245,this.executeSetTile.bind(this)],[246,this.executeFillRect.bind(this)],[247,this.executeSetFillColor.bind(this)],[248,this.executeSetFogColor.bind(this)],[249,this.executeSetBlendColor.bind(this)],[250,this.executeSetPrimColor.bind(this)],[251,this.executeSetEnvColor.bind(this)],[252,this.executeSetCombine.bind(this)],[253,this.executeSetTImg.bind(this)],[254,this.executeSetZImg.bind(this)],[255,this.executeSetCImg.bind(this)]])}buildCommandTable(){const J=[];for(let q=0;q<256;++q){let Q=this.getHandler(q);if(!Q)Q=this.executeUnknown.bind(this);J.push(Q)}return J}getHandler(J){const q=this.gbiCommonCommands.get(J);if(q)return q;return null}onLoadUcode(J){this.onLoadUcodeHandler=J}executeUnknown(J,q){this.warn(`Unknown display list op ${M0(J>>>24)}`,`cmd0 ${N(J)}, cmd1 ${N(q)}`)}warnUnimplemented(J){this.warn(J,"unimplemented")}warn(J,q){if(fX.get(J))return;fX.set(J,!0);const Q=q!==void 0?`${J}: ${q}`:J;if(W6.haltOnWarning)this.hleHalt(Q);else n64js.warn(Q)}loadMatrix(J,q){const Y=new DataView(this.ramDV.buffer,J);if(q!=64)this.warn("Unusual matrix length",`${q}`);const Z=new Float32Array(16);for(let K=0;K<4;++K)Z[0+K]=(Y.getInt16(K*8+0)<<16|Y.getUint16(K*8+0+32))*0.0000152587890625,Z[4+K]=(Y.getInt16(K*8+2)<<16|Y.getUint16(K*8+2+32))*0.0000152587890625,Z[8+K]=(Y.getInt16(K*8+4)<<16|Y.getUint16(K*8+4+32))*0.0000152587890625,Z[12+K]=(Y.getInt16(K*8+6)<<16|Y.getUint16(K*8+6+32))*0.0000152587890625;return new y0(Z)}previewMatrix(J){const q=J.elems,Q=[q[0],q[1],q[2],q[3]],Y=[q[4],q[5],q[6],q[7]],Z=[q[8],q[9],q[10],q[11]],K=[q[12],q[13],q[14],q[15]];return`
${Q.join("")}
${Y.join("")}
${Z.join("")}
${K.join("")}
`}loadViewport(J){const q=new X0(+this.ramDV.getInt16(J+0)/4,-this.ramDV.getInt16(J+2)/4,+this.ramDV.getInt16(J+4)),Q=new X0(this.ramDV.getInt16(J+8)/4,this.ramDV.getInt16(J+10)/4,this.ramDV.getInt16(J+12));this.state.viewport.set(q,Q)}previewViewport(J){const q=new X0(this.ramDV.getInt16(J+0)/4,this.ramDV.getInt16(J+2)/4,this.ramDV.getInt16(J+4)),Q=new X0(this.ramDV.getInt16(J+8)/4,this.ramDV.getInt16(J+10)/4,this.ramDV.getInt16(J+12));let Y="";return Y+=`scale = (${q.x}, ${q.y}, ${q.z}) `,Y+=`trans = (${Q.x}, ${Q.y}, ${Q.z}) `,Y}loadLight(J,q){if(J>=this.state.lights.length){M(`light index ${J} out of range`);return}this.state.lights[J].color=uX(this.ramDV.getUint32(q+0)),this.state.lights[J].dir=X0.create([this.ramDV.getInt8(q+8),this.ramDV.getInt8(q+9),this.ramDV.getInt8(q+10)]).normaliseInPlace()}previewLight(J){let q="";q+=`color = ${b6(this.ramDV.getUint32(J+0))} `,q+=`colorCopy = ${b6(this.ramDV.getUint32(J+4))} `;const Q=X0.create([this.ramDV.getInt8(J+8),this.ramDV.getInt8(J+9),this.ramDV.getInt8(J+10)]).normaliseInPlace();return q+=`norm = (${Q.x}, ${Q.y}, ${Q.z})`,q}loadVertices(J,q,Q,Y){const Z=this.state.geometryMode.lighting,K=this.state.geometryMode.textureGen,X=this.state.geometryMode.textureGenLinear,W=new DataView(this.ramDV.buffer,Q);if(Y)this.previewVertex(J,q,W,Y,Z);if(J+q>=this.state.projectedVertices.length){this.warn("Too many verts");return}const z=this.state.modelview[this.state.modelview.length-1],j=this.state.projection[this.state.projection.length-1].multiply(z),G=this.state.texture.scaleS/32,P=this.state.texture.scaleT/32,L=new X0,U=new X0,O=new X0,E=this.renderer.nativeTransform.viTransform,w=this.state.viewport.transform,y=16;for(let S=0;SJ.w)q|=X9;if(J.y<-J.w)q|=H9;else if(J.y>J.w)q|=W9;if(J.z<-J.w)q|=F9;else if(J.z>J.w)q|=$9;return q}unpackNormal(J,q){J.x=q<<24>>24,J.y=q<<16>>24,J.z=q<<8>>24}calculateLighting(J,q){const Q=this.state.numLights;let Y=this.state.lights[Q].color.r,Z=this.state.lights[Q].color.g,K=this.state.lights[Q].color.b;for(let X=0;X0)Y+=W.color.r*z,Z+=W.color.g*z,K+=W.color.b*z}return Y=Math.min(Y,1)*255,Z=Math.min(Z,1)*255,K=Math.min(K,1)*255,q<<24|K<<16|Z<<8|Y}previewVertex(J,q,Q,Y,Z){const K=["#","x","y","z","?","u","v",Z?"norm":"rgba"];let X="";X+='',X+=`\n`;for(let W=0;W\n`}X+="
${K.join("")}
${j.join("")}
",Y.tip(X)}executeNoop(J,q,Q){if(Q)Q.text("gsDPNoOp();")}executeSpNoop(J,q,Q){if(Q)Q.text("gsSPNoOp();")}executeLoadUcode(J,q,Q){const Y=q&268435455,K=this.state.rdpHalf1Cmd1,X=(J&65535)+1;let W="?";if(this.onLoadUcodeHandler){const z=this.onLoadUcodeHandler(Y,4096,K,X);z.onLoadUcode(this.onLoadUcodeHandler),W=z.version}else this.warn("No loadUcodeHandler set!");if(Q)Q.text(`gsSPLoadUCode(${N(Y)}, 4096, ${N(K)} ${X}); // ${W}`)}executeRDPHalf1(J,q,Q){if(Q)Q.text(`gsImmp1(G_RDPHALF_1, ${N(q)});`);this.state.rdpHalf1Cmd1=q}executeRDPHalf2(J,q,Q){if(Q)Q.text(`gsImmp1(G_RDPHALF_2, ${N(q)});`);this.state.rdpHalf2Cmd1=q}executeRDPLoadSync(J,q,Q){if(Q)Q.text("gsDPLoadSync();")}executeRDPPipeSync(J,q,Q){if(Q)Q.text("gsDPPipeSync();")}executeRDPTileSync(J,q,Q){if(Q)Q.text("gsDPTileSync();")}executeRDPFullSync(J,q,Q){if(Q)Q.text("gsDPFullSync();")}executeSetKeyGB(J,q,Q){if(Q)Q.text("gsDPSetKeyGB(???);")}executeSetKeyR(J,q,Q){if(Q)Q.text("gsDPSetKeyR(???);")}executeSetConvert(J,q,Q){if(Q)Q.text("gsDPSetConvert(???);")}executeSetScissor(J,q,Q){const Y=(J>>>12&4095)/4,Z=(J>>>0&4095)/4,K=(q>>>12&4095)/4,X=(q>>>0&4095)/4,W=q>>>24&2;if(Q)Q.text(`gsDPSetScissor(${VX.nameOf(W)}, ${Y}, ${Z}, ${K}, ${X});`);this.state.scissor.x0=Y,this.state.scissor.y0=Z,this.state.scissor.x1=K,this.state.scissor.y1=X,this.state.scissor.mode=W}executeSetRDPOtherMode(J,q,Q){if(Q)Q.text(`gsDPSetOtherMode(${N(J)}, ${N(q)}); // TODO: fix formatting`);this.state.rdpOtherModeH=J,this.state.rdpOtherModeL=q}executeSetTile(J,q,Q){const Y=J>>>21&7,Z=J>>>19&3,K=J>>>9&511,X=J>>>0&511,W=q>>>24&7,z=q>>>20&15,F=q>>>18&3,j=q>>>14&15,G=q>>>10&15,P=q>>>8&3,L=q>>>4&15,U=q>>>0&15;if(this.state.tiles[W].set(Y,Z,K,X,z,P,L,U,F,j,G),Q){const E=Z0.nameOf(Y),w=p.nameOf(Z),y=h0(W),S=A8(P),g=A8(F);Q.text(`gsDPSetTile(${E}, ${w}, ${K}, ${X}, ${y}, ${z}, ${g}, ${j}, ${G}, ${S}, ${L}, ${U});`)}}executeSetTileSize(J,q,Q){const Y=J>>>12&4095,Z=J>>>0&4095,K=q>>>24&7,X=q>>>12&4095,W=q>>>0&4095,z=this.state.tiles[K];if(z.setSize(Y,Z,X,W),Q){const F=h0(K);Q.text(`gsDPSetTileSize(${F}, ${z.left}, ${z.top}, ${z.right}, ${z.bottom});`),Q.tip(`size (${z.width} x ${z.height}), unmasked (${z.unmaskedWidth} x ${z.unmaskedHeight})`)}}executeSetFillColor(J,q,Q){if(Q)Q.text(`gsDPSetFillColor(${Q.rgba8888(q)}); // hi as 5551 = ${Q.rgba5551(q>>>16)}, lo as 5551 = ${Q.rgba5551(q&65535)} `);this.state.fillColor=q}executeSetFogColor(J,q,Q){if(Q)Q.text(`gsDPSetFogColor(${Q.rgba8888(q)});`);this.state.fogColor=q}executeSetBlendColor(J,q,Q){if(Q)Q.text(`gsDPSetBlendColor(${Q.rgba8888(q)});`);this.state.blendColor=q}executeSetPrimColor(J,q,Q){if(Q){const Y=J>>>8&255,Z=J>>>0&255;Q.text(`gsDPSetPrimColor(${Y}, ${Z}, ${Q.rgba8888(q)});`)}this.state.primColor=q}executeSetPrimDepth(J,q,Q){const Y=q>>>16&65535,Z=q&65535;if(Q)Q.text(`gsDPSetPrimDepth(${Y},${Z});`)}executeSetEnvColor(J,q,Q){if(Q)Q.text(`gsDPSetEnvColor(${Q.rgba8888(q)});`);this.state.envColor=q}executeSetCombine(J,q,Q){if(Q){const Y=J&16777215,Z=q,K=_9(Y,Z);Q.text(`gsDPSetCombine(${N(Y)}, ${N(Z)});\n${K}`)}this.state.combine.hi=J&16777215,this.state.combine.lo=q}executeSetTImg(J,q,Q){const Y=J>>>21&7,Z=J>>>19&3,K=(J>>>0&4095)+1,X=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsDPSetTextureImage(${Z0.nameOf(Y)}, ${p.nameOf(Z)}, ${K}, ${N(X)});`);this.state.textureImage.set(Y,Z,K,X)}executeSetZImg(J,q,Q){const Y=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsDPSetDepthImage(${N(Y)});`);this.state.depthImage.address=Y}executeSetCImg(J,q,Q){const Y=J>>>21&7,Z=J>>>19&3,K=(J>>>0&4095)+1,X=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsDPSetColorImage(${Z0.nameOf(Y)}, ${p.nameOf(Z)}, ${K}, ${N(X)});`);if(this.state.colorImage={format:Y,size:Z,width:K,address:X},n64js.hardware().timeline.addEvent(`SetColorImage ${N(X)}`),TH&&!vX.get(X))M(`Setting colorImage to ${N(X)}, ${K}, size ${p.nameOf(Z)}, format ${Z0.nameOf(Y)}`),vX.set(X,!0)}executeLoadBlock(J,q,Q){const Y=q>>>24&7,Z=J>>>12&4095,K=J>>>0&4095,X=q>>>12&4095,W=q>>>0&4095;if(Z!==0)this.warn("Unexpected non-zero uls in load block");if(K!==0)this.warn("Unexpected non-zero ult in load block");if(Q){const j=h0(Y);Q.text(`gsDPLoadBlock(${j}, ${Z}, ${K}, ${X}, ${W});`)}const z=this.state.textureImage,F=this.state.tiles[Y];this.state.tmem.loadBlock(z,F,Z,K,X,W,Q),this.state.invalidateTileHashes()}executeLoadTile(J,q,Q){const Y=q>>>24&7,Z=J>>>12&4095,K=J>>>0&4095,X=q>>>12&4095,W=q>>>0&4095;if(Q){const j=h0(Y);Q.text(`gsDPLoadTile(${j}, ${Z/4}, ${K/4}, ${X/4}, ${W/4});`)}const z=this.state.textureImage,F=this.state.tiles[Y];this.state.tmem.loadTile(z,F,Z,K,X,W,Q),this.state.invalidateTileHashes()}executeLoadTLut(J,q,Q){const Y=q>>>24&7,Z=J>>>12&4095,K=J>>>0&4095,X=q>>>12&4095,W=q>>>0&4095;if(Q){const j=h0(Y);Q.text(`gsDPLoadTLUTCmd(${j}, ${y8(X,Z)}); //${Z}, ${K}, ${X}, ${W}`)}const z=this.state.textureImage,F=this.state.tiles[Y];this.state.tmem.loadTLUT(z,F,Z,K,X,W,Q),this.state.invalidateTileHashes()}executeFillRect(J,q,Q){const Y=(q>>>12&4095)>>>2,Z=(q>>>0&4095)>>>2;let K=(J>>>12&4095)>>>2,X=(J>>>0&4095)>>>2;const W=this.gl;if(Q)Q.text(`gsDPFillRectangle(${Y}, ${Z}, ${K}, ${X});`);if(this.state.depthImage.address==this.state.colorImage.address){W.clearDepth(1),W.depthMask(!0),W.clear(W.DEPTH_BUFFER_BIT);return}const z=this.state.getCycleType();let F={r:0,g:0,b:0,a:0};if(z===K0.G_CYC_FILL){if(K+=1,X+=1,this.state.colorImage.size===p.G_IM_SIZ_16b)F=_H(this.state.fillColor&65535);else F=uX(this.state.fillColor);const j=K-Y,G=X-Z;if(j===this.renderer.nativeTransform.viWidth&&G===this.renderer.nativeTransform.viHeight){W.clearColor(F.r,F.g,F.b,F.a),W.clear(W.COLOR_BUFFER_BIT);return}}else if(z===K0.G_CYC_COPY)K+=1,X+=1;this.renderer.fillRect(Y,Z,K,X,F)}executeTexRect(J,q,Q){this.state.nextCommand();const Y=this.state.cmd1;this.state.nextCommand();const Z=this.state.cmd1;this.rdpTexRect(J,q,Y,Z,Q)}rdpTexRect(J,q,Q,Y,Z){let K=(J>>>12&4095)/4,X=(J>>>0&4095)/4;const W=q>>>24&7,z=(q>>>12&4095)/4,F=(q>>>0&4095)/4;let j=(Q>>>16&65535)/32,G=(Q>>>0&65535)/32,P=((Y|0)>>16)/1024;const L=(Y<<16>>16)/1024,U=this.state.getCycleType();if(U===K0.G_CYC_COPY)P*=0.25;if(U===K0.G_CYC_COPY||U===K0.G_CYC_FILL)K+=1,X+=1;if(P<0)j++;if(L<0)G++;const O=j+P*(K-z),E=G+L*(X-F);if(Z){const w=h0(W);Z.text(`gsSPTextureRectangle(${z},${F},${K},${X},${w},${j},${G},${P},${L});`),Z.tip(`cmd2 = ${N(Q)}, cmd3 = ${N(Y)}`),Z.tip(`st0 = (${j}, ${G}) st1 = (${O}, ${E})`)}this.renderer.texRect(W,z,F,K,X,j,G,O,E,!1)}executeTexRectFlip(J,q,Q){this.state.nextCommand();const Y=this.state.cmd1;this.state.nextCommand();const Z=this.state.cmd1;this.rdpTexRectFlip(J,q,Y,Z,Q)}rdpTexRectFlip(J,q,Q,Y,Z){let K=(J>>>12&4095)/4,X=(J>>>0&4095)/4;const W=q>>>24&7,z=(q>>>12&4095)/4,F=(q>>>0&4095)/4;let j=(Q>>>16&65535)/32,G=(Q>>>0&65535)/32,P=((Y|0)>>16)/1024;const L=(Y<<16>>16)/1024,U=this.state.getCycleType();if(U===K0.G_CYC_COPY)P*=0.25;if(U===K0.G_CYC_COPY||U===K0.G_CYC_FILL)K+=1,X+=1;if(P<0)j++;if(L<0)G++;const O=j+P*(X-F),E=G+L*(K-z);if(Z){const w=h0(W);Z.text(`gsSPTextureRectangleFlip(${z},${F},${K},${X},${w},${j},${G},${P},${L});`),Z.tip(`cmd2 = ${N(Q)}, cmd3 = ${N(Y)}`),Z.tip(`st0 = (${j}, ${G}) st1 = (${O}, ${E})`)}this.renderer.texRect(W,z,F,K,X,j,G,O,E,!0)}executeCullDL(J,q,Q){const Y=(J&65535)>>>1,Z=(q&65535)>>>1,K=this.testClipFlags(Y,Z);if(Q)Q.text(`gSPCullDisplayList(${Y}, ${Z}); // ${K?"continue":"end"}`);if(!K)this.state.endDisplayList()}testClipFlags(J,q){if(q<=J)return this.warn("begin and end vertices for testClipFlags are inverted or empty"),!0;if(q>=this.state.projectedVertices.length)return this.warn("end vertex for testClipFlags is out of bounds"),!0;let Q=~0;for(let Y=J;Y<=q;Y++)Q&=this.state.projectedVertices[Y].clipFlags;return Q==0}calcTextureScale(J){if(J===0||J===65535)return 1;return J/65536}}var v9=!1;class v6 extends NJ{constructor(J,q){super(J,q);this.vertexStride=2,this.gbi1Commands=new Map([[0,this.executeSpNoop.bind(this)],[1,this.executeMatrix.bind(this)],[3,this.executeMoveMem.bind(this)],[4,this.executeVertex.bind(this)],[6,this.executeDL.bind(this)],[9,this.executeSprite2DBase.bind(this)],[175,this.executeLoadUcode.bind(this)],[176,this.executeBranchZ.bind(this)],[177,this.executeTri2.bind(this)],[178,this.executeModifyVertex.bind(this)],[179,this.executeRDPHalf2.bind(this)],[180,this.executeRDPHalf1.bind(this)],[181,this.executeLine3D.bind(this)],[182,this.executeClearGeometryMode.bind(this)],[183,this.executeSetGeometryMode.bind(this)],[184,this.executeEndDL.bind(this)],[185,this.executeSetOtherModeL.bind(this)],[186,this.executeSetOtherModeH.bind(this)],[187,this.executeTexture.bind(this)],[188,this.executeMoveWord.bind(this)],[189,this.executePopMatrix.bind(this)],[190,this.executeCullDL.bind(this)],[191,this.executeTri1.bind(this)],[192,this.executeNoop.bind(this)]])}getHandler(J){const q=this.gbi1Commands.get(J);if(q)return q;return super.getHandler(J)}executeDL(J,q,Q){const Y=J>>>16&255,Z=this.state.rdpSegmentAddress(q);if(Q){const K=Y===M8?"gsSPDisplayList":"gsSPBranchList";Q.text(`${K}(${N(Z)});`)}if(Y===M8)this.state.pushDisplayList(Z);else this.state.branchDisplayList(Z)}executeEndDL(J,q,Q){if(Q)Q.text("gsSPEndDisplayList();");this.state.endDisplayList()}executeBranchZ(J,q,Q){const Y=this.state.rdpSegmentAddress(this.state.rdpHalf1Cmd1);if(this.warnUnimplemented("BranchLessZ"),Q)Q.text("gsSPBranchLessZ(/* TODO */);");this.state.branchDisplayList(Y)}executeClearGeometryMode(J,q,Q){if(Q)Q.text(`gsSPClearGeometryMode(${h8(a0,q)});`);this.state.geometryModeBits&=~q,this.state.updateGeometryModeFromBits(a0)}executeSetGeometryMode(J,q,Q){if(Q)Q.text(`gsSPSetGeometryMode(${h8(a0,q)});`);this.state.geometryModeBits|=q,this.state.updateGeometryModeFromBits(a0)}executeSetOtherModeL(J,q,Q){const Y=J>>>8&255,Z=J>>>0&255,K=q,X=(1<>>0;if(Q)E9(Q,X,K);this.state.rdpOtherModeL=this.state.rdpOtherModeL&~X|K}executeSetOtherModeH(J,q,Q){const Y=J>>>8&255,Z=J>>>0&255,K=q,X=(1<>>0;if(Q)w9(Q,X,Z,Y,K);this.state.rdpOtherModeH=this.state.rdpOtherModeH&~X|K}executeTexture(J,q,Q){const Y=J>>>16&255,Z=J>>>11&3,K=J>>>8&7,X=J>>>0&255,W=this.calcTextureScale(q>>>16&65535),z=this.calcTextureScale(q>>>0&65535);if(Q){const F=W.toString(),j=z.toString(),G=h0(K),P=X?"G_ON":"G_OFF";if(Y!==0)Q.text(`gsSPTextureL(${F}, ${j}, ${Z}, ${Y}, ${G}, ${P});`);else Q.text(`gsSPTexture(${F}, ${j}, ${Z}, ${G}, ${P});`)}if(this.state.setTexture(W,z,Z,K),X)this.state.geometryModeBits|=a0.G_TEXTURE_ENABLE;else this.state.geometryModeBits&=~a0.G_TEXTURE_ENABLE;this.state.updateGeometryModeFromBits(a0)}executeMatrix(J,q,Q){const Y=J>>>16&255,Z=J>>>0&65535,K=this.state.rdpSegmentAddress(q);let X=this.loadMatrix(K,Z);if(Q){let z="";z+=Y&Z9?"G_MTX_PROJECTION":"G_MTX_MODELVIEW",z+=Y&LQ?"|G_MTX_LOAD":"|G_MTX_MUL",z+=Y&VQ?"|G_MTX_PUSH":"",Q.text(`gsSPMatrix(${N(K)}, ${z});`),Q.tip(this.previewMatrix(X))}const W=Y&Z9?this.state.projection:this.state.modelview;if((Y&LQ)==0)X=W[W.length-1].multiply(X);if(Y&VQ)W.push(X);else W[W.length-1]=X}executePopMatrix(J,q,Q){const Y=q>>>0&255;if(Q){let Z="";Z+=Y&Z9?"G_MTX_PROJECTION":"G_MTX_MODELVIEW",Q.text(`gsSPPopMatrix(${Z});`)}if(this.state.modelview.length>0)this.state.modelview.pop()}executeVertex(J,q,Q){const Y=(J>>>16&255)/this.vertexStride,Z=J>>>10&63,K=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(K)}, ${Y}, ${Z});`);this.loadVertices(Y,Z,K,Q)}executeModifyVertex(J,q,Q){if(this.warnUnimplemented("ModifyVertex"),Q)Q.text("gsSPModifyVertex(???);")}executeSprite2DBase(J,q,Q){if(this.warnUnimplemented("Sprite2DBase"),Q)Q.text("gsSPSprite2DBase(/* TODO */);")}executeMoveMem(J,q,Q){const Y=J>>>16&255,Z=J>>>0&65535,K=this.state.rdpSegmentAddress(q);if(Q){const X=N(K),W=z0.nameOf(Y);let z=`gsDma1p(G_MOVEMEM, ${X}, ${Z}, ${W});`;switch(Y){case z0.G_MV_VIEWPORT:if(Z===16)z=`gsSPViewport(${X});`;break}Q.text(z),this.previewMoveMem(Y,Z,K,Q)}switch(Y){case z0.G_MV_VIEWPORT:this.loadViewport(K);break;case z0.G_MV_L0:case z0.G_MV_L1:case z0.G_MV_L2:case z0.G_MV_L3:case z0.G_MV_L4:case z0.G_MV_L5:case z0.G_MV_L6:case z0.G_MV_L7:{const X=(Y-z0.G_MV_L0)/2;this.loadLight(X,K)}break}}previewMoveMem(J,q,Q,Y){let Z="";for(let K=0;K>>8&65535,K=q;let X="";switch(Y){case j0.G_MW_MATRIX:this.warnUnimplemented("MoveWord Matrix");break;case j0.G_MW_NUMLIGHT:{let W=(K-2147483648>>>5)-1;if(Q){if(Z===LX)X=`gsSPNumLights(${G9.nameOf(W)});`}this.state.numLights=W}break;case j0.G_MW_CLIP:if(Q)X=`gSPClipRatio(${K9.nameOf(Z)}, ${j9.nameOf(K)});`;break;case j0.G_MW_SEGMENT:{const W=Z>>>2&15;if(Q)X=`gsSPSegment(${N9.nameOf(W)}, ${N(K)});`;this.state.segments[W]=K}break;case j0.G_MW_FOG:{const W=q>>16,z=q&65535;if(Q)X=`gSPFogPosition(${W}, ${z});`;this.state.fogParameters.set(W,z)}break;case j0.G_MW_LIGHTCOL:this.warnUnimplemented("MoveWord LightCol");break;case j0.G_MW_POINTS:this.warnUnimplemented("MoveWord Points");break;case j0.G_MW_PERSPNORM:if(Q)X=`gSPPerspNormalize(${K});`;break;default:this.warnUnimplemented("MoveWord Unknown");break}if(Q){if(!X)X=`gMoveWd(${j0.nameOf(Y)}, ${r(Z)}, ${N(K)});`;Q.text(X)}}executeTri1(J,q,Q){const Y=this.vertexStride,Z=this.state.projectedVertices,K=this.triangleBuffer;K.reset();let X=Q?1:0,W=this.state.executeBatch(X,(z,F)=>{const j=F>>>24&255,G=(F>>>16&255)/Y,P=(F>>>8&255)/Y,L=(F>>>0&255)/Y;if(Q)Q.text(`gsSP1Triangle(${G}, ${P}, ${L}, ${j});`);return K.pushTri(Z[G],Z[P],Z[L]),K.hasCapacity(1)});this.debugController.currentOp+=W-1,this.renderer.flushTris(K)}executeTri2(J,q,Q){const Y=this.vertexStride,Z=this.state.projectedVertices,K=this.triangleBuffer;K.reset();let X=Q?1:0,W=this.state.executeBatch(X,(z,F)=>{const j=(z>>>16&255)/Y,G=(z>>>8&255)/Y,P=(z>>>0&255)/Y,L=(F>>>16&255)/Y,U=(F>>>8&255)/Y,O=(F>>>0&255)/Y;if(Q)Q.text(`gsSP1Triangle2(${j},${G},${P}, ${L},${U},${O});`);return K.pushTri(Z[j],Z[G],Z[P]),K.pushTri(Z[L],Z[U],Z[O]),K.hasCapacity(2)});this.debugController.currentOp+=W-1,this.renderer.flushTris(K)}executeLine3D(J,q,Q){const Y=this.vertexStride,Z=this.state.projectedVertices,K=this.triangleBuffer;K.reset();let X=Q?1:0,W=this.state.executeBatch(X,(z,F)=>{const j=(F>>>24&255)/Y,G=(F>>>16&255)/Y,P=(F>>>8&255)/Y,L=(F>>>0&255)/Y;if(Q)Q.text(`gsSPLine3D(${G}, ${P}, ${L}, ${j});`);if(G>>20&15)+1,Z=J>>>16&15,K=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(K)}, ${Z}, ${Y});`);this.loadVertices(Z,Y,K,Q)}executeRDPHalf_Cont(J,q,Q){if(this.warnUnimplemented("RDPHalf_Cont"),Q)Q.text("gsDPHalf_Cont(/* TODO */);")}executeRDPHalf1Goldeneye(J,q,Q){if(this.warnUnimplemented("executeRDPHalf1"),Q)Q.text("gsSPRDPHalf();")}executeTri4(J,q,Q){const Y=this.state.projectedVertices,Z=this.triangleBuffer;Z.reset();let K=Q?1:0,X=this.state.executeBatch(K,(W,z)=>{const F=W>>>12&15,j=W>>>8&15,G=W>>>4&15,P=W>>>0&15,L=z>>>28&15,U=z>>>24&15,O=z>>>20&15,E=z>>>16&15,w=z>>>12&15,y=z>>>8&15,S=z>>>4&15,g=z>>>0&15;if(Q)Q.text(`gsSP1Triangle4(${P},${g},${S}, ${G},${y},${w}, ${j},${E},${O}, ${F},${U},${L});`);if(P!==g)Z.pushTri(Y[P],Y[g],Y[S]);if(G!==y)Z.pushTri(Y[G],Y[y],Y[w]);if(j!==E)Z.pushTri(Y[j],Y[E],Y[O]);if(F!==U)Z.pushTri(Y[F],Y[U],Y[L]);return Z.hasCapacity(4)});this.debugController.currentOp+=X-1,this.renderer.flushTris(Z)}}class TQ extends $6{constructor(J,q){super(J,q);this.vertexStride=10,this.geCommands=new Map([[180,this.executeRDPHalf1Goldeneye.bind(this)]])}getHandler(J){const q=this.geCommands.get(J);if(q)return q;return super.getHandler(J)}}class _Q extends $6{constructor(J,q){super(J,q);this.vertexStride=10,this.auxAddress=0,this.pdCommands=new Map([[7,this.executeSetVertexColorIndex.bind(this)],[180,this.executeRDPHalf1Goldeneye.bind(this)]])}getHandler(J){const q=this.pdCommands.get(J);if(q)return q;return super.getHandler(J)}executeSetVertexColorIndex(J,q,Q){const Y=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPSetVertexColorIndex(${N(Y)});`);this.auxAddress=Y}loadVertices(J,q,Q,Y){const Z=this.state.geometryMode.lighting,K=this.state.geometryMode.textureGen,X=this.state.geometryMode.textureGenLinear,W=new DataView(this.ramDV.buffer,Q),z=new DataView(this.ramDV.buffer,this.auxAddress);if(Y)this.previewVertex(J,q,W,Y,Z);if(J+q>=this.state.projectedVertices.length){this.warn("Too many verts");return}const F=12,j=this.state.modelview[this.state.modelview.length-1],P=this.state.projection[this.state.projection.length-1].multiply(j),L=this.state.texture.scaleS/32,U=this.state.texture.scaleT/32,O=new X0,E=new X0,w=new X0,y=this.renderer.nativeTransform.viTransform,S=this.state.viewport.transform;for(let g=0;g>>9&127,Z=(J>>>16&255)/5,K=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(K)}, ${Z}, ${Y});`);this.loadVertices(Z,Y,K,Q)}}class vQ extends $6{constructor(J,q){super(J,q);this.vertexStride=5}executeVertex(J,q,Q){const Y=(J>>>4&4095)/33+1,K=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(K)}, 0, ${Y});`);this.loadVertices(0,Y,K,Q)}}class fQ extends $6{constructor(J,q){super(J,q);this.vertexStride=10,this.matrixAddress=0,this.matrixIndex=0,this.matrixArray=[y0.identity(),y0.identity(),y0.identity(),y0.identity()],this.vertexAddress=0,this.vertexOffset=0,this.billboardMode=!1,this.dkrCommands=new Map([[5,this.executeTriDMA.bind(this)],[7,this.executeDisplayListLen.bind(this)],[191,this.executeSetAddresses.bind(this)]])}getHandler(J){const q=this.dkrCommands.get(J);if(q)return q;return super.getHandler(J)}executeDisplayListLen(J,q,Q){const Y=J>>>16&255,Z=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPDisplayListLen(${N(Z)}, ${Y});`);this.state.pushDisplayList(Z,Y)}executeSetAddresses(J,q,Q){if(this.matrixAddress=this.state.rdpSegmentAddress(J),this.vertexAddress=this.state.rdpSegmentAddress(q),this.vertexOffset=0,Q)Q.text(`gsSPSetAddress(${N(this.matrixAddress)}, ${N(this.vertexAddress)};`)}executeMoveWord(J,q,Q){const Y=J&255;if(Y==2){if(this.billboardMode=(q&1)!=0,Q)Q.text(`gSetBillboardMode(${this.billboardMode});`)}else if(Y==10){if(this.matrixIndex=q>>6&3,Q)Q.text(`gSetMatrixIndex(${this.matrixIndex});`)}else super.executeMoveWord(J,q,Q)}executeTexture(J,q,Q){const Y=J>>>16&255,Z=J>>>11&3,K=J>>>8&7,W=this.calcTextureScale(q>>>16&65535),z=this.calcTextureScale(q>>>0&65535);if(Q){const F=W.toString(),j=z.toString(),G=h0(K);if(Y!==0)Q.text(`gsSPTextureL(${F}, ${j}, ${Z}, ${Y}, ${G}, G_ON);`);else Q.text(`gsSPTexture(${F}, ${j}, ${Z}, ${G}, G_ON);`)}this.state.setTexture(W,z,Z,K),this.state.geometryModeBits|=a0.G_TEXTURE_ENABLE,this.state.updateGeometryModeFromBits(a0)}executeMatrix(J,q,Q){const Y=this.matrixAddress+q,Z=J>>22&3,K=J&65535,X=this.loadMatrix(Y,K);if(Q)Q.text(`gsSPMatrix(${N(Y)}, ${Z});`),Q.tip(this.previewMatrix(X));this.matrixArray[Z]=X,this.matrixIndex=Z}executeVertex(J,q,Q){const Y=this.vertexAddress+q,Z=(J>>>19&31)+1,K=J&65536,X=J>>>9&31;if(this.billboardMode)this.vertexOffset=K?1:0;else if(!K)this.vertexOffset=0;const W=this.vertexOffset+X;if(Q)Q.text(`gsSPVertex(${N(Y)}, ${W}, ${Z});`);this.loadVertices(W,Z,Y,Q),this.vertexOffset+=Z}loadVertices(J,q,Q,Y){if(J+q>=this.state.projectedVertices.length){this.warn("Too many verts");return}const Z=10,K=new DataView(this.ramDV.buffer,Q);let X=this.matrixArray[this.matrixIndex];const W=this.renderer.nativeTransform.viTransform,z=this.state.viewport.transform,F=new X0;if(this.billboardMode){X=X.copy();const G=this.state.projectedVertices[0].pos;X.elems[3]+=G.x,X.elems[7]+=G.y,X.elems[11]+=G.z,X.elems[15]+=G.w}let j="";if(Y){const G=["#","x","y","z","rgba"];j+='',j+=`\n`}for(let G=0,P=0;G\n`}}if(Y)j+="
${G.join("")}
${U.join("")}
",Y.tip(j)}executeTriDMA(J,q,Q){const Y=J>>>4&31,Z=this.state.rdpSegmentAddress(q),K=new DataView(this.ramDV.buffer,Z),X=this.state.projectedVertices,W=this.triangleBuffer;if(W.reset(),Q)Q.text(`gsSPTriDMA(${N(Z)}, ${Y});`);let z="";if(Y>W.maxTris)this.warn(`Too many triangles for buffer: ${Y} > ${W.maxTris}`);const F=16;for(let j=0;j>>16&255,Z=this.state.rdpSegmentAddress(q);if(Q){const K=Y===M8?"gsSPDisplayList":"gsSPBranchList";Q.text(`${K}(${N(Z)});`)}if(Y===M8)this.state.pushDisplayList(Z);else this.state.branchDisplayList(Z)}executeEndDL(J,q,Q){if(Q)Q.text("gsSPEndDisplayList();");this.state.endDisplayList()}executeSetOtherModeL(J,q,Q){const Y=J>>>8&255,Z=J>>>0&255,K=q,X=2147483648>>Z>>>Y;if(Q)E9(Q,X,K);this.state.rdpOtherModeL=this.state.rdpOtherModeL&~X|K}executeSetOtherModeH(J,q,Q){const Y=J>>>8&255,Z=J>>>0&255,K=q,X=2147483648>>Z>>>Y;if(Q)w9(Q,X,Z,Y,K);this.state.rdpOtherModeH=this.state.rdpOtherModeH&~X|K}executeMatrix(J,q,Q){const Y=this.state.rdpSegmentAddress(q),Z=(J&1)===0,K=J>>>1&1,X=J>>>2&1;let W=this.loadMatrix(Y,64);if(Q){let F="";F+=X?"G_MTX_PROJECTION":"G_MTX_MODELVIEW",F+=K?"|G_MTX_LOAD":"|G_MTX_MUL",F+=Z?"|G_MTX_PUSH":"",Q.text(`gsSPMatrix(${N(Y)}, ${F});`),Q.tip(this.previewMatrix(W))}const z=X?this.state.projection:this.state.modelview;if(!K)W=z[z.length-1].multiply(W);if(Z)z.push(W);else z[z.length-1]=W}executeVertex(J,q,Q){const Y=(J&255)>>1,Z=J>>>12&255,K=Y-Z,X=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(X)}, ${K}, ${Z});`);this.loadVertices(K,Z,X,Q)}executeBranchZ(J,q,Q){if(this.warnUnimplemented("BranchZ"),Q)Q.text("gsSPBranchZ(/* TODO */);")}executeLine3D(J,q,Q){if(this.warnUnimplemented("Line3D"),Q)Q.text("gsSPLine3D(/* TODO */);")}executeBgRect1Cyc(J,q,Q){if(this.warnUnimplemented("BgRect1Cyc"),Q)Q.text("gsSPBgRect1Cyc(/* TODO */);")}executeBgRectCopy(J,q,Q){if(this.warnUnimplemented("BgRectCopy"),Q)Q.text("gsSPBgRectCopy(/* TODO */);")}executeObjRenderMode(J,q,Q){if(this.warnUnimplemented("ObjRenderMode"),Q)Q.text("gsSPObjRenderMode(/* TODO */);")}executeDmaIo(J,q,Q){if(Q)Q.text("DmaIo(/* TODO */);")}executeTri1(J,q,Q){const Y=this.state.projectedVertices,Z=this.triangleBuffer;Z.reset();let K=Q?1:0,X=this.state.executeBatch(K,(W,z)=>{const F=W>>>1&127,j=W>>>9&127,G=W>>>17&127,P=z>>>24&255;if(Q)Q.text(`gsSP1Triangle(${F},${j},${G}, ${P});`);return Z.pushTri(Y[F],Y[j],Y[G]),Z.hasCapacity(1)});this.debugController.currentOp+=X-1,this.renderer.flushTris(Z)}executeTri2(J,q,Q){const Y=this.state.projectedVertices,Z=this.triangleBuffer;Z.reset();let K=Q?1:0,X=this.state.executeBatch(K,(W,z)=>{const F=z>>>1&127,j=z>>>9&127,G=z>>>17&127,P=W>>>1&127,L=W>>>9&127,U=W>>>17&127;if(Q)Q.text(`gsSP2Triangles(${F},${j},${G}, ${P},${L},${U});`);return Z.pushTri(Y[F],Y[j],Y[G]),Z.pushTri(Y[P],Y[L],Y[U]),Z.hasCapacity(2)});this.debugController.currentOp+=X-1,this.renderer.flushTris(Z)}executeQuad(J,q,Q){const Y=this.state.projectedVertices,Z=this.triangleBuffer;Z.reset();let K=Q?1:0,X=this.state.executeBatch(K,(W,z)=>{const F=z>>>1&127,j=z>>>9&127,G=z>>>17&127,P=W>>>1&127,L=W>>>9&127,U=W>>>17&127;if(Q)Q.text(`gSP1Quadrangle(${F},${j},${G}, ${P},${L},${U});`);return Z.pushTri(Y[F],Y[j],Y[G]),Z.pushTri(Y[P],Y[L],Y[U]),Z.hasCapacity(2)});this.debugController.currentOp+=X-1,this.renderer.flushTris(Z)}executeModifyVtx(J,q,Q){const Y=J>>>1&32767,Z=J>>>16&255,K=q;if(Q)Q.text(`gsSPModifyVertex(${Y},${O8.nameOf(Z)},${N(K)});`);if(Y>=this.state.projectedVertices.length){this.warn("crazy vertex index",Y);return}const X=this.state.projectedVertices[Y];switch(Z){case O8.G_MWO_POINT_RGBA:this.warnUnimplemented("modifyVtx RGBA");break;case O8.G_MWO_POINT_ST:{const W=K>>16,z=(K&65535)<<16>>16;X.set=!0,X.u=W*this.state.texture.scaleS/32,X.v=z*this.state.texture.scaleT/32}break;case O8.G_MWO_POINT_XYSCREEN:this.warnUnimplemented("modifyVtx XYSCREEN");break;case O8.G_MWO_POINT_ZSCREEN:this.warnUnimplemented("modifyVtx ZSCREEN");break;default:this.warnUnimplemented("modifyVtx");break}}executeTexture(J,q,Q){const Y=J>>>16&255,Z=J>>>11&3,K=J>>>8&7,X=J>>>1&1,W=this.calcTextureScale(q>>>16&65535),z=this.calcTextureScale(q>>>0&65535);if(Q){const F=W.toString(),j=z.toString(),G=h0(K);if(Y!==0)Q.text(`gsSPTextureL(${F}, ${j}, ${Z}, ${Y}, ${G}, ${X});`);else Q.text(`gsSPTexture(${F}, ${j}, ${Z}, ${G}, ${X});`)}if(this.state.setTexture(W,z,Z,K),X)this.state.geometryModeBits|=V6.G_TEXTURE_ENABLE;else this.state.geometryModeBits&=~V6.G_TEXTURE_ENABLE;this.state.updateGeometryModeFromBits(V6)}executeGeometryMode(J,q,Q){const Y=J&16777215,Z=q;if(Q){const K=h8(V6,~Y),X=h8(V6,Z);Q.text(`gsSPGeometryMode(~(${K}),${X});`)}this.state.geometryModeBits&=Y|V6.G_TEXTURE_ENABLE,this.state.geometryModeBits|=Z&~V6.G_TEXTURE_ENABLE,this.state.updateGeometryModeFromBits(V6)}executePopMatrix(J,q,Q){if(Q)Q.text("gsSPPopMatrix(G_MTX_MODELVIEW);");const Z=this.state.modelview;if(Z.length>0)Z.pop()}executeMoveWord(J,q,Q){const Y=J>>>16&255,Z=J&65535,K=q;let X="";switch(Y){case j0.G_MW_MATRIX:this.warnUnimplemented("MoveWord Matrix");break;case j0.G_MW_NUMLIGHT:{let W=Math.floor(K/24);if(Q)X=`gsSPNumLights(${G9.nameOf(W)});`;this.state.numLights=W}break;case j0.G_MW_CLIP:if(Q)X=`gSPClipRatio(${K9.nameOf(Z)}, ${j9.nameOf(K)});`;break;case j0.G_MW_SEGMENT:{const W=Z>>>2&15;if(Q)X=`gsSPSegment(${N9.nameOf(W)}, ${N(K)});`;this.state.segments[W]=K}break;case j0.G_MW_FOG:{const W=q>>16,z=q&65535;if(Q)X=`gSPFogPosition(${W}, ${z});`;this.state.fogParameters.set(W,z)}break;case j0.G_MW_LIGHTCOL:this.warnUnimplemented("MoveWord LightCol");break;case j0.G_MW_POINTS:this.warnUnimplemented("MoveWord Points");break;case j0.G_MW_PERSPNORM:if(Q)X=`gSPPerspNormalize(${K});`;break;default:this.warnUnimplemented("MoveWord Unknown");break}if(Q){if(!X)X=`gMoveWd(${j0.nameOf(Y)}, ${r(Z)}, ${N(K)});`;Q.text(X)}}executeMoveMem(J,q,Q){const Y=this.state.rdpSegmentAddress(q),Z=(J>>>16&255)<<1,K=(J>>>8&255)<<3,X=J&254;let W;if(Q)W=`gsDma1p(G_MOVEMEM, ${N(Y)}, ${Z}, ${K}, ${x0.nameOf(X)});`;switch(X){case x0.G_GBI2_MV_VIEWPORT:if(Q)W=`gsSPViewport(${N(Y)});`;this.loadViewport(Y);break;case x0.G_GBI2_MV_LIGHT:if(K==x0.G_GBI2_MVO_LOOKATX){if(Q)W=`gSPLookAtX(${N(Y)});`}else if(K==x0.G_GBI2_MVO_LOOKATY){if(Q)W=`gSPLookAtY(${N(Y)});`}else if(K>=x0.G_GBI2_MVO_L0&&K<=x0.G_GBI2_MVO_L7){let z=(K-x0.G_GBI2_MVO_L0)/24>>>0;if(Q)W=`gsSPLight(${N(Y)}, ${z})`;if(this.loadLight(z,Y),Z!=16)console.log(`unexpected gsSPLight length ${Z}. Is this setting multiple lights?`)}else if(Q)W+=` // (unknown offset ${r(K)})`;break;case x0.G_GBI2_MV_POINT:this.warnUnimplemented("MoveMem G_GBI2_MV_POINT");break;case x0.G_GBI2_MV_MATRIX:this.warnUnimplemented("MoveMem G_GBI2_MV_MATRIX");break;default:this.warnUnimplemented(`MoveMem ${X.toString(16)}`)}if(Q)Q.text(W),this.previewMoveMem(X,Z,Y,Q)}previewMoveMem(J,q,Q,Y){let Z="";for(let K=0;K>>8&255,K=Z>>>5&7,X=Z>>>3&3,W=J.type<<8>>24,z=(J.texLoadSize+1&W)>>>2,F=0;q.set(K,X,z,J.tileTMEM,F,0,0,0,0,0,0);const j=2,G=J.texLoadSize<>>0&255){case vH:this.state.tmem.loadBlock(Y,q,0,0,G,J.texLoadRows);break;case fH:this.state.tmem.loadTile(Y,q,0,0,G,J.texLoadRows);break;case SH:this.state.tmem.loadTLUT(Y,q,0,0,G,J.texLoadRows);break;default:this.gbi.warnUnimplemented(`load texture type ${J.type}`);break}this.state.invalidateTileHashes()}renderSprite(J){const q=this.sprite,Q=this.matrix,Z=q.objX,K=q.objY,X=q.objW+Z,W=q.objH+K,z=this.state.tiles[0];z.set(q.imageFmt,q.imageSiz,q.imageStride,q.imageAdrs,q.imagePal,R6,0,0,R6,0,0),z.setSize(0,0,q.imageW-1<<2,q.imageH-1<<2);const F=q.imageFlags&1,j=q.imageFlags&16;if(F||j)this.gbi.warnUnimplemented("swapX/Y");const G=0,P=0,L=q.imageW,U=q.imageH;if(J==xQ){const O=Q.x+Q.a*Z+Q.b*K,E=Q.y+Q.c*Z+Q.d*K,w=Q.x+Q.a*X+Q.b*K,y=Q.y+Q.c*X+Q.d*K,S=Q.x+Q.a*Z+Q.b*W,g=Q.y+Q.c*Z+Q.d*W,x=Q.x+Q.a*X+Q.b*W,H0=Q.y+Q.c*X+Q.d*W;this.gbi.renderer.texRectRot(0,O,E,w,y,S,g,x,H0,G,P,L,U)}else if(J==pQ){const O=Q.x+Z/Q.sx,E=Q.y+K/Q.sy,w=Q.x+X/Q.sx,y=Q.y+W/Q.sy;this.gbi.renderer.texRect(0,O,E,w,y,G,P,L,U,!1)}else if(J==mQ){const O=Z,E=X,w=K,y=W;this.gbi.renderer.texRect(0,O,w,E,y,G,P,L,U,!1)}}}class oQ extends v6{constructor(J,q){super(J,q);this.vertexStride=2,this.s2dex=new nQ(J,q,this),this.sdexCommands=new Map([[1,this.s2dex.executeBg1cyc.bind(this.s2dex)],[2,this.s2dex.executeBgCopy.bind(this.s2dex)],[3,this.s2dex.executeObjRectangle.bind(this.s2dex)],[4,this.s2dex.executeObjSprite.bind(this.s2dex)],[5,this.s2dex.executeObjMoveMem.bind(this.s2dex)],[176,this.s2dex.executeSelectDL.bind(this.s2dex)],[177,this.s2dex.executeObjRendermode.bind(this.s2dex)],[178,this.s2dex.executeObjRectangleR.bind(this.s2dex)],[193,this.s2dex.executeObjLoadTxtr.bind(this.s2dex)],[194,this.s2dex.executeObjLoadTxSprite.bind(this.s2dex)],[195,this.s2dex.executeObjLoadTxRect.bind(this.s2dex)],[196,this.s2dex.executeObjLoadTxRectR.bind(this.s2dex)],[200,this.s2dex.executeTriRSP.bind(this.s2dex)],[201,this.s2dex.executeTriRSP.bind(this.s2dex)],[202,this.s2dex.executeTriRSP.bind(this.s2dex)],[203,this.s2dex.executeTriRSP.bind(this.s2dex)],[204,this.s2dex.executeTriRSP.bind(this.s2dex)],[205,this.s2dex.executeTriRSP.bind(this.s2dex)],[206,this.s2dex.executeTriRSP.bind(this.s2dex)],[207,this.s2dex.executeTriRSP.bind(this.s2dex)],[228,this.executeRDPHalf0.bind(this.s2dex)]])}getHandler(J){const q=this.sdexCommands.get(J);if(q)return q;return super.getHandler(J)}executeRDPHalf0(J,q,Q){if(Q)Q.text(`gsImmp1(G_RDPHALF_0, ${N(J)}, ${N(q)});`);this.state.rdpHalf0Cmd0=J,this.state.rdpHalf0Cmd1=q}executeRDPHalf2(J,q,Q){if(Q)Q.text(`gsImmp1(G_RDPHALF_2, ${N(q)});`);this.rdpTexRect(this.state.rdpHalf0Cmd0,this.state.rdpHalf0Cmd1,this.state.rdpHalf1Cmd1,q,Q)}}class cQ extends I8{constructor(J,q){super(J,q);this.vertexStride=2,this.s2dex=new nQ(J,q,this),this.sdexCommands=new Map([[1,this.s2dex.executeObjRectangle.bind(this.s2dex)],[2,this.s2dex.executeObjSprite.bind(this.s2dex)],[4,this.s2dex.executeSelectDL.bind(this.s2dex)],[5,this.s2dex.executeObjLoadTxtr.bind(this.s2dex)],[6,this.s2dex.executeObjLoadTxSprite.bind(this.s2dex)],[7,this.s2dex.executeObjLoadTxRect.bind(this.s2dex)],[8,this.s2dex.executeObjLoadTxRectR.bind(this.s2dex)],[9,this.s2dex.executeBg1cyc.bind(this.s2dex)],[10,this.s2dex.executeBgCopy.bind(this.s2dex)],[11,this.s2dex.executeObjRendermode.bind(this.s2dex)],[200,this.s2dex.executeTriRSP.bind(this.s2dex)],[201,this.s2dex.executeTriRSP.bind(this.s2dex)],[202,this.s2dex.executeTriRSP.bind(this.s2dex)],[203,this.s2dex.executeTriRSP.bind(this.s2dex)],[204,this.s2dex.executeTriRSP.bind(this.s2dex)],[205,this.s2dex.executeTriRSP.bind(this.s2dex)],[206,this.s2dex.executeTriRSP.bind(this.s2dex)],[207,this.s2dex.executeTriRSP.bind(this.s2dex)],[213,this.executeDLCount.bind(this)],[218,this.s2dex.executeObjRectangleR.bind(this.s2dex)]])}getHandler(J){const q=this.sdexCommands.get(J);if(q)return q;return super.getHandler(J)}executeDLCount(J,q,Q){if(this.warnUnimplemented("executeDL_Count"),Q)Q.text("executeDL_Count(/* TODO */);")}executeMoveMem(J,q,Q){const Y=J&254;if(Y==0){const Z=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gSPObjMatrix(${N(Z)});`);this.s2dex.setObjMatrix(Z,Q);return}else if(Y==2){const Z=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gSPObjSubMatrix(${N(Z)});`);this.s2dex.setObjSubMatrix(Z,Q);return}super.executeMoveMem(J,q,Q)}}function JW(J,q,Q){const Y=J.detectVersionString(),Z=W6.dumpMicrocodeSubstring;if(Z!=""&&!nX&&Y.includes(Z))J.dumpCode(),nX=!0;const K=J.computeMicrocodeHash(),X=xH(Y,K),W=gH(X,q,Q);return W.version=Y,W}var gH=function(J,q,Q){switch(J){case g9:return new $6(q,Q);case f9:return new fQ(q,Q);case sX:return new vQ(q,Q);case eX:return new _Q(q,Q);case iX:return new TQ(q,Q);case rX:return new SQ(q,Q);case cX:return new v6(q,Q);case u9:return new bQ(q,Q);case dX:return new oQ(q,Q);case lX:return new I8(q,Q);case tX:return new uQ(q,Q);case aX:return new cQ(q,Q)}return M(`unhandled ucode during table init: ${J}`),new $6(q,Q)},xH=function(J,q){let Q=uH.get(q);if(Q===void 0)Q=mH(J);return pH(J,Q),Q},pH=function(J,q){if(oX.get(J))return;oX.set(J,!0),M(`New RSP graphics ucode seen: ${J} = ucode ${q}`)},mH=function(J){const q=["F3","L3","S2DEX"];let Q=-1;for(let Y of q)if(Q=J.indexOf(Y),Q>=0)break;if(Q>=0){if(J.indexOf("fifo",Q)>=0||J.indexOf("xbux",Q)>=0)return J.indexOf("S2DEX")>=0?aX:lX;return J.indexOf("S2DEX")>=0?dX:cX}return g9},g9=0,cX=1,lX=2,dX=3,aX=4,rX=5,f9=6,u9=7,sX=8,iX=9,tX=10,eX=11,uH=new Map([[1613065980,tX],[1837886526,u9],[202381338,f9],[1899172316,f9],[603530562,iX],[379440285,f9],[651856460,u9],[3401874884,eX],[1824215581,sX],[3713401635,u9],[1691120285,rX],[3610907332,g9],[826213259,g9]]),nX=!1,oX=new Map;class c0{constructor(J,q,Q,Y){if(Y!==void 0)this.elems=new Float32Array(4),this.elems[0]=J,this.elems[1]=q,this.elems[2]=Q,this.elems[3]=Y;else this.elems=J||new Float32Array(4)}get x(){return this.elems[0]}get y(){return this.elems[1]}get z(){return this.elems[2]}get w(){return this.elems[3]}set x(J){this.elems[0]=J}set y(J){this.elems[1]=J}set z(J){this.elems[2]=J}set w(J){this.elems[3]=J}set(J,q,Q,Y){return this.x=J,this.y=q,this.z=Q,this.w=Y,this}setV3(J,q){return this.x=J.x,this.y=J.y,this.z=J.z,this.w=q,this}dot(J){var q=0;for(var Q=0;Q0)return this.scaleInPlace(1/J);return this}static create(J){var q=new X0;return q.elems[0]=J[0],q.elems[1]=J[1],q.elems[2]=J[2],q.elems[3]=J[3],q}}class lQ{constructor(){this.pos=new c0,this.color=0,this.u=0,this.v=0,this.clipFlags=0,this.set=!1}calculateLinearUV(J){this.u=0.5*(1+J.x),this.v=0.5*(1+J.y)}calculateSphericalUV(J){this.u=Math.acos(J.x)/Math.PI,this.v=Math.acos(J.y)/Math.PI}}class GJ{constructor(J,q){this.scale=J||new c0(1,1,1,1),this.trans=q||new c0(0,0,0,0)}transformInPlace(J){J.vecScaleInPlace(this.scale),J.addInPlace(this.trans)}invTransformInPlace(J){J.subInPlace(this.trans),J.invVecScaleInPlace(this.scale)}}var oH=function(){return n64js.hardware().cachedMemDevice.s32},qW=function(){return n64js.hardware().cachedMemDevice.u8},dQ=function(J,q,Q,Y){let Z=q>>2,K=q+Q>>2;while(Z>>0,++Z;return Y},QW=function(J,q,Q,Y,Z){for(let K=0;K>>2,z=Y>>>2,F=J.calcAddress(W,z),j=Z-Q+1&4095,G=J.texelsToBytes(j),P=G+7>>>3,L=this.tmemData32;let U=F>>>2,O=q.tmem<<3>>>2;const E=oH(),w=q.size==p.G_IM_SIZ_32b?2:1;if(X)X.tip(`bytes ${G}, qwords ${P}`);if(K===0)QW(L,O,E,U,P);else{const y=Math.ceil(2048/K);let S=0;for(let g=0;g>>2,z=Y>>>2,F=Z>>>2,j=K>>>2,G=F+1-W,P=j+1-z,L=J.calcAddress(W,z),U=J.texelsToBytes(G),O=J.stride(),E=this.tmemData;let w=q.tmem<<3,y=L;const S=J.size==p.G_IM_SIZ_32b?q.line<<4:q.line<<3,g=q.size==p.G_IM_SIZ_32b?8:4;if(X)X.tip(`size (${G} x ${P}), rowBytes ${U}, ramStride ${O}, tmemStride ${S}, ramOffset ${N(y)}, tmemOffset ${r(w)}`);const x=qW();for(let H0=0;H0>>2,z=Y>>>2,F=J.calcAddress(W,z,p.G_IM_SIZ_16b),j=y8(Z,Q),G=qW();var P=q.tmem<<3;if(X)X.tip(`count ${j}, tmemOffset ${r(P)}`);aH(this.tmemData,P,G,F,j)}convertTexels(J,q,Q){return OX(Q,this.tmemData,J,q)}calculateCRC(J){if(J.hash)return J.hash;var q=J.height,Q=this.tmemData32,Y=J.tmem<<3,Z=J.line<<3;if(J.format==Z0.G_IM_FMT_RGBA&&J.size==p.G_IM_SIZ_32b)Z*=2;var K=q*Z,X=dQ(Q,Y,K,0);if(J.format===Z0.G_IM_FMT_CI||J.format===Z0.G_IM_FMT_RGBA){if(J.size===p.G_IM_SIZ_8b)X=dQ(Q,2048,2048,X);else if(J.size===p.G_IM_SIZ_4b)X=dQ(Q,2048+J.palette*16*2,128,X)}return J.hash=X,X}}var rQ=function(J,q){return J<>>1};class sQ{constructor(){this.ramDV=null,this.pc=0,this.pcEnd=0,this.dlistStack=[],this.cmd0=0,this.cmd1=0,this.segments=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.tiles=new Array(8),this.lights=new Array(8),this.numLights=0,this.geometryModeBits=0,this.geometryMode={zbuffer:0,texture:0,shade:0,shadeSmooth:0,cullFront:0,cullBack:0,fog:0,lighting:0,textureGen:0,textureGenLinear:0,lod:0},this.rdpOtherModeL=0,this.rdpOtherModeH=0,this.rdpHalf0Cmd0=0,this.rdpHalf0Cmd1=0,this.rdpHalf1Cmd1=0,this.rdpHalf2Cmd1=0,this.viewport=new YW,this.projection=[],this.modelview=[],this.projectedVertices=new Array(64),this.scissor={mode:0,x0:0,y0:0,x1:320,y1:240},this.texture={tile:0,level:0,scaleS:1,scaleT:1},this.combine={lo:0,hi:0},this.fillColor=0,this.envColor=0,this.primColor=0,this.blendColor=0,this.fogColor=0,this.primDepth=0,this.fogParameters=new ZW,this.colorImage={format:0,size:0,width:0,address:0},this.textureImage=new KW,this.depthImage={address:0},this.tmem=new aQ,this.screenContext2d=null}reset(J,q){this.ramDV=J,this.pc=q,this.pcEnd=0,this.dlistStack=[],this.cmd0=0,this.cmd1=0;for(let Q=0;Q=this.pcEnd)this.endDisplayList();if(this.pc==0)return!1;return this.cmd0=this.ramDV.getUint32(this.pc+0),this.cmd1=this.ramDV.getUint32(this.pc+4),this.pc+=8,!0}advanceIfCommand(J){if(this.pc==0||this.pcEnd&&this.pc>this.pcEnd)return!1;const q=this.ramDV.getUint32(this.pc+0);if(q>>>24!==J)return!1;return this.cmd0=q,this.cmd1=this.ramDV.getUint32(this.pc+4),this.pc+=8,!0}executeBatch(J,q){const Q=this.cmd0>>>24,Y=J<=0;let Z=0;do if(Z++,!q(this.cmd0,this.cmd1))break;while((Y||Z>>24&15;return(this.segments[q]&8388607)+(J&8388607)}setTexture(J,q,Q,Y){this.texture.scaleS=J,this.texture.scaleT=q,this.texture.level=Q,this.texture.tile=Y}updateGeometryModeFromBits(J){var q=this.geometryMode,Q=this.geometryModeBits;q.zbuffer=Q&J.G_ZBUFFER?1:0,q.texture=Q&J.G_TEXTURE_ENABLE?1:0,q.shade=Q&J.G_SHADE?1:0,q.shadeSmooth=Q&J.G_SHADING_SMOOTH?1:0,q.cullFront=Q&J.G_CULL_FRONT?1:0,q.cullBack=Q&J.G_CULL_BACK?1:0,q.fog=Q&J.G_FOG?1:0,q.lighting=Q&J.G_LIGHTING?1:0,q.textureGen=Q&J.G_TEXTURE_GEN?1:0,q.textureGenLinear=Q&J.G_TEXTURE_GEN_LINEAR?1:0,q.lod=Q&J.G_LOD?1:0}getCycleType(){return this.rdpOtherModeH&L8}getTextureFilterType(){return this.rdpOtherModeH&U8}getTextureLUTType(){return this.rdpOtherModeH&V8}getAlphaCompareType(){return this.rdpOtherModeL&P8}getAntiAliasEnabled(){return(this.rdpOtherModeL&$0.AA_EN)!==0}getCoverageTimesAlpha(){return(this.rdpOtherModeL&$0.CVG_X_ALPHA)!==0}getAlphaCoverageSelect(){return(this.rdpOtherModeL&$0.ALPHA_CVG_SEL)!==0}}class YW{constructor(){this.reset()}reset(){const J=new X0(160,-120,1),q=new X0(160,120,0);this.set(J,q)}set(J,q){this.scale=J,this.trans=q;const Q=new c0().setV3(J,1),Y=new c0().setV3(q,0);this.transform=new GJ(Q,Y)}}class ZW{constructor(){this.reset()}reset(){this.multiplier=0,this.offset=0}set(J,q){this.multiplier=J,this.offset=q}}class KW{constructor(){this.format=0,this.size=0,this.width=0,this.address=0}set(J,q,Q,Y){this.format=J,this.size=q,this.width=Q,this.address=Y}calcAddress(J,q,Q){const Y=Q===void 0?this.size:Q;return this.address+q*rQ(this.width,Y)+rQ(J,Y)}texelsToBytes(J){return rQ(J,this.size)}stride(){return this.texelsToBytes(this.width)}}class N0{constructor(J,q){this.x=J,this.y=q}dot(J){return this.x*J.x+this.y*J.y}lengthSqr(){return this.dot(this)}length(){return Math.sqrt(this.lengthSqr())}add(J){return new N0(this.x+J.x,this.y+J.y)}sub(J){return new N0(this.x-J.x,this.y-J.y)}scale(J){return new N0(this.x*J,this.y*J)}normaliseInPlace(){const J=this.length();if(J>0)this.x/=J,this.y/=J;return this}}class iQ{constructor(J,q){this.scale=J||new N0(1,1),this.trans=q||new N0(0,0)}transform(J){const q=this.scale.x*J.x+this.trans.x,Q=this.scale.y*J.y+this.trans.y;return new N0(q,Q)}}function WW(J,q,Q){let Y=J.data,Z=J.width*4,K=0;if(q',{width:Y,height:Z}),this.texture=J.createTexture()}createScaledCanvas(J){var q=this.width*J,Q=this.height*J,Y=$('',{width:q,height:Q}),Z=this.$canvas[0].getContext("2d"),K=Y[0].getContext("2d"),X=Z.getImageData(0,0,this.width,this.height),W=K.createImageData(q,Q),z=X.data,F=W.data,j=X.width*4,G=W.width*4;for(let O=0;O>>0&255)/255;else if(L)U=0;const O=this.getCurrentN64Shader();X.useProgram(O.program),X.enableVertexAttribArray(O.vertexPositionAttribute),X.bindBuffer(X.ARRAY_BUFFER,this.n64PositionsBuffer),X.bufferData(X.ARRAY_BUFFER,J,X.STATIC_DRAW),X.vertexAttribPointer(O.vertexPositionAttribute,4,X.FLOAT,!1,0,0),X.enableVertexAttribArray(O.vertexColorAttribute),X.bindBuffer(X.ARRAY_BUFFER,this.n64ColorsBuffer),X.bufferData(X.ARRAY_BUFFER,q,X.STATIC_DRAW),X.vertexAttribPointer(O.vertexColorAttribute,4,X.UNSIGNED_BYTE,!0,0,0),X.enableVertexAttribArray(O.texCoordAttribute),X.bindBuffer(X.ARRAY_BUFFER,this.n64UVBuffer),X.bufferData(X.ARRAY_BUFFER,Q,X.STATIC_DRAW),X.vertexAttribPointer(O.texCoordAttribute,2,X.FLOAT,!1,0,0),this.bindTexture(0,X.TEXTURE0,z,j,Z,O.uSamplerUniform0,O.uTexScaleUniform0,O.uTexOffsetUniform0),this.bindTexture(1,X.TEXTURE1,F,G,Z,O.uSamplerUniform1,O.uTexScaleUniform1,O.uTexOffsetUniform1),X.uniform1f(O.uAlphaThresholdUniform,U),X.uniform4f(O.uPrimColorUniform,(this.state.primColor>>>24&255)/255,(this.state.primColor>>>16&255)/255,(this.state.primColor>>>8&255)/255,(this.state.primColor>>>0&255)/255),X.uniform4f(O.uEnvColorUniform,(this.state.envColor>>>24&255)/255,(this.state.envColor>>>16&255)/255,(this.state.envColor>>>8&255)/255,(this.state.envColor>>>0&255)/255)}getCurrentN64Shader(){const J=this.state.combine.hi,q=this.state.combine.lo,Q=this.state.getCycleType(),Y=(this.state.getAlphaCompareType()&c6.G_AC_THRESHOLD)!=0,Z=this.state.getAntiAliasEnabled()&&this.state.getCoverageTimesAlpha();return RX(this.gl,J,q,Q,Y||Z)}lookupTexture(J){const q=this.state.tiles[J];if(q.line===0)return null;const Q=this.state.tmem.calculateCRC(q),Y=`${N(Q)}_${q.format}_${q.size}_${q.width}_${q.height}_${q.palette}`;if(this.textureCache.has(Y))return this.textureCache.get(Y);const Z=this.decodeTexture(q,this.state.getTextureLUTType(),Y);return this.textureCache.set(Y,Z),Z}decodeTexture(J,q,Q){const Y=this.gl,Z=new tQ(Y,J.width,J.height);if(!Z.$canvas[0].getContext)return null;this.$textureOutput.append(`${Q}: ${Z0.nameOf(J.format)}, ${p.nameOf(J.size)},${J.width}x${J.height},
`);const K=Z.$canvas[0].getContext("2d"),X=K.createImageData(Z.nativeWidth,Z.nativeHeight);if(this.state.tmem.convertTexels(J,q,X))WW(X,J.width,J.height),K.putImageData(X,0,0),this.$textureOutput.append(Z.$canvas),this.$textureOutput.append("
");else{const z=`${Z0.nameOf(J.format)}/${p.nameOf(J.size)} is unhandled`;this.$textureOutput.append(z),this.hleHalt(z)}return Y.activeTexture(Y.TEXTURE0),Y.bindTexture(Y.TEXTURE_2D,Z.texture),Y.texImage2D(Y.TEXTURE_2D,0,Y.RGBA,Y.RGBA,Y.UNSIGNED_BYTE,Z.$canvas[0]),Y.generateMipmap(Y.TEXTURE_2D),Y.bindTexture(Y.TEXTURE_2D,null),Z}bindTexture(J,q,Q,Y,Z,K,X,W){const z=this.gl;if(z.activeTexture(q),!Y){z.bindTexture(z.TEXTURE_2D,null);return}let{left:F,top:j}=Q,G=1/Y.nativeWidth,P=1/Y.nativeHeight;if(Y.width===56&&Y.height===29)G*=0.5,P*=0.5;if(Z)G=1,P=1,F=0,j=0;if(G*=NW(Q.shiftS),P*=NW(Q.shiftT),z.bindTexture(z.TEXTURE_2D,Y.texture),z.uniform1i(K,J),z.uniform2f(X,G,P),z.uniform2f(W,F,j),this.state.getTextureFilterType()==w8.G_TF_POINT)z.texParameteri(z.TEXTURE_2D,z.TEXTURE_MAG_FILTER,z.NEAREST),z.texParameteri(z.TEXTURE_2D,z.TEXTURE_MIN_FILTER,z.NEAREST_MIPMAP_NEAREST);else z.texParameteri(z.TEXTURE_2D,z.TEXTURE_MAG_FILTER,z.LINEAR),z.texParameteri(z.TEXTURE_2D,z.TEXTURE_MIN_FILTER,z.LINEAR_MIPMAP_NEAREST);const L=Q.cmS===R6||Q.maskS===0,U=Q.cmT===R6||Q.maskT===0,O=Q.cmS===FJ,E=Q.cmT===FJ,w=L?z.CLAMP_TO_EDGE:O?z.MIRRORED_REPEAT:z.REPEAT,y=U?z.CLAMP_TO_EDGE:E?z.MIRRORED_REPEAT:z.REPEAT;z.texParameteri(z.TEXTURE_2D,z.TEXTURE_WRAP_S,w),z.texParameteri(z.TEXTURE_2D,z.TEXTURE_WRAP_T,y)}setGLBlendMode(){const J=this.gl,q=this.state.getCoverageTimesAlpha(),Q=this.state.getAlphaCoverageSelect(),Y=this.state.getCycleType();if(Y==K0.G_CYC_FILL||Y==K0.G_CYC_COPY){J.disable(J.BLEND);return}const Z=this.state.rdpOtherModeL>>PQ,K=(Y===K0.G_CYC_2CYCLE?Z:Z>>>2)&13107;let X=$W;switch(K){case 0:case 770:X=eQ;break;case 16:case 17:if(!Q||q)X=zW;break;case 272:X=eQ;break;case 784:case 4880:X=HW;break;case 12560:X=FW;break}let W=!1;switch(X){case eQ:J.disable(J.BLEND);break;case zW:J.blendFunc(J.SRC_ALPHA,J.ONE_MINUS_SRC_ALPHA),J.blendEquation(J.FUNC_ADD),J.enable(J.BLEND);break;case HW:J.blendFunc(J.ZERO,J.ONE_MINUS_SRC_ALPHA),J.blendEquation(J.FUNC_ADD),J.enable(J.BLEND);break;case FW:W=!0,J.disable(J.BLEND);break;case $W:W=!0,J.disable(J.BLEND);break}if(W)this.logUnhandledBlendMode(K,Q,q)}logUnhandledBlendMode(J,q,Q){if(jW.get(J))return;jW.set(J,!0),n64js.warn(`Unhandled blend mode: ${r(J)} = ${dJ(J)}, alphaCvgSel ${q}, cvgXAlpha ${Q}`)}}class GW{constructor(){this.initDimensions(320,240)}initDimensions(J,q){this.viWidth=J,this.viHeight=q,this.n64FramebufferToDevice=new iQ(new N0(2/J,-2/q),new N0(-1,1));const Q=J/2,Y=q/2,Z=512,K=511,X=new c0(Q,-Y,Z,1),W=new c0(Q,+Y,K,0);this.viTransform=new GJ(X,W)}convertN64ToDisplay(J){return this.n64FramebufferToDevice.transform(J)}}function VW(J){B0.initUI();const q=J[0];if(rH(q),!U6)return;r0=new JY(U6,I0,640,480),r0.hleHalt=CW,B0.renderer=r0}function UW(){if(r0)r0.reset()}var rH=function(J){if(U6)return;try{U6=J.getContext("webgl")||J.getContext("experimental-webgl")}catch(q){}if(!U6)alert("Unable to initialize WebGL. Your browser may not support it.")};function MW(){return B0.running}function OW(){return B0.requested}function AW(){B0.toggle()}function hW(){B0.debugDisplayList()}function EW(J){B0.onNewTask(J),wW(J,null,-1)}function x9(){n64js.onPresent();const J=n64js.hardware(),q=J.viRegDevice;if(J.timeline.addEvent(`Present ${N(q.dramAddrReg)}`),LW!==0){r0.copyBackBufferToFrontBuffer();return}kW(q);const Q=q.renderBackBuffer();if(!Q)return;r0.copyPixelsToFrontBuffer(Q,q.screenWidth,q.screenHeight,q.bitDepth)}var wW=function(J,q,Q){if(LW++,!U6)return;const Y=n64js.hardware(),Z=Y.cachedMemDevice.mem.dataView;I0.reset(Z,J.dataPtr);let K=PW(J,Z),X=K.buildCommandTable();if(K.onLoadUcode((W,z,F,j)=>{return J.loadUcode(W,z,F,j),K=PW(J,Z),X=K.buildCommandTable(),K}),kW(Y.viRegDevice),r0.newFrame(),B0.running)r0.debugClear();if(q){B0.currentOp=0;while(I0.nextCommand())q.begin(I0.cmd0,I0.cmd1,I0.dlistStack.length),X[I0.cmd0>>>24](I0.cmd0,I0.cmd1,q),q.end(),B0.currentOp++}else{B0.currentOp=0;while(I0.nextCommand())if(X[I0.cmd0>>>24](I0.cmd0,I0.cmd1),B0.postOp(Q))break}U6.bindFramebuffer(U6.FRAMEBUFFER,null)},kW=function(J){const q=J.computeDimensions();if(!q)return;r0.nativeTransform.initDimensions(q.srcWidth,q.srcHeight);const Q=document.getElementById("display");Q.width=q.screenWidth*W6.canvasScale,Q.height=q.screenHeight*W6.canvasScale},PW=function(J,q){const Q=JW(J,I0,q);return Q.debugController=B0,Q.hleHalt=CW,Q.gl=U6,Q.renderer=r0,Q},CW=function(J){if(B0.running)return;n64js.ui().displayWarning(J),n64js.breakEmulationForDisplayListDebug(),B0.halt()};window.n64js=window.n64js||{};var LW=0,U6=null,r0,I0=new sQ,B0=new yQ(I0,wW);var XF=function(J){return J<0);if(!isFinite(this.tempF32[0]))Y|=PJ;break}if(this.raiseException(Y))return;this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}CVT_S_W(J,q){this.clearCause();const Q=this.loadS32(this.fsRegIdx32(q));this.tempF32[0]=Q;let Y=0;if(Q!=this.tempF32[0])Y|=G0;if(this.raiseException(Y))return;this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}CVT_S_L(J,q){this.clearCause();const Q=this.loadS64(this.fsRegIdx64(q));if(Q>=1n<<55n||Q<-(1n<<55n)){this.raiseUnimplemented();return}this.tempF32[0]=Number(Q);let Y=0;if(Q!=this.tempF32[0])Y|=G0;if(this.raiseException(Y))return;this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}f32UnaryOp(J,q,Q){this.clearCause();const Y=this.loadF32(this.fsRegIdx32(q)),Z=s0(this.loadU32(this.fsRegIdx32(q))),K=aW(Q,Z);let X;switch(K){case h:this.raiseUnimplemented();return;case I:if(!this.raiseException(z6))this.store32ZeroExtend(this.fdRegIdx32(J),qq);return;case B8:if(Y<0){if(!this.raiseException(z6))this.store32ZeroExtend(this.fdRegIdx32(J),qq);return}X=Math.sqrt(Y);break;case a6:X=Math.abs(Y);break;case r6:X=-Y;break;default:throw`unhandled op case: ${K}`}this.tempF32[0]=X;const W=s0(this.tempU32[0]);let z=0;if(X!=this.tempF32[0])z|=G0;if(F6(W)&&!F6(Z))z|=G0|PJ;if(!this.raiseException(z))this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}f32BinaryOp(J,q,Q,Y){this.clearCause();const Z=this.loadF32(this.fsRegIdx32(q)),K=this.loadF32(this.ftRegIdx32(Q)),X=this.loadU32(this.fsRegIdx32(q)),W=this.loadU32(this.ftRegIdx32(Q)),z=s0(X),F=s0(W),j=tW(Y,z,F);let G;switch(j){case h:this.raiseUnimplemented();return;case I:if(!this.raiseException(z6))this.store32ZeroExtend(this.fdRegIdx32(J),qq);return;case j6:if(!this.raiseException(fW)){const U=(X&s6)==(W&s6);this.store32ZeroExtend(this.fdRegIdx32(J),U?gW:xW)}return;case e:G=Z+K;break;case i:G=Z-K;break;case P0:G=Z*K;break;case p0:G=Z/K;break;default:throw`unhandled op case: ${j}`}this.tempF32[0]=G;const P=s0(this.tempU32[0]);let L=0;if(G!=this.tempF32[0])L|=G0;if(j==e||j==i){if(!d6(F)&&G==Z||!d6(z)&&G==K)L|=G0}if(F6(P)&&!F6(z)&&!F6(F))L|=G0|PJ;if((P==i0||d6(P))&&G!=0)L|=G0|Jq,this.tempU32[0]=KY(dW,this.control[31]&e9,G>0);if(!this.raiseException(L))this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}CVT_D_S(J,q){this.clearCause();let Q=0;switch(s0(this.loadU32(this.fsRegIdx32(q)))){case A6:case i0:this.raiseUnimplemented();return;case m0:Q|=z6,this.tempU64[0]=Qq;break;case M6:this.tempU64[0]=pW;break;case O6:this.tempU64[0]=mW;break;default:const Z=this.loadF32(this.fsRegIdx32(q));this.tempF64[0]=Z;break}if(this.raiseException(Q))return;this.store64(this.fdRegIdx64(J),this.tempU64[0])}CVT_D_W(J,q){this.clearCause(),this.tempF64[0]=this.loadS32(this.fsRegIdx32(q)),this.store64(this.fdRegIdx64(J),this.tempU64[0])}CVT_D_L(J,q){this.clearCause();const Q=this.loadS64(this.fsRegIdx64(q));if(Q>=1n<<55n||Q<-(1n<<55n)){this.raiseUnimplemented();return}let Y=0;if(this.tempF64[0]=Number(Q),this.raiseException(Y))return;this.store64(this.fdRegIdx64(J),this.tempU64[0])}f64UnaryOp(J,q,Q){this.clearCause();const Y=this.loadF64(this.fsRegIdx64(q)),Z=H6(this.loadU64(this.fsRegIdx64(q))),K=aW(Q,Z);let X;switch(K){case h:this.raiseUnimplemented();return;case I:if(!this.raiseException(z6))this.store64(this.fdRegIdx64(J),Qq);return;case B8:if(Y<0){if(!this.raiseException(z6))this.store64(this.fdRegIdx64(J),Qq);return}X=Math.sqrt(Y);break;case a6:X=Math.abs(Y);break;case r6:X=-Y;break;default:throw`unhandled op case: ${K}`}this.tempF64[0]=X;const W=H6(this.tempU64[0]);let z=0;if(X!=this.tempF64[0])z|=G0;if(F6(W)&&!F6(Z))z|=G0|PJ;if(!this.raiseException(z))this.store64(this.fdRegIdx64(J),this.tempU64[0])}f64BinaryOp(J,q,Q,Y){this.clearCause();const Z=this.loadF64(this.fsRegIdx64(q)),K=this.loadF64(this.ftRegIdx64(Q)),X=this.loadU64(this.fsRegIdx64(q)),W=this.loadU64(this.ftRegIdx64(Q)),z=H6(X),F=H6(W),j=tW(Y,z,F);let G;switch(j){case h:this.raiseUnimplemented();return;case I:if(!this.raiseException(z6))this.store64(this.fdRegIdx64(J),Qq);return;case j6:if(!this.raiseException(fW)){const U=(X&i6)==(W&i6);this.store64(this.fdRegIdx64(J),U?pW:mW)}return;case e:G=Z+K;break;case i:G=Z-K;break;case P0:G=Z*K;break;case p0:G=Z/K;break;default:throw`unhandled op case: ${j}`}this.tempF64[0]=G;const P=H6(this.tempU64[0]);let L=0;if(j==e||j==i){if(!d6(F)&&G==Z||!d6(z)&&G==K)L|=G0}if(F6(P)&&!F6(z)&&!F6(F))L|=G0|PJ;if((P==i0||d6(P))&&G!=0)L|=G0|Jq,this.tempU64[0]=KY(PF,this.control[31]&e9,G>0);if(!this.raiseException(L))this.store64(this.fdRegIdx64(J),this.tempU64[0])}ConvertSToL(J,q,Q){this.clearCause();let Y=0;switch(s0(this.loadU32(this.fsRegIdx32(q)))){case A6:case m0:case i0:case M6:case O6:this.raiseUnimplemented();return;default:const K=this.loadF32(this.fsRegIdx32(q)),X=this.convertUsingMode(K,Q);if(X>nW||XnW||XcW||XcW||X>Y$,Q=(J&uW)>>Z$;if(q&Q||J&SW)return this.hardware.cpu0.raiseFPE(),!0;return!1}copRegIdx32(J){return this.regIdx32_cop[J]}fdRegIdx32(J){return this.regIdx32_d[J]}fsRegIdx32(J){return this.regIdx32_s[J]}ftRegIdx32(J){return this.regIdx32_t[J]}copRegIdx64(J){return this.regIdx64_cop[J]}fdRegIdx64(J){return this.regIdx64_d[J]}fsRegIdx64(J){return this.regIdx64_s[J]}ftRegIdx64(J){return this.regIdx64_t[J]}store64(J,q){this.regU64[J]=q}store32ZeroExtend(J,q){this.regU32[J]=q|0,this.regU32[J+1]=0}store32(J,q){this.regU32[J]=q|0}loadS32(J){return this.regS32[J]}loadU32(J){return this.regU32[J]}loadF32(J){return this.regF32[J]}loadU64(J){return this.regU64[J]}loadF64(J){return this.regF64[J]}loadS64(J){return this.regS64[J]}dump(){let J="Regs: ";for(let q=0;q<6;+q++)J+=N(this.regS32[q])+", ";M(J),M(`float32: [${this.regF32[0]}, ${this.regF32[1]}, ${this.regF32[2]}, ${this.regF32[3]}, ${this.regF32[4]}, ${this.regF32[5]}, ...]`),M(`float64: [${this.regF64[0]}, ${this.regF64[1]}, ...]`),console.log("")}}function z$(J,q){b0=J.memMap.getMemoryHandler.bind(J.memMap),d0=J.cachedMemDevice.mem.dataView,h6=q}function LF(J){if(J&7)h6.unalignedLoad(J);return b0(J).readU64(J)}function VF(J){if(J&1)h6.unalignedLoad(J);return b0(J).readU16(J)}function UF(J){if(J&3)h6.unalignedLoad(J);return b0(J).readU32(J)}function MF(J){return b0(J).readU8(J)}function zY(J){if(J&3)h6.unalignedLoad(J);return b0(J).readS32(J)}function OF(J){if(J&1)h6.unalignedLoad(J);return b0(J).readS16(J)}function AF(J){return b0(J).readS8(J)}function hF(J,q){if(J&7)h6.unalignedStore(J);b0(J).write64(J,q)}function EF(J,q){if(J&3)h6.unalignedStore(J);b0(J).write32(J,q)}function wF(J,q){if(J&1)h6.unalignedStore(J);b0(J).write16(J,q)}function kF(J,q){b0(J).write8(J,q)}function zq(J,q,Q){b0(J).write32masked(J,q,Q)}function Hq(J,q,Q){b0(J).write64masked(J,q,Q)}function HY(J){if(J<-2139095040){const q=J+2147483648|0;return d0.getUint8(q,!1)}return MF(J>>>0)}function FY(J){if(J<-2139095040){const q=J+2147483648|0;return d0.getInt8(q,!1)}return AF(J>>>0)}function jY(J){if((J&1)==0&&J<-2139095040){const q=J+2147483648|0;return d0.getUint16(q,!1)}return VF(J>>>0)}function NY(J){if((J&1)==0&&J<-2139095040){const q=J+2147483648|0;return d0.getInt16(q,!1)}return OF(J>>>0)}function LJ(J){if((J&3)==0&&J<-2139095040){const q=J+2147483648|0;return d0.getUint32(q,!1)}return UF(J>>>0)}function VJ(J){if((J&3)==0&&J<-2139095040){const q=J+2147483648|0;return d0.getInt32(q,!1)}return zY(J>>>0)}function t6(J){if((J&7)==0&&J<-2139095040){const q=J+2147483648|0;return d0.getBigUint64(q,!1)}return LF(J>>>0)}function GY(J,q){if(J<-2139095040){const Q=J+2147483648|0;d0.setUint8(Q,q,!1);return}kF(J>>>0,q)}function PY(J,q){if((J&1)==0&&J<-2139095040){const Q=J+2147483648|0;d0.setUint16(Q,q,!1);return}wF(J>>>0,q)}function UJ(J,q){if((J&3)==0&&J<-2139095040){const Q=J+2147483648|0;d0.setUint32(Q,q,!1);return}EF(J>>>0,q)}function MJ(J,q){if((J&7)==0&&J<-2139095040){const Q=J+2147483648|0;d0.setBigUint64(Q,q,!1);return}hF(J>>>0,q)}var b0,d0,h6;class LY{constructor(){this.cyclesToFirstEvent=0,this.firstEvent=null}reset(){this.cyclesToFirstEvent=0,this.firstEvent=null}nextEventCountdown(){return this.cyclesToFirstEvent}incrementCount(J){this.cyclesToFirstEvent-=J;while(this.cyclesToFirstEvent<=0){const q=this.firstEvent;if(!q)break;this.unlink(q),q.handler()}}unlink(J){if(J.prev)J.prev.cyclesToNextEvent=J.next?J.prev.cyclesToNextEvent+J.cyclesToNextEvent:0,J.prev.next=J.next;else this.cyclesToFirstEvent=J.next?this.cyclesToFirstEvent+J.cyclesToNextEvent:0,this.firstEvent=J.next;if(J.next)J.next.prev=J.prev;J.prev=null,J.next=null}insertAfter(J,q,Q,Y){const Z=J?J.next:this.firstEvent;if(Q.cyclesToNextEvent=Z?q-Y:0,a(Q.cyclesToNextEvent>=0,"cyclesToNextEvent must be positive or zero"),Q.next=Z,Q.prev=J,Z)Z.prev=Q;if(J)J.cyclesToNextEvent=Y,J.next=Q;else this.cyclesToFirstEvent=Y,this.firstEvent=Q}skipToNextEvent(J){if(!this.firstEvent||this.cyclesToFirstEvent0,"cycles must be positive");const Y=new H$(J,Q);let Z=null,K=this.cyclesToFirstEvent;for(let X=this.firstEvent;X;X=X.next){if(q<=K){this.insertAfter(Z,K,Y,q);return}q-=K,K=X.cyclesToNextEvent,Z=X}this.insertAfter(Z,K,Y,q)}removeEvent(J){let q=this.cyclesToFirstEvent;for(let Q=this.firstEvent;Q;Q=Q.next){if(Q.type==J)return this.unlink(Q),q;q+=Q.cyclesToNextEvent}return-1}getEvent(J){for(let q=this.firstEvent;q;q=q.next)if(q.type==J)return q;return null}getCyclesUntilEvent(J){let q=this.cyclesToFirstEvent;for(let Q=this.firstEvent;Q;Q=Q.next){if(Q.type==J)return q;q+=Q.cyclesToNextEvent}return-1}hasEvent(J){return Boolean(this.getEvent(J))}}class H${constructor(J,q){this.type=J,this.cyclesToNextEvent=0,this.handler=q,this.prev=null,this.next=null}getName(){return this.type}}var R8=!0,e6=!1;function O$(J){J.needsDelayCheck=J.fragment.needsDelayCheck,J.isTrivial=!1;let q="";if(F$)q=T0(` if (c.pc != ${N(J.pc)}) { throw 'expected pc ${N(J.pc)}, got ' + c.pc.toString(16); } `);let Q=q+CN(J);if(J.dump)console.log(Q);if(!J.isTrivial&&J.delayedPCUpdate!==0)J.fragment.bodyCode+=`// Applying delayed pc\nc.pc = ${N(J.delayedPCUpdate)};\n`,J.delayedPCUpdate=0;if(J.fragment.needsDelayCheck=J.needsDelayCheck,J.fragment.bailedOut|=J.bailOut,n64js.getSyncFlow())Q=`if (!n64js.checkSyncState(sync, ${N(J.pc)})) { return ${J.fragment.opsCompiled}; }\n${Q}`;const Z=fJ(J.pc,J.instruction,!1),K=IF(Q," ");J.fragment.bodyCode+=`// ${Z.disassembly} { ${K} } `}var IF=function(J,q){return T0(J).split("\n").filter((X)=>X!="").map((X)=>q+X).join("\n")},T0=function(J){J=J.replace(/^\n/,"");const q=J.match(/^\s+/);if(!q)return J;const Q=q[0];return q?J.replace(new RegExp("^"+Q,"gm"),""):J},J8=function(J){if(!J.startsWith("\n"))J="\n"+J;if(!J.endsWith("\n"))J+="\n";return J},A$=function(J,q,Q){let Y="";if(Y+=q.genAssert(`c.pc === ${N(q.pc)}`,"pc mismatch"),q.needsDelayCheck)Y+=`if (c.delayPC) { c.nextPC = c.delayPC; c.delayPC = 0; } else { c.nextPC = ${N(q.pc+4)}; }\n`,Y+=J8(J),Y+="c.pc = c.nextPC;\n";else if(Q)Y+=q.genAssert("c.delayPC === 0","delay pc should be zero"),Y+=`c.nextPC = ${N(q.pc+4)};\n`,Y+=J8(J),Y+="c.pc = c.nextPC;\n";else Y+=q.genAssert("c.delayPC === 0","delay pc should be zero"),Y+=J8(J),Y+=`c.pc = ${N(q.pc+4)};\n`;return Y},T=function(J,q){let Q="";if(Q+=q.genAssert(`c.pc === ${N(q.pc)}`,"pc mismatch"),q.needsDelayCheck)Q+=`c.nextPC = c.delayPC || ${N(q.pc+4)};\n`;else Q+=q.genAssert("c.delayPC === 0","delay pc should be zero"),Q+=`c.nextPC = ${N(q.pc+4)};\n`;if(Q+="c.branchTarget = 0;\n",Q+=J8(J),Q+="c.pc = c.nextPC;\n",Q+="c.delayPC = c.branchTarget;\n",q.needsDelayCheck=!0,e6)Q+="c.incrementCount(1);\n";if(q.bailOut)Q+=`return ${q.fragment.opsCompiled};\n`;else Q+=`if (c.stuffToDo) { return ${q.fragment.opsCompiled}; }\n`,Q+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`;return Q},t=function(J,q){let Q="";if(Q+=A$(J,q,!0),Q+=q.genAssert("c.delayPC === 0","delay pc should be zero"),q.needsDelayCheck=!1,e6)Q+="c.incrementCount(1);\n";return a(!q.bailOut,"Not expecting bailOut to be set for memory access"),Q+=`if (c.stuffToDo) { return ${q.fragment.opsCompiled}; }\n`,Q+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`,Q},D0=function(J,q,Q){let Y="";const Z=q.needsDelayCheck||Q||q.postPC!==q.pc+4;if(Y+=A$(J,q,Q),q.needsDelayCheck=!0,e6)Y+="c.incrementCount(1);\n";if(Y+=q.genAssert("c.stuffToDo === 0","stuffToDo should be zero"),q.bailOut)Y+=`return ${q.fragment.opsCompiled};\n`;else if(Z)Y+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`;else Y+="// Skipping pc test\n";return Y},_=function(J,q){let Q="";if(Q+=J8(J),q.isTrivial=!0,e6)Q+="c.incrementCount(1);\n";if(q.needsDelayCheck)Q+=`if (c.delayPC) { c.pc = c.delayPC; c.delayPC = 0; } else { c.pc = ${N(q.pc+4)}; }\n`,Q+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`;else{Q+=q.genAssert("c.delayPC === 0","delay pc should be zero");const Y=q.pc+4;if(q.postPC!==Y)a("postPC should always be pc+4 for trival ops?"),Q+=`c.pc = ${N(Y)};\n`,Q+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`;else if(Q+="// Delaying pc update\n",q.delayedPCUpdate=Y,F$)Q+=`c.pc = ${N(Y)};\n`}return Q+=q.genAssert("c.delayPC === 0","delay pc should be zero"),q.needsDelayCheck=!1,Q+=q.genAssert("c.stuffToDo === 0","stuffToDo should be zero"),Q},h$=function(J,q){return _(`// ${J}\n`,q)},E$=function(J){if(J===0)return"0";return`c.getRegU32Lo(${J})`},u6=function(J){if(J===0)return"0n";return`c.getRegS64(${J})`},f6=function(J){if(J===0)return"0n";return`c.getRegU64(${J})`},C=function(J){const q=`throw 'unknown op, pc ${N(J.pc)}, instruction: ${N(J.instruction)}'`;return T(q,J)},BF=function(J){if(J.instruction===0)return h$("NOP",J);const q=`c.execSLL(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},RF=function(J){const q=`c.execSRL(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},bF=function(J){const q=`c.execSRA(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},TF=function(J){const q=`c.execSLLV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},_F=function(J){const q=`c.execSRLV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},SF=function(J){const q=`c.execSRAV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},vF=function(J){const q=`c.execDSLLV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},fF=function(J){const q=`c.execDSRLV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},uF=function(J){const q=`c.execDSRAV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},gF=function(J){const q=`c.execDSLL(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},xF=function(J){const q=`c.execDSLL32(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},pF=function(J){const q=`c.execDSRL(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},mF=function(J){const q=`c.execDSRL32(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},nF=function(J){const q=`c.execDSRA(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},oF=function(J){const q=`c.execDSRA32(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return _(q,J)},cF=function(J){return T("c.execRESERVED(0);",J)},lF=function(J){return T("c.execSYSCALL();",J)},dF=function(J){return T("c.execBREAK();",J)},aF=function(J){return T("c.execSYNC();",J)},rF=function(J){const q=`c.execTGE(${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},sF=function(J){const q=`c.execTGEU(${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},iF=function(J){const q=`c.execTLT(${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},tF=function(J){const q=`c.execTLTU(${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},eF=function(J){const q=`c.execTEQ(${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},Jj=function(J){const q=`c.execTNE(${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},qj=function(J){const q=`c.execMFHI(${J.instr_rd()});`;return _(q,J)},Qj=function(J){const q=`c.execMFLO(${J.instr_rd()});`;return _(q,J)},Yj=function(J){const q=`c.execMTHI(${J.instr_rs()});`;return _(q,J)},Zj=function(J){const q=`c.execMTLO(${J.instr_rs()});`;return _(q,J)},Kj=function(J){const q=`c.execMULT(${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Xj=function(J){const q=`c.execMULTU(${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Wj=function(J){const q=`c.execDMULT(${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},$j=function(J){const q=`c.execDMULTU(${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},zj=function(J){const q=`c.execDIV(${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Hj=function(J){const q=`c.execDIVU(${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Fj=function(J){const q=`c.execDDIV(${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},jj=function(J){const q=`c.execDDIVU(${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Nj=function(J){const q=`c.execADD(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},Gj=function(J){const q=`c.execDADD(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},Pj=function(J){const q=`c.execADDU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Lj=function(J){const q=`c.execDADDU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Vj=function(J){const q=`c.execSUB(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},Uj=function(J){const q=`c.execDSUB(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return T(q,J)},Mj=function(J){const q=`c.execSUBU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Oj=function(J){const q=`c.execDSUBU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Aj=function(J){const q=`c.execAND(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},hj=function(J){let q;if(J.instr_rt()===0)if(J.instr_rs()===0)q=`c.execCLEAR(${J.instr_rd()});`;else q=`c.execMOV(${J.instr_rd()}, ${J.instr_rs()});`;else q=`c.execOR(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Ej=function(J){const q=`c.execXOR(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},wj=function(J){const q=`c.execNOR(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},kj=function(J){const q=`c.execSLT(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Cj=function(J){const q=`c.execSLTU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return _(q,J)},Dj=function(J){const q=`c.execADDI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},yj=function(J){const q=`c.execDADDI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},Ij=function(J){const q=`c.execADDI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return _(q,J)},Bj=function(J){const q=`c.execDADDIU(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return _(q,J)},Rj=function(J){const q=`c.execMFC0(${J.instr_rt()}, ${J.instr_fs()});`;return T(q,J)},bj=function(J){const q=`c.execDMFC0(${J.instr_rt()}, ${J.instr_fs()});`;return T(q,J)},Tj=function(J){if(J.instr_fs()===U0)J.fragment.cop1statusKnown=!1;const q=`c.execMTC0(${J.instr_rt()}, ${J.instr_fs()});`;return T(q,J)},_j=function(J){if(J.instr_fs()===U0)J.fragment.cop1statusKnown=!1;const q=`c.execDMTC0(${J.instr_rt()}, ${J.instr_fs()});`;return T(q,J)},Sj=function(J){const q=`c.execTLB(${J.instr_tlbop()});`;return T(q,J)},vj=function(J){const q=`c.execMFC2(${J.instr_rt()});`;return T(q,J)},fj=function(J){const q=`c.execDMFC2(${J.instr_rt()});`;return T(q,J)},uj=function(J){const q=`c.execCFC2(${J.instr_rt()});`;return T(q,J)},gj=function(J){const q=`c.execDCFC2(${J.instr_rt()});`;return T(q,J)},xj=function(J){const q=`c.execMTC2(${J.instr_rt()});`;return T(q,J)},pj=function(J){const q=`c.execDMTC2(${J.instr_rt()});`;return T(q,J)},mj=function(J){const q=`c.execCTC2(${J.instr_rt()});`;return T(q,J)},nj=function(J){const q=`c.execDCTC2(${J.instr_rt()});`;return T(q,J)},oj=function(J){const q=I6(J.pc,J.instruction),Q="c.delayPC = "+N(q)+";";return D0(Q,J,!1)},cj=function(J){const q=I6(J.pc,J.instruction),Q=J.nextPC+4,Y=Q&2147483648?-1:0,Z=T0(` c.delayPC = ${N(q)}; c.setRegS64LoHi(${Y6}, ${N(Q)}, ${Y}); `);return D0(Z,J,!1)},lj=function(J){const q=J.instr_rs(),Q=J.instr_rd(),Y=J.nextPC+4,Z=Y&2147483648?-1:0,K=T0(` c.delayPC = ${E$(q)}; c.setRegS64LoHi(${Q}, ${N(Y)}, ${Z}); `);return D0(K,J,!1)},dj=function(J){const q=`c.delayPC = ${E$(J.instr_rs())};`;return D0(q,J,!1)},aj=function(J){const q=J.instr_rs(),Q=J.instr_rt(),Y=J.instr_offset(),Z=C0(J.pc,J.instruction);let K="";if(q===Q){if(R8&&Y===-1)K+="c.speedHack();\n",J.bailOut=!0;K+=`c.delayPC = ${N(Z)};\n`}else{if(K+=`if (${f6(q)} === ${f6(Q)}) {\n`,R8&&Y===-1)K+=" c.speedHack();\n",J.bailOut=!0;K+=` c.delayPC = ${N(Z)};\n`,K+="} else {\n",K+=` c.delayPC = ${N(J.pc+8)};\n`,K+="}\n"}return D0(K,J,!1)},rj=function(J){const q=J.instr_rs(),Q=J.instr_rt(),Y=C0(J.pc,J.instruction),Z=T0(` if (${f6(q)} === ${f6(Q)}) { c.delayPC = ${N(Y)}; } else { c.nextPC += 4; }`);return D0(Z,J,!0)},sj=function(J){const q=J.instr_rs(),Q=J.instr_rt(),Y=J.instr_offset(),Z=C0(J.pc,J.instruction);let K="";if(K+=`if (${f6(q)} !== ${f6(Q)}) {\n`,R8&&Y===-1)K+=" c.speedHack();\n",J.bailOut=!0;return K+=` c.delayPC = ${N(Z)};\n`,K+="} else {\n",K+=` c.delayPC = ${N(J.pc+8)};\n`,K+="}\n",D0(K,J,!1)},ij=function(J){const q=J.instr_rs(),Q=J.instr_rt(),Y=C0(J.pc,J.instruction),Z=T0(` if (${f6(q)} !== ${f6(Q)}) { c.delayPC = ${N(Y)}; } else { c.nextPC += 4; } `);return D0(Z,J,!0)},tj=function(J){const q=J.instr_rs(),Q=C0(J.pc,J.instruction),Y=T0(` if ( ${u6(q)} <= 0n) { c.delayPC = ${N(Q)}; } else { c.delayPC = ${N(J.pc+8)}; }`);return D0(Y,J,!1)},ej=function(J){const q=J.instr_rs(),Q=C0(J.pc,J.instruction),Y=T0(` if ( ${u6(q)} <= 0n) { c.delayPC = ${N(Q)}; } else { c.nextPC += 4; }`);return D0(Y,J,!1)},J4=function(J){const q=J.instr_rs(),Q=C0(J.pc,J.instruction),Y=T0(` if (${u6(q)} > 0) { c.delayPC = ${N(Q)}; } else { c.delayPC = ${N(J.pc+8)}; }`);return D0(Y,J,!1)},q4=function(J){const q=J.instr_rs(),Q=C0(J.pc,J.instruction),Y=T0(` if (${u6(q)} > 0) { c.delayPC = ${N(Q)}; } else { c.nextPC += 4; }`);return D0(Y,J,!1)},Q4=function(J){const q=J.instr_rs(),Q=C0(J.pc,J.instruction),Y=T0(` if (${u6(q)} < 0n) { c.delayPC = ${N(Q)}; } else { c.delayPC = ${N(J.pc+8)}; }`);return D0(Y,J,!1)},Y4=function(J){const q=J.instr_rs(),Q=C0(J.pc,J.instruction),Y=T0(` if (${u6(q)} < 0n) { c.delayPC = ${N(Q)}; } else { c.nextPC += 4; }`);return D0(Y,J,!0)},Z4=function(J){const q=J.instr_rs(),Q=C0(J.pc,J.instruction),Y=T0(` if (${u6(q)} >= 0n) { c.delayPC = ${N(Q)}; } else { c.delayPC = ${N(J.pc+8)}; }`);return D0(Y,J,!1)},K4=function(J){const q=J.instr_rs(),Q=C0(J.pc,J.instruction),Y=T0(` if (${u6(q)} >= 0n) { c.delayPC = ${N(Q)}; } else { c.nextPC += 4; }`);return D0(Y,J,!0)},X4=function(J){const q=`c.execBLTZAL(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},W4=function(J){const q=`c.execBGEZAL(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},$4=function(J){const q=`c.execBLTZALL(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},z4=function(J){const q=`c.execBGEZALL(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},H4=function(J){const q=`c.execTGEI(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},F4=function(J){const q=`c.execTGEIU(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},j4=function(J){const q=`c.execTLTI(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},N4=function(J){const q=`c.execTLTIU(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},G4=function(J){const q=`c.execTEQI(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},P4=function(J){const q=`c.execTNEI(${J.instr_rs()}, ${J.instr_imms()});`;return T(q,J)},L4=function(J){const q=`c.execSLTI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return _(q,J)},V4=function(J){const q=`c.execSLTIU(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return _(q,J)},U4=function(J){const q=`c.execANDI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imm()});`;return _(q,J)},M4=function(J){const q=`c.execORI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imm()});`;return _(q,J)},O4=function(J){const q=`c.execXORI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imm()});`;return _(q,J)},A4=function(J){const q=`c.execLUI(${J.instr_rt()}, ${J.instr_imm()});`;return _(q,J)},h4=function(J){const q=`c.execLB(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},E4=function(J){const q=`c.execLBU(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},w4=function(J){const q=`c.execLH(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},k4=function(J){const q=`c.execLHU(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},C4=function(J){const q=`c.execLW(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},D4=function(J){const q=`c.execLWU(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},y4=function(J){const q=`c.execLD(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},I4=function(J){const q=`c.execLWL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},B4=function(J){const q=`c.execLWR(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},R4=function(J){const q=`c.execLDL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},b4=function(J){const q=`c.execLDR(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},T4=function(J){J.fragment.usesCop1=!0;const q=`c.execLWC1(${J.instr_ft()}, ${J.instr_base()}, ${J.instr_imms()});`;return T(q,J)},_4=function(J){J.fragment.usesCop1=!0;const q=`c.execLDC1(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return T(q,J)},S4=function(J){const q=`c.execLWC2(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},v4=function(J){const q=`c.execLWC3(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},f4=function(J){const q=`c.execLDC2(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},u4=function(J){const q=`c.execSB(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},g4=function(J){const q=`c.execSH(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},x4=function(J){const q=`c.execSW(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},p4=function(J){const q=`c.execSD(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},m4=function(J){const q=`c.execSWL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},n4=function(J){const q=`c.execSWR(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},o4=function(J){const q=`c.execSDL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},c4=function(J){const q=`c.execSDR(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},l4=function(J){J.fragment.usesCop1=!0;const q=`c.execSWC1(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return T(q,J)},d4=function(J){J.fragment.usesCop1=!0;const q=`c.execSDC1(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return T(q,J)},a4=function(J){const q=`c.execSWC2(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},r4=function(J){const q=`c.execSWC3(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},s4=function(J){const q=`c.execSDC2(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},i4=function(J){const q=`c.execLL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},t4=function(J){const q=`c.execLLD(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},e4=function(J){const q=`c.execSC(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},JN=function(J){const q=`c.execSCD(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return t(q,J)},qN=function(J){if(!n64js.cpu0.ignoreCacheOp(J.instr_rt())){const q=`c.execCACHE(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return _(q,J)}else return h$("CACHE (ignored)",J)},QN=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execMFC1(${J.instr_rt()}, ${J.instr_fs()});`},YN=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execDMFC1(${J.instr_rt()}, ${J.instr_fs()});`},ZN=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execMTC1(${J.instr_rt()}, ${J.instr_fs()});`},KN=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execDMTC1(${J.instr_rt()}, ${J.instr_fs()});`},XN=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execCFC1(${J.instr_rt()}, ${J.instr_fs()});`},WN=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execCTC1(${J.instr_rt()}, ${J.instr_fs()});`},$N=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!1,`c.execDCFC1(${J.instr_rt()}, ${J.instr_fs()});`},zN=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!1,`c.execDCTC1(${J.instr_rt()}, ${J.instr_fs()});`},HN=function(J){const q=J.instruction;a((q>>>18&7)===0,"cc bit is not 0");const Q=(q&65536)!==0,Y=(q&131072)!==0,Z=C0(J.pc,q);J.fragment.usesCop1=!0,J.isTrivial=!1;let X=`const cond = (cpu1.control[31] & FPCSR_C) ${Q?"!==":"==="} 0;\n`;if(Y)X+="if (cond) {\n",X+=` c.branchTarget = ${N(Z)};\n`,X+="} else {\n",X+=" c.nextPC += 4;\n",X+="}\n";else X+="if (cond) {\n",X+=` c.branchTarget = ${N(Z)};\n`,X+="} else {\n",X+=` c.branchTarget = ${N(J.pc+8)};\n`,X+="}\n";return X},FN=function(J){const q=J.instr_fs(),Q=J.instr_ft(),Y=J.instr_fd();J.fragment.usesCop1=!0,J.isTrivial=!1;const Z=u0(J.instruction);if(Z<48){switch(Z){case j$:return`cpu1.ADD_S(${Y}, ${q}, ${Q});`;case N$:return`cpu1.SUB_S(${Y}, ${q}, ${Q});`;case G$:return`cpu1.MUL_S(${Y}, ${q}, ${Q});`;case P$:return`cpu1.DIV_S(${Y}, ${q}, ${Q});`;case L$:return`cpu1.SQRT_S(${Y}, ${q});`;case V$:return`cpu1.ABS_S(${Y}, ${q});`;case U$:return`cpu1.MOV_S(${Y}, ${q});`;case M$:return`cpu1.NEG_S(${Y}, ${q});`;case Fq:return`cpu1.ConvertSToL(${Y}, ${q}, ${l0});`;case jq:return`cpu1.ConvertSToL(${Y}, ${q}, ${t0});`;case Nq:return`cpu1.ConvertSToL(${Y}, ${q}, ${e0});`;case Gq:return`cpu1.ConvertSToL(${Y}, ${q}, ${J6});`;case Pq:return`cpu1.ConvertSToW(${Y}, ${q}, ${l0});`;case Lq:return`cpu1.ConvertSToW(${Y}, ${q}, ${t0});`;case Vq:return`cpu1.ConvertSToW(${Y}, ${q}, ${e0});`;case Uq:return`cpu1.ConvertSToW(${Y}, ${q}, ${J6});`;case Mq:return"cpu1.raiseUnimplemented();";case Oq:return`cpu1.CVT_D_S(${Y}, ${q});`;case Aq:return`cpu1.ConvertSToW(${Y}, ${q}, cpu1.roundingMode);`;case hq:return`cpu1.ConvertSToL(${Y}, ${q}, cpu1.roundingMode);`}return`unimplemented(${N(J.pc)},${N(J.instruction)});`}return`cpu1.handleFloatCompareSingle(${Z}, ${q}, ${Q});`},jN=function(J){const q=J.instr_fs(),Q=J.instr_ft(),Y=J.instr_fd();J.fragment.usesCop1=!0,J.isTrivial=!1;const Z=u0(J.instruction);if(Z<48){switch(Z){case j$:return`cpu1.ADD_D(${Y}, ${q}, ${Q});`;case N$:return`cpu1.SUB_D(${Y}, ${q}, ${Q});`;case G$:return`cpu1.MUL_D(${Y}, ${q}, ${Q});`;case P$:return`cpu1.DIV_D(${Y}, ${q}, ${Q});`;case L$:return`cpu1.SQRT_D(${Y}, ${q});`;case V$:return`cpu1.ABS_D(${Y}, ${q});`;case U$:return`cpu1.MOV_D(${Y}, ${q});`;case M$:return`cpu1.NEG_D(${Y}, ${q});`;case Fq:return`cpu1.ConvertDToL(${Y}, ${q}, ${l0});`;case jq:return`cpu1.ConvertDToL(${Y}, ${q}, ${t0});`;case Nq:return`cpu1.ConvertDToL(${Y}, ${q}, ${e0});`;case Gq:return`cpu1.ConvertDToL(${Y}, ${q}, ${J6});`;case Pq:return`cpu1.ConvertDToW(${Y}, ${q}, ${l0});`;case Lq:return`cpu1.ConvertDToW(${Y}, ${q}, ${t0});`;case Vq:return`cpu1.ConvertDToW(${Y}, ${q}, ${e0});`;case Uq:return`cpu1.ConvertDToW(${Y}, ${q}, ${J6});`;case Mq:return`cpu1.CVT_S_D(${Y}, ${q});`;case Oq:return"cpu1.raiseUnimplemented();";case Aq:return`cpu1.ConvertDToW(${Y}, ${q}, cpu1.roundingMode);`;case hq:return`cpu1.ConvertDToL(${Y}, ${q}, cpu1.roundingMode);`}return`unimplemented(${N(J.pc)},${N(J.instruction)});`}return`cpu1.handleFloatCompareDouble(${Z}, ${q}, ${Q});`},NN=function(J){const q=J.instr_fs(),Q=J.instr_fd();switch(J.fragment.usesCop1=!0,J.isTrivial=!1,u0(J.instruction)){case Fq:return"cpu1.raiseUnimplemented();";case jq:return"cpu1.raiseUnimplemented();";case Nq:return"cpu1.raiseUnimplemented();";case Gq:return"cpu1.raiseUnimplemented();";case Pq:return"cpu1.raiseUnimplemented();";case Lq:return"cpu1.raiseUnimplemented();";case Vq:return"cpu1.raiseUnimplemented();";case Uq:return"cpu1.raiseUnimplemented();";case Mq:return`cpu1.CVT_S_W(${Q}, ${q});`;case Oq:return`cpu1.CVT_D_W(${Q}, ${q});`;case Aq:return"cpu1.raiseUnimplemented();";case hq:return"cpu1.raiseUnimplemented();"}return`unimplemented(${N(J.pc)},${N(J.instruction)});`},GN=function(J){const q=J.instr_fs(),Q=J.instr_fd();switch(J.fragment.usesCop1=!0,J.isTrivial=!1,u0(J.instruction)){case Fq:return"cpu1.raiseUnimplemented();";case jq:return"cpu1.raiseUnimplemented();";case Nq:return"cpu1.raiseUnimplemented();";case Gq:return"cpu1.raiseUnimplemented();";case Pq:return"cpu1.raiseUnimplemented();";case Lq:return"cpu1.raiseUnimplemented();";case Vq:return"cpu1.raiseUnimplemented();";case Uq:return"cpu1.raiseUnimplemented();";case Mq:return`cpu1.CVT_S_L(${Q}, ${q});`;case Oq:return`cpu1.CVT_D_L(${Q}, ${q});`;case Aq:return"cpu1.raiseUnimplemented();";case hq:return"cpu1.raiseUnimplemented();"}return`unimplemented(${N(J.pc)},${N(J.instruction)});`},PN=function(J){const q=hN[f0(J.instruction)],Q=q(J);let Y="";if(J.fragment.usesCop1=!0,J.fragment.cop1statusKnown)Y+=J.genAssert("(c.getControlU32(12) & SR_CU1) !== 0","cop1 should be enabled"),Y+=J8(Q);else return Y+="if( (c.getControlU32(12) & SR_CU1) === 0 ) {\n",Y+=` n64js.executeCop1_disabled(${N(J.instruction)});\n`,Y+="} else {\n",Y+=" "+J8(Q),Y+="}\n",J.isTrivial=!1,J.fragment.cop1statusKnown=!0,T(Y,J);if(J.isTrivial)return _(Y,J);return T(Y,J)},LN=function(J){return T("c.execBreakpoint();",J)},VN=function(J){if(J.length!=64)throw"Special table is unexpected size.";return J},UY=function(J){if(J.length!=32)throw"Cop table is unexpected size.";return J},UN=function(J){if(J.length!=32)throw"RegImm table is unexpected size.";return J},MN=function(J){if(J.length!=64)throw"Simple table is unexpected size.";return J},CN=function(J){if(yF)return kN[$8(J.instruction)](J);const q=`n64js.executeOp(${J.instruction});`;return T(q,J)},DN=function(J){return ON[H8(J.instruction)](J)},yN=function(J){return wN[z8(J.instruction)](J)},IN=function(J){return AN[f0(J.instruction)](J)},BN=function(J){return EN[f0(J.instruction)](J)},RN=function(J){return T("c.execRESERVED(0);",J)},DF=!1,F$=!1,yF=!0,j$=0,N$=1,G$=2,P$=3,L$=4,V$=5,U$=6,M$=7,Fq=8,jq=9,Nq=10,Gq=11,Pq=12,Lq=13,Vq=14,Uq=15,Mq=32,Oq=33,Aq=36,hq=37;class VY{constructor(){this.fragment=void 0,this.pc=0,this.instruction=0,this.postPC=0,this.bailOut=!1,this.nextPC=0,this.needsDelayCheck=!0,this.isTrivial=!1,this.delayedPCUpdate=0,this.dump=!1}genAssert(J,q){if(DF)return"window.n64jsAssert("+J+', "'+q+'");\n';return""}newFragment(){this.delayedPCUpdate=0}set(J,q,Q,Y,Z){this.fragment=J,this.pc=q,this.instruction=Q,this.postPC=Y,this.nextPC=Z,this.bailOut=!1,this.needsDelayCheck=!0,this.isTrivial=!1,this.dump=!1}instr_rs(){return D(this.instruction)}instr_rt(){return A(this.instruction)}instr_rd(){return R(this.instruction)}instr_sa(){return R0(this.instruction)}instr_fs(){return J0(this.instruction)}instr_ft(){return K6(this.instruction)}instr_fd(){return P6(this.instruction)}instr_base(){return u(this.instruction)}instr_offset(){return q0(this.instruction)}instr_imms(){return b(this.instruction)}instr_imm(){return L6(this.instruction)}instr_tlbop(){return F8(this.instruction)}}var ON=VN([BF,C,RF,bF,TF,C,_F,SF,dj,lj,C,C,lF,dF,C,aF,qj,Yj,Qj,Zj,vF,C,fF,uF,Kj,Xj,zj,Hj,Wj,$j,Fj,jj,Nj,Pj,Vj,Mj,Aj,hj,Ej,wj,C,C,kj,Cj,Gj,Lj,Uj,Oj,rF,sF,iF,tF,eF,C,Jj,C,gF,C,pF,nF,xF,C,mF,oF]),AN=UY([Rj,bj,C,C,Tj,_j,C,C,C,C,C,C,C,C,C,C,Sj,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C]),hN=UY([QN,YN,XN,$N,ZN,KN,WN,zN,HN,C,C,C,C,C,C,C,FN,jN,C,C,NN,GN,C,C,C,C,C,C,C,C,C,C]),EN=UY([vj,fj,uj,gj,xj,pj,mj,nj,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C]),wN=UN([Q4,Z4,Y4,K4,C,C,C,C,H4,F4,j4,N4,G4,C,P4,C,X4,W4,$4,z4,C,C,C,C,C,C,C,C,C,C,C,C]),kN=MN([DN,yN,oj,cj,aj,sj,tj,J4,Dj,Ij,L4,V4,U4,M4,O4,A4,IN,PN,BN,RN,rj,ij,ej,q4,yj,Bj,R4,b4,LN,C,C,cF,h4,w4,I4,C4,E4,k4,B4,D4,u4,g4,m4,x4,o4,c4,n4,qN,i4,T4,S4,v4,t4,_4,f4,y4,e4,l4,a4,r4,JN,d4,s4,p4]);window.n64jsAssert=(J,q)=>{a(J,q)};var TN=function(J){const q=J<256?BigInt(J)+256n:(BigInt(J)-256n<<1n)+512n;let Q=1n<<17n,Y=512n;while(Y!=0){while(q*(Q+Y)*(Q+Y)<1n<<44n)Q+=Y;Y>>=1n}return Number(Q>>1n&0xffffn)};function MY(J){if(J==-32768)return 4294901760;else if(J==0)return 2147483647;const q=J>>>0>4294934528?J-1:J,Q=q>>31,Y=q^Q,Z=Math.clz32(Y)+1,X=Y<>>23;return(65536|bN[X])<<14>>>32-Z^Q}function OY(J){if(J==-32768)return 4294901760;else if(J==0)return 2147483647;const q=J>>>0>4294934528?J-1:J,Q=q>>31,Y=q^Q,Z=Math.clz32(Y)+1,X=Y<>>24|(Z&1)<<8;return(65536|_N[X])<<14>>>(32-Z>>1)^Q}var bN=function(){const J=[];J.push(65535);for(let q=1;q<512;q++){const Q=(1n<<34n)/(BigInt(q)+512n);J.push(Number(Q+1n>>8n&0xffffn))}return J}(),_N=function(){const J=[];for(let q=0;q<512;q++)J.push(TN(q));return J}();function p$(J){H=new o$(J)}var m$=function(J){return J&63},g6=function(J){return(J&65535)<<16>>16},hY=function(J){return J>>>6&31},Q0=function(J){return J>>>11&31},v=function(J){return J>>>16&31},d=function(J){return J>>>21&31},SN=function(J){return J>>>26&63},vN=function(J){return J>>>21&31},E0=function(J){return J>>>16&31},L0=function(J){return J>>>7&15},fN=function(J){return(J&127)<<25>>25},o=function(J){return J>>>21&15},EY=function(J){return J>>>11&31},c=function(J){return J>>>16&31},s=function(J){return J>>>11&31},m=function(J){return J>>>6&31},uN=function(J){return J&67108863},Eq=function(J){return J&65535},b8=function(J){return Eq(J)<<16>>16},gN=function(J){return J>>>21&31};var n$=function(J,q){return J&4026531840|uN(q)*4},g$=function(J){return J*4},x$=function(J){return(J-AY)*4},dN=function(J){return lN[m$(J)](J)},x6=function(J){H.disassembleAll(),n64js.halt(`RSP: unknown op, pc: ${r(H.pc)}, instruction: ${N(J)}`)},iN=function(J){H.setRegS32(Q0(J),H.getRegS32(v(J))<>>hY(J))},eN=function(J){H.setRegS32(Q0(J),H.getRegS32(v(J))>>hY(J))},JG=function(J){H.setRegS32(Q0(J),H.getRegS32(v(J))<<(H.getRegS32(d(J))&31))},qG=function(J){H.setRegS32(Q0(J),H.getRegS32(v(J))>>>(H.getRegS32(d(J))&31))},QG=function(J){H.setRegS32(Q0(J),H.getRegS32(v(J))>>(H.getRegS32(d(J))&31))},YG=function(J){H.jump(H.getRegS32(d(J)))},ZG=function(J){const q=H.getRegS32(d(J));H.setRegS32(Q0(J),H.nextPC+4),H.jump(q)},KG=function(J){H.halt(pN)},XG=function(J){H.setRegS32(Q0(J),H.getRegS32(d(J))+H.getRegS32(v(J)))},WG=function(J){H.setRegU32(Q0(J),H.getRegU32(d(J))+H.getRegU32(v(J)))},$G=function(J){H.setRegS32(Q0(J),H.getRegS32(d(J))-H.getRegS32(v(J)))},zG=function(J){H.setRegU32(Q0(J),H.getRegU32(d(J))-H.getRegU32(v(J)))},HG=function(J){H.setRegU32(Q0(J),H.getRegU32(d(J))&H.getRegU32(v(J)))},FG=function(J){H.setRegU32(Q0(J),H.getRegU32(d(J))|H.getRegU32(v(J)))},jG=function(J){H.setRegU32(Q0(J),H.getRegU32(d(J))^H.getRegU32(v(J)))},NG=function(J){H.setRegU32(Q0(J),~(H.getRegU32(d(J))|H.getRegU32(v(J))))},GG=function(J){H.setRegS32(Q0(J),H.getRegS32(d(J))=0,g6(J))},UG=function(J){const q=H.getRegS32(d(J))<0;H.setRegS32(wY,H.nextPC+4),H.conditionalBranch(q,g6(J))},MG=function(J){const q=H.getRegS32(d(J))>=0;H.setRegS32(wY,H.nextPC+4),H.conditionalBranch(q,g6(J))},OG=function(J){H.setRegU32(v(J),H.moveFromControl(Q0(J)))},AG=function(J){H.moveToControl(Q0(J),H.getRegU32(v(J)))},hG=function(J){H.setRegS16SignExtend(v(J),H.getVecU16UnalignedWrap(Q0(J),L0(J)))},EG=function(J){H.setVecU16UnalignedNoWrap(Q0(J),L0(J),H.getRegU32(v(J)))},wG=function(J){let q;switch(Q0(J)&3){case 0:q=H.VCO<<16>>16;break;case 1:q=H.VCC<<16>>16;break;case 2:q=H.VCE;break;case 3:q=H.VCE;break}H.setRegU32(v(J),q)},kG=function(J){const q=H.getRegS32(v(J));switch(Q0(J)&3){case 0:H.VCO=q;break;case 1:H.VCC=q;break;case 2:H.VCE=q;break;case 3:H.VCE=q;break}},CG=function(J,q,Q,Y){if(J>=0)return(J&~0x7fff_ffffn)!=0?Y:Number(J>>q);return(~J&~0x7fff_ffffn)!=0?Q:Number(J>>q)},DG=function(J,q,Q,Y){if(J>=0)return(J&~0x7fff_ffffn)!=0?Y:Number(J>>q);return Q},c$=function(J){if(J<-32768)return-32768;if(J>32767)return 32767;return J},V0=function(J){const q=s(J),Q=c(J);for(let Y=0,Z=H.vecSelectU32[o(J)];Y<8;Y++,Z>>=4){const K=H.getVecS16(q,Y),X=H.getVecS16(Q,Z&7);H.setAccLow(Y,K+X)}H.setVecZero(m(J))},yG=function(J){V0(J)},IG=function(J){V0(J)},BG=function(J){V0(J)},RG=function(J){V0(J)},bG=function(J){V0(J)},TG=function(J){V0(J)},_G=function(J){V0(J)},SG=function(J){V0(J)},vG=function(J){V0(J)},fG=function(J){V0(J)},uG=function(J){V0(J)},gG=function(J){V0(J)},xG=function(J){V0(J)},pG=function(J){V0(J)},mG=function(J){V0(J)},nG=function(J){V0(J)},oG=function(J){V0(J)},cG=function(J){V0(J)},lG=function(J){V0(J)},wq=function(J,q,Q,Y,Z){for(let K=0,X=H.vecSelectU32[Q];K<8;K++,X>>=4){const W=H.getVecS16(J,K),z=H.getVecS16(q,X&7),F=W*z*2+Z;H.updateAcc32Signed(K,F,Y)}},l$=function(J,q,Q,Y){for(let Z=0,K=H.vecSelectU32[Q];Z<8;Z++,K>>=4){const X=H.getVecU16(J,Z),W=H.getVecU16(q,K&7),z=X*W>>>16;H.updateAccU32(Z,z,Y)}},d$=function(J,q,Q,Y){for(let Z=0,K=H.vecSelectU32[Q];Z<8;Z++,K>>=4){const X=H.getVecS16(J,Z),W=H.getVecU16(q,K&7);H.updateAcc32Signed(Z,X*W,Y)}},a$=function(J,q,Q,Y){for(let Z=0,K=H.vecSelectU32[Q];Z<8;Z++,K>>=4){const X=H.getVecU16(J,Z),W=H.getVecS16(q,K&7);H.updateAcc32Signed(Z,X*W,Y)}},r$=function(J,q,Q,Y){for(let Z=0,K=H.vecSelectU32[Q];Z<8;Z++,K>>=4){const X=H.getVecS16(J,Z),W=H.getVecS16(q,K&7);H.updateAcc32SignedShift16(Z,X*W,Y)}},s$=function(J,q,Q,Y){const Z=J&1?16:0;for(let K=0,X=H.vecSelectU32[Q];K<8;K++,X>>=4){const W=H.getAccS48(K),z=H.getVecS16(q,X&7)<=0:W<0;H.setAccS48(K,W+(F?BigInt(z):0n))}},dG=function(J){wq(s(J),c(J),o(J),!1,32768),H.setVecFromAccSignedMid(m(J))},aG=function(J){wq(s(J),c(J),o(J),!1,32768),H.setVecFromAccUnsignedMid(m(J))},rG=function(J){wq(s(J),c(J),o(J),!0,0),H.setVecFromAccSignedMid(m(J))},sG=function(J){wq(s(J),c(J),o(J),!0,0),H.setVecFromAccUnsignedMid(m(J))},iG=function(J){s$(s(J),c(J),o(J),!1),H.setVecFromAccSignedMid(m(J))},tG=function(J){s$(s(J),c(J),o(J),!0),H.setVecFromAccSignedMid(m(J))},eG=function(J){l$(s(J),c(J),o(J),!1),H.setVecFromAccLow(m(J))},JP=function(J){l$(s(J),c(J),o(J),!0),H.setVecFromAccSignedLow(m(J))},qP=function(J){d$(s(J),c(J),o(J),!1),H.setVecFromAccMid(m(J))},QP=function(J){d$(s(J),c(J),o(J),!0),H.setVecFromAccSignedMid(m(J))},YP=function(J){a$(s(J),c(J),o(J),!1),H.setVecFromAccLow(m(J))},ZP=function(J){a$(s(J),c(J),o(J),!0),H.setVecFromAccSignedLow(m(J))},KP=function(J){r$(s(J),c(J),o(J),!1),H.setVecFromAccSignedMid(m(J))},XP=function(J){r$(s(J),c(J),o(J),!0),H.setVecFromAccSignedMid(m(J))},WP=function(J){const q=s(J),Q=c(J);for(let Y=0,Z=H.vecSelectU32[o(J)];Y<8;Y++,Z>>=4){const K=H.getVecS16(q,Y),X=H.getVecS16(Q,Z&7),W=BigInt(K*X)<<16n;H.setAccS48(Y,W+(W<0?0x1f0000n:0n))}H.setVecFromAccOddified(m(J))},$P=function(J){for(let q=0;q<8;q++){const Q=H.getAccS48(q);let Y=0n;if((Q&0x20_0000n)==0){const Z=Q>>22n;if(Z<0)Y=0x20_0000n;else if(Z>0)Y=-0x20_0000n}H.setAccS48(q,Q+Y)}H.setVecFromAccOddified(m(J))},zP=function(J){const q=s(J),Q=c(J),Y=H.VCO,Z=H.vecTemp;for(let K=0,X=H.vecSelectU32[o(J)];K<8;K++,X>>=4){const W=H.getVecS16(q,K),z=H.getVecS16(Q,X&7),F=Y>>K&1,j=W+z+F;H.setAccLow(K,j),Z.setInt16(K*2,c$(j))}H.setVecFromTemp(m(J)),H.VCO=0},HP=function(J){const q=s(J),Q=c(J),Y=H.VCO,Z=H.vecTemp;for(let K=0,X=H.vecSelectU32[o(J)];K<8;K++,X>>=4){const W=H.getVecS16(q,K),z=H.getVecS16(Q,X&7),F=Y>>K&1,j=W-(z+F);H.setAccLow(K,j),Z.setInt16(K*2,c$(j))}H.setVecFromTemp(m(J)),H.VCO=0},FP=function(J,q){if(J<0)return-q;if(J>0)return q;return 0},jP=function(J){const q=s(J),Q=c(J),Y=H.vecTemp;for(let Z=0,K=H.vecSelectU32[o(J)];Z<8;Z++,K>>=4){const X=H.getVecS16(q,Z),W=H.getVecU16(Q,K&7),z=X<0&&W==32768,F=FP(X,W);H.setAccLow(Z,z?32768:F),Y.setInt16(Z*2,z?32767:F)}H.setVecFromTemp(m(J))},NP=function(J){const q=s(J),Q=c(J);let Y=0;for(let Z=0,K=H.vecSelectU32[o(J)];Z<8;Z++,K>>=4){const X=H.getVecU16(q,Z),W=H.getVecU16(Q,K&7),z=X+W;H.setAccLow(Z,z),Y|=z&~65535?1<>=4){const X=H.getVecU16(q,Z),W=H.getVecU16(Q,K&7),z=X-W;H.setAccLow(Z,z),Y|=z!=0?1<>q))},MP=function(J){const q=s(J),Q=c(J),Y=H.VCO;let Z=0,K=0;for(let X=0,W=H.vecSelectU32[o(J)];X<8;X++,W>>=4){const z=H.getVecS16(q,X),F=H.getVecS16(Q,W&7),j=1<>=4){const z=H.getVecS16(q,X),F=H.getVecS16(Q,W&7),j=1<>=4){const z=H.getVecS16(q,X),F=H.getVecS16(Q,W&7),j=1<>=4){const z=H.getVecS16(q,X),F=H.getVecS16(Q,W&7),j=1<F||z==F&&!L,O=U?z:F;Z|=U?j:0,H.setAccLow(X,O)}H.setVecFromAccLow(m(J)),H.setVCCHiLo(K,Z),H.VCO=0},EP=function(J){const q=s(J),Q=c(J),Y=H.VCCHi,Z=H.VCCLo,K=H.VCE,X=H.VCOHi,W=H.VCOLo;let z=0,F=0;for(let j=0,G=H.vecSelectU32[o(J)];j<8;j++,G>>=4){const P=H.getVecU16(q,j),L=H.getVecU16(Q,G&7);let U=Z>>j&1,O=Y>>j&1;const E=K>>j&1,w=~(X>>j)&1,y=W>>j&1;let S;if(y){if(w){const g=P+L&65535,x=P+L>65535;U=!E&&(!g&&!x)||E&&(!g||!x)}S=U?-L:P}else{if(w)O=P-L>=0;S=O?L:P}H.setAccLow(j,S),z|=O<>=4){const j=H.getVecS16(q,z),G=H.getVecS16(Q,F&7);let P,L,U,O,E;const w=(j^G)<0;if(w){const y=j+G<<16>>16;L=G<0,P=y<=0,U=y==-1,O=y!=0&&j!=~G,E=P?-G:j}else{const y=j-G<<16>>16;P=G<0,L=y>=0,U=0,O=y!=0,E=L?G:j}H.setAccLow(z,E),Y|=L<>=4){const W=H.getVecS16(q,K),z=H.getVecS16(Q,X&7);let F,j,G;if((W^z)<0)j=z<0,F=W+z+1<=0,G=F?~z:W;else F=z<0,j=W-z>=0,G=j?z:W;Z|=F<>=1,K>>=4){const X=H.getVecU16(q,Z),W=H.getVecU16(Q,K&7),z=Y&1?X:W;H.setAccLow(Z,z)}H.setVecFromAccLow(m(J)),H.VCO=0},DP=function(J){T8(J,(q,Q)=>q&Q)},yP=function(J){T8(J,(q,Q)=>~(q&Q))},IP=function(J){T8(J,(q,Q)=>q|Q)},BP=function(J){T8(J,(q,Q)=>~(q|Q))},RP=function(J){T8(J,(q,Q)=>q^Q)},bP=function(J){T8(J,(q,Q)=>~(q^Q))},T8=function(J,q){const Q=s(J),Y=c(J);for(let Z=0,K=H.vecSelectU32[o(J)];Z<8;Z++,K>>=4){const X=H.getVecU16(Q,Z),W=H.getVecU16(Y,K&7);H.setAccLow(Z,q(X,W))}H.setVecFromAccLow(m(J))},TP=function(J){const q=c(J),Q=m(J),Y=EY(J)&7,Z=H.vecSelectU32[o(J)];for(let K=0,X=Z;K<8;K++,X>>=4){const W=H.getVecS16(q,X&7);H.setAccLow(K,W)}H.setVecS16(Q,Y&7,H.getVecS16(q,Z>>4*Y&7))},i$=function(J,q){for(let Q=0,Y=H.vecSelectU32[q];Q<8;Q++,Y>>=4){const Z=H.getVecS16(J,Y&7);H.setAccLow(Q,Z)}},t$=function(J){const q=c(J),Q=o(J);i$(q,Q),H.divDP=!0,H.divIn=H.getVecS16(q,Q&7),H.setVecS16(m(J),EY(J)&7,H.divOut)},kq=function(J,q,Q){const Y=c(J),Z=o(J),K=H.getVecS16(Y,Z&7),X=Q&&H.divDP?H.divIn<<16|K&65535:K;i$(Y,Z);const W=q(X);H.divDP=!1,H.divOut=W>>16,H.setVecS16(m(J),EY(J)&7,W&65535)},_P=function(J){kq(J,MY,!1)},SP=function(J){kq(J,MY,!0)},vP=function(J){t$(J)},fP=function(J){kq(J,OY,!1)},uP=function(J){kq(J,OY,!0)},gP=function(J){t$(J)},xP=function(J){},pP=function(J){},mP=function(J){H.jump(n$(H.pc,J))},nP=function(J){H.setRegS32(wY,H.nextPC+4),H.jump(n$(H.pc,J))},oP=function(J){H.conditionalBranch(H.getRegS32(d(J))===H.getRegS32(v(J)),g6(J))},cP=function(J){H.conditionalBranch(H.getRegS32(d(J))!==H.getRegS32(v(J)),g6(J))},lP=function(J){H.conditionalBranch(H.getRegS32(d(J))<=0,g6(J))},dP=function(J){H.conditionalBranch(H.getRegS32(d(J))>0,g6(J))},aP=function(J){H.setRegS32(v(J),H.getRegS32(d(J))+b8(J))},rP=function(J){H.setRegS32(v(J),H.getRegS32(d(J))+b8(J))},sP=function(J){H.setRegS32(v(J),H.getRegS32(d(J))>>0?1:0)},tP=function(J){H.setRegS32(v(J),H.getRegS32(d(J))&Eq(J))},eP=function(J){H.setRegS32(v(J),H.getRegS32(d(J))|Eq(J))},JL=function(J){H.setRegS32(v(J),H.getRegS32(d(J))^Eq(J))},qL=function(J){H.setRegS32(v(J),b8(J)<<16)},QL=function(J){H.setRegS32(v(J),H.loadS8(H.calcAddress(J)))},YL=function(J){H.setRegU32(v(J),H.loadU8(H.calcAddress(J)))},ZL=function(J){H.setRegS32(v(J),H.loadS16(H.calcAddress(J)))},KL=function(J){H.setRegU32(v(J),H.loadU16(H.calcAddress(J)))},XL=function(J){H.setRegS32(v(J),H.loadS32(H.calcAddress(J)))},WL=function(J){H.setRegU32(v(J),H.loadU32(H.calcAddress(J)))},$L=function(J){H.store8(H.calcAddress(J),H.getRegS32(v(J)))},zL=function(J){H.store16(H.calcAddress(J),H.getRegS32(v(J)))},HL=function(J){H.store32(H.calcAddress(J),H.getRegS32(v(J)))},Cq=function(J,q){const Q=H.calcVecAddress(J,q),Y=E0(J),Z=L0(J),K=16-Z>1,X=q&~7,W=(q&8)+Y;for(let z=0;z<8;z++){const F=K+z&7;H.setVecS8(Z+F,z*2+0,H.loadU8(X+(W+z*2+0&15))),H.setVecS8(Z+F,z*2+1,H.loadU8(X+(W+z*2+1&15)))}},EL=function(J){Dq(J,1)},wL=function(J){Dq(J,2)},kL=function(J){Dq(J,4)},CL=function(J){Dq(J,8)},DL=function(J){const q=H.calcVecAddress(J,16),Q=(q&4080)+16,Y=E0(J),Z=L0(J);let K=Q-q;for(let X=0;X>>X;H.store8(q+Z,W)}},BL=function(J){const q=H.calcVecAddress(J,8),Q=E0(J),Y=L0(J);for(let Z=0;Z<8;Z++){const K=Y+Z,X=K&8?8:7,W=H.getVecS16(Q,K&7)>>>X;H.store8(q+Z,W)}},RL=function(J){const q=H.calcVecAddress(J,16),Q=E0(J),Y=L0(J),Z=q&7,K=q-Z;for(let X=0;X<8;X++){const W=Y+X*2,z=Z+X*2&15,F=H.getVecU16UnalignedWrap(Q,W)>>>7;H.store8(K+z,F)}},TL=function(J){const q=H.calcVecAddress(J,16),Q=E0(J),Y=L0(J),Z=q&7,K=q-Z,X=bL.get(Y);if(X)for(let W=0;W<4;W++){const z=Z+W*4&15;H.store8(K+z,H.getVecU16(Q,X[W])>>>7)}else for(let W=0;W<4;W++){const z=Z+W*4&15;H.store8(K+z,0)}},_L=function(J){const q=H.calcVecAddress(J,16),Q=E0(J),Y=L0(J),Z=q&7,K=q-Z;for(let X=0;X<16;X++){const W=Y+X&15,z=Z+X&15;H.store8(K+z,H.getVecS8(Q,W))}},SL=function(J){const q=H.calcVecAddress(J,16),Q=E0(J),Y=L0(J),Z=q&4088,K=q&15,X=q&8,W=Q&~7,z=Y-(q&8)>>1;for(let F=0;F<16;F++){const j=Z+(K+F&15),G=W+(z+(F>>1)&7),P=X+F&15;H.store8(j,H.getVecS8(G,P))}};window.n64js=window.n64js||{};var H,wY=31,w$=0,k$=1,C$=2,D$=3,y$=4,I$=5,B$=6,R$=7,AY=8,b$=9,T$=10,_$=11,S$=12,v$=13,f$=14,u$=15;var xN=1,pN=2;class o${constructor(J){this.hardware=J,this.dmem=J.sp_mem.subRegion(0,4096),this.imem=J.sp_mem.subRegion(4096,4096),this.halted=!0,this.runEvent=null,this.pcDataView=J.sp_ibist_mem.dataView,this.pc=0,this.delayPC=0,this.nextPC=0,this.branchTarget=0;const q=new ArrayBuffer(128);this.gprU32=new Uint32Array(q),this.gprS32=new Int32Array(q);const Q=new ArrayBuffer(512);this.vpr=new DataView(Q),this.vprS16=new Int16Array(Q),this.vprS8=new Int8Array(Q),this.vprU64=new BigUint64Array(Q);const Y=new ArrayBuffer(64);this.vAcc=new BigInt64Array(Y),this.vAccS32=new Int32Array(Y),this.vAccU32=new Uint32Array(Y),this.vAccS16=new Int16Array(Y),this.vAccU16=new Uint16Array(Y),this.vuVCOReg=new Uint16Array(new ArrayBuffer(2)),this.vuVCCReg=new Uint16Array(new ArrayBuffer(2)),this.vuVCEReg=new Uint8Array(new ArrayBuffer(1)),this.divDP=!1,this.divIn=0,this.divOut=0,this.vecSelectU32=new Uint32Array(new ArrayBuffer(64)),this.vecSelectU32[0]=1985229328,this.vecSelectU32[1]=1985229328,this.vecSelectU32[2]=1715741184,this.vecSelectU32[3]=2002072337,this.vecSelectU32[4]=1145307136,this.vecSelectU32[5]=1431638289,this.vecSelectU32[6]=1717969442,this.vecSelectU32[7]=2004300595,this.vecSelectU32[8]=0,this.vecSelectU32[9]=286331153,this.vecSelectU32[10]=572662306,this.vecSelectU32[11]=858993459,this.vecSelectU32[12]=1145324612,this.vecSelectU32[13]=1431655765,this.vecSelectU32[14]=1717986918,this.vecSelectU32[15]=2004318071;const Z=new ArrayBuffer(128);this.vecTemp=new DataView(Z),this.vecTempU64=new BigUint64Array(Z),this.reset()}reset(){this.halted=!0,this.runEvent=null,this.pc=0,this.delayPC=0,this.nextPC=0,this.branchTarget=0;for(let J=0;J<32;++J){this.gprS32[J]=0;for(let q=0;q<8;q++)this.vprS16[J*8+q]=0}this.vAcc[0]=0n,this.vuVCOReg[0]=0,this.vuVCCReg[0]=0,this.vuVCEReg[0]=0,this.divDP=!1,this.divIn=0,this.divOut=0}getRegS32(J){return this.gprS32[J]}getRegU32(J){return this.gprU32[J]}setRegS32(J,q){if(J!=0)this.gprS32[J]=q}setRegU32(J,q){if(J!=0)this.gprU32[J]=q}setRegS16SignExtend(J,q){if(J!=0)this.gprS32[J]=q<<16>>16}getAccS48(J){return this.vAcc[J]}setAccS48(J,q){this.vAcc[J]=BigInt.asIntN(48,q)}updateAcc32Signed(J,q,Q){if(Q)this.setAccS48(J,this.vAcc[J]+BigInt(q));else this.vAccS32[J*2+1]=q>=0?0:4294967295,this.vAccS32[J*2+0]=q}updateAccU32(J,q,Q){if(Q)this.setAccS48(J,this.vAcc[J]+BigInt(q));else this.vAccU32[J*2+1]=0,this.vAccU32[J*2+0]=q}updateAcc32SignedShift16(J,q,Q){if(Q)this.setAccS48(J,this.vAcc[J]+(BigInt(q)<<16n));else this.vAccS32[J*2+1]=q>>16,this.vAccS32[J*2+0]=q<<16}setAccLow(J,q){this.vAccS16[J*4+0]=q}getAccLow(J){return this.vAccS16[J*4+0]}setAccMid(J,q){this.vAccS16[J*4+1]=q}getAccMid(J){return this.vAccS16[J*4+1]}setAccHigh(J,q){this.vAccS16[J*4+2]=q}getAccHigh(J){return this.vAccS16[J*4+2]}getAccHighMid(J){return this.vAccS16[J*4+2]<<16|this.vAccU16[J*4+1]}setVecFromAccSignedMid(J){for(let q=0;q<8;q++){const Q=this.getAccHighMid(q);let Y;if(Q>=0)Y=Q&4294934528?32767:Q;else Y=~Q&4294934528?32768:Q;this.setVecS16(J,q,Y)}}setVecFromAccSignedLow(J){for(let q=0;q<8;q++){const Q=this.getAccHighMid(q),Y=this.getAccLow(q);let Z;if(Q>=0)Z=Q&4294934528?65535:Y;else Z=~Q&4294934528?0:Y;this.setVecS16(J,q,Z)}}setVecFromAccOddified(J){for(let q=0;q<8;q++)this.setVecS16(J,q,CG(this.vAcc[q]>>1n,16n,32768,32767)&65520)}setVecFromAccUnsignedMid(J){for(let q=0;q<8;q++)this.setVecS16(J,q,DG(this.vAcc[q],16n,0,65535))}setVecFromAccMid(J){for(let q=0;q<8;q++)this.setVecS16(J,q,this.getAccMid(q))}setVecFromAccLow(J){for(let q=0;q<8;q++)this.setVecS16(J,q,this.getAccLow(q))}get VCO(){return this.vuVCOReg[0]}get VCOHi(){return this.vuVCOReg[0]>>>8&255}get VCOLo(){return this.vuVCOReg[0]>>>0&255}get VCC(){return this.vuVCCReg[0]}get VCCHi(){return this.vuVCCReg[0]>>>8&255}get VCCLo(){return this.vuVCCReg[0]>>>0&255}get VCE(){return this.vuVCEReg[0]}set VCO(J){this.vuVCOReg[0]=J}set VCC(J){this.vuVCCReg[0]=J}set VCE(J){this.vuVCEReg[0]=J}setVCOHiLo(J,q){this.vuVCOReg[0]=J<<8|q}setVCCHiLo(J,q){this.vuVCCReg[0]=J<<8|q}getVecS16(J,q){return this.vpr.getInt16(16*J+q*2,!1)}getVecU16(J,q){return this.vpr.getUint16(16*J+q*2,!1)}getVecS8(J,q){return this.vpr.getInt8(16*J+q,!1)}getVecU8(J,q){return this.vpr.getUint8(16*J+q,!1)}setVecZero(J){this.vprU64[J*2+0]=0n,this.vprU64[J*2+1]=0n}setVecFromTemp(J){this.vprU64[J*2+0]=this.vecTempU64[0],this.vprU64[J*2+1]=this.vecTempU64[1]}setVecS16(J,q,Q){this.vpr.setInt16(16*J+q*2,Q,!1)}setVecS8(J,q,Q){this.vpr.setInt8(16*J+q,Q,!1)}getVecU16UnalignedWrap(J,q){const Q=this.getVecU8(J,q&15),Y=this.getVecU8(J,q+1&15);return Q<<8|Y}setVecU16UnalignedNoWrap(J,q,Q){if(this.setVecS8(J,q+0,Q>>8),q<15)this.setVecS8(J,q+1,Q)}sprintVecReg(J){let q=[];for(let Q=0;Q<8;Q++)q.push(r(this.getVecS16(J,Q)));return`V${J}: [${q.join(", ")}]`}loadU8(J){return this.dmem.getU8(J&4095)}loadU16(J){return J<=4094?this.dmem.getU16(J):this.loadU16Wrapped(J)}loadU32(J){return J<=4092?this.dmem.getU32(J):this.loadU32Wrapped(J)}loadS8(J){return this.dmem.getS8(J&4095)}loadS16(J){return J<=4094?this.dmem.getS16(J):this.loadS16Wrapped(J)}loadS32(J){return J<=4092?this.dmem.getS32(J):this.loadS32Wrapped(J)}store8(J,q){return this.dmem.set8(J&4095,q)}store16(J,q){return J<=4094?this.dmem.set16(J,q):this.store16Wrapped(J,q)}store32(J,q){return J<=4092?this.dmem.set32(J,q):this.store32Wrapped(J,q)}store32masked(J,q,Q){const Z=this.loadU32(J,!1)&~Q|q&Q;this.store32(J,Z)}loadU16Wrapped(J){return(this.loadU8(J+0)<<8|this.loadU8(J+1)<<0)>>>0}loadS16Wrapped(J){return this.loadU16Wrapped(J)<<16>>16}loadU32Wrapped(J){return(this.loadU8(J+0)<<24|this.loadU8(J+1)<<16|this.loadU8(J+2)<<8|this.loadU8(J+3)<<0)>>>0}loadS32Wrapped(J){return this.loadU32Wrapped(J)>>0}store16Wrapped(J,q){this.store8(J+0,q>>>8),this.store8(J+1,q>>>0)}store32Wrapped(J,q){this.store8(J+0,q>>>24),this.store8(J+1,q>>>16),this.store8(J+2,q>>>8),this.store8(J+3,q>>>0)}calcDebuggerAddress(J){return this.calcAddress(J)+2751463424}calcAddress(J){return this.getRegS32(gN(J))+b8(J)&4095}calcVecAddress(J,q){return this.getRegS32(vN(J))+fN(J)*q&4095}conditionalBranch(J,q){const Q=J?q*4:4;this.branchTarget=this.pc+4+Q&4092}jump(J){this.branchTarget=J>>>0&4092}get pc(){return this.pcDataView.getInt32(0,!1)}set pc(J){this.pcDataView.setUint32(0,J,!1)}unhalt(){if(this.halted=!1,this.runEvent)this.runEvent.stop();this.runEvent=this.hardware.timeline.startEvent("RSP")}step(){if(this.halted)return;this.nextPC=this.delayPC||this.pc+4&4092;const J=this.imem.getU32(this.pc);this.branchTarget=0,this.executeOp(J),this.pc=this.nextPC,this.delayPC=this.branchTarget}halt(J){if(this.hardware.spRegDevice.setStatusBits(J|xN),this.halted=!0,this.runEvent)this.runEvent.stop(),this.runEvent=null}disassembleAll(){const J=xJ(this.imem,0,4096);for(let q of J)console.log(`${B(q.address,16)} ${q.disassembly}`)}disassembleOp(J,q){const Q=XJ(J,q);console.log(`${B(Q.address,16)} ${Q.disassembly}`)}executeOp(J){sN[SN(J)](J)}moveFromControl(J){switch(J){case w$:case k$:case C$:case D$:case y$:case I$:case B$:case R$:return this.hardware.spRegDevice.readRegU32(g$(J));case AY:case b$:case T$:case _$:case S$:case v$:case f$:case u$:return this.hardware.dpcDevice.readRegU32(x$(J))}return console.log(`MFC0: ${J} unhandled - returning 0`),0}moveToControl(J,q){switch(J){case w$:case k$:case C$:case D$:case y$:case I$:case B$:case R$:this.hardware.spRegDevice.writeReg32(g$(J),q);break;case AY:case b$:case T$:case _$:case S$:case v$:case f$:case u$:this.hardware.dpcDevice.writeReg32(x$(J),q);break;default:console.log(`Unhandled RSP MTC0 register: ${J} = ${N(q)}`);break}}}var mN=(()=>{let J=[];for(let q=0;q<64;q++)J[q]=x6;return J[0]=iN,J[2]=tN,J[3]=eN,J[4]=JG,J[6]=qG,J[7]=QG,J[8]=YG,J[9]=ZG,J[13]=KG,J[32]=XG,J[33]=WG,J[34]=$G,J[35]=zG,J[36]=HG,J[37]=FG,J[38]=jG,J[39]=NG,J[42]=GG,J[43]=PG,J})(),nN=(()=>{let J=[];for(let q=0;q<32;q++)J.push(x6);return J[0]=LG,J[1]=VG,J[16]=UG,J[17]=MG,J})(),oN=(()=>{let J=[];for(let q=0;q<32;q++)J.push(x6);return J[0]=OG,J[4]=AG,J})(),cN=(()=>{let J=[];for(let q=0;q<32;q++)J.push(x6);J[0]=hG,J[2]=wG,J[4]=EG,J[6]=kG;for(let q=16;q<32;q++)J[q]=dN;return J})(),lN=(()=>{let J=[];for(let q=0;q<64;q++)J.push(x6);return J[0]=dG,J[1]=aG,J[2]=tG,J[3]=WP,J[4]=eG,J[5]=qP,J[6]=YP,J[7]=KP,J[8]=rG,J[9]=sG,J[10]=iG,J[11]=$P,J[12]=JP,J[13]=QP,J[14]=ZP,J[15]=XP,J[16]=zP,J[17]=HP,J[18]=yG,J[19]=jP,J[20]=NP,J[21]=GP,J[22]=IG,J[23]=BG,J[24]=RG,J[25]=bG,J[26]=TG,J[27]=_G,J[28]=SG,J[29]=UP,J[30]=vG,J[31]=fG,J[32]=MP,J[33]=OP,J[34]=AP,J[35]=hP,J[36]=EP,J[37]=wP,J[38]=kP,J[39]=CP,J[40]=DP,J[41]=yP,J[42]=IP,J[43]=BP,J[44]=RP,J[45]=bP,J[46]=uG,J[47]=gG,J[48]=_P,J[49]=SP,J[50]=vP,J[51]=TP,J[52]=fP,J[53]=uP,J[54]=gP,J[55]=xP,J[56]=xG,J[57]=pG,J[58]=mG,J[59]=nG,J[60]=oG,J[61]=cG,J[62]=lG,J[63]=pP,J})(),aN=(()=>{let J=[];for(let q=0;q<32;q++)J.push(x6);return J[0]=FL,J[1]=jL,J[2]=NL,J[3]=GL,J[4]=PL,J[5]=LL,J[6]=VL,J[7]=UL,J[8]=ML,J[9]=OL,J[10]=AL,J[11]=hL,J})(),rN=(()=>{let J=[];for(let q=0;q<32;q++)J.push(x6);return J[0]=EL,J[1]=wL,J[2]=kL,J[3]=CL,J[4]=DL,J[5]=yL,J[6]=IL,J[7]=BL,J[8]=RL,J[9]=TL,J[10]=_L,J[11]=SL,J})(),sN=(()=>{let J=[];for(let q=0;q<64;q++)J.push(x6);return J[0]=(q)=>mN[m$(q)](q),J[1]=(q)=>nN[v(q)](q),J[2]=mP,J[3]=nP,J[4]=oP,J[5]=cP,J[6]=lP,J[7]=dP,J[8]=aP,J[9]=rP,J[10]=sP,J[11]=iP,J[12]=tP,J[13]=eP,J[14]=JL,J[15]=qL,J[16]=(q)=>oN[d(q)](q),J[18]=(q)=>cN[d(q)](q),J[32]=QL,J[33]=ZL,J[35]=XL,J[36]=YL,J[37]=KL,J[39]=WL,J[40]=$L,J[41]=zL,J[43]=HL,J[50]=(q)=>aN[Q0(q)](q),J[58]=(q)=>rN[Q0(q)](q),J})(),PP=8,LP=9,VP=10,bL=new Map([[0,[0,1,2,3]],[1,[6,7,4,5]],[4,[1,2,3,0]],[5,[7,4,5,6]],[8,[4,5,6,7]],[11,[3,0,1,2]],[12,[5,6,7,4]],[15,[0,1,2,3]]]);function $7(J){V=J.cpu0,l=J.cpu1,q8=J.cpu2,z$(J,V),n64js.cpu0=V}var OV=function(J){return J>>>13},AV=function(J){return(J&wJ)>>dL},hV=function(J){return(J&BY)>>lL},RY=function(J,q,Q){return(~(J^q)&(Q^J)&H7)!=0},j7=function(J,q,Q){return((J^q)&(Q^J)&H7)!=0},bY=function(J,q,Q){return(~(J^q)&(Q^J)&F7)!=0n},N7=function(J,q,Q){return((J^q)&(Q^J)&F7)!=0n},_Y=function(J){return J>>13&4095},wV=function(J){const Q=_Y(J)&2730;return(Q|Q>>1)<<13},kV=function(J){const q=_Y(J);if(q&2048)return 1<<24;if(q&512)return 1<<22;if(q&128)return 1<<20;if(q&32)return 1<<18;if(q&8)return 1<<16;if(q&2)return 1<<14;return 1<<12},CV=function(J){const q=EV.get(J);if(q)return q;return`Unknown(${_Y(J).toString(2)})`};var k=function(J){throw`CPU: unknown op, pc: ${N(V.pc)}, instruction: ${N(J)}`},X7=function(){},DV=function(J){return J&~3758096384},W7=function(J){return DV(J>>>0)>>>4},yV=function(J){a((J>>>18&7)===0,"cc bit is not 0");const q=(J&65536)!==0,Q=(J&131072)!==0,Z=(l.control[31]&z7)!==0===q;if(Q)V.conditionalBranchLikely(Z,q0(J));else V.conditionalBranch(Z,q0(J))},IV=function(J){if(J.length!=64)throw"Special table is unexpected size.";return J},RV=function(J){BV[H8(J)](J)},fY=function(J){if(J.length!=32)throw"Cop table is unexpected size.";return J},TV=function(J){bV[f0(J)](J)},SV=function(J){_V[f0(J)](J)},fV=function(J){vV[f0(J)](J)},uV=function(J){V.raiseRESERVEDException(0)},uY=function(J){a((V.getControlU32(U0)&TY)===0,"SR_CU1 in inconsistent state"),V.raiseCopXUnusable(1)},gV=function(J){if(J.length!=32)throw"RegImm table is unexpected size.";return J},pV=function(J){return xV[z8(J)](J)},mV=function(J){if(J.length!=64)throw"Simple table is unexpected size.";return J},P7=function(J){return L7[$8(J)](J)},nV=function(J,q,Q){return J-=q,J-=Q,J^=Q>>>13,q-=Q,q-=J,q^=J<<8,Q-=J,Q-=q,Q^=q>>>13,J-=q,J-=Q,J^=Q>>>12,q-=Q,q-=J,q^=J<<16,Q-=J,Q-=q,Q^=q>>>5,J-=q,J-=Q,J^=Q>>>3,q-=Q,q-=J,q^=J<<10,Q-=J,Q-=q,Q^=q>>>15,J},oV=function(J,q){if(!J.sync32(q,"pc"))return!1;{let Q=0;for(let Y=0;Y<32;++Y)Q=nV(Q,V.getRegU32Lo(Y),0);if(Q=Q>>>0,!J.sync32(Q,"regs"))return!1}return!0},cV=function(J,q,Q){if(Q.nextEventCountdown()8&&Y.pc!==q+4||J.opsCompiled>=vL||Y.stuffToDo)dV(J),J=G8(Y.pc);else J.bodyCode+=`// Keep going: ops ${J.opsCompiled}, pc: ${N(Y.pc)}, entry+4: ${N(q+4)}, stuff: ${Y.stuffToDo}\n`;return J},dV=function(J){let q="";if(n64js.getSyncFlow())q+="const sync = n64js.getSyncFlow();\n";if(J.usesCop1)q+=`const SR_CU1 = ${N(TY)};\n`,q+=`const FPCSR_C = ${N(z7)};\n`;if(S8.delayedPCUpdate!==0)J.bodyCode+=`c.pc = ${N(S8.delayedPCUpdate)};\n`,S8.delayedPCUpdate=0;J.bodyCode+=`return ${J.opsCompiled};\n`;const Y=` return function fragment_${N(J.entryPC)}_${J.opsCompiled}() { ${q} ${J.bodyCode} }`;J.bodyCode="",J.func=new Function("c","cpu1","rsp",Y)(V,l,H),J.nextFragments=[];for(let Z=0;Zn6;var H7=2147483648,F7=0x8000_0000_0000_0000n,Iq=4294967295,q6=0xffff_ffff_ffff_ffffn,K7=0xffff_ffffn;n64js.s32CheckAddOverflow=RY;n64js.s32CheckSubOverflow=j7;n64js.s64CheckAddOverflow=bY;n64js.s64CheckSubOverflow=N7;class G7{constructor(){this.pagemask=0,this.hi=0n,this.pfne=0,this.pfno=0,this.global=0,this.offsetMask=0,this.vpnmask64=wJ,this.vpn2bits=0n,this.physEven=0,this.physOdd=0,this.checkbit=0}update(J,q,Q,Y,Z){if(Bq)M(`TLB update: index=${J}, pagemask=${N(q)}, entryhi=${y6(Q)}, entrylo0=${N(Y)}, entrylo1=${N(Z)}`),M(` ${CV(q)} Pagesize`);const K=Y&Z&yY;this.pagemask=wV(q),this.hi=Q,this.pfne=Y&~yY|K,this.pfno=Z&~yY|K,this.global=K,this.offsetMask=(this.pagemask|PV)>>>1,this.vpnmask64=wJ&BigInt(~this.pagemask),this.vpn2bits=Q&this.vpnmask64,this.physEven=this.pfne<<6&~this.offsetMask,this.physOdd=this.pfno<<6&~this.offsetMask,this.checkbit=kV(this.pagemask)}}var EV=new Map([[$V,"4k"],[zV,"16k"],[HV,"64k"],[FV,"256k"],[jV,"1M"],[NV,"4M"],[GV,"16M"]]);class SY{constructor(J){this.hardware=J,this.opsExecuted=0,this.ramDV=J.cachedMemDevice.mem.dataView;const q=new ArrayBuffer(256);this.gprU32=new Uint32Array(q),this.gprS32=new Int32Array(q),this.gprU64=new BigUint64Array(q),this.gprS64=new BigInt64Array(q);const Q=new ArrayBuffer(256);this.controlRegU32=new Uint32Array(Q),this.controlRegS32=new Int32Array(Q),this.controlRegU64=new BigUint64Array(Q),this.controlRegS64=new BigInt64Array(Q),this.controlCountValue=0,this.lastControlRegWrite=0n,this.pc=0,this.delayPC=0,this.nextPC=0,this.branchTarget=0,this.llBit=0,this.stuffToDo=0,this.eventQueue=new LY;const Y=new ArrayBuffer(8);this.multHiU32=new Uint32Array(Y),this.multHiS32=new Int32Array(Y),this.multHiU64=new BigUint64Array(Y),this.multHiS64=new BigInt64Array(Y);const Z=new ArrayBuffer(8);this.multLoU32=new Uint32Array(Z),this.multLoS32=new Int32Array(Z),this.multLoU64=new BigUint64Array(Z),this.multLoS64=new BigInt64Array(Z),this.tlbEntries=[];for(let K=0;K<32;++K)this.tlbEntries.push(new G7);this.loadU8fast=HY,this.loadU16fast=jY,this.loadU32fast=LJ,this.loadU64fast=t6,this.loadS8fast=FY,this.loadS16fast=NY,this.loadS32fast=VJ,this.store8fast=GY,this.store16fast=PY,this.store32fast=UJ,this.store64fast=MJ,this.store32masked=zq,this.store64masked=Hq,this.reset()}conditionalBranch(J,q){const Q=J?q*4:4;this.branchTarget=this.pc+4+Q}conditionalBranchLikely(J,q){if(J)this.branchTarget=this.pc+4+q*4;else this.nextPC+=4}jump(J){this.branchTarget=J}getOpsExecuted(){return this.controlCountValue}incrementCount(J){this.controlCountValue+=J}getRegS32Lo(J){return this.gprS32[J*2+0]}getRegU32Lo(J){return this.gprU32[J*2+0]}getRegS64(J){return this.gprS64[J]}getRegU64(J){return this.gprU64[J]}setRegU64(J,q){if(J==0)return;const Q=q&q6;this.gprU64[J]=Q}setRegU64Masked(J,q,Q){if(J==0)return;this.gprU64[J]=this.gprU64[J]&~Q|q&Q}setRegS64LoHi(J,q,Q){if(J==0)return;this.gprS32[J*2+0]=q,this.gprS32[J*2+1]=Q}setRegS32ExtendMasked(J,q,Q){if(J==0)return;const Y=this.gprS32[J*2+0]&~Q|q&Q;this.gprS32[J*2+0]=Y,this.gprS32[J*2+1]=Y>>31}setRegS32Extend(J,q){if(J==0)return;this.gprS32[J*2+0]=q,this.gprS32[J*2+1]=q>>31}setRegU32Extend(J,q){if(J==0)return;this.gprU32[J*2+0]=q,this.gprU32[J*2+1]=0}getMultLoS64(){return this.multLoS64[0]}getMultLoU64(){return this.multLoU64[0]}setMultLoS32Extend(J){this.multLoS64[0]=BigInt.asIntN(32,J)}setMultLoS64(J){this.multLoS64[0]=J}setMultLoU64(J){this.multLoU64[0]=J}getMultHiS64(){return this.multHiS64[0]}getMultHiU64(){return this.multHiU64[0]}setMultHiS32Extend(J){this.multHiS64[0]=BigInt.asIntN(32,J)}setMultHiS64(J){this.multHiS64[0]=J}setMultHiU64(J){this.multHiU64[0]=J}setControlU32(J,q){this.controlRegU32[J*2+0]=q}setControlS32(J,q){this.controlRegS32[J*2+0]=q}getControlU32(J){return this.controlRegU32[J*2+0]}getControlS32(J){return this.controlRegS32[J*2+0]}setControlS32Extend(J,q){this.controlRegS32[J*2+0]=q,this.controlRegS32[J*2+1]=q>>31}setControlU64(J,q){this.controlRegU64[J]=q}setControlS64(J,q){this.controlRegS64[J]=q}getControlU64(J){return this.controlRegU64[J]}getControlS64(J){return this.controlRegS64[J]}maskControlBits32(J,q,Q){const Y=J*2+0;this.controlRegU32[Y]=this.controlRegU32[Y]&~q|Q&q}setControlBits32(J,q){this.controlRegU32[J*2+0]|=q}clearControlBits32(J,q){this.controlRegU32[J*2+0]&=~q}maskControlBits64(J,q,Q){this.controlRegU64[J]=this.controlRegU64[J]&~q|Q&q}setControlBits64(J,q){this.controlRegU64[J]|=q}clearControlBits64(J,q){this.controlRegU64[J]&=~q}reset(){HX();for(let J=0;J<32;++J)this.gprU64[J]=0n,this.controlRegU64[J]=0n;for(let J=0;J<32;++J)this.tlbEntries[J].update(J,0,0x80000000n,0,0);this.pc=0,this.delayPC=0,this.nextPC=0,this.branchTarget=0,this.stuffToDo=0,this.eventQueue.reset(),this.multLoU32[0]=this.multLoU32[1]=0,this.multHiU32[0]=this.multHiU32[1]=0,this.setControlU32(l8,31),this.setControlU32(U0,1883242500),this.setControlU32(t8,1879499875),this.cop1ControlChanged()}cop1ControlChanged(){const J=this.getControlU32(U0),q=(J&TY)!==0;if(L7[17]=q?SV:uY,this.hardware.cpu1)this.hardware.cpu1.fullMode=(J&fL)!==0}moveToControl(J,q){switch(this.lastControlRegWrite=q,J){case Z8:this.setControlU64(J,q&tL);break;case d8:case a8:this.setControlU64(J,q&sL);break;case r8:this.setControlU64(J,q&QV);break;case s8:this.setControlU64(J,q&LV);break;case uq:this.setControlU64(J,q&eL),this.setControlU64(l8,31n);break;case D6:this.setControlU64(J,q&aL);break;case l8:case i8:case _J:case oZ:break;case t8:this.maskControlBits64(J,VV,q);break;case k0:M(`Setting cause register to ${N(q)}`),n64js.check(q===0,"Should only write 0 to Cause register."),this.maskControlBits64(J,cL,q);break;case U0:this.setControlU64(J,q&gL),this.statusRegisterChanged();break;case m6:this.controlCountValue=Number(q)*2;break;case K8:this.setCompare(Number(q&0xffff_ffffn));break;case xq:this.maskControlBits64(J,WV,q);break;case G6:case cZ:case lZ:this.setControlU64(J,q);break;case SJ:this.maskControlBits64(J,UV,q);break;case gq:case pq:case mq:case nq:case oq:case cq:case lq:break;case nZ:this.setControlU64(J,q&MV);break;case e8:this.setControlU64(J,q);break;default:this.setControlU64(J,q),M(`Write to cpu0 control register. ${y6(q)} --> ${j8[J]}`);break}}moveFromControl(J){if(J===k0)this.checkCauseIP3Consistent();switch(J){case l8:return BigInt(this.getRandom());case gq:case pq:case mq:case nq:case oq:case cq:case lq:return this.lastControlRegWrite;case m6:return BigInt(this.controlCountValue)>>1n;default:return this.getControlU64(J)}}breakExecution(){this.stuffToDo|=IY}run(J){this.stuffToDo&=~IY,this.checkCauseIP3Consistent(),n64js.hardware().checkSIStatusConsistent(),this.addRunForCyclesEvent(J);while(this.hasEvent(AJ))try{this.runImpl();break}catch(Q){if(Q instanceof E6)this.handleEmulatedException();else if(Q instanceof X7)n64js.stopForBreakpoint();else{n64js.halt("Exception :"+Q);break}}let q=this.removeEvent(AJ);if(q<0)q=0;if(q>>0);if(this.branchTarget=0,P7(Z),this.pc=this.nextPC,this.delayPC=this.branchTarget,this.incrementCount(_8),J.incrementCount(_8),Q)Q=lV(Q,Y>>>0,Z,this);else if(this.pc=0)this.addRunForCyclesEvent(q)}updateCause3(){if(n64js.hardware().miRegDevice.interruptsUnmasked())this.setControlBits32(k0,CY),this.updateStuffToDoForInterrupts();else this.clearControlBits32(k0,CY);this.checkCauseIP3Consistent()}checkCauseIP3Consistent(){const q=n64js.hardware().miRegDevice.interruptsUnmasked(),Q=(this.getControlU32(k0)&CY)!==0;a(q===Q,`CAUSE_IP3 ${Q} inconsistent with MI_INTR_REG ${q}`)}statusRegisterChanged(){this.cop1ControlChanged(),this.updateStuffToDoForInterrupts()}checkForUnmaskedInterrupts(){const J=this.getControlU32(U0);if((J&(hJ|EJ|Rq))===Rq){const q=this.getControlU32(k0);if((J&q&oL)!==0)return!0}return!1}updateStuffToDoForInterrupts(){if(this.checkForUnmaskedInterrupts())this.stuffToDo|=yq;else this.stuffToDo&=~yq}setBadVAddr(J){this.setControlU64(i8,J)}setContext(J){const q=Number(J&0xffffffffn),Q=OV(q)<>0);this.setBadVAddr(Y),this.setContext(Y),this.setXContext(Y),this.maskControlBits64(D6,wJ,Y),this.raiseExceptionCopCode(J,0,q)}raiseAddressException(J,q,Q){const Y=BigInt(Q>>0);this.setBadVAddr(Y),this.setContext(Y),this.setXContext(Y),this.raiseExceptionCopCode(J,0,q)}raiseExceptionCopCode(J,q,Q){const Y=Q7|xL,Z=Q<>0,Q=J-q>>>0;this.removeEvent(Z7),this.addCompareEvent(Q),this.setControlU32(K8,J)}}addEvent(J,q,Q){return this.eventQueue.addEvent(J,q,Q)}removeEvent(J){return this.eventQueue.removeEvent(J)}getCyclesUntilEvent(J){this.eventQueue.getCyclesUntilEvent(J)}hasEvent(J){return this.eventQueue.hasEvent(J)}addCompareEvent(J){const q=this;this.addEvent(Z7,J,()=>{q.setControlBits32(k0,q7),q.updateStuffToDoForInterrupts()})}addRunForCyclesEvent(J){const q=this;this.addEvent(AJ,J,()=>{q.stuffToDo|=Y7})}getRandom(){const J=this.getControlU32(uq),q=J>=32?0:J&31,Q=J>=32?64:32;let Y=Math.floor(Math.random()*(Q-q))+q;if(a(Y>=q&&Y>>0);for(let Z=0;Z<32;++Z){const K=this.tlbEntries[Z];if((Y&K.vpnmask64)!==K.vpn2bits)continue;if(!K.global&&(K.hi&OJ)!==Q)continue;return K}return null}translateReadInternal(J){const q=this.tlbFindEntry(J);if(!q)return 0;const Q=J&q.checkbit;if(((Q?q.pfno:q.pfne)&DY)===0)return 0;const Z=Q?q.physOdd:q.physEven,K=J&q.offsetMask;return Z|K}translateRead(J){const q=this.tlbFindEntry(J);if(!q)throw this.raiseTLBException(e$,aq,J),new E6;const Q=J&q.checkbit;if(((Q?q.pfno:q.pfne)&DY)===0)throw this.raiseTLBException(_0,aq,J),new E6;const Z=Q?q.physOdd:q.physEven,K=J&q.offsetMask;return Z|K}translateWrite(J){const q=this.tlbFindEntry(J);if(!q)throw this.raiseTLBException(e$,rq,J),new E6;const Q=J&q.checkbit,Y=Q?q.pfno:q.pfne;if((Y&DY)===0)throw this.raiseTLBException(_0,rq,J),new E6;if((Y&rL)===0)throw this.raiseTLBException(_0,aZ,J),new E6;const Z=Q?q.physOdd:q.physEven,K=J&q.offsetMask;return Z|K}unalignedLoad(J){throw this.raiseAdELException(J),new E6}unalignedStore(J){throw this.raiseAdESException(J),new E6}execBreakpoint(){throw new X7}execSLL(J,q,Q){this.setRegS32Extend(J,this.getRegS32Lo(q)<>>Q)}execSRA(J,q,Q){this.setRegS32Extend(J,Number(this.getRegS64(q)>>BigInt(Q)&0xffff_ffffn))}execSLLV(J,q,Q){this.setRegS32Extend(J,this.getRegS32Lo(q)<<(this.getRegS32Lo(Q)&31))}execSRLV(J,q,Q){this.setRegS32Extend(J,this.getRegS32Lo(q)>>>(this.getRegS32Lo(Q)&31))}execSRAV(J,q,Q){this.setRegS32Extend(J,Number(this.getRegS64(q)>>BigInt(this.getRegS32Lo(Q)&31)&0xffff_ffffn))}execDSLLV(J,q,Q){this.setRegU64(J,this.getRegU64(q)<>BigInt(this.getRegU32Lo(Q)&63))}execDSRAV(J,q,Q){this.setRegU64(J,this.getRegS64(q)>>BigInt(this.getRegU32Lo(Q)&63))}execDSLL(J,q,Q){this.setRegU64(J,this.getRegU64(q)<>BigInt(Q))}execDSRA(J,q,Q){this.setRegU64(J,this.getRegS64(q)>>BigInt(Q))}execDSLL32(J,q,Q){this.setRegU64(J,this.getRegU64(q)<>BigInt(Q+32))}execDSRA32(J,q,Q){this.setRegU64(J,this.getRegS64(q)>>BigInt(Q+32))}execRESERVED(J){this.raiseRESERVEDException(J)}execSYSCALL(){this.raiseSYSCALLException()}execBREAK(){this.raiseBREAKException()}execSYNC(){}execMFHI(J){this.setRegU64(J,this.getMultHiU64())}execMFLO(J){this.setRegU64(J,this.getMultLoU64())}execMTHI(J){this.setMultHiU64(this.getRegU64(J))}execMTLO(J){this.setMultLoU64(this.getRegU64(J))}execMULT(J,q){const Q=BigInt(this.getRegS32Lo(q))*BigInt(this.getRegS32Lo(J));this.setMultLoS32Extend(Q&K7),this.setMultHiS32Extend(Q>>32n)}execDMULT(J,q){const Q=this.getRegS64(q)*this.getRegS64(J);this.setMultLoS64(Q&q6),this.setMultHiS64(Q>>64n)}execMULTU(J,q){const Q=BigInt(this.getRegU32Lo(q))*BigInt(this.getRegU32Lo(J));this.setMultLoS32Extend(Q&K7),this.setMultHiS32Extend(Q>>32n)}execDMULTU(J,q){const Q=this.getRegU64(q)*this.getRegU64(J);this.setMultLoU64(Q&q6),this.setMultHiU64(Q>>64n)}execDIV(J,q){const Q=this.getRegS32Lo(q),Y=this.getRegS32Lo(J);let Z,K;if(Y)Z=Q/Y>>0,K=Q%Y;else Z=Q<0?1:-1,K=Q;this.setMultLoS32Extend(BigInt(Z)),this.setMultHiS32Extend(BigInt(K))}execDDIV(J,q){const Q=this.getRegS64(J),Y=this.getRegS64(q);let Z,K;if(Q)Z=Y/Q,K=Y%Q;else Z=Y<0?1n:-1n,K=Y;this.setMultLoS64(Z),this.setMultHiS64(K)}execDIVU(J,q){const Q=this.getRegU32Lo(q),Y=this.getRegU32Lo(J);let Z,K;if(Y)Z=Q/Y>>0,K=Q%Y;else Z=-1,K=Q;this.setMultLoS32Extend(BigInt(Z)),this.setMultHiS32Extend(BigInt(K))}execDDIVU(J,q){const Q=this.getRegU64(J),Y=this.getRegU64(q);let Z,K;if(Q)Z=Y/Q,K=Y%Q;else Z=-1n,K=Y;this.setMultLoU64(Z),this.setMultHiU64(K)}execADD(J,q,Q){const Y=this.getRegS32Lo(Q),Z=this.getRegS32Lo(q),K=Y+Z;if(RY(Y,Z,K)){this.raiseOverflowException();return}this.setRegS32Extend(J,K)}execDADD(J,q,Q){const Y=this.getRegS64(Q),Z=this.getRegS64(q),K=Y+Z;if(bY(Y,Z,K)){this.raiseOverflowException();return}this.setRegU64(J,K)}execADDU(J,q,Q){const Y=this.getRegS32Lo(Q),Z=this.getRegS32Lo(q),K=Y+Z;this.setRegS32Extend(J,K)}execDADDU(J,q,Q){const Y=this.getRegS64(Q),Z=this.getRegS64(q),K=Y+Z;this.setRegU64(J,K)}execSUB(J,q,Q){const Y=this.getRegS32Lo(Q),Z=this.getRegS32Lo(q),K=Y-Z;if(j7(Y,Z,K)){this.raiseOverflowException();return}this.setRegS32Extend(J,K)}execDSUB(J,q,Q){const Y=this.getRegS64(Q),Z=this.getRegS64(q),K=Y-Z;if(N7(Y,Z,K)){this.raiseOverflowException();return}this.setRegU64(J,K)}execSUBU(J,q,Q){const Y=this.getRegS32Lo(Q),Z=this.getRegS32Lo(q),K=Y-Z;this.setRegS32Extend(J,K)}execDSUBU(J,q,Q){const Y=this.getRegS64(Q),Z=this.getRegS64(q),K=Y-Z;this.setRegU64(J,K)}execAND(J,q,Q){this.setRegU64(J,this.getRegU64(Q)&this.getRegU64(q))}execOR(J,q,Q){this.setRegU64(J,this.getRegU64(Q)|this.getRegU64(q))}execXOR(J,q,Q){this.setRegU64(J,this.getRegU64(Q)^this.getRegU64(q))}execNOR(J,q,Q){this.setRegU64(J,~(this.getRegU64(Q)|this.getRegU64(q)))}execCLEAR(J){this.setRegU64(J,0n)}execMOV(J,q){this.setRegU64(J,this.getRegU64(q))}execSLT(J,q,Q){const Y=this.getRegS64(Q)>0}addrU32(J,q){return this.getRegS32Lo(J)+q>>>0}calcDebuggerAddress(J){return this.addrS32(u(J),b(J))}execLB(J,q,Q){const Y=FY(this.addrS32(q,Q));this.setRegS32Extend(J,Y)}execLBU(J,q,Q){const Y=HY(this.addrS32(q,Q));this.setRegU32Extend(J,Y)}execLH(J,q,Q){const Y=NY(this.addrS32(q,Q));this.setRegS32Extend(J,Y)}execLHU(J,q,Q){const Y=jY(this.addrS32(q,Q));this.setRegU32Extend(J,Y)}execLW(J,q,Q){const Y=VJ(this.addrS32(q,Q));if(J==0){console.log("LW to register 0");return}this.setRegS32Extend(J,Y)}execLWU(J,q,Q){const Y=LJ(this.addrS32(q,Q));this.setRegU32Extend(J,Y)}execLD(J,q,Q){const Y=t6(this.addrS32(q,Q));this.setRegU64(J,Y)}execLWL(J,q,Q){const Y=this.addrU32(q,Q),Z=LJ((Y&~3)>>>0),K=8*(Y&3);this.setRegS32ExtendMasked(J,Z<>>0),K=8*(3-(Y&3));this.setRegS32ExtendMasked(J,Z>>>K,Iq>>>K)}execLDL(J,q,Q){const Y=this.addrU32(q,Q),Z=BigInt(8*(Y&7)),K=t6((Y&~7)>>>0);this.setRegU64Masked(J,K<>>0);this.setRegU64Masked(J,K>>Z,q6>>Z)}execLWC1(J,q,Q){if(!this.checkCopXUsable(1))return;l.store32(l.copRegIdx32(J),VJ(this.addrS32(q,Q)))}execLWC2(J,q,Q){if(!this.checkCopXUsable(2))return;this.unimplemented(this.pc,"LWC2")}execLWC3(J,q,Q){if(!this.checkCopXUsable(3))return;this.unimplemented(this.pc,"LWC3")}execLDC1(J,q,Q){if(!this.checkCopXUsable(1))return;const Y=t6(this.addrS32(q,Q));l.store64(l.copRegIdx64(J),Y)}execLDC2(J,q,Q){if(!this.checkCopXUsable(2))return;this.unimplemented(this.pc,"LDC2")}execSB(J,q,Q){GY(this.addrS32(q,Q),this.getRegS32Lo(J))}execSH(J,q,Q){PY(this.addrS32(q,Q),this.getRegS32Lo(J))}execSW(J,q,Q){UJ(this.addrS32(q,Q),this.getRegS32Lo(J))}execSD(J,q,Q){MJ(this.addrS32(q,Q),this.getRegU64(J))}execSWL(J,q,Q){const Y=this.addrU32(q,Q),Z=8*(Y&3),K=this.getRegU32Lo(J);zq(Y,K>>>Z,Iq>>>Z)}execSWR(J,q,Q){const Y=this.addrU32(q,Q),Z=8*(3-(Y&3)),K=this.getRegU32Lo(J);zq(Y,K<>Z,q6>>Z)}execSDR(J,q,Q){const Y=this.addrU32(q,Q),Z=this.getRegU64(J),K=BigInt(8*(7-(Y&7)));Hq(Y,Z<>>2&7;return q!==0||Q!==0&&Q!==4}execTGE(J,q){this.maybeRaiseTRAPException(this.getRegS64(q)>=this.getRegS64(J))}execTGEU(J,q){this.maybeRaiseTRAPException(this.getRegU64(q)>=this.getRegU64(J))}execTLT(J,q){this.maybeRaiseTRAPException(this.getRegS64(q)=BigInt(q))}execTGEIU(J,q){this.maybeRaiseTRAPException(this.getRegU64(J)>=BigInt.asUintN(64,BigInt(q)))}execTLTI(J,q){this.maybeRaiseTRAPException(this.getRegS64(J)=0n,q)}execBGTZ(J,q){this.conditionalBranch(this.getRegS64(J)>0n,q)}execBLEZ(J,q){this.conditionalBranch(this.getRegS64(J)<=0n,q)}execBLTZ(J,q){this.conditionalBranch(this.getRegS64(J)<0n,q)}execBGEZL(J,q){this.conditionalBranchLikely(this.getRegS64(J)>=0n,q)}execBGTZL(J,q){this.conditionalBranchLikely(this.getRegS64(J)>0n,q)}execBLEZL(J,q){this.conditionalBranchLikely(this.getRegS64(J)<=0n,q)}execBLTZL(J,q){this.conditionalBranchLikely(this.getRegS64(J)<0n,q)}execBLTZAL(J,q){const Q=this.getRegS64(J)<0n;this.setRegS32Extend(Y6,this.nextPC+4),this.conditionalBranch(Q,q)}execBGEZAL(J,q){const Q=this.getRegS64(J)>=0n;this.setRegS32Extend(Y6,this.nextPC+4),this.conditionalBranch(Q,q)}execBLTZALL(J,q){const Q=this.getRegS64(J)<0n;this.setRegS32Extend(Y6,this.nextPC+4),this.conditionalBranchLikely(Q,q)}execBGEZALL(J,q){const Q=this.getRegS64(J)>=0n;this.setRegS32Extend(Y6,this.nextPC+4),this.conditionalBranchLikely(Q,q)}execMFC0(J,q){this.setRegS32Extend(J,Number(this.moveFromControl(q)&0xffff_ffffn))}execDMFC0(J,q){this.setRegU64(J,this.moveFromControl(q))}execMTC0(J,q){this.moveToControl(q,BigInt(this.getRegS32Lo(J)))}execDMTC0(J,q){this.moveToControl(q,this.getRegU64(J))}execTLB(J){switch(J){case 1:this.tlbRead();return;case 2:this.tlbWriteIndex();return;case 6:this.tlbWriteRandom();return;case 8:this.tlbProbe();return;case 24:this.execERET();return}n64js.warn(`CPU: unknown TLB op, pc: ${N(this.pc)}, op: ${N(J)}`)}execERET(){if(this.getControlU32(U0)&EJ)this.nextPC=this.getControlU32(e8),this.clearControlBits32(U0,EJ),M(`ERET from error trap - ${N(this.nextPC)}`);else this.nextPC=this.getControlU32(G6),this.clearControlBits32(U0,hJ);this.llBit=0}execMFC1(J,q){this.setRegS32Extend(J,l.loadS32(l.copRegIdx32(q)))}execDMFC1(J,q){this.setRegU64(J,l.loadU64(l.copRegIdx64(q)))}execMTC1(J,q){l.store32(l.copRegIdx32(q),this.getRegS32Lo(J))}execDMTC1(J,q){l.store64(l.copRegIdx64(q),this.getRegS64(J))}execCFC1(J,q){switch(q){case 0:case 31:this.setRegS32Extend(J,l.control[q]);break}}execCTC1(J,q){if(q===31)l.setStatus(this.getRegU32Lo(J))}execDCFC1(J,q){l.DCFC1(J,q)}execDCTC1(J,q){l.DCTC1(q,J)}execMFC2(J){if(!this.checkCopXUsable(2))return;this.setRegS32Extend(J,q8.getReg32())}execDMFC2(J){if(!this.checkCopXUsable(2))return;this.setRegU64(J,q8.getReg64())}execCFC2(J){if(!this.checkCopXUsable(2))return;this.setRegS32Extend(J,q8.getReg32())}execDCFC2(J){if(!this.checkCopXUsable(2))return;this.raiseRESERVEDException(2)}execMTC2(J){if(!this.checkCopXUsable(2))return;q8.setReg64(this.getRegU64(J))}execDMTC2(J){if(!this.checkCopXUsable(2))return;q8.setReg64(this.getRegU64(J))}execCTC2(J){if(!this.checkCopXUsable(2))return;q8.setReg64(this.getRegU64(J))}execDCTC2(J){if(!this.checkCopXUsable(2))return;this.raiseRESERVEDException(2)}unimplemented(J,q){n64js.warn(`${J}: ${q} is unimplemented`)}}class vY{constructor(J){this.hardware=J;const q=new ArrayBuffer(8);this.regU32=new Uint32Array(q),this.regU64=new BigUint64Array(q)}reset(){this.regU64[0]=0n}setReg32(J){this.regU32[0]=J,this.regU32[1]=J>>31}setReg64(J){this.regU64[0]=J}getReg32(){return this.regU32[0]}getReg64(){return this.regU64[0]}}class E6{}var BV=IV([(J)=>V.execSLL(R(J),A(J),R0(J)),k,(J)=>V.execSRL(R(J),A(J),R0(J)),(J)=>V.execSRA(R(J),A(J),R0(J)),(J)=>V.execSLLV(R(J),A(J),D(J)),k,(J)=>V.execSRLV(R(J),A(J),D(J)),(J)=>V.execSRAV(R(J),A(J),D(J)),(J)=>V.execJR(D(J)),(J)=>V.execJALR(R(J),D(J)),k,k,(J)=>V.execSYSCALL(),(J)=>V.execBREAK(),k,(J)=>V.execSYNC(),(J)=>V.execMFHI(R(J)),(J)=>V.execMTHI(D(J)),(J)=>V.execMFLO(R(J)),(J)=>V.execMTLO(D(J)),(J)=>V.execDSLLV(R(J),A(J),D(J)),k,(J)=>V.execDSRLV(R(J),A(J),D(J)),(J)=>V.execDSRAV(R(J),A(J),D(J)),(J)=>V.execMULT(A(J),D(J)),(J)=>V.execMULTU(A(J),D(J)),(J)=>V.execDIV(A(J),D(J)),(J)=>V.execDIVU(A(J),D(J)),(J)=>V.execDMULT(A(J),D(J)),(J)=>V.execDMULTU(A(J),D(J)),(J)=>V.execDDIV(A(J),D(J)),(J)=>V.execDDIVU(A(J),D(J)),(J)=>V.execADD(R(J),A(J),D(J)),(J)=>V.execADDU(R(J),A(J),D(J)),(J)=>V.execSUB(R(J),A(J),D(J)),(J)=>V.execSUBU(R(J),A(J),D(J)),(J)=>V.execAND(R(J),A(J),D(J)),(J)=>V.execOR(R(J),A(J),D(J)),(J)=>V.execXOR(R(J),A(J),D(J)),(J)=>V.execNOR(R(J),A(J),D(J)),k,k,(J)=>V.execSLT(R(J),A(J),D(J)),(J)=>V.execSLTU(R(J),A(J),D(J)),(J)=>V.execDADD(R(J),A(J),D(J)),(J)=>V.execDADDU(R(J),A(J),D(J)),(J)=>V.execDSUB(R(J),A(J),D(J)),(J)=>V.execDSUBU(R(J),A(J),D(J)),(J)=>V.execTGE(A(J),D(J)),(J)=>V.execTGEU(A(J),D(J)),(J)=>V.execTLT(A(J),D(J)),(J)=>V.execTLTU(A(J),D(J)),(J)=>V.execTEQ(A(J),D(J)),k,(J)=>V.execTNE(A(J),D(J)),k,(J)=>V.execDSLL(R(J),A(J),R0(J)),k,(J)=>V.execDSRL(R(J),A(J),R0(J)),(J)=>V.execDSRA(R(J),A(J),R0(J)),(J)=>V.execDSLL32(R(J),A(J),R0(J)),k,(J)=>V.execDSRL32(R(J),A(J),R0(J)),(J)=>V.execDSRA32(R(J),A(J),R0(J))]);n64js.executeUnknown=k;var bV=fY([(J)=>V.execMFC0(A(J),J0(J)),(J)=>V.execDMFC0(A(J),J0(J)),k,k,(J)=>V.execMTC0(A(J),J0(J)),(J)=>V.execDMTC0(A(J),J0(J)),k,k,k,k,k,k,k,k,k,k,(J)=>V.execTLB(F8(J)),k,k,k,k,k,k,k,k,k,k,k,k,k,k,k]),_V=fY([(J)=>V.execMFC1(A(J),J0(J)),(J)=>V.execDMFC1(A(J),J0(J)),(J)=>V.execCFC1(A(J),J0(J)),(J)=>V.execDCFC1(A(J),J0(J)),(J)=>V.execMTC1(A(J),J0(J)),(J)=>V.execDMTC1(A(J),J0(J)),(J)=>V.execCTC1(A(J),J0(J)),(J)=>V.execDCTC1(A(J),J0(J)),yV,k,k,k,k,k,k,k,(J)=>l.execSInstr(u0(J),P6(J),J0(J),K6(J)),(J)=>l.execDInstr(u0(J),P6(J),J0(J),K6(J)),k,k,(J)=>l.execWInstr(u0(J),P6(J),J0(J),K6(J)),(J)=>l.execLInstr(u0(J),P6(J),J0(J),K6(J)),k,k,k,k,k,k,k,k,k,k]),vV=fY([(J)=>V.execMFC2(A(J)),(J)=>V.execDMFC2(A(J)),(J)=>V.execCFC2(A(J)),(J)=>V.execDCFC2(A(J)),(J)=>V.execMTC2(A(J)),(J)=>V.execDMTC2(A(J)),(J)=>V.execCTC2(A(J)),(J)=>V.execDCTC2(A(J)),k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k]);n64js.executeCop1_disabled=uY;var xV=gV([(J)=>V.execBLTZ(D(J),q0(J)),(J)=>V.execBGEZ(D(J),q0(J)),(J)=>V.execBLTZL(D(J),q0(J)),(J)=>V.execBGEZL(D(J),q0(J)),k,k,k,k,(J)=>V.execTGEI(D(J),b(J)),(J)=>V.execTGEIU(D(J),b(J)),(J)=>V.execTLTI(D(J),b(J)),(J)=>V.execTLTIU(D(J),b(J)),(J)=>V.execTEQI(D(J),b(J)),k,(J)=>V.execTNEI(D(J),b(J)),k,(J)=>V.execBLTZAL(D(J),q0(J)),(J)=>V.execBGEZAL(D(J),q0(J)),(J)=>V.execBLTZALL(D(J),q0(J)),(J)=>V.execBGEZALL(D(J),q0(J)),k,k,k,k,k,k,k,k,k,k,k,k]),L7=mV([RV,pV,(J)=>V.execJ(I6(V.pc,J)),(J)=>V.execJAL(I6(V.pc,J)),(J)=>V.execBEQ(A(J),D(J),q0(J)),(J)=>V.execBNE(A(J),D(J),q0(J)),(J)=>V.execBLEZ(D(J),q0(J)),(J)=>V.execBGTZ(D(J),q0(J)),(J)=>V.execADDI(A(J),D(J),b(J)),(J)=>V.execADDIU(A(J),D(J),b(J)),(J)=>V.execSLTI(A(J),D(J),b(J)),(J)=>V.execSLTIU(A(J),D(J),b(J)),(J)=>V.execANDI(A(J),D(J),L6(J)),(J)=>V.execORI(A(J),D(J),L6(J)),(J)=>V.execXORI(A(J),D(J),L6(J)),(J)=>V.execLUI(A(J),L6(J)),TV,uY,fV,uV,(J)=>V.execBEQL(A(J),D(J),q0(J)),(J)=>V.execBNEL(A(J),D(J),q0(J)),(J)=>V.execBLEZL(D(J),q0(J)),(J)=>V.execBGTZL(D(J),q0(J)),(J)=>V.execDADDI(A(J),D(J),b(J)),(J)=>V.execDADDIU(A(J),D(J),b(J)),(J)=>V.execLDL(A(J),u(J),b(J)),(J)=>V.execLDR(A(J),u(J),b(J)),(J)=>V.execBreakpoint(),k,k,(J)=>V.execRESERVED(0),(J)=>V.execLB(A(J),u(J),b(J)),(J)=>V.execLH(A(J),u(J),b(J)),(J)=>V.execLWL(A(J),u(J),b(J)),(J)=>V.execLW(A(J),u(J),b(J)),(J)=>V.execLBU(A(J),u(J),b(J)),(J)=>V.execLHU(A(J),u(J),b(J)),(J)=>V.execLWR(A(J),u(J),b(J)),(J)=>V.execLWU(A(J),u(J),b(J)),(J)=>V.execSB(A(J),u(J),b(J)),(J)=>V.execSH(A(J),u(J),b(J)),(J)=>V.execSWL(A(J),u(J),b(J)),(J)=>V.execSW(A(J),u(J),b(J)),(J)=>V.execSDL(A(J),u(J),b(J)),(J)=>V.execSDR(A(J),u(J),b(J)),(J)=>V.execSWR(A(J),u(J),b(J)),(J)=>V.execCACHE(A(J),u(J),b(J)),(J)=>V.execLL(A(J),u(J),b(J)),(J)=>V.execLWC1(A(J),u(J),b(J)),(J)=>V.execLWC2(A(J),u(J),b(J)),(J)=>V.execLWC3(A(J),u(J),b(J)),(J)=>V.execLLD(A(J),u(J),b(J)),(J)=>V.execLDC1(A(J),u(J),b(J)),(J)=>V.execLDC2(A(J),u(J),b(J)),(J)=>V.execLD(A(J),u(J),b(J)),(J)=>V.execSC(A(J),u(J),b(J)),(J)=>V.execSWC1(A(J),u(J),b(J)),(J)=>V.execSWC2(A(J),u(J),b(J)),(J)=>V.execSWC3(A(J),u(J),b(J)),(J)=>V.execSCD(A(J),u(J),b(J)),(J)=>V.execSDC1(A(J),u(J),b(J)),(J)=>V.execSDC2(A(J),u(J),b(J)),(J)=>V.execSD(A(J),u(J),b(J))]);n64js.singleStep=function(){let J=0;if(n64js.isBreakpoint(V.pc))J=V.pc,n64js.toggleBreakpoint(J);if(V.run(1),J)n64js.toggleBreakpoint(J)};class V7{constructor(){this.kNumEntries=16384,this.entries=[];for(let J=0;J>>5)}addressToCacheLineRoundUp(J){return Math.floor(J+31>>>5)}lookupEntry(J){const Q=this.addressToCacheLine(J)%this.entries.length;return this.entries[Q]}addInstructionToFragment(J,q){J.updateMinMax(q),this.lookupEntry(q).add(J)}invalidateEntry(J){const q=this.lookupEntry(J);let Q=0;const Y=this.addressToCacheLine(J);for(let[Z,K]of q.entries())if(this.addressToCacheLine(Z.minPC)<=Y&&this.addressToCacheLineRoundUp(Z.maxPC)>=Y)Z.invalidate(),q.delete(Z),Q++}}var U7=new V7,S8=new VY;n64js.checkSyncState=oV;n64js.executeOp=P7;class n{constructor(J,q,Q,Y,Z){this.name=J,this.hardware=q,this.mem=Q,this.u8=Q?Q.u8:null,this.rangeStart=Y,this.rangeEnd=Z,this.quiet=!0}setMem(J){this.mem=J,this.u8=J.u8}reset(){}calcEA(J){return J-this.rangeStart}calcInternalEA(J){return this.calcEA(J)}calcReadEA(J){return this.calcEA(J)}calcWriteEA(J){return this.calcEA(J)}readInternal32(J){const q=this.calcInternalEA(J);if(q+4<=this.u8.length)return this.mem.getU32(q);return 3722304989}writeInternal32(J,q){const Q=this.calcInternalEA(J);if(Q+4<=this.u8.length)this.mem.set32(Q,q)}logRead(J){}logWrite(J,q,Q){}readU64(J){const q=this.calcReadEA(J);if(q+8>this.u8.length)return 0;return this.mem.getU64(q)}readU32(J){const q=this.calcReadEA(J);if(q+4>this.u8.length)return 0;return this.mem.getU32(q)}readU16(J){const q=this.calcReadEA(J);if(q+2>this.u8.length)return 0;return this.mem.getU16(q)}readU8(J){const q=this.calcReadEA(J);if(q+1>this.u8.length)return 0;return this.mem.getU8(q)}readS32(J){const q=this.calcReadEA(J);if(q+4>this.u8.length)return 0;return this.mem.getS32(q)}readS16(J){const q=this.calcReadEA(J);if(q+2>this.u8.length)return 0;return this.mem.getS16(q)}readS8(J){const q=this.calcReadEA(J);if(q+1>this.u8.length)return 0;return this.mem.getS8(q)}write64masked(J,q,Q){const Y=this.calcWriteEA(J)&~7;if(Y+8>this.u8.length)return;this.mem.set64masked(Y,q,Q)}write32masked(J,q,Q){const Y=this.calcWriteEA(J)&~3;if(Y+4>this.u8.length)return;this.mem.set32masked(Y,q,Q)}write64(J,q){const Q=this.calcWriteEA(J);if(Q+8>this.u8.length)return;this.mem.set64(Q,q)}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)return;this.mem.set32(Q,q)}write16(J,q){const Q=this.calcWriteEA(J);if(Q+2>this.u8.length)return;this.mem.set16(Q,q)}write8(J,q){const Q=this.calcWriteEA(J);if(Q+1>this.u8.length)return;this.mem.set8(Q,q)}}var gY=0,M7=4,W0=8,kJ=12,rV=128,sV=256,iV=512,tV=1024,eV=2048,JU=4096,qU=8192,O7=128,A7=256,h7=512,QU=1,YU=2,ZU=4,KU=8,XU=16,WU=32,$U=64,zU=128,HU=256,FU=512,jU=1024,NU=2048;var v8=1,w6=2,CJ=4,DJ=8,yJ=16,bq=32;class xY extends n{constructor(J,q,Q){super("MIReg",J,J.mi_reg,q,Q)}reset(){this.mem.set32(M7,33685762)}interruptsUnmasked(){return(this.mem.getU32(kJ)&this.mem.getU32(W0))!==0}intrReg(){return this.mem.getU32(W0)}intrMaskReg(){return this.mem.getU32(kJ)}setInterruptBit(J){this.mem.setBits32(W0,J),n64js.cpu0.updateCause3()}interruptSP(){this.setInterruptBit(v8)}interruptDP(){this.setInterruptBit(bq)}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";switch(Q){case gY:if(!this.quiet)M(`Wrote to MI mode register: ${N(q)}`);this.writeModeReg(q);break;case kJ:if(!this.quiet)M(`Wrote to MI interrupt mask register: ${N(q)}`);this.writeIntrMaskReg(q);break;case M7:case W0:break;default:M(`Unhandled write to MIReg: ${N(q)} -> [${N(J)}]`),this.mem.set32(Q,q);break}}writeModeReg(J){let q=this.mem.getU32(gY);if(J&qU)q|=h7;if(J&JU)q&=~h7;if(J&sV)q|=O7;if(J&rV)q&=~O7;if(J&tV)q|=A7;if(J&iV)q&=~A7;if(this.mem.set32(gY,q),J&eV)this.mem.clearBits32(W0,bq),n64js.cpu0.updateCause3()}writeIntrMaskReg(J){let q=0,Q=0;q|=(J&QU)>>>0,q|=(J&ZU)>>>1,q|=(J&XU)>>>2,q|=(J&$U)>>>3,q|=(J&HU)>>>4,q|=(J&jU)>>>5,Q|=(J&YU)>>>1,Q|=(J&KU)>>>2,Q|=(J&WU)>>>3,Q|=(J&zU)>>>4,Q|=(J&FU)>>>5,Q|=(J&NU)>>>6;let Y=this.mem.getU32(kJ);Y&=~q,Y|=Q,this.mem.set32(kJ,Y),n64js.cpu0.updateCause3()}}var E7=function(J,q){return J&~(q-1)},O0=function(J,q){const Q=document.querySelector(J);if(Q)Q.textContent=q};window.n64js=window.n64js||{};class pY{constructor(){this.disasmAddress=0,this.lastPC=-1}setPC(J){if(J!==this.lastPC)this.disasmAddress=J,this.lastPC=J}scroll(J){this.disasmAddress+=J*4}}class w7 extends pY{disassembleRange(){return mK(this.disasmAddress-64,this.disasmAddress+64,!0)}updateStatusTable(){O0("#cpu0-status-opsexecuted",V.opsExecuted),O0("#cpu0-status-pc",N(V.pc)),O0("#cpu0-status-delaypc",N(V.delayPC)),O0("#cpu0-status-epc",N(V.getControlU32(G6))),O0("#cpu0-status-cause",N(Number(V.moveFromControl(k0)&0xffff_ffffn))),O0("#cpu0-status-count",N(Number(V.moveFromControl(m6)&0xffff_ffffn))),O0("#cpu0-status-compare",N(V.getControlU32(K8))),O0("#cpu0-status-multhi",y6(V.getMultHiU64())),O0("#cpu0-status-multlo",y6(V.getMultLoU64())),this.updateStatusRegisterRow(),this.updateMipsInterruptsRow();let J=$("#cpu0-status-events").find("tbody");J.empty(),J.append(" "),J.append("Events");const q=V.eventQueue;let Q=q.cyclesToFirstEvent;for(let Y=q.firstEvent;Y;Y=Y.next)J.append(`${Y.getName()}${Q}`),Q+=Y.cyclesToNextEvent}updateStatusRegisterRow(){const J=V.getControlU32(U0);O0("#cpu0-status-sr",N(J));const q={"#cpu0-status-sr-ie":Rq,"#cpu0-status-sr-exl":hJ,"#cpu0-status-sr-erl":EJ};for(let[Q,Y]of Object.entries(q)){const Z=document.querySelector(Q);if(!Z)continue;const K=(J&Y)!==0;Z.classList.toggle("cpu0-status-bit-set",K)}}updateMipsInterruptsRow(){const J=n64js.hardware().miRegDevice,q=J.intrReg(),Q=J.intrMaskReg(),Y={"#cpu0-status-mi-sp":v8,"#cpu0-status-mi-si":w6,"#cpu0-status-mi-ai":CJ,"#cpu0-status-mi-vi":DJ,"#cpu0-status-mi-pi":yJ,"#cpu0-status-mi-dp":bq};for(let[Z,K]of Object.entries(Y)){const X=document.querySelector(Z);if(!X)continue;const W=(q&K)!==0,z=(Q&K)!==0;X.classList.toggle("cpu0-status-bit-enabled",z),X.classList.toggle("cpu0-status-bit-set",W)}}makeCop0RegistersTable(J){let q=$('
'),Q=q.find("tbody");const Y=2;for(let Z=0;Z<32;Z+=Y){let K=$("");for(let X=0;X${W}${y6(V.getRegU64(Z+X))}`);if(J.has(W))z.attr("bgcolor",J.get(W));K.append(z)}Q.append(K)}return q}makeCop1RegistersTable(J){let q=$('
'),Q=q.find("tbody");for(let Y=0;Y<32;++Y){let Z=qQ[Y],K;if((Y&1)===0)K=$(`${Z} ${N(l.regU32[Y])} ${l.regF32[Y]} ${l.regF64[Y/2]}`);else K=$(`${Z} ${N(l.regU32[Y])} ${l.regF32[Y]} `);let X=$("");if(X.append(K),J.has(Z))X.attr("bgcolor",J.get(Z));else if(J.has(Z+"-w"))X.find(".fp-w").attr("bgcolor",J.get(Z+"-w"));else if(J.has(Z+"-s"))X.find(".fp-s").attr("bgcolor",J.get(Z+"-s"));else if(J.has(Z+"-d"))X.find(".fp-d").attr("bgcolor",J.get(Z+"-d"));Q.append(X)}return q}}class k7 extends pY{disassembleRange(){return xJ(H.imem,this.disasmAddress-64,this.disasmAddress+64,!0)}updateStatusTable(){O0("#rsp-status-halted",H.halted),O0("#rsp-status-pc",N(H.pc)),O0("#rsp-status-delaypc",N(H.delayPC)),O0("#rsp-status-nextpc",N(H.nextPC)),O0("#rsp-status-branchtarget",N(H.branchTarget)),O0("#rsp-status-vco",r(H.VCO)),O0("#rsp-status-vcc",r(H.VCC)),O0("#rsp-status-vce",M0(H.VCE))}makeScalarRegistersTable(J){let q=$('
'),Q=q.find("tbody");const Y=2;for(let Z=0;Z<32;Z+=Y){let K=$("");for(let X=0;X${W}${N(H.getRegU32(Z+X))}`);if(J.has(W))z.attr("bgcolor",J.get(W));K.append(z)}Q.append(K)}return q}makeVectorRegistersTable(J){let q=$('
'),Q=q.find("tbody");for(let Y=0;Y<32;Y++){let Z=$("");const K=`V${Y}`;Z.append($(`${K}`));for(let X=0;X<8;++X){let W=$(`${B(H.getVecU16(Y,X),16)}`);if(J.has(K))W.attr("bgcolor",J.get(K));Z.append(W)}Q.append(Z)}return q}makeTaskTable(){const Q=n64js.hardware().sp_mem.subRegion(4032,64);let Y=$('
'),Z=Y.find("tbody");const K=["type","flags","ucode_boot","ucode_boot_size","ucode","ucode_size","ucode_data","ucode_data_size","dram_stack","dram_stack_size","output_buff","output_buff_size","data_ptr","data_size","yield_data_ptr","yield_data_size"];for(let X=0;X<16;X++){const W=$(`${K[X]}${B(Q.getU32(X*4),32)}`);Z.append(W)}return Y}}class mY{constructor(){this.active=!1,this.$cpuContent=$("#cpu-content"),this.cpuTabs=[$("#cpu0-content"),$("#cpu1-content")],this.$cpu0Disassembly=$("#cpu-disasm"),this.$rspContent=$("#rsp-content"),this.rspTabs=[$("#rsp-scalar-content"),$("#rsp-vector-content"),$("#rsp-task-content")],this.$rspDisassembly=$("#rsp-disasm"),this.$dynarecContent=$("#dynarec-content"),this.$memoryContent=$("#memory-content"),this.$timelineContent=$("#timeline-content"),this.cpu0State=new w7,this.rspState=new k7,this.lastOpExecuted=0,this.recentMemoryAccesses=[],this.lastMemoryAccessAddress=0,this.lastStore=null,this.labelMap=new Map,this.debugCycles=Math.pow(10,0),zK($(".output"),()=>{return N(V.pc)}),n64js.addResetCallback(this.onReset.bind(this)),$("#output").find("#clear").click(function(){HK()});const J=this;$("#cpu-speed").change(function(){J.debugCycles=Math.pow(10,$(this).val()|0),M("Speed is now "+J.debugCycles)}),$("#cpu").find("#address").change(function(){J.disasmAddress=parseInt($(this).val(),16),J.updateCPU()}),this.refreshLabelSelect(),this.$memoryContent.find("input").change(function(){J.lastMemoryAccessAddress=parseInt($(this).val(),16),J.updateMemoryView()}),this.updateMemoryView(),$("body").keydown(function(q){let Q=!1;switch(q.key){case"ArrowDown":Q=!0,J.disassemblerDown();break;case"ArrowUp":Q=!0,J.disassemblerUp();break;case"PageDown":Q=!0,J.disassemblerPageDown();break;case"PageUp":Q=!0,J.disassemblerPageUp();break;case"F8":Q=!0,n64js.toggleRun();break;case"F9":Q=!0,AW();break;case"F10":Q=!0,n64js.step();break}if(Q)q.preventDefault()}),document.querySelector("#cpu-tab").addEventListener("click",()=>{this.updateCPU()}),document.querySelector("#rsp-tab").addEventListener("click",()=>{this.updateRSP()}),document.querySelector("#memory-tab").addEventListener("click",()=>{this.updateMemoryView()}),document.querySelector("#dynarec-tab").addEventListener("click",()=>{this.updateDynarec()}),document.querySelector("#timeline-tab").addEventListener("click",()=>{this.updateTimeline()})}visible(){return this.active}show(){this.setVisible(!0)}hide(){this.setVisible(!1)}toggle(){this.setVisible(!this.active)}setVisible(J){this.active=J,document.querySelectorAll(".debug").forEach((q)=>{q.classList.toggle("hidden",!J)}),WX(J)}showTimeline(){this.updateTimeline(),this.show(),$("#timeline-tab").tab("show")}updateMemoryView(){const J=this.lastMemoryAccessAddress||2147483648;this.$memoryContent.find("pre").empty().append(this.makeMemoryAccessRow(J,1024))}refreshLabelSelect(){const J=$("#cpu").find("#labels"),q=Array.from(this.labelMap.keys()),Q=this;q.sort((Y,Z)=>{const K=Q.labelMap.get(Y),X=Q.labelMap.get(Z);return K.localeCompare(X)}),J.html("");for(let Y of q){const Z=this.labelMap.get(Y),K=$(``);K.data("address",Y),J.append(K)}J.change(()=>{let Y=J.find("option:selected").data("address");Q.cpu0State.disasmAddress=Y>>>0,Q.updateCPU()})}onReset(){this.restoreLabelMap(),this.updateCPU(),this.updateRSP()}restoreLabelMap(){this.labelMap=n64js.getLocalStorageItem("debugLabelMap")||new Map,this.refreshLabelSelect()}storeLabelMap(){n64js.setLocalStorageItem("debugLabelMap",this.labelMap)}makeMemoryAccessRow(J,q,Q=64,Y=null){let Z=E7(J,Q)-E7(q/2,Q),K=Z+q,X="";for(let W=Z;W>>0,G=n64js.hardware().memMap.readMemoryInternal32(j),P="";if(Y&&Y.has(j))P=` style="background-color: ${Y.get(j)}"`;z+=` ${B(G,32)}`}z+="\n",X+=z}return $(`${X}`)}makeRecentMemoryAccessRow(J,q){let Q=q==="store"?"#faa":"#ffa";if(q==="update")Q="#afa";let Y=new Map,Z=(J&~3)>>>0;return Y.set(Z,Q),this.makeMemoryAccessRow(J,32,32,Y)}makeLabelColor(J){let q=J>>>2,Q=q>>>16^(q&65535)*2803,Y=Q&31,Z=Q>>>5&31,K=Q>>>10&31,X=Q>>>15&3;switch(Y*=4,Z*=4,K*=4,X){case 0:Y*=2,Z*=2;break;case 1:Z*=2,K*=2;break;case 2:K*=2,Y*=2;break;default:Y*=2,Z*=2,K*=2;break}return"#"+B(Y,8)+B(Z,8)+B(K,8)}setLabelText(J,q){if(this.labelMap.has(q))J.append(` (${this.labelMap.get(q)})`)}setLabelColor(J,q){J.css("color",this.makeLabelColor(q))}makeLabelText(J){let q=this.labelMap.get(J)||"";while(q.length<20)q+=" ";return q}onLabelClicked(J){let q=$(J.delegateTarget),Q=q.data("address")>>>0,Y=this.labelMap.get(Q)||"",Z=$(``);const K=this;Z.keypress((X)=>{if(X.which==13){const W=Z.val();if(W)K.labelMap.set(Q,W.toString());else K.labelMap.delete(Q);K.storeLabelMap(),K.refreshLabelSelect(),this.updateCPU()}}),Z.blur(()=>{q.html(K.makeLabelText(Q))}),q.empty().append(Z),Z.focus()}onFragmentClicked(J){let Q=$(J.delegateTarget).data("fragment");M(`
${Q.func.toString()}
`)}onClickBreakpoint(J){let Q=$(J.delegateTarget).data("address")>>>0;n64js.toggleBreakpoint(Q),this.updateCPU()}updateCPU(){this.cpu0State.setPC(V.pc);let J=V.getOpsExecuted(),q=this.lastOpExecuted===J-1;this.lastOpExecuted=J;let Q=zQ(),Y=this.cpu0State.disassembleRange(),Z=$("
"),K=$("
"),X;for(let z=0;z':'')+B(j,32)+":",L=`${this.makeLabelText(j)}`,U=`${P}  ${B(F.instruction.opcode,32)}  ${L}${F.disassembly}`,O=Q.get(j);if(O){const S=` frag - ops=${O.opsCompiled} hit=${O.executionCount}`;U+=S}let E=$(`${U}`);if(E.find(".dis-label").data("address",j).css("color",this.makeLabelColor(j)).click(this.onLabelClicked.bind(this)),O)E.find(".dis-fragment-link").data("fragment",O).click(this.onFragmentClicked.bind(this));if(j===V.pc)X=F.instruction,E.addClass("dis-line-cur");if(G)E.addClass("dis-line-target"),this.setLabelColor(E.find(".dis-address-target"),j);K.append(E),K.append("
");let w=" ";if(n64js.isBreakpoint(j))w="•";let y=$(`${w}`).data("address",j).click(this.onClickBreakpoint.bind(this));Z.append(y),Z.append("
")}K.find(".dis-address-jump").each(function(){let z=parseInt($(this).text(),16);this.setLabelText($(this),z),this.setLabelColor($(this),z),$(this).click(function(){this.cpu0state.disasmAddress=z,this.redraw()})}.bind(this));let W=this.makeRegisterColours(X);for(let[z,F]of W)K.find(".dis-reg-"+z).css("background-color",F);this.$cpu0Disassembly.find(".dis-recent-memory").html(this.makeRecentMemoryAccesses(q,X,V.calcDebuggerAddress.bind(V))),this.$cpu0Disassembly.find(".dis-gutter").empty().append(Z),this.$cpu0Disassembly.find(".dis-view").empty().append(K),this.cpu0State.updateStatusTable(),this.cpuTabs[0].empty().append(this.cpu0State.makeCop0RegistersTable(W)),this.cpuTabs[1].empty().append(this.cpu0State.makeCop1RegistersTable(W))}updateRSP(){this.rspState.setPC(H.pc);const J=!0;let q=this.rspState.disassembleRange(),Q=$("
"),Y=$("
");for(let W=0;W':'')+B(F,32)+":",P=`${this.makeLabelText(F)}`,L=`${G}  ${B(z.instruction.opcode,32)}  ${P}${z.disassembly}`,U=$(`${L}`);if(U.find(".dis-label").data("address",F).css("color",this.makeLabelColor(F)).click(this.onLabelClicked.bind(this)),F===H.pc)U.addClass("dis-line-cur");if(j)U.addClass("dis-line-target"),this.setLabelColor(U.find(".dis-address-target"),F);Y.append(U),Y.append("
");let O=" ";if(n64js.isBreakpoint(F))O="•";let E=$(`${O}`).data("address",F).click(this.onClickBreakpoint.bind(this));Q.append(E),Q.append("
")}Y.find(".dis-address-jump").each(function(){let W=parseInt($(this).text(),16);this.setLabelText($(this),W),this.setLabelColor($(this),W),$(this).click(function(){this.rspstate.disasmAddress=W,this.redraw()})}.bind(this));const K=XJ(H.pc,H.imem.getU32(H.pc)).instruction;let X=this.makeRegisterColours(K);for(let[W,z]of X)Y.find(".dis-reg-"+W).css("background-color",z);this.$rspDisassembly.find(".dis-recent-memory").html(this.makeRecentMemoryAccesses(J,K,H.calcDebuggerAddress.bind(H))),this.$rspDisassembly.find(".dis-gutter").empty().append(Q),this.$rspDisassembly.find(".dis-view").empty().append(Y),this.rspState.updateStatusTable(),this.rspTabs[0].empty().append(this.rspState.makeScalarRegistersTable(X)),this.rspTabs[1].empty().append(this.rspState.makeVectorRegistersTable(X)),this.rspTabs[2].empty().append(this.rspState.makeTaskTable())}makeRegisterColours(J){const q=["#fd7e14","#198754","#0d6efd"];let Q=new Map;if(J){let Y=0;for(let Z in J.srcRegs)if(!Object.prototype.hasOwnProperty.call(Q,Z))Q.set(Z,q[Y++]);for(let Z in J.dstRegs)if(!Object.prototype.hasOwnProperty.call(Q,Z))Q.set(Z,q[Y++])}return Q}makeRecentMemoryAccesses(J,q,Q){const Y=V.opsExecuted;if(J){if(this.lastStore){if(this.lastStore.cycle+1===Y){let X=this.makeRecentMemoryAccessRow(this.lastStore.address,"update");this.lastStore.element.append(X)}this.lastStore=null}const K=q.memory;if(K){const X=Q(q.opcode);let W=this.makeRecentMemoryAccessRow(X,K.mode);if(K.mode==="store")this.lastStore={address:X,cycle:Y,element:W};if(this.recentMemoryAccesses.push({element:W}),this.recentMemoryAccesses.length>4)this.recentMemoryAccesses.splice(0,1);this.lastMemoryAccessAddress=X}}else this.recentMemoryAccesses=[],this.lastStore=null;let Z=$("
");if(this.recentMemoryAccesses.length>0){const K=["#bbb","#999","#666","#333"];for(let X=0;X0?Math.floor(Math.log10(z.executionCount)):0;q.set(F,(q.get(F)||0)+1),Y.push(z),Q=Math.max(Q,F)}Y.sort((W,z)=>{return z.opsCompiled*z.executionCount-W.opsCompiled*W.executionCount});let Z=$('
'),K="";K+='
',K+='';for(let W=0;W<=Q;W++){let z=q.get(W)||0,F=`< ${Math.pow(10,W+1)}`;K+=``}K+="
Execution CountFrequency
${F}${z}
",K+="
",Z.append(K),K="",K+='
',K+='
',K+='
',K+="
";let X=$(K);if(this.createHotFragmentsTable(X,Y),Z.append(X),J.length>0){K="",K+='
',K+='
',K+='',K+="";for(let W=0;W`}K+="
AddressLengthSystemFragments Removed
${z.join("")}
",K+="
",K+="
",Z.append(K)}this.$dynarecContent.empty().append(Z)}createHotFragmentsTable(J,q){let Q=J.find("#fragment-code"),Y=$(''),Z=["Address","Execution Count","Length","ExecCount * Length"];Y.append(``);for(let K=0;K`);this.initFragmentRow(z,X,Q),Y.append(z)}if(J.find("#fragments").append(Y),q.length>0)Q.append(`
${q[0].func.toString()}
`)}initFragmentRow(J,q,Q){J.click(()=>{Q.html(`
${q.func.toString()}
`)})}updateTimeline(){const J=n64js.hardware().timeline,q=this.$timelineContent.find(".timeline-panel");q.empty();let Q=Number.MAX_VALUE,Y=0;J.tracks.forEach((z)=>{z.events.forEach((F)=>{if(F.startY)Y=F.end})});const Z=Y-Q;if(Z<=0)return;const K=4000,X=30;let W=0;J.tracks.forEach((z)=>{let F=0;z.events.forEach((j)=>{const G=K*(j.start-Q)/Z,P=K*(j.end-j.start)/Z,L=P<1?1:P,U=(W+j.depth)*X,O=X,E=j.name;let w="";if(w+=`
`,w+=`
${E}
`,w+="
",q.append(w),j.depth>F)F=j.depth}),W+=F+1})}disassemblerDown(){this.scrollActiveDisassemblyWindow(1),this.redraw()}disassemblerUp(){this.scrollActiveDisassemblyWindow(-1),this.redraw()}disassemblerPageDown(){this.scrollActiveDisassemblyWindow(16),this.redraw()}disassemblerPageUp(){this.scrollActiveDisassemblyWindow(-16),this.redraw()}scrollActiveDisassemblyWindow(J){const q=this.activeDisassemblyWindow();if(q)q.scroll(J)}activeDisassemblyWindow(){if(this.$cpuContent.hasClass("active"))return this.cpu0State;if(this.$rspContent.hasClass("active"))return this.rspState;return null}redraw(){if(!this.active)return;if(this.$cpuContent.hasClass("active"))this.updateCPU();if(this.$rspContent.hasClass("active"))this.updateRSP();if(this.$memoryContent.hasClass("active"))this.updateMemoryView();if(this.$dynarecContent.hasClass("active"))this.updateDynarec()}}function C7(J){var q=new DataView(J);switch(q.getUint32(0)){case 2151092800:break;case 1074935680:nY(J,3,2,1,0);break;case 306217015:nY(J,2,3,0,1);break;case 931151890:nY(J,1,0,3,2);break;default:throw"Unhandled byteswapping: "+q.getUint32(0).toString(16)}}var nY=function(J,q,Q,Y,Z){var K=new Uint8Array(J),X;for(X=0;X>>2,X=(Q&3)<<4|Y>>>4,W=(Y&15)<<2|Z>>>6,z=Z&63;if(F+1>=J.length)W=64;if(F+2>=J.length)z=64;q+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(K)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(X)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(W)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(z)}return q}function oY(J,q){var Q=0;for(let j=0;j>>4,z=(Z&15)<<4|K>>>2,F=(K&3)<<6|X;if(q[Q++]=W,K!==64)q[Q++]=z;if(X!==64)q[Q++]=F}}var y7=0;class lY{constructor(J){this.getOpsExecuted=J,this.recording=!1,this.tracks=[new cY(this,"Default"),new cY(this,"Audio")],this.eventCount=0,this.curFrameEvent=0,this.frameCount=0}startRecording(){this.recording=!0;for(let J=0;J=1e4||this.frameCount>=10)this.recording=!1,this.curFrameEvent=null,n64js.debugger().showTimeline()}addEvent(J,q){if(!this.curFrameEvent)return null;const Q=this.startEventInternal(J,q);if(Q)Q.stop()}startEvent(J,q){if(!this.curFrameEvent)return null;return this.startEventInternal(J,q)}startEventInternal(J,q){const Q=q==void 0?1:q,Y=this.tracks[Q];return this.eventCount++,Y.startEvent(J)}}class cY{constructor(J,q){this.timeline=J,this.name=q,this.events=[],this.curEvent=null}reset(){this.events=[],this.curEvent=null}startEvent(J){const q=this.timeline.getOpsExecuted(),Q=new I7(this,this.curEvent,J,q);return this.events.push(Q),this.curEvent=Q,Q}stopEvent(J){if(J.end=this.timeline.getOpsExecuted(),this.curEvent==J)this.curEvent=J.parent}}class I7{constructor(J,q,Q,Y){this.track=J,this.parent=q,this.depth=q?q.depth+1:0,this.name=Q,this.start=Y,this.end=Y}stop(){this.track.stopEvent(this)}}var yU=function(J){if(J_7)return _7;return J},PU=0,LU=4,VU=8,B7=12,UU=16,MU=20,OU=1,AU=17825792,hU=33554432,EU=1073741824,wU=2147483648,kU=16777208,CU=262136,R7="AI DMA",b7=0.005,T7=3000,_7=96000,DU=0.1,S7=5;class dY extends n{constructor(J,q,Q){super("AIReg",J,J.ai_reg,q,Q);this.audioContext=new window.AudioContext,this.pendingAddress=0,this.dmaAddresses=new Uint32Array(2),this.dmaLengths=new Uint32Array(2),this.dmaDurations=new Uint32Array(2),this.dmaCount=0,this.dmaEnable=!1,this.dacRate=0,this.bitRate=15,this.precision=16,this.frequency=32000,this.time=0,this.dynamicRate=1,this.lastLogTime=0}readU32(J){return this.readS32(J)>>>0}readS32(J){const q=this.calcWriteEA(J);if(q+4>this.u8.length)throw"Write is out of range";if(!this.quiet)M(`Read from ${N(q)}`);if(q==B7){let Q=AU;return Q|=this.dmaEnable?hU:0,Q|=this.dmaCount>0?EU:0,Q|=this.dmaCount>1?wU:0,Q|=this.dmaCount>1?OU:0,Q}return this.dmaLengthRemaining()}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";switch(Q){case PU:if(!this.quiet)M(`Wrote to AI_DRAM_ADDR_REG: ${N(q)}`);this.pendingAddress=q&kU;break;case LU:if(!this.quiet)M(`Wrote to AI_LEN_REG: ${N(q)}`);this.pushDMA(q&CU);break;case VU:if(!this.quiet)M(`Wrote to AI_CONTROL_REG: ${N(q)}`);this.dmaEnable=(q&1)!=0;break;case B7:this.clearAI();break;case UU:if(this.dacRate=q&16383,this.frequency=Math.max(1,this.viClock/(this.dacRate+1))>>0,!this.quiet)M(`AI dacrate changed to ${this.dacRate}, vi clock is ${this.viClock}, freq ${this.frequency}`);break;case MU:if(!this.quiet)M(`Wrote to AI_BITRATE_REG: ${N(q)}`);this.bitRate=q&15,this.precision=this.bitRate+1;break;default:M(`Unhandled write to AIReg: ${N(q)} -> [${N(J)}]`);break}}get viClock(){return this.hardware.viRegDevice.videoClock}pushDMA(J){if(!J){n64js.warn("AI received zero length write");return}if(this.dmaCount>=2){n64js.warn("AI DMA FIFO is full");return}if(this.dmaAddresses[this.dmaCount]=this.pendingAddress,this.dmaLengths[this.dmaCount]=J,this.dmaDurations[this.dmaCount]=this.estimateDMACyclesFromLength(J),this.dmaCount++,this.dmaCount==1)this.startPlayback()}popDMA(){if(this.dmaCount<=0){n64js.warn("AI DMA underflow");return}if(this.dmaCount==2)this.dmaAddresses[0]=this.dmaAddresses[1],this.dmaLengths[0]=this.dmaLengths[1],this.dmaDurations[0]=this.dmaDurations[1];if(this.dmaCount--,this.dmaCount==1)this.startPlayback()}estimateDMACyclesFromLength(J){const Q=(this.bitRate+1<<1)/8*this.frequency;return J*this.viClock/Q>>>0}startPlayback(){const J=this.dmaAddresses[0],q=this.dmaLengths[0],Q=this.dmaDurations[0],Y=q/4,Z=new Float32Array(Y),K=new Float32Array(Y),X=this.hardware.cachedMemDevice.u8,W=new DataView(X.buffer,J,q);for(let L=0;L0?+b7:-b7;const j=yU(this.frequency*(1+this.dynamicRate));if(S7>0&&z-this.lastLogTime>S7){const L=F>0?"leading":"lagging";console.log(`AI sync: timeDelta ${F}, ${L}, dynamic ${this.dynamicRate}, ${this.frequency} -> ${j}`),this.lastLogTime=z}const G=new AudioBuffer({length:Y,sampleRate:j,numberOfChannels:2});G.copyToChannel(Z,0),G.copyToChannel(K,1);const P=new AudioBufferSourceNode(this.audioContext,{buffer:G});if(P.connect(this.audioContext.destination),P.start(this.time),F<0)this.time=z;this.time+=G.duration,this.raiseAI(),this.addAIDMAEvent(Q)}shouldSkipFrame(){return this.time-this.audioContext.currentTime>DU}dmaLengthRemaining(){if(this.dmaCount==0||this.dmaDurations[0]==0)return 0;const J=n64js.cpu0.getCyclesUntilEvent(R7);if(J<=0)return 0;return J*this.dmaLengths[0]/this.dmaDurations[0]&~7}addAIDMAEvent(J){const q=n64js.hardware().timeline.startEvent("AI DMA",y7),Q=this;n64js.cpu0.addEvent(R7,J,()=>{if(Q.dmaComplete(),q)q.stop()})}dmaComplete(){this.popDMA()}raiseAI(){this.hardware.mi_reg.setBits32(W0,CJ),n64js.cpu0.updateCause3()}clearAI(){this.hardware.mi_reg.clearBits32(W0,CJ),n64js.cpu0.updateCause3()}}var IU=0,BU=4,v7=8,aY=12,RU=16,bU=20,TU=24,_U=28,SU=1,vU=2,fU=4;var uU=16,gU=32;var f7=1,xU=2,u7=4;class rY extends n{constructor(J,q,Q){super("DPC",J,J.dpc_mem,q,Q)}write32(J,q){this.writeReg32(this.calcWriteEA(J),q)}writeReg32(J,q){if(J+4>this.u8.length)throw"Write is out of range";switch(J){case IU:if(!this.quiet)M(`DPC start set to: ${N(q)}`);this.mem.set32(J,q),this.mem.set32(v7,q);break;case BU:if(!this.quiet)M(`DPC end set to: ${N(q)}`);this.mem.set32(J,q);break;case aY:this.updateStatus(q);break;case v7:case RU:case bU:case TU:case _U:M("Wrote to read only DPC reg");break;default:this.mem.set32(J,q);break}}readU32(J){return this.logRead(J),this.readRegU32(this.calcReadEA(J))}readS32(J){return this.logRead(J),this.readRegU32(this.calcReadEA(J))>>0}readRegU32(J){if(J+4>this.u8.length)throw"Read is out of range";return this.mem.getU32(J)}updateStatus(J){let q=this.mem.getU32(aY);if(J&SU)q&=~f7;if(J&vU)q|=f7;if(J&fU)q&=~xU;if(J&uU)q&=~u7;if(J&gU)q|=u7;this.mem.set32(aY,q)}}class sY extends n{constructor(J,q,Q){super("DPS",J,J.dps_mem,q,Q)}write32(J,q){if(this.calcWriteEA(J)+4>this.u8.length)throw"Write is out of range";throw"DPS writes are unhandled"}readS32(J){if(this.logRead(J),this.calcReadEA(J)+4>this.u8.length)throw"Read is out of range";throw"DPS reads are unhandled"}readU32(J){return this.readS32(J)>>>0}}function Q3(J){return J>=tU&&J=eY&&J=IJ&&J=JZ&&J<=J3}function K3(J){return J>=n7&&J<=q3}var p7=function(J){return J>=IJ&&J<=eU},f8=0,u8=4,iY=8,tY=12,N6=16,pU=20,mU=24,nU=28,oU=32,cU=36,lU=40,dU=44,aU=48,Tq=1;var rU=4,g7=8,sU=1,iU=2,tU=83886080,eY=100663296,IJ=134217728,eU=134348799,JZ=268435456,J3=532676607,n7=533725184,q3=2147483647,m7="PI Interrupt";class qZ extends n{constructor(J,q,Q){super("PIReg",J,J.pi_reg,q,Q);this.haveSetMemorySize=!1}reset(){this.haveSetMemorySize=!1}setMemorySize(){if(!this.haveSetMemorySize){const J=this.hardware.rominfo.cic==="6105"?2147484656:2147484440;this.hardware.ram.set32(J-2147483648,8388608),M("Setting memory size"),this.haveSetMemorySize=!0}}readS32(J){const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";let Q=this.mem.getS32(q);switch(q){case f8:Q&=16777214;break;case u8:Q&=4294967294;break;case iY:case tY:Q=127;break}if(!this.quiet)M(`Reading from PIReg: [${N(J)}] -> ${N(Q)}`);return Q}readU32(J){return this.readS32(J)>>>0}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";if(!this.quiet)M(`Writing to PIReg: ${N(q)} -> [${N(J)}]`);if(this.busy()&&Q!=N6){n64js.warn("Write to PI registers while DMA or IO busy"),this.mem.setBits32(N6,rU);return}switch(Q){case f8:case u8:this.mem.set32(Q,q);break;case iY:this.mem.set32(Q,q),this.copyFromRDRAM();break;case tY:this.mem.set32(Q,q),this.copyToRDRAM();break;case N6:if(q&sU){if(!this.quiet)M("PI_STATUS_REG reset");this.mem.set32(N6,0),this.removePIInterrupt()}if(q&iU){if(!this.quiet)M("PI interrupt cleared");this.mem.clearBits32(N6,g7),this.hardware.mi_reg.clearBits32(W0,yJ),n64js.cpu0.updateCause3()}break;case pU:case mU:case nU:case oU:case cU:case lU:case dU:case aU:this.mem.set32(Q,q);break;default:M(`Unhandled write to PIReg: ${N(q)} -> [${N(J)}]`),this.mem.set32(Q,q);break}}busy(){return this.mem.getBits32(N6,Tq)!=0}copyFromRDRAM(){const J=this.mem.getU32(f8)&16777214,q=this.mem.getU32(u8)&4294967294;let Q=(this.mem.getU32(iY)&16777215)+1,Y,Z=0,K=4096;if(Q>=127&&Q&1)Q++;if(x7(q))if(p7(q))switch(this.hardware.saveType){case"SRAM":Y=this.hardware.saveMem,Z=q-IJ,this.hardware.saveDirty=!0;break;case"FlashRam":if(Y=this.hardware.romD2A2Device.flashBuffer,Z=0,Q>Y.length)n64js.warn(`PI DMA to FlashRam exceeds buffer length (${Q} > ${Y.length})`),Q=Y.length;break}else n64js.halt(`PI: unknown dom2addr2 address for ram->cart DMA: ${N(q)}`);else n64js.halt(`PI: unknown cart address for ram->cart DMA: ${N(q)}`);if(Y)Y.copy(Z,this.hardware.ram,J,Q);this.mem.setBits32(N6,Tq),this.addPIInterrupt(K)}copyToRDRAM(){const J=this.mem.getU32(f8)&16777214,q=this.mem.getU32(u8)&4294967294;let Q=(this.mem.getU32(tY)&16777215)+1;if(!this.quiet)M(`PI: copying ${Q} bytes of data from ${N(q)} to ${N(J)}`);if(Q>=127&&Q&1)Q++;if(Q<=128)Q-=J&7;let Y,Z=0,K=this.estimateDMACyclesFromLength(Q);if(Y3(q))Y=this.hardware.rom,Z=q-eY;else if(Z3(q))Y=this.hardware.rom,Z=q-JZ;else if(K3(q))Y=this.hardware.rom,Z=q-n7;else if(Q3(q))n64js.halt("PI: dom2addr1 transfer is unhandled (save)");else if(x7(q))if(p7(q)){switch(Z=q-IJ,this.hardware.saveType){case"SRAM":Y=this.hardware.saveMem;break;case"FlashRam":Y=this.hardware.romD2A2Device.flashDMASource();break}K=4096}else n64js.halt(`PI: unknown dom2addr2 address for cart->ram DMA: ${N(q)}`);else n64js.halt(`PI: unknown cart address for cart->ram DMA: ${N(q)}`);if(Y)this.hardware.ram.copy(J,Y,Z,Q);this.setMemorySize(),this.mem.setBits32(N6,Tq),this.mem.set32(f8,this.mem.getU32(f8)+Q+7&~7),this.mem.set32(u8,this.mem.getU32(u8)+Q+1&~1),this.addPIInterrupt(K)}estimateDMACyclesFromLength(J){const q=J>>>3;if(q)return q;return 16}removePIInterrupt(){n64js.cpu0.removeEvent(m7)}addPIInterrupt(J){const q=n64js.hardware().timeline.startEvent("PI DMA"),Q=this;n64js.cpu0.addEvent(m7,J,()=>{if(Q.dmaComplete(),q)q.stop()})}dmaComplete(){this.mem.clearBits32(N6,Tq),this.mem.setBits32(N6,g7),this.hardware.mi_reg.setBits32(W0,yJ),n64js.cpu0.updateCause3()}}var QZ=0,X3=4,W3=16,p6=24;var g8=4096;class YZ extends n{constructor(J,q,Q){super("SIReg",J,J.si_reg,q,Q)}readS32(J){this.logRead(J);const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";if(q===p6)this.checkStatusConsistent();return this.mem.getS32(q)}readU32(J){return this.readS32(J)>>>0}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";switch(Q){case QZ:if(!this.quiet)M(`Writing to SI dram address reigster: ${N(q)}`);this.mem.set32(Q,q);break;case X3:this.mem.set32(Q,q),this.copyToRDRAM();break;case W3:this.mem.set32(Q,q),this.copyFromRDRAM();break;case p6:if(!this.quiet)M("SI interrupt cleared");this.mem.clearBits32(p6,g8),this.hardware.mi_reg.clearBits32(W0,w6),n64js.cpu0.updateCause3();break;default:M(`Unhandled write to SIReg: ${N(q)} -> [${N(J)}]`),this.mem.set32(Q,q);break}}checkStatusConsistent(){const J=this.hardware.mi_reg.getBits32(W0,w6)!==0,q=this.mem.getBits32(p6,g8)!==0;if(J!==q)n64js.halt("SI_STATUS register is in an inconsistent state")}copyFromRDRAM(){const J=this.mem.getU32(QZ)&536870911;if(!this.quiet)M(`SI: copying from ${N(J)} to PIF RAM`);n64js.joybus().dmaWrite(this.hardware.ram,J),this.mem.setBits32(p6,g8),this.hardware.mi_reg.setBits32(W0,w6),n64js.cpu0.updateCause3()}copyToRDRAM(){const J=this.mem.getU32(QZ)&536870911;if(!this.quiet)M(`SI: copying from PIF RAM to ${N(J)}`);n64js.joybus().dmaRead(this.hardware.ram,J),this.mem.setBits32(p6,g8),this.hardware.mi_reg.setBits32(W0,w6),n64js.cpu0.updateCause3()}}class ZZ extends n{constructor(J,q,Q){super("PIFMEM",J,J.pif_mem,q,Q)}readS32(J){const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";const Q=this.mem.getS32(q);if(q<1984)M(`Reading from PIF rom (${N(J)}). Got ${N(Q)}`);else{const Y=q-1984;switch(Y){case 36:M(`Reading PIF CIC values: ${N(Q)}`);break;case 60:M(`Reading PIF Control byte: ${N(Q)}`);break;default:M(`Reading from PIF ram [${N(J)}]. Got ${N(Q)}`);break}n64js.joybus().cpuRead(Y)}return Q}readU32(J){return this.readS32(J)>>>0}readS8(J){const q=this.calcReadEA(J),Q=this.mem.getU8(q);if(q<1984)M(`Reading from PIF rom (${N(J)}). Got ${M0(Q)}`);else{const Y=q-1984;switch(Y){case 36:M(`Reading PIF CIC values: ${M0(Q)}`);break;case 60:M(`Reading PIF Control byte: ${M0(Q)}`);break;default:M(`Reading from PIF ram [${N(J)}]. Got ${M0(Q)}`);break}n64js.joybus().cpuRead(Y)}return Q}readU8(J){return this.readS8(J)>>>0}write32(J,q){const Q=this.calcWriteEA(J);if(Q<1984){M("Attempting to write to PIF ROM");return}this.mem.set32(Q,q);const Y=Q-1984;switch(Y){case 36:M(`Writing PIF CIC values: ${N(q)}`);break;case 60:M(`Writing PIF Control byte: ${N(q)}`),this.updateControl();break;default:M(`Writing directly to PIF ram [${N(J)}] <-- ${N(q)}`);break}n64js.joybus().cpuWrite(Y)}write16(J,q){const Q=this.calcWriteEA(J);if(Q<1984){M("Attempting to write to PIF ROM");return}const Y=Q&~3,Z=8*(2-(Q&2));this.mem.set32(Y,q<>>0}readU16(J){return this.read(J)&65535}readU8(J){return this.read(J)&255}readS32(J){return this.read(J)>>0}readS16(J){return this.read(J)&65535}readS8(J){return this.read(J)&255}write32(J,q){this.write(J,q)}write16(J,q){this.write(J,q)}write8(J,q){this.write(J,q)}}class WZ extends n{constructor(J,q,Q){super("RDRAMReg",J,J.rdram_reg,q,Q)}calcEA(J){return J&255}}var z3=12;class $Z extends n{constructor(J,q,Q){super("RIReg",J,J.ri_reg,q,Q)}reset(){this.mem.set32(z3,1)}}class k6{constructor(J,q,Q){if(q===void 0)q=0;if(Q===void 0)Q=J.byteLength-q;this.arrayBuffer=J,this.offset=q,this.length=Q,this.u8=new Uint8Array(J,q,Q),this.dataView=new DataView(J,q,Q)}clear(){for(let J=0;Jthis.length)throw"end is out of bounds";return new k6(this.arrayBuffer,this.offset+J,q)}s32Array(){return new Int32Array(this.arrayBuffer,this.offset,this.length/4)}copy(J,q,Q,Y){if(J+Y>this.u8.length)throw"overflow dst";if(Q+Y>q.u8.length)throw"overflow src";for(let Z=0;Z>>0},H3=3019833364,zZ=3019833376,Sq=512,F3=zZ+Sq,j3=75,N3=120,G3=165,P3=180,L3=210,V3=225,U3=240,o7=0,c7=1,l7=2,d7=3,a7=4;class HZ extends n{constructor(J,q,Q){super("ROMd1a1",J,J.rom,q,Q)}write32(J,q){throw`Writing to rom d1a1 ${N(q)} -> [${N(J)}]`}write16(J,q){throw`Writing to rom d1a1 ${r(q)} -> [${N(J)}]`}write8(J,q){throw`Writing to rom d1a1 ${M0(q)} -> [${N(J)}]`}}class FZ extends n{constructor(J,q,Q){super("ROMd1a2",J,J.rom,q,Q);this.lastWrite=0,this.hasLastWrite=!1,this.debugBuffer=new ArrayBuffer(Sq),this.debugBufferU32=new Uint32Array(this.debugBuffer),this.debugBufferU8=new Uint8Array(this.debugBuffer),this.output=""}calcEA(J){return J-this.rangeStart+2&~2}write64(J,q){this.cacheLastWrite(Number(q>>32n))}write32(J,q){if(J==H3)return this.writeDebugBufferLen(q);if(J>=zZ&&J>>0)}write16(J,q){const Q=8*(2-(J&2));this.cacheLastWrite(q<>>0;return super.readU32(J)}readS32(J){if(this.hasLastWrite)return this.consumeLastWrite()>>0;return super.readS32(J)}readU16(J){if(this.hasLastWrite)return this.consumeLastWrite()>>>16;return super.readU16(J)}readS16(J){if(this.hasLastWrite)return this.consumeLastWrite()>>16;return super.readS16(J)}readU8(J){if(this.hasLastWrite)return this.consumeLastWrite()>>>24;return super.readU8(J)}readS8(J){if(this.hasLastWrite)return this.consumeLastWrite()>>24;return super.readS8(J)}cacheLastWrite(J){if(!this.hasLastWrite)this.lastWrite=J,this.hasLastWrite=!0}consumeLastWrite(){return this.hasLastWrite=!1,this.lastWrite}writeDebugBufferLen(J){if(J>Sq)console.log(`debug buffer value too long (${J}), truncating`),J=Sq;for(let q=0;q>>2;this.debugBufferU32[Q]=q}flushDebugOutput(){const J=this.output.lastIndexOf("\n");if(J>=0)console.log(this.output.substring(0,J+1)),this.output=this.output.substring(J+1)}}class jZ extends n{constructor(J,q,Q){super("ROMd1a3",J,J.rom,q,Q)}write32(J,q){throw`Writing to rom d1a3 ${N(q)} -> [${N(J)}]`}write16(J,q){throw`Writing to rom d1a3 ${r(q)} -> [${N(J)}]`}write8(J,q){throw`Writing to rom d1a3 ${M0(q)} -> [${N(J)}]`}}class NZ extends n{constructor(J,q,Q){super("ROMd2a1",J,null,q,Q)}read(J){if(J==2768241928)return M("Reading from ROMd2a1 0xa5000508 - spoofing ~0 value"),~0;return M(`Reading from invalid ROMd2a1 address ${N(J)}`),0}readU32(J){return this.read(J)>>>0}readU16(J){return this.read(J)&65535}readU8(J){return this.read(J)&255}readS32(J){return this.read(J)>>0}readS16(J){return this.read(J)&65535}readS8(J){return this.read(J)&255}write32(J,q){throw`Writing to rom ${N(q)} -> [${N(J)}]`}write16(J,q){throw`Writing to rom ${r(q)} -> [${N(J)}]`}write8(J,q){throw`Writing to rom ${M0(q)} -> [${N(J)}]`}}class GZ extends n{constructor(J,q,Q){super("ROMd2a2",J,null,q,Q);this.flashMode=o7,this.flashStatus=new k6(new ArrayBuffer(8)),this.flashBuffer=new k6(new ArrayBuffer(128)),this.flashOffset=0}hasFlashRam(){return this.hardware.saveType=="FlashRam"}readU32(J){return this.readS32(J)>>>0}readU16(J){return this.readS16(J)>>>0}readU8(J){return this.readS8(J)>>>0}readS32(J){const q=this.calcWriteEA(J);if(q>=557056)return M3(J);if(this.hasFlashRam()){const Q=q&4;return this.flashStatus.getS32(Q)}throw`Reading s32 from rom d2a2 [${N(J)}]`}readS16(J){throw`Reading s16 from rom d2a2 [${N(J)}]`}readS8(J){throw`Reading s8 from rom d2a2 [${N(J)}]`}write32(J,q){const Q=this.calcWriteEA(J);if(this.hasFlashRam()){if(Q!=0)this.flashCommand(q);return}throw`Writing s32 to rom ${N(q)} -> [${N(J)}]`}write16(J,q){throw`Writing s16 to rom ${r(q)} -> [${N(J)}]`}write8(J,q){throw`Writing s8 to rom ${M0(q)} -> [${N(J)}]`}flashDMASource(){switch(this.flashMode){case d7:return this.hardware.saveMem;case a7:return this.flashStatus}return n64js.warn(`Unexpected mode for flash DMA: ${this.flashMode}`),null}flashCommand(J){const q=J>>>24&255;switch(q){case j3:if(this.flashOffset=(J&65535)*128,!this.quiet)M(`set erase offset: ${N(this.flashOffset)}`);break;case N3:if(!this.quiet)M("set mode ERASE");this.flashMode=c7,this.flashStatus.set64(0,0x1111_8008_00c2_001dn);break;case G3:if(this.flashOffset=(J&65535)*128,!this.quiet)M(`set write offset: ${N(this.flashOffset)}`);this.flashStatus.set64(0,0x1111_8004_00c2_001dn);break;case P3:if(!this.quiet)M("setting mode WRITE");this.flashMode=l7;break;case L3:switch(this.flashMode){case o7:if(!this.quiet)M("execute IDLE (ignored)");break;case c7:if(!this.quiet)M(`execute ERASE flash @ ${N(this.flashOffset)} (set saveMem to 0xff)`);this.hardware.saveMem.set(this.flashOffset,128,255),this.hardware.saveDirty=!0;break;case l7:if(!this.quiet)M(`execute WRITE flash @ ${N(this.flashOffset)} (copy flashBuffer to saveMem)`);this.hardware.saveMem.copy(this.flashOffset,this.flashBuffer,0,128),this.hardware.saveDirty=!0;break;default:M(`execute (${N(J)}) with unhandled mode: ${this.flashMode}`);break}break;case V3:if(!this.quiet)M("setting mode STATUS");this.flashMode=a7,this.flashStatus.set64(0,0x1111_8001_00c2_001dn);break;case U3:if(!this.quiet)M("setting mode READ");this.flashMode=d7,this.flashStatus.set64(0,0x1111_8004_f000_001dn);break;default:if(!this.quiet)M(`execute with unknown command ${N(q)}`)}}}function i7(){const J=n64js.hardware(),q=J.cachedMemDevice.u8,Q=J.sp_mem.subRegion(A3,h3),Y=new s7(q,Q);let Z=!1;switch(Y.type){case I3:{const K=J.timeline.startEvent(`HLE Task ${Y.detectVersionString()}`);if(EW(Y),J.miRegDevice.interruptDP(),K)K.stop();Z=!0}break;case B3:Z=!r7.enableAudioLLE;break;case R3:break;case b3:break}return Z}var r7={enableAudioLLE:!0},O3=g0.addFolder("Audio");O3.add(r7,"enableAudioLLE").name("Audio LLE");var A3=4032,h3=64,E3=0;var w3=16,k3=20,C3=24,D3=28;var y3=48;var I3=1,B3=2,R3=3,b3=4;class s7{constructor(J,q){this.ram_u8=J,this.type=q.getU32(E3),this.codeAddr=q.getU32(w3)&536870911,this.codeSize=this.clampCodeSize(q.getU32(k3)),this.codeDataAddr=q.getU32(C3)&536870911,this.codeDataSize=q.getU32(D3),this.dataPtr=q.getU32(y3)}dumpCode(){const J=n64js.hardware().cachedMemDevice.mem,Q=ZQ(J,4224,this.codeAddr,this.codeSize);let Y=`${this.detectVersionString()}\n`;for(let Z of Q)Y+=`${B(Z.address,16)} ${Z.disassembly}\n`;Y+="\nDMEM\n",Y+=tK(J,0,this.codeDataAddr,this.codeDataSize),console.log(Y)}loadUcode(J,q,Q,Y){this.codeAddr=J&536870911,this.codeSize=this.clampCodeSize(q),this.codeDataAddr=Q&536870911,this.codeDataSize=Y}clampCodeSize(J){if(J==0||J>4096)return 4096;return J}dataByte(J){return this.ram_u8[this.codeDataAddr+J]}codeByte(J){return this.ram_u8[this.codeAddr+J]}detectVersionString(){const J="R".charCodeAt(0),q="S".charCodeAt(0),Q="P".charCodeAt(0);for(let Y=0;Y+2=32)Z+=String.fromCharCode(X)}return Z}return""}computeMicrocodeHash(){let J=0;for(let q=0;q>>0;return J}}var T3=!0,PZ=0,LZ=4,VZ=8,UZ=12,RJ=16,t7=20,e7=24,J5=28,_3=4294967288,S3=4294967288,q5=4287627256,Q5=4287627256,Y5=4096,Z5=4293918720,K5=20,x8=1044480,X5=12,p8=4095,m8=0,MZ=1,OZ=2,W5=4,AZ=8,hZ=16,$5=32,z5=64,H5=128,F5=256,j5=512,N5=1024,G5=2048,P5=4096,L5=8192,V5=16384,U5=32768,M5=65536,O5=131072,A5=262144,h5=524288,E5=1048576,w5=2097152,k5=4194304,C5=8388608,D5=16777216,EZ=1,y5=2,I5=4,B5=8;var v3=32,R5=64,f3=128,u3=256,T5=512,g3=1024,x3=2048,p3=4096,m3=8192,n3=16384;var o3=T5,c3=0,l3=4092,d3="SP DMA",b5=1,a3=2;class _5{constructor(J,q,Q,Y){this.isRead=J,this.spMemAddr=q,this.rdRamAddr=Q,this.len=Y}}class wZ extends n{constructor(J,q,Q){super("SPMem",J,J.sp_mem,q,Q);this.pendingSPMemAddr=0,this.pendingDRAMAddr=0}calcEA(J){return(J-this.rangeStart)%8192}write64(J,q){const Q=this.calcWriteEA(J);this.mem.set32(Q,Number(q>>32n))}write16(J,q){const Q=this.calcWriteEA(J),Y=Q&~3,Z=8*(2-(Q&2));this.mem.set32(Y,q< [${N(J)}]`)}}}class CZ extends n{constructor(J,q,Q){super("SPReg",J,J.sp_reg,q,Q);this.dmaQueue=[]}write32(J,q){this.writeReg32(this.calcWriteEA(J),q)}writeReg32(J,q){if(J+4>this.u8.length)throw"Write is out of range";switch(J){case PZ:this.pendingSPMemAddr=q&_3;break;case LZ:this.pendingDRAMAddr=q&S3;break;case VZ:this.mem.set32(J,q&q5),this.pushDMA(b5,q&q5);break;case UZ:this.mem.set32(J,q&Q5),this.pushDMA(a3,q&Q5);break;case RJ:this.spUpdateStatus(q);break;case t7:case e7:break;case J5:this.mem.set32(J,0);break;default:M(`Unhandled write to SPReg: ${N(q)} -> [${N(J)}]`),this.mem.set32(J,q)}}readU32(J){return this.logRead(J),this.readRegU32(this.calcReadEA(J))}readS32(J){return this.logRead(J),this.readRegU32(this.calcReadEA(J))>>0}readRegU32(J){if(J+4>this.u8.length)throw"Read is out of range";const q=this.mem.getU32(J);if(J==J5)this.mem.set32(J,1);return q}setStatusBits(J){if(this.mem.setBits32(RJ,J)&R5)this.hardware.miRegDevice.interruptSP()}spUpdateStatus(J){if(!this.quiet){if(J&MZ)M("SP: Clearing Halt");if(J&OZ)M("SP: Setting Halt");if(J&W5)M("SP: Clearing Broke");if(J&AZ)M("SP: Clearing Interrupt");if(J&hZ)M("SP: Setting Interrupt");if(J&$5)M("SP: Clearing Single Step");if(J&z5)M("SP: Setting Single Step");if(J&H5)M("SP: Clearing Interrupt on break");if(J&F5)M("SP: Setting Interrupt on break");if(J&j5)M("SP: Clearing Sig0 (Yield)");if(J&N5)M("SP: Setting Sig0 (Yield)");if(J&G5)M("SP: Clearing Sig1 (Yielded)");if(J&P5)M("SP: Setting Sig1 (Yielded)");if(J&L5)M("SP: Clearing Sig2 (TaskDone)");if(J&V5)M("SP: Setting Sig2 (TaskDone)");if(J&U5)M("SP: Clearing Sig3");if(J&M5)M("SP: Setting Sig3");if(J&O5)M("SP: Clearing Sig4");if(J&A5)M("SP: Setting Sig4");if(J&h5)M("SP: Clearing Sig5");if(J&E5)M("SP: Setting Sig5");if(J&w5)M("SP: Clearing Sig6");if(J&k5)M("SP: Setting Sig6");if(J&C5)M("SP: Clearing Sig7");if(J&D5)M("SP: Setting Sig7")}function q(K,X,W,z,F){const j=X&z,G=X&W;if(j&&!G)return K|F;else if(G&&!j)return K&~F;return K}let Q=this.mem.getU32(RJ),Y=!1,Z=!1;if(J&OZ&&J&MZ);else if(J&OZ)Q|=EZ,Z=!0;else if(J&MZ)Q&=~EZ,Y=!0;if(J&hZ&&J&AZ);else if(J&hZ)this.hardware.mi_reg.setBits32(W0,v8),n64js.cpu0.updateCause3();else if(J&AZ)this.hardware.mi_reg.clearBits32(W0,v8),n64js.cpu0.updateCause3();if(Q=q(Q,J,W5,0,y5),Q=q(Q,J,$5,z5,v3),Q=q(Q,J,H5,F5,R5),Q=q(Q,J,j5,N5,f3),Q=q(Q,J,G5,P5,u3),Q=q(Q,J,L5,V5,T5),Q=q(Q,J,U5,M5,g3),Q=q(Q,J,O5,A5,x3),Q=q(Q,J,h5,E5,p3),Q=q(Q,J,w5,k5,m3),Q=q(Q,J,C5,D5,n3),this.mem.set32(RJ,Q),Y)if(i7()||!T3)this.hardware.spRegDevice.setStatusBits(o3|y5|EZ);else H.unhalt();else if(Z)H.halt(0)}pushDMA(J,q){if(this.dmaQueue.length>=2){n64js.warn("RSP DMA FIFO is full");return}const Q=J==b5,Y=new _5(Q,this.pendingSPMemAddr,this.pendingDRAMAddr,q);if(this.dmaQueue.push(Y),this.setDMAStatus(),this.dmaQueue.length==1)this.startDMA(Y)}startDMA(J){if(J.isRead)this.spCopyFromRDRAM(J.spMemAddr,J.rdRamAddr,J.len);else this.spCopyToRDRAM(J.spMemAddr,J.rdRamAddr,J.len)}dmaComplete(){if(this.dmaQueue.shift(),this.dmaQueue.length>0)this.startDMA(this.dmaQueue[0]);this.setDMAStatus()}setDMAStatus(){const J=this.dmaQueue.length>=2?B5:0,q=this.dmaQueue.length>=1?I5:0;this.mem.set32(t7,J?1:0),this.mem.set32(e7,q?1:0),this.mem.set32masked(RJ,J|q,B5|I5)}spCopyFromRDRAM(J,q,Q){const Y=J&8191,Z=q&16777215,K=((Q&p8)>>>m8|7)+1,X=((Q&x8)>>>X5)+1,W=(Q&Z5)>>>K5,z=Y&Y5;if(!this.quiet)M(`SP: copying ${K} bytes from ram ${N(Z)} to sp ${r(Y)}, count ${X}, skip ${W}`);let F=Y,j=Z;for(let P=0;P>>m8|7)+1,X=((Q&x8)>>>X5)+1,W=(Q&Z5)>>>K5,z=Y&Y5;if(!this.quiet)M(`SP: copying ${K} bytes from sp ${r(Y)} to ram ${N(Z)}, count ${X}, skip ${W}`);let F=Z,j=Y;for(let P=0;P>>3;if(Y)return Y;return 16}addSPDMAEvent(J){const q=this;n64js.cpu0.addEvent(d3,J,()=>{q.dmaComplete()})}}var WM=function(J){switch(J){case X8:return KM;case qJ:return x5;case ZK:return XM}return x5},$M=function(J){return J==X8?50:60},S5=0,v5=4,f5=8,DZ=12,yZ=16,r3=20,vq=24,s3=28,i3=32,t3=36,e3=40,JM=44,qM=48,QM=52,u5=2,g5=3;var YM=64;var ZM=3,KM=49656530,x5=48681812,XM=48628316,IZ="VI Interrupt";class BZ extends n{constructor(J,q,Q){super("VIReg",J,J.vi_reg,q,Q);this.field=0,this.videoClock=0,this.refreshRate=0,this.countPerScanline=0,this.countPerVbl=0,this.reset()}reset(){const J=this.hardware.rominfo.tvType==qJ;this.videoClock=WM(J),this.refreshRate=$M(J),this.countPerScanline=0,this.countPerVbl=0,this.screenWidth=640,this.screenHeight=J?480:576,this.hScanMin=J?108:128,this.hScanMax=this.hScanMin+this.screenWidth,this.vScanMin=J?34:44,this.vScanMax=this.vScanMin+this.screenHeight,this.dims=new p5(this.screenWidth,this.screenHeight)}get controlReg(){return this.mem.getU32(S5)}get dramAddrReg(){return this.mem.getU32(v5)}get hWidthReg(){return this.mem.getU32(f5)}get vIntrReg(){return this.mem.getU32(DZ)}get vCurrentLineReg(){return this.mem.getU32(yZ)}get timingReg(){return this.mem.getU32(r3)}get vSyncReg(){return this.mem.getU32(vq)}get hSyncReg(){return this.mem.getU32(s3)}get hSyncLeapReg(){return this.mem.getU32(i3)}get hVideoReg(){return this.mem.getU32(t3)}get vVideoReg(){return this.mem.getU32(e3)}get vBurstReg(){return this.mem.getU32(JM)}get xScaleReg(){return this.mem.getU32(qM)}get yScaleReg(){return this.mem.getU32(QM)}get interlaced(){return(this.controlReg&YM)!=0}get modeType(){return this.controlReg&ZM}get is32BitMode(){return this.modeType==g5}get is16BitMode(){return this.modeType==u5}get xScale(){return(this.xScaleReg&4095)/1024}get yScale(){return(this.yScaleReg&4095)/1024}get bitDepth(){switch(this.modeType){case g5:return 32;case u5:return 16}return 0}dump(){console.log(`VI_CONTROL = ${N(this.controlReg)}`),console.log(`VI_DRAM_ADDR = ${N(this.dramAddrReg)}`),console.log(`VI_H_WIDTH = ${N(this.hWidthReg)}`),console.log(`VI_V_INTR = ${N(this.vIntrReg)}`),console.log(`VI_V_CURRENT_LINE = ${N(this.vCurrentLineReg)}`),console.log(`VI_TIMING = ${N(this.timingReg)}`),console.log(`VI_V_SYNC = ${N(this.vSyncReg)}`),console.log(`VI_H_SYNC = ${N(this.hSyncReg)}`),console.log(`VI_H_SYNC_LEAP = ${N(this.hSyncLeapReg)}`),console.log(`VI_H_VIDEO = ${N(this.hVideoReg)}`),console.log(`VI_V_VIDEO = ${N(this.vVideoReg)}`),console.log(`VI_V_BURST = ${N(this.vBurstReg)}`),console.log(`VI_X_SCALE = ${N(this.xScaleReg)} = ${this.xScale}`),console.log(`VI_Y_SCALE = ${N(this.yScaleReg)} = ${this.yScale}`)}verticalBlank(){this.hardware.verticalBlank(),this.field^=this.interlaced?1:0,this.addInterruptEvent(),this.hardware.mi_reg.setBits32(W0,DJ),n64js.cpu0.updateCause3(),x9(),n64js.returnControlToSystem()}initInterrupt(){if(n64js.cpu0.hasEvent(IZ))return;const J=this.mem.getU32(DZ),q=this.mem.getU32(vq);if(J>=q){M(`not setting VI interrupt - intr ${J} >= sync ${q}`);return}this.addInterruptEvent()}addInterruptEvent(){n64js.cpu0.addEvent(IZ,this.countPerVbl,()=>{this.verticalBlank()})}getVblCount(){const J=n64js.cpu0.getCyclesUntilEvent(IZ);return J>=0?J:0}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";switch(Q){case v5:this.mem.set32(Q,q);break;case S5:if(!this.quiet)M(`VI control set to: ${N(q)}`);this.mem.set32(Q,q);break;case f5:if(!this.quiet)M(`VI width set to: ${q}`);this.mem.set32(Q,q);break;case DZ:if(!this.quiet)M(`VI intr set to: ${q}`);this.mem.set32(Q,q),this.initInterrupt();break;case yZ:if(!this.quiet)M(`VI current set to: ${N(q)}`);if(!this.quiet)M("VI interrupt cleared");this.hardware.mi_reg.clearBits32(W0,DJ),n64js.cpu0.updateCause3();break;case vq:if(this.mem.getU32(Q)!=q){const Z=q+1;this.countPerScanline=this.hardware.systemFrequency/this.refreshRate/Z>>0,this.countPerVbl=Z*this.countPerScanline,M(`VI_V_SYNC_REG set to ${q}, cycles per scanline = ${this.countPerScanline}, cycles per vbl = ${this.countPerVbl}`),this.mem.set32(Q,q),this.initInterrupt()}break;default:this.mem.set32(Q,q);break}}readS32(J){this.logRead(J);const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";if(q===yZ){const Q=this.getVblCount(),Z=(this.countPerVbl-Q)/this.countPerScanline>>0,K=this.mem.getU32(vq);let X=Z;if(X>=K)X-=K;X=X&~1|this.field,this.mem.set32(q,X)}return this.mem.getS32(q)}readU32(J){return this.readS32(J)>>>0}computeDimensions(){if(this.modeType==0)return M("mode type is 0 - not rendering"),null;const J=this.hVideoReg,q=J>>16&1023,Q=J&1023;let Y=Math.max(q,this.hScanMin),Z=Math.min(Q,this.hScanMax);const K=this.vVideoReg,X=K>>16&1023,W=K&1023;let z=Math.max(X,this.vScanMin),F=W=this.hScanMin)Y+=8;if(Z>16&4095,j.ySubpixel=this.yScaleReg>>16&4095,j.xScale=this.xScaleReg&4095,j.yScale=this.yScaleReg&4095,j.sx0=Y-q,j.sy0=z-X,j.dx0=Y-this.hScanMin,j.dy0=z-this.vScanMin,j.dstWidth=Z-Y,j.dstHeight=F-z,j.srcPitch=this.hWidthReg;const G=(j.sx0+j.dstWidth)*j.xScale>>10,P=(j.sy0+j.dstHeight)*j.yScale>>11,L=j.srcPitch>768||j.srcPitch>=G*2?2:1;return j.srcWidth=G,j.srcHeight=P*L,j}renderBackBuffer(){const J=this.computeDimensions();if(!J)return null;const q=this.dramAddrReg&16777214;if(!q)return null;const Q=this.hardware.cachedMemDevice.mem.dataView;if(this.is32BitMode)return J.renderBackBuffer32(Q,q);if(this.is16BitMode)return J.renderBackBuffer16(Q,q);return null}}class p5{constructor(J,q){this.screenWidth=640,this.screenHeight=480,this.pixels32bpp=new Uint8Array(J*q*4),this.pixels16bpp=new Uint16Array(J*q),this.interlaced=!1,this.field=0,this.dstWidth=640,this.dstHeight=480,this.srcPitch=320,this.srcWidth=320,this.srcHeight=240,this.xSubpixel=0,this.ySubpixel=0,this.xScale=512,this.yScale=1024,this.sx0=0,this.sy0=0,this.dx0=0,this.dy0=0}renderBackBuffer32(J,q){const Q=this.pixels32bpp,Y=-this.screenWidth;let Z=(this.screenHeight-1-this.dy0)*this.screenWidth;const K=255;let X=this.sy0*this.yScale+this.ySubpixel;for(let W=0;W>>11)*this.srcPitch*4;let F=Z+this.dx0,j=this.sx0*this.xScale+this.xSubpixel;for(let G=0;G>>10)*4,!1);Q[F*4+0]=P>>>24,Q[F*4+1]=P>>>16,Q[F*4+2]=P>>>8,Q[F*4+3]=K,F++,j+=this.xScale}}X+=this.yScale,Z+=Y}return Q}renderBackBuffer16(J,q){const Q=this.pixels16bpp,Y=-this.screenWidth;let Z=(this.screenHeight-1-this.dy0)*this.screenWidth;const K=1;let X=this.sy0*this.yScale+this.ySubpixel;for(let W=0;W>>11)*this.srcPitch*2;let F=Z+this.dx0,j=this.sx0*this.xScale+this.xSubpixel;for(let G=0;G>>10)*2,!1)|K,j+=this.xScale}X+=this.yScale,Z+=Y}return Q}}class RZ{constructor(J){this.map=this.createMemMap(J)}createMemMap(J){const q=[];for(let Q=0;Q<16384;++Q)q.push(void 0);if(J.map((Q)=>{const Y=Q.rangeStart>>>18,Z=Q.rangeEnd-1>>>18;for(let K=Y;K<=Z;++K)q[K]=Q}),q.length!==16384)throw"initialisation error";return q}getMemoryHandler(J){var q=this.map[J>>>18];if(q)return q;throw M(`accessing unhandled location ${N(J)}`),`unhandled access ${N(J)}`}readMemoryInternal32(J){const q=this.map[J>>>18];if(q)return q.readInternal32(J);return 3722304989}writeMemoryInternal32(J,q){const Q=this.map[J>>>18];if(Q)Q.writeInternal32(J,q)}}var S0=function(J){return new k6(new ArrayBuffer(J))},bZ=64,zM=4096,HM=93750000;class bJ{constructor(){this.data=new Uint8Array(32768),this.dirty=!1}init(J){this.dirty=!1;for(let q=0;qJSON.stringify(J,FM),m5=(J)=>JSON.parse(J,jM);var n5=function(J){return J>>24&255|J>>8&65280|J<<8&16711680|J<<24&4278190080};function o5(J,q){return B(n5(J),32)+B(n5(q),32)}function c5(J){let q=0;for(let Q=0;Q<4032;Q++)q=q+J[64+Q];switch(q){case 211495:return"6101";case 213534:return"6101";case 213060:return"6102";case 219088:return"6103";case 293505:return"6105";case 225740:return"6106";case 213961:return"6106";default:return M("Unknown CIC Code "+N(q)),"6102"}}function l5(J,q,Q){let Y="";for(let Z=0;Z{J.redraw()}),J.redraw()}triggerLoad(){const J=document.getElementById("fileInput");J.value="",J.click()}loadFile(){const J=document.getElementById("fileInput");if(J&&J.files.length>0){const q=J.files[0],Q=new FileReader;Q.onerror=(Y)=>{this.displayError("loading file")},Q.onload=(Y)=>{n64js.loadRomAndStartRunning(Y.target.result)},Q.readAsArrayBuffer(q)}}displayWarning(J){this.displayAlert("Warning",J)}displayError(J){this.displayAlert("Error",J)}displayAlert(J,q){const Y=document.getElementById("alert").content.cloneNode(!0),Z=Y.querySelector(".alert-type"),K=Y.querySelector(".alert-message");Z.textContent=J+"!",K.textContent=q,$("#alerts").append(Y)}setRunning(J){const q=J?' Pause':' Run';$("#runbutton").html(q)}}var gZ=function(J){n8=J,uZ.setRunning(J)},LM=function(J){const q=md5(J);M(`hash is ${q}`)},VM=function(J){C7(J),LM(J);const q=n0.createROM(J),Q={header:q.getU32(0),clock:q.getU32(4),bootAddress:q.getU32(8),release:q.getU32(12),crclo:q.getU32(16),crchi:q.getU32(20),unk0:q.getU32(24),unk1:q.getU32(28),name:l5(q.u8,32,20),unk2:q.getU32(52),unk3:q.getU16(56),unk4:q.getU8(58),categoryCode:WK(q.getU8(59)),cartId:q.getU16(60),countryId:q.getU8(62),romVersion:q.getU8(63)};console.log(Q);const Y=$('
${Z.join("")}
${W.join("")}
'),Z=Y.find("tbody");for(let X in Q){const W=typeof Q[X]==="string"?Q[X]:N(Q[X]);Z.append(`${X}${W}`)}jK(Y),A0.cic=c5(q.u8),A0.id=o5(Q.crclo,Q.crchi),A0.country=Q.countryId,A0.tvType=XK(Q.countryId);const K=d5[A0.id];if(K)M(`Loaded info for ${A0.id} from db`),A0.name=K.name,A0.save=K.save;else M(`No info for ${A0.id} in db`),A0.name=Q.name,A0.save="Eeprom4k";M(`rominfo is ${_Z(A0)}`),$("#title").text(`n64js - ${A0.name}`)},UM=function(){const J=[],q=new XMLHttpRequest;if(q.open("GET","roms/n64-systemtest-all.z64",!0),q.responseType="arraybuffer",q.onload=(Q)=>{const Y=q.response;if(Y)n64js.loadRomAndStartRunning(Y)},q.send(null),q.status!=200)return;for(let Q=0;Q0)n64js.cpu0.run(J),Y8.redraw()}else if(MW())requestAnimationFrame(fZ),hW(),x9();if(Q6)Q6.end()},xZ=function(J){return(J>>26&63)===a5},i5=function(J){return J+"-"+A0.id},OM=function(J){const q=A0.name?`n64js - ${A0.name} - ${J}mspf`:`n64js - ${J}mspf`;$("#title").text(q)},e5=function(J,q){if(gZ(!1),pZ(),M(''+J+""),q)n64js.ui().displayError(J)},pZ=function(){n64js.cpu0.breakExecution()};window.n64js=window.n64js||{};var a5=28,GM=1e8,Q6=null,n8=!1,TJ=new Map,r5=[],s5={runTest:UM,recordTimeline:MM};g0.add(s5,"runTest").name("Run n64-systemtest");g0.add(s5,"recordTimeline").name("Record Timeline");var A0={id:"",name:"",cic:"6101",country:KK,tvType:qJ,save:"Eeprom4k"},n0=new TZ(A0),vZ=new sq,PM=new tq(n0,vZ.inputs),uZ=new SZ,Y8=null;n64js.hardware=()=>n0;n64js.joybus=()=>PM;n64js.ui=()=>uZ;n64js.debugger=()=>Y8;n64js.loadRomAndStartRunning=(J)=>{VM(J),n64js.reset(),Y8.redraw(),gZ(!1),n64js.toggleRun()};n64js.toggleRun=()=>{if(gZ(!n8),n8)fZ()};n64js.toggleFullscreen=()=>{document.getElementById("display").requestFullscreen().catch((q)=>{console.log(`Error attempting to enable fullscreen mode: ${q.message} (${q.name})`)})};n64js.breakEmulationForDisplayListDebug=()=>{if(n8)n64js.toggleRun(),pZ()};n64js.step=()=>{if(!n8)n64js.singleStep(),Y8.redraw()};n64js.getInstruction=(J)=>{const q=n0.memMap.readMemoryInternal32(J);if(xZ(q))return TJ[J]||0;return q};n64js.isBreakpoint=(J)=>{const q=n0.memMap.readMemoryInternal32(J);return xZ(q)};n64js.toggleBreakpoint=(J)=>{const q=n0.memMap.readMemoryInternal32(J);let Q;if(xZ(q))Q=TJ[J]||0,delete TJ[J];else Q=a5<<26,TJ[J]=q;n0.memMap.writeMemoryInternal32(J,Q)};n64js.getLocalStorageItem=(J)=>{const q=i5(J),Q=localStorage.getItem(q);return Q?m5(Q):void 0};n64js.setLocalStorageItem=(J,q)=>{const Q=i5(J),Y=_Z(q);localStorage.setItem(Q,Y)};var t5,fq;n64js.emitRunningTime=(J)=>{const Y=((new Date()).getTime()-t5.getTime()).toString();n64js.ui().displayWarning(`Time to ${J} ${Y}`)};n64js.onPresent=()=>{const J=new Date;if(fq){const q=J.getTime()-fq.getTime();OM(q)}fq=J};n64js.addResetCallback=(J)=>{r5.push(J)};n64js.reset=()=>{TJ.clear(),GK(),n0.reset(),$7(n0),p$(n0),UW(),n0.loadROM(),$K(n64js.cpu0,n0,A0),t5=new Date,fq=void 0;for(let J of r5)J()};n64js.check=(J,q)=>{if(!J)M(q)};n64js.warn=(J)=>{FK(J)};n64js.stopForBreakpoint=()=>{e5("Breakpoint",!1)};n64js.halt=(J)=>{e5(J,!0)};n64js.returnControlToSystem=()=>{pZ()};n64js.init=()=>{n64js.reset(),Y8=new mY,VW($("#display"));const J=document.querySelector("body");J.addEventListener("keyup",(q)=>{vZ.handleKey(0,q.key,!1)}),J.addEventListener("keydown",(q)=>{vZ.handleKey(0,q.key,!0)}),uZ.domLoaded()};n64js.togglePerformance=()=>{const J=document.getElementById("performance");if(Q6)J.removeChild(Q6.dom),Q6=null;else Q6=new Stats,Q6.showPanel(1),Q6.dom.style.position="relative",J.appendChild(Q6.dom)};