UNPKG

nes-js

Version:
1 lines 82.1 kB
!function(t){function e(s){if(i[s])return i[s].exports;var n=i[s]={i:s,l:!1,exports:{}};return t[s].call(n.exports,n,n.exports,e),n.l=!0,n.exports}var i={};e.m=t,e.c=i,e.d=function(t,i,s){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:s})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=3)}([function(t,e,i){"use strict";function s(t){this.data=new t(1),this.data[0]=0}function n(){s.call(this,s.TYPE_8BIT)}function r(){s.call(this,s.TYPE_16BIT),this.bytes=new Uint8Array(this.data.buffer)}i.d(e,"b",function(){return n}),i.d(e,"a",function(){return r});var o=i(1);s.TYPE_8BIT=Uint8Array,s.TYPE_16BIT=Uint16Array,Object.assign(s.prototype,{isRegister:!0,getWidth:function(){return 8*this.data.byteLength},load:function(){return this.data[0]},loadBit:function(t){return this.data[0]>>t&1},loadBits:function(t,e){return this.data[0]>>t&(1<<e)-1},store:function(t){this.data[0]=t},storeBit:function(t,e){e&=1,this.data[0]=this.data[0]&~(1<<t)|e<<t},storeBits:function(t,e,i){var s=(1<<e)-1;i&=s,this.data[0]=this.data[0]&~(s<<t)|i<<t},clear:function(){this.data[0]=0},setBit:function(t){this.storeBit(t,1)},clearBit:function(t){this.storeBit(t,0)},isBitSet:function(t){return 1===this.loadBit(t)},increment:function(){this.data[0]++},incrementBy2:function(){this.data[0]+=2},add:function(t){this.data[0]+=t},decrement:function(){this.data[0]--},decrementBy2:function(){this.data[0]-=2},sub:function(t){this.data[0]-=t},shift:function(t){t&=1;var e=this.loadBit(this.getWidth()-1);return this.data[0]=this.data[0]<<1|t,e},dump:function(){return o.a.convertDecToHexString(this.load(),this.getWidth()/4)}}),n.prototype=Object.assign(Object.create(s.prototype),{isRegister8bit:!0}),r.prototype=Object.assign(Object.create(s.prototype),{isRegister16bit:!0,loadHigherByte:function(){return this.bytes[1]},loadLowerByte:function(){return this.bytes[0]},storeHigherByte:function(t){this.bytes[1]=t},storeLowerByte:function(t){this.bytes[0]=t}})},function(t,e,i){"use strict";function s(){}i.d(e,"a",function(){return s}),s.convertDecToHexString=function(t,e,i){var s=t.toString(16),n="";if(t<0&&(n+="-"),!0!==i&&(n+="0x"),void 0===e)return n+s;for(var r="",o=0;o<e;o++)r+="0";return n+(r+s).substr(-1*e)}},function(t,e,i){"use strict";function s(t){this.data=new Uint8Array(t)}i.d(e,"a",function(){return s});var n=i(1);Object.assign(s.prototype,{isMemory:!0,clear:function(){for(var t=0,e=this.getCapacity();t<e;t++)this.storeWithoutMapping(t,0)},getCapacity:function(){return this.data.byteLength},load:function(t){return this.data[t]},loadWithoutMapping:function(t){return this.data[t]},store:function(t,e){this.data[t]=e},storeWithoutMapping:function(t,e){this.data[t]=e},dump:function(){for(var t="",e=!1,i=this._getStartDumpAddress(),s=this._getEndDumpAddress(),r=i;r<s;r++){if(r%16==0){if(e){for(var o=!1;this._checkNext16BytesIsZero(r+16);)r+=16,o=!0;o&&(t+="...\n")}t+=n.a.convertDecToHexString(r-i,4)+" ",e=!0}var c=this._loadForDump(r);t+=n.a.convertDecToHexString(c,2,!0)+" ",0!=c&&(e=!1),r%16==15&&(t+="\n")}return t},_loadForDump:function(t){return this.loadWithoutMapping(t)},_getStartDumpAddress:function(){return 0},_getEndDumpAddress:function(){return this.getCapacity()},_checkNext16BytesIsZero:function(t){if(t+16>=this._getEndDumpAddress())return!1;for(var e=0,i=t;i<t+16;i++)e+=this._loadForDump(i);return 0===e}})},function(t,e,i){"use strict";function s(){}Object.defineProperty(e,"__esModule",{value:!0});var n=i(4),r=i(9),o=i(11),c=i(12);s.Nes=n.a,s.Rom=r.a,s.Audio=o.a,s.Display=c.a,void 0!==window&&(window.NesJs=s)},function(t,e,i){"use strict";function s(){this.ppu=new r.a,this.cpu=new n.a,this.apu=new o.a,this.pad1=new c.a,this.pad2=new c.a,this.rom=null,this.cpu.setPpu(this.ppu),this.cpu.setApu(this.apu),this.cpu.setJoypad1(this.pad1),this.cpu.setJoypad2(this.pad2),this.ppu.setCpu(this.cpu),this.apu.setCpu(this.cpu),this.state=this.STATES.POWER_OFF,this.audioEnabled=!1;var t=this;this.runFunc=function(){t.run()},this.onFpsUpdates=[]}i.d(e,"a",function(){return s});var n=i(5),r=i(6),o=i(7),c=i(8);Object.assign(s.prototype,{isNes:!0,STATES:{POWER_OFF:0,RUN:1,STOP:2},KEY_TO_PAD_BUTTONS:{13:c.a.BUTTONS.START,32:c.a.BUTTONS.SELECT,37:c.a.BUTTONS.LEFT,38:c.a.BUTTONS.UP,39:c.a.BUTTONS.RIGHT,40:c.a.BUTTONS.DOWN,88:c.a.BUTTONS.A,90:c.a.BUTTONS.B},addEventListener:function(t,e){switch(t){case"fps":this.onFpsUpdates.push(e);break;default:throw new Error("Nes.addEventListener: unknown type "+t)}},invokeFpsUpdateListeners:function(t){for(var e=0,i=this.onFpsUpdates.length;e<i;e++)this.onFpsUpdates[e](t)},setRom:function(t){this.rom=t,this.cpu.setRom(t),this.ppu.setRom(t)},setDisplay:function(t){this.ppu.setDisplay(t)},setAudio:function(t){this.apu.setAudio(t),this.audioEnabled=!0},bootup:function(){this.cpu.bootup(),this.ppu.bootup(),this.apu.bootup(),this.state=this.STATES.RUN},reset:function(){this.cpu.reset(),this.ppu.reset(),this.apu.reset()},stop:function(){this.state=this.STATES.STOP},resume:function(){this.state=this.STATES.RUN,this.run()},run:function(){this.measureFps();for(var t=0;t<29780;t++)this.runCycle();this.state===this.STATES.RUN&&requestAnimationFrame(this.runFunc)},runCycle:function(){this.cpu.runCycle(),this.ppu.runCycle(),this.ppu.runCycle(),this.ppu.runCycle(),!0===this.audioEnabled&&this.apu.runCycle()},runStep:function(){if(this.state===this.STATES.STOP)do{this.runCycle()}while(this.cpu.isStall())},handleKeyDown:function(t){void 0!==this.KEY_TO_PAD_BUTTONS[t.keyCode]&&this.pad1.pressButton(this.KEY_TO_PAD_BUTTONS[t.keyCode]),t.preventDefault()},handleKeyUp:function(t){void 0!==this.KEY_TO_PAD_BUTTONS[t.keyCode]&&this.pad1.releaseButton(this.KEY_TO_PAD_BUTTONS[t.keyCode]),t.preventDefault()},measureFps:function(){var t=null,e=0;return function(){if(60===e){var i=performance.now();null!==t&&this.invokeFpsUpdateListeners(6e4/(i-t)),t=i,e=0}e++}}(),dumpCpu:function(){return this.cpu.dump()},dumpRam:function(){return this.cpu.dumpRAM()},dumpRom:function(){var t="";return t+=this.rom.dumpHeader(),t+="\n",t+=this.rom.dump(),t+="\n",t+=this.cpu.disassembleROM(),t+="\n"},dumpPpu:function(){return this.ppu.dump()},dumpVRam:function(){return this.ppu.dumpVRAM()},dumpSprRam:function(){return this.ppu.dumpSPRRAM()}})},function(t,e,i){"use strict";function s(){this.pc=new r.a,this.sp=new r.b,this.a=new r.b,this.x=new r.b,this.y=new r.b,this.p=new n,this.ram=new o.a(65536),this.ppu=null,this.apu=null,this.pad1=null,this.pad2=null,this.rom=null,this.stallCycle=0}function n(){r.b.call(this)}i.d(e,"a",function(){return s});var r=i(0),o=i(2),c=i(1);s.INTERRUPTS={NMI:0,RESET:1,IRQ:2,BRK:3},s.INTERRUPT_HANDLER_ADDRESSES=[],s.INTERRUPT_HANDLER_ADDRESSES[s.INTERRUPTS.NMI]=65530,s.INTERRUPT_HANDLER_ADDRESSES[s.INTERRUPTS.RESET]=65532,s.INTERRUPT_HANDLER_ADDRESSES[s.INTERRUPTS.IRQ]=65534,s.INTERRUPT_HANDLER_ADDRESSES[s.INTERRUPTS.BRK]=65534,s.INSTRUCTIONS={INV:{id:0,name:"inv"},ADC:{id:1,name:"adc"},AND:{id:2,name:"and"},ASL:{id:3,name:"asl"},BCC:{id:4,name:"bcc"},BCS:{id:5,name:"bcs"},BEQ:{id:6,name:"beq"},BIT:{id:7,name:"bit"},BMI:{id:8,name:"bmi"},BNE:{id:9,name:"bne"},BPL:{id:10,name:"bpl"},BRK:{id:11,name:"brk"},BVC:{id:12,name:"bvc"},BVS:{id:13,name:"bvs"},CLC:{id:14,name:"clc"},CLD:{id:15,name:"cld"},CLI:{id:16,name:"cli"},CLV:{id:17,name:"clv"},CMP:{id:18,name:"cmp"},CPX:{id:19,name:"cpx"},CPY:{id:20,name:"cpy"},DEC:{id:21,name:"dec"},DEX:{id:22,name:"dex"},DEY:{id:23,name:"dey"},EOR:{id:24,name:"eor"},INC:{id:25,name:"inc"},INX:{id:26,name:"inx"},INY:{id:27,name:"iny"},JMP:{id:28,name:"jmp"},JSR:{id:29,name:"jsr"},LDA:{id:30,name:"lda"},LDX:{id:31,name:"ldx"},LDY:{id:32,name:"ldy"},LSR:{id:33,name:"lsr"},NOP:{id:34,name:"nop"},ORA:{id:35,name:"ora"},PHA:{id:36,name:"pha"},PHP:{id:37,name:"php"},PLA:{id:38,name:"pla"},PLP:{id:39,name:"plp"},ROL:{id:40,name:"rol"},ROR:{id:41,name:"ror"},RTI:{id:42,name:"rti"},RTS:{id:43,name:"rts"},SBC:{id:44,name:"sbc"},SEC:{id:45,name:"sec"},SED:{id:46,name:"sed"},SEI:{id:47,name:"sei"},STA:{id:48,name:"sta"},STX:{id:49,name:"stx"},STY:{id:50,name:"sty"},TAX:{id:51,name:"tax"},TAY:{id:52,name:"tay"},TSX:{id:53,name:"tsx"},TXA:{id:54,name:"txa"},TXS:{id:55,name:"txs"},TYA:{id:56,name:"tya"}},s.ADDRESSINGS={IMMEDIATE:{id:0,pc:2,name:"immediate"},ABSOLUTE:{id:1,pc:3,name:"absolute"},INDEXED_ABSOLUTE_X:{id:2,pc:3,name:"indexed_absolute_x"},INDEXED_ABSOLUTE_Y:{id:3,pc:3,name:"indexed_absolute_y"},ZERO_PAGE:{id:4,pc:2,name:"zero_page"},INDEXED_ZERO_PAGE_X:{id:5,pc:2,name:"indexed_zero_page_x"},INDEXED_ZERO_PAGE_Y:{id:6,pc:2,name:"indexed_zero_page_y"},IMPLIED:{id:7,pc:1,name:"implied"},ACCUMULATOR:{id:8,pc:1,name:"accumulator"},INDIRECT:{id:9,pc:3,name:"indirect"},INDEXED_INDIRECT_X:{id:10,pc:2,name:"indexed_indirect_x"},INDEXED_INDIRECT_Y:{id:11,pc:2,name:"indexed_indirect_y"},RELATIVE:{id:12,pc:2,name:"relative"}},s.OPS=[{instruction:s.INSTRUCTIONS.BRK,cycle:7,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.ORA,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.ORA,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.ASL,cycle:5,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.PHP,cycle:3,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.ORA,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.ASL,cycle:2,mode:s.ADDRESSINGS.ACCUMULATOR},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.ORA,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.ASL,cycle:6,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BPL,cycle:2,mode:s.ADDRESSINGS.RELATIVE},{instruction:s.INSTRUCTIONS.ORA,cycle:5,mode:s.ADDRESSINGS.INDEXED_INDIRECT_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.ORA,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.ASL,cycle:6,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CLC,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.ORA,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.ORA,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.ASL,cycle:7,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.JSR,cycle:0,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.AND,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BIT,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.AND,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.ROL,cycle:5,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.PLP,cycle:4,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.AND,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.ROL,cycle:2,mode:s.ADDRESSINGS.ACCUMULATOR},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BIT,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.AND,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.ROL,cycle:6,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BMI,cycle:2,mode:s.ADDRESSINGS.RELATIVE},{instruction:s.INSTRUCTIONS.AND,cycle:5,mode:s.ADDRESSINGS.INDEXED_INDIRECT_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.AND,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.ROL,cycle:6,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.SEC,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.AND,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.AND,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.ROL,cycle:7,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.RTI,cycle:6,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.EOR,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.EOR,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.LSR,cycle:5,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.PHA,cycle:3,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.EOR,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.LSR,cycle:2,mode:s.ADDRESSINGS.ACCUMULATOR},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.JMP,cycle:0,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.EOR,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.LSR,cycle:6,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BVC,cycle:2,mode:s.ADDRESSINGS.RELATIVE},{instruction:s.INSTRUCTIONS.EOR,cycle:5,mode:s.ADDRESSINGS.INDEXED_INDIRECT_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.EOR,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.LSR,cycle:6,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CLI,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.EOR,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.EOR,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.LSR,cycle:7,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.RTS,cycle:6,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.ADC,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.ADC,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.ROR,cycle:5,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.PLA,cycle:4,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.ADC,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.ROR,cycle:2,mode:s.ADDRESSINGS.ACCUMULATOR},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.JMP,cycle:0,mode:s.ADDRESSINGS.INDIRECT},{instruction:s.INSTRUCTIONS.ADC,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.ROR,cycle:6,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BVS,cycle:2,mode:s.ADDRESSINGS.RELATIVE},{instruction:s.INSTRUCTIONS.ADC,cycle:5,mode:s.ADDRESSINGS.INDEXED_INDIRECT_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.ADC,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.ROR,cycle:6,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.SEI,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.ADC,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.ADC,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.ROR,cycle:7,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.STA,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.STY,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.STA,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.STX,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.DEY,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.TXA,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.STY,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.STA,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.STX,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BCC,cycle:2,mode:s.ADDRESSINGS.RELATIVE},{instruction:s.INSTRUCTIONS.STA,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.STY,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.STA,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.STX,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.TYA,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.STA,cycle:5,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.TXS,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.STA,cycle:5,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.LDY,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.LDA,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_X},{instruction:s.INSTRUCTIONS.LDX,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.LDY,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.LDA,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.LDX,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.TAY,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.LDA,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.TAX,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.LDY,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.LDA,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.LDX,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BCS,cycle:2,mode:s.ADDRESSINGS.RELATIVE},{instruction:s.INSTRUCTIONS.LDA,cycle:5,mode:s.ADDRESSINGS.INDEXED_INDIRECT_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.LDY,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.LDA,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.LDX,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CLV,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.LDA,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.TSX,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.LDY,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.LDA,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.LDX,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CPY,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.CMP,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CPY,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.CMP,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.DEC,cycle:5,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INY,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.CMP,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.DEX,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CPY,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.CMP,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.DEC,cycle:6,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BNE,cycle:2,mode:s.ADDRESSINGS.RELATIVE},{instruction:s.INSTRUCTIONS.CMP,cycle:5,mode:s.ADDRESSINGS.INDEXED_INDIRECT_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CMP,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.DEC,cycle:6,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CLD,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.CMP,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CMP,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.DEC,cycle:7,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CPX,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.SBC,cycle:6,mode:s.ADDRESSINGS.INDEXED_INDIRECT_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CPX,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.SBC,cycle:3,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INC,cycle:5,mode:s.ADDRESSINGS.ZERO_PAGE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INX,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.SBC,cycle:2,mode:s.ADDRESSINGS.IMMEDIATE},{instruction:s.INSTRUCTIONS.NOP,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.CPX,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.SBC,cycle:4,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INC,cycle:6,mode:s.ADDRESSINGS.ABSOLUTE},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.BEQ,cycle:2,mode:s.ADDRESSINGS.RELATIVE},{instruction:s.INSTRUCTIONS.SBC,cycle:5,mode:s.ADDRESSINGS.INDEXED_INDIRECT_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.SBC,cycle:4,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.INC,cycle:6,mode:s.ADDRESSINGS.INDEXED_ZERO_PAGE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.SED,cycle:2,mode:s.ADDRESSINGS.IMPLIED},{instruction:s.INSTRUCTIONS.SBC,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_Y},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null},{instruction:s.INSTRUCTIONS.SBC,cycle:4,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.INC,cycle:7,mode:s.ADDRESSINGS.INDEXED_ABSOLUTE_X},{instruction:s.INSTRUCTIONS.INV,cycle:0,mode:null}],Object.assign(s.prototype,{isCpu:!0,INTERRUPTS:s.INTERRUPTS,INTERRUPT_HANDLER_ADDRESSES:s.INTERRUPT_HANDLER_ADDRESSES,ADDRESSINGS:s.ADDRESSINGS,INSTRUCTIONS:s.INSTRUCTIONS,OPS:s.OPS,setPpu:function(t){this.ppu=t},setApu:function(t){this.apu=t},setJoypad1:function(t){this.pad1=t},setJoypad2:function(t){this.pad2=t},setRom:function(t){this.rom=t},bootup:function(){this.p.store(52),this.a.clear(),this.x.clear(),this.y.clear(),this.sp.store(253);for(var t=0;t<15;t++)this.store(16384+t,0);this.store(16405,0),this.store(16407,0),this.interrupt(this.INTERRUPTS.RESET)},reset:function(){this.sp.sub(3),this.p.setI(),this.interrupt(this.INTERRUPTS.RESET)},runCycle:function(){if(!0!==this.isStall()){var t=this.fetch(),e=this.decode(t);this.operate(e,t),this.stallCycle=e.cycle}this.stallCycle--},isStall:function(){return this.stallCycle>0},interrupt:function(t){t===this.INTERRUPTS.IRQ&&!0===this.p.isI()||(t!==this.INTERRUPTS.RESET&&(t!==this.INTERRUPTS.BRK&&this.p.clearB(),this.p.setA(),this.pushStack2Bytes(this.pc.load()),this.pushStack(this.p.load()),this.p.setI()),this.jumpToInterruptHandler(t))},load:function(t){return t&=65535,t>=0&&t<8192?this.ram.load(2047&t):t>=8192&&t<16384?this.ppu.loadRegister(8199&t):t>=16384&&t<16404?this.apu.loadRegister(t):16404===t?this.ppu.loadRegister(t):16405===t?this.apu.loadRegister(t):16406===t?this.pad1.loadRegister():t>=16407&&t<16416?this.apu.loadRegister(t):t>=16416&&t<24576?this.ram.load(t):t>=24576&&t<32768?this.ram.load(t):t>=32768&&t<65536?this.rom.load(t):void 0},store:function(t,e){return t&=65535,t>=0&&t<8192?this.ram.store(2047&t,e):t>=8192&&t<16384?this.ppu.storeRegister(8199&t,e):t>=16384&&t<16404?this.apu.storeRegister(t,e):16404===t?this.ppu.storeRegister(t,e):16405===t?this.apu.storeRegister(t,e):16406===t?this.pad1.storeRegister(e):t>=16407&&t<16416?this.apu.storeRegister(t,e):t>=16416&&t<24576?this.ram.store(t,e):t>=24576&&t<32768?this.ram.store(t,e):t>=32768&&t<65536?this.rom.store(t,e):void 0},load2Bytes:function(t){return this.load(t)|this.load(t+1)<<8},load2BytesFromZeropage:function(t){return this.ram.load(255&t)|this.ram.load(t+1&255)<<8},load2BytesInPage:function(t){var e=t,i=65280&t|t+1&255;return this.load(e)|this.load(i)<<8},store2Bytes:function(t,e){this.store(t,e),this.store(t+1,e>>8)},fetch:function(){var t=this.load(this.pc.load());return this.pc.increment(),t},decode:function(t){return this.OPS[t]},jumpToInterruptHandler:function(t){this.pc.store(this.load2Bytes(this.INTERRUPT_HANDLER_ADDRESSES[t]))},loadWithAddressingMode:function(t){if(t.mode.id===this.ADDRESSINGS.ACCUMULATOR.id)return this.a.load();var e=this.getAddressWithAddressingMode(t),i=this.load(e);return t.mode.id===this.ADDRESSINGS.RELATIVE.id&&128&i&&(i|=65280),i},storeWithAddressingMode:function(t,e){if(t.mode.id===this.ADDRESSINGS.ACCUMULATOR.id)return void this.a.store(e);var i=this.getAddressWithAddressingMode(t);this.store(i,e)},updateMemoryWithAddressingMode:function(t,e){var i,s;t.mode.id==this.ADDRESSINGS.ACCUMULATOR.id?s=this.a.load():(i=this.getAddressWithAddressingMode(t),s=this.load(i));var n=e(s);t.mode.id==this.ADDRESSINGS.ACCUMULATOR.id?this.a.store(n):this.store(i,n)},getAddressWithAddressingMode:function(t){var e=null;switch(t.mode.id){case this.ADDRESSINGS.IMMEDIATE.id:case this.ADDRESSINGS.RELATIVE.id:e=this.pc.load(),this.pc.increment();break;case this.ADDRESSINGS.ABSOLUTE.id:case this.ADDRESSINGS.INDEXED_ABSOLUTE_X.id:case this.ADDRESSINGS.INDEXED_ABSOLUTE_Y.id:switch(e=this.load2Bytes(this.pc.load()),this.pc.incrementBy2(),t.mode.id){case this.ADDRESSINGS.INDEXED_ABSOLUTE_X.id:e+=this.x.load();break;case this.ADDRESSINGS.INDEXED_ABSOLUTE_Y.id:e+=this.y.load()}e&=65535;break;case this.ADDRESSINGS.ZERO_PAGE.id:case this.ADDRESSINGS.INDEXED_ZERO_PAGE_X.id:case this.ADDRESSINGS.INDEXED_ZERO_PAGE_Y.id:switch(e=this.load(this.pc.load()),this.pc.increment(),t.mode.id){case this.ADDRESSINGS.INDEXED_ZERO_PAGE_X.id:e+=this.x.load();break;case this.ADDRESSINGS.INDEXED_ZERO_PAGE_Y.id:e+=this.y.load()}e&=255;break;case this.ADDRESSINGS.INDIRECT.id:var i=this.load2Bytes(this.pc.load());this.pc.incrementBy2(),e=this.load2BytesInPage(i);break;case this.ADDRESSINGS.INDEXED_INDIRECT_X.id:var i=this.load(this.pc.load());this.pc.increment(),i+=this.x.load(),i&=255,e=this.load2BytesFromZeropage(i);break;case this.ADDRESSINGS.INDEXED_INDIRECT_Y.id:var i=this.load(this.pc.load());this.pc.increment(),e=this.load2BytesFromZeropage(i),e+=this.y.load(),e&=65535;break;default:throw new Error("Cpu: Unkown addressing mode.")}return e},updateN:function(t){0==(128&t)?this.p.clearN():this.p.setN()},updateZ:function(t){0==(255&t)?this.p.setZ():this.p.clearZ()},updateC:function(t){0==(256&t)?this.p.clearC():this.p.setC()},getStackAddress:function(){return this.sp.load()+256},pushStack:function(t){this.store(this.getStackAddress(),t),this.sp.decrement()},pushStack2Bytes:function(t){this.store(this.getStackAddress(),t>>8&255),this.sp.decrement(),this.store(this.getStackAddress(),255&t),this.sp.decrement()},popStack:function(){return this.sp.increment(),this.load(this.getStackAddress())},popStack2Bytes:function(){this.sp.increment();var t=this.load(this.getStackAddress());return this.sp.increment(),this.load(this.getStackAddress())<<8|t},doBranch:function(t,e){var i=this.loadWithAddressingMode(t);e&&this.pc.add(i)},operate:function(t,e){switch(t.instruction.id){case this.INSTRUCTIONS.ADC.id:var i=this.a.load(),s=this.loadWithAddressingMode(t),n=this.p.isC()?1:0,r=i+s+n;this.a.store(r),this.updateN(r),this.updateZ(r),this.updateC(r),!(128&(i^s))&&128&(s^r)?this.p.setV():this.p.clearV();break;case this.INSTRUCTIONS.AND.id:var i=this.a.load(),s=this.loadWithAddressingMode(t),r=i&s;this.a.store(r),this.updateN(r),this.updateZ(r);break;case this.INSTRUCTIONS.ASL.id:var o=this,a=function(t){var e=t<<1;return o.updateN(e),o.updateZ(e),o.updateC(e),e};this.updateMemoryWithAddressingMode(t,a);break;case this.INSTRUCTIONS.BCC.id:this.doBranch(t,!this.p.isC());break;case this.INSTRUCTIONS.BCS.id:this.doBranch(t,this.p.isC());break;case this.INSTRUCTIONS.BEQ.id:this.doBranch(t,this.p.isZ());break;case this.INSTRUCTIONS.BIT.id:var i=this.a.load(),s=this.loadWithAddressingMode(t),r=i&s;this.updateN(s),this.updateZ(r),0==(64&s)?this.p.clearV():this.p.setV();break;case this.INSTRUCTIONS.BMI.id:this.doBranch(t,this.p.isN());break;case this.INSTRUCTIONS.BNE.id:this.doBranch(t,!this.p.isZ());break;case this.INSTRUCTIONS.BPL.id:this.doBranch(t,!this.p.isN());break;case this.INSTRUCTIONS.BRK.id:this.pc.increment(),this.p.setA(),this.p.setB(),this.interrupt(this.INTERRUPTS.BRK);break;case this.INSTRUCTIONS.BVC.id:this.doBranch(t,!this.p.isV());break;case this.INSTRUCTIONS.BVS.id:this.doBranch(t,this.p.isV());break;case this.INSTRUCTIONS.CLC.id:this.p.clearC();break;case this.INSTRUCTIONS.CLD.id:this.p.clearD();break;case this.INSTRUCTIONS.CLI.id:this.p.clearI();break;case this.INSTRUCTIONS.CLV.id:this.p.clearV();break;case this.INSTRUCTIONS.CMP.id:case this.INSTRUCTIONS.CPX.id:case this.INSTRUCTIONS.CPY.id:var i;switch(t.instruction.id){case this.INSTRUCTIONS.CMP.id:i=this.a.load();break;case this.INSTRUCTIONS.CPX.id:i=this.x.load();break;case this.INSTRUCTIONS.CPY.id:i=this.y.load()}var s=this.loadWithAddressingMode(t),r=i-s;this.updateN(r),this.updateZ(r),i>=s?this.p.setC():this.p.clearC();break;case this.INSTRUCTIONS.DEC.id:var o=this,a=function(t){var e=t-1;return o.updateN(e),o.updateZ(e),e};this.updateMemoryWithAddressingMode(t,a);break;case this.INSTRUCTIONS.DEX.id:case this.INSTRUCTIONS.DEY.id:var h;switch(t.instruction.id){case this.INSTRUCTIONS.DEX.id:h=this.x;break;case this.INSTRUCTIONS.DEY.id:h=this.y}var i=h.load(),r=i-1;h.store(r),this.updateN(r),this.updateZ(r);break;case this.INSTRUCTIONS.EOR.id:var i=this.a.load(),s=this.loadWithAddressingMode(t),r=i^s;this.a.store(r),this.updateN(r),this.updateZ(r);break;case this.INSTRUCTIONS.INC.id:var o=this,a=function(t){var e=t+1;return o.updateN(e),o.updateZ(e),e};this.updateMemoryWithAddressingMode(t,a);break;case this.INSTRUCTIONS.INX.id:case this.INSTRUCTIONS.INY.id:var h;switch(t.instruction.id){case this.INSTRUCTIONS.INX.id:h=this.x;break;case this.INSTRUCTIONS.INY.id:h=this.y}var i=h.load(),r=i+1;h.store(r),this.updateN(r),this.updateZ(r);break;case this.INSTRUCTIONS.JMP.id:var S=this.getAddressWithAddressingMode(t);this.pc.store(S);break;case this.INSTRUCTIONS.JSR.id:var S=this.getAddressWithAddressingMode(t);this.pc.decrement(),this.pushStack2Bytes(this.pc.load()),this.pc.store(S);break;case this.INSTRUCTIONS.LDA.id:case this.INSTRUCTIONS.LDX.id:case this.INSTRUCTIONS.LDY.id:var h,r=this.loadWithAddressingMode(t);switch(t.instruction.id){case this.INSTRUCTIONS.LDA.id:h=this.a;break;case this.INSTRUCTIONS.LDX.id:h=this.x;break;case this.INSTRUCTIONS.LDY.id:h=this.y}h.store(r),this.updateN(r),this.updateZ(r);break;case this.INSTRUCTIONS.LSR.id:var o=this,a=function(t){var e=t>>1;return o.p.clearN(),o.updateZ(e),0==(1&t)?o.p.clearC():o.p.setC(),e};this.updateMemoryWithAddressingMode(t,a);break;case this.INSTRUCTIONS.NOP.id:break;case this.INSTRUCTIONS.ORA.id:var i=this.a.load(),s=this.loadWithAddressingMode(t),r=i|s;this.a.store(r),this.updateN(r),this.updateZ(r);break;case this.INSTRUCTIONS.PHA.id:case this.INSTRUCTIONS.PHP.id:var h;switch(t.instruction.id){case this.INSTRUCTIONS.PHA.id:h=this.a;break;case this.INSTRUCTIONS.PHP.id:this.p.setA(),this.p.setB(),h=this.p}this.pushStack(h.load());break;case this.INSTRUCTIONS.PLA.id:var r=this.popStack();this.a.store(r),this.updateN(r),this.updateZ(r);break;case this.INSTRUCTIONS.PLP.id:this.p.store(this.popStack());break;case this.INSTRUCTIONS.ROL.id:var o=this,a=function(t){var e=o.p.isC()?1:0,i=t<<1|e;return o.updateN(i),o.updateZ(i),o.updateC(i),i};this.updateMemoryWithAddressingMode(t,a);break;case this.INSTRUCTIONS.ROR.id:var o=this,a=function(t){var e=o.p.isC()?128:0,i=t>>1|e;return o.updateN(i),o.updateZ(i),0==(1&t)?o.p.clearC():o.p.setC(),i};this.updateMemoryWithAddressingMode(t,a);break;case this.INSTRUCTIONS.RTI.id:this.p.store(this.popStack()),this.pc.store(this.popStack2Bytes());break;case this.INSTRUCTIONS.RTS.id:this.pc.store(this.popStack2Bytes()+1);break;case this.INSTRUCTIONS.SBC.id:var i=this.a.load(),s=this.loadWithAddressingMode(t),n=this.p.isC()?0:1,r=i-s-n;this.a.store(r),this.updateN(r),this.updateZ(r),i>=s+n?this.p.setC():this.p.clearC(),128&(i^r)&&128&(i^s)?this.p.setV():this.p.clearV();break;case this.INSTRUCTIONS.SEC.id:this.p.setC();break;case this.INSTRUCTIONS.SED.id:this.p.setD();break;case this.INSTRUCTIONS.SEI.id:this.p.setI();break;case this.INSTRUCTIONS.STA.id:case this.INSTRUCTIONS.STX.id:case this.INSTRUCTIONS.STY.id:var h;switch(t.instruction.id){case this.INSTRUCTIONS.STA.id:h=this.a;break;case this.INSTRUCTIONS.STX.id:h=this.x;break;case this.INSTRUCTIONS.STY.id:h=this.y}this.storeWithAddressingMode(t,h.load());break;case this.INSTRUCTIONS.TAX.id:case this.INSTRUCTIONS.TAY.id:case this.INSTRUCTIONS.TSX.id:case this.INSTRUCTIONS.TXA.id:case this.INSTRUCTIONS.TXS.id:case this.INSTRUCTIONS.TYA.id:var u,I;switch(t.instruction.id){case this.INSTRUCTIONS.TAX.id:u=this.a,I=this.x;break;case this.INSTRUCTIONS.TAY.id:u=this.a,I=this.y;break;case this.INSTRUCTIONS.TSX.id:u=this.sp,I=this.x;break;case this.INSTRUCTIONS.TXA.id:u=this.x,I=this.a;break;case this.INSTRUCTIONS.TXS.id:u=this.x,I=this.sp;break;case this.INSTRUCTIONS.TYA.id:u=this.y,I=this.a}var r=u.load();I.store(r),t.instruction.id!=this.INSTRUCTIONS.TXS.id&&(this.updateN(r),this.updateZ(r));break;default:throw new Error("Cpu.operate: Invalid instruction, pc="+c.a.convertDecToHexString(this.pc.load()-1)+" opc="+c.a.convertDecToHexString(e,2)+" name="+t.instruction.name)}},disassembleROM:function(){for(var t="",e=this.rom,i=e.getHeaderSize(),s=!1,n=!1;i<16400;){var r="",o=e.loadWithoutMapping(i),a=this.decode(o);if(s&&0==o&&0==e.loadWithoutMapping(i+1&65535))i+=1,n=!0;else{for(n&&(t+="...\n"),n=!1,r+=c.a.convertDecToHexString(i-e.getHeaderSize(),4)+" ",r+=c.a.convertDecToHexString(o,2)+" ",r+=a.instruction.name+" ",r+=this.dumpMemoryAddressingMode(a,e,i+1&65535)+" ";r.length<30;)r+=" ";a.mode?(r+=a.mode.name,i+=a.mode.pc):i+=1,t+=r+"\n",s=0==o}}return t},dump:function(){var t="",e=this.load(this.pc.load()),i=this.decode(e);for(t+="p:"+this.p.dump()+" ",t+="pc:"+this.pc.dump()+"("+c.a.convertDecToHexString(e,2)+") ",t+="sp:"+this.sp.dump()+" ",t+="a:"+this.a.dump()+" ",t+="x:"+this.x.dump()+" ",t+="y:"+this.y.dump()+" ",t+=i.instruction.name+" "+this.dumpMemoryAddressingMode(i,this,this.pc.load()+1&65535)+" ";t.length<90;)t+=" ";return t+=i.mode.name},dumpRAM:function(){return this.ram.dump()},dumpMemoryAddressingMode:function(t,e,i){var n="",r=e instanceof s;switch(t.mode){case this.ADDRESSINGS.IMMEDIATE:n+="#"+c.a.convertDecToHexString(e.load(i,!0),2);break;case this.ADDRESSINGS.RELATIVE:var o=e.load(i,!0);128&o&&(o=-(256-o)),n+=o.toString(10);break;case this.ADDRESSINGS.ABSOLUTE:var a=e.load2Bytes(i,!0);n+=c.a.convertDecToHexString(a,4),r&&(n+="("+c.a.convertDecToHexString(e.load(a,!0),2)+")");break;case this.ADDRESSINGS.INDEXED_ABSOLUTE_X:var a=e.load2Bytes(i,!0);n+=c.a.convertDecToHexString(a,4)+",X ",r&&(a+=this.x.load(),a&=65535,n+="("+c.a.convertDecToHexString(e.load(a,!0),2)+")");break;case this.ADDRESSINGS.INDEXED_ABSOLUTE_Y:var a=e.load2Bytes(i,!0);n+=c.a.convertDecToHexString(a,4)+",Y ",r&&(a+=this.y.load(),a&=65535,n+="("+c.a.convertDecToHexString(e.load(a,!0),2)+")");break;case this.ADDRESSINGS.ZERO_PAGE:var a=e.load(i,!0);n+=c.a.convertDecToHexString(a,2),r&&(n+="("+c.a.convertDecToHexString(e.load(a,!0),2)+")");break;case this.ADDRESSINGS.INDEXED_ZERO_PAGE_X:var a=e.load(i,!0);n+=c.a.convertDecToHexString(a,2)+",X ",r&&(a+=this.x.load(),a&=255,n+="("+c.a.convertDecToHexString(e.load(a,!0),2)+")");break;case this.ADDRESSINGS.INDEXED_ZERO_PAGE_Y:var a=e.load(i,!0);n+=c.a.convertDecToHexString(a,2)+",Y ",r&&(a+=this.y.load(),a&=255,n+="("+c.a.convertDecToHexString(e.load(a,!0),2)+")");break;case this.ADDRESSINGS.INDIRECT:var a=e.load2Bytes(i,!0);if(n+=c.a.convertDecToHexString(a,4),r){var h=e.load2Bytes(a,!0);n+="(",n+=c.a.convertDecToHexString(h,4),n+="("+c.a.convertDecToHexString(e.load(h,!0),2)+")",n+=")"}break;case this.ADDRESSINGS.INDEXED_INDIRECT_X:var a=e.load(i,!0);if(n+="("+c.a.convertDecToHexString(a,2)+",X) ",r){a+=this.x.load(),a&=65535;var h=e.load2Bytes(a,!0);n+="(",n+=c.a.convertDecToHexString(h,4),n+="("+c.a.convertDecToHexString(e.load(h,!0),2)+")",n+=")"}break;case this.ADDRESSINGS.INDEXED_INDIRECT_Y:var a=e.load(i,!0);if(n+="("+c.a.convertDecToHexString(a,2)+"),Y ",r){var h=e.load2BytesFromZeropage(a,!0);h+=this.y.load(),h&=65535,n+="(",n+=c.a.convertDecToHexString(h,4),n+="("+c.a.convertDecToHexString(e.load(h,!0),2)+")",n+=")"}break;case this.ADDRESSINGS.ACCUMULATOR:r&&(n+="A("+c.a.convertDecToHexString(this.a.load(),2)+")");break;default:throw new Error("Cpu: Unkown addressing mode.")}return n}}),n.prototype=Object.assign(Object.create(r.b.prototype),{isCpuStatusRegister:!0,N_BIT:7,V_BIT:6,A_BIT:5,B_BIT:4,D_BIT:3,I_BIT:2,Z_BIT:1,C_BIT:0,isN:function(){return this.isBitSet(this.N_BIT)},setN:function(){this.setBit(this.N_BIT)},clearN:function(){this.clearBit(this.N_BIT)},isV:function(){return this.isBitSet(this.V_BIT)},setV:function(){this.setBit(this.V_BIT)},clearV:function(){this.clearBit(this.V_BIT)},isA:function(){return this.IsBitSet(this.A_BIT)},setA:function(){this.setBit(this.A_BIT)},clearA:function(){this.clearBit(this.A_BIT)},isB:function(){return this.isBitSet(this.B_BIT)},setB:function(){this.setBit(this.B_BIT)},clearB:function(){this.clearBit(this.B_BIT)},isD:function(){return this.isBitSet(this.D_BIT)},setD:function(){this.setBit(this.D_BIT)},clearD:function(){this.clearBit(this.D_BIT)},isI:function(){return this.isBitSet(this.I_BIT)},setI:function(){this.setBit(this.I_BIT)},clearI:function(){this.clearBit(this.I_BIT)},isZ:function(){return this.isBitSet(this.Z_BIT)},setZ:function(){this.setBit(this.Z_BIT)},clearZ:function(){this.clearBit(this.Z_BIT)},isC:function(){return this.isBitSet(this.C_BIT)},setC:function(){this.setBit(this.C_BIT)},clearC:function(){this.clearBit(this.C_BIT)},dump:function(){var t="";return t+=r.b.prototype.dump.call(this),t+="(",t+=this.isN()?"N":"-",t+=this.isV()?"V":"-",t+=this.isB()?"B":"-",t+=this.isD()?"D":"-",t+=this.isI()?"I":"-",t+=this.isZ()?"Z":"-",t+=this.isC()?"C":"-",t+=")"}})},function(t,e,i){"use strict";function s(){this.frame=0,this.scanLine=0,this.cycle=0,this.cpu=null,this.rom=null,this.display=null,this.vRam=new S.a(16384),this.oamRam=new S.a(256),this.oamRam2=new S.a(32),this.ppuctrl=new n,this.ppumask=new r,this.ppustatus=new o,this.oamaddr=new h.b,this.oamdata=new h.b,this.ppuscroll=new h.b,this.ppuaddr=new h.b,this.ppudata=new h.b,this.oamdma=new h.b,this.nameTableRegister=new h.b,this.attributeTableLowRegister=new h.a,this.attributeTableHighRegister=new h.a,this.patternTableLowRegister=new h.a,this.patternTableHighRegister=new h.a,this.nameTableLatch=0,this.attributeTableLowLatch=0,this.attributeTableHighLatch=0,this.patternTableLowLatch=0,this.patternTableHighLatch=0,this.fineXScroll=0,this.currentVRamAddress=0,this.temporalVRamAddress=0,this.vRamReadBuffer=0,this.registerFirstStore=!0,this.spritesManager=new c(this.oamRam),this.spritesManager2=new c(this.oamRam2),this.spritePixels=[],this.spriteIds=[],this.spritePriorities=[];for(var t=0;t<256;t++)this.spritePixels[t]=-1,this.spriteIds[t]=-1,this.spritePriorities[t]=-1}function n(){h.b.call(this)}function r(){h.b.call(this)}function o(){h.b.call(this)}function c(t){this.sprites=[],this.init(t)}function a(t,e,i){this.index=t,this.id=e,this.memory=i}i.d(e,"a",function(){return s});var h=i(0),S=i(2),u=i(1);Object.assign(s.prototype,{isPpu:!0,PALETTES:[4285887861,4287568679,4289396736,4288610375,4285989007,4279435435,4278190247,4278193023,4278202179,4278208256,4278210816,4279713536,4284432155,4278190080,4278190080,4278190080,4290559164,4293882624,4293868323,4294115459,4290707647,4284154087,4278201307,4279193547,4278219659,4278228736,4278233856,4282094336,4287333120,4278190080,4278190080,4278190080,4294967295,4294950719,4294940511,4294806439,4294933495,4290213887,4284708863,4282096639,4282367987,4279489411,4283162447,4288215128,4292602624,4278190080,4278190080,4278190080,4294967295,4294961067,4294956999,4294953943,4294952959,4292593663,4289970175,4289453055,4288931839,4288937955,4290769835,4291821491,4294180767,4278190080,4278190080,4278190080],setCpu:function(t){this.cpu=t},setRom:function(t){this.rom=t},setDisplay:function(t){this.display=t},bootup:function(){this.ppustatus.store(128)},reset:function(){},runCycle:function(){this.renderPixel(),this.shiftRegisters(),this.fetch(),this.evaluateSprites(),this.updateFlags(),this.countUpScrollCounters(),this.countUpCycle()},loadRegister:function(t){switch(t){case 8194:var e=this.ppustatus.load();return this.ppustatus.clearVBlank(),this.registerFirstStore=!0,e;case 8196:return this.oamRam.load(this.oamaddr.load());case 8199:var e;return(16383&this.currentVRamAddress)>=0&&(16383&this.currentVRamAddress)<16128?(e=this.vRamReadBuffer,this.vRamReadBuffer=this.load(this.currentVRamAddress)):(e=this.load(this.currentVRamAddress),this.vRamReadBuffer=e),this.incrementVRamAddress(),e}return 0},storeRegister:function(t,e){switch(t){case 8192:this.ppuctrl.store(e),this.temporalVRamAddress&=-3073,this.temporalVRamAddress|=(3&e)<<10;break;case 8193:this.ppumask.store(e);break;case 8195:this.oamaddr.store(e);break;case 8196:this.oamdata.store(e),this.oamRam.store(this.oamaddr.load(),e),this.oamaddr.increment();break;case 8197:this.ppuscroll.store(e),!0===this.registerFirstStore?(this.fineXScroll=7&e,this.temporalVRamAddress&=-32,this.temporalVRamAddress|=e>>3&31):(this.temporalVRamAddress&=-29665,this.temporalVRamAddress|=(248&e)<<2,this.temporalVRamAddress|=(7&e)<<12),this.registerFirstStore=!this.registerFirstStore;break;case 8198:!0===this.registerFirstStore?(this.temporalVRamAddress&=-32513,this.temporalVRamAddress|=(63&e)<<8):(this.ppuaddr.store(e),this.temporalVRamAddress&=-256,this.temporalVRamAddress|=255&e,this.currentVRamAddress=this.temporalVRamAddress),this.registerFirstStore=!this.registerFirstStore;break;case 8199:this.ppudata.store(e),this.store(this.currentVRamAddress,e),this.incrementVRamAddress();break;case 16404:this.oamdma.store(e);for(var i=256*e,s=this.oamaddr.load();s<256;s++)this.oamRam.store(s,this.cpu.load(i+s));this.cpu.stallCycle+=514}},load:function(t){return(t&=16383)<8192&&!0===this.rom.hasChrRom()?this.rom.load(t):t>=8192&&t<16128?this.vRam.load(this.getNameTableAddressWithMirroring(12287&t)):(t>=16128&&t<16384&&(t&=16159),16144===t&&(t=16128),16148===t&&(t=16132),16152===t&&(t=16136),16156===t&&(t=16140),this.vRam.load(t))},store:function(t,e){return(t&=16383)<8192&&!0===this.rom.hasChrRom()?void this.rom.store(t,e):t>=8192&&t<16128?void this.vRam.store(this.getNameTableAddressWithMirroring(12287&t),e):(t>=16128&&t<16384&&(t&=16159),16144===t&&(t=16128),16148===t&&(t=16132),16152===t&&(t=16136),16156===t&&(t=16140),this.vRam.store(t,e))},getNameTableAddressWithMirroring:function(t){t&=12287;var e=0;switch(this.rom.getMirroringType()){case this.rom.MIRRORINGS.SINGLE_SCREEN:e=8192;break;case this.rom.MIRRORINGS.HORIZONTAL:e=t>=8192&&t<9216?8192:t>=9216&&t<10240?8192:9216;break;case this.rom.MIRRORINGS.VERTICAL:e=t>=8192&&t<9216?8192:t>=9216&&t<10240?9216:t>=10240&&t<11264?8192:9216;break;case this.rom.MIRRORINGS.FOUR_SCREEN:e=t>=8192&&t<9216?8192:t>=9216&&t<10240?9216:t>=10240&&t<11264?10240:11264}return e|1023&t},renderPixel:function(){if(!(this.cycle>=257||this.scanLine>=240||0===this.cycle)){var t=this.cycle-1,e=this.scanLine,i=this.ppumask.isBackgroundVisible(),s=this.ppumask.isSpritesVisible(),n=this.getBackgroundPixel(),r=this.spritePixels[t],o=this.spriteIds[t],c=this.spritePriorities[t],a=this.PALETTES[this.load(16128)];!0===i&&!0===s?a=-1===r?n:n===a?r:0===c?r:n:!0===i&&!1===s?a=n:!1===i&&!0===s&&-1!==r&&(a=r),!0===this.ppumask.emphasisRed()&&(a|=16711680),!0===this.ppumask.emphasisGreen()&&(a|=65280),!0===this.ppumask.emphasisBlue()&&(a|=255),!0===i&&!0===s&&0===o&&0!==r&&0!==n&&this.ppustatus.setZeroHit(),this.display.renderPixel(t,e,a)}},getBackgroundPixel:function(){var t=15-this.fineXScroll,e=this.patternTableHighRegister.loadBit(t)<<1|this.patternTableLowRegister.loadBit(t),i=this.attributeTableHighRegister.loadBit(t)<<1|this.attributeTableLowRegister.loadBit(t),s=i<<2|e;return!0===this.ppumask.isGreyscale()&&(s&=48),this.PALETTES[this.load(16128+s)]},shiftRegisters:function(){this.scanLine>=240&&this.scanLine<=260||(this.cycle>=1&&this.cycle<=256||this.cycle>=329&&this.cycle<=336)&&(this.patternTableLowRegister.shift(0),this.patternTableHighRegister.shift(0),this.attributeTableLowRegister.shift(0),this.attributeTableHighRegister.shift(0))},fetch:function(){if(!(this.scanLine>=240&&this.scanLine<=260||0===this.cycle||this.cycle>=257&&this.cycle<=320||this.cycle>=337)){switch((this.cycle-1)%8){case 0:this.fetchNameTable();break;case 2:this.fetchAttributeTable();break;case 4:this.fetchPatternTableLow();break;case 6:this.fetchPatternTableHigh()}this.cycle%8==1&&(this.nameTableRegister.store(this.nameTableLatch),this.attributeTableLowRegister.storeLowerByte(this.attributeTableLowLatch),this.attributeTableHighRegister.storeLowerByte(this.attributeTableHighLatch),this.patternTableLowRegister.storeLowerByte(this.patternTableLowLatch),this.patternTableHighRegister.storeLowerByte(this.patternTableHighLatch))}},fetchNameTable:function(){this.nameTableLatch=this.load(8192|4095&this.currentVRamAddress)},fetchAttributeTable:function(){var t=this.currentVRamAddress,e=9152|3072&t|t>>4&56|t>>2&7,i=this.load(e),s=31&t,n=t>>5&31,r=n%4>=2?1:0,o=s%4>=2?1:0,c=r<<1|o,a=i>>(c<<1)&3,h=a>>1,S=1&a;this.attributeTableHighLatch=1===h?255:0,this.attributeTableLowLatch=1===S?255:0},fetchPatternTableLow:function(){var t=this.currentVRamAddress>>12&7,e=4096*this.ppuctrl.getBackgroundPatternTableNum()+16*this.nameTableRegister.load()+t;this.patternTableLowLatch=this.load(e)},fetchPatternTableHigh:function(){var t=this.currentVRamAddress>>12&7,e=4096*this.ppuctrl.getBackgroundPatternTableNum()+16*this.nameTableRegister.load()+t;this.patternTableHighLatch=this.load(e+8)},updateFlags:function(){1===this.cycle&&(241===this.scanLine?(this.ppustatus.setVBlank(),this.display.updateScreen()):261===this.scanLine&&(this.ppustatus.clearVBlank(),this.ppustatus.clearZeroHit(),this.ppustatus.clearOverflow())),10===this.cycle&&241===this.scanLine&&!0===this.ppuctrl.enabledNmi()&&this.cpu.interrupt(this.cpu.INTERRUPTS.NMI)},countUpScrollCounters:function(){if((!1!==this.ppumask.isBackgroundVisible()||!1!==this.ppumask.isSpritesVisible())&&!(