Repository navigation
Expand file tree
/
Copy pathjsnes.min.js
More file actions
2 lines (2 loc) · 122 KB
/
Copy pathjsnes.min.js
File metadata and controls
2 lines (2 loc) · 122 KB
1
2
!function(t,s){"object"==typeof exports&&"object"==typeof module?module.exports=s():"function"==typeof define&&define.amd?define("jsnes",[],s):"object"==typeof exports?exports.jsnes=s():t.jsnes=s()}(globalThis,()=>(()=>{"use strict";var t={d:(s,e)=>{for(var i in e)t.o(e,i)&&!t.o(s,i)&&Object.defineProperty(s,i,{enumerable:!0,get:e[i]})},o:(t,s)=>Object.prototype.hasOwnProperty.call(t,s),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},s={};function e(t,s,e,i,h){for(let r=0;r<h;++r)e[i+r]=t[s+r]}function i(t,s){const e=t.constructor.JSON_PROPERTIES;for(let i=0;i<e.length;i++){const h=e[i],r=t[h],a=s[h];ArrayBuffer.isView(r)&&Array.isArray(a)?r.set(a):t[h]=a}}function h(t){const s={},e=t.constructor.JSON_PROPERTIES;for(let i=0;i<e.length;i++){const h=e[i],r=t[h];s[h]=ArrayBuffer.isView(r)?Array.from(r):r}return s}t.r(s),t.d(s,{Browser:()=>lt,Controller:()=>o,GameGenie:()=>E,NES:()=>j});class r{constructor(){this.opdata=new Array(256);for(let t=0;t<256;t++)this.opdata[t]=255;this.setOp(this.INS_ADC,105,this.ADDR_IMM,2,2),this.setOp(this.INS_ADC,101,this.ADDR_ZP,2,3),this.setOp(this.INS_ADC,117,this.ADDR_ZPX,2,4),this.setOp(this.INS_ADC,109,this.ADDR_ABS,3,4),this.setOp(this.INS_ADC,125,this.ADDR_ABSX,3,4),this.setOp(this.INS_ADC,121,this.ADDR_ABSY,3,4),this.setOp(this.INS_ADC,97,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_ADC,113,this.ADDR_POSTIDXIND,2,5),this.setOp(this.INS_AND,41,this.ADDR_IMM,2,2),this.setOp(this.INS_AND,37,this.ADDR_ZP,2,3),this.setOp(this.INS_AND,53,this.ADDR_ZPX,2,4),this.setOp(this.INS_AND,45,this.ADDR_ABS,3,4),this.setOp(this.INS_AND,61,this.ADDR_ABSX,3,4),this.setOp(this.INS_AND,57,this.ADDR_ABSY,3,4),this.setOp(this.INS_AND,33,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_AND,49,this.ADDR_POSTIDXIND,2,5),this.setOp(this.INS_ASL,10,this.ADDR_ACC,1,2),this.setOp(this.INS_ASL,6,this.ADDR_ZP,2,5),this.setOp(this.INS_ASL,22,this.ADDR_ZPX,2,6),this.setOp(this.INS_ASL,14,this.ADDR_ABS,3,6),this.setOp(this.INS_ASL,30,this.ADDR_ABSX,3,7),this.setOp(this.INS_BCC,144,this.ADDR_REL,2,2),this.setOp(this.INS_BCS,176,this.ADDR_REL,2,2),this.setOp(this.INS_BEQ,240,this.ADDR_REL,2,2),this.setOp(this.INS_BIT,36,this.ADDR_ZP,2,3),this.setOp(this.INS_BIT,44,this.ADDR_ABS,3,4),this.setOp(this.INS_BMI,48,this.ADDR_REL,2,2),this.setOp(this.INS_BNE,208,this.ADDR_REL,2,2),this.setOp(this.INS_BPL,16,this.ADDR_REL,2,2),this.setOp(this.INS_BRK,0,this.ADDR_IMP,1,7),this.setOp(this.INS_BVC,80,this.ADDR_REL,2,2),this.setOp(this.INS_BVS,112,this.ADDR_REL,2,2),this.setOp(this.INS_CLC,24,this.ADDR_IMP,1,2),this.setOp(this.INS_CLD,216,this.ADDR_IMP,1,2),this.setOp(this.INS_CLI,88,this.ADDR_IMP,1,2),this.setOp(this.INS_CLV,184,this.ADDR_IMP,1,2),this.setOp(this.INS_CMP,201,this.ADDR_IMM,2,2),this.setOp(this.INS_CMP,197,this.ADDR_ZP,2,3),this.setOp(this.INS_CMP,213,this.ADDR_ZPX,2,4),this.setOp(this.INS_CMP,205,this.ADDR_ABS,3,4),this.setOp(this.INS_CMP,221,this.ADDR_ABSX,3,4),this.setOp(this.INS_CMP,217,this.ADDR_ABSY,3,4),this.setOp(this.INS_CMP,193,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_CMP,209,this.ADDR_POSTIDXIND,2,5),this.setOp(this.INS_CPX,224,this.ADDR_IMM,2,2),this.setOp(this.INS_CPX,228,this.ADDR_ZP,2,3),this.setOp(this.INS_CPX,236,this.ADDR_ABS,3,4),this.setOp(this.INS_CPY,192,this.ADDR_IMM,2,2),this.setOp(this.INS_CPY,196,this.ADDR_ZP,2,3),this.setOp(this.INS_CPY,204,this.ADDR_ABS,3,4),this.setOp(this.INS_DEC,198,this.ADDR_ZP,2,5),this.setOp(this.INS_DEC,214,this.ADDR_ZPX,2,6),this.setOp(this.INS_DEC,206,this.ADDR_ABS,3,6),this.setOp(this.INS_DEC,222,this.ADDR_ABSX,3,7),this.setOp(this.INS_DEX,202,this.ADDR_IMP,1,2),this.setOp(this.INS_DEY,136,this.ADDR_IMP,1,2),this.setOp(this.INS_EOR,73,this.ADDR_IMM,2,2),this.setOp(this.INS_EOR,69,this.ADDR_ZP,2,3),this.setOp(this.INS_EOR,85,this.ADDR_ZPX,2,4),this.setOp(this.INS_EOR,77,this.ADDR_ABS,3,4),this.setOp(this.INS_EOR,93,this.ADDR_ABSX,3,4),this.setOp(this.INS_EOR,89,this.ADDR_ABSY,3,4),this.setOp(this.INS_EOR,65,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_EOR,81,this.ADDR_POSTIDXIND,2,5),this.setOp(this.INS_INC,230,this.ADDR_ZP,2,5),this.setOp(this.INS_INC,246,this.ADDR_ZPX,2,6),this.setOp(this.INS_INC,238,this.ADDR_ABS,3,6),this.setOp(this.INS_INC,254,this.ADDR_ABSX,3,7),this.setOp(this.INS_INX,232,this.ADDR_IMP,1,2),this.setOp(this.INS_INY,200,this.ADDR_IMP,1,2),this.setOp(this.INS_JMP,76,this.ADDR_ABS,3,3),this.setOp(this.INS_JMP,108,this.ADDR_INDABS,3,5),this.setOp(this.INS_JSR,32,this.ADDR_ABS,3,6),this.setOp(this.INS_LDA,169,this.ADDR_IMM,2,2),this.setOp(this.INS_LDA,165,this.ADDR_ZP,2,3),this.setOp(this.INS_LDA,181,this.ADDR_ZPX,2,4),this.setOp(this.INS_LDA,173,this.ADDR_ABS,3,4),this.setOp(this.INS_LDA,189,this.ADDR_ABSX,3,4),this.setOp(this.INS_LDA,185,this.ADDR_ABSY,3,4),this.setOp(this.INS_LDA,161,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_LDA,177,this.ADDR_POSTIDXIND,2,5),this.setOp(this.INS_LDX,162,this.ADDR_IMM,2,2),this.setOp(this.INS_LDX,166,this.ADDR_ZP,2,3),this.setOp(this.INS_LDX,182,this.ADDR_ZPY,2,4),this.setOp(this.INS_LDX,174,this.ADDR_ABS,3,4),this.setOp(this.INS_LDX,190,this.ADDR_ABSY,3,4),this.setOp(this.INS_LDY,160,this.ADDR_IMM,2,2),this.setOp(this.INS_LDY,164,this.ADDR_ZP,2,3),this.setOp(this.INS_LDY,180,this.ADDR_ZPX,2,4),this.setOp(this.INS_LDY,172,this.ADDR_ABS,3,4),this.setOp(this.INS_LDY,188,this.ADDR_ABSX,3,4),this.setOp(this.INS_LSR,74,this.ADDR_ACC,1,2),this.setOp(this.INS_LSR,70,this.ADDR_ZP,2,5),this.setOp(this.INS_LSR,86,this.ADDR_ZPX,2,6),this.setOp(this.INS_LSR,78,this.ADDR_ABS,3,6),this.setOp(this.INS_LSR,94,this.ADDR_ABSX,3,7),this.setOp(this.INS_NOP,26,this.ADDR_IMP,1,2),this.setOp(this.INS_NOP,58,this.ADDR_IMP,1,2),this.setOp(this.INS_NOP,90,this.ADDR_IMP,1,2),this.setOp(this.INS_NOP,122,this.ADDR_IMP,1,2),this.setOp(this.INS_NOP,218,this.ADDR_IMP,1,2),this.setOp(this.INS_NOP,234,this.ADDR_IMP,1,2),this.setOp(this.INS_NOP,250,this.ADDR_IMP,1,2),this.setOp(this.INS_ORA,9,this.ADDR_IMM,2,2),this.setOp(this.INS_ORA,5,this.ADDR_ZP,2,3),this.setOp(this.INS_ORA,21,this.ADDR_ZPX,2,4),this.setOp(this.INS_ORA,13,this.ADDR_ABS,3,4),this.setOp(this.INS_ORA,29,this.ADDR_ABSX,3,4),this.setOp(this.INS_ORA,25,this.ADDR_ABSY,3,4),this.setOp(this.INS_ORA,1,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_ORA,17,this.ADDR_POSTIDXIND,2,5),this.setOp(this.INS_PHA,72,this.ADDR_IMP,1,3),this.setOp(this.INS_PHP,8,this.ADDR_IMP,1,3),this.setOp(this.INS_PLA,104,this.ADDR_IMP,1,4),this.setOp(this.INS_PLP,40,this.ADDR_IMP,1,4),this.setOp(this.INS_ROL,42,this.ADDR_ACC,1,2),this.setOp(this.INS_ROL,38,this.ADDR_ZP,2,5),this.setOp(this.INS_ROL,54,this.ADDR_ZPX,2,6),this.setOp(this.INS_ROL,46,this.ADDR_ABS,3,6),this.setOp(this.INS_ROL,62,this.ADDR_ABSX,3,7),this.setOp(this.INS_ROR,106,this.ADDR_ACC,1,2),this.setOp(this.INS_ROR,102,this.ADDR_ZP,2,5),this.setOp(this.INS_ROR,118,this.ADDR_ZPX,2,6),this.setOp(this.INS_ROR,110,this.ADDR_ABS,3,6),this.setOp(this.INS_ROR,126,this.ADDR_ABSX,3,7),this.setOp(this.INS_RTI,64,this.ADDR_IMP,1,6),this.setOp(this.INS_RTS,96,this.ADDR_IMP,1,6),this.setOp(this.INS_SBC,233,this.ADDR_IMM,2,2),this.setOp(this.INS_SBC,235,this.ADDR_IMM,2,2),this.setOp(this.INS_SBC,229,this.ADDR_ZP,2,3),this.setOp(this.INS_SBC,245,this.ADDR_ZPX,2,4),this.setOp(this.INS_SBC,237,this.ADDR_ABS,3,4),this.setOp(this.INS_SBC,253,this.ADDR_ABSX,3,4),this.setOp(this.INS_SBC,249,this.ADDR_ABSY,3,4),this.setOp(this.INS_SBC,225,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_SBC,241,this.ADDR_POSTIDXIND,2,5),this.setOp(this.INS_SEC,56,this.ADDR_IMP,1,2),this.setOp(this.INS_SED,248,this.ADDR_IMP,1,2),this.setOp(this.INS_SEI,120,this.ADDR_IMP,1,2),this.setOp(this.INS_STA,133,this.ADDR_ZP,2,3),this.setOp(this.INS_STA,149,this.ADDR_ZPX,2,4),this.setOp(this.INS_STA,141,this.ADDR_ABS,3,4),this.setOp(this.INS_STA,157,this.ADDR_ABSX,3,5),this.setOp(this.INS_STA,153,this.ADDR_ABSY,3,5),this.setOp(this.INS_STA,129,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_STA,145,this.ADDR_POSTIDXIND,2,6),this.setOp(this.INS_STX,134,this.ADDR_ZP,2,3),this.setOp(this.INS_STX,150,this.ADDR_ZPY,2,4),this.setOp(this.INS_STX,142,this.ADDR_ABS,3,4),this.setOp(this.INS_STY,132,this.ADDR_ZP,2,3),this.setOp(this.INS_STY,148,this.ADDR_ZPX,2,4),this.setOp(this.INS_STY,140,this.ADDR_ABS,3,4),this.setOp(this.INS_TAX,170,this.ADDR_IMP,1,2),this.setOp(this.INS_TAY,168,this.ADDR_IMP,1,2),this.setOp(this.INS_TSX,186,this.ADDR_IMP,1,2),this.setOp(this.INS_TXA,138,this.ADDR_IMP,1,2),this.setOp(this.INS_TXS,154,this.ADDR_IMP,1,2),this.setOp(this.INS_TYA,152,this.ADDR_IMP,1,2),this.setOp(this.INS_ALR,75,this.ADDR_IMM,2,2),this.setOp(this.INS_ANC,11,this.ADDR_IMM,2,2),this.setOp(this.INS_ANC,43,this.ADDR_IMM,2,2),this.setOp(this.INS_ARR,107,this.ADDR_IMM,2,2),this.setOp(this.INS_AXS,203,this.ADDR_IMM,2,2),this.setOp(this.INS_LAX,163,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_LAX,167,this.ADDR_ZP,2,3),this.setOp(this.INS_LAX,175,this.ADDR_ABS,3,4),this.setOp(this.INS_LAX,179,this.ADDR_POSTIDXIND,2,5),this.setOp(this.INS_LAX,183,this.ADDR_ZPY,2,4),this.setOp(this.INS_LAX,191,this.ADDR_ABSY,3,4),this.setOp(this.INS_SAX,131,this.ADDR_PREIDXIND,2,6),this.setOp(this.INS_SAX,135,this.ADDR_ZP,2,3),this.setOp(this.INS_SAX,143,this.ADDR_ABS,3,4),this.setOp(this.INS_SAX,151,this.ADDR_ZPY,2,4),this.setOp(this.INS_DCP,195,this.ADDR_PREIDXIND,2,8),this.setOp(this.INS_DCP,199,this.ADDR_ZP,2,5),this.setOp(this.INS_DCP,207,this.ADDR_ABS,3,6),this.setOp(this.INS_DCP,211,this.ADDR_POSTIDXIND,2,8),this.setOp(this.INS_DCP,215,this.ADDR_ZPX,2,6),this.setOp(this.INS_DCP,219,this.ADDR_ABSY,3,7),this.setOp(this.INS_DCP,223,this.ADDR_ABSX,3,7),this.setOp(this.INS_ISC,227,this.ADDR_PREIDXIND,2,8),this.setOp(this.INS_ISC,231,this.ADDR_ZP,2,5),this.setOp(this.INS_ISC,239,this.ADDR_ABS,3,6),this.setOp(this.INS_ISC,243,this.ADDR_POSTIDXIND,2,8),this.setOp(this.INS_ISC,247,this.ADDR_ZPX,2,6),this.setOp(this.INS_ISC,251,this.ADDR_ABSY,3,7),this.setOp(this.INS_ISC,255,this.ADDR_ABSX,3,7),this.setOp(this.INS_RLA,35,this.ADDR_PREIDXIND,2,8),this.setOp(this.INS_RLA,39,this.ADDR_ZP,2,5),this.setOp(this.INS_RLA,47,this.ADDR_ABS,3,6),this.setOp(this.INS_RLA,51,this.ADDR_POSTIDXIND,2,8),this.setOp(this.INS_RLA,55,this.ADDR_ZPX,2,6),this.setOp(this.INS_RLA,59,this.ADDR_ABSY,3,7),this.setOp(this.INS_RLA,63,this.ADDR_ABSX,3,7),this.setOp(this.INS_RRA,99,this.ADDR_PREIDXIND,2,8),this.setOp(this.INS_RRA,103,this.ADDR_ZP,2,5),this.setOp(this.INS_RRA,111,this.ADDR_ABS,3,6),this.setOp(this.INS_RRA,115,this.ADDR_POSTIDXIND,2,8),this.setOp(this.INS_RRA,119,this.ADDR_ZPX,2,6),this.setOp(this.INS_RRA,123,this.ADDR_ABSY,3,7),this.setOp(this.INS_RRA,127,this.ADDR_ABSX,3,7),this.setOp(this.INS_SLO,3,this.ADDR_PREIDXIND,2,8),this.setOp(this.INS_SLO,7,this.ADDR_ZP,2,5),this.setOp(this.INS_SLO,15,this.ADDR_ABS,3,6),this.setOp(this.INS_SLO,19,this.ADDR_POSTIDXIND,2,8),this.setOp(this.INS_SLO,23,this.ADDR_ZPX,2,6),this.setOp(this.INS_SLO,27,this.ADDR_ABSY,3,7),this.setOp(this.INS_SLO,31,this.ADDR_ABSX,3,7),this.setOp(this.INS_SRE,67,this.ADDR_PREIDXIND,2,8),this.setOp(this.INS_SRE,71,this.ADDR_ZP,2,5),this.setOp(this.INS_SRE,79,this.ADDR_ABS,3,6),this.setOp(this.INS_SRE,83,this.ADDR_POSTIDXIND,2,8),this.setOp(this.INS_SRE,87,this.ADDR_ZPX,2,6),this.setOp(this.INS_SRE,91,this.ADDR_ABSY,3,7),this.setOp(this.INS_SRE,95,this.ADDR_ABSX,3,7),this.setOp(this.INS_SKB,128,this.ADDR_IMM,2,2),this.setOp(this.INS_SKB,130,this.ADDR_IMM,2,2),this.setOp(this.INS_SKB,137,this.ADDR_IMM,2,2),this.setOp(this.INS_SKB,194,this.ADDR_IMM,2,2),this.setOp(this.INS_SKB,226,this.ADDR_IMM,2,2),this.setOp(this.INS_IGN,12,this.ADDR_ABS,3,4),this.setOp(this.INS_IGN,28,this.ADDR_ABSX,3,4),this.setOp(this.INS_IGN,60,this.ADDR_ABSX,3,4),this.setOp(this.INS_IGN,92,this.ADDR_ABSX,3,4),this.setOp(this.INS_IGN,124,this.ADDR_ABSX,3,4),this.setOp(this.INS_IGN,220,this.ADDR_ABSX,3,4),this.setOp(this.INS_IGN,252,this.ADDR_ABSX,3,4),this.setOp(this.INS_IGN,4,this.ADDR_ZP,2,3),this.setOp(this.INS_IGN,68,this.ADDR_ZP,2,3),this.setOp(this.INS_IGN,100,this.ADDR_ZP,2,3),this.setOp(this.INS_IGN,20,this.ADDR_ZPX,2,4),this.setOp(this.INS_IGN,52,this.ADDR_ZPX,2,4),this.setOp(this.INS_IGN,84,this.ADDR_ZPX,2,4),this.setOp(this.INS_IGN,116,this.ADDR_ZPX,2,4),this.setOp(this.INS_IGN,212,this.ADDR_ZPX,2,4),this.setOp(this.INS_IGN,244,this.ADDR_ZPX,2,4),this.setOp(this.INS_SHA,147,this.ADDR_POSTIDXIND,2,6),this.setOp(this.INS_SHA,159,this.ADDR_ABSY,3,5),this.setOp(this.INS_SHS,155,this.ADDR_ABSY,3,5),this.setOp(this.INS_SHY,156,this.ADDR_ABSX,3,5),this.setOp(this.INS_SHX,158,this.ADDR_ABSY,3,5),this.setOp(this.INS_LAE,187,this.ADDR_ABSY,3,4),this.setOp(this.INS_ANE,139,this.ADDR_IMM,2,2),this.setOp(this.INS_LXA,171,this.ADDR_IMM,2,2),this.cycTable=new Array(7,6,2,8,3,3,5,5,3,2,2,2,4,4,6,6,2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,6,6,2,8,3,3,5,5,4,2,2,2,4,4,6,6,2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,6,6,2,8,3,3,5,5,3,2,2,2,3,4,6,6,2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,6,6,2,8,3,3,5,5,4,2,2,2,5,4,6,6,2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,2,6,2,6,4,4,4,4,2,5,2,5,5,5,5,5,2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,2,5,2,5,4,4,4,4,2,4,2,4,4,4,4,4,2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6,2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,2,6,3,8,3,3,5,5,2,2,2,2,4,4,6,6,2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7),this.instname=new Array(78),this.instname[0]="ADC",this.instname[1]="AND",this.instname[2]="ASL",this.instname[3]="BCC",this.instname[4]="BCS",this.instname[5]="BEQ",this.instname[6]="BIT",this.instname[7]="BMI",this.instname[8]="BNE",this.instname[9]="BPL",this.instname[10]="BRK",this.instname[11]="BVC",this.instname[12]="BVS",this.instname[13]="CLC",this.instname[14]="CLD",this.instname[15]="CLI",this.instname[16]="CLV",this.instname[17]="CMP",this.instname[18]="CPX",this.instname[19]="CPY",this.instname[20]="DEC",this.instname[21]="DEX",this.instname[22]="DEY",this.instname[23]="EOR",this.instname[24]="INC",this.instname[25]="INX",this.instname[26]="INY",this.instname[27]="JMP",this.instname[28]="JSR",this.instname[29]="LDA",this.instname[30]="LDX",this.instname[31]="LDY",this.instname[32]="LSR",this.instname[33]="NOP",this.instname[34]="ORA",this.instname[35]="PHA",this.instname[36]="PHP",this.instname[37]="PLA",this.instname[38]="PLP",this.instname[39]="ROL",this.instname[40]="ROR",this.instname[41]="RTI",this.instname[42]="RTS",this.instname[43]="SBC",this.instname[44]="SEC",this.instname[45]="SED",this.instname[46]="SEI",this.instname[47]="STA",this.instname[48]="STX",this.instname[49]="STY",this.instname[50]="TAX",this.instname[51]="TAY",this.instname[52]="TSX",this.instname[53]="TXA",this.instname[54]="TXS",this.instname[55]="TYA",this.instname[56]="ALR",this.instname[57]="ANC",this.instname[58]="ARR",this.instname[59]="AXS",this.instname[60]="LAX",this.instname[61]="SAX",this.instname[62]="DCP",this.instname[63]="ISC",this.instname[64]="RLA",this.instname[65]="RRA",this.instname[66]="SLO",this.instname[67]="SRE",this.instname[68]="SKB",this.instname[69]="IGN",this.instname[71]="SHA",this.instname[72]="SHS",this.instname[73]="SHY",this.instname[74]="SHX",this.instname[75]="LAE",this.instname[76]="ANE",this.instname[77]="LXA",this.addrDesc=new Array("Zero Page ","Relative ","Implied ","Absolute ","Accumulator ","Immediate ","Zero Page,X ","Zero Page,Y ","Absolute,X ","Absolute,Y ","Preindexed Indirect ","Postindexed Indirect","Indirect Absolute ")}INS_ADC=0;INS_AND=1;INS_ASL=2;INS_BCC=3;INS_BCS=4;INS_BEQ=5;INS_BIT=6;INS_BMI=7;INS_BNE=8;INS_BPL=9;INS_BRK=10;INS_BVC=11;INS_BVS=12;INS_CLC=13;INS_CLD=14;INS_CLI=15;INS_CLV=16;INS_CMP=17;INS_CPX=18;INS_CPY=19;INS_DEC=20;INS_DEX=21;INS_DEY=22;INS_EOR=23;INS_INC=24;INS_INX=25;INS_INY=26;INS_JMP=27;INS_JSR=28;INS_LDA=29;INS_LDX=30;INS_LDY=31;INS_LSR=32;INS_NOP=33;INS_ORA=34;INS_PHA=35;INS_PHP=36;INS_PLA=37;INS_PLP=38;INS_ROL=39;INS_ROR=40;INS_RTI=41;INS_RTS=42;INS_SBC=43;INS_SEC=44;INS_SED=45;INS_SEI=46;INS_STA=47;INS_STX=48;INS_STY=49;INS_TAX=50;INS_TAY=51;INS_TSX=52;INS_TXA=53;INS_TXS=54;INS_TYA=55;INS_ALR=56;INS_ANC=57;INS_ARR=58;INS_AXS=59;INS_LAX=60;INS_SAX=61;INS_DCP=62;INS_ISC=63;INS_RLA=64;INS_RRA=65;INS_SLO=66;INS_SRE=67;INS_SKB=68;INS_IGN=69;INS_DUMMY=70;INS_SHA=71;INS_SHS=72;INS_SHY=73;INS_SHX=74;INS_LAE=75;INS_ANE=76;INS_LXA=77;ADDR_ZP=0;ADDR_REL=1;ADDR_IMP=2;ADDR_ABS=3;ADDR_ACC=4;ADDR_IMM=5;ADDR_ZPX=6;ADDR_ZPY=7;ADDR_ABSX=8;ADDR_ABSY=9;ADDR_PREIDXIND=10;ADDR_POSTIDXIND=11;ADDR_INDABS=12;setOp(t,s,e,i,h){this.opdata[s]=255&t|(255&e)<<8|(255&i)<<16|(255&h)<<24}}const a=class{IRQ_NORMAL=0;IRQ_NMI=1;IRQ_RESET=2;constructor(t){this.nes=t,this.mem=new Uint8Array(65536),this.mem.fill(255,0,8192);for(let t=0;t<4;t++){let s=2048*t;this.mem[s+8]=247,this.mem[s+9]=239,this.mem[s+10]=223,this.mem[s+15]=191}this.REG_ACC=0,this.REG_X=0,this.REG_Y=0,this.REG_SP=511,this.REG_PC=32767,this.REG_PC_NEW=32767,this.REG_STATUS=40,this.setStatus(40),this.F_CARRY=0,this.F_DECIMAL=0,this.F_INTERRUPT=1,this.F_INTERRUPT_NEW=1,this.F_OVERFLOW=0,this.F_SIGN=0,this.F_ZERO=1,this.F_NOTUSED=1,this.F_NOTUSED_NEW=1,this.F_BRK=1,this.F_BRK_NEW=1,this.opdata=(new r).opdata,this.cyclesToHalt=0,this.crash=!1,this.irqRequested=!1,this.irqType=null,this.nmiRaised=!1,this.nmiPending=!1,this.nmiImmediate=!1,this.dataBus=0,this.instrBusCycles=0,this.apuCatchupCycles=0,this.nmiRaisedAtCycle=0,this.nmiDotsRemainingInStep=0}emulate(){if(this.nmiImmediate)return this.nmiImmediate=!1,this.nmiPending=!1,this.nmiRaised=!1,this.instrBusCycles=0,this.REG_PC_NEW=this.REG_PC,this.F_INTERRUPT_NEW=this.F_INTERRUPT,this.doNonMaskableInterrupt(239&this.getStatus()),this.REG_PC=this.REG_PC_NEW,this.F_INTERRUPT=this.F_INTERRUPT_NEW,this.F_BRK=this.F_BRK_NEW,7;let t,s,e=0,i=0;if(this.nmiRaised&&(this.nmiPending=!0,this.nmiRaised=!1),this.irqRequested){switch(t=this.getStatus(),this.REG_PC_NEW=this.REG_PC,this.F_INTERRUPT_NEW=this.F_INTERRUPT,this.irqType){case 0:if(0!==this.F_INTERRUPT)break;this.doIrq(239&t),i=7;break;case 2:this.doResetInterrupt(),i=7}this.REG_PC=this.REG_PC_NEW,this.F_INTERRUPT=this.F_INTERRUPT_NEW,this.F_BRK=this.F_BRK_NEW,this.irqRequested=!1}if(null===this.nes.mmap)return 32;this.instrBusCycles=0,this.apuCatchupCycles=0,this.nmiDotsRemainingInStep=0,this._dmcFetchCycles=this._cyclesToNextDmcFetch();let h=this.loadFromCartridge(this.REG_PC+1);this.dataBus=h,this.instrBusCycles=1,this.nes.ppu.advanceDots(3);let r=this.opdata[h],a=r>>24,n=0,o=r>>8&255,l=this.REG_PC;this.REG_PC+=r>>16&255;let p=0;switch(o){case 0:p=this.loadDirect(l+2);break;case 1:p=this.loadDirect(l+2),p+=p<128?this.REG_PC:this.REG_PC-256;break;case 2:this.loadDirect(l+2);break;case 3:p=this.load16bit(l+2);break;case 4:this.loadDirect(l+2),p=this.REG_ACC;break;case 5:p=this.REG_PC;break;case 6:{let t=this.loadDirect(l+2);this.loadDirect(t),p=t+this.REG_X&255;break}case 7:{let t=this.loadDirect(l+2);this.loadDirect(t),p=t+this.REG_Y&255;break}case 8:p=this.load16bit(l+2),e=p>>8&255,(65280&p)!=(p+this.REG_X&65280)&&(this.load(65280&p|p+this.REG_X&255),n=1),p+=this.REG_X;break;case 9:p=this.load16bit(l+2),e=p>>8&255,(65280&p)!=(p+this.REG_Y&65280)&&(this.load(65280&p|p+this.REG_Y&255),n=1),p+=this.REG_Y;break;case 10:{let t=this.loadDirect(l+2);this.loadDirect(t);let s=t+this.REG_X&255;p=this.loadDirect(s)|this.loadDirect(s+1&255)<<8;break}case 11:{let t=this.loadDirect(l+2);p=this.loadDirect(t)|this.loadDirect(t+1&255)<<8,e=p>>8&255,(65280&p)!=(p+this.REG_Y&65280)&&(this.load(65280&p|p+this.REG_Y&255),n=1),p+=this.REG_Y;break}case 12:p=this.load16bit(l+2);var c=65280&p|1+(255&p)&255;p=this.load(p)|this.load(c)<<8}switch(p&=65535,255&r){case 0:s=this.load(p),t=this.REG_ACC+s+this.F_CARRY,!(128&(this.REG_ACC^s))&&128&(this.REG_ACC^t)?this.F_OVERFLOW=1:this.F_OVERFLOW=0,this.F_CARRY=t>255?1:0,this.F_SIGN=t>>7&1,this.F_ZERO=255&t,this.REG_ACC=255&t,a+=n;break;case 1:this.REG_ACC=this.REG_ACC&this.load(p),this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC,a+=n;break;case 2:4===o?(this.F_CARRY=this.REG_ACC>>7&1,this.REG_ACC=this.REG_ACC<<1&255,this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC):(0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),this.F_CARRY=t>>7&1,t=t<<1&255,this.F_SIGN=t>>7&1,this.F_ZERO=t,this.write(p,t));break;case 3:0===this.F_CARRY&&(a+=this._takeBranch(l,p));break;case 4:1===this.F_CARRY&&(a+=this._takeBranch(l,p));break;case 5:0===this.F_ZERO&&(a+=this._takeBranch(l,p));break;case 6:t=this.load(p),this.F_SIGN=t>>7&1,this.F_OVERFLOW=t>>6&1,t&=this.REG_ACC,this.F_ZERO=t;break;case 7:1===this.F_SIGN&&(a+=this._takeBranch(l,p));break;case 8:0!==this.F_ZERO&&(a+=this._takeBranch(l,p));break;case 9:0===this.F_SIGN&&(a+=this._takeBranch(l,p));break;case 10:this.REG_PC+=2,this.push(this.REG_PC>>8&255),this.push(255&this.REG_PC),this.F_BRK=1,this.push(this.getStatus()),this.F_INTERRUPT=1,this.REG_PC=this.load16bit(65534),this.REG_PC--;break;case 11:0===this.F_OVERFLOW&&(a+=this._takeBranch(l,p));break;case 12:1===this.F_OVERFLOW&&(a+=this._takeBranch(l,p));break;case 13:this.F_CARRY=0;break;case 14:this.F_DECIMAL=0;break;case 15:this.F_INTERRUPT=0;break;case 16:this.F_OVERFLOW=0;break;case 17:t=this.REG_ACC-this.load(p),this.F_CARRY=t>=0?1:0,this.F_SIGN=t>>7&1,this.F_ZERO=255&t,a+=n;break;case 18:t=this.REG_X-this.load(p),this.F_CARRY=t>=0?1:0,this.F_SIGN=t>>7&1,this.F_ZERO=255&t;break;case 19:t=this.REG_Y-this.load(p),this.F_CARRY=t>=0?1:0,this.F_SIGN=t>>7&1,this.F_ZERO=255&t;break;case 20:0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),t=t-1&255,this.F_SIGN=t>>7&1,this.F_ZERO=t,this.write(p,t);break;case 21:this.REG_X=this.REG_X-1&255,this.F_SIGN=this.REG_X>>7&1,this.F_ZERO=this.REG_X;break;case 22:this.REG_Y=this.REG_Y-1&255,this.F_SIGN=this.REG_Y>>7&1,this.F_ZERO=this.REG_Y;break;case 23:this.REG_ACC=255&(this.load(p)^this.REG_ACC),this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC,a+=n;break;case 24:0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),t=t+1&255,this.F_SIGN=t>>7&1,this.F_ZERO=t,this.write(p,t);break;case 25:this.REG_X=this.REG_X+1&255,this.F_SIGN=this.REG_X>>7&1,this.F_ZERO=this.REG_X;break;case 26:this.REG_Y++,this.REG_Y&=255,this.F_SIGN=this.REG_Y>>7&1,this.F_ZERO=this.REG_Y;break;case 27:this.REG_PC=p-1;break;case 28:this.push(this.REG_PC>>8&255),this.push(255&this.REG_PC),this.loadDirect(l+3),this.REG_PC=p-1;break;case 29:this.REG_ACC=this.load(p),this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC,a+=n;break;case 30:this.REG_X=this.load(p),this.F_SIGN=this.REG_X>>7&1,this.F_ZERO=this.REG_X,a+=n;break;case 31:this.REG_Y=this.load(p),this.F_SIGN=this.REG_Y>>7&1,this.F_ZERO=this.REG_Y,a+=n;break;case 32:4===o?(t=255&this.REG_ACC,this.F_CARRY=1&t,t>>=1,this.REG_ACC=t):(0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=255&this.load(p),this.write(p,t),this.F_CARRY=1&t,t>>=1,this.write(p,t)),this.F_SIGN=0,this.F_ZERO=t;break;case 33:case 68:break;case 34:t=255&(this.load(p)|this.REG_ACC),this.F_SIGN=t>>7&1,this.F_ZERO=t,this.REG_ACC=t,a+=n;break;case 35:this.push(this.REG_ACC);break;case 36:this.F_BRK=1,this.push(this.getStatus());break;case 37:this.REG_ACC=this.pull(),this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC;break;case 38:this.setStatusFromStack(this.pull());break;case 39:4===o?(t=this.REG_ACC,s=this.F_CARRY,this.F_CARRY=t>>7&1,t=(t<<1&255)+s,this.REG_ACC=t):(0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),s=this.F_CARRY,this.F_CARRY=t>>7&1,t=(t<<1&255)+s,this.write(p,t)),this.F_SIGN=t>>7&1,this.F_ZERO=t;break;case 40:4===o?(s=this.F_CARRY<<7,this.F_CARRY=1&this.REG_ACC,t=(this.REG_ACC>>1)+s,this.REG_ACC=t):(0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),s=this.F_CARRY<<7,this.F_CARRY=1&t,t=(t>>1)+s,this.write(p,t)),this.F_SIGN=t>>7&1,this.F_ZERO=t;break;case 41:if(this.setStatusFromStack(this.pull()),this.REG_PC=this.pull(),this.REG_PC+=this.pull()<<8,65535===this.REG_PC)return;this.REG_PC--;break;case 42:if(this.REG_PC=this.pull(),this.REG_PC+=this.pull()<<8,65535===this.REG_PC)return;break;case 43:s=this.load(p),t=this.REG_ACC-s-(1-this.F_CARRY),this.F_SIGN=t>>7&1,this.F_ZERO=255&t,128&(this.REG_ACC^t)&&128&(this.REG_ACC^s)?this.F_OVERFLOW=1:this.F_OVERFLOW=0,this.F_CARRY=t<0?0:1,this.REG_ACC=255&t,a+=n;break;case 44:this.F_CARRY=1;break;case 45:this.F_DECIMAL=1;break;case 46:this.F_INTERRUPT=1;break;case 47:0!==n||8!==o&&9!==o&&11!==o||this.load(p),this.write(p,this.REG_ACC);break;case 48:this.write(p,this.REG_X);break;case 49:this.write(p,this.REG_Y);break;case 50:this.REG_X=this.REG_ACC,this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC;break;case 51:this.REG_Y=this.REG_ACC,this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC;break;case 52:this.REG_X=255&this.REG_SP,this.F_SIGN=this.REG_SP>>7&1,this.F_ZERO=this.REG_X;break;case 53:this.REG_ACC=this.REG_X,this.F_SIGN=this.REG_X>>7&1,this.F_ZERO=this.REG_X;break;case 54:this.REG_SP=255&this.REG_X;break;case 55:this.REG_ACC=this.REG_Y,this.F_SIGN=this.REG_Y>>7&1,this.F_ZERO=this.REG_Y;break;case 56:t=this.REG_ACC&this.load(p),this.F_CARRY=1&t,this.REG_ACC=this.F_ZERO=t>>1,this.F_SIGN=0;break;case 57:this.REG_ACC=this.F_ZERO=this.REG_ACC&this.load(p),this.F_CARRY=this.F_SIGN=this.REG_ACC>>7&1;break;case 58:t=this.REG_ACC&this.load(p),this.REG_ACC=this.F_ZERO=(t>>1)+(this.F_CARRY<<7),this.F_SIGN=this.F_CARRY,this.F_CARRY=t>>7&1,this.F_OVERFLOW=1&(t>>7^t>>6);break;case 59:t=(this.REG_X&this.REG_ACC)-this.load(p),this.F_SIGN=t>>7&1,this.F_ZERO=255&t,this.F_CARRY=t<0?0:1,this.REG_X=255&t;break;case 60:this.REG_ACC=this.REG_X=this.F_ZERO=this.load(p),this.F_SIGN=this.REG_ACC>>7&1,a+=n;break;case 61:this.write(p,this.REG_ACC&this.REG_X);break;case 62:0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),t=t-1&255,this.write(p,t),t=this.REG_ACC-t,this.F_CARRY=t>=0?1:0,this.F_SIGN=t>>7&1,this.F_ZERO=255&t;break;case 63:{0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),t=t+1&255,this.write(p,t);let s=t;t=this.REG_ACC-s-(1-this.F_CARRY),this.F_SIGN=t>>7&1,this.F_ZERO=255&t,128&(this.REG_ACC^t)&&128&(this.REG_ACC^s)?this.F_OVERFLOW=1:this.F_OVERFLOW=0,this.F_CARRY=t<0?0:1,this.REG_ACC=255&t;break}case 64:0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),s=this.F_CARRY,this.F_CARRY=t>>7&1,t=(t<<1&255)+s,this.write(p,t),this.REG_ACC=this.REG_ACC&t,this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC;break;case 65:{0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),s=this.F_CARRY<<7,this.F_CARRY=1&t,t=(t>>1)+s,this.write(p,t);let e=t;t=this.REG_ACC+e+this.F_CARRY,!(128&(this.REG_ACC^e))&&128&(this.REG_ACC^t)?this.F_OVERFLOW=1:this.F_OVERFLOW=0,this.F_CARRY=t>255?1:0,this.F_SIGN=t>>7&1,this.F_ZERO=255&t,this.REG_ACC=255&t;break}case 66:0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=this.load(p),this.write(p,t),this.F_CARRY=t>>7&1,t=t<<1&255,this.write(p,t),this.REG_ACC=this.REG_ACC|t,this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC;break;case 67:0!==n||8!==o&&9!==o&&11!==o||this.load(p),t=255&this.load(p),this.write(p,t),this.F_CARRY=1&t,t>>=1,this.write(p,t),this.REG_ACC=this.REG_ACC^t,this.F_SIGN=this.REG_ACC>>7&1,this.F_ZERO=this.REG_ACC;break;case 69:this.load(p),a+=n;break;case 71:{0===n&&this.load(p);let t=this._dmcFetchCycles>0&&this._dmcFetchCycles<=this.instrBusCycles?this.REG_ACC&this.REG_X:this.REG_ACC&this.REG_X&e+1&255;1===n&&(p=t<<8|255&p),this.write(p,t);break}case 72:{0===n&&this.load(p);let t=this._dmcFetchCycles>0&&this._dmcFetchCycles<=this.instrBusCycles;this.REG_SP=256|this.REG_ACC&this.REG_X;let s=t?255&this.REG_SP:255&this.REG_SP&e+1&255;1===n&&(p=s<<8|255&p),this.write(p,s);break}case 73:{0===n&&this.load(p);let t=this._dmcFetchCycles>0&&this._dmcFetchCycles<=this.instrBusCycles?this.REG_Y:this.REG_Y&e+1&255;1===n&&(p=t<<8|255&p),this.write(p,t);break}case 74:{0===n&&this.load(p);let t=this._dmcFetchCycles>0&&this._dmcFetchCycles<=this.instrBusCycles?this.REG_X:this.REG_X&e+1&255;1===n&&(p=t<<8|255&p),this.write(p,t);break}case 75:t=255&this.load(p)&this.REG_SP,this.REG_ACC=this.REG_X=this.F_ZERO=t,this.REG_SP=256|t,this.F_SIGN=t>>7&1,a+=n;break;case 76:this.REG_ACC=this.F_ZERO=(255|this.REG_ACC)&this.REG_X&this.load(p),this.F_SIGN=this.REG_ACC>>7&1;break;case 77:this.REG_ACC=this.REG_X=this.F_ZERO=(255|this.REG_ACC)&this.load(p),this.F_SIGN=this.REG_ACC>>7&1;break;default:throw new Error(`Game crashed, invalid opcode at address $${l.toString(16)}`)}if(this.instrBusCycles<a){let t=3*(a-this.instrBusCycles);this.instrBusCycles=a,this.nes.ppu.advanceDots(t)}if(this.nmiRaised){3*(this.instrBusCycles-this.nmiRaisedAtCycle)+this.nmiDotsRemainingInStep>=5&&(this.nmiImmediate=!0,this.nmiRaised=!1)}return this.nmiPending&&(this.REG_PC_NEW=this.REG_PC,this.F_INTERRUPT_NEW=this.F_INTERRUPT,this.doNonMaskableInterrupt(239&this.getStatus()),this.REG_PC=this.REG_PC_NEW,this.F_INTERRUPT=this.F_INTERRUPT_NEW,this.F_BRK=this.F_BRK_NEW,this.nmiPending=!1,i=7),a+i}loadFromCartridge(t){return this.nes.mmap.load(t)}_loadFromCartridgePlain(t){return this.nes.mmap.load(t)}_loadFromCartridgeWithGameGenie(t){let s=this.nes.mmap.load(t);return this.nes.gameGenie.applyCodes(t,s)}_updateCartridgeLoader(){this.nes.gameGenie.enabled&&this.nes.gameGenie.patches.length>0?this.loadFromCartridge=this._loadFromCartridgeWithGameGenie:delete this.loadFromCartridge}load(t){if(t<8192)this.dataBus=this.mem[2047&t],this.instrBusCycles++,this.nes.ppu.advanceDots(3);else if(t>=16384){if(16405===t){this.nes.papu.advanceFrameCounter(this.instrBusCycles-this.apuCatchupCycles),this.apuCatchupCycles=this.instrBusCycles;let s=this.loadFromCartridge(t);return this.instrBusCycles++,this.nes.ppu.advanceDots(3),s}this.dataBus=this.loadFromCartridge(t),this.instrBusCycles++,this.nes.ppu.advanceDots(3)}else this.instrBusCycles++,this.dataBus=this.loadFromCartridge(t),this.nes.ppu.advanceDots(3);return this.dataBus}loadDirect(t){return this.dataBus=t<8192?this.mem[2047&t]:this.loadFromCartridge(t),this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.dataBus}load16bit(t){let s;return t<8191?(this.dataBus=this.mem[2047&t],s=this.dataBus,this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.dataBus=this.mem[t+1&2047],this.instrBusCycles++,this.nes.ppu.advanceDots(3),s|this.dataBus<<8):(this.dataBus=this.loadFromCartridge(t),s=this.dataBus,this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.dataBus=this.loadFromCartridge(t+1),this.instrBusCycles++,this.nes.ppu.advanceDots(3),s|this.dataBus<<8)}write(t,s){t>=8192&&t<16384?(this.instrBusCycles++,this.dataBus=s,this.nes.mmap.write(t,s),this.nes.ppu.advanceDots(3)):(this.dataBus=s,t<8192?this.mem[2047&t]=s:this.nes.mmap.write(t,s),this.instrBusCycles++,this.nes.ppu.advanceDots(3))}requestIrq(t){this.irqRequested&&t===this.IRQ_NORMAL||(this.irqRequested=!0,this.irqType=t)}push(t){this.dataBus=t,this.mem[256|this.REG_SP]=t,this.REG_SP--,this.REG_SP=255&this.REG_SP,this.instrBusCycles++,this.nes.ppu.advanceDots(3)}pull(){return this.REG_SP++,this.REG_SP=255&this.REG_SP,this.dataBus=this.mem[256|this.REG_SP],this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.dataBus}_cyclesToNextDmcFetch(){if(!this.nes.papu)return 2147483647;let t=this.nes.papu.dmc;if(!t||!t.isEnabled||t.dmaFrequency<=0)return 2147483647;if(!t.hasSample)return 2147483647;let s=t.dmaFrequency>>3,e=t.shiftCounter+7>>3;return e<=0&&(e=s),e+(t.dmaCounter-1)*s}_takeBranch(t,s){let e=t+3&65535,i=s+1&65535;if(this.load(e),(65280&e)!=(65280&i)){let t=65280&e|255&i;return this.load(t),this.REG_PC=s,2}return this.REG_PC=s,1}pageCrossed(t,s){return(65280&t)!=(65280&s)}haltCycles(t){this.cyclesToHalt+=t}doNonMaskableInterrupt(t){if(null===this.nes.mmap)return;this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.REG_PC_NEW++,this.push(this.REG_PC_NEW>>8&255),this.push(255&this.REG_PC_NEW),this.push(t),this.dataBus=this.loadFromCartridge(65530),this.instrBusCycles++,this.nes.ppu.advanceDots(3);let s=this.dataBus;this.dataBus=this.loadFromCartridge(65531),this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.REG_PC_NEW=s|this.dataBus<<8,this.REG_PC_NEW--}doResetInterrupt(){this.dataBus=this.loadFromCartridge(65532),this.instrBusCycles++,this.nes.ppu.advanceDots(3);let t=this.dataBus;this.dataBus=this.loadFromCartridge(65533),this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.REG_PC_NEW=t|this.dataBus<<8,this.REG_PC_NEW--}doIrq(t){this.REG_PC_NEW++,this.push(this.REG_PC_NEW>>8&255),this.push(255&this.REG_PC_NEW),this.push(t),this.F_INTERRUPT_NEW=1,this.F_BRK_NEW=0,this.dataBus=this.loadFromCartridge(65534),this.instrBusCycles++,this.nes.ppu.advanceDots(3);let s=this.dataBus;this.dataBus=this.loadFromCartridge(65535),this.instrBusCycles++,this.nes.ppu.advanceDots(3),this.REG_PC_NEW=s|this.dataBus<<8,this.REG_PC_NEW--}getStatus(){return this.F_CARRY|(0===this.F_ZERO?1:0)<<1|this.F_INTERRUPT<<2|this.F_DECIMAL<<3|this.F_BRK<<4|this.F_NOTUSED<<5|this.F_OVERFLOW<<6|this.F_SIGN<<7}setStatus(t){this.F_CARRY=1&t,this.F_ZERO=1==(t>>1&1)?0:1,this.F_INTERRUPT=t>>2&1,this.F_DECIMAL=t>>3&1,this.F_BRK=t>>4&1,this.F_NOTUSED=t>>5&1,this.F_OVERFLOW=t>>6&1,this.F_SIGN=t>>7&1}setStatusFromStack(t){this.F_CARRY=1&t,this.F_ZERO=1==(t>>1&1)?0:1,this.F_INTERRUPT=t>>2&1,this.F_DECIMAL=t>>3&1,this.F_OVERFLOW=t>>6&1,this.F_SIGN=t>>7&1}static JSON_PROPERTIES=["mem","cyclesToHalt","irqRequested","irqType","nmiRaised","nmiPending","nmiImmediate","REG_ACC","REG_X","REG_Y","REG_SP","REG_PC","REG_PC_NEW","REG_STATUS","F_CARRY","F_DECIMAL","F_INTERRUPT","F_INTERRUPT_NEW","F_OVERFLOW","F_SIGN","F_ZERO","F_NOTUSED","F_NOTUSED_NEW","F_BRK","F_BRK_NEW"];toJSON(){return h(this)}fromJSON(t){i(this,t)}};class n{static BUTTON_A=0;static BUTTON_B=1;static BUTTON_SELECT=2;static BUTTON_START=3;static BUTTON_UP=4;static BUTTON_DOWN=5;static BUTTON_LEFT=6;static BUTTON_RIGHT=7;static BUTTON_TURBO_A=8;static BUTTON_TURBO_B=9;constructor(){this.state=new Array(8);for(let t=0;t<this.state.length;t++)this.state[t]=64;this.baseA=64,this.baseB=64,this.turboA=!1,this.turboB=!1,this.turboToggle=!1}buttonDown(t){t===n.BUTTON_TURBO_A?this.turboA=!0:t===n.BUTTON_TURBO_B?this.turboB=!0:(this.state[t]=65,t===n.BUTTON_A&&(this.baseA=65),t===n.BUTTON_B&&(this.baseB=65))}buttonUp(t){t===n.BUTTON_TURBO_A?(this.turboA=!1,this.state[n.BUTTON_A]=this.baseA):t===n.BUTTON_TURBO_B?(this.turboB=!1,this.state[n.BUTTON_B]=this.baseB):(this.state[t]=64,t===n.BUTTON_A&&(this.baseA=64),t===n.BUTTON_B&&(this.baseB=64))}clock(){(this.turboA||this.turboB)&&(this.turboToggle=!this.turboToggle,this.turboA&&(this.state[n.BUTTON_A]=this.turboToggle?65:64),this.turboB&&(this.state[n.BUTTON_B]=this.turboToggle?65:64))}}const o=n;const l=class{constructor(){this.pix=new Uint8Array(64),this.initialized=!1,this.opaque=new Uint8Array(8)}setBuffer(t){for(let s=0;s<8;s++)this.setScanline(s,t[s],t[s+8])}setScanline(t,s,e){this.initialized=!0;let i=t<<3;for(let h=0;h<8;h++)this.pix[i+h]=(s>>7-h&1)+((e>>7-h&1)<<1),0===this.pix[i+h]&&(this.opaque[t]=!1)}render(t,s,e,i,h,r,a,n,o,l,p,c,u){if(r<-7||r>=256||a<-7||a>=240)return;let m,d,R,_;if(r<0&&(s-=r),r+i>=256&&(i=256-r),a<0&&(e-=a),a+h>=240&&(h=240-a),l||p)if(l&&!p){m=(a<<8)+r,d=7;for(let r=0;r<8;r++){for(let a=0;a<8;a++)a>=s&&a<i&&r>=e&&r<h&&(R=this.pix[d],_=u[m],0!==R&&c<=(255&_)&&(t[m]=o[R+n],_=3840&_|c,u[m]=_)),m++,d--;m-=8,m+=256,d+=16}}else if(p&&!l){m=(a<<8)+r,d=56;for(let r=0;r<8;r++){for(let a=0;a<8;a++)a>=s&&a<i&&r>=e&&r<h&&(R=this.pix[d],_=u[m],0!==R&&c<=(255&_)&&(t[m]=o[R+n],_=3840&_|c,u[m]=_)),m++,d++;m-=8,m+=256,d-=16}}else{m=(a<<8)+r,d=63;for(let r=0;r<8;r++){for(let a=0;a<8;a++)a>=s&&a<i&&r>=e&&r<h&&(R=this.pix[d],_=u[m],0!==R&&c<=(255&_)&&(t[m]=o[R+n],_=3840&_|c,u[m]=_)),m++,d--;m-=8,m+=256}}else{m=(a<<8)+r,d=0;for(let r=0;r<8;r++){for(let a=0;a<8;a++)a>=s&&a<i&&r>=e&&r<h&&(R=this.pix[d],_=u[m],0!==R&&c<=(255&_)&&(t[m]=o[R+n],_=3840&_|c,u[m]=_)),m++,d++;m-=8,m+=256}}}isTransparent(t,s){return 0===this.pix[(s<<3)+t]}toJSON(){return{opaque:Array.from(this.opaque),pix:Array.from(this.pix)}}fromJSON(t){this.opaque.set(t.opaque),this.pix.set(t.pix)}};const p=class{constructor(t,s,e){this.width=t,this.height=s,this.name=e,this.tile=new Uint8Array(t*s),this.attrib=new Uint8Array(t*s)}getTileIndex(t,s){return this.tile[s*this.width+t]}getAttrib(t,s){return this.attrib[s*this.width+t]}writeAttrib(t,s){let e,i,h,r,a=t%8*4,n=4*Math.floor(t/8);for(let t=0;t<2;t++)for(let o=0;o<2;o++){e=s>>2*(2*t+o)&3;for(let s=0;s<2;s++)for(let l=0;l<2;l++)i=a+2*o+l,h=n+2*t+s,r=h*this.width+i,this.attrib[r]=e<<2&12}}toJSON(){return{tile:Array.from(this.tile),attrib:Array.from(this.attrib)}}fromJSON(t){this.tile.set(t.tile),this.attrib.set(t.attrib)}};const c=class{constructor(){this.curTable=new Uint32Array(64),this.emphTable=new Array(8),this.currentEmph=-1}loadNTSCPalette(){this.curTable=new Uint32Array([5395026,11796480,10485760,11599933,7602281,91,95,6208,12048,543240,26368,1196544,7153664,0,0,0,12899815,16728064,14421538,16729963,14090399,6818519,6588,21681,27227,35843,43776,2918400,10777088,0,0,0,16316664,16755516,16742785,16735173,16730354,14633471,4681215,46327,57599,58229,259115,7911470,15065624,7895160,0,0,16777215,16773822,16300216,16300248,16758527,16761855,13095423,10148607,8973816,8650717,12122296,16119980,16777136,16308472,0,0]),this.makeTables(),this.setEmphasis(0)}loadPALPalette(){this.curTable=new Uint32Array([5395026,11796480,10485760,11599933,7602281,91,95,6208,12048,543240,26368,1196544,7153664,0,0,0,12899815,16728064,14421538,16729963,14090399,6818519,6588,21681,27227,35843,43776,2918400,10777088,0,0,0,16316664,16755516,16742785,16735173,16730354,14633471,4681215,46327,57599,58229,259115,7911470,15065624,7895160,0,0,16777215,16773822,16300216,16300248,16758527,16761855,13095423,10148607,8973816,8650717,12122296,16119980,16777136,16308472,0,0]),this.makeTables(),this.setEmphasis(0)}makeTables(){let t,s,e,i,h,r,a,n;for(let o=0;o<8;o++)for(r=1,a=1,n=1,1&o&&(r=.75,n=.75),2&o&&(r=.75,a=.75),4&o&&(a=.75,n=.75),this.emphTable[o]=new Uint32Array(64),h=0;h<64;h++)i=this.curTable[h],t=Math.floor(this.getRed(i)*r),s=Math.floor(this.getGreen(i)*a),e=Math.floor(this.getBlue(i)*n),this.emphTable[o][h]=this.getRgb(t,s,e)}setEmphasis(t){if(t!==this.currentEmph){this.currentEmph=t;for(let s=0;s<64;s++)this.curTable[s]=this.emphTable[t][s]}}getEntry(t){return this.curTable[t]}getRed(t){return t>>16&255}getGreen(t){return t>>8&255}getBlue(t){return 255&t}getRgb(t,s,e){return t<<16|s<<8|e}loadDefaultPalette(){this.curTable[0]=this.getRgb(117,117,117),this.curTable[1]=this.getRgb(39,27,143),this.curTable[2]=this.getRgb(0,0,171),this.curTable[3]=this.getRgb(71,0,159),this.curTable[4]=this.getRgb(143,0,119),this.curTable[5]=this.getRgb(171,0,19),this.curTable[6]=this.getRgb(167,0,0),this.curTable[7]=this.getRgb(127,11,0),this.curTable[8]=this.getRgb(67,47,0),this.curTable[9]=this.getRgb(0,71,0),this.curTable[10]=this.getRgb(0,81,0),this.curTable[11]=this.getRgb(0,63,23),this.curTable[12]=this.getRgb(27,63,95),this.curTable[13]=this.getRgb(0,0,0),this.curTable[14]=this.getRgb(0,0,0),this.curTable[15]=this.getRgb(0,0,0),this.curTable[16]=this.getRgb(188,188,188),this.curTable[17]=this.getRgb(0,115,239),this.curTable[18]=this.getRgb(35,59,239),this.curTable[19]=this.getRgb(131,0,243),this.curTable[20]=this.getRgb(191,0,191),this.curTable[21]=this.getRgb(231,0,91),this.curTable[22]=this.getRgb(219,43,0),this.curTable[23]=this.getRgb(203,79,15),this.curTable[24]=this.getRgb(139,115,0),this.curTable[25]=this.getRgb(0,151,0),this.curTable[26]=this.getRgb(0,171,0),this.curTable[27]=this.getRgb(0,147,59),this.curTable[28]=this.getRgb(0,131,139),this.curTable[29]=this.getRgb(0,0,0),this.curTable[30]=this.getRgb(0,0,0),this.curTable[31]=this.getRgb(0,0,0),this.curTable[32]=this.getRgb(255,255,255),this.curTable[33]=this.getRgb(63,191,255),this.curTable[34]=this.getRgb(95,151,255),this.curTable[35]=this.getRgb(167,139,253),this.curTable[36]=this.getRgb(247,123,255),this.curTable[37]=this.getRgb(255,119,183),this.curTable[38]=this.getRgb(255,119,99),this.curTable[39]=this.getRgb(255,155,59),this.curTable[40]=this.getRgb(243,191,63),this.curTable[41]=this.getRgb(131,211,19),this.curTable[42]=this.getRgb(79,223,75),this.curTable[43]=this.getRgb(88,248,152),this.curTable[44]=this.getRgb(0,235,219),this.curTable[45]=this.getRgb(0,0,0),this.curTable[46]=this.getRgb(0,0,0),this.curTable[47]=this.getRgb(0,0,0),this.curTable[48]=this.getRgb(255,255,255),this.curTable[49]=this.getRgb(171,231,255),this.curTable[50]=this.getRgb(199,215,255),this.curTable[51]=this.getRgb(215,203,255),this.curTable[52]=this.getRgb(255,199,255),this.curTable[53]=this.getRgb(255,199,219),this.curTable[54]=this.getRgb(255,191,179),this.curTable[55]=this.getRgb(255,219,171),this.curTable[56]=this.getRgb(255,231,163),this.curTable[57]=this.getRgb(227,255,163),this.curTable[58]=this.getRgb(171,243,191),this.curTable[59]=this.getRgb(179,255,207),this.curTable[60]=this.getRgb(159,255,243),this.curTable[61]=this.getRgb(0,0,0),this.curTable[62]=this.getRgb(0,0,0),this.curTable[63]=this.getRgb(0,0,0),this.makeTables(),this.setEmphasis(0)}};const u=class{STATUS_VRAMWRITE=4;STATUS_SLSPRITECOUNT=5;STATUS_SPRITE0HIT=6;STATUS_VBLANK=7;constructor(t){let s;for(this.nes=t,this.showSpr0Hit=!1,this.clipToTvSize=!0,this.vramMem=new Uint8Array(32768),this.spriteMem=new Uint8Array(256),this.vramAddress=null,this.vramTmpAddress=null,this.vramBufferedReadValue=0,this.firstWrite=!0,this.openBusLatch=0,this.openBusDecayFrames=0,this.sramAddress=0,this.currentMirroring=-1,this.nmiOutput=!1,this.nmiSuppressed=!1,this.vblankPending=!1,this.frameEnded=!1,this.dummyCycleToggle=!1,this.validTileData=!1,this.scanlineAlreadyRendered=null,this.f_nmiOnVblank=0,this.f_spriteSize=0,this.f_bgPatternTable=0,this.f_spPatternTable=0,this.f_addrInc=0,this.f_nTblAddress=0,this.f_color=0,this.f_spVisibility=0,this.f_bgVisibility=0,this.f_spClipping=0,this.f_bgClipping=0,this.f_dispType=0,this.cntFV=0,this.cntV=0,this.cntH=0,this.cntVT=0,this.cntHT=0,this.regFV=0,this.regV=0,this.regH=0,this.regVT=0,this.regHT=0,this.regFH=0,this.regS=0,this.curNt=null,this.attrib=new Uint8Array(32),this.buffer=new Uint32Array(61440),this.bgbuffer=new Uint32Array(61440),this.pixrendered=new Uint32Array(61440),this.validTileData=null,this.scantile=new Array(32),this.scanline=0,this.lastRenderedScanline=-1,this.curX=0,this.sprX=new Uint8Array(64),this.sprY=new Uint8Array(64),this.sprTile=new Uint8Array(64),this.sprCol=new Uint8Array(64),this.vertFlip=new Uint8Array(64),this.horiFlip=new Uint8Array(64),this.bgPriority=new Uint8Array(64),this.spr0HitX=0,this.spr0HitY=0,this.hitSpr0=!1,this.sprPalette=new Uint32Array(16),this.imgPalette=new Uint32Array(16),this.ptTile=new Array(512),s=0;s<512;s++)this.ptTile[s]=new l;for(this.ntable1=new Array(4),this.currentMirroring=-1,this.nameTable=new Array(4),s=0;s<4;s++)this.nameTable[s]=new p(32,32,`Nt${s}`);for(this.vramMirrorTable=new Uint16Array(32768),s=0;s<32768;s++)this.vramMirrorTable[s]=s;this.palTable=new c,this.palTable.loadNTSCPalette(),this.updateControlReg1(0),this.updateControlReg2(0)}setMirroring(t){if(t!==this.currentMirroring){this.currentMirroring=t,this.triggerRendering(),null===this.vramMirrorTable&&(this.vramMirrorTable=new Uint16Array(32768));for(let t=0;t<32768;t++)this.vramMirrorTable[t]=t;this.defineMirrorRegion(16160,16128,32),this.defineMirrorRegion(16192,16128,32),this.defineMirrorRegion(16256,16128,32),this.defineMirrorRegion(16320,16128,32),this.defineMirrorRegion(12288,8192,3840),this.defineMirrorRegion(16384,0,16384),t===this.nes.rom.HORIZONTAL_MIRRORING?(this.ntable1[0]=0,this.ntable1[1]=0,this.ntable1[2]=1,this.ntable1[3]=1,this.defineMirrorRegion(9216,8192,1024),this.defineMirrorRegion(11264,10240,1024)):t===this.nes.rom.VERTICAL_MIRRORING?(this.ntable1[0]=0,this.ntable1[1]=1,this.ntable1[2]=0,this.ntable1[3]=1,this.defineMirrorRegion(10240,8192,1024),this.defineMirrorRegion(11264,9216,1024)):t===this.nes.rom.SINGLESCREEN_MIRRORING?(this.ntable1[0]=0,this.ntable1[1]=0,this.ntable1[2]=0,this.ntable1[3]=0,this.defineMirrorRegion(9216,8192,1024),this.defineMirrorRegion(10240,8192,1024),this.defineMirrorRegion(11264,8192,1024)):t===this.nes.rom.SINGLESCREEN_MIRRORING2?(this.ntable1[0]=1,this.ntable1[1]=1,this.ntable1[2]=1,this.ntable1[3]=1,this.defineMirrorRegion(9216,9216,1024),this.defineMirrorRegion(10240,9216,1024),this.defineMirrorRegion(11264,9216,1024)):(this.ntable1[0]=0,this.ntable1[1]=1,this.ntable1[2]=2,this.ntable1[3]=3)}}defineMirrorRegion(t,s,e){for(let i=0;i<e;i++)this.vramMirrorTable[t+i]=s+i}startVBlank(){this.openBusDecayFrames>0&&(this.openBusDecayFrames--,0===this.openBusDecayFrames&&(this.openBusLatch=0)),this.lastRenderedScanline<239&&this.renderFramePartially(this.lastRenderedScanline+1,240-this.lastRenderedScanline),this.endFrame(),this.lastRenderedScanline=-1}_fireVblankSet(t,s){this.vblankPending=!1,this.nmiSuppressed||(this.setStatusFlag(this.STATUS_VBLANK,!0),this._updateNmiOutput(),t.nmiRaised&&(t.nmiDotsRemainingInStep=s)),this.nmiSuppressed=!1,this.startVBlank(),this.frameEnded=!0}_fireVblankClear(t,s){t.nmiRaised&&s&&(t.nmiPending=!0,t.nmiRaised=!1),this.setStatusFlag(this.STATUS_VBLANK,!1),this.setStatusFlag(this.STATUS_SPRITE0HIT,!1),this.hitSpr0=!1,this.spr0HitX=-1,this.spr0HitY=-1,this._updateNmiOutput()}advanceDots(t){let s=this.curX+t;if(s<341&&!(0===this.scanline&&this.vblankPending&&this.curX<=1&&s>=1)&&!(20===this.scanline&&this.curX<=1&&s>=1)&&(this.spr0HitX<this.curX||this.spr0HitX>=s))return void(this.curX=s);let e=this.nes.cpu;for(let s=0;s<t;s++)0===this.scanline&&1===this.curX&&this.vblankPending?(this._fireVblankSet(e,t-s),this.curX++):(20===this.scanline&&1===this.curX&&this._fireVblankClear(e,s===t-1),this.curX===this.spr0HitX&&1===this.f_spVisibility&&this.scanline-21===this.spr0HitY&&this.setStatusFlag(this.STATUS_SPRITE0HIT,!0),this.curX++,341===this.curX&&(this.curX=0,this.endScanline()));0===this.scanline&&1===this.curX&&this.vblankPending&&this._fireVblankSet(e,0),20===this.scanline&&1===this.curX&&this._fireVblankClear(e,!0)}endScanline(){switch(this.scanline){case 19:this.dummyCycleToggle&&(this.curX=1,this.dummyCycleToggle=!this.dummyCycleToggle);break;case 20:1!==this.f_bgVisibility&&1!==this.f_spVisibility||(this.cntFV=this.regFV,this.cntV=this.regV,this.cntH=this.regH,this.cntVT=this.regVT,this.cntHT=this.regHT,1===this.f_bgVisibility&&this.renderBgScanline(!1,0)),1===this.f_bgVisibility&&1===this.f_spVisibility&&this.checkSprite0(0),1!==this.f_bgVisibility&&1!==this.f_spVisibility||this.nes.mmap.clockIrqCounter();break;case 261:this.vblankPending=!0,this.scanline=-1;break;default:this.scanline>=21&&this.scanline<=260&&(1===this.f_bgVisibility&&(this.scanlineAlreadyRendered||(this.cntHT=this.regHT,this.cntH=this.regH,this.renderBgScanline(!0,this.scanline+1-21)),this.scanlineAlreadyRendered=!1,this.hitSpr0||1!==this.f_spVisibility||this.sprX[0]>=-7&&this.sprX[0]<256&&this.sprY[0]+1<=this.scanline-20&&this.sprY[0]+1+(0===this.f_spriteSize?8:16)>=this.scanline-20&&this.checkSprite0(this.scanline-20)&&(this.hitSpr0=!0)),1!==this.f_bgVisibility&&1!==this.f_spVisibility||this.nes.mmap.clockIrqCounter())}this.scanline++,this.regsToAddress(),this.cntsToAddress()}startFrame(){let t;if(0===this.f_dispType)t=this.imgPalette[0];else switch(this.f_color){case 0:case 3:default:t=0;break;case 1:t=65280;break;case 2:t=255;break;case 4:t=16711680}this.buffer.fill(t),this.pixrendered.fill(65)}endFrame(){let t,s,e=this.buffer;if(this.showSpr0Hit){if(this.sprX[0]>=0&&this.sprX[0]<256&&this.sprY[0]>=0&&this.sprY[0]<240){for(t=0;t<256;t++)e[(this.sprY[0]<<8)+t]=16733525;for(t=0;t<240;t++)e[(t<<8)+this.sprX[0]]=16733525}if(this.spr0HitX>=0&&this.spr0HitX<256&&this.spr0HitY>=0&&this.spr0HitY<240){for(t=0;t<256;t++)e[(this.spr0HitY<<8)+t]=5635925;for(t=0;t<240;t++)e[(t<<8)+this.spr0HitX]=5635925}}if(this.clipToTvSize||0===this.f_bgClipping||0===this.f_spClipping)for(s=0;s<240;s++)e.fill(0,s<<8,8+(s<<8));if(this.clipToTvSize){for(s=0;s<240;s++)e.fill(0,248+(s<<8),256+(s<<8));e.fill(0,0,2048),e.fill(0,59392,61440)}this.nes.ui.writeFrame(e)}updateControlReg1(t){this.triggerRendering(),this.f_nmiOnVblank=t>>7&1,this.f_spriteSize=t>>5&1,this.f_bgPatternTable=t>>4&1,this.f_spPatternTable=t>>3&1,this.f_addrInc=t>>2&1,this.f_nTblAddress=3&t,this.regV=t>>1&1,this.regH=1&t,this.regS=t>>4&1,this._updateNmiOutput()}_updateNmiOutput(){let t=!!(128&this.nes.cpu.mem[8194]),s=0!==this.f_nmiOnVblank&&t;if(s&&!this.nmiOutput)this.nes.cpu.nmiRaised=!0,this.nes.cpu.nmiRaisedAtCycle=this.nes.cpu.instrBusCycles;else if(!s&&this.nmiOutput&&this.nes.cpu.nmiRaised){let t=this.nes.cpu.instrBusCycles-this.nes.cpu.nmiRaisedAtCycle;(0===t||1===t&&0===this.nes.cpu.nmiDotsRemainingInStep)&&(this.nes.cpu.nmiRaised=!1)}this.nmiOutput=s}updateControlReg2(t){this.triggerRendering(),this.f_color=t>>5&7,this.f_spVisibility=t>>4&1,this.f_bgVisibility=t>>3&1,this.f_spClipping=t>>2&1,this.f_bgClipping=t>>1&1,this.f_dispType=1&t,0===this.f_dispType&&this.palTable.setEmphasis(this.f_color),this.updatePalettes()}setStatusFlag(t,s){let e=1<<t;this.nes.cpu.mem[8194]=this.nes.cpu.mem[8194]&255-e|(s?e:0)}readStatusRegister(){let t=this.nes.cpu.mem[8194];return this.firstWrite=!0,0===this.scanline&&0===this.curX&&(this.nmiSuppressed=!0),this.setStatusFlag(this.STATUS_VBLANK,!1),this._updateNmiOutput(),t=224&t|31&this.openBusLatch,this.openBusLatch=t,this.openBusDecayFrames=36,t}writeSRAMAddress(t){this.sramAddress=t}sramLoad(){return this.spriteMem[this.sramAddress]}sramWrite(t){this.spriteMem[this.sramAddress]=t,this.spriteRamWriteUpdate(this.sramAddress,t),this.sramAddress++,this.sramAddress%=256}scrollWrite(t){this.triggerRendering(),this.firstWrite?(this.regHT=t>>3&31,this.regFH=7&t):(this.regFV=7&t,this.regVT=t>>3&31),this.firstWrite=!this.firstWrite}writeVRAMAddress(t){this.firstWrite?(this.regFV=t>>4&3,this.regV=t>>3&1,this.regH=t>>2&1,this.regVT=7&this.regVT|(3&t)<<3):(this.triggerRendering(),this.regVT=24&this.regVT|t>>5&7,this.regHT=31&t,this.cntFV=this.regFV,this.cntV=this.regV,this.cntH=this.regH,this.cntVT=this.regVT,this.cntHT=this.regHT,this.checkSprite0(this.scanline-20)),this.firstWrite=!this.firstWrite,this.cntsToAddress(),this.vramAddress<8192&&this.nes.mmap.latchAccess(this.vramAddress)}vramLoad(){let t;if(this.cntsToAddress(),this.regsToAddress(),this.vramAddress<=16127)return t=this.vramBufferedReadValue,this.vramAddress<8192?this.vramBufferedReadValue=this.vramMem[this.vramAddress]:this.vramBufferedReadValue=this.mirroredLoad(this.vramAddress),this.vramAddress<8192&&this.nes.mmap.latchAccess(this.vramAddress),this.vramAddress+=1===this.f_addrInc?32:1,this.cntsFromAddress(),this.regsFromAddress(),t;let s=31&this.vramAddress;return 16==(19&s)&&(s&=15),t=63&this.vramMem[16128+s]|192&this.openBusLatch,this.vramBufferedReadValue=this.mirroredLoad(12287&this.vramAddress),this.vramAddress+=1===this.f_addrInc?32:1,this.cntsFromAddress(),this.regsFromAddress(),t}vramWrite(t){this.triggerRendering(),this.cntsToAddress(),this.regsToAddress(),this.vramAddress>=8192?this.mirroredWrite(this.vramAddress,t):(this.nes.mmap.canWriteChr(this.vramAddress)&&this.writeMem(this.vramAddress,t),this.nes.mmap.latchAccess(this.vramAddress)),this.vramAddress+=1===this.f_addrInc?32:1,this.regsFromAddress(),this.cntsFromAddress()}sramDMA(t){let s,e=256*t;for(let t=0;t<256;t++){s=this.nes.cpu.mem[e+t];let i=this.sramAddress+t&255;this.spriteMem[i]=s,this.spriteRamWriteUpdate(i,s)}this.nes.cpu.haltCycles(513)}regsFromAddress(){let t=this.vramTmpAddress>>8&255;this.regFV=t>>4&7,this.regV=t>>3&1,this.regH=t>>2&1,this.regVT=7&this.regVT|(3&t)<<3,t=255&this.vramTmpAddress,this.regVT=24&this.regVT|t>>5&7,this.regHT=31&t}cntsFromAddress(){let t=this.vramAddress>>8&255;this.cntFV=t>>4&3,this.cntV=t>>3&1,this.cntH=t>>2&1,this.cntVT=7&this.cntVT|(3&t)<<3,t=255&this.vramAddress,this.cntVT=24&this.cntVT|t>>5&7,this.cntHT=31&t}regsToAddress(){let t=(7&this.regFV)<<4;t|=(1&this.regV)<<3,t|=(1&this.regH)<<2,t|=this.regVT>>3&3;let s=(7&this.regVT)<<5;s|=31&this.regHT,this.vramTmpAddress=32767&(t<<8|s)}cntsToAddress(){let t=(7&this.cntFV)<<4;t|=(1&this.cntV)<<3,t|=(1&this.cntH)<<2,t|=this.cntVT>>3&3;let s=(7&this.cntVT)<<5;s|=31&this.cntHT,this.vramAddress=32767&(t<<8|s)}incTileCounter(t){for(let s=t;0!==s;s--)this.cntHT++,32===this.cntHT&&(this.cntHT=0,this.cntVT++,this.cntVT>=30&&(this.cntH++,2===this.cntH&&(this.cntH=0,this.cntV++,2===this.cntV&&(this.cntV=0,this.cntFV++,this.cntFV&=7))))}mirroredLoad(t){return this.vramMem[this.vramMirrorTable[t]]}mirroredWrite(t,s){if(t>=16128&&t<16160)16128===t||16144===t?(this.writeMem(16128,s),this.writeMem(16144,s)):16132===t||16148===t?(this.writeMem(16132,s),this.writeMem(16148,s)):16136===t||16152===t?(this.writeMem(16136,s),this.writeMem(16152,s)):16140===t||16156===t?(this.writeMem(16140,s),this.writeMem(16156,s)):this.writeMem(t,s);else{if(!(t<this.vramMirrorTable.length))throw new Error(`Invalid VRAM address: ${t.toString(16)}`);this.writeMem(this.vramMirrorTable[t],s)}}triggerRendering(){this._inRendering||this.scanline>=21&&this.scanline<=260&&(this.renderFramePartially(this.lastRenderedScanline+1,this.scanline-21-this.lastRenderedScanline),this.lastRenderedScanline=this.scanline-21)}renderFramePartially(t,s){if(this._inRendering=!0,1===this.f_spVisibility&&this.renderSpritesPartially(t,s,1),1===this.f_bgVisibility){let e=t<<8,i=t+s<<8;i>61440&&(i=61440);let h=this.buffer,r=this.bgbuffer,a=this.pixrendered;for(let t=e;t<i;t++)a[t]>255&&(h[t]=r[t])}1===this.f_spVisibility&&this.renderSpritesPartially(t,s,0),this._inRendering=!1,this.validTileData=!1}renderBgScanline(t,s){let e=0===this.regS?0:256,i=0===this.regS?0:4096,h=(s<<8)-this.regFH;if(this.curNt=this.ntable1[this.cntV+this.cntV+this.cntH],this.cntHT=this.regHT,this.cntH=this.regH,this.curNt=this.ntable1[this.cntV+this.cntV+this.cntH],s<240&&s-this.cntFV>=0){let r,a,n,o,l=this.cntFV<<3,p=this.scantile,c=this.attrib,u=this.ptTile,m=this.nameTable,d=this.imgPalette,R=this.pixrendered,_=t?this.bgbuffer:this.buffer,S=this.nes.mmap;this._inRendering=!0,1===this.f_spriteSize&&S.latchAccess(8168);for(let t=0;t<32;t++){if(s>=0){let s=m[this.curNt].getTileIndex(this.cntHT,this.cntVT);if(this.validTileData){if(r=p[t],void 0===r)continue;a=r.pix,n=c[t]}else{if(r=u[e+s],void 0===r)continue;a=r.pix,n=m[this.curNt].getAttrib(this.cntHT,this.cntVT),p[t]=r,c[t]=n}let g=0,C=(t<<3)-this.regFH;if(C>-8)if(C<0&&(h-=C,g=-C),r.opaque[this.cntFV])for(;g<8;g++)_[h]=d[a[l+g]+n],R[h]|=256,h++;else for(;g<8;g++)o=a[l+g],0!==o&&(_[h]=d[o+n],R[h]|=256),h++;S.latchAccess(i+16*s+this.cntFV+8)}32===++this.cntHT&&(this.cntHT=0,this.cntH++,this.cntH%=2,this.curNt=this.ntable1[(this.cntV<<1)+this.cntH])}this._inRendering=!1,this.validTileData=!0}this.cntFV++,8===this.cntFV&&(this.cntFV=0,this.cntVT++,30===this.cntVT?(this.cntVT=0,this.cntV++,this.cntV%=2,this.curNt=this.ntable1[(this.cntV<<1)+this.cntH]):32===this.cntVT&&(this.cntVT=0),this.validTileData=!1)}renderSpritesPartially(t,s,e){if(1===this.f_spVisibility){let i=this.nes.mmap;for(let h=0;h<64;h++)if(this.bgPriority[h]===e&&this.sprX[h]>=0&&this.sprX[h]<256&&this.sprY[h]+8>=t&&this.sprY[h]<t+s)if(0===this.f_spriteSize){let e=0===this.f_spPatternTable?0:4096;this.srcy1=0,this.srcy2=8,this.sprY[h]<t&&(this.srcy1=t-this.sprY[h]-1),this.sprY[h]+8>t+s&&(this.srcy2=t+s-this.sprY[h]+1),0===this.f_spPatternTable?this.ptTile[this.sprTile[h]].render(this.buffer,0,this.srcy1,8,this.srcy2,this.sprX[h],this.sprY[h]+1,this.sprCol[h],this.sprPalette,this.horiFlip[h],this.vertFlip[h],h,this.pixrendered):this.ptTile[this.sprTile[h]+256].render(this.buffer,0,this.srcy1,8,this.srcy2,this.sprX[h],this.sprY[h]+1,this.sprCol[h],this.sprPalette,this.horiFlip[h],this.vertFlip[h],h,this.pixrendered),i.latchAccess(e+16*this.sprTile[h]+8)}else{let e=this.sprTile[h],r=1&e?4096:0,a=254&e;1&e&&(e=this.sprTile[h]-1+256);let n=0,o=8;this.sprY[h]<t&&(n=t-this.sprY[h]-1),this.sprY[h]+8>t+s&&(o=t+s-this.sprY[h]),this.ptTile[e+(this.vertFlip[h]?1:0)].render(this.buffer,0,n,8,o,this.sprX[h],this.sprY[h]+1,this.sprCol[h],this.sprPalette,this.horiFlip[h],this.vertFlip[h],h,this.pixrendered),n=0,o=8,this.sprY[h]+8<t&&(n=t-(this.sprY[h]+8+1)),this.sprY[h]+16>t+s&&(o=t+s-(this.sprY[h]+8)),this.ptTile[e+(this.vertFlip[h]?0:1)].render(this.buffer,0,n,8,o,this.sprX[h],this.sprY[h]+1+8,this.sprCol[h],this.sprPalette,this.horiFlip[h],this.vertFlip[h],h,this.pixrendered),i.latchAccess(r+16*a+8),i.latchAccess(r+16*(a+1)+8)}}}checkSprite0(t){let s;this.spr0HitX=-1,this.spr0HitY=-1;let e,i,h,r,a,n=0===this.f_spPatternTable?0:256;if(e=this.sprX[0],i=this.sprY[0]+1,0===this.f_spriteSize){if(i<=t&&i+8>t&&e>=-7&&e<256)if(h=this.ptTile[this.sprTile[0]+n],s=this.vertFlip[0]?7-(t-i):t-i,s*=8,a=256*t+e,this.horiFlip[0])for(r=7;r>=0;r--){if(e>=0&&e<256&&a>=0&&a<61440&&this.pixrendered[a]>255&&0!==h.pix[s+r])return this.spr0HitX=255&a,this.spr0HitY=t,!0;e++,a++}else for(r=0;r<8;r++){if(e>=0&&e<256&&a>=0&&a<61440&&this.pixrendered[a]>255&&0!==h.pix[s+r])return this.spr0HitX=255&a,this.spr0HitY=t,!0;e++,a++}}else if(i<=t&&i+16>t&&e>=-7&&e<256)if(s=this.vertFlip[0]?15-(t-i):t-i,s<8?h=this.ptTile[this.sprTile[0]+(this.vertFlip[0]?1:0)+(1&this.sprTile[0]?255:0)]:(h=this.ptTile[this.sprTile[0]+(this.vertFlip[0]?0:1)+(1&this.sprTile[0]?255:0)],this.vertFlip[0]?s=15-s:s-=8),s*=8,a=256*t+e,this.horiFlip[0])for(r=7;r>=0;r--){if(e>=0&&e<256&&a>=0&&a<61440&&this.pixrendered[a]>255&&0!==h.pix[s+r])return this.spr0HitX=255&a,this.spr0HitY=t,!0;e++,a++}else for(r=0;r<8;r++){if(e>=0&&e<256&&a>=0&&a<61440&&this.pixrendered[a]>255&&0!==h.pix[s+r])return this.spr0HitX=255&a,this.spr0HitY=t,!0;e++,a++}return!1}writeMem(t,s){this.vramMem[t]=s,t<8192?(this.vramMem[t]=s,this.patternWrite(t,s)):t>=8192&&t<9152?this.nameTableWrite(this.ntable1[0],t-8192,s):t>=9152&&t<9216?this.attribTableWrite(this.ntable1[0],t-9152,s):t>=9216&&t<10176?this.nameTableWrite(this.ntable1[1],t-9216,s):t>=10176&&t<10240?this.attribTableWrite(this.ntable1[1],t-10176,s):t>=10240&&t<11200?this.nameTableWrite(this.ntable1[2],t-10240,s):t>=11200&&t<11264?this.attribTableWrite(this.ntable1[2],t-11200,s):t>=11264&&t<12224?this.nameTableWrite(this.ntable1[3],t-11264,s):t>=12224&&t<12288?this.attribTableWrite(this.ntable1[3],t-12224,s):t>=16128&&t<16160&&this.updatePalettes()}updatePalettes(){let t;for(t=0;t<16;t++)0===this.f_dispType?this.imgPalette[t]=this.palTable.getEntry(63&this.vramMem[16128+t]):this.imgPalette[t]=this.palTable.getEntry(32&this.vramMem[16128+t]);for(t=0;t<16;t++)0===this.f_dispType?this.sprPalette[t]=this.palTable.getEntry(63&this.vramMem[16144+t]):this.sprPalette[t]=this.palTable.getEntry(32&this.vramMem[16144+t])}patternWrite(t,s){let e=t>>4,i=15&t;i<8?this.ptTile[e].setScanline(i,s,this.vramMem[t+8]):this.ptTile[e].setScanline(i-8,this.vramMem[t-8],s)}nameTableWrite(t,s,e){this.nameTable[t].tile[s]=e,this.checkSprite0(this.scanline-20)}attribTableWrite(t,s,e){this.nameTable[t].writeAttrib(s,e)}spriteRamWriteUpdate(t,s){let e=t>>2;switch(0===e&&this.checkSprite0(this.scanline-20),3&t){case 0:this.sprY[e]=s;break;case 1:this.sprTile[e]=s;break;case 2:this.vertFlip[e]=s>>7&1,this.horiFlip[e]=s>>6&1,this.bgPriority[e]=s>>5&1,this.sprCol[e]=(3&s)<<2;break;case 3:this.sprX[e]=s}}isPixelWhite(t,s){return this.triggerRendering(),16777215===this.nes.ppu.buffer[(s<<8)+t]}toJSON(){let t,s=h(this);for(s.nameTable=[],t=0;t<this.nameTable.length;t++)s.nameTable[t]=this.nameTable[t].toJSON();for(s.ptTile=[],t=0;t<this.ptTile.length;t++)s.ptTile[t]=this.ptTile[t].toJSON();return s}fromJSON(t){let s;for(i(this,t),s=0;s<this.nameTable.length;s++)this.nameTable[s].fromJSON(t.nameTable[s]);for(s=0;s<this.ptTile.length;s++)this.ptTile[s].fromJSON(t.ptTile[s]);for(s=0;s<this.spriteMem.length;s++)this.spriteRamWriteUpdate(s,this.spriteMem[s])}static JSON_PROPERTIES=["vramMem","spriteMem","cntFV","cntV","cntH","cntVT","cntHT","regFV","regV","regH","regVT","regHT","regFH","regS","vramAddress","vramTmpAddress","f_nmiOnVblank","f_spriteSize","f_bgPatternTable","f_spPatternTable","f_addrInc","f_nTblAddress","f_color","f_spVisibility","f_bgVisibility","f_spClipping","f_bgClipping","f_dispType","vramBufferedReadValue","firstWrite","openBusLatch","openBusDecayFrames","currentMirroring","vramMirrorTable","ntable1","sramAddress","hitSpr0","sprPalette","imgPalette","curX","scanline","lastRenderedScanline","curNt","scantile","attrib","buffer","bgbuffer","pixrendered","nmiOutput","nmiSuppressed","vblankPending","dummyCycleToggle","validTileData","scanlineAlreadyRendered"]};class m{static MODE_NORMAL=0;static MODE_LOOP=1;static MODE_IRQ=2;static JSON_PROPERTIES=["isEnabled","hasSample","irqGenerated","playMode","dmaFrequency","dmaCounter","deltaCounter","playStartAddress","playAddress","playLength","playLengthCounter","shiftCounter","reg4012","reg4013","sample","dacLsb","data","lastFetchedByte"];constructor(t){this.papu=t,this.isEnabled=!1,this.hasSample=!1,this.irqGenerated=!1,this.playMode=m.MODE_NORMAL,this.dmaFrequency=0,this.dmaCounter=0,this.deltaCounter=0,this.playStartAddress=0,this.playAddress=0,this.playLength=0,this.playLengthCounter=0,this.sample=0,this.dacLsb=0,this.shiftCounter=0,this.reg4012=0,this.reg4013=0,this.data=0,this.lastFetchedByte=0}clockDmc(){this.hasSample&&(1&this.data?this.deltaCounter<63&&this.deltaCounter++:this.deltaCounter>0&&this.deltaCounter--,this.sample=this.isEnabled?(this.deltaCounter<<1)+this.dacLsb:0,this.data>>=1),this.dmaCounter--,this.dmaCounter<=0&&(this.hasSample=!1,this.endOfSample(),this.dmaCounter=8),this.irqGenerated&&this.papu.nes.cpu.requestIrq(this.papu.nes.cpu.IRQ_NORMAL)}endOfSample(){0===this.playLengthCounter&&this.playMode===m.MODE_LOOP&&(this.playAddress=this.playStartAddress,this.playLengthCounter=this.playLength),this.playLengthCounter>0&&(this.nextSample(),0===this.playLengthCounter&&this.playMode===m.MODE_IRQ&&(this.irqGenerated=!0))}nextSample(){this.data=this.papu.nes.mmap.load(this.playAddress),this.lastFetchedByte=this.data,this.papu.nes.cpu.haltCycles(4),this.playLengthCounter--,this.playAddress++,this.playAddress>65535&&(this.playAddress=32768),this.hasSample=!0}writeReg(t,s){16400===t?(s>>6?1==(s>>6&1)?this.playMode=m.MODE_LOOP:s>>6==2&&(this.playMode=m.MODE_IRQ):this.playMode=m.MODE_NORMAL,128&s||(this.irqGenerated=!1),this.dmaFrequency=this.papu.getDmcFrequency(15&s)):16401===t?(this.deltaCounter=s>>1&63,this.dacLsb=1&s,this.sample=(this.deltaCounter<<1)+this.dacLsb):16402===t?(this.playStartAddress=s<<6|49152,this.reg4012=s):16403===t?(this.playLength=1+(s<<4),this.reg4013=s):16405===t&&(this.irqGenerated=!1,s>>4&1?0===this.playLengthCounter&&(this.playAddress=this.playStartAddress,this.playLengthCounter=this.playLength,!this.hasSample&&this.playLengthCounter>0&&(this.nextSample(),this.dmaCounter=8,this.shiftCounter=this.dmaFrequency,0===this.playLengthCounter&&this.playMode===m.MODE_IRQ&&(this.irqGenerated=!0))):this.playLengthCounter=0)}setEnabled(t){this.isEnabled=t}getLengthStatus(){return 0!==this.playLengthCounter&&this.isEnabled?1:0}getIrqStatus(){return this.irqGenerated?1:0}toJSON(){return h(this)}fromJSON(t){i(this,t)}}const d=m;const R=class{constructor(t){this.papu=t,this.progTimerCount=0,this.progTimerMax=0,this.isEnabled=!1,this.lengthCounter=0,this.lengthCounterEnable=!1,this.envDecayDisable=!1,this.envDecayLoopEnable=!1,this.envReset=!1,this.shiftNow=!1,this.envDecayRate=0,this.envDecayCounter=0,this.envVolume=0,this.masterVolume=0,this.shiftReg=1,this.randomBit=0,this.randomMode=0,this.sampleValue=0,this.tmp=0,this.accValue=0,this.accCount=1}clockLengthCounter(){this.lengthCounterEnable&&this.lengthCounter>0&&(this.lengthCounter--,0===this.lengthCounter&&this.updateSampleValue())}clockEnvDecay(){this.envReset?(this.envReset=!1,this.envDecayCounter=this.envDecayRate+1,this.envVolume=15):--this.envDecayCounter<=0&&(this.envDecayCounter=this.envDecayRate+1,this.envVolume>0?this.envVolume--:this.envVolume=this.envDecayLoopEnable?15:0),this.envDecayDisable?this.masterVolume=this.envDecayRate:this.masterVolume=this.envVolume,this.updateSampleValue()}updateSampleValue(){this.isEnabled&&this.lengthCounter>0&&(this.sampleValue=this.randomBit*this.masterVolume)}writeReg(t,s){16396===t?(this.envDecayDisable=!!(16&s),this.envDecayRate=15&s,this.envDecayLoopEnable=!!(32&s),this.lengthCounterEnable=!(32&s),this.envDecayDisable?this.masterVolume=this.envDecayRate:this.masterVolume=this.envVolume):16398===t?(this.progTimerMax=this.papu.getNoiseWaveLength(15&s),this.randomMode=s>>7):16399===t&&(this.lengthCounter=this.papu.getLengthMax(248&s),this.envReset=!0)}setEnabled(t){this.isEnabled=t,t||(this.lengthCounter=0),this.updateSampleValue()}getLengthStatus(){return 0!==this.lengthCounter&&this.isEnabled?1:0}toJSON(){return h(this)}fromJSON(t){i(this,t)}static JSON_PROPERTIES=["isEnabled","envDecayDisable","envDecayLoopEnable","lengthCounterEnable","envReset","shiftNow","lengthCounter","progTimerCount","progTimerMax","envDecayRate","envDecayCounter","envVolume","masterVolume","shiftReg","randomBit","randomMode","sampleValue","accValue","accCount","tmp"]};const _=class{constructor(t,s){this.papu=t,this.dutyLookup=[0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,0,1,1,1,1,1],this.impLookup=[1,-1,0,0,0,0,0,0,1,0,-1,0,0,0,0,0,1,0,0,0,-1,0,0,0,-1,0,1,0,0,0,0,0],this.sqr1=s,this.progTimerCount=0,this.progTimerMax=0,this.lengthCounter=0,this.squareCounter=0,this.sweepCounter=0,this.sweepCounterMax=0,this.sweepMode=0,this.sweepShiftAmount=0,this.envDecayRate=0,this.envDecayCounter=0,this.envVolume=0,this.masterVolume=0,this.dutyMode=0,this.vol=0,this.isEnabled=!1,this.lengthCounterEnable=!1,this.sweepActive=!1,this.sweepCarry=!1,this.envDecayDisable=!1,this.envDecayLoopEnable=!1,this.envReset=!1,this.updateSweepPeriod=!1,this.sweepResult=0,this.sampleValue=0}clockLengthCounter(){this.lengthCounterEnable&&this.lengthCounter>0&&(this.lengthCounter--,0===this.lengthCounter&&this.updateSampleValue())}clockEnvDecay(){this.envReset?(this.envReset=!1,this.envDecayCounter=this.envDecayRate+1,this.envVolume=15):--this.envDecayCounter<=0&&(this.envDecayCounter=this.envDecayRate+1,this.envVolume>0?this.envVolume--:this.envVolume=this.envDecayLoopEnable?15:0),this.envDecayDisable?this.masterVolume=this.envDecayRate:this.masterVolume=this.envVolume,this.updateSampleValue()}clockSweep(){--this.sweepCounter<=0&&(this.sweepCounter=this.sweepCounterMax+1,this.sweepActive&&this.sweepShiftAmount>0&&this.progTimerMax>7&&(this.sweepCarry=!1,0===this.sweepMode?(this.progTimerMax+=this.progTimerMax>>this.sweepShiftAmount,this.progTimerMax>4095&&(this.progTimerMax=4095,this.sweepCarry=!0)):this.progTimerMax=this.progTimerMax-((this.progTimerMax>>this.sweepShiftAmount)-(this.sqr1?1:0)))),this.updateSweepPeriod&&(this.updateSweepPeriod=!1,this.sweepCounter=this.sweepCounterMax+1)}updateSampleValue(){this.isEnabled&&this.lengthCounter>0&&this.progTimerMax>7?0===this.sweepMode&&this.progTimerMax+(this.progTimerMax>>this.sweepShiftAmount)>4095?this.sampleValue=0:this.sampleValue=this.masterVolume*this.dutyLookup[(this.dutyMode<<3)+this.squareCounter]:this.sampleValue=0}writeReg(t,s){let e=this.sqr1?0:4;t===16384+e?(this.envDecayDisable=!!(16&s),this.envDecayRate=15&s,this.envDecayLoopEnable=!!(32&s),this.dutyMode=s>>6&3,this.lengthCounterEnable=!(32&s),this.envDecayDisable?this.masterVolume=this.envDecayRate:this.masterVolume=this.envVolume,this.updateSampleValue()):t===16385+e?(this.sweepActive=!!(128&s),this.sweepCounterMax=s>>4&7,this.sweepMode=s>>3&1,this.sweepShiftAmount=7&s,this.updateSweepPeriod=!0):t===16386+e?(this.progTimerMax&=1792,this.progTimerMax|=s):t===16387+e&&(this.progTimerMax&=255,this.progTimerMax|=(7&s)<<8,this.isEnabled&&(this.lengthCounter=this.papu.getLengthMax(248&s)),this.envReset=!0)}setEnabled(t){this.isEnabled=t,t||(this.lengthCounter=0),this.updateSampleValue()}getLengthStatus(){return 0!==this.lengthCounter&&this.isEnabled?1:0}toJSON(){return h(this)}fromJSON(t){i(this,t)}static JSON_PROPERTIES=["isEnabled","lengthCounterEnable","sweepActive","envDecayDisable","envDecayLoopEnable","envReset","sweepCarry","updateSweepPeriod","progTimerCount","progTimerMax","lengthCounter","squareCounter","sweepCounter","sweepCounterMax","sweepMode","sweepShiftAmount","envDecayRate","envDecayCounter","envVolume","masterVolume","dutyMode","sweepResult","sampleValue","vol"]};const S=class{constructor(t){this.papu=t,this.progTimerCount=0,this.progTimerMax=0,this.triangleCounter=0,this.isEnabled=!1,this.sampleCondition=!1,this.lengthCounter=0,this.lengthCounterEnable=!1,this.linearCounter=0,this.lcLoadValue=0,this.lcHalt=!0,this.lcControl=!1,this.tmp=0,this.sampleValue=15}clockLengthCounter(){this.lengthCounterEnable&&this.lengthCounter>0&&(this.lengthCounter--,0===this.lengthCounter&&this.updateSampleCondition())}clockLinearCounter(){this.lcHalt?(this.linearCounter=this.lcLoadValue,this.updateSampleCondition()):this.linearCounter>0&&(this.linearCounter--,this.updateSampleCondition()),this.lcControl||(this.lcHalt=!1)}getLengthStatus(){return 0!==this.lengthCounter&&this.isEnabled?1:0}readReg(t){return 0}writeReg(t,s){16392===t?(this.lcControl=!!(128&s),this.lcLoadValue=127&s,this.lengthCounterEnable=!this.lcControl):16394===t?(this.progTimerMax&=1792,this.progTimerMax|=s):16395===t&&(this.progTimerMax&=255,this.progTimerMax|=(7&s)<<8,this.lengthCounter=this.papu.getLengthMax(248&s),this.lcHalt=!0),this.updateSampleCondition()}clockProgrammableTimer(t){if(this.progTimerMax>0)for(this.progTimerCount+=t;this.progTimerMax>0&&this.progTimerCount>=this.progTimerMax;)this.progTimerCount-=this.progTimerMax,this.isEnabled&&this.lengthCounter>0&&this.linearCounter>0&&this.clockTriangleGenerator()}clockTriangleGenerator(){this.triangleCounter++,this.triangleCounter&=31}setEnabled(t){this.isEnabled=t,t||(this.lengthCounter=0),this.updateSampleCondition()}updateSampleCondition(){this.sampleCondition=this.isEnabled&&this.progTimerMax>7&&this.linearCounter>0&&this.lengthCounter>0}toJSON(){return h(this)}fromJSON(t){i(this,t)}static JSON_PROPERTIES=["isEnabled","sampleCondition","lengthCounterEnable","lcHalt","lcControl","progTimerCount","progTimerMax","triangleCounter","lengthCounter","linearCounter","lcLoadValue","sampleValue","tmp"]},g=[7457,14913,22371,29829],C=[7457,14913,22371,29829,37281];const A=class{constructor(t){this.nes=t,this.square1=new _(this,!0),this.square2=new _(this,!1),this.triangle=new S(this),this.noise=new R(this),this.dmc=new d(this),this.startedPlaying=!1,this.recordOutput=!1,this.triValue=0,this.prevSampleL=0,this.prevSampleR=0,this.smpAccumL=0,this.smpAccumR=0,this.dacRange=0,this.dcValue=0,this.masterVolume=256,this.panning=[80,170,100,150,128],this.setPanning(this.panning),this.initLengthLookup(),this.initDmcFrequencyLookup(),this.initNoiseWavelengthLookup(),this.initDACtables();for(let t=0;t<20;t++)16===t?this.writeReg(16400,16):this.writeReg(16384+t,0);this.sampleRate=this.nes.opts.sampleRate,this.sampleTimerMax=Math.floor(1832727040/this.sampleRate),this.sampleTimer=0,this.updateChannelEnable(0),this.frameCycleCounter=0,this.frameStep=0,this.countSequence=0,this.sampleCount=0,this.frameIrqEnabled=!1,this.frameIrqActive=!1,this.accCount=0,this.smpSquare1=0,this.smpSquare2=0,this.smpTriangle=0,this.smpDmc=0,this.channelEnableValue=255,this.extraCycles=0,this.maxSample=-5e5,this.minSample=5e5}readReg(t){let s=0;return s|=this.square1.getLengthStatus(),s|=this.square2.getLengthStatus()<<1,s|=this.triangle.getLengthStatus()<<2,s|=this.noise.getLengthStatus()<<3,s|=this.dmc.getLengthStatus()<<4,s|=32&this.nes.cpu.dataBus,s|=(this.frameIrqActive?1:0)<<6,s|=this.dmc.getIrqStatus()<<7,this.frameIrqActive=!1,255&s}writeReg(t,s){t>=16384&&t<16388?this.square1.writeReg(t,s):t>=16388&&t<16392?this.square2.writeReg(t,s):t>=16392&&t<16396?this.triangle.writeReg(t,s):t>=16396&&t<=16399?this.noise.writeReg(t,s):16400===t||16401===t||16402===t||16403===t?this.dmc.writeReg(t,s):16405===t?(this.updateChannelEnable(s),this.dmc.writeReg(t,s)):16407===t&&(this.countSequence=s>>7&1,this.frameCycleCounter=-6,this.frameStep=0,64&s?(this.frameIrqEnabled=!1,this.frameIrqActive=!1):this.frameIrqEnabled=!0,1===this.countSequence&&(this.clockQuarterFrame(),this.clockHalfFrame()))}updateChannelEnable(t){this.channelEnableValue=65535&t,this.square1.setEnabled(!!(1&t)),this.square2.setEnabled(!!(2&t)),this.triangle.setEnabled(!!(4&t)),this.noise.setEnabled(!!(8&t)),this.dmc.setEnabled(!!(16&t))}clockFrameCounter(t,s){let e=t-(s||0);t+=this.extraCycles;let i=this.sampleTimerMax-this.sampleTimer;t<<10>i?(this.extraCycles=(t<<10)-i>>10,t-=this.extraCycles):this.extraCycles=0;let h=this.dmc,r=this.triangle,a=this.square1,n=this.square2,o=this.noise;if(h.isEnabled)for(h.shiftCounter-=t<<3;h.shiftCounter<=0&&h.dmaFrequency>0;)h.shiftCounter+=h.dmaFrequency,h.clockDmc();if(r.progTimerMax>0)for(r.progTimerCount-=t;r.progTimerCount<=0;)r.progTimerCount+=r.progTimerMax+1,r.linearCounter>0&&r.lengthCounter>0&&(r.triangleCounter++,r.triangleCounter&=31,r.isEnabled&&(r.triangleCounter>=16?r.sampleValue=15&r.triangleCounter:r.sampleValue=15-(15&r.triangleCounter),r.sampleValue<<=4));a.progTimerCount-=t,a.progTimerCount<=0&&(a.progTimerCount+=a.progTimerMax+1<<1,a.squareCounter++,a.squareCounter&=7,a.updateSampleValue()),n.progTimerCount-=t,n.progTimerCount<=0&&(n.progTimerCount+=n.progTimerMax+1<<1,n.squareCounter++,n.squareCounter&=7,n.updateSampleValue());let l=t;if(o.progTimerCount-l>0)o.progTimerCount-=l,o.accCount+=l,o.accValue+=l*o.sampleValue;else for(;l-- >0;)--o.progTimerCount<=0&&o.progTimerMax>0&&(o.shiftReg<<=1,o.tmp=32768&(o.shiftReg<<(0===o.randomMode?1:6)^o.shiftReg),0!==o.tmp?(o.shiftReg|=1,o.randomBit=0,o.sampleValue=0):(o.randomBit=1,o.isEnabled&&o.lengthCounter>0?o.sampleValue=o.masterVolume:o.sampleValue=0),o.progTimerCount+=o.progTimerMax),o.accValue+=o.sampleValue,o.accCount++;this.frameIrqEnabled&&this.frameIrqActive&&this.nes.cpu.requestIrq(this.nes.cpu.IRQ_NORMAL),this.frameCycleCounter+=e;let p=0===this.countSequence?g:C,c=0===this.countSequence?29830:37282;for(;this.frameCycleCounter>=p[this.frameStep];)this.fireFrameStep(this.frameStep),this.frameStep++,this.frameStep>=p.length&&(this.frameStep=0,this.frameCycleCounter-=c);this.accSample(t),this.sampleTimer+=t<<10,this.sampleTimer>=this.sampleTimerMax&&(this.sample(),this.sampleTimer-=this.sampleTimerMax)}advanceFrameCounter(t){this.frameCycleCounter+=t;let s=0===this.countSequence?g:C,e=0===this.countSequence?29830:37282;for(;this.frameCycleCounter>=s[this.frameStep];)this.fireFrameStep(this.frameStep),this.frameStep++,this.frameStep>=s.length&&(this.frameStep=0,this.frameCycleCounter-=e)}accSample(t){this.triangle.sampleCondition&&(this.triValue=Math.floor((this.triangle.progTimerCount<<4)/(this.triangle.progTimerMax+1)),this.triValue>16&&(this.triValue=16),this.triangle.triangleCounter>=16&&(this.triValue=16-this.triValue),this.triValue+=this.triangle.sampleValue),2===t?(this.smpTriangle+=this.triValue<<1,this.smpDmc+=this.dmc.sample<<1,this.smpSquare1+=this.square1.sampleValue<<1,this.smpSquare2+=this.square2.sampleValue<<1,this.accCount+=2):4===t?(this.smpTriangle+=this.triValue<<2,this.smpDmc+=this.dmc.sample<<2,this.smpSquare1+=this.square1.sampleValue<<2,this.smpSquare2+=this.square2.sampleValue<<2,this.accCount+=4):(this.smpTriangle+=t*this.triValue,this.smpDmc+=t*this.dmc.sample,this.smpSquare1+=t*this.square1.sampleValue,this.smpSquare2+=t*this.square2.sampleValue,this.accCount+=t)}fireFrameStep(t){if(0===this.countSequence)switch(t){case 0:case 2:this.clockQuarterFrame();break;case 1:this.clockQuarterFrame(),this.clockHalfFrame();break;case 3:this.clockQuarterFrame(),this.clockHalfFrame(),this.frameIrqEnabled&&(this.frameIrqActive=!0)}else switch(t){case 0:case 2:this.clockQuarterFrame();break;case 1:case 4:this.clockQuarterFrame(),this.clockHalfFrame()}}clockQuarterFrame(){this.square1.clockEnvDecay(),this.square2.clockEnvDecay(),this.noise.clockEnvDecay(),this.triangle.clockLinearCounter()}clockHalfFrame(){this.triangle.clockLengthCounter(),this.square1.clockLengthCounter(),this.square2.clockLengthCounter(),this.noise.clockLengthCounter(),this.square1.clockSweep(),this.square2.clockSweep()}sample(){let t,s;this.accCount>0?(this.smpSquare1<<=4,this.smpSquare1=Math.floor(this.smpSquare1/this.accCount),this.smpSquare2<<=4,this.smpSquare2=Math.floor(this.smpSquare2/this.accCount),this.smpTriangle=Math.floor(this.smpTriangle/this.accCount),this.smpDmc<<=4,this.smpDmc=Math.floor(this.smpDmc/this.accCount),this.accCount=0):(this.smpSquare1=this.square1.sampleValue<<4,this.smpSquare2=this.square2.sampleValue<<4,this.smpTriangle=this.triangle.sampleValue,this.smpDmc=this.dmc.sample<<4);let e=Math.floor((this.noise.accValue<<4)/this.noise.accCount);this.noise.accValue=e>>4,this.noise.accCount=1,t=this.smpSquare1*this.stereoPosLSquare1+this.smpSquare2*this.stereoPosLSquare2>>8,s=3*this.smpTriangle*this.stereoPosLTriangle+(e<<1)*this.stereoPosLNoise+this.smpDmc*this.stereoPosLDMC>>8,t>=this.square_table.length&&(t=this.square_table.length-1),s>=this.tnd_table.length&&(s=this.tnd_table.length-1);let i=this.square_table[t]+this.tnd_table[s]-this.dcValue;t=this.smpSquare1*this.stereoPosRSquare1+this.smpSquare2*this.stereoPosRSquare2>>8,s=3*this.smpTriangle*this.stereoPosRTriangle+(e<<1)*this.stereoPosRNoise+this.smpDmc*this.stereoPosRDMC>>8,t>=this.square_table.length&&(t=this.square_table.length-1),s>=this.tnd_table.length&&(s=this.tnd_table.length-1);let h=this.square_table[t]+this.tnd_table[s]-this.dcValue,r=i-this.prevSampleL;this.prevSampleL+=r,this.smpAccumL+=r-(this.smpAccumL>>10),i=this.smpAccumL;let a=h-this.prevSampleR;this.prevSampleR+=a,this.smpAccumR+=a-(this.smpAccumR>>10),h=this.smpAccumR,i>this.maxSample&&(this.maxSample=i),i<this.minSample&&(this.minSample=i),this.nes.opts.onAudioSample&&this.nes.opts.onAudioSample(i/32768,h/32768),this.smpSquare1=0,this.smpSquare2=0,this.smpTriangle=0,this.smpDmc=0}getLengthMax(t){return this.lengthLookup[t>>3]}getDmcFrequency(t){return t>=0&&t<16?this.dmcFreqLookup[t]:0}getNoiseWaveLength(t){return t>=0&&t<16?this.noiseWavelengthLookup[t]:0}setFrameRate(t){this.sampleTimerMax=Math.floor(1832727040*t/(60*this.sampleRate))}setPanning(t){for(let s=0;s<5;s++)this.panning[s]=t[s];this.updateStereoPos()}setMasterVolume(t){t<0&&(t=0),t>256&&(t=256),this.masterVolume=t,this.updateStereoPos()}updateStereoPos(){this.stereoPosLSquare1=this.panning[0]*this.masterVolume>>8,this.stereoPosLSquare2=this.panning[1]*this.masterVolume>>8,this.stereoPosLTriangle=this.panning[2]*this.masterVolume>>8,this.stereoPosLNoise=this.panning[3]*this.masterVolume>>8,this.stereoPosLDMC=this.panning[4]*this.masterVolume>>8,this.stereoPosRSquare1=this.masterVolume-this.stereoPosLSquare1,this.stereoPosRSquare2=this.masterVolume-this.stereoPosLSquare2,this.stereoPosRTriangle=this.masterVolume-this.stereoPosLTriangle,this.stereoPosRNoise=this.masterVolume-this.stereoPosLNoise,this.stereoPosRDMC=this.masterVolume-this.stereoPosLDMC}initLengthLookup(){this.lengthLookup=[10,254,20,2,40,4,80,6,160,8,60,10,14,12,26,14,12,16,24,18,48,20,96,22,192,24,72,26,16,28,32,30]}initDmcFrequencyLookup(){this.dmcFreqLookup=new Array(16),this.dmcFreqLookup[0]=3424,this.dmcFreqLookup[1]=3040,this.dmcFreqLookup[2]=2720,this.dmcFreqLookup[3]=2560,this.dmcFreqLookup[4]=2288,this.dmcFreqLookup[5]=2032,this.dmcFreqLookup[6]=1808,this.dmcFreqLookup[7]=1712,this.dmcFreqLookup[8]=1520,this.dmcFreqLookup[9]=1280,this.dmcFreqLookup[10]=1136,this.dmcFreqLookup[11]=1024,this.dmcFreqLookup[12]=848,this.dmcFreqLookup[13]=672,this.dmcFreqLookup[14]=576,this.dmcFreqLookup[15]=432}initNoiseWavelengthLookup(){this.noiseWavelengthLookup=new Array(16),this.noiseWavelengthLookup[0]=4,this.noiseWavelengthLookup[1]=8,this.noiseWavelengthLookup[2]=16,this.noiseWavelengthLookup[3]=32,this.noiseWavelengthLookup[4]=64,this.noiseWavelengthLookup[5]=96,this.noiseWavelengthLookup[6]=128,this.noiseWavelengthLookup[7]=160,this.noiseWavelengthLookup[8]=202,this.noiseWavelengthLookup[9]=254,this.noiseWavelengthLookup[10]=380,this.noiseWavelengthLookup[11]=508,this.noiseWavelengthLookup[12]=762,this.noiseWavelengthLookup[13]=1016,this.noiseWavelengthLookup[14]=2034,this.noiseWavelengthLookup[15]=4068}initDACtables(){let t,s,e,i=0,h=0;for(this.square_table=new Array(512),this.tnd_table=new Array(3264),e=0;e<512;e++)t=95.52/(8128/(e/16)+100),t*=.98411,t*=5e4,s=Math.floor(t),this.square_table[e]=s,s>i&&(i=s);for(e=0;e<3264;e++)t=163.67/(24329/(e/16)+100),t*=.98411,t*=5e4,s=Math.floor(t),this.tnd_table[e]=s,s>h&&(h=s);this.dacRange=i+h,this.dcValue=this.dacRange/2}toJSON(){let t=h(this);return t.dmc=this.dmc.toJSON(),t.noise=this.noise.toJSON(),t.square1=this.square1.toJSON(),t.square2=this.square2.toJSON(),t.triangle=this.triangle.toJSON(),t}fromJSON(t){i(this,t),this.dmc.fromJSON(t.dmc),this.noise.fromJSON(t.noise),this.square1.fromJSON(t.square1),this.square2.fromJSON(t.square2),this.triangle.fromJSON(t.triangle)}static JSON_PROPERTIES=["channelEnableValue","sampleRate","frameIrqEnabled","frameIrqActive","startedPlaying","recordOutput","frameCycleCounter","frameStep","countSequence","sampleTimer","sampleTimerMax","sampleCount","triValue","smpSquare1","smpSquare2","smpTriangle","smpDmc","accCount","prevSampleL","prevSampleR","smpAccumL","smpAccumR","masterVolume","stereoPosLSquare1","stereoPosLSquare2","stereoPosLTriangle","stereoPosLNoise","stereoPosLDMC","stereoPosRSquare1","stereoPosRSquare2","stereoPosRTriangle","stereoPosRNoise","stereoPosRDMC","extraCycles","maxSample","minSample","panning"]},D="APZLGITYEOXUKSVN";function N(t){return D.indexOf(t)}function I(t){return D[t]}function b(t,s){const e=t.toString(16);return"0000".substring(0,s-e.length)+e}const E=class{constructor(){this.patches=[],this.enabled=!0,this.onChange=null}setEnabled(t){this.enabled=t,this.onChange&&this.onChange()}addCode(t){this.patches.push(this.decode(t)),this.onChange&&this.onChange()}addPatch(t,s,e){this.patches.push({addr:t,value:s,key:e}),this.onChange&&this.onChange()}removeAllCodes(){this.patches=[],this.onChange&&this.onChange()}applyCodes(t,s){if(!this.enabled)return s;for(let e=0;e<this.patches.length;++e)if(this.patches[e].addr===(32767&t)&&(void 0===this.patches[e].key||this.patches[e].key===s))return this.patches[e].value;return s}decode(t){if(t.includes(":"))return this.decodeHex(t);const s=t.toUpperCase().split("").map(N);let e=((8&s[0])<<4)+((7&s[1])<<4)+(7&s[0]);const i=((7&s[3])<<12)+((8&s[4])<<8)+((7&s[5])<<8)+((8&s[1])<<4)+((7&s[2])<<4)+(8&s[3])+(7&s[4]);let h;8===s.length?(e+=8&s[7],h=((8&s[6])<<4)+((7&s[7])<<4)+(8&s[5])+(7&s[6])):e+=8&s[5];return{value:e,addr:i,wantskey:!!(s[2]>>3),key:h}}encodeHex(t,s,e,i){let h=b(t,4)+":"+b(s,2);return(void 0!==e||i)&&(h+="?"),void 0!==e&&(h+=b(e,2)),h}decodeHex(t){const s=t.match(/([0-9a-fA-F]+):([0-9a-fA-F]+)(\?[0-9a-fA-F]*)?/);if(!s)return null;const e=parseInt(s[1],16);return{value:parseInt(s[2],16),addr:e,wantskey:void 0!==s[3],key:void 0!==s[3]&&s[3].length>1?parseInt(s[3].substring(1),16):void 0}}encode(t,s,e,i){const h=Array(6);h[0]=(7&s)+(s>>4&8),h[1]=(s>>4&7)+(t>>4&8),h[2]=t>>4&7,h[3]=(t>>12)+(8&t),h[4]=(7&t)+(t>>8&8),h[5]=t>>8&7,void 0===e?(h[5]+=8&s,i&&(h[2]+=8)):(h[2]+=8,h[5]+=8&e,h[6]=(7&e)+(e>>4&8),h[7]=(e>>4&7)+(8&s));return h.map(I).join("")}};const O=class{static mapperName="NROM";constructor(t){this.nes=t,this.joy1StrobeState=0,this.joy2StrobeState=0,this.joypadLastWrite=0,this.zapperFired=!1,this.zapperX=null,this.zapperY=null}write(t,s){t<8192?this.nes.cpu.mem[2047&t]=s:t>=32768||(t>=24576?(this.nes.cpu.mem[t]=s,this.nes.opts.onBatteryRamWrite(t,s)):t>16407?this.nes.cpu.mem[t]=s:t>8199&&t<16384?this.regWrite(8192+(7&t),s):this.regWrite(t,s))}writelow(t,s){t<8192?this.nes.cpu.mem[2047&t]=s:t>=32768||(t>16407?this.nes.cpu.mem[t]=s:t>8199&&t<16384?this.regWrite(8192+(7&t),s):this.regWrite(t,s))}load(t){return(t&=65535)>16407?t<24576?this.nes.cpu.dataBus:this.nes.cpu.mem[t]:t>=8192?this.regLoad(t):this.nes.cpu.mem[2047&t]}regLoad(t){switch(t>>12){case 0:case 1:break;case 2:case 3:switch(7&t){case 0:case 1:case 3:case 5:case 6:return this.nes.ppu.openBusLatch;case 2:return this.nes.ppu.readStatusRegister();case 4:return this.nes.ppu.sramLoad();case 7:return this.nes.ppu.vramLoad()}break;case 4:switch(t-16405){case 0:return this.nes.papu.readReg(t);case 1:return 31&this.joy1Read()|224&this.nes.cpu.dataBus;case 2:{let t=0;return null!==this.zapperX&&null!==this.zapperY&&(this.nes.ppu.isPixelWhite(this.zapperX,this.zapperY)||(t=8)),this.zapperFired&&(t|=16),31&(this.joy2Read()|t)|224&this.nes.cpu.dataBus}}}let s=this.nes.cpu;if(s._dmcFetchCycles>0&&s._dmcFetchCycles===s.instrBusCycles+1){let t=this.nes.papu.dmc;if(t&&t.isEnabled)return t.lastFetchedByte}return s.dataBus}regWrite(t,s){switch(t>=8192&&t<=16383&&(this.nes.ppu.openBusLatch=s,this.nes.ppu.openBusDecayFrames=36),t){case 8192:this.nes.cpu.mem[t]=s,this.nes.ppu.updateControlReg1(s);break;case 8193:this.nes.cpu.mem[t]=s,this.nes.ppu.updateControlReg2(s);break;case 8195:this.nes.ppu.writeSRAMAddress(s);break;case 8196:this.nes.ppu.sramWrite(s);break;case 8197:this.nes.ppu.scrollWrite(s);break;case 8198:this.nes.ppu.writeVRAMAddress(s);break;case 8199:this.nes.ppu.vramWrite(s);break;case 16404:this.nes.ppu.sramDMA(s);break;case 16405:case 16407:this.nes.papu.writeReg(t,s);break;case 16406:1&s||1&~this.joypadLastWrite||(this.joy1StrobeState=0,this.joy2StrobeState=0),this.joypadLastWrite=s;break;default:t>=16384&&t<=16407&&this.nes.papu.writeReg(t,s)}}joy1Read(){if(1&this.joypadLastWrite)return this.nes.controllers[1].state[0];let t;return t=this.joy1StrobeState<8?this.nes.controllers[1].state[this.joy1StrobeState]:1,this.joy1StrobeState++,24===this.joy1StrobeState&&(this.joy1StrobeState=0),t}joy2Read(){if(1&this.joypadLastWrite)return this.nes.controllers[2].state[0];let t;return t=this.joy2StrobeState<8?this.nes.controllers[2].state[this.joy2StrobeState]:1,this.joy2StrobeState++,24===this.joy2StrobeState&&(this.joy2StrobeState=0),t}loadROM(){if(!this.nes.rom.valid||this.nes.rom.romCount<1)throw new Error("NoMapper: Invalid ROM! Unable to load.");this.loadPRGROM(),this.loadCHRROM(),this.loadBatteryRam(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}loadPRGROM(){this.nes.rom.romCount>1?(this.loadRomBank(0,32768),this.loadRomBank(1,49152)):(this.loadRomBank(0,32768),this.loadRomBank(0,49152))}loadCHRROM(){this.nes.rom.vromCount>0&&(1===this.nes.rom.vromCount?(this.loadVromBank(0,0),this.loadVromBank(0,4096)):(this.loadVromBank(0,0),this.loadVromBank(1,4096)))}loadBatteryRam(){if(this.nes.rom.batteryRam){let t=this.nes.rom.batteryRam;null!==t&&8192===t.length&&e(t,0,this.nes.cpu.mem,24576,8192)}}loadRomBank(t,s){t%=this.nes.rom.romCount,e(this.nes.rom.rom[t],0,this.nes.cpu.mem,s,16384)}loadVromBank(t,s){if(0===this.nes.rom.vromCount)return;this.nes.ppu.triggerRendering(),e(this.nes.rom.vrom[t%this.nes.rom.vromCount],0,this.nes.ppu.vramMem,s,4096),e(this.nes.rom.vromTile[t%this.nes.rom.vromCount],0,this.nes.ppu.ptTile,s>>4,256)}load32kRomBank(t,s){this.loadRomBank(2*t%this.nes.rom.romCount,s),this.loadRomBank((2*t+1)%this.nes.rom.romCount,s+16384)}load8kVromBank(t,s){0!==this.nes.rom.vromCount&&(this.nes.ppu.triggerRendering(),this.loadVromBank(t%this.nes.rom.vromCount,s),this.loadVromBank((t+1)%this.nes.rom.vromCount,s+4096))}load1kVromBank(t,s){if(0===this.nes.rom.vromCount)return;this.nes.ppu.triggerRendering();let i=Math.floor(t/4)%this.nes.rom.vromCount,h=t%4*1024;e(this.nes.rom.vrom[i],h,this.nes.ppu.vramMem,s,1024);let r=this.nes.rom.vromTile[i],a=s>>4;for(let s=0;s<64;s++)this.nes.ppu.ptTile[a+s]=r[(t%4<<6)+s]}load2kVromBank(t,s){if(0===this.nes.rom.vromCount)return;this.nes.ppu.triggerRendering();let i=Math.floor(t/2)%this.nes.rom.vromCount,h=t%2*2048;e(this.nes.rom.vrom[i],h,this.nes.ppu.vramMem,s,2048);let r=this.nes.rom.vromTile[i],a=s>>4;for(let s=0;s<128;s++)this.nes.ppu.ptTile[a+s]=r[(t%2<<7)+s]}load8kRomBank(t,s){let i=Math.floor(t/2)%this.nes.rom.romCount,h=t%2*8192;e(this.nes.rom.rom[i],h,this.nes.cpu.mem,s,8192)}canWriteChr(t){return 0===this.nes.rom.vromCount}clockIrqCounter(){}latchAccess(t){}toJSON(){return{joy1StrobeState:this.joy1StrobeState,joy2StrobeState:this.joy2StrobeState,joypadLastWrite:this.joypadLastWrite}}fromJSON(t){this.joy1StrobeState=t.joy1StrobeState,this.joy2StrobeState=t.joy2StrobeState,this.joypadLastWrite=t.joypadLastWrite}};const T=class extends O{static mapperName="MMC1";constructor(t){super(t),this.regBuffer=0,this.regBufferCounter=0,this.mirroring=0,this.oneScreenMirroring=0,this.prgSwitchingArea=1,this.prgSwitchingSize=1,this.vromSwitchingSize=0,this.romSelectionReg0=0,this.romSelectionReg1=0,this.romBankSelect=0}write(t,s){t<32768?super.write(t,s):128&s?(this.regBufferCounter=0,this.regBuffer=0,0===this.getRegNumber(t)&&(this.prgSwitchingArea=1,this.prgSwitchingSize=1)):(this.regBuffer=this.regBuffer&255-(1<<this.regBufferCounter)|(1&s)<<this.regBufferCounter,this.regBufferCounter++,5===this.regBufferCounter&&(this.setReg(this.getRegNumber(t),this.regBuffer),this.regBuffer=0,this.regBufferCounter=0))}setReg(t,s){let e;switch(t){case 0:e=3&s,e!==this.mirroring&&(this.mirroring=e,2&this.mirroring?1&this.mirroring?this.nes.ppu.setMirroring(this.nes.rom.HORIZONTAL_MIRRORING):this.nes.ppu.setMirroring(this.nes.rom.VERTICAL_MIRRORING):this.nes.ppu.setMirroring(this.nes.rom.SINGLESCREEN_MIRRORING)),this.prgSwitchingArea=s>>2&1,this.prgSwitchingSize=s>>3&1,this.vromSwitchingSize=s>>4&1;break;case 1:this.romSelectionReg0=s>>4&1,this.nes.rom.vromCount>0&&(0===this.vromSwitchingSize?0===this.romSelectionReg0?this.load8kVromBank(15&s,0):this.load8kVromBank(Math.floor(this.nes.rom.vromCount/2)+(15&s),0):0===this.romSelectionReg0?this.loadVromBank(15&s,0):this.loadVromBank(Math.floor(this.nes.rom.vromCount/2)+(15&s),0));break;case 2:this.romSelectionReg1=s>>4&1,this.nes.rom.vromCount>0&&1===this.vromSwitchingSize&&(0===this.romSelectionReg1?this.loadVromBank(15&s,4096):this.loadVromBank(Math.floor(this.nes.rom.vromCount/2)+(15&s),4096));break;default:{let t,e=0;this.nes.rom.romCount>=32?0===this.vromSwitchingSize?1===this.romSelectionReg0&&(e=16):e=(this.romSelectionReg0|this.romSelectionReg1<<1)<<3:this.nes.rom.romCount>=16&&1===this.romSelectionReg0&&(e=8),0===this.prgSwitchingSize?(t=e+(15&s),this.load32kRomBank(t,32768)):(t=2*e+(15&s),0===this.prgSwitchingArea?this.loadRomBank(t,49152):this.loadRomBank(t,32768))}}}getRegNumber(t){return t>=32768&&t<=40959?0:t>=40960&&t<=49151?1:t>=49152&&t<=57343?2:3}loadROM(){if(!this.nes.rom.valid)throw new Error("MMC1: Invalid ROM! Unable to load.");this.loadRomBank(0,32768),this.loadRomBank(this.nes.rom.romCount-1,49152),this.loadCHRROM(),this.loadBatteryRam(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}switchLowHighPrgRom(t){}switch16to32(){}switch32to16(){}toJSON(){let t=super.toJSON();return t.mirroring=this.mirroring,t.oneScreenMirroring=this.oneScreenMirroring,t.prgSwitchingArea=this.prgSwitchingArea,t.prgSwitchingSize=this.prgSwitchingSize,t.vromSwitchingSize=this.vromSwitchingSize,t.romSelectionReg0=this.romSelectionReg0,t.romSelectionReg1=this.romSelectionReg1,t.romBankSelect=this.romBankSelect,t.regBuffer=this.regBuffer,t.regBufferCounter=this.regBufferCounter,t}fromJSON(t){super.fromJSON(t),this.mirroring=t.mirroring,this.oneScreenMirroring=t.oneScreenMirroring,this.prgSwitchingArea=t.prgSwitchingArea,this.prgSwitchingSize=t.prgSwitchingSize,this.vromSwitchingSize=t.vromSwitchingSize,this.romSelectionReg0=t.romSelectionReg0,this.romSelectionReg1=t.romSelectionReg1,this.romBankSelect=t.romBankSelect,this.regBuffer=t.regBuffer,this.regBufferCounter=t.regBufferCounter}};const f=class extends O{static mapperName="UxROM";constructor(t){super(t)}write(t,s){t<32768?super.write(t,s):this.loadRomBank(s,32768)}loadROM(){if(!this.nes.rom.valid)throw new Error("UNROM: Invalid ROM! Unable to load.");this.loadRomBank(0,32768),this.loadRomBank(this.nes.rom.romCount-1,49152),this.loadCHRROM(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}};const k=class extends O{static mapperName="CNROM";constructor(t){super(t)}write(t,s){if(t<32768)super.write(t,s);else{let t=s%(this.nes.rom.vromCount/2)*2;this.loadVromBank(t,0),this.loadVromBank(t+1,4096),this.load8kVromBank(2*s,0)}}};class B extends O{static mapperName="MMC3";static CMD_SEL_2_1K_VROM_0000=0;static CMD_SEL_2_1K_VROM_0800=1;static CMD_SEL_1K_VROM_1000=2;static CMD_SEL_1K_VROM_1400=3;static CMD_SEL_1K_VROM_1800=4;static CMD_SEL_1K_VROM_1C00=5;static CMD_SEL_ROM_PAGE1=6;static CMD_SEL_ROM_PAGE2=7;constructor(t){super(t),this.command=0,this.prgAddressSelect=0,this.chrAddressSelect=0,this.pageNumber=0,this.irqCounter=0,this.irqLatchValue=0,this.irqEnable=0,this.prgAddressChanged=!1}write(t,s){if(t<32768)super.write(t,s);else switch(t){case 32768:{this.command=7&s;const t=s>>6&1;t!==this.prgAddressSelect&&(this.prgAddressChanged=!0),this.prgAddressSelect=t,this.chrAddressSelect=s>>7&1;break}case 32769:this.executeCommand(this.command,s);break;case 40960:1&s?this.nes.ppu.setMirroring(this.nes.rom.HORIZONTAL_MIRRORING):this.nes.ppu.setMirroring(this.nes.rom.VERTICAL_MIRRORING);break;case 40961:break;case 49152:this.irqCounter=s;break;case 49153:this.irqLatchValue=s;break;case 57344:this.irqEnable=0;break;case 57345:this.irqEnable=1}}executeCommand(t,s){switch(t){case B.CMD_SEL_2_1K_VROM_0000:0===this.chrAddressSelect?(this.load1kVromBank(s,0),this.load1kVromBank(s+1,1024)):(this.load1kVromBank(s,4096),this.load1kVromBank(s+1,5120));break;case B.CMD_SEL_2_1K_VROM_0800:0===this.chrAddressSelect?(this.load1kVromBank(s,2048),this.load1kVromBank(s+1,3072)):(this.load1kVromBank(s,6144),this.load1kVromBank(s+1,7168));break;case B.CMD_SEL_1K_VROM_1000:0===this.chrAddressSelect?this.load1kVromBank(s,4096):this.load1kVromBank(s,0);break;case B.CMD_SEL_1K_VROM_1400:0===this.chrAddressSelect?this.load1kVromBank(s,5120):this.load1kVromBank(s,1024);break;case B.CMD_SEL_1K_VROM_1800:0===this.chrAddressSelect?this.load1kVromBank(s,6144):this.load1kVromBank(s,2048);break;case B.CMD_SEL_1K_VROM_1C00:0===this.chrAddressSelect?this.load1kVromBank(s,7168):this.load1kVromBank(s,3072);break;case B.CMD_SEL_ROM_PAGE1:this.prgAddressChanged&&(0===this.prgAddressSelect?this.load8kRomBank(2*(this.nes.rom.romCount-1),49152):this.load8kRomBank(2*(this.nes.rom.romCount-1),32768),this.prgAddressChanged=!1),0===this.prgAddressSelect?this.load8kRomBank(s,32768):this.load8kRomBank(s,49152);break;case B.CMD_SEL_ROM_PAGE2:this.load8kRomBank(s,40960),this.prgAddressChanged&&(0===this.prgAddressSelect?this.load8kRomBank(2*(this.nes.rom.romCount-1),49152):this.load8kRomBank(2*(this.nes.rom.romCount-1),32768),this.prgAddressChanged=!1)}}loadROM(){if(!this.nes.rom.valid)throw new Error("MMC3: Invalid ROM! Unable to load.");this.load8kRomBank(2*(this.nes.rom.romCount-1),49152),this.load8kRomBank(2*(this.nes.rom.romCount-1)+1,57344),this.load8kRomBank(0,32768),this.load8kRomBank(1,40960),this.loadCHRROM(),this.loadBatteryRam(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}clockIrqCounter(){1===this.irqEnable&&(this.irqCounter--,this.irqCounter<0&&(this.nes.cpu.requestIrq(this.nes.cpu.IRQ_NORMAL),this.irqCounter=this.irqLatchValue))}toJSON(){let t=super.toJSON();return t.command=this.command,t.prgAddressSelect=this.prgAddressSelect,t.chrAddressSelect=this.chrAddressSelect,t.pageNumber=this.pageNumber,t.irqCounter=this.irqCounter,t.irqLatchValue=this.irqLatchValue,t.irqEnable=this.irqEnable,t.prgAddressChanged=this.prgAddressChanged,t}fromJSON(t){super.fromJSON(t),this.command=t.command,this.prgAddressSelect=t.prgAddressSelect,this.chrAddressSelect=t.chrAddressSelect,this.pageNumber=t.pageNumber,this.irqCounter=t.irqCounter,this.irqLatchValue=t.irqLatchValue,this.irqEnable=t.irqEnable,this.prgAddressChanged=t.prgAddressChanged}}const M=B;const y=class extends O{static mapperName="MMC5";constructor(t){super(t)}write(t,s){if(t<20480)super.write(t,s);else switch(t){case 20736:this.prg_size=3&s;break;case 20737:this.chr_size=3&s;break;case 20738:this.sram_we_a=3&s;break;case 20739:this.sram_we_b=3&s;break;case 20740:this.graphic_mode=3&s;break;case 20741:this.nametable_mode=s,this.nametable_type[0]=3&s,this.load1kVromBank(3&s,8192),s>>=2,this.nametable_type[1]=3&s,this.load1kVromBank(3&s,9216),s>>=2,this.nametable_type[2]=3&s,this.load1kVromBank(3&s,10240),s>>=2,this.nametable_type[3]=3&s,this.load1kVromBank(3&s,11264);break;case 20742:this.fill_chr=s;break;case 20743:this.fill_pal=3&s;break;case 20755:this.SetBank_SRAM(3,3&s);break;case 20756:case 20757:case 20758:case 20759:this.SetBank_CPU(t,s);break;case 20768:case 20769:case 20770:case 20771:case 20772:case 20773:case 20774:case 20775:this.chr_mode=0,this.chr_page[0][7&t]=s,this.SetBank_PPU();break;case 20776:case 20777:case 20778:case 20779:this.chr_mode=1,this.chr_page[1][0+(3&t)]=s,this.chr_page[1][4+(3&t)]=s,this.SetBank_PPU();break;case 20992:this.split_control=s;break;case 20993:this.split_scroll=s;break;case 20994:this.split_page=63&s;break;case 20995:this.irq_line=s,this.nes.cpu.ClearIRQ();break;case 20996:this.irq_enable=s,this.nes.cpu.ClearIRQ();break;case 20997:this.mult_a=s;break;case 20998:this.mult_b=s;break;default:t>=20480&&t<=20501?this.nes.papu.exWrite(t,s):t>=23552&&t<=24575?2===this.graphic_mode||3!==this.graphic_mode&&this.irq_status:t>=24576&&t<=32767&&2===this.sram_we_a&&this.sram_we_b}}loadROM(){if(!this.nes.rom.valid)throw new Error("UNROM: Invalid ROM! Unable to load.");this.load8kRomBank(2*this.nes.rom.romCount-1,32768),this.load8kRomBank(2*this.nes.rom.romCount-1,40960),this.load8kRomBank(2*this.nes.rom.romCount-1,49152),this.load8kRomBank(2*this.nes.rom.romCount-1,57344),this.loadCHRROM(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}};const F=class extends O{static mapperName="AxROM";constructor(t){super(t)}write(t,s){t<32768?super.write(t,s):(this.load32kRomBank(7&s,32768),16&s?this.nes.ppu.setMirroring(this.nes.rom.SINGLESCREEN_MIRRORING2):this.nes.ppu.setMirroring(this.nes.rom.SINGLESCREEN_MIRRORING))}loadROM(){if(!this.nes.rom.valid)throw new Error("AOROM: Invalid ROM! Unable to load.");this.loadPRGROM(),this.loadCHRROM(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}};const P=class extends O{static mapperName="MMC2";constructor(t){super(t),this.prgBank=0,this.chrBankFD0=0,this.chrBankFE0=0,this.chrBankFD1=0,this.chrBankFE1=0,this.latch0=254,this.latch1=254}write(t,s){if(t<32768)super.write(t,s);else switch(61440&t){case 40960:this.prgBank=15&s,this.load8kRomBank(this.prgBank,32768);break;case 45056:this.chrBankFD0=31&s,this._updateChr0();break;case 49152:this.chrBankFE0=31&s,this._updateChr0();break;case 53248:this.chrBankFD1=31&s,this._updateChr1();break;case 57344:this.chrBankFE1=31&s,this._updateChr1();break;case 61440:1&s?this.nes.ppu.setMirroring(this.nes.rom.HORIZONTAL_MIRRORING):this.nes.ppu.setMirroring(this.nes.rom.VERTICAL_MIRRORING)}}_updateChr0(){let t=253===this.latch0?this.chrBankFD0:this.chrBankFE0;this.loadVromBank(t,0)}_updateChr1(){let t=253===this.latch1?this.chrBankFD1:this.chrBankFE1;this.loadVromBank(t,4096)}latchAccess(t){4056===t?253!==this.latch0&&(this.latch0=253,this._updateChr0()):4072===t?254!==this.latch0&&(this.latch0=254,this._updateChr0()):t>=8152&&t<=8159?253!==this.latch1&&(this.latch1=253,this._updateChr1()):t>=8168&&t<=8175&&254!==this.latch1&&(this.latch1=254,this._updateChr1())}loadROM(){if(!this.nes.rom.valid)throw new Error("MMC2: Invalid ROM! Unable to load.");this.load8kRomBank(0,32768);let t=2*(this.nes.rom.romCount-1)+1;this.load8kRomBank(t-2,40960),this.load8kRomBank(t-1,49152),this.load8kRomBank(t,57344),this.loadCHRROM(),this.loadBatteryRam(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}toJSON(){let t=super.toJSON();return t.prgBank=this.prgBank,t.chrBankFD0=this.chrBankFD0,t.chrBankFE0=this.chrBankFE0,t.chrBankFD1=this.chrBankFD1,t.chrBankFE1=this.chrBankFE1,t.latch0=this.latch0,t.latch1=this.latch1,t}fromJSON(t){super.fromJSON(t),this.prgBank=t.prgBank,this.chrBankFD0=t.chrBankFD0,this.chrBankFE0=t.chrBankFE0,this.chrBankFD1=t.chrBankFD1,this.chrBankFE1=t.chrBankFE1,this.latch0=t.latch0,this.latch1=t.latch1}};const v=class extends O{static mapperName="Color Dreams";constructor(t){super(t)}write(t,s){if(t<32768)super.write(t,s);else{let t=2*(15&s)%this.nes.rom.romCount,e=(2*(15&s)+1)%this.nes.rom.romCount;if(this.loadRomBank(t,32768),this.loadRomBank(e,49152),this.nes.rom.vromCount>0){let t=2*(s>>4)%this.nes.rom.vromCount;this.loadVromBank(t,0),this.loadVromBank(t+1,4096)}}}};const w=class extends O{static mapperName="BNROM";constructor(t){super(t)}write(t,s){t<32768?super.write(t,s):this.load32kRomBank(s,32768)}};const L=class extends O{static mapperName="PCI556";constructor(t){super(t)}write(t,s){t<28672||t>32767?super.write(t,s):(this.load32kRomBank(3&s,32768),this.load8kVromBank(2*(s>>2&3),0))}};const G=class extends O{static mapperName="GxROM";constructor(t){super(t)}write(t,s){t<32768?super.write(t,s):(this.load32kRomBank(s>>4&3,32768),this.load8kVromBank(2*(3&s),0))}};const V=class extends O{static mapperName="Camerica";constructor(t){super(t)}write(t,s){t<32768?super.write(t,s):t>=36864&&t<40960?16&s?this.nes.ppu.setMirroring(this.nes.rom.SINGLESCREEN_MIRRORING2):this.nes.ppu.setMirroring(this.nes.rom.SINGLESCREEN_MIRRORING):t>=49152&&this.loadRomBank(15&s,32768)}loadROM(){if(!this.nes.rom.valid)throw new Error("Mapper 71: Invalid ROM! Unable to load.");this.loadRomBank(0,32768),this.loadRomBank(this.nes.rom.romCount-1,49152),this.loadCHRROM(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}};const q=class extends O{static mapperName="NINA-03/NINA-06";constructor(t){super(t)}write(t,s){16640==(57600&t)&&(this.load32kRomBank(s>>3&1,32768),this.load8kVromBank(2*(7&s),0)),super.write(t,s)}};const X=class extends O{static mapperName="UN1ROM";constructor(t){super(t)}write(t,s){t<32768?super.write(t,s):this.loadRomBank(s>>2,32768)}loadROM(){if(!this.nes.rom.valid)throw new Error("UN1ROM: Invalid ROM! Unable to load.");this.loadRomBank(0,32768),this.loadRomBank(this.nes.rom.romCount-1,49152),this.loadCHRROM(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}};const U=class extends M{static mapperName="TxSROM";constructor(t){super(t),this.chrRegs=[0,0,0,0,0,0]}write(t,s){40960!==t&&(super.write(t,s),32768===t&&this.updateNametableMirroring())}executeCommand(t,s){t<=5?(this.chrRegs[t]=s,super.executeCommand(t,127&s),this.updateNametableMirroring()):super.executeCommand(t,s)}updateNametableMirroring(){let t=this.nes.ppu;if(0===this.chrAddressSelect){let s=this.chrRegs[0]>>7&1,e=this.chrRegs[1]>>7&1;t.ntable1[0]=s,t.ntable1[1]=s,t.ntable1[2]=e,t.ntable1[3]=e}else t.ntable1[0]=this.chrRegs[2]>>7&1,t.ntable1[1]=this.chrRegs[3]>>7&1,t.ntable1[2]=this.chrRegs[4]>>7&1,t.ntable1[3]=this.chrRegs[5]>>7&1;for(let s=0;s<4;s++){let e=8192+1024*s,i=8192+1024*t.ntable1[s];t.defineMirrorRegion(e,i,1024)}t.currentMirroring=-1}loadROM(){super.loadROM(),this.updateNametableMirroring()}toJSON(){let t=super.toJSON();return t.chrRegs=this.chrRegs.slice(),t}fromJSON(t){super.fromJSON(t),this.chrRegs=t.chrRegs,this.updateNametableMirroring()}};const x=class extends M{static mapperName="TQROM";constructor(t){super(t),this.chrRam=new Uint8Array(8192),this.chrRamTiles=new Array(8);for(let t=0;t<8;t++){this.chrRamTiles[t]=new Array(64);for(let s=0;s<64;s++)this.chrRamTiles[t][s]=new l}this.chrRamSlots=[-1,-1,-1,-1,-1,-1,-1,-1]}executeCommand(t,s){switch(t){case M.CMD_SEL_2_1K_VROM_0000:{let t=0===this.chrAddressSelect?0:4096;if(64&s){let e=6&s;this.load1kChrRamBank(e,t),this.load1kChrRamBank(e+1,t+1024)}else{let e=63&s;this.saveChrRamSlot(t),this.saveChrRamSlot(t+1024),this.chrRamSlots[t>>10]=-1,this.chrRamSlots[1+(t>>10)]=-1,this.load1kVromBank(e,t),this.load1kVromBank(e+1,t+1024)}break}case M.CMD_SEL_2_1K_VROM_0800:{let t=0===this.chrAddressSelect?2048:6144;if(64&s){let e=6&s;this.load1kChrRamBank(e,t),this.load1kChrRamBank(e+1,t+1024)}else{let e=63&s;this.saveChrRamSlot(t),this.saveChrRamSlot(t+1024),this.chrRamSlots[t>>10]=-1,this.chrRamSlots[1+(t>>10)]=-1,this.load1kVromBank(e,t),this.load1kVromBank(e+1,t+1024)}break}case M.CMD_SEL_1K_VROM_1000:{let t=0===this.chrAddressSelect?4096:0;64&s?this.load1kChrRamBank(7&s,t):(this.saveChrRamSlot(t),this.chrRamSlots[t>>10]=-1,this.load1kVromBank(63&s,t));break}case M.CMD_SEL_1K_VROM_1400:{let t=0===this.chrAddressSelect?5120:1024;64&s?this.load1kChrRamBank(7&s,t):(this.saveChrRamSlot(t),this.chrRamSlots[t>>10]=-1,this.load1kVromBank(63&s,t));break}case M.CMD_SEL_1K_VROM_1800:{let t=0===this.chrAddressSelect?6144:2048;64&s?this.load1kChrRamBank(7&s,t):(this.saveChrRamSlot(t),this.chrRamSlots[t>>10]=-1,this.load1kVromBank(63&s,t));break}case M.CMD_SEL_1K_VROM_1C00:{let t=0===this.chrAddressSelect?7168:3072;64&s?this.load1kChrRamBank(7&s,t):(this.saveChrRamSlot(t),this.chrRamSlots[t>>10]=-1,this.load1kVromBank(63&s,t));break}default:super.executeCommand(t,s)}}saveChrRamSlot(t){let s=t>>10,i=this.chrRamSlots[s];-1!==i&&e(this.nes.ppu.vramMem,s<<10,this.chrRam,1024*i,1024)}load1kChrRamBank(t,s){this.nes.ppu.triggerRendering(),t&=7,this.saveChrRamSlot(s);let i=s>>10;this.chrRamSlots[i]=t;let h=1024*t;e(this.chrRam,h,this.nes.ppu.vramMem,s,1024),this.rebuildChrRamTiles(t);let r=s>>4;for(let s=0;s<64;s++)this.nes.ppu.ptTile[r+s]=this.chrRamTiles[t][s]}rebuildChrRamTiles(t){let s=1024*t;for(let e=0;e<1024;e++){let i=e>>4,h=e%16;h<8?this.chrRamTiles[t][i].setScanline(h,this.chrRam[s+e],this.chrRam[s+e+8]):this.chrRamTiles[t][i].setScanline(h-8,this.chrRam[s+e-8],this.chrRam[s+e])}}canWriteChr(t){return!(t>=8192)&&-1!==this.chrRamSlots[t>>10]}toJSON(){for(let t=0;t<8;t++)this.saveChrRamSlot(t<<10);let t=super.toJSON();return t.chrRam=Array.from(this.chrRam),t.chrRamSlots=this.chrRamSlots.slice(),t}fromJSON(t){super.fromJSON(t),this.chrRam=new Uint8Array(t.chrRam),this.chrRamSlots=t.chrRamSlots;for(let t=0;t<8;t++)this.rebuildChrRamTiles(t);for(let t=0;t<8;t++){let s=this.chrRamSlots[t];if(-1!==s){let e=t<<10>>4;for(let t=0;t<64;t++)this.nes.ppu.ptTile[e+t]=this.chrRamTiles[s][t]}}}};const Y=class extends O{static mapperName="Jaleco JF-11/JF-14";constructor(t){super(t)}write(t,s){t<24576||t>32767?super.write(t,s):(this.load32kRomBank(s>>4&3,32768),this.load8kVromBank(2*(15&s),0))}};const H=class extends O{static mapperName="UNROM (Crazy Climber)";constructor(t){super(t)}write(t,s){t<32768?super.write(t,s):this.loadRomBank(s,49152)}loadROM(){if(!this.nes.rom.valid)throw new Error("Mapper 180: Invalid ROM! Unable to load.");this.loadRomBank(0,32768),this.loadRomBank(this.nes.rom.romCount-1,49152),this.loadCHRROM(),this.nes.cpu.requestIrq(this.nes.cpu.IRQ_RESET)}};const W=class extends O{static mapperName="Mapper 240";constructor(t){super(t)}write(t,s){t<16416||t>24575?super.write(t,s):(this.load32kRomBank(s>>4&3,32768),this.load8kVromBank(2*(15&s),0))}};const Z=class extends O{static mapperName="BxROM (Mapper 241)";constructor(t){super(t)}write(t,s){t<32768?super.write(t,s):this.load32kRomBank(s,32768)}},J={0:O,1:T,2:f,3:k,4:M,5:y,7:F,9:P,11:v,34:w,38:L,66:G,71:V,79:q,94:X,118:U,119:x,140:Y,180:H,240:W,241:Z};class z{VERTICAL_MIRRORING=0;HORIZONTAL_MIRRORING=1;FOURSCREEN_MIRRORING=2;SINGLESCREEN_MIRRORING=3;SINGLESCREEN_MIRRORING2=4;SINGLESCREEN_MIRRORING3=5;SINGLESCREEN_MIRRORING4=6;CHRROM_MIRRORING=7;constructor(t){this.nes=t,this.valid=!1}load(t){let s,e,i;t instanceof ArrayBuffer&&(t=new Uint8Array(t));const h=ArrayBuffer.isView(t);if(h){if(t.length<4||78!==t[0]||69!==t[1]||83!==t[2]||26!==t[3])throw new Error("Not a valid NES ROM.")}else if(!t.startsWith("NES"))throw new Error("Not a valid NES ROM.");for(this.header=new Uint8Array(16),s=0;s<16;s++)this.header[s]=h?t[s]:255&t.charCodeAt(s);this.mirroring=1&this.header[6]?1:0,this.batteryRam=!!(2&this.header[6]),this.trainer=!!(4&this.header[6]),this.fourScreen=!!(8&this.header[6]),this.isNES2=8==(12&this.header[7]),this.isNES2?this._loadNES2Header():this._loadINES1Header(),this.rom=new Array(this.romCount);let r,a,n=16+(this.trainer?512:0);for(s=0;s<this.romCount;s++){for(this.rom[s]=new Uint8Array(16384),e=0;e<16384&&!(n+e>=t.length);e++)this.rom[s][e]=h?t[n+e]:255&t.charCodeAt(n+e);n+=16384}for(this.vrom=new Array(this.vromCount),s=0;s<this.vromCount;s++){for(this.vrom[s]=new Uint8Array(4096),e=0;e<4096&&!(n+e>=t.length);e++)this.vrom[s][e]=h?t[n+e]:255&t.charCodeAt(n+e);n+=4096}for(this.vromTile=new Array(this.vromCount),s=0;s<this.vromCount;s++)for(this.vromTile[s]=new Array(256),e=0;e<256;e++)this.vromTile[s][e]=new l;for(i=0;i<this.vromCount;i++)for(s=0;s<4096;s++)r=s>>4,a=s%16,a<8?this.vromTile[i][r].setScanline(a,this.vrom[i][s],this.vrom[i][s+8]):this.vromTile[i][r].setScanline(a-8,this.vrom[i][s-8],this.vrom[i][s]);this.valid=!0}_loadINES1Header(){this.romCount=this.header[4],this.vromCount=2*this.header[5],this.mapperType=this.header[6]>>4|240&this.header[7];let t=!1;for(let s=8;s<16;s++)if(0!==this.header[s]){t=!0;break}t&&(this.mapperType&=15),this.subMapper=0,this.prgRamSize=0,this.prgNvRamSize=0,this.chrRamSize=0,this.chrNvRamSize=0,this.timingMode=0,this.consoleType=0}_loadNES2Header(){this.mapperType=this.header[6]>>4|240&this.header[7]|(15&this.header[8])<<8,this.subMapper=this.header[8]>>4&15;const t=15&this.header[9];if(15===t){const t=this.header[4]>>2&63,s=3&this.header[4];this.romCount=Math.ceil(Math.pow(2,t)*(2*s+1)/16384)}else this.romCount=t<<8|this.header[4];const s=this.header[9]>>4&15;if(15===s){const t=this.header[5]>>2&63,s=3&this.header[5];this.vromCount=Math.ceil(Math.pow(2,t)*(2*s+1)/4096)}else this.vromCount=2*(s<<8|this.header[5]);this.prgRamSize=z._decodeRamSize(15&this.header[10]),this.prgNvRamSize=z._decodeRamSize(this.header[10]>>4&15),this.chrRamSize=z._decodeRamSize(15&this.header[11]),this.chrNvRamSize=z._decodeRamSize(this.header[11]>>4&15),this.timingMode=3&this.header[12],this.consoleType=3&this.header[7]}static _decodeRamSize(t){return 0===t?0:64<<t}getMirroringType(){return this.fourScreen?this.FOURSCREEN_MIRRORING:0===this.mirroring?this.HORIZONTAL_MIRRORING:this.VERTICAL_MIRRORING}mapperSupported(){return void 0!==J[this.mapperType]}createMapper(){if(this.mapperSupported())return new J[this.mapperType](this.nes);throw new Error(`Unsupported mapper: ${this.mapperType}`)}}const K=z;const j=class{constructor(t){this.opts={onFrame:function(){},onAudioSample:null,onStatusUpdate:function(){},onBatteryRamWrite:function(){},emulateSound:!0,sampleRate:48e3,...t},this.ui={writeFrame:this.opts.onFrame,updateStatus:this.opts.onStatusUpdate},this.cpu=new a(this),this.ppu=new u(this),this.papu=new A(this),this.gameGenie=new E,this.gameGenie.onChange=()=>this.cpu._updateCartridgeLoader(),this.mmap=null,this.controllers={1:new o,2:new o},this.fpsFrameCount=0,this.romData=null,this.ui.updateStatus("Ready to load a ROM.")}reset(){this.cpu=new a(this),this.ppu=new u(this),this.papu=new A(this),null!==this.mmap&&(this.mmap=this.rom.createMapper()),this.lastFpsTime=null,this.fpsFrameCount=0,this.crashed=!1}frame=()=>{if(this.crashed)throw new Error("Game has crashed. Call reset() or loadROM() to restart.");let t;this.controllers[1].clock(),this.controllers[2].clock(),this.ppu.startFrame();const s=this.cpu,e=this.ppu,i=this.papu;try{for(;;)if(0===s.cyclesToHalt){if(t=s.emulate(),i.clockFrameCounter(t,s.apuCatchupCycles),s.apuCatchupCycles=0,e.frameEnded){e.frameEnded=!1;break}}else{let t=Math.min(s.cyclesToHalt,8);for(let s=0;s<t;s++)e.advanceDots(3);if(i.clockFrameCounter(t),s.cyclesToHalt-=t,e.frameEnded){e.frameEnded=!1;break}}}catch(t){throw this.crashed=!0,t}this.fpsFrameCount++};buttonDown=(t,s)=>{this.controllers[t].buttonDown(s)};buttonUp=(t,s)=>{this.controllers[t].buttonUp(s)};zapperMove=(t,s)=>{this.mmap&&(this.mmap.zapperX=t,this.mmap.zapperY=s)};zapperFireDown=()=>{this.mmap&&(this.mmap.zapperFired=!0)};zapperFireUp=()=>{this.mmap&&(this.mmap.zapperFired=!1)};getFPS(){const t=Date.now();let s=null;return this.lastFpsTime&&(s=this.fpsFrameCount/((t-this.lastFpsTime)/1e3)),this.fpsFrameCount=0,this.lastFpsTime=t,s}reloadROM(){null!==this.romData&&this.loadROM(this.romData)}loadROM(t){this.rom=new K(this),this.rom.load(t),this.reset(),this.mmap=this.rom.createMapper(),this.mmap.loadROM(),this.ppu.setMirroring(this.rom.getMirroringType()),this.romData=t}setFramerate(t){this.papu.setFrameRate(t)}toJSON(){return{cpu:this.cpu.toJSON(),mmap:this.mmap.toJSON(),ppu:this.ppu.toJSON(),papu:this.papu.toJSON()}}fromJSON(t){this.reset(),this.cpu.fromJSON(t.cpu),this.mmap.fromJSON(t.mmap),this.ppu.fromJSON(t.ppu),this.papu.fromJSON(t.papu)}},Q=256,$=240;class tt{constructor(t,s={}){this.onMouseDown=s.onMouseDown,this.onMouseUp=s.onMouseUp,this.canvas=document.createElement("canvas"),this.canvas.width=Q,this.canvas.height=$,this.canvas.style.imageRendering="pixelated",this.canvas.style.imageRendering="crisp-edges",t.appendChild(this.canvas),this._handleMouseDown=t=>{if(!this.onMouseDown)return;let s=Q/parseFloat(this.canvas.style.width),e=this.canvas.getBoundingClientRect(),i=Math.round((t.clientX-e.left)*s),h=Math.round((t.clientY-e.top)*s);this.onMouseDown(i,h)},this._handleMouseUp=()=>{this.onMouseUp&&this.onMouseUp()},this.canvas.addEventListener("mousedown",this._handleMouseDown),this.canvas.addEventListener("mouseup",this._handleMouseUp),this._initCanvas()}_initCanvas(){this.context=this.canvas.getContext("2d"),this.imageData=this.context.getImageData(0,0,Q,$),this.context.fillStyle="black",this.context.fillRect(0,0,Q,$),this.buf=new ArrayBuffer(this.imageData.data.length),this.buf8=new Uint8ClampedArray(this.buf),this.buf32=new Uint32Array(this.buf);for(var t=0;t<this.buf32.length;++t)this.buf32[t]=4278190080}setBuffer=t=>{for(var s=0;s<$;++s)for(var e=0;e<Q;++e){var i=256*s+e;this.buf32[i]=4278190080|t[i]}};writeBuffer=()=>{this.imageData.data.set(this.buf8),this.context.putImageData(this.imageData,0,0)};fitInParent=()=>{let t=this.canvas.parentNode,s=t.clientWidth,e=t.clientHeight,i=1.0666666666666667;i<s/e?(this.canvas.style.width=`${Math.round(e*i)}px`,this.canvas.style.height=`${e}px`):(this.canvas.style.width=`${s}px`,this.canvas.style.height=`${Math.round(s/i)}px`)};screenshot(){var t=new Image;return t.src=this.canvas.toDataURL("image/png"),t}destroy(){this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("mouseup",this._handleMouseUp),this.canvas.parentNode.removeChild(this.canvas)}}class st{constructor({onBufferUnderrun:t}){this.onBufferUnderrun=t,this.audioCtx=null,this.node=null,this.batchL=new Float32Array(128),this.batchR=new Float32Array(128),this.batchPos=0}getSampleRate(){if(!window.AudioContext)return 44100;let t=new window.AudioContext,s=t.sampleRate;return t.close(),s}async start(){if(!window.AudioContext)return;this.audioCtx=new window.AudioContext;const t=new Blob(['\nclass NESAudioProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n // Circular buffer sized to hold ~170ms of audio at 48kHz (8192 samples).\n this.capacity = 8192;\n this.bufferL = new Float32Array(this.capacity);\n this.bufferR = new Float32Array(this.capacity);\n this.readPos = 0;\n this.writePos = 0;\n this.count = 0;\n\n this.port.onmessage = (e) => {\n if (e.data.type === "samples") {\n const left = e.data.left;\n const right = e.data.right;\n const len = left.length;\n\n // If adding these samples would overflow, drop oldest to make room\n if (this.count + len > this.capacity) {\n const drop = this.count + len - this.capacity;\n this.readPos = (this.readPos + drop) % this.capacity;\n this.count -= drop;\n }\n\n for (let i = 0; i < len; i++) {\n this.bufferL[this.writePos] = left[i];\n this.bufferR[this.writePos] = right[i];\n this.writePos = (this.writePos + 1) % this.capacity;\n }\n this.count += len;\n }\n };\n }\n\n process(inputs, outputs) {\n const output = outputs[0];\n if (!output || output.length < 2) return true;\n\n const outL = output[0];\n const outR = output[1];\n const size = outL.length;\n\n if (this.count < size) {\n for (let i = 0; i < this.count; i++) {\n outL[i] = this.bufferL[this.readPos];\n outR[i] = this.bufferR[this.readPos];\n this.readPos = (this.readPos + 1) % this.capacity;\n }\n for (let i = this.count; i < size; i++) {\n outL[i] = 0;\n outR[i] = 0;\n }\n this.count = 0;\n this.port.postMessage({ type: "underrun" });\n } else {\n for (let i = 0; i < size; i++) {\n outL[i] = this.bufferL[this.readPos];\n outR[i] = this.bufferR[this.readPos];\n this.readPos = (this.readPos + 1) % this.capacity;\n }\n this.count -= size;\n }\n\n return true;\n }\n}\n\nregisterProcessor("nes-audio-processor", NESAudioProcessor);\n'],{type:"application/javascript"}),s=URL.createObjectURL(t);await this.audioCtx.audioWorklet.addModule(s),URL.revokeObjectURL(s),this.node=new AudioWorkletNode(this.audioCtx,"nes-audio-processor",{outputChannelCount:[2]}),this.node.port.onmessage=t=>{"underrun"===t.data.type&&this.onBufferUnderrun&&this.onBufferUnderrun()},this.node.connect(this.audioCtx.destination),"suspended"===this.audioCtx.state&&(this._resumeOnInteraction=()=>{this.audioCtx&&this.audioCtx.resume(),this._removeResumeListeners()},document.addEventListener("keydown",this._resumeOnInteraction),document.addEventListener("mousedown",this._resumeOnInteraction),document.addEventListener("touchstart",this._resumeOnInteraction))}_removeResumeListeners(){this._resumeOnInteraction&&(document.removeEventListener("keydown",this._resumeOnInteraction),document.removeEventListener("mousedown",this._resumeOnInteraction),document.removeEventListener("touchstart",this._resumeOnInteraction),this._resumeOnInteraction=null)}stop(){this._removeResumeListeners(),this.node&&(this.node.disconnect(this.audioCtx.destination),this.node=null),this.audioCtx&&(this.audioCtx.close().catch(t=>console.error(t)),this.audioCtx=null),this.batchPos=0}writeSample=(t,s)=>{this.node&&(this.batchL[this.batchPos]=t,this.batchR[this.batchPos]=s,this.batchPos++,this.batchPos>=128&&(this.node.port.postMessage({type:"samples",left:this.batchL.slice(),right:this.batchR.slice()}),this.batchPos=0))};flush(){this.batchPos>0&&this.node&&(this.node.port.postMessage({type:"samples",left:this.batchL.slice(0,this.batchPos),right:this.batchR.slice(0,this.batchPos)}),this.batchPos=0)}}let et=!1;try{et=!!localStorage.getItem("jsnes_debug")}catch{}class it{constructor(t){this.onGenerateFrame=t.onGenerateFrame,this.onWriteFrame=t.onWriteFrame,this.onAnimationFrame=this.onAnimationFrame.bind(this),this.running=!0,this.interval=1e3/60.098,this.lastFrameTime=!1}start(){this.running=!0,this.requestAnimationFrame()}stop(){this.running=!1,this._requestID&&window.cancelAnimationFrame(this._requestID),this.lastFrameTime=!1}requestAnimationFrame(){this._requestID=window.requestAnimationFrame(this.onAnimationFrame)}generateFrame(){this.onGenerateFrame(),this.lastFrameTime+=this.interval}onAnimationFrame=t=>{this.requestAnimationFrame();let s=t%this.interval,e=t-s;if(!this.lastFrameTime)return void(this.lastFrameTime=e);let i=Math.round((e-this.lastFrameTime)/this.interval);if(0===i)return;this.generateFrame(),this.onWriteFrame();let h=this.interval-s;for(let t=1;t<i;t++)setTimeout(()=>{this.generateFrame()},t*h/i);i>1&&et&&console.log("SKIP",i-1,this.lastFrameTime)}}const ht={88:[1,o.BUTTON_A,"X"],89:[1,o.BUTTON_B,"Y"],90:[1,o.BUTTON_B,"Z"],17:[1,o.BUTTON_SELECT,"Right Ctrl"],13:[1,o.BUTTON_START,"Enter"],38:[1,o.BUTTON_UP,"Up"],40:[1,o.BUTTON_DOWN,"Down"],37:[1,o.BUTTON_LEFT,"Left"],39:[1,o.BUTTON_RIGHT,"Right"],83:[1,o.BUTTON_TURBO_A,"S"],65:[1,o.BUTTON_TURBO_B,"A"],103:[2,o.BUTTON_A,"Num-7"],105:[2,o.BUTTON_B,"Num-9"],99:[2,o.BUTTON_SELECT,"Num-3"],97:[2,o.BUTTON_START,"Num-1"],104:[2,o.BUTTON_UP,"Num-8"],98:[2,o.BUTTON_DOWN,"Num-2"],100:[2,o.BUTTON_LEFT,"Num-4"],102:[2,o.BUTTON_RIGHT,"Num-6"]};class rt{constructor(t){this.onButtonDown=t.onButtonDown,this.onButtonUp=t.onButtonUp}loadKeys=()=>{var t;try{(t=localStorage.getItem("keys"))&&(t=JSON.parse(t))}catch(t){console.warn("Failed to get keys from localStorage.",t)}this.keys=t||ht};setKeys=t=>{try{localStorage.setItem("keys",JSON.stringify(t)),this.keys=t}catch(t){console.warn("Failed to set keys in localStorage.",t)}};handleKeyDown=t=>{var s=this.keys[t.keyCode];s&&(this.onButtonDown(s[0],s[1]),t.preventDefault())};handleKeyUp=t=>{var s=this.keys[t.keyCode];s&&(this.onButtonUp(s[0],s[1]),t.preventDefault())};handleKeyPress=t=>{t.preventDefault()}}class at{constructor(t){this.onButtonDown=t.onButtonDown,this.onButtonUp=t.onButtonUp,this.gamepadState=[],this.buttonCallback=null}disableIfGamepadEnabled=t=>{var s=this;return(e,i)=>{if(!s.gamepadConfig)return t(e,i);var h=s.gamepadConfig.playerGamepadId;return h&&h[e-1]?void 0:t(e,i)}};_getPlayerNumberFromGamepad=t=>this.gamepadConfig.playerGamepadId[0]===t.id?1:this.gamepadConfig.playerGamepadId[1]===t.id?2:1;poll=()=>{const t=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads(),s=[];for(let e=0;e<t.length;e++){const i=t[e],h=this.gamepadState[e];if(!i)continue;if(!h){this.gamepadState[e]=i;continue}const r=i.buttons,a=h.buttons;if(this.buttonCallback){for(let t=0;t<i.axes.length;t++){const s=i.axes[t],e=h.axes[t];-1===s&&-1!==e&&this.buttonCallback({gamepadId:i.id,type:"axis",code:t,value:s}),1===s&&1!==e&&this.buttonCallback({gamepadId:i.id,type:"axis",code:t,value:s})}for(let t=0;t<r.length;t++){const s=r[t],e=a[t];s.pressed&&!e.pressed&&this.buttonCallback({gamepadId:i.id,type:"button",code:t})}}else if(this.gamepadConfig){let t=this._getPlayerNumberFromGamepad(i);if(s.length<2&&(-1!==s.indexOf(t)&&(t++,t>2&&(t=1)),s.push(t),this.gamepadConfig.configs[i.id])){const s=this.gamepadConfig.configs[i.id].buttons;for(let e=0;e<s.length;e++){const n=s[e];if("button"===n.type){const s=n.code,e=r[s],i=a[s];e.pressed&&!i.pressed?this.onButtonDown(t,n.buttonId):!e.pressed&&i.pressed&&this.onButtonUp(t,n.buttonId)}else if("axis"===n.type){const s=n.code,e=i.axes[s],r=h.axes[s];e===n.value&&r!==n.value&&this.onButtonDown(t,n.buttonId),e!==n.value&&r===n.value&&this.onButtonUp(t,n.buttonId)}}}}this.gamepadState[e]={buttons:r.map(t=>({pressed:t.pressed})),axes:i.axes.slice(0)}}};promptButton=t=>{this.buttonCallback=t?s=>{this.buttonCallback=null,t(s)}:t};loadGamepadConfig=()=>{var t;try{(t=localStorage.getItem("gamepadConfig"))&&(t=JSON.parse(t))}catch(t){console.warn("Failed to get gamepadConfig from localStorage.",t)}this.gamepadConfig=t};setGamepadConfig=t=>{try{localStorage.setItem("gamepadConfig",JSON.stringify(t)),this.gamepadConfig=t}catch(t){console.warn("Failed to set gamepadConfig in localStorage.",t)}};startPolling=()=>{if(!navigator.getGamepads&&!navigator.webkitGetGamepads)return{stop:()=>{}};let t=!1;const s=()=>{t||(this.poll(),requestAnimationFrame(s))};return requestAnimationFrame(s),{stop:()=>{t=!0}}}}let nt=!1;try{nt=!!localStorage.getItem("jsnes_debug")}catch{}function ot(...t){nt&&console.log(...t)}class lt{constructor(t={}){this._options=t,this._screen=new tt(t.container,{onMouseDown:(t,s)=>{this.nes.zapperMove(t,s),this.nes.zapperFireDown()},onMouseUp:()=>{this.nes.zapperFireUp()}}),this._screen.fitInParent(),this._speakers=new st({onBufferUnderrun:()=>{ot("Buffer underrun, running extra frames to catch up"),this._frameTimer.generateFrame(),this._frameTimer.generateFrame()}}),this.nes=new j({onFrame:this._screen.setBuffer,onStatusUpdate:ot,onAudioSample:this._speakers.writeSample,onBatteryRamWrite:t.onBatteryRamWrite||(()=>{}),sampleRate:this._speakers.getSampleRate()}),this._frameTimer=new it({onGenerateFrame:()=>{try{this.nes.frame(),this._speakers.flush()}catch(t){this.stop(),this._options.onError&&this._options.onError(t)}},onWriteFrame:this._screen.writeBuffer}),this.gamepad=new at({onButtonDown:this.nes.buttonDown,onButtonUp:this.nes.buttonUp}),this.gamepad.loadGamepadConfig(),this._gamepadPolling=this.gamepad.startPolling(),this.keyboard=new rt({onButtonDown:this.gamepad.disableIfGamepadEnabled(this.nes.buttonDown),onButtonUp:this.gamepad.disableIfGamepadEnabled(this.nes.buttonUp)}),this.keyboard.loadKeys(),document.addEventListener("keydown",this.keyboard.handleKeyDown),document.addEventListener("keyup",this.keyboard.handleKeyUp),document.addEventListener("keypress",this.keyboard.handleKeyPress),t.romData&&(this.nes.loadROM(t.romData),this.start())}start(){this._frameTimer.start(),this._speakers.start(),this._fpsInterval=setInterval(()=>{ot(`FPS: ${this.nes.getFPS()}`)},1e3)}stop(){this._frameTimer.stop(),this._speakers.stop(),clearInterval(this._fpsInterval)}loadROM(t){this.stop(),this.nes.loadROM(t),this.start()}fitInParent(){this._screen.fitInParent()}screenshot(){return this._screen.screenshot()}destroy(){this.stop(),document.removeEventListener("keydown",this.keyboard.handleKeyDown),document.removeEventListener("keyup",this.keyboard.handleKeyUp),document.removeEventListener("keypress",this.keyboard.handleKeyPress),this._gamepadPolling.stop(),this._screen.destroy()}static loadROMFromURL(t,s){var e=new XMLHttpRequest;return e.open("GET",t),e.overrideMimeType("text/plain; charset=x-user-defined"),e.onerror=()=>s(new Error(`Error loading ${t}: ${e.statusText}`)),e.onload=function(){200===this.status?s(null,this.responseText):0===this.status||e.onerror()},e.send(),e}}return s})());
//# sourceMappingURL=jsnes.min.js.map