diff --git a/gen/apple2-YBSXME7B.js b/gen/apple2-4HPKEG3T.js similarity index 99% rename from gen/apple2-YBSXME7B.js rename to gen/apple2-4HPKEG3T.js index be553ae5..88bd1857 100644 --- a/gen/apple2-YBSXME7B.js +++ b/gen/apple2-4HPKEG3T.js @@ -1,4 +1,4 @@ -import{a as r0}from"./chunk-BMGQJMLR.js";import{B as e0,I as t0,q as x0,t as a0,y as z}from"./chunk-GKVIY6GD.js";import{H as G,M as b,g as W,k as V,l as X,r as $,t as A}from"./chunk-YL2YTMD7.js";import"./chunk-RQFURXHW.js";var E=2051,l0=E,O=E,u0=O-l0,N=class extends x0{constructor(){super();this.cpuFrequency=1022727;this.sampleRate=this.cpuFrequency;this.cpuCyclesPerLine=65;this.cpuCyclesPerFrame=this.cpuCyclesPerLine*262;this.canvasWidth=280;this.numVisibleScanlines=192;this.numTotalScanlines=262;this.defaultROMSize=48896-2051;this.ram=new Uint8Array(77824);this.cpu=new a0;this.grdirty=new Array(49152>>7);this.grparams={dirty:this.grdirty,grswitch:P,mem:this.ram};this.kbdlatch=0;this.soundstate=0;this.auxRAMselected=!1;this.auxRAMbank=1;this.writeinhibit=!0;this.bank2rdoffset=0;this.bank2wroffset=0;this.slots=new Array(8);this.fakeDrive={readROM:x=>{var a=this.cpu.getPC();if(a>=50688&&a<50944)switch(x){case 0:return 0;case 1:return E&255;case 2:return E>>8&255;default:return 0}else switch(x){case 0:return this.rom&&(console.log(`Loading program into Apple ][ RAM at $${O.toString(16)}`),this.ram.set(this.rom.slice(u0),O)),76;case 1:return 32;case 3:return 0;case 5:return 3;case 7:return 60;default:return 0}},readConst:x=>0,read:x=>this.floatbus(),write:(x,a)=>{}};this.loadBIOS(new V().decode(X(atob(g0)))),this.connectCPUMemoryBus(this),this.bios[54170-(65536-this.bios.length)]=96}saveState(){return{c:this.cpu.saveState(),ram:this.ram.slice(),kbdlatch:this.kbdlatch,soundstate:this.soundstate,grswitch:this.grparams.grswitch,auxRAMselected:this.auxRAMselected,auxRAMbank:this.auxRAMbank,writeinhibit:this.writeinhibit,slots:this.slots.map(x=>x&&x.saveState&&x.saveState()),inputs:null}}loadState(x){this.cpu.loadState(x.c),this.ram.set(x.ram),this.kbdlatch=x.kbdlatch,this.soundstate=x.soundstate,this.grparams.grswitch=x.grswitch,this.auxRAMselected=x.auxRAMselected,this.auxRAMbank=x.auxRAMbank,this.writeinhibit=x.writeinhibit,this.setupLanguageCardConstants();for(var a=0;a>8!=198);x++);for(var x=0;x<2e6&&(this.cpu.advanceClock(),!(this.cpu.getPC()>>8<198));x++);}readConst(x){if(x<49152)return this.ram[x];if(x>=53248)return this.auxRAMselected?x>=57344?this.ram[x]:this.ram[x+this.bank2rdoffset]:this.bios[x-(65536-this.bios.length)];if(x>=49408&&x<51200){var a=x>>8&7;return(this.slots[a]&&this.slots[a].readConst(x&255))|0}else return 0}read(x){if(x&=65535,x<49152||x>=53248)return this.readConst(x);if(x<49408){var a=x>>4&15;switch(a){case 0:return this.kbdlatch;case 1:this.kbdlatch&=127;break;case 3:this.soundstate=this.soundstate^1;break;case 5:(x&15)<8&&((x&1)!=0?this.grparams.grswitch|=1<<(x>>1&7):this.grparams.grswitch&=~(1<<(x>>1&7)));break;case 6:switch(x&7){case 1:case 2:case 3:return this.floatbus()&127;case 4:case 5:return this.floatbus()|128;default:return this.floatbus()}case 7:if(x==49264)return this.floatbus()|128;case 8:return this.doLanguageCardIO(x);case 9:case 10:case 11:case 12:case 13:case 14:case 15:return(this.slots[a-8]&&this.slots[a-8].read(x&15))|0}}else if(x>=49408&&x<51200){var a=x>>8&7;return(this.slots[a]&&this.slots[a].readROM(x&255))|0}return this.floatbus()}write(x,a){if(x&=65535,a&=255,x<49152)this.ram[x]=a,this.grdirty[x>>7]=1;else if(x<49280)this.read(x);else if(x<49408){var r=x>>4&15;this.slots[r-8]&&this.slots[r-8].write(x&15,a)}else x>=53248&&!this.writeinhibit&&(x>=57344?this.ram[x]=a:this.ram[x+this.bank2wroffset]=a)}floatbus(){var x=this.frameCycles,a=Math.floor(x/65),r=Math.floor(x%65),d=this.ap2disp.getAddressForScanline(a);return this.readConst(d+r)}connectVideo(x){super.connectVideo(x),this.ap2disp=this.pixels&&new d0(this.pixels,this.grparams)}startScanline(){}drawScanline(){}advanceFrame(x){var a=super.advanceFrame(x);return this.ap2disp&&this.ap2disp.updateScreen(),a}advanceCPU(){return this.audio.feedSample(this.soundstate,1),super.advanceCPU()}setKeyInput(x,a,r){if(r&b.KeyDown){switch(a=0,x){case 16:case 17:case 18:break;case 8:if(a=8,r&b.Shift){this.cpu.reset();return}break;case 13:a=13;break;case 27:a=27;break;case 37:a=8;break;case 39:a=21;break;case 38:a=11;break;case 40:a=10;break;case 48:r&b.Shift&&(a=41);break;case 49:r&b.Shift&&(a=33);break;case 50:r&b.Shift&&(a=64);break;case 51:r&b.Shift&&(a=35);break;case 52:r&b.Shift&&(a=36);break;case 53:r&b.Shift&&(a=37);break;case 54:r&b.Shift&&(a=94);break;case 55:r&b.Shift&&(a=38);break;case 56:r&b.Shift&&(a=42);break;case 57:r&b.Shift&&(a=40);break;case 61:a=r&b.Shift?43:61;break;case 173:a=r&b.Shift?95:45;break;case 59:a=r&b.Shift?58:59;break;case 188:a=r&b.Shift?60:44;break;case 190:a=r&b.Shift?62:46;break;case 191:a=r&b.Shift?63:47;break;case 222:a=r&b.Shift?34:39;break;default:a=x,a>=97&&a<=122&&(a-=32),a>=65&&a<65+26&&r&b.Ctrl&&(a-=64)}a&&(this.kbdlatch=(a|128)&255)}}doLanguageCardIO(x){switch(x&15){case 0:case 4:this.auxRAMselected=!0,this.auxRAMbank=2,this.writeinhibit=!0;break;case 1:case 5:this.auxRAMselected=!1,this.auxRAMbank=2,this.writeinhibit=!1;break;case 2:case 6:case 10:case 14:this.auxRAMselected=!1,this.writeinhibit=!0;break;case 3:case 7:this.auxRAMselected=!0,this.auxRAMbank=2,this.writeinhibit=!1;break;case 8:case 12:this.auxRAMselected=!0,this.auxRAMbank=1,this.writeinhibit=!0;break;case 9:case 13:this.auxRAMselected=!1,this.auxRAMbank=1,this.writeinhibit=!1;break;case 11:case 15:this.auxRAMselected=!0,this.auxRAMbank=1,this.writeinhibit=!1;break}return this.setupLanguageCardConstants(),this.floatbus()}setupLanguageCardConstants(){this.auxRAMbank==2?this.bank2rdoffset=-4096:this.bank2rdoffset=12288,this.auxRAMbank==2?this.bank2wroffset=-4096:this.bank2wroffset=12288}getDebugCategories(){return["CPU","Stack","I/O","Disk"]}getDebugInfo(x,a){switch(x){case"I/O":return"AUX RAM Bank: "+a.auxRAMbank+` +import{a as r0}from"./chunk-47GW3WCW.js";import{B as e0,I as t0,q as x0,t as a0,y as z}from"./chunk-6UU4KLMR.js";import{H as G,M as b,g as W,k as V,l as X,r as $,t as A}from"./chunk-7LTJUW24.js";import"./chunk-RQFURXHW.js";var E=2051,l0=E,O=E,u0=O-l0,N=class extends x0{constructor(){super();this.cpuFrequency=1022727;this.sampleRate=this.cpuFrequency;this.cpuCyclesPerLine=65;this.cpuCyclesPerFrame=this.cpuCyclesPerLine*262;this.canvasWidth=280;this.numVisibleScanlines=192;this.numTotalScanlines=262;this.defaultROMSize=48896-2051;this.ram=new Uint8Array(77824);this.cpu=new a0;this.grdirty=new Array(49152>>7);this.grparams={dirty:this.grdirty,grswitch:P,mem:this.ram};this.kbdlatch=0;this.soundstate=0;this.auxRAMselected=!1;this.auxRAMbank=1;this.writeinhibit=!0;this.bank2rdoffset=0;this.bank2wroffset=0;this.slots=new Array(8);this.fakeDrive={readROM:x=>{var a=this.cpu.getPC();if(a>=50688&&a<50944)switch(x){case 0:return 0;case 1:return E&255;case 2:return E>>8&255;default:return 0}else switch(x){case 0:return this.rom&&(console.log(`Loading program into Apple ][ RAM at $${O.toString(16)}`),this.ram.set(this.rom.slice(u0),O)),76;case 1:return 32;case 3:return 0;case 5:return 3;case 7:return 60;default:return 0}},readConst:x=>0,read:x=>this.floatbus(),write:(x,a)=>{}};this.loadBIOS(new V().decode(X(atob(g0)))),this.connectCPUMemoryBus(this),this.bios[54170-(65536-this.bios.length)]=96}saveState(){return{c:this.cpu.saveState(),ram:this.ram.slice(),kbdlatch:this.kbdlatch,soundstate:this.soundstate,grswitch:this.grparams.grswitch,auxRAMselected:this.auxRAMselected,auxRAMbank:this.auxRAMbank,writeinhibit:this.writeinhibit,slots:this.slots.map(x=>x&&x.saveState&&x.saveState()),inputs:null}}loadState(x){this.cpu.loadState(x.c),this.ram.set(x.ram),this.kbdlatch=x.kbdlatch,this.soundstate=x.soundstate,this.grparams.grswitch=x.grswitch,this.auxRAMselected=x.auxRAMselected,this.auxRAMbank=x.auxRAMbank,this.writeinhibit=x.writeinhibit,this.setupLanguageCardConstants();for(var a=0;a>8!=198);x++);for(var x=0;x<2e6&&(this.cpu.advanceClock(),!(this.cpu.getPC()>>8<198));x++);}readConst(x){if(x<49152)return this.ram[x];if(x>=53248)return this.auxRAMselected?x>=57344?this.ram[x]:this.ram[x+this.bank2rdoffset]:this.bios[x-(65536-this.bios.length)];if(x>=49408&&x<51200){var a=x>>8&7;return(this.slots[a]&&this.slots[a].readConst(x&255))|0}else return 0}read(x){if(x&=65535,x<49152||x>=53248)return this.readConst(x);if(x<49408){var a=x>>4&15;switch(a){case 0:return this.kbdlatch;case 1:this.kbdlatch&=127;break;case 3:this.soundstate=this.soundstate^1;break;case 5:(x&15)<8&&((x&1)!=0?this.grparams.grswitch|=1<<(x>>1&7):this.grparams.grswitch&=~(1<<(x>>1&7)));break;case 6:switch(x&7){case 1:case 2:case 3:return this.floatbus()&127;case 4:case 5:return this.floatbus()|128;default:return this.floatbus()}case 7:if(x==49264)return this.floatbus()|128;case 8:return this.doLanguageCardIO(x);case 9:case 10:case 11:case 12:case 13:case 14:case 15:return(this.slots[a-8]&&this.slots[a-8].read(x&15))|0}}else if(x>=49408&&x<51200){var a=x>>8&7;return(this.slots[a]&&this.slots[a].readROM(x&255))|0}return this.floatbus()}write(x,a){if(x&=65535,a&=255,x<49152)this.ram[x]=a,this.grdirty[x>>7]=1;else if(x<49280)this.read(x);else if(x<49408){var r=x>>4&15;this.slots[r-8]&&this.slots[r-8].write(x&15,a)}else x>=53248&&!this.writeinhibit&&(x>=57344?this.ram[x]=a:this.ram[x+this.bank2wroffset]=a)}floatbus(){var x=this.frameCycles,a=Math.floor(x/65),r=Math.floor(x%65),d=this.ap2disp.getAddressForScanline(a);return this.readConst(d+r)}connectVideo(x){super.connectVideo(x),this.ap2disp=this.pixels&&new d0(this.pixels,this.grparams)}startScanline(){}drawScanline(){}advanceFrame(x){var a=super.advanceFrame(x);return this.ap2disp&&this.ap2disp.updateScreen(),a}advanceCPU(){return this.audio.feedSample(this.soundstate,1),super.advanceCPU()}setKeyInput(x,a,r){if(r&b.KeyDown){switch(a=0,x){case 16:case 17:case 18:break;case 8:if(a=8,r&b.Shift){this.cpu.reset();return}break;case 13:a=13;break;case 27:a=27;break;case 37:a=8;break;case 39:a=21;break;case 38:a=11;break;case 40:a=10;break;case 48:r&b.Shift&&(a=41);break;case 49:r&b.Shift&&(a=33);break;case 50:r&b.Shift&&(a=64);break;case 51:r&b.Shift&&(a=35);break;case 52:r&b.Shift&&(a=36);break;case 53:r&b.Shift&&(a=37);break;case 54:r&b.Shift&&(a=94);break;case 55:r&b.Shift&&(a=38);break;case 56:r&b.Shift&&(a=42);break;case 57:r&b.Shift&&(a=40);break;case 61:a=r&b.Shift?43:61;break;case 173:a=r&b.Shift?95:45;break;case 59:a=r&b.Shift?58:59;break;case 188:a=r&b.Shift?60:44;break;case 190:a=r&b.Shift?62:46;break;case 191:a=r&b.Shift?63:47;break;case 222:a=r&b.Shift?34:39;break;default:a=x,a>=97&&a<=122&&(a-=32),a>=65&&a<65+26&&r&b.Ctrl&&(a-=64)}a&&(this.kbdlatch=(a|128)&255)}}doLanguageCardIO(x){switch(x&15){case 0:case 4:this.auxRAMselected=!0,this.auxRAMbank=2,this.writeinhibit=!0;break;case 1:case 5:this.auxRAMselected=!1,this.auxRAMbank=2,this.writeinhibit=!1;break;case 2:case 6:case 10:case 14:this.auxRAMselected=!1,this.writeinhibit=!0;break;case 3:case 7:this.auxRAMselected=!0,this.auxRAMbank=2,this.writeinhibit=!1;break;case 8:case 12:this.auxRAMselected=!0,this.auxRAMbank=1,this.writeinhibit=!0;break;case 9:case 13:this.auxRAMselected=!1,this.auxRAMbank=1,this.writeinhibit=!1;break;case 11:case 15:this.auxRAMselected=!0,this.auxRAMbank=1,this.writeinhibit=!1;break}return this.setupLanguageCardConstants(),this.floatbus()}setupLanguageCardConstants(){this.auxRAMbank==2?this.bank2rdoffset=-4096:this.bank2rdoffset=12288,this.auxRAMbank==2?this.bank2wroffset=-4096:this.bank2wroffset=12288}getDebugCategories(){return["CPU","Stack","I/O","Disk"]}getDebugInfo(x,a){switch(x){case"I/O":return"AUX RAM Bank: "+a.auxRAMbank+` AUX RAM Select: `+a.auxRAMselected+` AUX RAM Write: `+!a.writeinhibit+` @@ -10,4 +10,4 @@ Mode: `+(this.read_mode?"READ":"WRITE")+` Motor: `+this.motor+` Data: `+(this.track_data?W(this.track_data[this.track_index]):"-")+` `}read_latch(){return this.track_index=(this.track_index+1)%H,this.track_data?this.track_data[this.track_index]&255:this.emu.floatbus()|128}write_latch(x){this.track_index=(this.track_index+1)%H,this.track_data!=null&&(this.track_data[this.track_index]=x)}readROM(x){return s0[x]}readConst(x){return s0[x]}read(x){return this.doIO(x,0)}write(x,a){this.doIO(x,a)}doIO(x,a){switch(x&15){case 1:case 3:case 5:case 7:var r,d,e;e=this.track,r=x>>1&3,r==(e-1&3)?e>0&&e--:r==(e+1&3)&&e>1],console.log("track",e/2)):this.track_data=null,this.track=e;break;case 8:this.motor=!1;break;case 9:this.motor=!0;break;case 10:break;case 11:break;case 15:this.read_mode=!1;case 12:if(this.read_mode)return this.read_latch();break;case 14:this.read_mode=!0;case 13:return a>=0&&!this.read_mode&&!this.write_protect&&this.write_latch(a),this.write_protect?128:0}return this.emu.floatbus()}},T=[150,151,154,155,157,158,159,166,167,171,172,173,174,175,178,179,180,181,182,183,185,186,187,188,189,190,191,203,205,206,207,211,214,215,217,218,219,220,221,222,223,229,230,231,233,234,235,236,237,238,239,242,243,244,245,246,247,249,250,251,252,253,254,255],S0=[0,7,14,6,13,5,12,4,11,3,10,2,9,1,8,15];function B0(i,x,a,r,d,e,n){var c,p,S,l,k=new Uint8Array(258);for(l=0,c=0;c<14;c++)e[n++]=255;for(e[n++]=213,e[n++]=170,e[n++]=150,e[n++]=i>>1|170,e[n++]=i|170,p=i,e[n++]=x>>1|170,e[n++]=x|170,p^=x,e[n++]=a>>1|170,e[n++]=a|170,p^=a,e[n++]=p>>1|170,e[n++]=p|170,e[n++]=222,e[n++]=170,e[n++]=235,c=0;c<6;c++)e[n++]=255;for(e[n++]=213,e[n++]=170,e[n++]=173,c=0;c<256;c++)k[c]=r[c+d]&255;for(k[256]=0,k[257]=0,S=0,c=0;c<86;c++)l=(k[c]&1)<<1,l|=(k[c]&2)>>1,l|=(k[c+86]&1)<<3,l|=(k[c+86]&2)<<1,l|=(k[c+172]&1)<<5,l|=(k[c+172]&2)<<3,e[n++]=T[l^S],S=l;for(c=0;c<256;c++)l=k[c]>>2,e[n++]=T[l^S],S=l;e[n++]=T[l],e[n++]=222,e[n++]=170,e[n++]=235}function p0(i,x,a){for(var r=new Uint8Array(H),d=0,e=0;e<16;e++)B0(i,x,e,a,S0[e]<<8,r,d),d+=C0;for(;dx.endsWith(".lnk")?"merlin32":z(x)}newMachine(){return new N}getPresets(){return n0}getDefaultExtension(){return".c"}readAddress(x){return this.machine.readConst(x)}getROMExtension(x){return x&&x.length==35*16*256?".dsk":".bin"}};G["apple2.mame"]=f0;G.apple2=o0; -//# sourceMappingURL=apple2-YBSXME7B.js.map +//# sourceMappingURL=apple2-4HPKEG3T.js.map diff --git a/gen/apple2-YBSXME7B.js.map b/gen/apple2-4HPKEG3T.js.map similarity index 100% rename from gen/apple2-YBSXME7B.js.map rename to gen/apple2-4HPKEG3T.js.map diff --git a/gen/arm32-TREQBG5P.js b/gen/arm32-MYWZWAMY.js similarity index 99% rename from gen/arm32-TREQBG5P.js rename to gen/arm32-MYWZWAMY.js index 7574342b..2cafaf79 100644 --- a/gen/arm32-TREQBG5P.js +++ b/gen/arm32-MYWZWAMY.js @@ -1,7 +1,7 @@ -import{H as j,q}from"./chunk-GKVIY6GD.js";import{D as J,H as Y,Q as y,T as S,U as z,W as X,Z as L,a as N,g as E}from"./chunk-YL2YTMD7.js";import"./chunk-RQFURXHW.js";var g;(function(o){o[o.MODE_ARM=0]="MODE_ARM",o[o.MODE_THUMB=1]="MODE_THUMB",o[o.MODE_USER=16]="MODE_USER",o[o.MODE_FIQ=17]="MODE_FIQ",o[o.MODE_IRQ=18]="MODE_IRQ",o[o.MODE_SUPERVISOR=19]="MODE_SUPERVISOR",o[o.MODE_ABORT=23]="MODE_ABORT",o[o.MODE_UNDEFINED=27]="MODE_UNDEFINED",o[o.MODE_SYSTEM=31]="MODE_SYSTEM"})(g||(g={}));var u;(function(t){t[t.SP=13]="SP",t[t.LR=14]="LR",t[t.PC=15]="PC"})(u||(u={}));var b;(function(l){l[l.BANK_NONE=0]="BANK_NONE",l[l.BANK_FIQ=1]="BANK_FIQ",l[l.BANK_IRQ=2]="BANK_IRQ",l[l.BANK_SUPERVISOR=3]="BANK_SUPERVISOR",l[l.BANK_ABORT=4]="BANK_ABORT",l[l.BANK_UNDEFINED=5]="BANK_UNDEFINED",l[l.WORD_SIZE_ARM=4]="WORD_SIZE_ARM",l[l.WORD_SIZE_THUMB=2]="WORD_SIZE_THUMB",l[l.BASE_RESET=0]="BASE_RESET",l[l.BASE_UNDEF=4]="BASE_UNDEF",l[l.BASE_SWI=8]="BASE_SWI",l[l.BASE_PABT=12]="BASE_PABT",l[l.BASE_DABT=16]="BASE_DABT",l[l.BASE_IRQ=24]="BASE_IRQ",l[l.BASE_FIQ=28]="BASE_FIQ"})(b||(b={}));var $=4026531840,rr=223,or=32;function F(s){this.cpu=s,this.addressingMode23Immediate=[function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(r[e]-=i),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(r[e]+=i),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){return r[e]-i};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){var c=r[e]-i;return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null,function(e,i,t){var r=s.gprs,a=function(){return r[e]+i};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){var c=r[e]+i;return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null],this.addressingMode23Register=[function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(r[e]-=r[i]),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(r[e]+=r[i]),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){return r[e]-r[i]};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){var c=r[e]-r[i];return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null,function(e,i,t){var r=s.gprs,a=function(){var c=r[e]+r[i];return c};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){var c=r[e]+r[i];return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null],this.addressingMode2RegisterShifted=[function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(i(),r[e]-=s.shifterOperand),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(i(),r[e]+=s.shifterOperand),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){return i(),r[e]-s.shifterOperand};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){i();var c=r[e]-s.shifterOperand;return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null,function(e,i,t){var r=s.gprs,a=function(){return i(),r[e]+s.shifterOperand};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){i();var c=r[e]+s.shifterOperand;return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null]}F.prototype.constructAddressingMode1ASR=function(s,e){var i=this.cpu,t=i.gprs;return function(){++i.cycles;var r=t[s];s==15&&(r+=4),r&=255;var a=t[e];e==15&&(a+=4),r==0?(i.shifterOperand=a,i.shifterCarryOut=i.cpsrC):r<32?(i.shifterOperand=a>>r,i.shifterCarryOut=a&1<>31?(i.shifterOperand=4294967295,i.shifterCarryOut=2147483648):(i.shifterOperand=0,i.shifterCarryOut=0)}};F.prototype.constructAddressingMode1Immediate=function(s){var e=this.cpu;return function(){e.shifterOperand=s,e.shifterCarryOut=e.cpsrC}};F.prototype.constructAddressingMode1ImmediateRotate=function(s,e){var i=this.cpu;return function(){i.shifterOperand=s>>>e|s<<32-e,i.shifterCarryOut=i.shifterOperand>>31}};F.prototype.constructAddressingMode1LSL=function(s,e){var i=this.cpu,t=i.gprs;return function(){++i.cycles;var r=t[s];s==15&&(r+=4),r&=255;var a=t[e];e==15&&(a+=4),r==0?(i.shifterOperand=a,i.shifterCarryOut=i.cpsrC):r<32?(i.shifterOperand=a<>>r,i.shifterCarryOut=a&1<>31):(i.shifterOperand=0,i.shifterCarryOut=0)}};F.prototype.constructAddressingMode1ROR=function(s,e){var i=this.cpu,t=i.gprs;return function(){++i.cycles;var r=t[s];s==15&&(r+=4),r&=255;var a=t[e];e==15&&(a+=4);var c=r&31;r==0?(i.shifterOperand=a,i.shifterCarryOut=i.cpsrC):c?(i.shifterOperand=t[e]>>>c|t[e]<<32-c,i.shifterCarryOut=a&1<>31)}};F.prototype.constructAddressingMode23Immediate=function(s,e,i){var t=(s&983040)>>16;return this.addressingMode23Immediate[(s&27262976)>>21](t,e,i)};F.prototype.constructAddressingMode23Register=function(s,e,i){var t=(s&983040)>>16;return this.addressingMode23Register[(s&27262976)>>21](t,e,i)};F.prototype.constructAddressingMode2RegisterShifted=function(s,e,i){var t=(s&983040)>>16;return this.addressingMode2RegisterShifted[(s&27262976)>>21](t,e,i)};F.prototype.constructAddressingMode4=function(s,e){var i=this.cpu,t=i.gprs;return function(){var r=t[e]+s;return r}};F.prototype.constructAddressingMode4Writeback=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(c){var p=a[i]+s;return c&&t&&r.mmu.store32(a[i]+s-4,a[i]),a[i]+=e,p}};F.prototype.constructADC=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(r.shifterOperand>>>0)+(r.cpsrC?1:0);a[s]=(a[e]>>>0)+c}}};F.prototype.constructADCS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(r.shifterOperand>>>0)+(r.cpsrC?1:0),p=(a[e]>>>0)+c;s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=p>>31,r.cpsrZ=!(p&4294967295),r.cpsrC=p>4294967295,r.cpsrV=a[e]>>31==c>>31&&a[e]>>31!=p>>31&&c>>31!=p>>31),a[s]=p}}};F.prototype.constructADD=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=(a[e]>>>0)+(r.shifterOperand>>>0))}};F.prototype.constructADDS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(a[e]>>>0)+(r.shifterOperand>>>0);s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=c>4294967295,r.cpsrV=a[e]>>31==r.shifterOperand>>31&&a[e]>>31!=c>>31&&r.shifterOperand>>31!=c>>31),a[s]=c}}};F.prototype.constructAND=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]&r.shifterOperand)}};F.prototype.constructANDS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]&r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructB=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(e&&!e()){i.mmu.waitPrefetch32(t[15]);return}i.mmu.waitPrefetch32(t[15]),t[15]+=s}};F.prototype.constructBIC=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]&~r.shifterOperand)}};F.prototype.constructBICS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]&~r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructBL=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(e&&!e()){i.mmu.waitPrefetch32(t[15]);return}i.mmu.waitPrefetch32(t[15]),t[14]=t[15]-4,t[15]+=s}};F.prototype.constructBX=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(e&&!e()){i.mmu.waitPrefetch32(t[15]);return}i.mmu.waitPrefetch32(t[15]),i.switchExecMode(t[s]&1),t[15]=t[s]&4294967294}};F.prototype.constructCMN=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(a[e]>>>0)+(r.shifterOperand>>>0);r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=c>4294967295,r.cpsrV=a[e]>>31==r.shifterOperand>>31&&a[e]>>31!=c>>31&&r.shifterOperand>>31!=c>>31}}};F.prototype.constructCMP=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=a[e]-r.shifterOperand;r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=a[e]>>>0>=r.shifterOperand>>>0,r.cpsrV=a[e]>>31!=r.shifterOperand>>31&&a[e]>>31!=c>>31}}};F.prototype.constructEOR=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]^r.shifterOperand)}};F.prototype.constructEORS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]^r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructLDM=function(s,e,i){var t=this.cpu,r=t.gprs,a=t.mmu;return function(){if(a.waitPrefetch32(r[15]),!(i&&!i())){var c=e(!1),p=0,n,o;for(n=s,o=0;n;n>>=1,++o)n&1&&(r[o]=a.load32(c&4294967292),c+=4,++p);a.waitMulti32(c,p),++t.cycles}}};F.prototype.constructLDMS=function(s,e,i){var t=this.cpu,r=t.gprs,a=t.mmu;return function(){if(a.waitPrefetch32(r[15]),!(i&&!i())){var c=e(!1),p=0,n=t.mode;t.switchMode(31);var o,v;for(o=s,v=0;o;o>>=1,++v)o&1&&(r[v]=a.load32(c&4294967292),c+=4,++p);t.switchMode(n),a.waitMulti32(c,p),++t.cycles}}};F.prototype.constructLDR=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.load32(a),t.mmu.wait32(a),++t.cycles}}};F.prototype.constructLDRB=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.loadU8(a),t.mmu.wait(a),++t.cycles}}};F.prototype.constructLDRH=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.loadU16(a),t.mmu.wait(a),++t.cycles}}};F.prototype.constructLDRSB=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.load8(a),t.mmu.wait(a),++t.cycles}}};F.prototype.constructLDRSH=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.load16(a),t.mmu.wait(a),++t.cycles}}};F.prototype.constructMLA=function(s,e,i,t,r){var a=this.cpu,c=a.gprs;return function(){if(a.mmu.waitPrefetch32(c[15]),!(r&&!r()))if(++a.cycles,a.mmu.waitMul(i),c[t]&4294901760&&c[i]&4294901760){var p=(c[t]&4294901760)*c[i]&4294967295,n=(c[t]&65535)*c[i]&4294967295;c[s]=p+n+c[e]&4294967295}else c[s]=c[t]*c[i]+c[e]}};F.prototype.constructMLAS=function(s,e,i,t,r){var a=this.cpu,c=a.gprs;return function(){if(a.mmu.waitPrefetch32(c[15]),!(r&&!r())){if(++a.cycles,a.mmu.waitMul(i),c[t]&4294901760&&c[i]&4294901760){var p=(c[t]&4294901760)*c[i]&4294967295,n=(c[t]&65535)*c[i]&4294967295;c[s]=p+n+c[e]&4294967295}else c[s]=c[t]*c[i]+c[e];a.cpsrN=c[s]>>31,a.cpsrZ=!(c[s]&4294967295)}}};F.prototype.constructMOV=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=r.shifterOperand)}};F.prototype.constructMOVS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructMRS=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch32(r[15]),!(i&&!i())&&(e?r[s]=t.spsr:r[s]=t.packCPSR())}};F.prototype.constructMSR=function(s,e,i,t,r){var a=this.cpu,c=a.gprs,p=i&65536,n=i&524288;return function(){if(a.mmu.waitPrefetch32(c[15]),!(r&&!r())){var o;i&33554432?o=t:o=c[s];var v=(p?255:0)|(n?4278190080:0);e?(v&=$|rr|or,a.spsr=a.spsr&~v|o&v):(v&$&&(a.cpsrN=o>>31,a.cpsrZ=o&1073741824,a.cpsrC=o&536870912,a.cpsrV=o&268435456),a.mode!=16&&v&rr&&(a.switchMode(o&15|16),a.cpsrI=o&128,a.cpsrF=o&64))}}};F.prototype.constructMUL=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t()))if(r.mmu.waitMul(a[e]),a[i]&4294901760&&a[e]&4294901760){var c=(a[i]&4294901760)*a[e]|0,p=(a[i]&65535)*a[e]|0;a[s]=c+p}else a[s]=a[i]*a[e]}};F.prototype.constructMULS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){if(r.mmu.waitMul(a[e]),a[i]&4294901760&&a[e]&4294901760){var c=(a[i]&4294901760)*a[e]|0,p=(a[i]&65535)*a[e]|0;a[s]=c+p}else a[s]=a[i]*a[e];r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295)}}};F.prototype.constructMVN=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=~r.shifterOperand)}};F.prototype.constructMVNS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=~r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructORR=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]|r.shifterOperand)}};F.prototype.constructORRS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]|r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructRSB=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=r.shifterOperand-a[e])}};F.prototype.constructRSBS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=r.shifterOperand-a[e];s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=r.shifterOperand>>>0>=a[e]>>>0,r.cpsrV=r.shifterOperand>>31!=a[e]>>31&&r.shifterOperand>>31!=c>>31),a[s]=c}}};F.prototype.constructRSC=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(a[e]>>>0)+(r.cpsrC?0:1);a[s]=(r.shifterOperand>>>0)-c}}};F.prototype.constructRSCS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(a[e]>>>0)+(r.cpsrC?0:1),p=(r.shifterOperand>>>0)-c;s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=p>>31,r.cpsrZ=!(p&4294967295),r.cpsrC=r.shifterOperand>>>0>=p>>>0,r.cpsrV=r.shifterOperand>>31!=c>>31&&r.shifterOperand>>31!=p>>31),a[s]=p}}};F.prototype.constructSBC=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(r.shifterOperand>>>0)+(r.cpsrC?0:1);a[s]=(a[e]>>>0)-c}}};F.prototype.constructSBCS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(r.shifterOperand>>>0)+(r.cpsrC?0:1),p=(a[e]>>>0)-c;s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=p>>31,r.cpsrZ=!(p&4294967295),r.cpsrC=a[e]>>>0>=p>>>0,r.cpsrV=a[e]>>31!=c>>31&&a[e]>>31!=p>>31),a[s]=p}}};F.prototype.constructSMLAL=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){a.cycles+=2,a.mmu.waitMul(i);var n=(p[t]&4294901760)*p[i],o=(p[t]&65535)*p[i],v=(p[e]>>>0)+n+o;p[e]=v,p[s]+=Math.floor(v*c)}}};F.prototype.constructSMLALS=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){a.cycles+=2,a.mmu.waitMul(i);var n=(p[t]&4294901760)*p[i],o=(p[t]&65535)*p[i],v=(p[e]>>>0)+n+o;p[e]=v,p[s]+=Math.floor(v*c),a.cpsrN=p[s]>>31,a.cpsrZ=!(p[s]&4294967295||p[e]&4294967295)}}};F.prototype.constructSMULL=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){++a.cycles,a.mmu.waitMul(p[i]);var n=((p[t]&4294901760)>>0)*(p[i]>>0),o=((p[t]&65535)>>0)*(p[i]>>0);p[e]=(n&4294967295)+(o&4294967295)&4294967295,p[s]=Math.floor(n*c+o*c)}}};F.prototype.constructSMULLS=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){++a.cycles,a.mmu.waitMul(p[i]);var n=((p[t]&4294901760)>>0)*(p[i]>>0),o=((p[t]&65535)>>0)*(p[i]>>0);p[e]=(n&4294967295)+(o&4294967295)&4294967295,p[s]=Math.floor(n*c+o*c),a.cpsrN=p[s]>>31,a.cpsrZ=!(p[s]&4294967295||p[e]&4294967295)}}};F.prototype.constructSTM=function(s,e,i){var t=this.cpu,r=t.gprs,a=t.mmu;return function(){if(i&&!i()){a.waitPrefetch32(r[15]);return}a.wait32(r[15]);var c=e(!0),p=0,n,o;for(n=s,o=0;n;n>>=1,++o)n&1&&(a.store32(c,r[o]),c+=4,++p);a.waitMulti32(c,p)}};F.prototype.constructSTMS=function(s,e,i){var t=this.cpu,r=t.gprs,a=t.mmu;return function(){if(i&&!i()){a.waitPrefetch32(r[15]);return}a.wait32(r[15]);var c=t.mode,p=e(!0),n=0,o,v;for(t.switchMode(31),o=s,v=0;o;o>>=1,++v)o&1&&(a.store32(p,r[v]),p+=4,++n);t.switchMode(c),a.waitMulti32(p,n)}};F.prototype.constructSTR=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(i&&!i()){t.mmu.waitPrefetch32(r[15]);return}var a=e();t.mmu.store32(a,r[s]),t.mmu.wait32(a),t.mmu.wait32(r[15])}};F.prototype.constructSTRB=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(i&&!i()){t.mmu.waitPrefetch32(r[15]);return}var a=e();t.mmu.store8(a,r[s]),t.mmu.wait(a),t.mmu.wait32(r[15])}};F.prototype.constructSTRH=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(i&&!i()){t.mmu.waitPrefetch32(r[15]);return}var a=e();t.mmu.store16(a,r[s]),t.mmu.wait(a),t.mmu.wait32(r[15])}};F.prototype.constructSUB=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]-r.shifterOperand)}};F.prototype.constructSUBS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=a[e]-r.shifterOperand;s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=a[e]>>>0>=r.shifterOperand>>>0,r.cpsrV=a[e]>>31!=r.shifterOperand>>31&&a[e]>>31!=c>>31),a[s]=c}}};F.prototype.constructSWI=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(e&&!e()){i.mmu.waitPrefetch32(t[15]);return}i.irq.swi32(s),i.mmu.waitPrefetch32(t[15])}};F.prototype.constructSWP=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){r.mmu.wait32(a[e]),r.mmu.wait32(a[e]);var c=r.mmu.load32(a[e]);r.mmu.store32(a[e],a[i]),a[s]=c,++r.cycles}}};F.prototype.constructSWPB=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){r.mmu.wait(a[e]),r.mmu.wait(a[e]);var c=r.mmu.loadU8(a[e]);r.mmu.store8(a[e],a[i]),a[s]=c,++r.cycles}}};F.prototype.constructTEQ=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=a[e]^r.shifterOperand;r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=r.shifterCarryOut}}};F.prototype.constructTST=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=a[e]&r.shifterOperand;r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=r.shifterCarryOut}}};F.prototype.constructUMLAL=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){a.cycles+=2,a.mmu.waitMul(i);var n=((p[t]&4294901760)>>>0)*(p[i]>>>0),o=(p[t]&65535)*(p[i]>>>0),v=(p[e]>>>0)+n+o;p[e]=v,p[s]+=v*c}}};F.prototype.constructUMLALS=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){a.cycles+=2,a.mmu.waitMul(i);var n=((p[t]&4294901760)>>>0)*(p[i]>>>0),o=(p[t]&65535)*(p[i]>>>0),v=(p[e]>>>0)+n+o;p[e]=v,p[s]+=v*c,a.cpsrN=p[s]>>31,a.cpsrZ=!(p[s]&4294967295||p[e]&4294967295)}}};F.prototype.constructUMULL=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){++a.cycles,a.mmu.waitMul(p[i]);var n=((p[t]&4294901760)>>>0)*(p[i]>>>0),o=((p[t]&65535)>>>0)*(p[i]>>>0);p[e]=(n&4294967295)+(o&4294967295)&4294967295,p[s]=n*c+o*c>>>0}}};F.prototype.constructUMULLS=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){++a.cycles,a.mmu.waitMul(p[i]);var n=((p[t]&4294901760)>>>0)*(p[i]>>>0),o=((p[t]&65535)>>>0)*(p[i]>>>0);p[e]=(n&4294967295)+(o&4294967295)&4294967295,p[s]=n*c+o*c>>>0,a.cpsrN=p[s]>>31,a.cpsrZ=!(p[s]&4294967295||p[e]&4294967295)}}};function m(s){this.cpu=s}m.prototype.constructADC=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=(t[e]>>>0)+(i.cpsrC?1:0),a=t[s],c=(a>>>0)+r,p=a>>31,n=c>>31,o=r>>31;i.cpsrN=n,i.cpsrZ=!(c&4294967295),i.cpsrC=c>4294967295,i.cpsrV=p==o&&p!=n&&o!=n,t[s]=c}};m.prototype.constructADD1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=(r[e]>>>0)+i;t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=a>4294967295,t.cpsrV=!(r[e]>>31)&&(r[e]>>31^a)>>31&&a>>31,r[s]=a}};m.prototype.constructADD2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=(t[s]>>>0)+e;i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=r>4294967295,i.cpsrV=!(t[s]>>31)&&(t[s]^r)>>31&&(e^r)>>31,t[s]=r}};m.prototype.constructADD3=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=(r[e]>>>0)+(r[i]>>>0);t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=a>4294967295,t.cpsrV=!((r[e]^r[i])>>31)&&(r[e]^a)>>31&&(r[i]^a)>>31,r[s]=a}};m.prototype.constructADD4=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]+=t[e]}};m.prototype.constructADD5=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=(t[15]&4294967292)+e}};m.prototype.constructADD6=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[13]+e}};m.prototype.constructADD7=function(s){var e=this.cpu,i=e.gprs;return function(){e.mmu.waitPrefetch(i[15]),i[13]+=s}};m.prototype.constructAND=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[s]&t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructASR1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]),i==0?(t.cpsrC=r[e]>>31,t.cpsrC?r[s]=4294967295:r[s]=0):(t.cpsrC=r[e]&1<>i),t.cpsrN=r[s]>>31,t.cpsrZ=!(r[s]&4294967295)}};m.prototype.constructASR2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[e]&255;r&&(r<32?(i.cpsrC=t[s]&1<>=r):(i.cpsrC=t[s]>>31,i.cpsrC?t[s]=4294967295:t[s]=0)),i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructB1=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),e()&&(t[15]+=s)}};m.prototype.constructB2=function(s){var e=this.cpu,i=e.gprs;return function(){e.mmu.waitPrefetch(i[15]),i[15]+=s}};m.prototype.constructBIC=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[s]&~t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructBL1=function(s){var e=this.cpu,i=e.gprs;return function(){e.mmu.waitPrefetch(i[15]),i[14]=i[15]+s}};m.prototype.constructBL2=function(s){var e=this.cpu,i=e.gprs;return function(){e.mmu.waitPrefetch(i[15]);var t=i[15];i[15]=i[14]+(s<<1),i[14]=t-1}};m.prototype.constructBX=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),i.switchExecMode(t[e]&1);var r=0;e==15&&(r=t[e]&2),t[15]=t[e]&4294967294-r}};m.prototype.constructCMN=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=(t[s]>>>0)+(t[e]>>>0);i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=r>4294967295,i.cpsrV=t[s]>>31==t[e]>>31&&t[s]>>31!=r>>31&&t[e]>>31!=r>>31}};m.prototype.constructCMP1=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s]-e;i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=t[s]>>>0>=e,i.cpsrV=t[s]>>31&&(t[s]^r)>>31}};m.prototype.constructCMP2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s],a=t[e],c=r-a,p=c>>31,n=r>>31;i.cpsrN=p,i.cpsrZ=!(c&4294967295),i.cpsrC=r>>>0>=a>>>0,i.cpsrV=n!=a>>31&&n!=p}};m.prototype.constructCMP3=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s]-t[e];i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=t[s]>>>0>=t[e]>>>0,i.cpsrV=(t[s]^t[e])>>31&&(t[s]^r)>>31}};m.prototype.constructEOR=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[s]^t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructLDMIA=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s],a=0,c,p;for(c=1,p=0;p<8;c<<=1,++p)e&c&&(t[p]=i.mmu.load32(r),r+=4,++a);i.mmu.waitMulti32(r,a),1<>31,t.cpsrZ=!(r[s]&4294967295)}};m.prototype.constructLSL2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[e]&255;r&&(r<32?(i.cpsrC=t[s]&1<<32-r,t[s]<<=r):(r>32?i.cpsrC=0:i.cpsrC=t[s]&1,t[s]=0)),i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructLSR1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]),i==0?(t.cpsrC=r[e]>>31,r[s]=0):(t.cpsrC=r[e]&1<>>i),t.cpsrN=0,t.cpsrZ=!(r[s]&4294967295)}};m.prototype.constructLSR2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[e]&255;r&&(r<32?(i.cpsrC=t[s]&1<>>=r):(r>32?i.cpsrC=0:i.cpsrC=t[s]>>31,t[s]=0)),i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructMOV1=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=e,i.cpsrN=e>>31,i.cpsrZ=!(e&4294967295)}};m.prototype.constructMOV2=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=r[e];t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=0,t.cpsrV=0,r[s]=a}};m.prototype.constructMOV3=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[e]}};m.prototype.constructMUL=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(i.mmu.waitPrefetch(t[15]),i.mmu.waitMul(t[e]),t[e]&4294901760&&t[s]&4294901760){var r=(t[s]&4294901760)*t[e]&4294967295,a=(t[s]&65535)*t[e]&4294967295;t[s]=r+a&4294967295}else t[s]*=t[e];i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructMVN=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=~t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructNEG=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=-t[e];i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=0>=r>>>0,i.cpsrV=t[e]>>31&&r>>31,t[s]=r}};m.prototype.constructORR=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[s]|t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructPOP=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),++i.cycles;var r=t[13],a=0,c,p;for(c=1,p=0;p<8;c<<=1,++p)s&c&&(i.mmu.waitSeq32(r),t[p]=i.mmu.load32(r),r+=4,++a);e&&(t[15]=i.mmu.load32(r)&4294967294,r+=4,++a),i.mmu.waitMulti32(r,a),t[13]=r}};m.prototype.constructPUSH=function(s,e){var i=this.cpu,t=i.gprs;return function(){var r=t[13]-4,a=0;i.mmu.waitPrefetch(t[15]),e&&(i.mmu.store32(r,t[14]),r-=4,++a);var c,p;for(c=128,p=7;c;c>>=1,--p)if(s&c){i.mmu.store32(r,t[p]),r-=4,++a;break}for(c>>=1,--p;c;c>>=1,--p)s&c&&(i.mmu.store32(r,t[p]),r-=4,++a);i.mmu.waitMulti32(r,a),t[13]=r+4}};m.prototype.constructROR=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[e]&255;if(r){var a=r&31;a>0?(i.cpsrC=t[s]&1<>>a|t[s]<<32-a):i.cpsrC=t[s]>>31}i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructSBC=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=(t[e]>>>0)+(i.cpsrC?0:1),a=(t[s]>>>0)-r;i.cpsrN=a>>31,i.cpsrZ=!(a&4294967295),i.cpsrC=t[s]>>>0>=a>>>0,i.cpsrV=(t[s]^r)>>31&&(t[s]^a)>>31,t[s]=a}};m.prototype.constructSTMIA=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.wait(t[15]);var r=t[s],a=0,c,p;for(c=1,p=0;p<8;c<<=1,++p)if(e&c){i.mmu.store32(r,t[p]),r+=4,++a;break}for(c<<=1,++p;p<8;c<<=1,++p)e&c&&(i.mmu.store32(r,t[p]),r+=4,++a);i.mmu.waitMulti32(r,a),t[s]=r}};m.prototype.constructSTR1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){var a=r[e]+i;t.mmu.store32(a,r[s]),t.mmu.wait(r[15]),t.mmu.wait32(a)}};m.prototype.constructSTR2=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.store32(r[e]+r[i],r[s]),t.mmu.wait(r[15]),t.mmu.wait32(r[e]+r[i])}};m.prototype.constructSTR3=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.store32(t[13]+e,t[s]),i.mmu.wait(t[15]),i.mmu.wait32(t[13]+e)}};m.prototype.constructSTRB1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){var a=r[e]+i;t.mmu.store8(a,r[s]),t.mmu.wait(r[15]),t.mmu.wait(a)}};m.prototype.constructSTRB2=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.store8(r[e]+r[i],r[s]),t.mmu.wait(r[15]),t.mmu.wait(r[e]+r[i])}};m.prototype.constructSTRH1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){var a=r[e]+i;t.mmu.store16(a,r[s]),t.mmu.wait(r[15]),t.mmu.wait(a)}};m.prototype.constructSTRH2=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.store16(r[e]+r[i],r[s]),t.mmu.wait(r[15]),t.mmu.wait(r[e]+r[i])}};m.prototype.constructSUB1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=r[e]-i;t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=r[e]>>>0>=i,t.cpsrV=r[e]>>31&&(r[e]^a)>>31,r[s]=a}};m.prototype.constructSUB2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s]-e;i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=t[s]>>>0>=e,i.cpsrV=t[s]>>31&&(t[s]^r)>>31,t[s]=r}};m.prototype.constructSUB3=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=r[e]-r[i];t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=r[e]>>>0>=r[i]>>>0,t.cpsrV=r[e]>>31!=r[i]>>31&&r[e]>>31!=a>>31,r[s]=a}};m.prototype.constructSWI=function(s){var e=this.cpu,i=e.gprs;return function(){e.irq.swi(s),e.mmu.waitPrefetch(i[15])}};m.prototype.constructTST=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s]&t[e];i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295)}};function R(){this.SP=13,this.LR=14,this.PC=15,this.MODE_ARM=0,this.MODE_THUMB=1,this.MODE_USER=16,this.MODE_FIQ=17,this.MODE_IRQ=18,this.MODE_SUPERVISOR=19,this.MODE_ABORT=23,this.MODE_UNDEFINED=27,this.MODE_SYSTEM=31,this.BANK_NONE=0,this.BANK_FIQ=1,this.BANK_IRQ=2,this.BANK_SUPERVISOR=3,this.BANK_ABORT=4,this.BANK_UNDEFINED=5,this.WORD_SIZE_ARM=4,this.WORD_SIZE_THUMB=2,this.BASE_RESET=0,this.BASE_UNDEF=4,this.BASE_SWI=8,this.BASE_PABT=12,this.BASE_DABT=16,this.BASE_IRQ=24,this.BASE_FIQ=28,this.armCompiler=new F(this),this.thumbCompiler=new m(this),this.generateConds(),this.gprs=new Int32Array(16)}R.prototype.resetCPU=function(s){for(var e=0;e<15;++e)this.gprs[e]=0;this.gprs[15]=s+4,this.loadInstruction=this.loadInstructionArm,this.execMode=0,this.instructionWidth=4,this.mode=31,this.cpsrI=!1,this.cpsrF=!1,this.cpsrV=!1,this.cpsrC=!1,this.cpsrZ=!1,this.cpsrN=!1,this.bankedRegisters=[new Int32Array(7),new Int32Array(7),new Int32Array(2),new Int32Array(2),new Int32Array(2),new Int32Array(2)],this.spsr=0,this.bankedSPSRs=new Int32Array(6),this.cycles=0,this.shifterOperand=0,this.shifterCarryOut=0,this.page=null,this.pageId=0,this.pageRegion=-1,this.instruction=null,this.irq.clear();var i=this.gprs,t=this.mmu;this.step=function(){var r=this.instruction||(this.instruction=this.loadInstruction(i[15]-this.instructionWidth));if(i[15]+=this.instructionWidth,this.conditionPassed=!0,r(),!r.writesPC)this.instruction!=null&&((r.next==null||r.next.page.invalid)&&(r.next=this.loadInstruction(i[15]-this.instructionWidth)),this.instruction=r.next);else if(this.conditionPassed){var a=i[15]&=4294967294;this.execMode==0?(t.wait32(a),t.waitPrefetch32(a)):(t.wait(a),t.waitPrefetch(a)),i[15]+=this.instructionWidth,r.fixedJump?this.instruction!=null&&((r.next==null||r.next.page.invalid)&&(r.next=this.loadInstruction(i[15]-this.instructionWidth)),this.instruction=r.next):this.instruction=null}else this.instruction=null;this.irq.updateTimers()}};R.prototype.freeze=function(){return{PC:this.gprs[15]-this.instructionWidth,SP:this.gprs[13],gprs:[this.gprs[0],this.gprs[1],this.gprs[2],this.gprs[3],this.gprs[4],this.gprs[5],this.gprs[6],this.gprs[7],this.gprs[8],this.gprs[9],this.gprs[10],this.gprs[11],this.gprs[12],this.gprs[13],this.gprs[14],this.gprs[15]],mode:this.mode,cpsrI:this.cpsrI,cpsrF:this.cpsrF,cpsrV:this.cpsrV,cpsrC:this.cpsrC,cpsrZ:this.cpsrZ,cpsrN:this.cpsrN,bankedRegisters:[[this.bankedRegisters[0][0],this.bankedRegisters[0][1],this.bankedRegisters[0][2],this.bankedRegisters[0][3],this.bankedRegisters[0][4],this.bankedRegisters[0][5],this.bankedRegisters[0][6]],[this.bankedRegisters[1][0],this.bankedRegisters[1][1],this.bankedRegisters[1][2],this.bankedRegisters[1][3],this.bankedRegisters[1][4],this.bankedRegisters[1][5],this.bankedRegisters[1][6]],[this.bankedRegisters[2][0],this.bankedRegisters[2][1]],[this.bankedRegisters[3][0],this.bankedRegisters[3][1]],[this.bankedRegisters[4][0],this.bankedRegisters[4][1]],[this.bankedRegisters[5][0],this.bankedRegisters[5][1]]],spsr:this.spsr,bankedSPSRs:[this.bankedSPSRs[0],this.bankedSPSRs[1],this.bankedSPSRs[2],this.bankedSPSRs[3],this.bankedSPSRs[4],this.bankedSPSRs[5]],cycles:this.cycles,instructionWidth:this.instructionWidth}};R.prototype.defrost=function(s){this.instruction=null,this.page=null,this.pageId=0,this.pageRegion=-1,this.gprs[0]=s.gprs[0],this.gprs[1]=s.gprs[1],this.gprs[2]=s.gprs[2],this.gprs[3]=s.gprs[3],this.gprs[4]=s.gprs[4],this.gprs[5]=s.gprs[5],this.gprs[6]=s.gprs[6],this.gprs[7]=s.gprs[7],this.gprs[8]=s.gprs[8],this.gprs[9]=s.gprs[9],this.gprs[10]=s.gprs[10],this.gprs[11]=s.gprs[11],this.gprs[12]=s.gprs[12],this.gprs[13]=s.gprs[13],this.gprs[14]=s.gprs[14],this.gprs[15]=s.gprs[15],this.mode=s.mode,this.cpsrI=s.cpsrI,this.cpsrF=s.cpsrF,this.cpsrV=s.cpsrV,this.cpsrC=s.cpsrC,this.cpsrZ=s.cpsrZ,this.cpsrN=s.cpsrN,this.bankedRegisters[0][0]=s.bankedRegisters[0][0],this.bankedRegisters[0][1]=s.bankedRegisters[0][1],this.bankedRegisters[0][2]=s.bankedRegisters[0][2],this.bankedRegisters[0][3]=s.bankedRegisters[0][3],this.bankedRegisters[0][4]=s.bankedRegisters[0][4],this.bankedRegisters[0][5]=s.bankedRegisters[0][5],this.bankedRegisters[0][6]=s.bankedRegisters[0][6],this.bankedRegisters[1][0]=s.bankedRegisters[1][0],this.bankedRegisters[1][1]=s.bankedRegisters[1][1],this.bankedRegisters[1][2]=s.bankedRegisters[1][2],this.bankedRegisters[1][3]=s.bankedRegisters[1][3],this.bankedRegisters[1][4]=s.bankedRegisters[1][4],this.bankedRegisters[1][5]=s.bankedRegisters[1][5],this.bankedRegisters[1][6]=s.bankedRegisters[1][6],this.bankedRegisters[2][0]=s.bankedRegisters[2][0],this.bankedRegisters[2][1]=s.bankedRegisters[2][1],this.bankedRegisters[3][0]=s.bankedRegisters[3][0],this.bankedRegisters[3][1]=s.bankedRegisters[3][1],this.bankedRegisters[4][0]=s.bankedRegisters[4][0],this.bankedRegisters[4][1]=s.bankedRegisters[4][1],this.bankedRegisters[5][0]=s.bankedRegisters[5][0],this.bankedRegisters[5][1]=s.bankedRegisters[5][1],this.spsr=s.spsr,this.bankedSPSRs[0]=s.bankedSPSRs[0],this.bankedSPSRs[1]=s.bankedSPSRs[1],this.bankedSPSRs[2]=s.bankedSPSRs[2],this.bankedSPSRs[3]=s.bankedSPSRs[3],this.bankedSPSRs[4]=s.bankedSPSRs[4],this.bankedSPSRs[5]=s.bankedSPSRs[5],this.cycles=s.cycles,this.instructionWidth=s.instructionWidth,this.loadInstruction=s.instructionWidth==2?this.loadInstructionThumb:this.loadInstructionArm,this.execMode=s.instructionWidth==2?1:0};R.prototype.fetchPage=function(s){var e=this.mmu,i=s>>>e.BASE_OFFSET,t=e.addressToPage(i,s&e.OFFSET_MASK);if(i==this.pageRegion){if(t==this.pageId&&!this.page.invalid)return;this.pageId=t}else this.pageMask=e.memory[i].PAGE_MASK,this.pageRegion=i,this.pageId=t;this.page=e.accessPage(i,t)};R.prototype.loadInstructionArm=function(s){var e=null;this.fetchPage(s);var i=(s&this.pageMask)>>2;if(e=this.page.arm[i],e)return e;var t=this.mmu.load32(s)>>>0;return e=this.compileArm(t),e.next=null,e.page=this.page,e.address=s,e.opcode=t,this.page.arm[i]=e,e};R.prototype.loadInstructionThumb=function(s){var e=null;this.fetchPage(s);var i=(s&this.pageMask)>>1;if(e=this.page.thumb[i],e)return e;var t=this.mmu.load16(s);return e=this.compileThumb(t),e.next=null,e.page=this.page,e.address=s,e.opcode=t,this.page.thumb[i]=e,e};R.prototype.selectBank=function(s){switch(s){case 16:case 31:return 0;case 17:return 1;case 18:return 2;case 19:return 3;case 23:return 4;case 27:return 5;default:throw new y("Invalid user mode "+s+" passed to selectBank")}};R.prototype.switchExecMode=function(s){this.execMode!=s&&(this.execMode=s,s==0?(this.instructionWidth=4,this.loadInstruction=this.loadInstructionArm):(this.instructionWidth=2,this.loadInstruction=this.loadInstructionThumb))};R.prototype.switchMode=function(s){if(s!=this.mode){if(s!=16||s!=31){var e=this.selectBank(s),i=this.selectBank(this.mode);if(e!=i){if(s==17||this.mode==17){var t=i==1?1:0,r=e==1?1:0;this.bankedRegisters[t][2]=this.gprs[8],this.bankedRegisters[t][3]=this.gprs[9],this.bankedRegisters[t][4]=this.gprs[10],this.bankedRegisters[t][5]=this.gprs[11],this.bankedRegisters[t][6]=this.gprs[12],this.gprs[8]=this.bankedRegisters[r][2],this.gprs[9]=this.bankedRegisters[r][3],this.gprs[10]=this.bankedRegisters[r][4],this.gprs[11]=this.bankedRegisters[r][5],this.gprs[12]=this.bankedRegisters[r][6]}this.bankedRegisters[i][0]=this.gprs[13],this.bankedRegisters[i][1]=this.gprs[14],this.gprs[13]=this.bankedRegisters[e][0],this.gprs[14]=this.bankedRegisters[e][1],this.bankedSPSRs[i]=this.spsr,this.spsr=this.bankedSPSRs[e]}}this.mode=s}};R.prototype.packCPSR=function(){return this.mode|this.execMode<<5|this.cpsrF<<6|this.cpsrI<<7|this.cpsrN<<31|this.cpsrZ<<30|this.cpsrC<<29|this.cpsrV<<28};R.prototype.unpackCPSR=function(s){this.switchMode(s&31),this.switchExecMode(!!(s&32)),this.cpsrF=s&64,this.cpsrI=s&128,this.cpsrN=s&2147483648,this.cpsrZ=s&1073741824,this.cpsrC=s&536870912,this.cpsrV=s&268435456,this.irq.testIRQ()};R.prototype.hasSPSR=function(){return this.mode!=31&&this.mode!=16};R.prototype.raiseIRQ=function(){if(!this.cpsrI){var s=this.packCPSR(),e=this.instructionWidth;this.switchMode(18),this.spsr=s,this.gprs[14]=this.gprs[15]-e+4,this.gprs[15]=this.BASE_IRQ+4,this.instruction=null,this.switchExecMode(0),this.cpsrI=!0}};R.prototype.raiseTrap=function(){var s=this.packCPSR(),e=this.instructionWidth;this.switchMode(19),this.spsr=s,this.gprs[14]=this.gprs[15]-e,this.gprs[15]=this.BASE_SWI+4,this.instruction=null,this.switchExecMode(0),this.cpsrI=!0};R.prototype.badOp=function(s){var e=function(){throw new y("Illegal instruction: 0x"+s.toString(16))};return e.writesPC=!0,e.fixedJump=!1,e};R.prototype.generateConds=function(){var s=this;this.conds=[function(){return s.conditionPassed=s.cpsrZ},function(){return s.conditionPassed=!s.cpsrZ},function(){return s.conditionPassed=s.cpsrC},function(){return s.conditionPassed=!s.cpsrC},function(){return s.conditionPassed=s.cpsrN},function(){return s.conditionPassed=!s.cpsrN},function(){return s.conditionPassed=s.cpsrV},function(){return s.conditionPassed=!s.cpsrV},function(){return s.conditionPassed=s.cpsrC&&!s.cpsrZ},function(){return s.conditionPassed=!s.cpsrC||s.cpsrZ},function(){return s.conditionPassed=!s.cpsrN==!s.cpsrV},function(){return s.conditionPassed=!s.cpsrN!=!s.cpsrV},function(){return s.conditionPassed=!s.cpsrZ&&!s.cpsrN==!s.cpsrV},function(){return s.conditionPassed=s.cpsrZ||!s.cpsrN!=!s.cpsrV},null,null]};R.prototype.barrelShiftImmediate=function(s,e,i){var t=this,r=this.gprs,a=this.badOp;switch(s){case 0:e?a=function(){t.shifterOperand=r[i]<>>e,t.shifterCarryOut=r[i]&1<>e,t.shifterCarryOut=r[i]&1<>>e|r[i]<<32-e,t.shifterCarryOut=r[i]&1<>>1,t.shifterCarryOut=r[i]&1};break}return a};R.prototype.compileArm=function(s){var e=this.badOp(s),i=s&234881024,t=this,r=this.gprs,a=this.conds[(s&4026531840)>>>28];if((s&268435440)==19922704){var c=s&15;e=this.armCompiler.constructBX(c,a),e.writesPC=!0,e.fixedJump=!1}else if(!(s&201326592)&&(i==33554432||(s&144)!=144)){var p=s&31457280,n=s&1048576,o=!1;if((p&25165824)==16777216&&!n){var v=s&4194304;if((s&11595776)==2158592){var c=s&15,x=s&255,w=(s&3840)>>7;x=x>>>w|x<<32-w,e=this.armCompiler.constructMSR(c,v,s,x,a),e.writesPC=!1}else if((s&12517376)==983040){var h=(s&61440)>>12;e=this.armCompiler.constructMRS(h,v,a),e.writesPC=h==15}}else{var f=(s&983040)>>16,h=(s&61440)>>12,l=s&96,c=s&15,C=function(){throw new y("BUG: invalid barrel shifter")};if(s&33554432){var x=s&255,V=(s&3840)>>7;V?C=this.armCompiler.constructAddressingMode1ImmediateRotate(x,V):C=this.armCompiler.constructAddressingMode1Immediate(x)}else if(s&16){var P=(s&3840)>>8;switch(o=!0,l){case 0:C=this.armCompiler.constructAddressingMode1LSL(P,c);break;case 32:C=this.armCompiler.constructAddressingMode1LSR(P,c);break;case 64:C=this.armCompiler.constructAddressingMode1ASR(P,c);break;case 96:C=this.armCompiler.constructAddressingMode1ROR(P,c);break}}else{var x=(s&3968)>>7;C=this.barrelShiftImmediate(l,x,c)}switch(p){case 0:n?e=this.armCompiler.constructANDS(h,f,C,a):e=this.armCompiler.constructAND(h,f,C,a);break;case 2097152:n?e=this.armCompiler.constructEORS(h,f,C,a):e=this.armCompiler.constructEOR(h,f,C,a);break;case 4194304:n?e=this.armCompiler.constructSUBS(h,f,C,a):e=this.armCompiler.constructSUB(h,f,C,a);break;case 6291456:n?e=this.armCompiler.constructRSBS(h,f,C,a):e=this.armCompiler.constructRSB(h,f,C,a);break;case 8388608:n?e=this.armCompiler.constructADDS(h,f,C,a):e=this.armCompiler.constructADD(h,f,C,a);break;case 10485760:n?e=this.armCompiler.constructADCS(h,f,C,a):e=this.armCompiler.constructADC(h,f,C,a);break;case 12582912:n?e=this.armCompiler.constructSBCS(h,f,C,a):e=this.armCompiler.constructSBC(h,f,C,a);break;case 14680064:n?e=this.armCompiler.constructRSCS(h,f,C,a):e=this.armCompiler.constructRSC(h,f,C,a);break;case 16777216:e=this.armCompiler.constructTST(h,f,C,a);break;case 18874368:e=this.armCompiler.constructTEQ(h,f,C,a);break;case 20971520:e=this.armCompiler.constructCMP(h,f,C,a);break;case 23068672:e=this.armCompiler.constructCMN(h,f,C,a);break;case 25165824:n?e=this.armCompiler.constructORRS(h,f,C,a):e=this.armCompiler.constructORR(h,f,C,a);break;case 27262976:n?e=this.armCompiler.constructMOVS(h,f,C,a):e=this.armCompiler.constructMOV(h,f,C,a);break;case 29360128:n?e=this.armCompiler.constructBICS(h,f,C,a):e=this.armCompiler.constructBIC(h,f,C,a);break;case 31457280:n?e=this.armCompiler.constructMVNS(h,f,C,a):e=this.armCompiler.constructMVN(h,f,C,a);break}e.writesPC=h==15}}else if((s&263196656)==16777360){var c=s&15,h=s>>12&15,f=s>>16&15;s&4194304?e=this.armCompiler.constructSWPB(h,f,c,a):e=this.armCompiler.constructSWP(h,f,c,a),e.writesPC=h==15}else switch(i){case 0:if((s&16777456)==144){var h=(s&983040)>>16,f=(s&61440)>>12,P=(s&3840)>>8,c=s&15;switch(s&15728640){case 0:e=this.armCompiler.constructMUL(h,P,c,a);break;case 1048576:e=this.armCompiler.constructMULS(h,P,c,a);break;case 2097152:e=this.armCompiler.constructMLA(h,f,P,c,a);break;case 3145728:e=this.armCompiler.constructMLAS(h,f,P,c,a);break;case 8388608:e=this.armCompiler.constructUMULL(h,f,P,c,a);break;case 9437184:e=this.armCompiler.constructUMULLS(h,f,P,c,a);break;case 10485760:e=this.armCompiler.constructUMLAL(h,f,P,c,a);break;case 11534336:e=this.armCompiler.constructUMLALS(h,f,P,c,a);break;case 12582912:e=this.armCompiler.constructSMULL(h,f,P,c,a);break;case 13631488:e=this.armCompiler.constructSMULLS(h,f,P,c,a);break;case 14680064:e=this.armCompiler.constructSMLAL(h,f,P,c,a);break;case 15728640:e=this.armCompiler.constructSMLALS(h,f,P,c,a);break}e.writesPC=h==15}else{var T=s&1048576,h=(s&61440)>>12,cr=(s&3840)>>4,ur=c=s&15,H=s&32,n=s&64,k=s&2097152,i=s&4194304,d;if(i){var x=ur|cr;d=this.armCompiler.constructAddressingMode23Immediate(s,x,a)}else d=this.armCompiler.constructAddressingMode23Register(s,c,a);d.writesPC=!!k&&f==15,(s&144)==144&&(T?H?n?e=this.armCompiler.constructLDRSH(h,d,a):e=this.armCompiler.constructLDRH(h,d,a):n&&(e=this.armCompiler.constructLDRSB(h,d,a)):!n&&H&&(e=this.armCompiler.constructSTRH(h,d,a))),e.writesPC=h==15||d.writesPC}break;case 67108864:case 100663296:var h=(s&61440)>>12,T=s&1048576,W=s&4194304,i=s&33554432,d=function(){throw new y("Unimplemented memory access: 0x"+s.toString(16))};if(~s&16777216&&(s&=4292870143),i){var c=s&15,l=s&96,K=(s&3968)>>7;l||K?(C=this.barrelShiftImmediate(l,K,c),d=this.armCompiler.constructAddressingMode2RegisterShifted(s,C,a)):d=this.armCompiler.constructAddressingMode23Register(s,c,a)}else{var M=s&4095;d=this.armCompiler.constructAddressingMode23Immediate(s,M,a)}T?W?e=this.armCompiler.constructLDRB(h,d,a):e=this.armCompiler.constructLDR(h,d,a):W?e=this.armCompiler.constructSTRB(h,d,a):e=this.armCompiler.constructSTR(h,d,a),e.writesPC=T&&(h==15||d.writesPC);break;case 134217728:var T=s&1048576,k=s&2097152,Q=s&4194304,pr=s&8388608,G=s&16777216,P=s&65535,f=(s&983040)>>16,d,x=0,M=0,B=!1;if(pr){G&&(x=4);for(var A=1,i=0;i<16;A<<=1,++i)P&A&&(k&&i==f&&!M&&(P&=~A,x+=4,B=!0),M+=4)}else{G||(x=4);for(var A=1,i=0;i<16;A<<=1,++i)P&A&&(k&&i==f&&!M&&(P&=~A,x+=4,B=!0),x-=4,M-=4)}k?d=this.armCompiler.constructAddressingMode4Writeback(x,M,f,B):d=this.armCompiler.constructAddressingMode4(x,f),T?(Q?e=this.armCompiler.constructLDMS(P,d,a):e=this.armCompiler.constructLDM(P,d,a),e.writesPC=!!(P&1<<15)):(Q?e=this.armCompiler.constructSTMS(P,d,a):e=this.armCompiler.constructSTM(P,d,a),e.writesPC=!1);break;case 167772160:var x=s&16777215;x&8388608&&(x|=4278190080),x<<=2;var nr=s&16777216;nr?e=this.armCompiler.constructBL(x,a):e=this.armCompiler.constructB(x,a),e.writesPC=!0,e.fixedJump=!0;break;case 201326592:break;case 234881024:if((s&251658240)==251658240){var x=s&16777215;e=this.armCompiler.constructSWI(x,a),e.writesPC=!1}break;default:throw new y("Bad opcode: 0x"+s.toString(16))}return e.execMode=0,e.fixedJump=e.fixedJump||!1,e};R.prototype.compileThumb=function(s){var e=this.badOp(s&65535),i=this,t=this.gprs;if((s&64512)==16384){var r=(s&56)>>3,a=s&7;switch(s&960){case 0:e=this.thumbCompiler.constructAND(a,r);break;case 64:e=this.thumbCompiler.constructEOR(a,r);break;case 128:e=this.thumbCompiler.constructLSL2(a,r);break;case 192:e=this.thumbCompiler.constructLSR2(a,r);break;case 256:e=this.thumbCompiler.constructASR2(a,r);break;case 320:e=this.thumbCompiler.constructADC(a,r);break;case 384:e=this.thumbCompiler.constructSBC(a,r);break;case 448:e=this.thumbCompiler.constructROR(a,r);break;case 512:e=this.thumbCompiler.constructTST(a,r);break;case 576:e=this.thumbCompiler.constructNEG(a,r);break;case 640:e=this.thumbCompiler.constructCMP2(a,r);break;case 704:e=this.thumbCompiler.constructCMN(a,r);break;case 768:e=this.thumbCompiler.constructORR(a,r);break;case 832:e=this.thumbCompiler.constructMUL(a,r);break;case 896:e=this.thumbCompiler.constructBIC(a,r);break;case 960:e=this.thumbCompiler.constructMVN(a,r);break}e.writesPC=!1}else if((s&64512)==17408){var r=(s&120)>>3,c=s&7,p=s&128,a=c|p>>4;switch(s&768){case 0:e=this.thumbCompiler.constructADD4(a,r),e.writesPC=a==15;break;case 256:e=this.thumbCompiler.constructCMP3(a,r),e.writesPC=!1;break;case 512:e=this.thumbCompiler.constructMOV3(a,r),e.writesPC=a==15;break;case 768:e=this.thumbCompiler.constructBX(a,r),e.writesPC=!0,e.fixedJump=!1;break}}else if((s&63488)==6144){var r=(s&448)>>6,c=(s&56)>>3,a=s&7;switch(s&1536){case 0:e=this.thumbCompiler.constructADD3(a,c,r);break;case 512:e=this.thumbCompiler.constructSUB3(a,c,r);break;case 1024:var n=(s&448)>>6;n?e=this.thumbCompiler.constructADD1(a,c,n):e=this.thumbCompiler.constructMOV2(a,c,r);break;case 1536:var n=(s&448)>>6;e=this.thumbCompiler.constructSUB1(a,c,n);break}e.writesPC=!1}else if(s&57344)if((s&57344)==8192){var n=s&255,c=(s&1792)>>8;switch(s&6144){case 0:e=this.thumbCompiler.constructMOV1(c,n);break;case 2048:e=this.thumbCompiler.constructCMP1(c,n);break;case 4096:e=this.thumbCompiler.constructADD2(c,n);break;case 6144:e=this.thumbCompiler.constructSUB2(c,n);break}e.writesPC=!1}else if((s&63488)==18432){var a=(s&1792)>>8,n=(s&255)<<2;e=this.thumbCompiler.constructLDR3(a,n),e.writesPC=!1}else if((s&61440)==20480){var a=s&7,c=(s&56)>>3,r=(s&448)>>6,o=s&3584;switch(o){case 0:e=this.thumbCompiler.constructSTR2(a,c,r);break;case 512:e=this.thumbCompiler.constructSTRH2(a,c,r);break;case 1024:e=this.thumbCompiler.constructSTRB2(a,c,r);break;case 1536:e=this.thumbCompiler.constructLDRSB(a,c,r);break;case 2048:e=this.thumbCompiler.constructLDR2(a,c,r);break;case 2560:e=this.thumbCompiler.constructLDRH2(a,c,r);break;case 3072:e=this.thumbCompiler.constructLDRB2(a,c,r);break;case 3584:e=this.thumbCompiler.constructLDRSH(a,c,r);break}e.writesPC=!1}else if((s&57344)==24576){var a=s&7,c=(s&56)>>3,n=(s&1984)>>4,v=s&4096;v&&(n>>=2);var x=s&2048;x?v?e=this.thumbCompiler.constructLDRB1(a,c,n):e=this.thumbCompiler.constructLDR1(a,c,n):v?e=this.thumbCompiler.constructSTRB1(a,c,n):e=this.thumbCompiler.constructSTR1(a,c,n),e.writesPC=!1}else if((s&62976)==46080){var w=!!(s&256),h=s&255;s&2048?(e=this.thumbCompiler.constructPOP(h,w),e.writesPC=w,e.fixedJump=!1):(e=this.thumbCompiler.constructPUSH(h,w),e.writesPC=!1)}else if(s&32768)switch(s&28672){case 0:var a=s&7,c=(s&56)>>3,n=(s&1984)>>5;s&2048?e=this.thumbCompiler.constructLDRH1(a,c,n):e=this.thumbCompiler.constructSTRH1(a,c,n),e.writesPC=!1;break;case 4096:var a=(s&1792)>>8,n=(s&255)<<2,x=s&2048;x?e=this.thumbCompiler.constructLDR4(a,n):e=this.thumbCompiler.constructSTR3(a,n),e.writesPC=!1;break;case 8192:var a=(s&1792)>>8,n=(s&255)<<2;s&2048?e=this.thumbCompiler.constructADD6(a,n):e=this.thumbCompiler.constructADD5(a,n),e.writesPC=!1;break;case 12288:if(!(s&3840)){var v=s&128,n=(s&127)<<2;v&&(n=-n),e=this.thumbCompiler.constructADD7(n),e.writesPC=!1}break;case 16384:var c=(s&1792)>>8,h=s&255;s&2048?e=this.thumbCompiler.constructLDMIA(c,h):e=this.thumbCompiler.constructSTMIA(c,h),e.writesPC=!1;break;case 20480:var f=(s&3840)>>8,n=s&255;if(f==15)e=this.thumbCompiler.constructSWI(n),e.writesPC=!1;else{s&128&&(n|=4294967040),n<<=1;var l=this.conds[f];e=this.thumbCompiler.constructB1(n,l),e.writesPC=!0,e.fixedJump=!0}break;case 24576:case 28672:var n=s&2047,C=s&6144;switch(C){case 0:n&1024&&(n|=4294965248),n<<=1,e=this.thumbCompiler.constructB2(n),e.writesPC=!0,e.fixedJump=!0;break;case 2048:break;case 4096:n&1024&&(n|=4294966272),n<<=12,e=this.thumbCompiler.constructBL1(n),e.writesPC=!1;break;case 6144:e=this.thumbCompiler.constructBL2(n),e.writesPC=!0,e.fixedJump=!1;break}break;default:throw new y("Undefined instruction: 0x"+s.toString(16))}else throw new y("Bad opcode: 0x"+s.toString(16));else{var a=s&7,r=(s&56)>>3,n=(s&1984)>>6;switch(s&6144){case 0:e=this.thumbCompiler.constructLSL1(a,r,n);break;case 2048:e=this.thumbCompiler.constructLSR1(a,r,n);break;case 4096:e=this.thumbCompiler.constructASR1(a,r,n);break;case 6144:break}e.writesPC=!1}return e.execMode=1,e.fixedJump=e.fixedJump||!1,e};var U=class{constructor(){this.BASE_OFFSET=24;this.OFFSET_MASK=16777215;this.core=new R,this.core.irq=this,this.core.mmu=this,this.resetMemory()}resetMemory(){this.memory=[];for(var e=0;e<256;e++){var i=10,t=524288;this.memory[e]={PAGE_MASK:(2<0?e:1}getPC(){return this.core.gprs[15]-this.core.instructionWidth}getSP(){return this.core.gprs[13]}isStable(){return!0}connectMemoryBus(e){this.bus=e}reset(){this.resetMemory(),this.core.resetCPU(0)}saveState(){return this.core.freeze()}loadState(e){this.core.defrost(e)}load8(e){return this.bus.read(e)<<24>>24}loadU8(e){return this.bus.read(e)&255}load16(e){return this.loadU16(e)<<16>>16}loadU16(e){return this.bus.read(e)|this.bus.read(e+1)<<8}load32(e){var i=this.bus.read(e)|this.bus.read(e+1)<<8|this.bus.read(e+2)<<16|this.bus.read(e+3)<<24;return i}store8(e,i){this.bus.write(e,i&255)}store16(e,i){this.bus.write(e,i&255),this.bus.write(e+1,i>>8&255)}store32(e,i){this.bus.write(e,i&255),this.bus.write(e+1,i>>8&255),this.bus.write(e+2,i>>16&255),this.bus.write(e+3,i>>24&255)}wait(e){++this.core.cycles}wait32(e){++this.core.cycles}waitSeq32(e){++this.core.cycles}waitMul(e){(e&4294967040)==4294967040||!(e&4294967040)?this.core.cycles+=1:(e&4294901760)==4294901760||!(e&4294901760)?this.core.cycles+=2:(e&4278190080)==4278190080||!(e&4278190080)?this.core.cycles+=3:this.core.cycles+=4}waitMulti32(e,i){this.core.cycles+=2}waitPrefetch(e){++this.core.cycles}waitPrefetch32(e){++this.core.cycles}addressToPage(e,i){return i>>this.memory[e].ICACHE_PAGE_BITS}accessPage(e,i){var t=this.memory[e],r=t.icache[i];return(!r||r.invalid)&&(r={thumb:new Array(1<>16)}clear(){}updateTimers(){}testIRQ(){}isThumb(){return this.core.instructionWidth==2}};var Fr=X([[S.A,0,1],[S.B,0,2],[S.GP_A,0,1],[S.GP_B,0,2],[S.SELECT,0,4],[S.START,0,8],[S.RIGHT,0,16],[S.LEFT,0,32],[S.UP,0,64],[S.DOWN,0,128]]),er=0,tr=524288,I=33554432,D=524288,O=67108864,_=256,hr=1e6,sr=4e6,Z=class extends q{constructor(){super();this.cpuFrequency=sr;this.canvasWidth=160;this.numTotalScanlines=256;this.numVisibleScanlines=128;this.cpuCyclesPerLine=Math.floor(sr/(256*60));this.defaultROMSize=512*1024;this.sampleRate=1;this.cpu=new U;this.ram=new Uint8Array(96*1024);this.ram16=new Uint16Array(this.ram.buffer);this.vidbase=0;this.brightness=255;this.read=L([[er,er+tr-1,tr-1,e=>this.rom?this.rom[e]:0],[I,I+D-1,D-1,e=>this.ram[e]],[O,O+_-1,_-1,(e,i)=>this.readIO(e)],[0,(1<<31)-1,0,(e,i)=>{throw new y(`Address read out of bounds: 0x${E(e)}`)}]]);this.write=L([[I,I+D-1,D-1,(e,i)=>{this.ram[e]=i}],[O,O+_-1,_-1,(e,i)=>{this.writeIO(e,i)}]]);this.connectCPUMemoryBus(this),this.handler=z(this.inputs,Fr)}connectVideo(e){super.connectVideo(e),this.pixels32=e,this.pixels8=new Uint8Array(e.buffer)}connectSerialIO(e){this.serial=e}reset(){super.reset(),this.serialOut=[],this.serialIn=[]}readIO(e){switch(e){case 0:return this.inputs[0];case 64:return(this.serial.byteAvailable()?128:0)|(this.serial.clearToSend()?64:0);case 68:let i=this.serialIn.shift();return i!=null?(this.serialOut.push(i),i.value):0;default:return 0}}writeIO(e,i){switch(e){case 0:break;case 72:this.serialOut.length>1&1048575,t=this.brightness<<24,r=0;r>5&31)<<11|(a>>10&31)<<19}}getDebugCategories(){return["CPU","Stack"]}getDebugInfo(e,i){switch(e){case"CPU":var t="",r=i.c;let c={2:"Thumb",4:"ARM"},p={15:"PC",14:"LR",13:"SP",12:"IP",11:"FP",9:"SB"};for(var a=0;a<16;a++)t+=N(p[a]||"",3)+N("r"+a,5)+" "+E(r.gprs[a],8)+` +import{H as j,q}from"./chunk-6UU4KLMR.js";import{D as J,H as Y,Q as y,T as S,U as z,W as X,Z as L,a as N,g as E}from"./chunk-7LTJUW24.js";import"./chunk-RQFURXHW.js";var g;(function(o){o[o.MODE_ARM=0]="MODE_ARM",o[o.MODE_THUMB=1]="MODE_THUMB",o[o.MODE_USER=16]="MODE_USER",o[o.MODE_FIQ=17]="MODE_FIQ",o[o.MODE_IRQ=18]="MODE_IRQ",o[o.MODE_SUPERVISOR=19]="MODE_SUPERVISOR",o[o.MODE_ABORT=23]="MODE_ABORT",o[o.MODE_UNDEFINED=27]="MODE_UNDEFINED",o[o.MODE_SYSTEM=31]="MODE_SYSTEM"})(g||(g={}));var u;(function(t){t[t.SP=13]="SP",t[t.LR=14]="LR",t[t.PC=15]="PC"})(u||(u={}));var b;(function(l){l[l.BANK_NONE=0]="BANK_NONE",l[l.BANK_FIQ=1]="BANK_FIQ",l[l.BANK_IRQ=2]="BANK_IRQ",l[l.BANK_SUPERVISOR=3]="BANK_SUPERVISOR",l[l.BANK_ABORT=4]="BANK_ABORT",l[l.BANK_UNDEFINED=5]="BANK_UNDEFINED",l[l.WORD_SIZE_ARM=4]="WORD_SIZE_ARM",l[l.WORD_SIZE_THUMB=2]="WORD_SIZE_THUMB",l[l.BASE_RESET=0]="BASE_RESET",l[l.BASE_UNDEF=4]="BASE_UNDEF",l[l.BASE_SWI=8]="BASE_SWI",l[l.BASE_PABT=12]="BASE_PABT",l[l.BASE_DABT=16]="BASE_DABT",l[l.BASE_IRQ=24]="BASE_IRQ",l[l.BASE_FIQ=28]="BASE_FIQ"})(b||(b={}));var $=4026531840,rr=223,or=32;function F(s){this.cpu=s,this.addressingMode23Immediate=[function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(r[e]-=i),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(r[e]+=i),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){return r[e]-i};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){var c=r[e]-i;return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null,function(e,i,t){var r=s.gprs,a=function(){return r[e]+i};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){var c=r[e]+i;return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null],this.addressingMode23Register=[function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(r[e]-=r[i]),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(r[e]+=r[i]),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){return r[e]-r[i]};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){var c=r[e]-r[i];return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null,function(e,i,t){var r=s.gprs,a=function(){var c=r[e]+r[i];return c};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){var c=r[e]+r[i];return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null],this.addressingMode2RegisterShifted=[function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(i(),r[e]-=s.shifterOperand),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){var c=r[e];return(!t||t())&&(i(),r[e]+=s.shifterOperand),c};return a.writesPC=e==15,a},null,null,null,function(e,i,t){var r=s.gprs,a=function(){return i(),r[e]-s.shifterOperand};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){i();var c=r[e]-s.shifterOperand;return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null,function(e,i,t){var r=s.gprs,a=function(){return i(),r[e]+s.shifterOperand};return a.writesPC=!1,a},function(e,i,t){var r=s.gprs,a=function(){i();var c=r[e]+s.shifterOperand;return(!t||t())&&(r[e]=c),c};return a.writesPC=e==15,a},null,null]}F.prototype.constructAddressingMode1ASR=function(s,e){var i=this.cpu,t=i.gprs;return function(){++i.cycles;var r=t[s];s==15&&(r+=4),r&=255;var a=t[e];e==15&&(a+=4),r==0?(i.shifterOperand=a,i.shifterCarryOut=i.cpsrC):r<32?(i.shifterOperand=a>>r,i.shifterCarryOut=a&1<>31?(i.shifterOperand=4294967295,i.shifterCarryOut=2147483648):(i.shifterOperand=0,i.shifterCarryOut=0)}};F.prototype.constructAddressingMode1Immediate=function(s){var e=this.cpu;return function(){e.shifterOperand=s,e.shifterCarryOut=e.cpsrC}};F.prototype.constructAddressingMode1ImmediateRotate=function(s,e){var i=this.cpu;return function(){i.shifterOperand=s>>>e|s<<32-e,i.shifterCarryOut=i.shifterOperand>>31}};F.prototype.constructAddressingMode1LSL=function(s,e){var i=this.cpu,t=i.gprs;return function(){++i.cycles;var r=t[s];s==15&&(r+=4),r&=255;var a=t[e];e==15&&(a+=4),r==0?(i.shifterOperand=a,i.shifterCarryOut=i.cpsrC):r<32?(i.shifterOperand=a<>>r,i.shifterCarryOut=a&1<>31):(i.shifterOperand=0,i.shifterCarryOut=0)}};F.prototype.constructAddressingMode1ROR=function(s,e){var i=this.cpu,t=i.gprs;return function(){++i.cycles;var r=t[s];s==15&&(r+=4),r&=255;var a=t[e];e==15&&(a+=4);var c=r&31;r==0?(i.shifterOperand=a,i.shifterCarryOut=i.cpsrC):c?(i.shifterOperand=t[e]>>>c|t[e]<<32-c,i.shifterCarryOut=a&1<>31)}};F.prototype.constructAddressingMode23Immediate=function(s,e,i){var t=(s&983040)>>16;return this.addressingMode23Immediate[(s&27262976)>>21](t,e,i)};F.prototype.constructAddressingMode23Register=function(s,e,i){var t=(s&983040)>>16;return this.addressingMode23Register[(s&27262976)>>21](t,e,i)};F.prototype.constructAddressingMode2RegisterShifted=function(s,e,i){var t=(s&983040)>>16;return this.addressingMode2RegisterShifted[(s&27262976)>>21](t,e,i)};F.prototype.constructAddressingMode4=function(s,e){var i=this.cpu,t=i.gprs;return function(){var r=t[e]+s;return r}};F.prototype.constructAddressingMode4Writeback=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(c){var p=a[i]+s;return c&&t&&r.mmu.store32(a[i]+s-4,a[i]),a[i]+=e,p}};F.prototype.constructADC=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(r.shifterOperand>>>0)+(r.cpsrC?1:0);a[s]=(a[e]>>>0)+c}}};F.prototype.constructADCS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(r.shifterOperand>>>0)+(r.cpsrC?1:0),p=(a[e]>>>0)+c;s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=p>>31,r.cpsrZ=!(p&4294967295),r.cpsrC=p>4294967295,r.cpsrV=a[e]>>31==c>>31&&a[e]>>31!=p>>31&&c>>31!=p>>31),a[s]=p}}};F.prototype.constructADD=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=(a[e]>>>0)+(r.shifterOperand>>>0))}};F.prototype.constructADDS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(a[e]>>>0)+(r.shifterOperand>>>0);s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=c>4294967295,r.cpsrV=a[e]>>31==r.shifterOperand>>31&&a[e]>>31!=c>>31&&r.shifterOperand>>31!=c>>31),a[s]=c}}};F.prototype.constructAND=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]&r.shifterOperand)}};F.prototype.constructANDS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]&r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructB=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(e&&!e()){i.mmu.waitPrefetch32(t[15]);return}i.mmu.waitPrefetch32(t[15]),t[15]+=s}};F.prototype.constructBIC=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]&~r.shifterOperand)}};F.prototype.constructBICS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]&~r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructBL=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(e&&!e()){i.mmu.waitPrefetch32(t[15]);return}i.mmu.waitPrefetch32(t[15]),t[14]=t[15]-4,t[15]+=s}};F.prototype.constructBX=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(e&&!e()){i.mmu.waitPrefetch32(t[15]);return}i.mmu.waitPrefetch32(t[15]),i.switchExecMode(t[s]&1),t[15]=t[s]&4294967294}};F.prototype.constructCMN=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(a[e]>>>0)+(r.shifterOperand>>>0);r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=c>4294967295,r.cpsrV=a[e]>>31==r.shifterOperand>>31&&a[e]>>31!=c>>31&&r.shifterOperand>>31!=c>>31}}};F.prototype.constructCMP=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=a[e]-r.shifterOperand;r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=a[e]>>>0>=r.shifterOperand>>>0,r.cpsrV=a[e]>>31!=r.shifterOperand>>31&&a[e]>>31!=c>>31}}};F.prototype.constructEOR=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]^r.shifterOperand)}};F.prototype.constructEORS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]^r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructLDM=function(s,e,i){var t=this.cpu,r=t.gprs,a=t.mmu;return function(){if(a.waitPrefetch32(r[15]),!(i&&!i())){var c=e(!1),p=0,n,o;for(n=s,o=0;n;n>>=1,++o)n&1&&(r[o]=a.load32(c&4294967292),c+=4,++p);a.waitMulti32(c,p),++t.cycles}}};F.prototype.constructLDMS=function(s,e,i){var t=this.cpu,r=t.gprs,a=t.mmu;return function(){if(a.waitPrefetch32(r[15]),!(i&&!i())){var c=e(!1),p=0,n=t.mode;t.switchMode(31);var o,v;for(o=s,v=0;o;o>>=1,++v)o&1&&(r[v]=a.load32(c&4294967292),c+=4,++p);t.switchMode(n),a.waitMulti32(c,p),++t.cycles}}};F.prototype.constructLDR=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.load32(a),t.mmu.wait32(a),++t.cycles}}};F.prototype.constructLDRB=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.loadU8(a),t.mmu.wait(a),++t.cycles}}};F.prototype.constructLDRH=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.loadU16(a),t.mmu.wait(a),++t.cycles}}};F.prototype.constructLDRSB=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.load8(a),t.mmu.wait(a),++t.cycles}}};F.prototype.constructLDRSH=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(t.mmu.waitPrefetch32(r[15]),!(i&&!i())){var a=e();r[s]=t.mmu.load16(a),t.mmu.wait(a),++t.cycles}}};F.prototype.constructMLA=function(s,e,i,t,r){var a=this.cpu,c=a.gprs;return function(){if(a.mmu.waitPrefetch32(c[15]),!(r&&!r()))if(++a.cycles,a.mmu.waitMul(i),c[t]&4294901760&&c[i]&4294901760){var p=(c[t]&4294901760)*c[i]&4294967295,n=(c[t]&65535)*c[i]&4294967295;c[s]=p+n+c[e]&4294967295}else c[s]=c[t]*c[i]+c[e]}};F.prototype.constructMLAS=function(s,e,i,t,r){var a=this.cpu,c=a.gprs;return function(){if(a.mmu.waitPrefetch32(c[15]),!(r&&!r())){if(++a.cycles,a.mmu.waitMul(i),c[t]&4294901760&&c[i]&4294901760){var p=(c[t]&4294901760)*c[i]&4294967295,n=(c[t]&65535)*c[i]&4294967295;c[s]=p+n+c[e]&4294967295}else c[s]=c[t]*c[i]+c[e];a.cpsrN=c[s]>>31,a.cpsrZ=!(c[s]&4294967295)}}};F.prototype.constructMOV=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=r.shifterOperand)}};F.prototype.constructMOVS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructMRS=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch32(r[15]),!(i&&!i())&&(e?r[s]=t.spsr:r[s]=t.packCPSR())}};F.prototype.constructMSR=function(s,e,i,t,r){var a=this.cpu,c=a.gprs,p=i&65536,n=i&524288;return function(){if(a.mmu.waitPrefetch32(c[15]),!(r&&!r())){var o;i&33554432?o=t:o=c[s];var v=(p?255:0)|(n?4278190080:0);e?(v&=$|rr|or,a.spsr=a.spsr&~v|o&v):(v&$&&(a.cpsrN=o>>31,a.cpsrZ=o&1073741824,a.cpsrC=o&536870912,a.cpsrV=o&268435456),a.mode!=16&&v&rr&&(a.switchMode(o&15|16),a.cpsrI=o&128,a.cpsrF=o&64))}}};F.prototype.constructMUL=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t()))if(r.mmu.waitMul(a[e]),a[i]&4294901760&&a[e]&4294901760){var c=(a[i]&4294901760)*a[e]|0,p=(a[i]&65535)*a[e]|0;a[s]=c+p}else a[s]=a[i]*a[e]}};F.prototype.constructMULS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){if(r.mmu.waitMul(a[e]),a[i]&4294901760&&a[e]&4294901760){var c=(a[i]&4294901760)*a[e]|0,p=(a[i]&65535)*a[e]|0;a[s]=c+p}else a[s]=a[i]*a[e];r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295)}}};F.prototype.constructMVN=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=~r.shifterOperand)}};F.prototype.constructMVNS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=~r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructORR=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]|r.shifterOperand)}};F.prototype.constructORRS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]|r.shifterOperand,s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=a[s]>>31,r.cpsrZ=!(a[s]&4294967295),r.cpsrC=r.shifterCarryOut))}};F.prototype.constructRSB=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=r.shifterOperand-a[e])}};F.prototype.constructRSBS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=r.shifterOperand-a[e];s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=r.shifterOperand>>>0>=a[e]>>>0,r.cpsrV=r.shifterOperand>>31!=a[e]>>31&&r.shifterOperand>>31!=c>>31),a[s]=c}}};F.prototype.constructRSC=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(a[e]>>>0)+(r.cpsrC?0:1);a[s]=(r.shifterOperand>>>0)-c}}};F.prototype.constructRSCS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(a[e]>>>0)+(r.cpsrC?0:1),p=(r.shifterOperand>>>0)-c;s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=p>>31,r.cpsrZ=!(p&4294967295),r.cpsrC=r.shifterOperand>>>0>=p>>>0,r.cpsrV=r.shifterOperand>>31!=c>>31&&r.shifterOperand>>31!=p>>31),a[s]=p}}};F.prototype.constructSBC=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(r.shifterOperand>>>0)+(r.cpsrC?0:1);a[s]=(a[e]>>>0)-c}}};F.prototype.constructSBCS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=(r.shifterOperand>>>0)+(r.cpsrC?0:1),p=(a[e]>>>0)-c;s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=p>>31,r.cpsrZ=!(p&4294967295),r.cpsrC=a[e]>>>0>=p>>>0,r.cpsrV=a[e]>>31!=c>>31&&a[e]>>31!=p>>31),a[s]=p}}};F.prototype.constructSMLAL=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){a.cycles+=2,a.mmu.waitMul(i);var n=(p[t]&4294901760)*p[i],o=(p[t]&65535)*p[i],v=(p[e]>>>0)+n+o;p[e]=v,p[s]+=Math.floor(v*c)}}};F.prototype.constructSMLALS=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){a.cycles+=2,a.mmu.waitMul(i);var n=(p[t]&4294901760)*p[i],o=(p[t]&65535)*p[i],v=(p[e]>>>0)+n+o;p[e]=v,p[s]+=Math.floor(v*c),a.cpsrN=p[s]>>31,a.cpsrZ=!(p[s]&4294967295||p[e]&4294967295)}}};F.prototype.constructSMULL=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){++a.cycles,a.mmu.waitMul(p[i]);var n=((p[t]&4294901760)>>0)*(p[i]>>0),o=((p[t]&65535)>>0)*(p[i]>>0);p[e]=(n&4294967295)+(o&4294967295)&4294967295,p[s]=Math.floor(n*c+o*c)}}};F.prototype.constructSMULLS=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){++a.cycles,a.mmu.waitMul(p[i]);var n=((p[t]&4294901760)>>0)*(p[i]>>0),o=((p[t]&65535)>>0)*(p[i]>>0);p[e]=(n&4294967295)+(o&4294967295)&4294967295,p[s]=Math.floor(n*c+o*c),a.cpsrN=p[s]>>31,a.cpsrZ=!(p[s]&4294967295||p[e]&4294967295)}}};F.prototype.constructSTM=function(s,e,i){var t=this.cpu,r=t.gprs,a=t.mmu;return function(){if(i&&!i()){a.waitPrefetch32(r[15]);return}a.wait32(r[15]);var c=e(!0),p=0,n,o;for(n=s,o=0;n;n>>=1,++o)n&1&&(a.store32(c,r[o]),c+=4,++p);a.waitMulti32(c,p)}};F.prototype.constructSTMS=function(s,e,i){var t=this.cpu,r=t.gprs,a=t.mmu;return function(){if(i&&!i()){a.waitPrefetch32(r[15]);return}a.wait32(r[15]);var c=t.mode,p=e(!0),n=0,o,v;for(t.switchMode(31),o=s,v=0;o;o>>=1,++v)o&1&&(a.store32(p,r[v]),p+=4,++n);t.switchMode(c),a.waitMulti32(p,n)}};F.prototype.constructSTR=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(i&&!i()){t.mmu.waitPrefetch32(r[15]);return}var a=e();t.mmu.store32(a,r[s]),t.mmu.wait32(a),t.mmu.wait32(r[15])}};F.prototype.constructSTRB=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(i&&!i()){t.mmu.waitPrefetch32(r[15]);return}var a=e();t.mmu.store8(a,r[s]),t.mmu.wait(a),t.mmu.wait32(r[15])}};F.prototype.constructSTRH=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){if(i&&!i()){t.mmu.waitPrefetch32(r[15]);return}var a=e();t.mmu.store16(a,r[s]),t.mmu.wait(a),t.mmu.wait32(r[15])}};F.prototype.constructSUB=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){r.mmu.waitPrefetch32(a[15]),!(t&&!t())&&(i(),a[s]=a[e]-r.shifterOperand)}};F.prototype.constructSUBS=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=a[e]-r.shifterOperand;s==15&&r.hasSPSR()?r.unpackCPSR(r.spsr):(r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=a[e]>>>0>=r.shifterOperand>>>0,r.cpsrV=a[e]>>31!=r.shifterOperand>>31&&a[e]>>31!=c>>31),a[s]=c}}};F.prototype.constructSWI=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(e&&!e()){i.mmu.waitPrefetch32(t[15]);return}i.irq.swi32(s),i.mmu.waitPrefetch32(t[15])}};F.prototype.constructSWP=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){r.mmu.wait32(a[e]),r.mmu.wait32(a[e]);var c=r.mmu.load32(a[e]);r.mmu.store32(a[e],a[i]),a[s]=c,++r.cycles}}};F.prototype.constructSWPB=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){r.mmu.wait(a[e]),r.mmu.wait(a[e]);var c=r.mmu.loadU8(a[e]);r.mmu.store8(a[e],a[i]),a[s]=c,++r.cycles}}};F.prototype.constructTEQ=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=a[e]^r.shifterOperand;r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=r.shifterCarryOut}}};F.prototype.constructTST=function(s,e,i,t){var r=this.cpu,a=r.gprs;return function(){if(r.mmu.waitPrefetch32(a[15]),!(t&&!t())){i();var c=a[e]&r.shifterOperand;r.cpsrN=c>>31,r.cpsrZ=!(c&4294967295),r.cpsrC=r.shifterCarryOut}}};F.prototype.constructUMLAL=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){a.cycles+=2,a.mmu.waitMul(i);var n=((p[t]&4294901760)>>>0)*(p[i]>>>0),o=(p[t]&65535)*(p[i]>>>0),v=(p[e]>>>0)+n+o;p[e]=v,p[s]+=v*c}}};F.prototype.constructUMLALS=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){a.cycles+=2,a.mmu.waitMul(i);var n=((p[t]&4294901760)>>>0)*(p[i]>>>0),o=(p[t]&65535)*(p[i]>>>0),v=(p[e]>>>0)+n+o;p[e]=v,p[s]+=v*c,a.cpsrN=p[s]>>31,a.cpsrZ=!(p[s]&4294967295||p[e]&4294967295)}}};F.prototype.constructUMULL=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){++a.cycles,a.mmu.waitMul(p[i]);var n=((p[t]&4294901760)>>>0)*(p[i]>>>0),o=((p[t]&65535)>>>0)*(p[i]>>>0);p[e]=(n&4294967295)+(o&4294967295)&4294967295,p[s]=n*c+o*c>>>0}}};F.prototype.constructUMULLS=function(s,e,i,t,r){var a=this.cpu,c=1/4294967296,p=a.gprs;return function(){if(a.mmu.waitPrefetch32(p[15]),!(r&&!r())){++a.cycles,a.mmu.waitMul(p[i]);var n=((p[t]&4294901760)>>>0)*(p[i]>>>0),o=((p[t]&65535)>>>0)*(p[i]>>>0);p[e]=(n&4294967295)+(o&4294967295)&4294967295,p[s]=n*c+o*c>>>0,a.cpsrN=p[s]>>31,a.cpsrZ=!(p[s]&4294967295||p[e]&4294967295)}}};function m(s){this.cpu=s}m.prototype.constructADC=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=(t[e]>>>0)+(i.cpsrC?1:0),a=t[s],c=(a>>>0)+r,p=a>>31,n=c>>31,o=r>>31;i.cpsrN=n,i.cpsrZ=!(c&4294967295),i.cpsrC=c>4294967295,i.cpsrV=p==o&&p!=n&&o!=n,t[s]=c}};m.prototype.constructADD1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=(r[e]>>>0)+i;t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=a>4294967295,t.cpsrV=!(r[e]>>31)&&(r[e]>>31^a)>>31&&a>>31,r[s]=a}};m.prototype.constructADD2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=(t[s]>>>0)+e;i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=r>4294967295,i.cpsrV=!(t[s]>>31)&&(t[s]^r)>>31&&(e^r)>>31,t[s]=r}};m.prototype.constructADD3=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=(r[e]>>>0)+(r[i]>>>0);t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=a>4294967295,t.cpsrV=!((r[e]^r[i])>>31)&&(r[e]^a)>>31&&(r[i]^a)>>31,r[s]=a}};m.prototype.constructADD4=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]+=t[e]}};m.prototype.constructADD5=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=(t[15]&4294967292)+e}};m.prototype.constructADD6=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[13]+e}};m.prototype.constructADD7=function(s){var e=this.cpu,i=e.gprs;return function(){e.mmu.waitPrefetch(i[15]),i[13]+=s}};m.prototype.constructAND=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[s]&t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructASR1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]),i==0?(t.cpsrC=r[e]>>31,t.cpsrC?r[s]=4294967295:r[s]=0):(t.cpsrC=r[e]&1<>i),t.cpsrN=r[s]>>31,t.cpsrZ=!(r[s]&4294967295)}};m.prototype.constructASR2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[e]&255;r&&(r<32?(i.cpsrC=t[s]&1<>=r):(i.cpsrC=t[s]>>31,i.cpsrC?t[s]=4294967295:t[s]=0)),i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructB1=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),e()&&(t[15]+=s)}};m.prototype.constructB2=function(s){var e=this.cpu,i=e.gprs;return function(){e.mmu.waitPrefetch(i[15]),i[15]+=s}};m.prototype.constructBIC=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[s]&~t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructBL1=function(s){var e=this.cpu,i=e.gprs;return function(){e.mmu.waitPrefetch(i[15]),i[14]=i[15]+s}};m.prototype.constructBL2=function(s){var e=this.cpu,i=e.gprs;return function(){e.mmu.waitPrefetch(i[15]);var t=i[15];i[15]=i[14]+(s<<1),i[14]=t-1}};m.prototype.constructBX=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),i.switchExecMode(t[e]&1);var r=0;e==15&&(r=t[e]&2),t[15]=t[e]&4294967294-r}};m.prototype.constructCMN=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=(t[s]>>>0)+(t[e]>>>0);i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=r>4294967295,i.cpsrV=t[s]>>31==t[e]>>31&&t[s]>>31!=r>>31&&t[e]>>31!=r>>31}};m.prototype.constructCMP1=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s]-e;i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=t[s]>>>0>=e,i.cpsrV=t[s]>>31&&(t[s]^r)>>31}};m.prototype.constructCMP2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s],a=t[e],c=r-a,p=c>>31,n=r>>31;i.cpsrN=p,i.cpsrZ=!(c&4294967295),i.cpsrC=r>>>0>=a>>>0,i.cpsrV=n!=a>>31&&n!=p}};m.prototype.constructCMP3=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s]-t[e];i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=t[s]>>>0>=t[e]>>>0,i.cpsrV=(t[s]^t[e])>>31&&(t[s]^r)>>31}};m.prototype.constructEOR=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[s]^t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructLDMIA=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s],a=0,c,p;for(c=1,p=0;p<8;c<<=1,++p)e&c&&(t[p]=i.mmu.load32(r),r+=4,++a);i.mmu.waitMulti32(r,a),1<>31,t.cpsrZ=!(r[s]&4294967295)}};m.prototype.constructLSL2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[e]&255;r&&(r<32?(i.cpsrC=t[s]&1<<32-r,t[s]<<=r):(r>32?i.cpsrC=0:i.cpsrC=t[s]&1,t[s]=0)),i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructLSR1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]),i==0?(t.cpsrC=r[e]>>31,r[s]=0):(t.cpsrC=r[e]&1<>>i),t.cpsrN=0,t.cpsrZ=!(r[s]&4294967295)}};m.prototype.constructLSR2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[e]&255;r&&(r<32?(i.cpsrC=t[s]&1<>>=r):(r>32?i.cpsrC=0:i.cpsrC=t[s]>>31,t[s]=0)),i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructMOV1=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=e,i.cpsrN=e>>31,i.cpsrZ=!(e&4294967295)}};m.prototype.constructMOV2=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=r[e];t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=0,t.cpsrV=0,r[s]=a}};m.prototype.constructMOV3=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[e]}};m.prototype.constructMUL=function(s,e){var i=this.cpu,t=i.gprs;return function(){if(i.mmu.waitPrefetch(t[15]),i.mmu.waitMul(t[e]),t[e]&4294901760&&t[s]&4294901760){var r=(t[s]&4294901760)*t[e]&4294967295,a=(t[s]&65535)*t[e]&4294967295;t[s]=r+a&4294967295}else t[s]*=t[e];i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructMVN=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=~t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructNEG=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=-t[e];i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=0>=r>>>0,i.cpsrV=t[e]>>31&&r>>31,t[s]=r}};m.prototype.constructORR=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),t[s]=t[s]|t[e],i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructPOP=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]),++i.cycles;var r=t[13],a=0,c,p;for(c=1,p=0;p<8;c<<=1,++p)s&c&&(i.mmu.waitSeq32(r),t[p]=i.mmu.load32(r),r+=4,++a);e&&(t[15]=i.mmu.load32(r)&4294967294,r+=4,++a),i.mmu.waitMulti32(r,a),t[13]=r}};m.prototype.constructPUSH=function(s,e){var i=this.cpu,t=i.gprs;return function(){var r=t[13]-4,a=0;i.mmu.waitPrefetch(t[15]),e&&(i.mmu.store32(r,t[14]),r-=4,++a);var c,p;for(c=128,p=7;c;c>>=1,--p)if(s&c){i.mmu.store32(r,t[p]),r-=4,++a;break}for(c>>=1,--p;c;c>>=1,--p)s&c&&(i.mmu.store32(r,t[p]),r-=4,++a);i.mmu.waitMulti32(r,a),t[13]=r+4}};m.prototype.constructROR=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[e]&255;if(r){var a=r&31;a>0?(i.cpsrC=t[s]&1<>>a|t[s]<<32-a):i.cpsrC=t[s]>>31}i.cpsrN=t[s]>>31,i.cpsrZ=!(t[s]&4294967295)}};m.prototype.constructSBC=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=(t[e]>>>0)+(i.cpsrC?0:1),a=(t[s]>>>0)-r;i.cpsrN=a>>31,i.cpsrZ=!(a&4294967295),i.cpsrC=t[s]>>>0>=a>>>0,i.cpsrV=(t[s]^r)>>31&&(t[s]^a)>>31,t[s]=a}};m.prototype.constructSTMIA=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.wait(t[15]);var r=t[s],a=0,c,p;for(c=1,p=0;p<8;c<<=1,++p)if(e&c){i.mmu.store32(r,t[p]),r+=4,++a;break}for(c<<=1,++p;p<8;c<<=1,++p)e&c&&(i.mmu.store32(r,t[p]),r+=4,++a);i.mmu.waitMulti32(r,a),t[s]=r}};m.prototype.constructSTR1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){var a=r[e]+i;t.mmu.store32(a,r[s]),t.mmu.wait(r[15]),t.mmu.wait32(a)}};m.prototype.constructSTR2=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.store32(r[e]+r[i],r[s]),t.mmu.wait(r[15]),t.mmu.wait32(r[e]+r[i])}};m.prototype.constructSTR3=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.store32(t[13]+e,t[s]),i.mmu.wait(t[15]),i.mmu.wait32(t[13]+e)}};m.prototype.constructSTRB1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){var a=r[e]+i;t.mmu.store8(a,r[s]),t.mmu.wait(r[15]),t.mmu.wait(a)}};m.prototype.constructSTRB2=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.store8(r[e]+r[i],r[s]),t.mmu.wait(r[15]),t.mmu.wait(r[e]+r[i])}};m.prototype.constructSTRH1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){var a=r[e]+i;t.mmu.store16(a,r[s]),t.mmu.wait(r[15]),t.mmu.wait(a)}};m.prototype.constructSTRH2=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.store16(r[e]+r[i],r[s]),t.mmu.wait(r[15]),t.mmu.wait(r[e]+r[i])}};m.prototype.constructSUB1=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=r[e]-i;t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=r[e]>>>0>=i,t.cpsrV=r[e]>>31&&(r[e]^a)>>31,r[s]=a}};m.prototype.constructSUB2=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s]-e;i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295),i.cpsrC=t[s]>>>0>=e,i.cpsrV=t[s]>>31&&(t[s]^r)>>31,t[s]=r}};m.prototype.constructSUB3=function(s,e,i){var t=this.cpu,r=t.gprs;return function(){t.mmu.waitPrefetch(r[15]);var a=r[e]-r[i];t.cpsrN=a>>31,t.cpsrZ=!(a&4294967295),t.cpsrC=r[e]>>>0>=r[i]>>>0,t.cpsrV=r[e]>>31!=r[i]>>31&&r[e]>>31!=a>>31,r[s]=a}};m.prototype.constructSWI=function(s){var e=this.cpu,i=e.gprs;return function(){e.irq.swi(s),e.mmu.waitPrefetch(i[15])}};m.prototype.constructTST=function(s,e){var i=this.cpu,t=i.gprs;return function(){i.mmu.waitPrefetch(t[15]);var r=t[s]&t[e];i.cpsrN=r>>31,i.cpsrZ=!(r&4294967295)}};function R(){this.SP=13,this.LR=14,this.PC=15,this.MODE_ARM=0,this.MODE_THUMB=1,this.MODE_USER=16,this.MODE_FIQ=17,this.MODE_IRQ=18,this.MODE_SUPERVISOR=19,this.MODE_ABORT=23,this.MODE_UNDEFINED=27,this.MODE_SYSTEM=31,this.BANK_NONE=0,this.BANK_FIQ=1,this.BANK_IRQ=2,this.BANK_SUPERVISOR=3,this.BANK_ABORT=4,this.BANK_UNDEFINED=5,this.WORD_SIZE_ARM=4,this.WORD_SIZE_THUMB=2,this.BASE_RESET=0,this.BASE_UNDEF=4,this.BASE_SWI=8,this.BASE_PABT=12,this.BASE_DABT=16,this.BASE_IRQ=24,this.BASE_FIQ=28,this.armCompiler=new F(this),this.thumbCompiler=new m(this),this.generateConds(),this.gprs=new Int32Array(16)}R.prototype.resetCPU=function(s){for(var e=0;e<15;++e)this.gprs[e]=0;this.gprs[15]=s+4,this.loadInstruction=this.loadInstructionArm,this.execMode=0,this.instructionWidth=4,this.mode=31,this.cpsrI=!1,this.cpsrF=!1,this.cpsrV=!1,this.cpsrC=!1,this.cpsrZ=!1,this.cpsrN=!1,this.bankedRegisters=[new Int32Array(7),new Int32Array(7),new Int32Array(2),new Int32Array(2),new Int32Array(2),new Int32Array(2)],this.spsr=0,this.bankedSPSRs=new Int32Array(6),this.cycles=0,this.shifterOperand=0,this.shifterCarryOut=0,this.page=null,this.pageId=0,this.pageRegion=-1,this.instruction=null,this.irq.clear();var i=this.gprs,t=this.mmu;this.step=function(){var r=this.instruction||(this.instruction=this.loadInstruction(i[15]-this.instructionWidth));if(i[15]+=this.instructionWidth,this.conditionPassed=!0,r(),!r.writesPC)this.instruction!=null&&((r.next==null||r.next.page.invalid)&&(r.next=this.loadInstruction(i[15]-this.instructionWidth)),this.instruction=r.next);else if(this.conditionPassed){var a=i[15]&=4294967294;this.execMode==0?(t.wait32(a),t.waitPrefetch32(a)):(t.wait(a),t.waitPrefetch(a)),i[15]+=this.instructionWidth,r.fixedJump?this.instruction!=null&&((r.next==null||r.next.page.invalid)&&(r.next=this.loadInstruction(i[15]-this.instructionWidth)),this.instruction=r.next):this.instruction=null}else this.instruction=null;this.irq.updateTimers()}};R.prototype.freeze=function(){return{PC:this.gprs[15]-this.instructionWidth,SP:this.gprs[13],gprs:[this.gprs[0],this.gprs[1],this.gprs[2],this.gprs[3],this.gprs[4],this.gprs[5],this.gprs[6],this.gprs[7],this.gprs[8],this.gprs[9],this.gprs[10],this.gprs[11],this.gprs[12],this.gprs[13],this.gprs[14],this.gprs[15]],mode:this.mode,cpsrI:this.cpsrI,cpsrF:this.cpsrF,cpsrV:this.cpsrV,cpsrC:this.cpsrC,cpsrZ:this.cpsrZ,cpsrN:this.cpsrN,bankedRegisters:[[this.bankedRegisters[0][0],this.bankedRegisters[0][1],this.bankedRegisters[0][2],this.bankedRegisters[0][3],this.bankedRegisters[0][4],this.bankedRegisters[0][5],this.bankedRegisters[0][6]],[this.bankedRegisters[1][0],this.bankedRegisters[1][1],this.bankedRegisters[1][2],this.bankedRegisters[1][3],this.bankedRegisters[1][4],this.bankedRegisters[1][5],this.bankedRegisters[1][6]],[this.bankedRegisters[2][0],this.bankedRegisters[2][1]],[this.bankedRegisters[3][0],this.bankedRegisters[3][1]],[this.bankedRegisters[4][0],this.bankedRegisters[4][1]],[this.bankedRegisters[5][0],this.bankedRegisters[5][1]]],spsr:this.spsr,bankedSPSRs:[this.bankedSPSRs[0],this.bankedSPSRs[1],this.bankedSPSRs[2],this.bankedSPSRs[3],this.bankedSPSRs[4],this.bankedSPSRs[5]],cycles:this.cycles,instructionWidth:this.instructionWidth}};R.prototype.defrost=function(s){this.instruction=null,this.page=null,this.pageId=0,this.pageRegion=-1,this.gprs[0]=s.gprs[0],this.gprs[1]=s.gprs[1],this.gprs[2]=s.gprs[2],this.gprs[3]=s.gprs[3],this.gprs[4]=s.gprs[4],this.gprs[5]=s.gprs[5],this.gprs[6]=s.gprs[6],this.gprs[7]=s.gprs[7],this.gprs[8]=s.gprs[8],this.gprs[9]=s.gprs[9],this.gprs[10]=s.gprs[10],this.gprs[11]=s.gprs[11],this.gprs[12]=s.gprs[12],this.gprs[13]=s.gprs[13],this.gprs[14]=s.gprs[14],this.gprs[15]=s.gprs[15],this.mode=s.mode,this.cpsrI=s.cpsrI,this.cpsrF=s.cpsrF,this.cpsrV=s.cpsrV,this.cpsrC=s.cpsrC,this.cpsrZ=s.cpsrZ,this.cpsrN=s.cpsrN,this.bankedRegisters[0][0]=s.bankedRegisters[0][0],this.bankedRegisters[0][1]=s.bankedRegisters[0][1],this.bankedRegisters[0][2]=s.bankedRegisters[0][2],this.bankedRegisters[0][3]=s.bankedRegisters[0][3],this.bankedRegisters[0][4]=s.bankedRegisters[0][4],this.bankedRegisters[0][5]=s.bankedRegisters[0][5],this.bankedRegisters[0][6]=s.bankedRegisters[0][6],this.bankedRegisters[1][0]=s.bankedRegisters[1][0],this.bankedRegisters[1][1]=s.bankedRegisters[1][1],this.bankedRegisters[1][2]=s.bankedRegisters[1][2],this.bankedRegisters[1][3]=s.bankedRegisters[1][3],this.bankedRegisters[1][4]=s.bankedRegisters[1][4],this.bankedRegisters[1][5]=s.bankedRegisters[1][5],this.bankedRegisters[1][6]=s.bankedRegisters[1][6],this.bankedRegisters[2][0]=s.bankedRegisters[2][0],this.bankedRegisters[2][1]=s.bankedRegisters[2][1],this.bankedRegisters[3][0]=s.bankedRegisters[3][0],this.bankedRegisters[3][1]=s.bankedRegisters[3][1],this.bankedRegisters[4][0]=s.bankedRegisters[4][0],this.bankedRegisters[4][1]=s.bankedRegisters[4][1],this.bankedRegisters[5][0]=s.bankedRegisters[5][0],this.bankedRegisters[5][1]=s.bankedRegisters[5][1],this.spsr=s.spsr,this.bankedSPSRs[0]=s.bankedSPSRs[0],this.bankedSPSRs[1]=s.bankedSPSRs[1],this.bankedSPSRs[2]=s.bankedSPSRs[2],this.bankedSPSRs[3]=s.bankedSPSRs[3],this.bankedSPSRs[4]=s.bankedSPSRs[4],this.bankedSPSRs[5]=s.bankedSPSRs[5],this.cycles=s.cycles,this.instructionWidth=s.instructionWidth,this.loadInstruction=s.instructionWidth==2?this.loadInstructionThumb:this.loadInstructionArm,this.execMode=s.instructionWidth==2?1:0};R.prototype.fetchPage=function(s){var e=this.mmu,i=s>>>e.BASE_OFFSET,t=e.addressToPage(i,s&e.OFFSET_MASK);if(i==this.pageRegion){if(t==this.pageId&&!this.page.invalid)return;this.pageId=t}else this.pageMask=e.memory[i].PAGE_MASK,this.pageRegion=i,this.pageId=t;this.page=e.accessPage(i,t)};R.prototype.loadInstructionArm=function(s){var e=null;this.fetchPage(s);var i=(s&this.pageMask)>>2;if(e=this.page.arm[i],e)return e;var t=this.mmu.load32(s)>>>0;return e=this.compileArm(t),e.next=null,e.page=this.page,e.address=s,e.opcode=t,this.page.arm[i]=e,e};R.prototype.loadInstructionThumb=function(s){var e=null;this.fetchPage(s);var i=(s&this.pageMask)>>1;if(e=this.page.thumb[i],e)return e;var t=this.mmu.load16(s);return e=this.compileThumb(t),e.next=null,e.page=this.page,e.address=s,e.opcode=t,this.page.thumb[i]=e,e};R.prototype.selectBank=function(s){switch(s){case 16:case 31:return 0;case 17:return 1;case 18:return 2;case 19:return 3;case 23:return 4;case 27:return 5;default:throw new y("Invalid user mode "+s+" passed to selectBank")}};R.prototype.switchExecMode=function(s){this.execMode!=s&&(this.execMode=s,s==0?(this.instructionWidth=4,this.loadInstruction=this.loadInstructionArm):(this.instructionWidth=2,this.loadInstruction=this.loadInstructionThumb))};R.prototype.switchMode=function(s){if(s!=this.mode){if(s!=16||s!=31){var e=this.selectBank(s),i=this.selectBank(this.mode);if(e!=i){if(s==17||this.mode==17){var t=i==1?1:0,r=e==1?1:0;this.bankedRegisters[t][2]=this.gprs[8],this.bankedRegisters[t][3]=this.gprs[9],this.bankedRegisters[t][4]=this.gprs[10],this.bankedRegisters[t][5]=this.gprs[11],this.bankedRegisters[t][6]=this.gprs[12],this.gprs[8]=this.bankedRegisters[r][2],this.gprs[9]=this.bankedRegisters[r][3],this.gprs[10]=this.bankedRegisters[r][4],this.gprs[11]=this.bankedRegisters[r][5],this.gprs[12]=this.bankedRegisters[r][6]}this.bankedRegisters[i][0]=this.gprs[13],this.bankedRegisters[i][1]=this.gprs[14],this.gprs[13]=this.bankedRegisters[e][0],this.gprs[14]=this.bankedRegisters[e][1],this.bankedSPSRs[i]=this.spsr,this.spsr=this.bankedSPSRs[e]}}this.mode=s}};R.prototype.packCPSR=function(){return this.mode|this.execMode<<5|this.cpsrF<<6|this.cpsrI<<7|this.cpsrN<<31|this.cpsrZ<<30|this.cpsrC<<29|this.cpsrV<<28};R.prototype.unpackCPSR=function(s){this.switchMode(s&31),this.switchExecMode(!!(s&32)),this.cpsrF=s&64,this.cpsrI=s&128,this.cpsrN=s&2147483648,this.cpsrZ=s&1073741824,this.cpsrC=s&536870912,this.cpsrV=s&268435456,this.irq.testIRQ()};R.prototype.hasSPSR=function(){return this.mode!=31&&this.mode!=16};R.prototype.raiseIRQ=function(){if(!this.cpsrI){var s=this.packCPSR(),e=this.instructionWidth;this.switchMode(18),this.spsr=s,this.gprs[14]=this.gprs[15]-e+4,this.gprs[15]=this.BASE_IRQ+4,this.instruction=null,this.switchExecMode(0),this.cpsrI=!0}};R.prototype.raiseTrap=function(){var s=this.packCPSR(),e=this.instructionWidth;this.switchMode(19),this.spsr=s,this.gprs[14]=this.gprs[15]-e,this.gprs[15]=this.BASE_SWI+4,this.instruction=null,this.switchExecMode(0),this.cpsrI=!0};R.prototype.badOp=function(s){var e=function(){throw new y("Illegal instruction: 0x"+s.toString(16))};return e.writesPC=!0,e.fixedJump=!1,e};R.prototype.generateConds=function(){var s=this;this.conds=[function(){return s.conditionPassed=s.cpsrZ},function(){return s.conditionPassed=!s.cpsrZ},function(){return s.conditionPassed=s.cpsrC},function(){return s.conditionPassed=!s.cpsrC},function(){return s.conditionPassed=s.cpsrN},function(){return s.conditionPassed=!s.cpsrN},function(){return s.conditionPassed=s.cpsrV},function(){return s.conditionPassed=!s.cpsrV},function(){return s.conditionPassed=s.cpsrC&&!s.cpsrZ},function(){return s.conditionPassed=!s.cpsrC||s.cpsrZ},function(){return s.conditionPassed=!s.cpsrN==!s.cpsrV},function(){return s.conditionPassed=!s.cpsrN!=!s.cpsrV},function(){return s.conditionPassed=!s.cpsrZ&&!s.cpsrN==!s.cpsrV},function(){return s.conditionPassed=s.cpsrZ||!s.cpsrN!=!s.cpsrV},null,null]};R.prototype.barrelShiftImmediate=function(s,e,i){var t=this,r=this.gprs,a=this.badOp;switch(s){case 0:e?a=function(){t.shifterOperand=r[i]<>>e,t.shifterCarryOut=r[i]&1<>e,t.shifterCarryOut=r[i]&1<>>e|r[i]<<32-e,t.shifterCarryOut=r[i]&1<>>1,t.shifterCarryOut=r[i]&1};break}return a};R.prototype.compileArm=function(s){var e=this.badOp(s),i=s&234881024,t=this,r=this.gprs,a=this.conds[(s&4026531840)>>>28];if((s&268435440)==19922704){var c=s&15;e=this.armCompiler.constructBX(c,a),e.writesPC=!0,e.fixedJump=!1}else if(!(s&201326592)&&(i==33554432||(s&144)!=144)){var p=s&31457280,n=s&1048576,o=!1;if((p&25165824)==16777216&&!n){var v=s&4194304;if((s&11595776)==2158592){var c=s&15,x=s&255,w=(s&3840)>>7;x=x>>>w|x<<32-w,e=this.armCompiler.constructMSR(c,v,s,x,a),e.writesPC=!1}else if((s&12517376)==983040){var h=(s&61440)>>12;e=this.armCompiler.constructMRS(h,v,a),e.writesPC=h==15}}else{var f=(s&983040)>>16,h=(s&61440)>>12,l=s&96,c=s&15,C=function(){throw new y("BUG: invalid barrel shifter")};if(s&33554432){var x=s&255,V=(s&3840)>>7;V?C=this.armCompiler.constructAddressingMode1ImmediateRotate(x,V):C=this.armCompiler.constructAddressingMode1Immediate(x)}else if(s&16){var P=(s&3840)>>8;switch(o=!0,l){case 0:C=this.armCompiler.constructAddressingMode1LSL(P,c);break;case 32:C=this.armCompiler.constructAddressingMode1LSR(P,c);break;case 64:C=this.armCompiler.constructAddressingMode1ASR(P,c);break;case 96:C=this.armCompiler.constructAddressingMode1ROR(P,c);break}}else{var x=(s&3968)>>7;C=this.barrelShiftImmediate(l,x,c)}switch(p){case 0:n?e=this.armCompiler.constructANDS(h,f,C,a):e=this.armCompiler.constructAND(h,f,C,a);break;case 2097152:n?e=this.armCompiler.constructEORS(h,f,C,a):e=this.armCompiler.constructEOR(h,f,C,a);break;case 4194304:n?e=this.armCompiler.constructSUBS(h,f,C,a):e=this.armCompiler.constructSUB(h,f,C,a);break;case 6291456:n?e=this.armCompiler.constructRSBS(h,f,C,a):e=this.armCompiler.constructRSB(h,f,C,a);break;case 8388608:n?e=this.armCompiler.constructADDS(h,f,C,a):e=this.armCompiler.constructADD(h,f,C,a);break;case 10485760:n?e=this.armCompiler.constructADCS(h,f,C,a):e=this.armCompiler.constructADC(h,f,C,a);break;case 12582912:n?e=this.armCompiler.constructSBCS(h,f,C,a):e=this.armCompiler.constructSBC(h,f,C,a);break;case 14680064:n?e=this.armCompiler.constructRSCS(h,f,C,a):e=this.armCompiler.constructRSC(h,f,C,a);break;case 16777216:e=this.armCompiler.constructTST(h,f,C,a);break;case 18874368:e=this.armCompiler.constructTEQ(h,f,C,a);break;case 20971520:e=this.armCompiler.constructCMP(h,f,C,a);break;case 23068672:e=this.armCompiler.constructCMN(h,f,C,a);break;case 25165824:n?e=this.armCompiler.constructORRS(h,f,C,a):e=this.armCompiler.constructORR(h,f,C,a);break;case 27262976:n?e=this.armCompiler.constructMOVS(h,f,C,a):e=this.armCompiler.constructMOV(h,f,C,a);break;case 29360128:n?e=this.armCompiler.constructBICS(h,f,C,a):e=this.armCompiler.constructBIC(h,f,C,a);break;case 31457280:n?e=this.armCompiler.constructMVNS(h,f,C,a):e=this.armCompiler.constructMVN(h,f,C,a);break}e.writesPC=h==15}}else if((s&263196656)==16777360){var c=s&15,h=s>>12&15,f=s>>16&15;s&4194304?e=this.armCompiler.constructSWPB(h,f,c,a):e=this.armCompiler.constructSWP(h,f,c,a),e.writesPC=h==15}else switch(i){case 0:if((s&16777456)==144){var h=(s&983040)>>16,f=(s&61440)>>12,P=(s&3840)>>8,c=s&15;switch(s&15728640){case 0:e=this.armCompiler.constructMUL(h,P,c,a);break;case 1048576:e=this.armCompiler.constructMULS(h,P,c,a);break;case 2097152:e=this.armCompiler.constructMLA(h,f,P,c,a);break;case 3145728:e=this.armCompiler.constructMLAS(h,f,P,c,a);break;case 8388608:e=this.armCompiler.constructUMULL(h,f,P,c,a);break;case 9437184:e=this.armCompiler.constructUMULLS(h,f,P,c,a);break;case 10485760:e=this.armCompiler.constructUMLAL(h,f,P,c,a);break;case 11534336:e=this.armCompiler.constructUMLALS(h,f,P,c,a);break;case 12582912:e=this.armCompiler.constructSMULL(h,f,P,c,a);break;case 13631488:e=this.armCompiler.constructSMULLS(h,f,P,c,a);break;case 14680064:e=this.armCompiler.constructSMLAL(h,f,P,c,a);break;case 15728640:e=this.armCompiler.constructSMLALS(h,f,P,c,a);break}e.writesPC=h==15}else{var T=s&1048576,h=(s&61440)>>12,cr=(s&3840)>>4,ur=c=s&15,H=s&32,n=s&64,k=s&2097152,i=s&4194304,d;if(i){var x=ur|cr;d=this.armCompiler.constructAddressingMode23Immediate(s,x,a)}else d=this.armCompiler.constructAddressingMode23Register(s,c,a);d.writesPC=!!k&&f==15,(s&144)==144&&(T?H?n?e=this.armCompiler.constructLDRSH(h,d,a):e=this.armCompiler.constructLDRH(h,d,a):n&&(e=this.armCompiler.constructLDRSB(h,d,a)):!n&&H&&(e=this.armCompiler.constructSTRH(h,d,a))),e.writesPC=h==15||d.writesPC}break;case 67108864:case 100663296:var h=(s&61440)>>12,T=s&1048576,W=s&4194304,i=s&33554432,d=function(){throw new y("Unimplemented memory access: 0x"+s.toString(16))};if(~s&16777216&&(s&=4292870143),i){var c=s&15,l=s&96,K=(s&3968)>>7;l||K?(C=this.barrelShiftImmediate(l,K,c),d=this.armCompiler.constructAddressingMode2RegisterShifted(s,C,a)):d=this.armCompiler.constructAddressingMode23Register(s,c,a)}else{var M=s&4095;d=this.armCompiler.constructAddressingMode23Immediate(s,M,a)}T?W?e=this.armCompiler.constructLDRB(h,d,a):e=this.armCompiler.constructLDR(h,d,a):W?e=this.armCompiler.constructSTRB(h,d,a):e=this.armCompiler.constructSTR(h,d,a),e.writesPC=T&&(h==15||d.writesPC);break;case 134217728:var T=s&1048576,k=s&2097152,Q=s&4194304,pr=s&8388608,G=s&16777216,P=s&65535,f=(s&983040)>>16,d,x=0,M=0,B=!1;if(pr){G&&(x=4);for(var A=1,i=0;i<16;A<<=1,++i)P&A&&(k&&i==f&&!M&&(P&=~A,x+=4,B=!0),M+=4)}else{G||(x=4);for(var A=1,i=0;i<16;A<<=1,++i)P&A&&(k&&i==f&&!M&&(P&=~A,x+=4,B=!0),x-=4,M-=4)}k?d=this.armCompiler.constructAddressingMode4Writeback(x,M,f,B):d=this.armCompiler.constructAddressingMode4(x,f),T?(Q?e=this.armCompiler.constructLDMS(P,d,a):e=this.armCompiler.constructLDM(P,d,a),e.writesPC=!!(P&1<<15)):(Q?e=this.armCompiler.constructSTMS(P,d,a):e=this.armCompiler.constructSTM(P,d,a),e.writesPC=!1);break;case 167772160:var x=s&16777215;x&8388608&&(x|=4278190080),x<<=2;var nr=s&16777216;nr?e=this.armCompiler.constructBL(x,a):e=this.armCompiler.constructB(x,a),e.writesPC=!0,e.fixedJump=!0;break;case 201326592:break;case 234881024:if((s&251658240)==251658240){var x=s&16777215;e=this.armCompiler.constructSWI(x,a),e.writesPC=!1}break;default:throw new y("Bad opcode: 0x"+s.toString(16))}return e.execMode=0,e.fixedJump=e.fixedJump||!1,e};R.prototype.compileThumb=function(s){var e=this.badOp(s&65535),i=this,t=this.gprs;if((s&64512)==16384){var r=(s&56)>>3,a=s&7;switch(s&960){case 0:e=this.thumbCompiler.constructAND(a,r);break;case 64:e=this.thumbCompiler.constructEOR(a,r);break;case 128:e=this.thumbCompiler.constructLSL2(a,r);break;case 192:e=this.thumbCompiler.constructLSR2(a,r);break;case 256:e=this.thumbCompiler.constructASR2(a,r);break;case 320:e=this.thumbCompiler.constructADC(a,r);break;case 384:e=this.thumbCompiler.constructSBC(a,r);break;case 448:e=this.thumbCompiler.constructROR(a,r);break;case 512:e=this.thumbCompiler.constructTST(a,r);break;case 576:e=this.thumbCompiler.constructNEG(a,r);break;case 640:e=this.thumbCompiler.constructCMP2(a,r);break;case 704:e=this.thumbCompiler.constructCMN(a,r);break;case 768:e=this.thumbCompiler.constructORR(a,r);break;case 832:e=this.thumbCompiler.constructMUL(a,r);break;case 896:e=this.thumbCompiler.constructBIC(a,r);break;case 960:e=this.thumbCompiler.constructMVN(a,r);break}e.writesPC=!1}else if((s&64512)==17408){var r=(s&120)>>3,c=s&7,p=s&128,a=c|p>>4;switch(s&768){case 0:e=this.thumbCompiler.constructADD4(a,r),e.writesPC=a==15;break;case 256:e=this.thumbCompiler.constructCMP3(a,r),e.writesPC=!1;break;case 512:e=this.thumbCompiler.constructMOV3(a,r),e.writesPC=a==15;break;case 768:e=this.thumbCompiler.constructBX(a,r),e.writesPC=!0,e.fixedJump=!1;break}}else if((s&63488)==6144){var r=(s&448)>>6,c=(s&56)>>3,a=s&7;switch(s&1536){case 0:e=this.thumbCompiler.constructADD3(a,c,r);break;case 512:e=this.thumbCompiler.constructSUB3(a,c,r);break;case 1024:var n=(s&448)>>6;n?e=this.thumbCompiler.constructADD1(a,c,n):e=this.thumbCompiler.constructMOV2(a,c,r);break;case 1536:var n=(s&448)>>6;e=this.thumbCompiler.constructSUB1(a,c,n);break}e.writesPC=!1}else if(s&57344)if((s&57344)==8192){var n=s&255,c=(s&1792)>>8;switch(s&6144){case 0:e=this.thumbCompiler.constructMOV1(c,n);break;case 2048:e=this.thumbCompiler.constructCMP1(c,n);break;case 4096:e=this.thumbCompiler.constructADD2(c,n);break;case 6144:e=this.thumbCompiler.constructSUB2(c,n);break}e.writesPC=!1}else if((s&63488)==18432){var a=(s&1792)>>8,n=(s&255)<<2;e=this.thumbCompiler.constructLDR3(a,n),e.writesPC=!1}else if((s&61440)==20480){var a=s&7,c=(s&56)>>3,r=(s&448)>>6,o=s&3584;switch(o){case 0:e=this.thumbCompiler.constructSTR2(a,c,r);break;case 512:e=this.thumbCompiler.constructSTRH2(a,c,r);break;case 1024:e=this.thumbCompiler.constructSTRB2(a,c,r);break;case 1536:e=this.thumbCompiler.constructLDRSB(a,c,r);break;case 2048:e=this.thumbCompiler.constructLDR2(a,c,r);break;case 2560:e=this.thumbCompiler.constructLDRH2(a,c,r);break;case 3072:e=this.thumbCompiler.constructLDRB2(a,c,r);break;case 3584:e=this.thumbCompiler.constructLDRSH(a,c,r);break}e.writesPC=!1}else if((s&57344)==24576){var a=s&7,c=(s&56)>>3,n=(s&1984)>>4,v=s&4096;v&&(n>>=2);var x=s&2048;x?v?e=this.thumbCompiler.constructLDRB1(a,c,n):e=this.thumbCompiler.constructLDR1(a,c,n):v?e=this.thumbCompiler.constructSTRB1(a,c,n):e=this.thumbCompiler.constructSTR1(a,c,n),e.writesPC=!1}else if((s&62976)==46080){var w=!!(s&256),h=s&255;s&2048?(e=this.thumbCompiler.constructPOP(h,w),e.writesPC=w,e.fixedJump=!1):(e=this.thumbCompiler.constructPUSH(h,w),e.writesPC=!1)}else if(s&32768)switch(s&28672){case 0:var a=s&7,c=(s&56)>>3,n=(s&1984)>>5;s&2048?e=this.thumbCompiler.constructLDRH1(a,c,n):e=this.thumbCompiler.constructSTRH1(a,c,n),e.writesPC=!1;break;case 4096:var a=(s&1792)>>8,n=(s&255)<<2,x=s&2048;x?e=this.thumbCompiler.constructLDR4(a,n):e=this.thumbCompiler.constructSTR3(a,n),e.writesPC=!1;break;case 8192:var a=(s&1792)>>8,n=(s&255)<<2;s&2048?e=this.thumbCompiler.constructADD6(a,n):e=this.thumbCompiler.constructADD5(a,n),e.writesPC=!1;break;case 12288:if(!(s&3840)){var v=s&128,n=(s&127)<<2;v&&(n=-n),e=this.thumbCompiler.constructADD7(n),e.writesPC=!1}break;case 16384:var c=(s&1792)>>8,h=s&255;s&2048?e=this.thumbCompiler.constructLDMIA(c,h):e=this.thumbCompiler.constructSTMIA(c,h),e.writesPC=!1;break;case 20480:var f=(s&3840)>>8,n=s&255;if(f==15)e=this.thumbCompiler.constructSWI(n),e.writesPC=!1;else{s&128&&(n|=4294967040),n<<=1;var l=this.conds[f];e=this.thumbCompiler.constructB1(n,l),e.writesPC=!0,e.fixedJump=!0}break;case 24576:case 28672:var n=s&2047,C=s&6144;switch(C){case 0:n&1024&&(n|=4294965248),n<<=1,e=this.thumbCompiler.constructB2(n),e.writesPC=!0,e.fixedJump=!0;break;case 2048:break;case 4096:n&1024&&(n|=4294966272),n<<=12,e=this.thumbCompiler.constructBL1(n),e.writesPC=!1;break;case 6144:e=this.thumbCompiler.constructBL2(n),e.writesPC=!0,e.fixedJump=!1;break}break;default:throw new y("Undefined instruction: 0x"+s.toString(16))}else throw new y("Bad opcode: 0x"+s.toString(16));else{var a=s&7,r=(s&56)>>3,n=(s&1984)>>6;switch(s&6144){case 0:e=this.thumbCompiler.constructLSL1(a,r,n);break;case 2048:e=this.thumbCompiler.constructLSR1(a,r,n);break;case 4096:e=this.thumbCompiler.constructASR1(a,r,n);break;case 6144:break}e.writesPC=!1}return e.execMode=1,e.fixedJump=e.fixedJump||!1,e};var U=class{constructor(){this.BASE_OFFSET=24;this.OFFSET_MASK=16777215;this.core=new R,this.core.irq=this,this.core.mmu=this,this.resetMemory()}resetMemory(){this.memory=[];for(var e=0;e<256;e++){var i=10,t=524288;this.memory[e]={PAGE_MASK:(2<0?e:1}getPC(){return this.core.gprs[15]-this.core.instructionWidth}getSP(){return this.core.gprs[13]}isStable(){return!0}connectMemoryBus(e){this.bus=e}reset(){this.resetMemory(),this.core.resetCPU(0)}saveState(){return this.core.freeze()}loadState(e){this.core.defrost(e)}load8(e){return this.bus.read(e)<<24>>24}loadU8(e){return this.bus.read(e)&255}load16(e){return this.loadU16(e)<<16>>16}loadU16(e){return this.bus.read(e)|this.bus.read(e+1)<<8}load32(e){var i=this.bus.read(e)|this.bus.read(e+1)<<8|this.bus.read(e+2)<<16|this.bus.read(e+3)<<24;return i}store8(e,i){this.bus.write(e,i&255)}store16(e,i){this.bus.write(e,i&255),this.bus.write(e+1,i>>8&255)}store32(e,i){this.bus.write(e,i&255),this.bus.write(e+1,i>>8&255),this.bus.write(e+2,i>>16&255),this.bus.write(e+3,i>>24&255)}wait(e){++this.core.cycles}wait32(e){++this.core.cycles}waitSeq32(e){++this.core.cycles}waitMul(e){(e&4294967040)==4294967040||!(e&4294967040)?this.core.cycles+=1:(e&4294901760)==4294901760||!(e&4294901760)?this.core.cycles+=2:(e&4278190080)==4278190080||!(e&4278190080)?this.core.cycles+=3:this.core.cycles+=4}waitMulti32(e,i){this.core.cycles+=2}waitPrefetch(e){++this.core.cycles}waitPrefetch32(e){++this.core.cycles}addressToPage(e,i){return i>>this.memory[e].ICACHE_PAGE_BITS}accessPage(e,i){var t=this.memory[e],r=t.icache[i];return(!r||r.invalid)&&(r={thumb:new Array(1<>16)}clear(){}updateTimers(){}testIRQ(){}isThumb(){return this.core.instructionWidth==2}};var Fr=X([[S.A,0,1],[S.B,0,2],[S.GP_A,0,1],[S.GP_B,0,2],[S.SELECT,0,4],[S.START,0,8],[S.RIGHT,0,16],[S.LEFT,0,32],[S.UP,0,64],[S.DOWN,0,128]]),er=0,tr=524288,I=33554432,D=524288,O=67108864,_=256,hr=1e6,sr=4e6,Z=class extends q{constructor(){super();this.cpuFrequency=sr;this.canvasWidth=160;this.numTotalScanlines=256;this.numVisibleScanlines=128;this.cpuCyclesPerLine=Math.floor(sr/(256*60));this.defaultROMSize=512*1024;this.sampleRate=1;this.cpu=new U;this.ram=new Uint8Array(96*1024);this.ram16=new Uint16Array(this.ram.buffer);this.vidbase=0;this.brightness=255;this.read=L([[er,er+tr-1,tr-1,e=>this.rom?this.rom[e]:0],[I,I+D-1,D-1,e=>this.ram[e]],[O,O+_-1,_-1,(e,i)=>this.readIO(e)],[0,(1<<31)-1,0,(e,i)=>{throw new y(`Address read out of bounds: 0x${E(e)}`)}]]);this.write=L([[I,I+D-1,D-1,(e,i)=>{this.ram[e]=i}],[O,O+_-1,_-1,(e,i)=>{this.writeIO(e,i)}]]);this.connectCPUMemoryBus(this),this.handler=z(this.inputs,Fr)}connectVideo(e){super.connectVideo(e),this.pixels32=e,this.pixels8=new Uint8Array(e.buffer)}connectSerialIO(e){this.serial=e}reset(){super.reset(),this.serialOut=[],this.serialIn=[]}readIO(e){switch(e){case 0:return this.inputs[0];case 64:return(this.serial.byteAvailable()?128:0)|(this.serial.clearToSend()?64:0);case 68:let i=this.serialIn.shift();return i!=null?(this.serialOut.push(i),i.value):0;default:return 0}}writeIO(e,i){switch(e){case 0:break;case 72:this.serialOut.length>1&1048575,t=this.brightness<<24,r=0;r>5&31)<<11|(a>>10&31)<<19}}getDebugCategories(){return["CPU","Stack"]}getDebugInfo(e,i){switch(e){case"CPU":var t="",r=i.c;let c={2:"Thumb",4:"ARM"},p={15:"PC",14:"LR",13:"SP",12:"IP",11:"FP",9:"SB"};for(var a=0;a<16;a++)t+=N(p[a]||"",3)+N("r"+a,5)+" "+E(r.gprs[a],8)+` `;return t+="Flags ",t+=r.cpsrN?" N":" -",t+=r.cpsrV?" V":" -",t+=r.cpsrF?" F":" -",t+=r.cpsrZ?" Z":" -",t+=r.cpsrC?" C":" -",t+=r.cpsrI?" I":" -",t+=` `,t+="MODE "+c[r.instructionWidth]+" "+mr[r.mode]+` `,t+="SPSR "+E(r.spsr,8)+` `,t+="cycl "+r.cycles+` `,t}}saveState(){var e=super.saveState();return e.serial={sin:this.serialIn.slice(0),sout:this.serialOut.slice(0)},e}loadState(e){super.loadState(e),this.serialIn=e.serial.sin,this.serialOut=e.serial.sout}},mr={16:"USER",17:"FIQ",18:"IRQ",19:"SUPERVISOR",23:"ABORT",27:"UNDEFINED",31:"SYSTEM"};var fr=[{id:"vidfill.vasm",name:"Video Memory Fill"}];var Wr=512*1024;var Kr=512*1024;var ir=class extends j{getToolForFilename(e){return e.endsWith(".vasm")?"vasmarm":e.endsWith(".armips")?"armips":"vasmarm"}getPresets(){return fr}getDefaultExtension(){return".vasm"}},ar=class extends ir{constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"ROM",start:0,size:524288,type:"rom"},{name:"RAM",start:33554432,size:524288,type:"ram"},{name:"I/O",start:67108864,size:256,type:"io"}]}}}async start(){super.start(),console.log("Loading Capstone"),await J("./lib/capstone-arm.min.js"),this.capstone_arm=new cs.Capstone(cs.ARCH_ARM,cs.MODE_ARM),this.capstone_thumb=new cs.Capstone(cs.ARCH_ARM,cs.MODE_THUMB)}newMachine(){return new Z}readAddress(e){return this.machine.read(e)}disassemble(e,i){for(var t=this.machine.cpu.isThumb(),r=t?this.capstone_thumb:this.capstone_arm,a=[],c=0;c<4;c++)a[c]=i(e+c);var p=r.disasm(a,e,4),n=p&&p[0];return n?{nbytes:n.size,line:n.mnemonic+" "+n.op_str,isaddr:n.address>0}:{nbytes:4,line:"???",isaddr:!1}}};Y.arm32=ar;export{ir as BaseARMMachinePlatform}; -//# sourceMappingURL=arm32-TREQBG5P.js.map +//# sourceMappingURL=arm32-MYWZWAMY.js.map diff --git a/gen/arm32-TREQBG5P.js.map b/gen/arm32-MYWZWAMY.js.map similarity index 100% rename from gen/arm32-TREQBG5P.js.map rename to gen/arm32-MYWZWAMY.js.map diff --git a/gen/astrocade-HTRRXIK3.js b/gen/astrocade-7HVAI6PI.js similarity index 98% rename from gen/astrocade-HTRRXIK3.js rename to gen/astrocade-7HVAI6PI.js index 95f57d52..209a8ef7 100644 --- a/gen/astrocade-HTRRXIK3.js +++ b/gen/astrocade-7HVAI6PI.js @@ -1,4 +1,4 @@ -import{J as d0,c as t0,d as r0,e as i0,k as s0,q as n0}from"./chunk-GKVIY6GD.js";import{H as y,T as A,U as F0,W as A0,Y as Z,Z as S,g as o,k as $,l as x0,s as e0}from"./chunk-YL2YTMD7.js";import"./chunk-RQFURXHW.js";var C0=A0([[A.UP,16,1],[A.DOWN,16,2],[A.LEFT,16,4],[A.RIGHT,16,8],[A.A,16,16],[A.P2_UP,17,1],[A.P2_DOWN,17,2],[A.P2_LEFT,17,4],[A.P2_RIGHT,17,8],[A.P2_A,17,16],[A.VK_P,20,1],[A.VK_SLASH,20,2],[A.VK_X,20,4],[A.VK_MINUS,20,8],[A.VK_COMMA,20,16],[A.VK_EQUALS,20,32],[A.VK_O,21,1],[A.VK_L,21,2],[A.VK_9,21,4],[A.VK_6,21,8],[A.VK_3,21,16],[A.VK_PERIOD,21,32],[A.VK_I,22,1],[A.VK_K,22,2],[A.VK_8,22,4],[A.VK_5,22,8],[A.VK_2,22,16],[A.VK_0,22,32],[A.VK_U,23,1],[A.VK_J,23,2],[A.VK_7,23,4],[A.VK_4,23,8],[A.VK_1,23,16],[A.VK_BACK_SLASH,23,32]]),a0=2,m0=function(d){var F,r,B,C,b,O,L,U;let V=d?320:160,N=d?204:102,z=V>>2,h0=256,u0=4293848814,Y0=4278190080;var I=new Uint8Array(32),a=0,m=0,c=!1,l=0,D=0,E=0,Q=0,h=0,u=N,P=new Uint32Array(8),G=new Uint8Array(8),k=0,K=new Uint8Array(d?262:131),b0=!1,g=new Uint8Array(4),X=0,Y=0,j=0;function R(x,e){r[x]=e,j++,K[(x&4095)/z|0]=1}function g0(x,e){for(var s=x*4+3,f=0;f<4;f++){var w=x%z>=(D&63)?0:4;L[s--]=P[w+(e&3)],e>>=2}}function _(x){for(var e=x*V/4,s=0;s>=4);for(var f=0;f<4;f++){var w=e&1?m>>2&3:m&3;s|=w<>=1}e=s,c=!c}if(a&4){if(X&4){var n=2*(~X&3);e=(g[3]>>n&3)<<6|(g[2]>>n&3)<<4|(g[1]>>n&3)<<2|(g[0]>>n&3)<<0}else g[X&3]=e;X++}else{var n=(a&3)<<1,s=e>>n|l;l=e<<8-n&255,e=s}if(a&64&&(e=(e&3)<<6|(e&12)<<2|(e&48)>>2|(e&192)>>6),a&48){var t=r[x],i=0;t&192&&e&192&&(i|=1),t&48&&e&48&&(i|=2),t&12&&e&12&&(i|=4),t&3&&e&3&&(i|=8),a&16&&(e|=t),a&32&&(e^=t),Y=Y&240|i|i<<4}R(x,e)}function W(x,e){G[x&7]=e&255,P[x&7]=J[e&255],H()}function X0(){var x=D>>6}function H(){k=N}this.drawScanline=x=>{x==Q&&E&8&&(F.retryInterrupts=!(E&4),this.probe&&this.probe.logInterrupt(h),F.interrupt(h)),x0?(K[x]=0,_(x),k--):K[x]&&(K[x]=0,_(x))},this.init=(x,e,s,f,w)=>{F=e,r=s,I=f,U=w,O=Z(new $().decode(x0(atob(l0))),8192),d?B={read:S([[16384,32767,16383,function(t){return r[t]}],[53248,57343,4095,function(t){return r[t+16384]}],[0,45055,65535,function(t){return b?b[t]:0}]]),write:S([[16384,32767,16383,R],[53248,57343,4095,function(t,i){R(t+16384,i)}],[0,16383,16383,q]])}:B={read:S([[0,8191,8191,function(t){return O[t]}],[8192,16383,8191,function(t){return b?b[t]:0}],[16384,20479,4095,function(t){return j++,r[t]}]]),write:S([[16384,20479,4095,R],[0,16383,4095,q]])},C={read:function(t){t&=31;var i;switch(t){case 8:i=Y,Y=0;break;default:i=I[t];break}return i},write:function(t,i){switch(t&=31,i&=255,t){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:W(t,i);break;case 9:D=i,X0(),H();break;case 10:u=d?i:i>>1,H();break;case 11:var p=F.saveState();W((p.BC>>8)-1,B.read(p.HL));break;case 12:a=i,l=0,X=0,c=!1;break;case 13:h=i;break;case 14:E=i;break;case 15:Q=d?i:i>>1;break;case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:U.setACRegister(t,i);break;case 24:var p=F.saveState();U.setACRegister((p.BC>>8)-1,B.read(p.HL));break;case 25:m=i;break;default:console.log("IO write",o(t,4),o(i,2));break}}},x.connectCPUMemoryBus(B),x.connectCPUIOBus(C),this.membus=B,this.iobus=C;for(var n=0;n<8;n++)W(n,n)},this.resetWaitStates=function(x){var e=x{F.loadState(x.c),r.set(x.ram),P.set(x.palette),G.set(x.palinds),a=x.magicop,m=x.xpand,c=x.xplower,l=x.shift2,D=x.horcb,E=x.inmod,Q=x.inlin,h=x.infbk,u=x.verbl,X=x.rotcount,g.set(x.rotdata),Y=x.intst,I.set(x.inputs),H()},this.saveState=()=>({c:F.saveState(),ram:r.slice(0),inputs:I.slice(0),palette:P.slice(0),palinds:G.slice(0),magicop:a,xpand:m,xplower:c,shift2:l,horcb:D,inmod:E,inlin:Q,infbk:h,verbl:u,rotcount:X,rotdata:g.slice(0),intst:Y}),this.reset=()=>{a=m=E=Q=h=l=D=0,u=N,c=!1},this.toLongString=x=>{var e="";e+=` +import{J as d0,c as t0,d as r0,e as i0,k as s0,q as n0}from"./chunk-6UU4KLMR.js";import{H as y,T as A,U as F0,W as A0,Y as Z,Z as S,g as o,k as $,l as x0,s as e0}from"./chunk-7LTJUW24.js";import"./chunk-RQFURXHW.js";var C0=A0([[A.UP,16,1],[A.DOWN,16,2],[A.LEFT,16,4],[A.RIGHT,16,8],[A.A,16,16],[A.P2_UP,17,1],[A.P2_DOWN,17,2],[A.P2_LEFT,17,4],[A.P2_RIGHT,17,8],[A.P2_A,17,16],[A.VK_P,20,1],[A.VK_SLASH,20,2],[A.VK_X,20,4],[A.VK_MINUS,20,8],[A.VK_COMMA,20,16],[A.VK_EQUALS,20,32],[A.VK_O,21,1],[A.VK_L,21,2],[A.VK_9,21,4],[A.VK_6,21,8],[A.VK_3,21,16],[A.VK_PERIOD,21,32],[A.VK_I,22,1],[A.VK_K,22,2],[A.VK_8,22,4],[A.VK_5,22,8],[A.VK_2,22,16],[A.VK_0,22,32],[A.VK_U,23,1],[A.VK_J,23,2],[A.VK_7,23,4],[A.VK_4,23,8],[A.VK_1,23,16],[A.VK_BACK_SLASH,23,32]]),a0=2,m0=function(d){var F,r,B,C,b,O,L,U;let V=d?320:160,N=d?204:102,z=V>>2,h0=256,u0=4293848814,Y0=4278190080;var I=new Uint8Array(32),a=0,m=0,c=!1,l=0,D=0,E=0,Q=0,h=0,u=N,P=new Uint32Array(8),G=new Uint8Array(8),k=0,K=new Uint8Array(d?262:131),b0=!1,g=new Uint8Array(4),X=0,Y=0,j=0;function R(x,e){r[x]=e,j++,K[(x&4095)/z|0]=1}function g0(x,e){for(var s=x*4+3,f=0;f<4;f++){var w=x%z>=(D&63)?0:4;L[s--]=P[w+(e&3)],e>>=2}}function _(x){for(var e=x*V/4,s=0;s>=4);for(var f=0;f<4;f++){var w=e&1?m>>2&3:m&3;s|=w<>=1}e=s,c=!c}if(a&4){if(X&4){var n=2*(~X&3);e=(g[3]>>n&3)<<6|(g[2]>>n&3)<<4|(g[1]>>n&3)<<2|(g[0]>>n&3)<<0}else g[X&3]=e;X++}else{var n=(a&3)<<1,s=e>>n|l;l=e<<8-n&255,e=s}if(a&64&&(e=(e&3)<<6|(e&12)<<2|(e&48)>>2|(e&192)>>6),a&48){var t=r[x],i=0;t&192&&e&192&&(i|=1),t&48&&e&48&&(i|=2),t&12&&e&12&&(i|=4),t&3&&e&3&&(i|=8),a&16&&(e|=t),a&32&&(e^=t),Y=Y&240|i|i<<4}R(x,e)}function W(x,e){G[x&7]=e&255,P[x&7]=J[e&255],H()}function X0(){var x=D>>6}function H(){k=N}this.drawScanline=x=>{x==Q&&E&8&&(F.retryInterrupts=!(E&4),this.probe&&this.probe.logInterrupt(h),F.interrupt(h)),x0?(K[x]=0,_(x),k--):K[x]&&(K[x]=0,_(x))},this.init=(x,e,s,f,w)=>{F=e,r=s,I=f,U=w,O=Z(new $().decode(x0(atob(l0))),8192),d?B={read:S([[16384,32767,16383,function(t){return r[t]}],[53248,57343,4095,function(t){return r[t+16384]}],[0,45055,65535,function(t){return b?b[t]:0}]]),write:S([[16384,32767,16383,R],[53248,57343,4095,function(t,i){R(t+16384,i)}],[0,16383,16383,q]])}:B={read:S([[0,8191,8191,function(t){return O[t]}],[8192,16383,8191,function(t){return b?b[t]:0}],[16384,20479,4095,function(t){return j++,r[t]}]]),write:S([[16384,20479,4095,R],[0,16383,4095,q]])},C={read:function(t){t&=31;var i;switch(t){case 8:i=Y,Y=0;break;default:i=I[t];break}return i},write:function(t,i){switch(t&=31,i&=255,t){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:W(t,i);break;case 9:D=i,X0(),H();break;case 10:u=d?i:i>>1,H();break;case 11:var p=F.saveState();W((p.BC>>8)-1,B.read(p.HL));break;case 12:a=i,l=0,X=0,c=!1;break;case 13:h=i;break;case 14:E=i;break;case 15:Q=d?i:i>>1;break;case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:U.setACRegister(t,i);break;case 24:var p=F.saveState();U.setACRegister((p.BC>>8)-1,B.read(p.HL));break;case 25:m=i;break;default:console.log("IO write",o(t,4),o(i,2));break}}},x.connectCPUMemoryBus(B),x.connectCPUIOBus(C),this.membus=B,this.iobus=C;for(var n=0;n<8;n++)W(n,n)},this.resetWaitStates=function(x){var e=x{F.loadState(x.c),r.set(x.ram),P.set(x.palette),G.set(x.palinds),a=x.magicop,m=x.xpand,c=x.xplower,l=x.shift2,D=x.horcb,E=x.inmod,Q=x.inlin,h=x.infbk,u=x.verbl,X=x.rotcount,g.set(x.rotdata),Y=x.intst,I.set(x.inputs),H()},this.saveState=()=>({c:F.saveState(),ram:r.slice(0),inputs:I.slice(0),palette:P.slice(0),palinds:G.slice(0),magicop:a,xpand:m,xplower:c,shift2:l,horcb:D,inmod:E,inlin:Q,infbk:h,verbl:u,rotcount:X,rotdata:g.slice(0),intst:Y}),this.reset=()=>{a=m=E=Q=h=l=D=0,u=N,c=!1},this.toLongString=x=>{var e="";e+=` INLIN: `+x.inlin,e+=` VERBL: `+x.verbl,e+=` MAGICOP: $`+o(x.magicop),e+=` @@ -11,4 +11,4 @@ XPLOWER: `+x.xplower,e+=` INTST: $`+o(x.intst),e+=` Palette: `;for(var s=0;s<8;s++)e+=o(G[s]);return e+=` `,e},this.connectVideo=function(x){L=x},this.loadROM=function(x){b=x},this.loadBIOS=function(x){O=x},this.getVisiblePixelWords=function(){return u*V}},T=class extends n0{constructor(F){super();this.cpuFrequency=1789e3;this.numTotalScanlines=262;this.sampleRate=60*262*a0;this.cpu=new t0,this.psg=new o0(new r0),this.audioadapter=new s0(this.psg.psg,a0,this.sampleRate),this.handler=F0(this.inputs,C0),this.defaultROMSize=F?45056:8192,this.ram=new Uint8Array(F?20480:4096),this.numVisibleScanlines=F?204:102,this.canvasWidth=F?320:160,this.cpuCyclesPerLine=this.cpuFrequency/(60*this.numVisibleScanlines*1.286)|0,this.m=new m0(F),this.m.init(this,this.cpu,this.ram,this.inputs,this.psg)}read(F){return this.m.membus.read(F)}write(F,r){this.m.membus.write(F,r)}connectVideo(F){super.connectVideo(F),this.frontbuffer=F,this.backbuffer=new Uint32Array(F.length),this.m.connectVideo(this.backbuffer)}preFrame(){this.m.resetWaitStates(0)}postFrame(){var F=this.m.getVisiblePixelWords();this.frontbuffer.set(this.backbuffer.slice(0,F),0),this.frontbuffer.fill(0,F)}setPaddleInput(F,r){switch(F){case 0:this.inputs[28]=r&255;break;case 1:this.inputs[29]=r&255;break}}startScanline(){this.audio&&this.audioadapter.generate(this.audio)}drawScanline(){var F=this.scanline;this.m.drawScanline(F)}advanceCPU(){var F=super.advanceCPU(),r=this.m.resetWaitStates(this.scanline);return r&&(F+=r,this.probe.logClocks(r)),F}loadROM(F){super.loadROM(F),this.m.loadROM(this.rom),this.reset()}loadBIOS(F){this.m.loadBIOS(Z(F,8192)),this.reset()}reset(){super.reset(),this.m.reset()}loadState(F){this.m.loadState(F)}saveState(){return this.m.saveState()}getDebugCategories(){return["CPU","Stack","Astro"]}getDebugInfo(F,r){switch(F){case"Astro":return this.m.toLongString(r)}}},o0=class extends i0{setACRegister(F,r){switch(F&=7,r&=255,F){case 0:this.psg.setClock(1789e3*16/(r+1)),this.psg.writeRegisterAY(7,7^255);break;case 1:case 2:case 3:var B=(F-1)*2,C=r*2+1;this.psg.writeRegisterAY(B,C&255),this.psg.writeRegisterAY(B+1,C>>8&255);break;case 5:this.psg.writeRegisterAY(10,r&15);break;case 6:this.psg.writeRegisterAY(8,r&15),this.psg.writeRegisterAY(9,r>>4&15);break}}};var J=[0,2368548,4737096,7171437,9539985,11974326,14342874,16777215,2425019,4784352,7213567,9582079,12016383,14384895,16753663,16762879,4784304,7143637,9568761,11937279,14306047,16740095,16749311,16758783,6946975,9306307,11731175,14096639,16465151,16736767,16745983,16755199,8847495,11206827,13631696,15994612,16724735,16733951,16743423,16752639,10420330,12779662,15138995,16713687,16723195,16732415,16741631,16751103,11534409,13959277,16318610,16713142,16722394,16731647,16741119,16750335,12255269,14680137,16711790,16713362,16722615,16732123,16741375,16750847,12517376,14876708,16711752,16714605,16724113,16733366,16742874,16752127,12255232,14680064,16711715,16716871,16726380,16735632,16745141,16754393,11534336,13959168,16318464,16720164,16729416,16738924,16748177,16757685,10420224,12779520,15141888,16723971,16733479,16742731,16752240,16761492,8847360,11206656,13639168,16007680,16738058,16747310,16756563,16766071,6946816,9309440,11743488,14112256,16480768,16752151,16761659,16770911,4784128,7151872,9585920,11954688,14323200,16757509,16766761,16776270,2429184,4797696,7232e3,9600512,12034816,14403328,16771870,16777027,9472,2377984,4746496,7180800,9549312,11983616,14352155,16777023,14080,23296,2326528,4695040,7129344,9497856,11927326,14286659,18176,27648,36864,2405376,4774144,7142661,9568041,11927374,21760,30976,40192,246272,2614784,4980503,7405371,9764703,24320,33536,43008,52224,716810,3079982,5504851,7864183,25856,35328,44544,53763,63271,1572683,3932016,6291348,26624,35840,45312,54564,63816,393068,2752401,5177269,26112,35584,44835,54343,63596,65424,2031541,4456409,24832,34084,43592,52845,62353,65462,1834970,4194302,22565,31817,41326,50578,60087,65499,2031615,4456447,19273,28781,38034,47542,56794,393215,2752511,5177343,15466,24718,34227,43479,52987,1569535,3932159,6291455,10887,20395,29648,38900,703743,3072255,5505023,7864319,6047,15299,24807,230655,2599167,4967935,7401983,9764863,688,10197,19449,2388223,4756735,7125503,9559551,11927551,187,5088,2308095,4676607,7110911,9479423,11913727,14282239];for(M=0;M<256;M++)B0=J[M],J[M]=e0(B0)|4278190080;var B0,M;var l0="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";var D0=[{id:"01-helloworlds.asm",name:"Hello World (ASM)"},{id:"02-telephone.asm",name:"Telephone (ASM)"},{id:"03-horcbpal.asm",name:"Paddle Demo (ASM)"},{id:"hello.c",name:"Hello Graphics"},{id:"lines.c",name:"Lines"},{id:"sprites.c",name:"Sprites"},{id:"vsync.c",name:"Sprites w/ VSYNC"},{id:"fastsprites.c",name:"Fast Sprites"},{id:"music.c",name:"Music"},{id:"rotate.c",name:"Rotate Op"},{id:"rainbow.c",name:"Rainbow"},{id:"cosmic.c",name:"Cosmic Impalas Game"},{id:"racing.c",name:"Pseudo 3-D Racing Game"}],E0=[{id:"bios.c",name:"BIOS"}],v=class extends d0{constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"BIOS",start:0,size:8192,type:"rom"},{name:"Screen RAM",start:16384,size:4096,type:"ram"},{name:"BIOS Variables",start:20430,size:20480-20430,type:"ram"}]}}}newMachine(){return new T(!1)}getPresets(){return D0}getDefaultExtension(){return".c"}readAddress(F){return this.machine.read(F)}showHelp(){return"https://8bitworkshop.com/docs/platforms/astrocade/"}},f0=class extends v{getPresets(){return E0}loadROM(F,r){this.machine.loadBIOS(r)}},c0=class extends v{constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"Magic RAM",start:0,size:16384,type:"ram"},{name:"Screen RAM",start:16384,size:16384,type:"ram"}]}}}newMachine(){return new T(!0)}};y.astrocade=v;y["astrocade-bios"]=f0;y["astrocade-arcade"]=c0; -//# sourceMappingURL=astrocade-HTRRXIK3.js.map +//# sourceMappingURL=astrocade-7HVAI6PI.js.map diff --git a/gen/astrocade-HTRRXIK3.js.map b/gen/astrocade-7HVAI6PI.js.map similarity index 100% rename from gen/astrocade-HTRRXIK3.js.map rename to gen/astrocade-7HVAI6PI.js.map diff --git a/gen/atari7800-TFVORQV6.js b/gen/atari7800-ZVTVBKVB.js similarity index 98% rename from gen/atari7800-TFVORQV6.js rename to gen/atari7800-ZVTVBKVB.js index a19f2cc9..55d6943e 100644 --- a/gen/atari7800-TFVORQV6.js +++ b/gen/atari7800-ZVTVBKVB.js @@ -1,7 +1,7 @@ -import{I as $,h as H,k as z,p as K,t as Y}from"./chunk-GKVIY6GD.js";import{H as U,S as L,T as o,U as E,W as N,Y as W,Z as T,ba as F,g as p}from"./chunk-YL2YTMD7.js";import"./chunk-RQFURXHW.js";var g=0,B=2,C=8,Q=N([[o.A,C+0,128],[o.B,C+1,128],[o.GP_A,C+0,128],[o.GP_B,C+1,128],[o.SELECT,B,-2],[o.START,B,-1],[o.UP,g,-16],[o.DOWN,g,-32],[o.LEFT,g,-64],[o.RIGHT,g,-128],[o.P2_A,C+2,128],[o.P2_B,C+3,128],[o.P2_UP,g,-1],[o.P2_DOWN,g,-2],[o.P2_LEFT,g,-4],[o.P2_RIGHT,g,-8]]);var D=263,j=258-16,v=451,Z=28,tt=16,et=24,V=2,G=D*60*V,R=class{constructor(){this.regs=new Uint8Array(32)}reset(){this.regs.fill(0)}read(t){return this.regs[t]|0}write(t,e){this.regs[t]=e}saveState(){return{regs:this.regs.slice(0)}}loadState(t){for(let e=0;e<32;e++)this.write(e,t.regs[e])}static stateToLongString(t){let e="";return e+=L(t.regs,0,32),e}},_=class{constructor(){this.cycles=0;this.regs=new Uint8Array(32);this.offset=-1;this.dll=0;this.dlstart=0;this.dli=!1;this.h16=!1;this.h8=!1;this.writemode=0;this.indirect=!1;this.pixels=new Uint8Array(320);this.WSYNC=0}reset(){this.regs.fill(0)}read(t){return this.regs[t]|0}write(t,e){this.regs[t]=e,t==4&&this.WSYNC++}saveState(){return{regs:this.regs.slice(0),offset:this.offset,dll:this.dll,dlstart:this.dlstart,dli:this.dli,h16:this.h16,h8:this.h8,indirect:this.indirect,writemode:this.writemode}}loadState(t){for(let e=0;e<32;e++)this.write(e,t.regs[e]|0);this.offset=t.offset|0,this.dll=t.dll|0,this.dlstart=t.dlstart|0,this.dli=!!t.dli,this.h16=!!t.h16,this.h8=!!t.h8,this.indirect=!!t.indirect,this.writemode=t.writemode|0}isDMAEnabled(){return(this.regs[28]&96)==64}getDLLStart(){return(this.regs[12]<<8)+this.regs[16]}getCharBaseAddress(){return(this.regs[20]<<8)+this.offset}setVBLANK(t){t?(this.regs[8]|=128,this.offset=-1,this.dll=this.getDLLStart(),this.dli=this.bus&&(this.bus.read(this.dll)&128)!=0):this.regs[8]&=~128}readDLLEntry(t){if(this.dll>=16384)return;let e=t.read(this.dll);this.offset=e&15,this.h16=(e&64)!=0,this.h8=(e&32)!=0,this.dlstart=(t.read(this.dll+1)<<8)+t.read(this.dll+2),this.dll=this.dll+3&65535,this.dli=(t.read(this.dll)&128)!=0}isHoley(t){return this.indirect?!1:!!(t&32768&&(this.h16&&t&4096||this.h8&&t&2048))}readDMA(t){return this.isHoley(t)?0:(this.cycles+=3,this.bus.read(t))}doDMA(t){this.bus=t,this.cycles=0;let e=this.pixels;if(e.fill(this.regs[0]),this.isDMAEnabled()){this.cycles+=this.offset==0?et:tt,this.offset<0&&this.readDLLEntry(t);let c=this.dlstart&65280,a=this.dlstart&255;do{let u=t.read(c+(a+0&511)),s=t.read(c+(a+1&511));if(s==0||c>=16384)break;let y=t.read(c+(a+2&511)),b=t.read(c+(a+3&511)),d=!1;if((s&31)==0){var i=b>>5,f=32-(b&31),r=t.read(c+(a+4&511));d=(s&32)!=0,a+=5,this.cycles+=10,this.writemode=s&128}else{var r=b,i=s>>5,f=32-(s&31);a+=4,this.cycles+=8}this.indirect=d;let m=u+((y+(d?0:this.offset)&255)<<8);r*=2;let S=this.regs[28],M=(S&3)+(this.writemode?4:0),A=(S&4)!=0,I=d&&(S&16)!=0;I&&(f*=2);for(var x=0;x>1):m+x);if(d){let w=(this.regs[20]+this.offset<<8)+h;I&&x&1&&(w++,this.cycles-=3),h=this.readDMA(w)}switch(M){case 0:for(let n=0;n<4;n++){let l=h>>6&3;(l||A)&&(e[r]=e[r+1]=this.regs[(i<<2)+l]),h<<=2,r=r+2&511}break;case 3:for(let n=0;n<8;n++){let l=(h&128)>>6;(l||A)&&(e[r]=this.regs[(i<<2)+l]),h<<=1,r=r+1&511}break;case 4:for(let n=0;n<2;n++){let l=(h>>6&3)+(h&12);(l&3||A)&&(e[r]=e[r+1]=e[r+2]=e[r+3]=this.regs[((i&4)<<2)+l]),h<<=2,r=r+2&511}break;case 6:for(let n=0;n<4;n++){let l=(h&128)>>6|(h&8)>>3;(l||A)&&(e[r]=this.regs[(i<<2)+l]),h<<=1,r=r+1&511}break;case 2:for(let n=0;n<8;n++){let l=(h&128)>>6;l+=n&1?i&1:i>>1&1,(l||A)&&(e[r]=this.regs[(i<<2)+l]),h<<=1,r=r+1&511}break;case 7:let w=h;for(let n=0;n<4;n++){n==2&&(w<<=2);let l=(h&128)>>6,J=i&4|w>>2&3;(l||A)&&(e[r]=this.regs[(J<<2)+l]),h<<=1,r=r+1&511}break}}}while(this.cycles=16384)return;let e=t.read(this.dll);this.offset=e&15,this.h16=(e&64)!=0,this.h8=(e&32)!=0,this.dlstart=(t.read(this.dll+1)<<8)+t.read(this.dll+2),this.dll=this.dll+3&65535,this.dli=(t.read(this.dll)&128)!=0}isHoley(t){return this.indirect?!1:!!(t&32768&&(this.h16&&t&4096||this.h8&&t&2048))}readDMA(t){return this.isHoley(t)?0:(this.cycles+=3,this.bus.read(t))}doDMA(t){this.bus=t,this.cycles=0;let e=this.pixels;if(e.fill(this.regs[0]),this.isDMAEnabled()){this.cycles+=this.offset==0?et:tt,this.offset<0&&this.readDLLEntry(t);let c=this.dlstart&65280,a=this.dlstart&255;do{let u=t.read(c+(a+0&511)),s=t.read(c+(a+1&511));if(s==0||c>=16384)break;let y=t.read(c+(a+2&511)),b=t.read(c+(a+3&511)),d=!1;if((s&31)==0){var i=b>>5,f=32-(b&31),r=t.read(c+(a+4&511));d=(s&32)!=0,a+=5,this.cycles+=10,this.writemode=s&128}else{var r=b,i=s>>5,f=32-(s&31);a+=4,this.cycles+=8}this.indirect=d;let m=u+((y+(d?0:this.offset)&255)<<8);r*=2;let S=this.regs[28],M=(S&3)+(this.writemode?4:0),A=(S&4)!=0,I=d&&(S&16)!=0;I&&(f*=2);for(var x=0;x>1):m+x);if(d){let w=(this.regs[20]+this.offset<<8)+h;I&&x&1&&(w++,this.cycles-=3),h=this.readDMA(w)}switch(M){case 0:for(let n=0;n<4;n++){let l=h>>6&3;(l||A)&&(e[r]=e[r+1]=this.regs[(i<<2)+l]),h<<=2,r=r+2&511}break;case 3:for(let n=0;n<8;n++){let l=(h&128)>>6;(l||A)&&(e[r]=this.regs[(i<<2)+l]),h<<=1,r=r+1&511}break;case 4:for(let n=0;n<2;n++){let l=(h>>6&3)+(h&12);(l&3||A)&&(e[r]=e[r+1]=e[r+2]=e[r+3]=this.regs[((i&4)<<2)+l]),h<<=2,r=r+2&511}break;case 6:for(let n=0;n<4;n++){let l=(h&128)>>6|(h&8)>>3;(l||A)&&(e[r]=this.regs[(i<<2)+l]),h<<=1,r=r+1&511}break;case 2:for(let n=0;n<8;n++){let l=(h&128)>>6;l+=n&1?i&1:i>>1&1,(l||A)&&(e[r]=this.regs[(i<<2)+l]),h<<=1,r=r+1&511}break;case 7:let w=h;for(let n=0;n<4;n++){n==2&&(w<<=2);let l=(h&128)>>6,J=i&4|w>>2&3;(l||A)&&(e[r]=this.regs[(J<<2)+l]),h<<=1,r=r+1&511}break}}}while(this.cycles(this.xtracyc++,this.readInput(t))],[0,31,31,t=>(this.xtracyc++,this.tia.read(t))],[32,63,31,t=>this.maria.read(t)],[64,255,255,t=>this.ram[t+2048]],[256,319,255,t=>this.read(t)],[320,511,511,t=>this.ram[t+2048]],[640,767,127,t=>(this.xtracyc++,this.readPIA(t))],[6144,10239,65535,t=>this.ram[t-6144]],[10240,16383,2047,t=>this.read(t|8192)],[16384,65535,65535,t=>this.rom?this.rom[t-16384]:0],[0,65535,65535,t=>this.probe&&this.probe.logIllegal(t)]]),this.write=T([[21,26,31,(t,e)=>{this.xtracyc++,this.pokey1.setTIARegister(t,e)}],[0,31,31,(t,e)=>{this.xtracyc++,this.tia.write(t,e)}],[32,63,31,(t,e)=>{this.maria.write(t,e)}],[64,255,255,(t,e)=>{this.ram[t+2048]=e}],[256,319,255,(t,e)=>{this.write(t,e)}],[320,511,511,(t,e)=>{this.ram[t+2048]=e}],[640,767,127,(t,e)=>{this.xtracyc++,this.writePIA(t,e)}],[6144,10239,65535,(t,e)=>{this.ram[t-6144]=e}],[10240,16383,2047,(t,e)=>{this.write(t|8192,e)}],[49151,49151,65535,(t,e)=>{}],[0,65535,65535,(t,e)=>{this.probe&&this.probe.logIllegal(t)}]]),this.connectCPUMemoryBus(this),this.dmaBus=this.probeDMABus(this),this.handler=E(this.inputs,Q),this.pokey1=new H,this.audioadapter=new z(this.pokey1,V,G)}readConst(t){let e=this.probe;this.probe=null;let i=this.read(t);return this.probe=e,i}readInput(t){switch(t){case 12:return~this.inputs[8]&128;case 13:return~this.inputs[9]&128;default:return this.inputs[t]|0}}readPIA(t){switch(t){case 0:case 2:return this.inputs[t];case 1:case 3:return this.regs6532[t];case 4:return this.getPIATimerValue();default:return 0}}writePIA(t,e){switch(t){case 0:case 1:case 2:case 3:this.regs6532[t]=e;return;case 20:this.setPIATimer(e,0);return;case 21:this.setPIATimer(e,3);return;case 22:this.setPIATimer(e,6);return;case 23:this.setPIATimer(e,10);return;case 24:this.setPIATimer(e,6);return}}setPIATimer(t,e){this.piatimer=t+1<0?t>>this.timerinterval:t&255}advanceCPU(){var t=super.advanceCPU();return this.tickPIATimer(t),this.xtracyc&&(t+=this.xtracyc,this.tickClocks(this.xtracyc),this.xtracyc=0),t}tickClocks(t){this.probe.logClocks(t),this.tickPIATimer(t)}tickPIATimer(t){this.piatimer=Math.max(-256,this.piatimer-t)}advanceFrame(t){var e=this.pixels,i=0,f,r=0,x=0,c=0;this.probe.logNewFrame();for(var a=0;a>2),r+=y,e){let m=(this.maria.regs[28]&128)!=0?15:255;for(var s=0;s<320;s++)e[i++]=X[this.maria.pixels[s]&m]}}for((u||a==D-1)&&this.maria.doInterrupt()&&(this.probe.logInterrupt(0),this.cpu.NMI());r>2),r=v;break}if(t&&t()){t=null,a=999;break}r+=this.advanceCPU()<<2,c++}this.audio&&this.audioadapter.generate(this.audio),r-=v,x+=r,this.probe.logNewScanline()}return this.lastFrameCycles=x,c}getRasterX(){return this.lastFrameCycles%v}getRasterY(){return this.scanline}loadROM(t){t.length==49280&&(t=t.slice(128)),this.rom=W(t,this.defaultROMSize,!0)}reset(){super.reset(),this.tia.reset(),this.maria.reset(),this.inputs.fill(0),this.inputs[g]=255,this.inputs[B]=1+2+8,this.setPIATimer(0,0)}readAddress(t){return this.read(t)|0}loadState(t){this.cpu.loadState(t.c),this.ram.set(t.ram),this.tia.loadState(t.tia),this.maria.loadState(t.maria),this.regs6532.set(t.regs6532),this.piatimer=t.pia.timer,this.timerinterval=t.pia.interval,this.loadControlsState(t)}saveState(){return{c:this.cpu.saveState(),ram:this.ram.slice(0),tia:this.tia.saveState(),maria:this.maria.saveState(),regs6532:this.regs6532.slice(0),inputs:this.inputs.slice(0),pia:{timer:this.piatimer,interval:this.timerinterval}}}loadControlsState(t){this.inputs.set(t.inputs)}saveControlsState(){return{inputs:this.inputs.slice(0)}}getDebugCategories(){return["CPU","Stack","TIA","MARIA"]}getDebugInfo(t,e){switch(t){case"TIA":return R.stateToLongString(e.tia);case"MARIA":return _.stateToLongString(e.maria)+` Scanline: `+this.scanline}}getDebugDisplayLists(){let t={},e=this.maria.getDLLStart(),i=0;for(;i<240;){let f=this.readConst(e),r=f&15,x=(f&64)!=0,c=(f&32)!=0,a=(this.readConst(e+1)<<8)+this.readConst(e+2);e=e+3&65535;let u=(this.readConst(e)&128)!=0,s="DL $"+p(a,4)+" "+i+"-"+(i+r);x&&(s+=" H16"),c&&(s+=" H8"),u&&(s+=" DLI"),t[s]={$$:this._readDebugDisplayList(a)},i+=r+1}return t}_readDebugDisplayList(t){return()=>this.readDebugDisplayList(t)}readDebugDisplayList(t){let e=[],i=t&65280,f=t&255;do{let a=this.maria.regs[28],u=this.readConst(i+(f+0&511)),s=this.readConst(i+(f+1&511));if(s==0)break;let y=this.readConst(i+(f+2&511)),b=this.readConst(i+(f+3&511)),d=!1,m="",S,M=(a&3)+(s&128?4:0);if((s&31)==0){var r=b>>5,x=32-(b&31),c=this.readConst(i+(f+4&511));d=(s&32)!=0,S=s&128,f+=5}else{var c=b,r=s>>5,x=32-(s&31);f+=4}m+="X="+c+" W="+x+" P="+r,S&&(m+=" WM=1"),d&&(m+=" CHR=$"+p(this.maria.regs[20]+this.maria.offset&255)+"xx");let A=u+((y+(d?0:this.maria.offset)&255)<<8);m=" $"+p(A,4)+" "+m,m=["160A","?","320D","320A","160B","?","320B","320C"][M]+" "+m,e.push(m)}while(f<512);return e}},X=new Uint32Array(256);for(P=0;P<256;P++)X[P]=F(P);var P;var rt=[{id:"sprites.dasm",name:"Sprites (ASM)"},{id:"wsync.c",name:"WSYNC"},{id:"sprites.c",name:"Double Buffering"},{id:"scroll.c",name:"Scrolling"}],q=class extends ${constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"TIA",start:0,size:32,type:"io"},{name:"MARIA",start:32,size:32,type:"io"},{name:"RAM (6166 Block 0)",start:64,size:192,type:"ram"},{name:"RAM (6166 Block 1)",start:320,size:192,type:"ram"},{name:"PIA",start:640,size:24,type:"io"},{name:"RAM",start:6144,size:4096,type:"ram"},{name:"Cartridge ROM",start:16384,size:49152,type:"rom"}]}}}newMachine(){return new O}getPresets(){return rt}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getROMExtension(){return".a78"}getDebugTree(){let t=super.getDebugTree();return t.display_list=this.machine.getDebugDisplayLists(),t}};U.atari7800=q; -//# sourceMappingURL=atari7800-TFVORQV6.js.map +//# sourceMappingURL=atari7800-ZVTVBKVB.js.map diff --git a/gen/atari7800-TFVORQV6.js.map b/gen/atari7800-ZVTVBKVB.js.map similarity index 100% rename from gen/atari7800-TFVORQV6.js.map rename to gen/atari7800-ZVTVBKVB.js.map diff --git a/gen/atari8-YJPSBKKM.js b/gen/atari8-N6OQBLEH.js similarity index 99% rename from gen/atari8-YJPSBKKM.js rename to gen/atari8-N6OQBLEH.js index 0095bd11..04d27caa 100644 --- a/gen/atari8-YJPSBKKM.js +++ b/gen/atari8-N6OQBLEH.js @@ -1,4 +1,4 @@ -import{a as xt}from"./chunk-BMGQJMLR.js";import{B as ft,I as dt,g as nt,k as ht,q as ot,t as ct,y as lt}from"./chunk-GKVIY6GD.js";import{H as I,M as T,S as y,T as i,U as it,W as rt,Z as C,a as v,ba as at,g as f,q as _}from"./chunk-YL2YTMD7.js";import"./chunk-RQFURXHW.js";var Ut=[0,25,17,9],Yt=[0,25+64,17+80,9+96],E=0,Bt=1,j=2,z=3,Ht=4,Qt=5,jt=7,zt=9,L=10,Gt=11,Xt=12,qt=13,ut=14,Wt=15,K=15;var Zt=17-4,$t=110-4,Jt=105,G=[0,0,8,10,8,16,8,16,8,4,4,2,1,2,1,1],te=[0,0,2,2,2,2,4,4,8,4,4,4,4,2,2,2],ee=[0,0,0,0,0,1,0,1,0,0,2,1,0,0,0,0],mt=[0,0,1,1,2,2,2,2,8,4,4,2,2,2,2,1],V=class{constructor(t,e){this.regs=new Uint8Array(16);this.dma_enabled=!1;this.dliop=0;this.mode=0;this.jmp=!1;this.lms=!1;this.dlarg_lo=0;this.dlarg_hi=0;this.period=0;this.scanaddr=0;this.startaddr=0;this.pfbyte=0;this.ch=0;this.linesleft=0;this.yofs=0;this.isfirstline=!1;this.v=0;this.h=0;this.linebuf=new Uint8Array(48);this.dmaclock=0;this.dmaidx=0;this.output=0;this.dramrefresh=!1;this.in_vscroll=0;this.read=t,this.nmi=e}reset(){this.regs.fill(0),this.regs[ut]=0,this.regs[K]=127,this.regs[Xt]=0,this.regs[qt]=255,this.setReg(E,0),this.h=this.v=0,this.startaddr=this.scanaddr=0,this.dmaclock=0}saveState(){return _(0,{},this)}loadState(t){_(0,this,t),this.setReg(E,t.regs[E])}static stateToLongString(t){let e="";return e+="H: "+v(t.h,3)+" V: "+v(t.v,3)+` +import{a as xt}from"./chunk-47GW3WCW.js";import{B as ft,I as dt,g as nt,k as ht,q as ot,t as ct,y as lt}from"./chunk-6UU4KLMR.js";import{H as I,M as T,S as y,T as i,U as it,W as rt,Z as C,a as v,ba as at,g as f,q as _}from"./chunk-7LTJUW24.js";import"./chunk-RQFURXHW.js";var Ut=[0,25,17,9],Yt=[0,25+64,17+80,9+96],E=0,Bt=1,j=2,z=3,Ht=4,Qt=5,jt=7,zt=9,L=10,Gt=11,Xt=12,qt=13,ut=14,Wt=15,K=15;var Zt=17-4,$t=110-4,Jt=105,G=[0,0,8,10,8,16,8,16,8,4,4,2,1,2,1,1],te=[0,0,2,2,2,2,4,4,8,4,4,4,4,2,2,2],ee=[0,0,0,0,0,1,0,1,0,0,2,1,0,0,0,0],mt=[0,0,1,1,2,2,2,2,8,4,4,2,2,2,2,1],V=class{constructor(t,e){this.regs=new Uint8Array(16);this.dma_enabled=!1;this.dliop=0;this.mode=0;this.jmp=!1;this.lms=!1;this.dlarg_lo=0;this.dlarg_hi=0;this.period=0;this.scanaddr=0;this.startaddr=0;this.pfbyte=0;this.ch=0;this.linesleft=0;this.yofs=0;this.isfirstline=!1;this.v=0;this.h=0;this.linebuf=new Uint8Array(48);this.dmaclock=0;this.dmaidx=0;this.output=0;this.dramrefresh=!1;this.in_vscroll=0;this.read=t,this.nmi=e}reset(){this.regs.fill(0),this.regs[ut]=0,this.regs[K]=127,this.regs[Xt]=0,this.regs[qt]=255,this.setReg(E,0),this.h=this.v=0,this.startaddr=this.scanaddr=0,this.dmaclock=0}saveState(){return _(0,{},this)}loadState(t){_(0,this,t),this.setReg(E,t.regs[E])}static stateToLongString(t){let e="";return e+="H: "+v(t.h,3)+" V: "+v(t.v,3)+` `,e+="DLIOp: "+f(t.dliop,2)+" Lines: "+t.yofs+"/"+t.linesleft,e+=" DMA "+(t.dma_enabled?"ON ":"off"),t.dma_enabled&&(e+=" idx "+t.dmaidx+" clk "+f(t.dmaclock)),e+=` `,e+="Addr: "+f(t.scanaddr,4)+` `,e+=y(t.regs,0,16).replace("$00","Regs"),e}setReg(t,e){switch(t){case L:this.regs[L]=255;return;case Wt:this.regs[K]=31;return}this.regs[t]=e}readReg(t){switch(t){case K:return this.regs[t];case Gt:return this.v>>1;default:return 255}}processDLIEntry(){if(this.mode==0)this.linesleft=(this.dliop>>4&7)+1,this.dmaclock=0;else{this.linesleft=G[this.mode],this.period=te[this.mode],this.jmp?(this.regs[j]=this.dlarg_lo,this.regs[z]=this.dlarg_hi,this.mode=this.period=0,this.dliop&64&&(this.linesleft=1,this.dma_enabled=!1),this.dmaclock=0):this.lms&&(this.scanaddr=this.dlarg_lo+(this.dlarg_hi<<8)),this.startaddr=this.scanaddr;let t=this.regs[E]&3,e=this.dliop&16?(this.regs[Ht]&15)>>1:0;this.dliop&16&&t<3&&t++,this.left=Ut[t]+e,this.right=Yt[t]+e;let s=this.regs[Qt]&15;this.dliop&32^this.in_vscroll&&(this.in_vscroll?this.linesleft=s+1:(this.linesleft-=s,this.yofs+=s),this.linesleft&=15,this.in_vscroll^=32)}}nextLine(){this.linesleft>0&&(this.linesleft--,this.yofs++,this.isfirstline=!1,this.mode>=8&&this.linesleft&&(this.scanaddr=this.startaddr))}triggerNMI(t){this.regs[K]=t|31,this.regs[ut]&t&&this.nmi()}getDlistAddr(){return this.regs[j]+(this.regs[z]<<8)}nextInsn(){let t=this.getDlistAddr(),e=this.read(t);return t=t+1&1023|t&~1023,this.regs[j]=t&255,this.regs[z]=t>>8,e}nextScreen(){let t=this.read(this.scanaddr);return this.incScanAddr(),t}incScanAddr(){this.scanaddr=this.scanaddr+1&4095|this.scanaddr&~4095}dlDMAEnabled(){return this.regs[E]&32}isVisibleScanline(){return this.v>=8&&this.v<248}isPlayfieldDMAEnabled(){return this.dma_enabled&&!this.linesleft}isPlayerDMAEnabled(){return this.regs[E]&8}isMissileDMAEnabled(){return this.regs[E]&12}isWSYNC(){return this.regs[L]!=0}clockPulse(){let t=this.isWSYNC();if(!this.isVisibleScanline())this.doVBlank();else{switch(this.h){case 0:this.isMissileDMAEnabled()&&(this.doPlayerMissileDMA(3),t=!0);break;case 1:if(this.isPlayfieldDMAEnabled()){let e=this.nextInsn();this.jmp=(e&~64)==1,this.lms=(e&64)!=0&&(e&15)!=0,this.mode=e&15,this.dliop=e,this.yofs=0,this.isfirstline=!0,t=!0}break;case 2:case 3:case 4:case 5:this.isPlayerDMAEnabled()&&(this.doPlayerMissileDMA(this.h+2),t=!0);break;case 6:case 7:this.isPlayfieldDMAEnabled()&&this.isfirstline&&(this.jmp||this.lms)&&(this.h==6&&(this.dlarg_lo=this.nextInsn()),this.h==7&&(this.dlarg_hi=this.nextInsn()),t=!0);break;case 8:this.isfirstline&&this.processDLIEntry(),this.dliop&128&&this.linesleft==1&&this.triggerNMI(128);break;case 9:break;case 111:this.dma_enabled&&this.nextLine(),++this.v;break}if(this.output=0,this.mode>=2&&this.period){let e=this.h<=Jt;this.dmaclock=this.dmaclock<<1&511,this.dmaclock&1<=8&&this.incScanAddr(),t=e),this.output=this.h>=this.left+3&&this.h<=this.right+2?4:0}}return(this.h$t)&&(this.output=2),this.incHorizCounter(),!t&&this.dramrefresh&&(this.read(0),this.dramrefresh=!1,t=!0),t}incHorizCounter(){switch(this.h){case 25:case 25+4*1:case 25+4*2:case 25+4*3:case 25+4*4:case 25+4*5:case 25+4*6:case 25+4*7:case 25+4*8:this.dramrefresh=!0;break;case 102:this.regs[L]=0;break;case 113:this.h=0;return}++this.h}doVBlank(){this.linesleft=this.mode=this.period=0,this.h==111&&this.v++,this.v==248&&this.h==0&&this.triggerNMI(64),this.v==262&&this.h==112&&(this.v=0),this.v==7&&this.h==113&&(this.dma_enabled=this.dlDMAEnabled()!=0),this.output=2,this.dmaclock=0}doPlayerMissileDMA(t){let e=this.regs[E]&16,s=this.regs[jt]<<8;e?(s&=63488,s|=t<<8,s|=this.v&255):(s&=64512,s|=t<<7,s|=this.v>>1),this.read(s)}readBitmapData(){let t=this.mode;if(t<8){let e=this.ch,s=this.yofs>>ee[this.mode],a=s&7,n=this.regs[zt];(t&14)==6?(e&=63,n&=254):(e&=127,n&=252);let h=(e<<3)+(n<<8);if((t&14)==2){let o=this.regs[Bt],l=t==3&&(e&96)==96;o&4?this.pfbyte=this.read(h+(a^7)):this.pfbyte=this.read(h+a),l&&s<2&&(this.pfbyte=0),!l&&s>7&&(this.pfbyte=0),this.ch&128&&(o&1&&(this.pfbyte=0),o&2&&(this.pfbyte^=255))}else this.pfbyte=this.read(h+a)}else this.pfbyte=this.nextScreen()}shiftout(){if(this.output==4)switch(this.mode){case 2:case 3:case 15:{let t=this.pfbyte>>7&1;return this.pfbyte<<=1,t?8:6}case 6:case 7:{let t=this.pfbyte>>7&1;return this.pfbyte<<=1,t?(this.ch>>6)+4:0}case 9:case 11:case 12:{let t=this.pfbyte>>7&1;return this.pfbyte<<=1,t?4:0}case 4:case 5:{let t=this.pfbyte>>6&3;return this.pfbyte<<=2,this.ch&128?[0,4,5,7][t]:[0,4,5,6][t]}case 8:case 10:case 13:case 14:{let t=this.pfbyte>>6&3;return this.pfbyte<<=2,[0,4,5,6][t]}}return this.output}};var se=0;var ie=8,re=12,gt=13,pt=17,A=18,g=22,ae=23,ne=24,he=25,S=26,w=27,oe=28,bt=29,ce=30,le=31,fe=0,de=4,xe=8,N=12,_t=16,X=31,At=-9,F=[0,1,2,3,7,7,7,7,8,8,8,8,4,5,6,7,0,1,2,3,7,7,7,7,8,8,8,8,4,5,6,7,0,1,6,7,5,5,5,5,8,8,8,8,2,3,4,5,0,1,6,7,5,5,5,5,8,8,8,8,2,3,4,5,4,5,6,7,3,3,3,3,8,8,8,8,0,1,2,3,4,5,6,7,3,3,3,3,8,8,8,8,0,1,2,3,4,5,6,7,3,3,3,3,8,8,8,8,0,1,2,3,4,5,6,7,3,3,3,3,8,8,8,8,0,1,2,3,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7],ue=[A+0,A+1,A+2,A+3,g+0,g+1,g+2,g+3,S,S,S,S,g+0,g+1,g+2,g+3],U=class{constructor(){this.regs=new Uint8Array(32);this.readregs=new Uint8Array(32);this.shiftregs=new Uint32Array(8);this.count=0;this.an=0;this.rgb=0;this.pmcol=0;this.gtiacol=0;this.gtiacol2=0;this.hbias=At;this.pmDebugMask=-1}reset(){this.regs.fill(0),this.readregs.fill(0),this.readregs[20]=15,this.readregs.fill(15,21),this.count=0}saveState(){return _(0,{},this)}loadState(t){_(0,this,t)}setReg(t,e){switch(t){case A:case A+1:case A+2:case A+3:case g:case g+1:case g+2:case g+3:case S:e&=254;break;case ce:this.readregs.fill(0,0,16);return}this.regs[t]=e}readReg(t){switch(t){case X:return this.readregs[t]&~this.regs[le]}return this.readregs[t]}sync(){this.count=0}setBias(t){this.hbias=At+t}updateGfx(t,e,s){switch(t){case 0:this.regs[bt]&1&&(this.regs[pt]=s);break;case 2:case 3:case 4:case 5:this.regs[bt]&2&&(!(e&1)||!(this.regs[oe]&1<>6){case 0:switch(this.an){case 0:return S;case 4:case 5:case 6:case 7:return g+this.an-4;case 8:return this.regs[ne]&240|this.regs[ae]&15|256}break;case 1:return this.regs[S]&240|this.gtiacol&15|256;case 2:return ue[this.gtiacol];case 3:return this.regs[S]&15|this.gtiacol<<4|256}return 256}anySpriteActive(){return this.shiftregs[0]||this.shiftregs[1]||this.shiftregs[2]||this.shiftregs[3]||this.shiftregs[4]||this.shiftregs[5]||this.shiftregs[6]||this.shiftregs[7]}processPlayerMissile(){if(!this.anySpriteActive()){this.evalTrigger(0),this.evalTrigger(1),this.evalTrigger(2),this.evalTrigger(3),this.evalTrigger(4),this.evalTrigger(5),this.evalTrigger(6),this.evalTrigger(7),this.pmcol=-1;return}if(this.an==2){this.shiftObject(0),this.shiftObject(1),this.shiftObject(2),this.shiftObject(3),this.shiftObject(4),this.shiftObject(5),this.shiftObject(6),this.shiftObject(7),this.pmcol=-1;return}let t=(this.regs[w]&15)<<4,e=F[(this.an&7)+8+t],s=this.an-4,a=-1,n=0;for(let h=0;h<4;h++)if(this.shiftObject(h)){s>=0&&(this.readregs[de+h]|=1<=0&&(this.readregs[fe+h]|=1<=0?this.getObjectColor(a):-1}shiftObject(t){let e=(this.shiftregs[t]&2147483648)!=0;return this.shiftregs[t]<<=1,this.evalTrigger(t),e}getObjectColor(t){return this.regs[w]&16&&t>=4?this.regs[he]:this.regs[A+(t&3)]}evalTrigger(t){this.regs[se+t]+this.hbias==this.count&&this.triggerObject(t)}triggerObject(t){let e,s;if(!!(this.pmDebugMask&1<>a&3,s=(this.regs[pt]>>a&3)<<6}e&1?s=yt(s):s<<=8,e==3?s=yt(s):s<<=16,this.shiftregs[t]|=s}}clockPulse1(){this.processPlayerMissile(),this.clockPulse2(),this.count++}clockPulse2(){var t;if(this.pmcol>=0)t=this.pmcol;else{let e=this.getPlayfieldColor();t=e&256?e&255:this.regs[e]}this.rgb=Et[t],this.gtiacol2=this.gtiacol2<<1|this.an>>3}clockPulse4(){this.gtiacol=this.gtiacol2&15}static stateToLongString(t){let e="";return e+=`X: ${v(t.count,3)} ANTIC: ${f(t.an,1)} PM: ${f(t.pmcol,3)} @@ -7,4 +7,4 @@ import{a as xt}from"./chunk-BMGQJMLR.js";import{B as ft,I as dt,g as nt,k as ht, `,e+=y(t.readregs,0,32),e}};function yt(r){return r=(r|r<<8)&16711935,r=(r|r<<4)&252645135,r=(r|r<<2)&858993459,r=(r|r<<1)&1431655765,r|r<<1}var Et=new Uint32Array(256);for(k=0;k<256;k++)Et[k]=at(k);var k;var c=0;var me=2;var St=4;var Ot=6;var p=8,ge=9,pe=10,be=11,_e=13,q=14,R=15;var Ae=8,ye=9,Ee=10,Se=13,P=14,Y=15;var Rt=128,It=64,Oe=32,Tt=16,Pt=8;var Re=1,Dt=28,Ie=114;var Mt=511,vt=131071,u=0,m=1,b=2,d=3,O=114,Te=15;var Pe=8;var W,B;function De(){W=new Uint8Array(511),B=new Uint8Array(16385);let r=511;for(let t=0;t<511;t++)r=(((r>>5^r)&1)<<8)+(r>>1),W[t]=r;r=131071;for(let t=0;t<16385;t++)r=(((r>>5^r)&255)<<9)+(r>>8),B[t]=r>>1}var H=class{constructor(t,e){this.irq=t;this.antic_xpos=e;this.regs=new Uint8Array(16);this.readregs=new Uint8Array(16);this.divnirq=new Uint32Array(4);this.divnmax=new Uint32Array(4);this.pot_inputs=new Uint8Array(8);this.basemult=0;this.pot_scanline=0;this.random_scanline_counter=0;this.kbcode=0;this.DELAYED_SERIN_IRQ=0;this.DELAYED_SEROUT_IRQ=0;this.DELAYED_XMTDONE_IRQ=0;this.init()}saveState(){return _(0,{},this)}loadState(t){_(0,this,t)}init(){this.readregs.fill(255),this.readregs[Y]=239,this.basemult=Dt,this.pot_inputs.fill(128),De()}read(t){let e=this.readregs[t];switch(t&=15,t){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:return e=this.pot_inputs[t],e>3;s&=7,e=(B[a]>>s)+(B[a+1]<<8-s)}}break}return e&255}write(t,e){switch(t&=15,this.regs[t]=e,t){case p:e&Re?this.basemult=Ie:this.basemult=Dt,this.update_counter(1<=3?(this.readregs[P]|=8,this.DELAYED_XMTDONE_IRQ=2*this.DELAYED_SEROUT_IRQ-2):(this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0));break;case ge:this.divnirq[u]=this.divnmax[u],this.divnirq[m]=this.divnmax[m],this.divnirq[b]=this.divnmax[b],this.divnirq[d]=this.divnmax[d];break;case R:e&4&&(this.pot_scanline=228),(e&3)==0&&(this.DELAYED_SERIN_IRQ=0,this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0);break}this.snd_update(t)}update_counter(t){t&1<0&&--this.DELAYED_SERIN_IRQ==0&&(this.readregs[Se]=this.SIO_GetByte(),this.generateIRQ(32)),this.DELAYED_SEROUT_IRQ>0&&--this.DELAYED_SEROUT_IRQ==0&&this.generateIRQ(16),this.DELAYED_XMTDONE_IRQ>0&&--this.DELAYED_XMTDONE_IRQ==0&&this.generateIRQ(8),this.advanceIRQTimer(u,1),this.advanceIRQTimer(m,2),this.advanceIRQTimer(d,4))}advanceIRQTimer(t,e){(this.divnirq[t]-=O)<0&&(this.divnirq[t]+=this.divnmax[t],this.generateIRQ(e))}generateIRQ(t){this.regs[q]&t&&(this.irq(),this.readregs[P]&=~t)}static stateToLongString(t){let e="";return e+=`Write Registers: `,e+=y(t.regs,0,16),e+=`Read Registers: `,e+=y(t.readregs,0,16),e}CASSETTE_IOLineStatus(){return 0}siocheck(){return((this.regs[c+b]==40||this.regs[c+b]==16||this.regs[c+b]==8||this.regs[c+b]==10)&&this.regs[c+d]==0||(this.regs[R]&120)==40)&&(this.regs[p]&40)==40}SIO_PutByte(t){console.log("SIO put byte",t)}SIO_GetByte(){return 0}};var Me=[i.VK_L,i.VK_J,i.VK_SEMICOLON,i.VK_F4,i.VK_F5,i.VK_K,i.VK_BACK_SLASH,i.VK_TILDE,i.VK_O,null,i.VK_P,i.VK_U,i.VK_ENTER,i.VK_I,i.VK_MINUS2,i.VK_EQUALS2,i.VK_V,i.VK_F7,i.VK_C,i.VK_F6,i.VK_F4,i.VK_B,i.VK_X,i.VK_Z,i.VK_4,null,i.VK_3,i.VK_6,i.VK_ESCAPE,i.VK_5,i.VK_2,i.VK_1,i.VK_COMMA,i.VK_SPACE,i.VK_PERIOD,i.VK_N,null,i.VK_M,i.VK_SLASH,null,i.VK_R,null,i.VK_E,i.VK_Y,i.VK_TAB,i.VK_T,i.VK_W,i.VK_Q,i.VK_9,null,i.VK_0,i.VK_7,i.VK_BACK_SPACE,i.VK_8,null,null,i.VK_F,i.VK_H,i.VK_D,null,i.VK_CAPS_LOCK,i.VK_G,i.VK_S,i.VK_A],ve=rt([[i.UP,0,1],[i.DOWN,0,2],[i.LEFT,0,4],[i.RIGHT,0,8],[{c:16,n:"Shift",plyr:0,button:0},2,1],[i.VK_F1,3,1],[i.VK_F2,3,2],[i.VK_F3,3,4]]),Q=class extends ot{constructor(){super();this.cpuFrequency=1789773;this.numTotalScanlines=262;this.cpuCyclesPerLine=114;this.canvasWidth=336;this.numVisibleScanlines=224;this.aspectRatio=this.canvasWidth/this.numVisibleScanlines*.857;this.firstVisibleScanline=16;this.firstVisibleClock=(44-6)*2;this.defaultROMSize=32768;this.overscan=!0;this.audioOversample=2;this.sampleRate=this.numTotalScanlines*60*this.audioOversample;this.run_address=-1;this.inputs=new Uint8Array(4);this.linergb=new Uint32Array(this.canvasWidth);this.lastdmabyte=0;this.keycode=0;this.cart_80=!1;this.cart_a0=!1;this.xexdata=null;this.keyboard_active=!0;this.d500=new Uint8Array(256);this.cpu=new ct,this.ram=new Uint8Array(65536),this.bios=new Uint8Array(10240),this.bus=this.newBus(),this.connectCPUMemoryBus(this.bus),this.antic=new V(this.readDMA.bind(this),this.antic_nmi.bind(this)),this.gtia=new U,this.irq_pokey=new H(this.pokey_irq.bind(this),()=>this.antic.h),this.audio_pokey=nt(1),this.audioadapter=new ht(this.audio_pokey.pokey1,this.audioOversample,this.sampleRate),this.handler=it(this.inputs,ve,this.getKeyboardFunction(),!0)}newBus(){return{read:C([[0,32767,65535,t=>this.ram[t]],[32768,40959,65535,t=>this.cart_80?this.rom[t-32768]:this.ram[t]],[40960,49151,65535,t=>this.cart_a0?this.rom[t-32768]:this.ram[t]],[53248,53503,31,t=>this.gtia.readReg(t)],[53760,54015,15,t=>this.readPokey(t)],[54016,54271,15,t=>this.readPIA(t)],[54272,54527,15,t=>this.antic.readReg(t)],[54528,54783,255,t=>this.d500[t]],[55296,65535,65535,t=>this.bios[t-55296]]]),write:C([[0,49146,65535,(t,e)=>{this.ram[t]=e}],[49147,49151,65535,(t,e)=>{this.ram[t]=e,this.initCartA()}],[53248,53503,31,(t,e)=>{this.gtia.setReg(t,e)}],[53760,54015,15,(t,e)=>{this.writePokey(t,e)}],[54272,54527,15,(t,e)=>{this.antic.setReg(t,e)}],[54528,54783,255,(t,e)=>{this.writeMapper(t,e)}]])}}loadBIOS(t){this.bios.set(t)}reset(){super.reset(),this.antic.reset(),this.gtia.reset(),this.keycode=0}read(t){return this.bus.read(t)}readDMA(t){let e=this.bus.read(t);return this.probe.logDMARead(t,e),this.lastdmabyte=e,e}readConst(t){return t<53248||t>=54528?this.bus.read(t):255}write(t,e){this.bus.write(t,e)}readPokey(t){switch(t&15){case 9:return this.keycode&255;case 15:return~this.keycode>>6&4|~this.keycode>>3&8|18;default:return this.irq_pokey.read(t)}}readPIA(t){if(t==0||t==1)return~this.inputs[t]}writePokey(t,e){this.audio_pokey.pokey1.setRegister(t,e),this.irq_pokey.write(t,e)}startScanline(){this.gtia.sync();for(let t=0;t<4;t++)this.gtia.readregs[_t+t]=~this.inputs[2]>>t&1;this.gtia.readregs[X]=~this.inputs[3]&7,this.audio&&this.audioadapter.generate(this.audio),this.irq_pokey.advanceScanline()}drawScanline(){let t=this.antic.v-this.firstVisibleScanline;t>=0&&t{this.gtia.clockPulse1(),this.linergb[t++]=this.gtia.rgb},s=()=>{this.gtia.clockPulse2(),this.linergb[t++]=this.gtia.rgb};this.gtia.clockPulse4(),this.antic.dliop&16&&this.antic.regs[4]&1?(t+=2,this.gtia.setBias(-1)):this.gtia.setBias(0);let a=mt[this.antic.mode],n=this.antic.h&1;return(a<8||n)&&(this.gtia.an=this.antic.shiftout()),e(),a==1&&(this.gtia.an=this.antic.shiftout()),s(),a<=2&&(this.gtia.an=this.antic.shiftout()),e(),a==1&&(this.gtia.an=this.antic.shiftout()),s(),1}loadState(t){this.loadControlsState(t),this.cpu.loadState(t.c),this.ram.set(t.ram),this.antic.loadState(t.antic),this.gtia.loadState(t.gtia),this.irq_pokey.loadState(t.pokey),this.lastdmabyte=t.lastdmabyte,this.cart_80=t.cart_80,this.cart_a0=t.cart_a0}saveState(){return{c:this.cpu.saveState(),ram:this.ram.slice(0),antic:this.antic.saveState(),gtia:this.gtia.saveState(),pokey:this.irq_pokey.saveState(),inputs:this.inputs.slice(0),lastdmabyte:this.lastdmabyte,keycode:this.keycode,cart_80:this.cart_80,cart_a0:this.cart_a0}}loadControlsState(t){this.inputs.set(t.inputs),this.keycode=t.keycode}saveControlsState(){return{inputs:this.inputs.slice(0),keycode:this.keycode}}getRasterScanline(){return this.antic.v}getRasterLineClock(){return this.antic.h}getDebugCategories(){return["CPU","Stack","ANTIC","GTIA","POKEY"]}getDebugInfo(t,e){switch(t){case"ANTIC":return V.stateToLongString(e.antic);case"GTIA":return U.stateToLongString(e.gtia);case"POKEY":return H.stateToLongString(e.pokey)}}getKeyboardFunction(){return(t,e,s,a)=>{if(!this.keyboard_active)return!1;if(a&(T.KeyDown|T.KeyUp)){var n=Me;if(e==i.VK_F9.c)return this.irq_pokey.generateIRQ(128),!0;for(var h=0;h>8}if(e>t.length)throw new Error("Bad .XEX file format")}n>=0&&(s[a++]=169,s[a++]=160,s[a++]=141,s[a++]=255,s[a++]=213,s[a++]=76,s[a++]=n&255,s[a++]=n>>8,this.ram[10]=0,this.ram[11]=213,this.run_address=54528)}initCartA(){this.cpu.getPC()==61823&&this.xexdata&&this.loadXEX(this.xexdata)}setPaddleInput(t,e){this.irq_pokey.pot_inputs[t]=255-e}getDebugDisplayList(){let t=this.antic.getDlistAddr(),e=()=>{let n=this.read(t);return t=t+1&1023|t&~1023,n},s=[],a=0;for(let n=0;n<256&&a<240;n++){let h=t,o=e(),l=o&15,x="",D=!1,M;if(l==0)M=(o>>4&7)+1,x+=" blank="+M;else{M=G[l],x+=" mode="+f(l),x+=" lines="+M,D=(o&~64)==1;let st=(o&64)!=0&&(o&15)!=0;if(o&16&&(x+=" HSCROL"),o&32&&(x+=" VSCROL"),o&128&&(x+=" DLI"),D&&o&64?x+=" JVB":D?x+=" JMP":st&&(x+=" LMS"),D||st){let Nt=e(),Ft=e();x+=" $"+f(Ft)+""+f(Nt)}}if(s.push("$"+f(h)+" y="+a+" "+x),D)break;a+=M}return s}},Z=class extends Q{newBus(){return{read:C([[0,16383,65535,t=>this.ram[t]],[16384,49151,65535,t=>this.rom?this.rom[t-16384]:0],[49152,53247,31,t=>this.gtia.readReg(t)],[54272,54527,15,t=>this.antic.readReg(t)],[59392,61439,15,t=>this.readPokey(t)],[63488,65535,2047,t=>this.bios[t]]]),write:C([[0,16383,65535,(t,e)=>{this.ram[t]=e}],[49152,53247,31,(t,e)=>{this.gtia.setReg(t,e)}],[54272,54527,15,(t,e)=>{this.antic.setReg(t,e)}],[59392,61439,15,(t,e)=>{this.writePokey(t,e)}]])}}};var $=[{id:"hello.dasm",name:"Hello World (ASM)"},{id:"hellopm.dasm",name:"Hello Sprites (ASM)"},{id:"helloconio.c",name:"Text Mode (C)"},{id:"siegegame.c",name:"Siege Game (C)"},{id:"hellodlist.c",name:"Display List (C)"}],Ct=$.concat([{id:"testmusic.c",name:"POKEY Music (C)"},{id:"sieve.bas",name:"Benchmark (FastBasic)"},{id:"pmtest.bas",name:"Sprites Test (FastBasic)"},{id:"dli.bas",name:"DLI Test (FastBasic)"},{id:"joyas.bas",name:"Match-3 Game (FastBasic)"}]),kt={main:[{name:"RAM",start:0,size:49152,type:"ram"},{name:"Left Cartridge ROM",start:40960,size:8192,type:"rom"},{name:"GTIA",start:53248,size:32,type:"io"},{name:"POKEY",start:53760,size:16,type:"io"},{name:"PIA",start:54016,size:4,type:"io"},{name:"ANTIC",start:54272,size:16,type:"io"},{name:"Cartridge Control Line",start:54784,size:256,type:"io"},{name:"ROM",start:55296,size:2048,type:"rom"},{name:"Character Set",start:57344,size:1024,type:"rom"},{name:"ROM",start:58368,size:7168,type:"rom"}]};function Lt(r){return r.endsWith(".bas")||r.endsWith(".fb")||r.endsWith(".fbi")?"fastbasic":lt(r)}var J=class extends dt{constructor(){super(...arguments);this.getToolForFilename=Lt;this.showHelp=wt;this.getROMExtension=Ce;this.biosPath="res/altirra/kernel.rom"}newMachine(){return new Q}getPresets(){return Ct}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getMemoryMap(){return kt}async start(){let t=await this.loadKernel();await super.start(),this.machine.loadBIOS(t)}async loadKernel(){var t=await fetch(this.biosPath);if(t.status==200||t.size){var e=await t.arrayBuffer();return new Uint8Array(e)}else throw new Error("could not load BIOS file")}getDebugTree(){let t=super.getDebugTree();return t.display_list=this.machine.getDebugDisplayList(),t}},Kt=class extends J{constructor(){super(...arguments);this.biosPath="res/altirra/superkernel.rom"}getPresets(){return $}newMachine(){return new Z}},tt=class extends xt{constructor(){super(...arguments);this.getToolForFilename=Lt;this.getOpcodeMetadata=ft;this.showHelp=wt}getPresets(){return $}getDefaultExtension(){return".asm"}},et=class extends tt{constructor(){super(...arguments);this.getMemoryMap=function(){return kt}}getPresets(){return Ct}loadROM(t,e){this.started?(this.loadROMFile(e),this.loadRegion(":cartleft:cart:rom",e)):this.startModule(this.mainElement,{jsfile:"mame8bitws.js",biosfile:"a800xl.zip",cfgfile:"a800xl.cfg",driver:"a800xl",width:336*2,height:225*2,romfn:"/emulator/cart.rom",romdata:new Uint8Array(e),romsize:8192,preInit:function(s){}})}start(){}},Vt=class extends tt{constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"RAM",start:0,size:16384,type:"ram"},{name:"Cartridge ROM",start:16384,size:32768,type:"rom"},{name:"GTIA",start:49152,size:32,type:"io"},{name:"ANTIC",start:54272,size:16,type:"io"},{name:"POKEY",start:59392,size:16,type:"io"},{name:"ATARI Character Set",start:63488,size:1024,type:"rom"},{name:"ROM",start:64512,size:1024,type:"rom"}]}}}loadROM(t,e){this.started?(this.loadROMFile(e),this.loadRegion(":cartleft:cart:rom",e)):this.startModule(this.mainElement,{jsfile:"mame8bitws.js",biosfile:"a5200/5200.rom",cfgfile:"a5200.cfg",driver:"a5200",width:336*2,height:225*2,romfn:"/emulator/cart.rom",romdata:new Uint8Array(e),romsize:32768,preInit:function(s){}})}start(){}};function Ce(r){return r==null?".bin":r[0]==255&&r[1]==255?".xex":".rom"}function wt(){return"https://8bitworkshop.com/docs/platforms/atari8/"}I["atari8-800.xlmame"]=et;I["atari8-800xl.mame"]=et;I["atari8-5200.mame"]=Vt;I["atari8-800"]=J;I["atari8-5200"]=Kt; -//# sourceMappingURL=atari8-YJPSBKKM.js.map +//# sourceMappingURL=atari8-N6OQBLEH.js.map diff --git a/gen/atari8-YJPSBKKM.js.map b/gen/atari8-N6OQBLEH.js.map similarity index 100% rename from gen/atari8-YJPSBKKM.js.map rename to gen/atari8-N6OQBLEH.js.map diff --git a/gen/basic-35NRKUG4.js b/gen/basic-EQ2C5OAK.js similarity index 98% rename from gen/basic-35NRKUG4.js rename to gen/basic-EQ2C5OAK.js index dc14468a..2a27badf 100644 --- a/gen/basic-35NRKUG4.js +++ b/gen/basic-EQ2C5OAK.js @@ -1,4 +1,4 @@ -import{b as v}from"./chunk-3XE5YOCV.js";import{a as d,o as S}from"./chunk-FULWX6T7.js";import"./chunk-SDBJC2RS.js";import"./chunk-XMPGMPQ4.js";import"./chunk-LBWPHUUP.js";import"./chunk-GKVIY6GD.js";import{A as c,H as b,Q as g,R as f,a as p}from"./chunk-YL2YTMD7.js";import"./chunk-RQFURXHW.js";function O(o){return o.value!=null}function E(o){return o.name!=null}function N(o){return o.op!=null&&o.left!=null&&o.right!=null}function I(o){return o.op!=null&&o.expr!=null}var y=class{randomize(){this.seed(Math.random()*2147483647,Math.random()*2147483647,Math.random()*2147483647,Math.random()*2147483647)}constructor(){(()=>{var r,e,i,n;this.seed=function(s,a,u,h){r=s,e=a,i=u,n=h},this.seedfloat=function(s){this.seed(s,s*4294,s*429496,s*4294967296),this.next(),this.next(),this.next()},this.next=function(){r>>>=0,e>>>=0,i>>>=0,n>>>=0;var s=r+e|0;return r=e^e>>>9,e=i+(i<<3)|0,i=i<<21|i>>>11,n=n+1|0,s=s+n|0,i=i+s|0,(s>>>0)/4294967296}})(),this.seedfloat(-1)}},L=1024*1024,l=class{constructor(){this.margin=80;this.running=!1;this.exited=!0;this.trace=!1}load(t){let r=null,e=0;if(this.pc2label!=null){let s=this.curpc;for(;s>0&&(r=this.pc2label.get(s))==null;)s--;e=this.curpc-s,console.log("oldpc=",this.curpc,"restart @ label",r,"+",e)}this.program=t,this.opts=t.opts,this.opts.maxArrayElements||(this.opts.maxArrayElements=L),this.allstmts=t.stmts,this.label2pc=t.labels,this.label2dataptr={},this.pc2label=new Map,this.datums=[],this.subroutines={},this.builtins=this.getBuiltinFunctions();for(var i in t.labels){var n=t.labels[i];this.pc2label.set(n,i)}return this.allstmts.forEach((s,a)=>{this.curpc=a+1,this.compileStatement(s),s.command=="DATA"&&(this.label2dataptr[s.$loc.label]=this.datums.length,s.datums.forEach(u=>{this.curpc=s.$loc.offset,this.datums.push(u)}))}),this.label2pc[r]!=null?(this.curpc=this.label2pc[r]+e,!0):(this.curpc=0,!1)}reset(){this.curpc=0,this.dataptr=0,this.clearVars(),this.returnStack=[],this.column=0,this.running=!0,this.exited=!1}clearVars(){this.globals=this.vars={},this.arrays={},this.defs={},this.forLoops={},this.forLoopStack=[],this.whileLoops=[],this.rng=new y,this.opts&&this.opts.staticArrays&&this.allstmts.filter(t=>t.command=="DIM").forEach(t=>{t.args.forEach(r=>this.compileJS(this._DIM(r))())})}saveState(){return $.extend(!0,{},this)}loadState(t){$.extend(!0,this,t)}getBuiltinFunctions(){var t=this.program&&this.opts.validFunctions;t||(t=Object.getOwnPropertyNames(l.prototype).filter(i=>/^[A-Z]{3,}[$]?$/.test(i)));var r={};for(var e of t)this.supportsFunction(e)&&(r[e]=this[e].bind(this));return r}supportsFunction(t){return typeof this[t]=="function"}runtimeError(t){throw this.curpc--,new g(t,this.getCurrentSourceLocation())}dialectError(t){this.runtimeError(`I can't ${t} in this dialect of BASIC.`)}getLineForPC(t){var r=this.allstmts[t];return r&&r.$loc&&r.$loc.line}getLabelForPC(t){var r=this.allstmts[t];return r&&r.$loc&&r.$loc.label}getCurrentSourceLocation(){var t=this.getStatement();return t&&t.$loc}getCurrentLabel(){var t=this.getCurrentSourceLocation();return t&&t.label}getStatement(){return this.allstmts[this.curpc]}step(){if(!this.running)return!1;var t=this.getStatement();return t?(this.trace&&console.log(this.curpc,t,this.vars,Object.keys(this.arrays)),this.curpc++,this.executeStatement(t),this.running):(this.running=!1,this.exited=!0,!1)}compileStatement(t){if(t.$run==null)try{var r=this["do__"+t.command];r==null&&this.runtimeError(`I don't know how to "${t.command}".`);var e=r.bind(this)(t);this.trace&&console.log(e),t.$run=this.compileJS(e)}catch(i){throw e&&console.log(e),i}}compileJS(t){return new Function(t).bind(this)}executeStatement(t){this.compileStatement(t),t.$run()}skipToEOL(){do this.curpc++;while(this.curpc=0?this.curpc=r:this.runtimeError(`I tried to go to the label "${t}" but couldn't find it.`)}newLocalScope(){this.vars=Object.create(this.vars)}popLocalScope(){this.vars!==this.globals&&(this.vars=Object.getPrototypeOf(this.vars))}gosubLabel(t){this.returnStack.length>32767&&this.runtimeError("I did too many GOSUBs without a RETURN."),this.returnStack.push(this.curpc),this.gotoLabel(t)}returnFromGosub(){this.returnStack.length==0&&this.runtimeError("I tried to RETURN, but there wasn't a corresponding GOSUB.");var t=this.returnStack.pop();this.curpc=t,this.popLocalScope()}popReturnStack(){this.returnStack.length==0&&this.runtimeError("I tried to POP, but there wasn't a corresponding GOSUB."),this.returnStack.pop()}valueToString(t,r){var e;if(typeof t=="number"){var i=this.float2str(t,this.opts.printZoneLength-4);return r?i.startsWith("-")?`${i} `:` ${i} `:i}else if(t==` +import{b as v}from"./chunk-3XE5YOCV.js";import{a as d,o as S}from"./chunk-WCTN4OWB.js";import"./chunk-SDBJC2RS.js";import"./chunk-XMPGMPQ4.js";import"./chunk-B7KJX6SS.js";import"./chunk-6UU4KLMR.js";import{A as c,H as b,Q as g,R as f,a as p}from"./chunk-7LTJUW24.js";import"./chunk-RQFURXHW.js";function O(o){return o.value!=null}function E(o){return o.name!=null}function N(o){return o.op!=null&&o.left!=null&&o.right!=null}function I(o){return o.op!=null&&o.expr!=null}var y=class{randomize(){this.seed(Math.random()*2147483647,Math.random()*2147483647,Math.random()*2147483647,Math.random()*2147483647)}constructor(){(()=>{var r,e,i,n;this.seed=function(s,a,u,h){r=s,e=a,i=u,n=h},this.seedfloat=function(s){this.seed(s,s*4294,s*429496,s*4294967296),this.next(),this.next(),this.next()},this.next=function(){r>>>=0,e>>>=0,i>>>=0,n>>>=0;var s=r+e|0;return r=e^e>>>9,e=i+(i<<3)|0,i=i<<21|i>>>11,n=n+1|0,s=s+n|0,i=i+s|0,(s>>>0)/4294967296}})(),this.seedfloat(-1)}},L=1024*1024,l=class{constructor(){this.margin=80;this.running=!1;this.exited=!0;this.trace=!1}load(t){let r=null,e=0;if(this.pc2label!=null){let s=this.curpc;for(;s>0&&(r=this.pc2label.get(s))==null;)s--;e=this.curpc-s,console.log("oldpc=",this.curpc,"restart @ label",r,"+",e)}this.program=t,this.opts=t.opts,this.opts.maxArrayElements||(this.opts.maxArrayElements=L),this.allstmts=t.stmts,this.label2pc=t.labels,this.label2dataptr={},this.pc2label=new Map,this.datums=[],this.subroutines={},this.builtins=this.getBuiltinFunctions();for(var i in t.labels){var n=t.labels[i];this.pc2label.set(n,i)}return this.allstmts.forEach((s,a)=>{this.curpc=a+1,this.compileStatement(s),s.command=="DATA"&&(this.label2dataptr[s.$loc.label]=this.datums.length,s.datums.forEach(u=>{this.curpc=s.$loc.offset,this.datums.push(u)}))}),this.label2pc[r]!=null?(this.curpc=this.label2pc[r]+e,!0):(this.curpc=0,!1)}reset(){this.curpc=0,this.dataptr=0,this.clearVars(),this.returnStack=[],this.column=0,this.running=!0,this.exited=!1}clearVars(){this.globals=this.vars={},this.arrays={},this.defs={},this.forLoops={},this.forLoopStack=[],this.whileLoops=[],this.rng=new y,this.opts&&this.opts.staticArrays&&this.allstmts.filter(t=>t.command=="DIM").forEach(t=>{t.args.forEach(r=>this.compileJS(this._DIM(r))())})}saveState(){return $.extend(!0,{},this)}loadState(t){$.extend(!0,this,t)}getBuiltinFunctions(){var t=this.program&&this.opts.validFunctions;t||(t=Object.getOwnPropertyNames(l.prototype).filter(i=>/^[A-Z]{3,}[$]?$/.test(i)));var r={};for(var e of t)this.supportsFunction(e)&&(r[e]=this[e].bind(this));return r}supportsFunction(t){return typeof this[t]=="function"}runtimeError(t){throw this.curpc--,new g(t,this.getCurrentSourceLocation())}dialectError(t){this.runtimeError(`I can't ${t} in this dialect of BASIC.`)}getLineForPC(t){var r=this.allstmts[t];return r&&r.$loc&&r.$loc.line}getLabelForPC(t){var r=this.allstmts[t];return r&&r.$loc&&r.$loc.label}getCurrentSourceLocation(){var t=this.getStatement();return t&&t.$loc}getCurrentLabel(){var t=this.getCurrentSourceLocation();return t&&t.label}getStatement(){return this.allstmts[this.curpc]}step(){if(!this.running)return!1;var t=this.getStatement();return t?(this.trace&&console.log(this.curpc,t,this.vars,Object.keys(this.arrays)),this.curpc++,this.executeStatement(t),this.running):(this.running=!1,this.exited=!0,!1)}compileStatement(t){if(t.$run==null)try{var r=this["do__"+t.command];r==null&&this.runtimeError(`I don't know how to "${t.command}".`);var e=r.bind(this)(t);this.trace&&console.log(e),t.$run=this.compileJS(e)}catch(i){throw e&&console.log(e),i}}compileJS(t){return new Function(t).bind(this)}executeStatement(t){this.compileStatement(t),t.$run()}skipToEOL(){do this.curpc++;while(this.curpc=0?this.curpc=r:this.runtimeError(`I tried to go to the label "${t}" but couldn't find it.`)}newLocalScope(){this.vars=Object.create(this.vars)}popLocalScope(){this.vars!==this.globals&&(this.vars=Object.getPrototypeOf(this.vars))}gosubLabel(t){this.returnStack.length>32767&&this.runtimeError("I did too many GOSUBs without a RETURN."),this.returnStack.push(this.curpc),this.gotoLabel(t)}returnFromGosub(){this.returnStack.length==0&&this.runtimeError("I tried to RETURN, but there wasn't a corresponding GOSUB.");var t=this.returnStack.pop();this.curpc=t,this.popLocalScope()}popReturnStack(){this.returnStack.length==0&&this.runtimeError("I tried to POP, but there wasn't a corresponding GOSUB."),this.returnStack.pop()}valueToString(t,r){var e;if(typeof t=="number"){var i=this.float2str(t,this.opts.printZoneLength-4);return r?i.startsWith("-")?`${i} `:` ${i} `:i}else if(t==` `)this.column=0,e=t;else if(t==" "){var n=this.opts.printZoneLength,s=Math.floor(this.column/n),a=(s+1)*this.opts.printZoneLength;a+n>this.margin?(this.column=0,e=` `):e=this.TAB(a)}else e=`${t}`;return e}float2str(t,r){var e=t.toString().toUpperCase();if(r>0){for(var i=r;e.length>r;)e=t.toPrecision(i--);e.startsWith("0.")?e=e.substr(1):e.startsWith("-0.")&&(e="-"+e.substr(2))}return e}printExpr(t){var r=this.valueToString(t,this.opts.numericPadding);this.column+=r.length,this.print(r)}print(t){console.log(t)}async input(t,r){return{line:"",vals:[]}}resume(){}expr2js(t,r){if(r||(r={}),O(t))return JSON.stringify(t.value);if(E(t)){if(!t.args&&r.locals&&r.locals.indexOf(t.name)>=0)return t.name;{r.isconst&&this.runtimeError("I expected a constant value here.");var e="",i=JSON.stringify(t.name);let u=t.args?t.args.map(h=>this.expr2js(h,r)).join(", "):[];return t.name.startsWith("FN")?e+=`this.getDef(${i})(${u})`:this.builtins[t.name]?(this.checkFuncArgs(t,this.builtins[t.name]),e+=`this.builtins.${t.name}(${u})`):t.args?this.opts.arraysContainChars&&t.name.endsWith("$")?e+=`this.getStringSlice(this.vars.${t.name}, ${u})`:e+=`this.arrayGet(${i}, ${u})`:e+=`this.vars.${t.name}`,r.novalid?e:`this.checkValue(${e}, ${i})`}}else if(N(t)){var n=this.expr2js(t.left,r),s=this.expr2js(t.right,r);return`this.${t.op}(${n}, ${s})`}else if(I(t)){var a=this.expr2js(t.expr,r);return`this.${t.op}(${a})`}}assign2js(t,r){r||(r={});var e="";return(t.name.startsWith("FN")||this.builtins[t.name])&&this.runtimeError("I can't call a function here."),t.args?this.opts.arraysContainChars&&t.name.endsWith("$")?this.runtimeError("I can't set array slices via this command yet."):e+=this.array2js(t,r):e=`this.globals.${t.name}`,e}array2js(t,r){var e=JSON.stringify(t.name),i=t.args||[];return this.expr2js(t,{novalid:!0})+`;this.getArray(${e}, ${i.length})`+i.map(n=>"[this.ROUND("+this.expr2js(n,r)+")]").join("")}checkFuncArgs(t,r){var e=t.args?t.args.length:0;t.name=="RND"&&e==0||t.name=="MID$"&&e==2||t.name=="INSTR"&&e==2||r.length!=e&&this.runtimeError(`I expected ${r.length} arguments for the ${t.name} function, but I got ${e}.`)}startForLoop(t,r,e,i,n){var s=this.curpc-1,a=this.pc2label.get(s);i||(i=1),this.vars[t]=r,this.trace&&console.log(`FOR ${t} = ${r} TO ${e} STEP ${i}`);var u=()=>i>=0?this.vars[t]>e:this.vars[t]h==t)),this.forLoopStack.push(t),this.forLoops[t]={$next:h=>{h&&t!=h&&this.runtimeError(`I executed NEXT "${h}", but the last FOR was for "${t}".`),this.vars[t]+=i;var m=u();m?(this.forLoopStack.pop(),delete this.forLoops[t]):this.curpc=(a!=null&&this.label2pc[a]||s)+1,this.trace&&console.log(`NEXT ${t}: ${this.vars[t]} TO ${e} STEP ${i} DONE=${m}`)}}}nextForLoop(t){var r=this.forLoops[t||this.opts.optionalNextVar&&this.forLoopStack[this.forLoopStack.length-1]];r||this.runtimeError("I couldn't find a matching FOR for this NEXT."),r.$next(t)}whileLoop(t){t?this.whileLoops.push(this.curpc-1):this.skipToAfterWend()}nextWhileLoop(){var t=this.whileLoops.pop();t==null?this.runtimeError("I couldn't find a matching WHILE for this WEND."):this.curpc=t}assign(t,r,e){return e&&t.endsWith("$")?this.checkValue(this.convert(t,r),t):t.endsWith("$")?this.convertToString(r,t):this.convertToNumber(r,t)}convert(t,r){return t.endsWith("$")?r==null?"":r.toString():typeof r=="number"?r:parseFloat(r+"")}convertToString(t,r){if(typeof t!="string")this.runtimeError(`I can't convert ${t} to a string.`);else return t}convertToNumber(t,r){if(typeof t!="number")this.runtimeError(`I can't convert ${t} to a number.`);else return this.checkNum(t)}dimArray(t,...r){if(r=r.map(Math.round),this.arrays[t]!=null){if(this.opts.staticArrays)return;this.runtimeError(`I already dimensioned this array (${t}) earlier.`)}var e=this.getTotalArrayLength(r);e>this.opts.maxArrayElements&&this.runtimeError("I can't create an array with this many elements.");var i=t.endsWith("$"),n=i?Array:Float64Array;if(r.length==1)this.arrays[t]=new n(r[0]+1);else if(r.length==2){this.arrays[t]=new Array(r[0]+1);for(var s=0;s=i.length&&this.runtimeError(`I tried to lookup ${t}(${r}) but it exceeded the dimensions of the array.`),i=i[r[n]]}return c(i)&&this.runtimeError(`I tried to lookup ${t}(${r}) but used too few dimensions.`),i}modifyStringSlice(t,r,e,i){return t=t||"",this.checkString(t),this.checkString(r),i||(i=e),e=this.ROUND(e),i=this.ROUND(i),e<1&&this.dialectError("accept a string slice index less than 1"),ir.length)&&this.runtimeError(`I needed a number between 1 and ${r.length}, but I got ${t}.`),t<1||t>r.length?0:t}onGotoLabel(t,...r){t=this.checkOnGoto(t,r),t&&this.gotoLabel(r[t-1])}onGosubLabel(t,...r){t=this.checkOnGoto(t,r),t&&this.gosubLabel(r[t-1])}nextDatum(){return this.dataptr>=this.datums.length&&this.runtimeError("I tried to READ, but ran out of data."),this.datums[this.dataptr++].value}do__PRINT(t){var r="";for(var e of t.args){var i=this.expr2js(e),n=i.name;r+=`this.printExpr(this.checkValue(${i}, ${JSON.stringify(n)}));`}return r}preInput(){this.running=!1,this.curpc--}postInput(t){t&&this.curpc++,this.running=!0,this.resume()}do__INPUT(t){var r=t.prompt!=null?this.expr2js(t.prompt):'""',e=t.elapsed!=null?this.assign2js(t.elapsed):"let ___",i="";return t.args.forEach((n,s)=>{var a=this.assign2js(n);i+=` var value = this.convert(${JSON.stringify(n.name)}, response.vals[${s}]); @@ -34,4 +34,4 @@ import{b as v}from"./chunk-3XE5YOCV.js";import{a as d,o as S}from"./chunk-FULWX6 `),this.tty.addtext("*** END OF PROGRAM ***",1),this.tty.showPrintHead(!1)}loadROM(t,r){var e=this.runtime.exited;this.program=r;var i=this.runtime.load(r);this.tty.uppercaseOnly=!0,d.input=this.program.opts.uppercaseOnly?n=>n.toUpperCase():null,(!this.hotReload||e||!i)&&this.reset()}getROMExtension(){return".json"}reset(){this.tty.clear(),this.runtime.reset(),this.clock=0,this.transcript=[]}pause(){this.timer.stop()}resume(){this.isBlocked()||(this.animcount=0,this.timer.start())}isBlocked(){return this.tty.waitingfor!=null||this.runtime.exited}isRunning(){return this.timer.isRunning()}getDefaultExtension(){return".bas"}getToolForFilename(){return"basic"}getPresets(){return T}getPC(){return this.runtime.curpc}getSP(){return 4096-this.runtime.returnStack.length}isStable(){return!0}getCPUState(){return{PC:this.getPC(),SP:this.getSP()}}saveState(){return{c:this.getCPUState(),rt:this.runtime.saveState()}}loadState(t){this.runtime.loadState(t)}getDebugTree(){return{CurrentLine:this.runtime.getCurrentLabel(),Variables:this.runtime.vars,Arrays:this.runtime.arrays,Functions:this.runtime.defs,ForLoops:this.runtime.forLoops,WhileLoops:this.runtime.whileLoops,ReturnStack:this.runtime.returnStack,NextDatum:this.runtime.datums[this.runtime.dataptr],Clock:this.clock,Options:this.runtime.opts,Internals:this.runtime}}inspect(t){let r=this.runtime.vars[t];if(r!=null)return`${t} = ${r}`}showHelp(){return"https://8bitworkshop.com/docs/platforms/basic/"}getDebugCategories(){return["Variables"]}getDebugInfo(t,r){switch(t){case"Variables":return this.varsToLongString()}}varsToLongString(){var t="",r=Object.keys(this.runtime.vars);r.sort();for(var e of r){var i=this.runtime.vars[e],n=JSON.stringify(i);n.length>24&&(n=`${n.substr(0,24)}...(${n.length})`),t+=p(e,3)+" = "+n+` `}return t}setupDebug(t){this.onBreakpointHit=t}clearDebug(){this.onBreakpointHit=null,this.debugTrap=null}checkDebugTrap(){return this.debugTrap&&this.debugTrap()?(this.pause(),this.break(),!0):!1}break(){this.onBreakpointHit&&this.onBreakpointHit(this.saveState())}step(){var t=this.clock;this.debugTrap=()=>this.clock>t,this.resume()}stepOver(){var t=this.runtime.getStatement();if(t&&(t.command=="GOSUB"||t.command=="ONGOSUB")){var r=this.getPC()+1;this.runEval(()=>this.getPC()==r)}else this.step()}runUntilReturn(){var t=this.getSP();this.runEval(()=>this.getSP()>t)}runEval(t){this.debugTrap=()=>t(this.getCPUState()),this.resume()}restartAtPC(t){return t=Math.round(t),t>=0&&t>1,m=this.height-n>>1,M=this.fgColor,g=this.bgColor,o=this.ram,P=this.nameTable,V=this.colorTable,C=this.charPatternTable,D=this.colorTableMask,H=this.patternTableMask,ce=this.spriteAttributeTable,ue=this.spritePatternTable,Z=(this.registers[1]&2)!=0,y=this.registers[1]&1,$=(Z?16:8)<<(y?1:0),j=this.flicker?4:32,J=this.palette,N=!1,Q=!1,Y=31,R,v,_,f,F,B,p;if(e>=m&&e208&&(k-=256),k++;var X=k+$,L=-1;if(U<8||!l)u>=k&&u=k&&K=64&&u<128&&u>=k&&u>y,pe=ue+(de<<3)+ge,E=0;E<$;E++){var G=te+E;if(G>=0&&G>y,Te=o[pe+(re>=8?16:0)];(Te&128>>(re&7))!=0&&(W[G]===0?W[G]=me+1:N=!0)}}}z++}A+=4}else ee=!0}z>4&&(Q=!0,Y=U)}var S=s?(u>>3)*40:u>>3<<5,x=u&7;for(R=0;R=d&&R>3)],B=o[V+(f>>3)],p=o[C+(f<<3)+x],v=(p&128>>(T&7))!=0?(B&240)>>4:B&15;break;case 2:f=o[P+S+(T>>3)],F=((u&192)<<5)+(f<<3),B=o[V+(F&D)+x],p=o[C+(F&H)+x],v=(p&128>>(T&7))!=0?(B&240)>>4:B&15;break;case 3:f=o[P+S+(T>>3)],x=(u&28)>>2,p=o[C+(f<<3)+x],v=(T&4)==0?(p&240)>>4:p&15;break;case 1:f=o[P+S+Math.floor(T/6)],p=o[C+(f<<3)+x],v=(p&128>>T%6)!=0?M:g;break;case 5:f=o[P+S+Math.floor(T/6)],F=((u&192)<<5)+(f<<3),p=o[C+(F&H)+x],v=(p&128>>T%6)!=0?M:g;break;case 6:f=o[P+S+(T>>3)],x=(u&28)>>2,F=((u&192)<<5)+(f<<3),p=o[C+(F&H)+x],v=(T&4)==0?(p&240)>>4:p&15;break;case 7:v=(T&4)==0?M:g;break}if(v===0&&(v=g),!s){var se=W[T]-1;se>0&&(v=se)}}else v=g;_=J[v],t[i++]=_}}else for(_=J[g],R=0;R>4,this.bgColor=this.registers[7]&15;break}}setVDPWriteCommand3(e){this.setVDPWriteRegister(e)}writeAddress(e){if(!this.latch)this.addressRegister=this.addressRegister&65280|e;else{switch((e&192)>>6){case 0:this.setReadAddress(e);break;case 1:this.setWriteAddress(e);break;case 2:this.setVDPWriteRegister(e);break;case 3:this.setVDPWriteCommand3(e);break}this.redrawRequired=!0}this.latch=!this.latch}updateMode(e,t){if(this.bitmapMode=(e&2)!=0,this.textMode=(t&16)!=0,this.bitmapMode)switch((t&24)>>3){case 0:this.screenMode=2;break;case 1:this.screenMode=6;break;case 2:this.screenMode=5;break;case 3:this.screenMode=7;break}else switch((t&24)>>3){case 0:this.screenMode=0;break;case 1:this.screenMode=3;break;case 2:this.screenMode=1;break;case 3:this.screenMode=7;break}this.bitmapMode?(this.colorTable=(this.registers[3]&128)<<6,this.charPatternTable=(this.registers[4]&4)<<11,this.updateTableMasks()):(this.colorTable=this.registers[3]<<6,this.charPatternTable=(this.registers[4]&7)<<11),this.nameTable=(this.registers[2]&15)<<10,this.spriteAttributeTable=(this.registers[5]&127)<<7,this.spritePatternTable=(this.registers[6]&7)<<11}updateTableMasks(){this.screenMode===2?(this.colorTableMask=(this.registers[3]&127)<<6|63,this.patternTableMask=(this.registers[4]&3)<<11|this.colorTableMask&2047):this.screenMode===5||this.screenMode===6?(this.colorTableMask=this.ramMask,this.patternTableMask=(this.registers[4]&3)<<11|2047):(this.colorTableMask=this.ramMask,this.patternTableMask=this.ramMask)}writeData(e){this.probe.logVRAMWrite(this.addressRegister,e),this.ram[this.addressRegister++]=e,this.prefetchByte=e,this.addressRegister&=this.ramMask,this.latch=!1,this.redrawRequired=!0}readStatus(){var e=this.statusRegister;return this.statusRegister=31,this.interruptsOn&&this.cru.setVDPInterrupt(!1),this.latch=!1,e}readData(){var e=this.prefetchByte;return this.prefetchByte=this.ram[this.addressRegister++],this.probe.logVRAMRead(this.addressRegister-1,this.prefetchByte),this.addressRegister&=this.ramMask,this.latch=!1,e}getRAM(){return this.ram}colorTableSize(){return this.screenMode===0?32:this.screenMode===2?Math.min(this.colorTableMask+1,6144):0}patternTableSize(){return this.bitmapMode?Math.min(this.patternTableMask+1,6144):2048}getDebugTables(){var e=[["Pattern Table",this.charPatternTable,this.patternTableSize()],["Name Table",this.nameTable,768],["Color Table",this.colorTable,this.colorTableSize()],["Sprite Patterns",this.spritePatternTable,64*32],["Sprite Attributes",this.spriteAttributeTable,4*32]];return e}getRegsString(){let e=20;for(var t="Registers:",r=0;r>1,m=this.height-n>>1,M=this.fgColor,g=this.bgColor,o=this.ram,P=this.nameTable,V=this.colorTable,C=this.charPatternTable,D=this.colorTableMask,H=this.patternTableMask,ce=this.spriteAttributeTable,ue=this.spritePatternTable,Z=(this.registers[1]&2)!=0,y=this.registers[1]&1,$=(Z?16:8)<<(y?1:0),j=this.flicker?4:32,J=this.palette,N=!1,Q=!1,Y=31,R,v,_,f,F,B,p;if(e>=m&&e208&&(k-=256),k++;var X=k+$,L=-1;if(U<8||!l)u>=k&&u=k&&K=64&&u<128&&u>=k&&u>y,pe=ue+(de<<3)+ge,E=0;E<$;E++){var G=te+E;if(G>=0&&G>y,Te=o[pe+(re>=8?16:0)];(Te&128>>(re&7))!=0&&(W[G]===0?W[G]=me+1:N=!0)}}}z++}A+=4}else ee=!0}z>4&&(Q=!0,Y=U)}var S=s?(u>>3)*40:u>>3<<5,x=u&7;for(R=0;R=d&&R>3)],B=o[V+(f>>3)],p=o[C+(f<<3)+x],v=(p&128>>(T&7))!=0?(B&240)>>4:B&15;break;case 2:f=o[P+S+(T>>3)],F=((u&192)<<5)+(f<<3),B=o[V+(F&D)+x],p=o[C+(F&H)+x],v=(p&128>>(T&7))!=0?(B&240)>>4:B&15;break;case 3:f=o[P+S+(T>>3)],x=(u&28)>>2,p=o[C+(f<<3)+x],v=(T&4)==0?(p&240)>>4:p&15;break;case 1:f=o[P+S+Math.floor(T/6)],p=o[C+(f<<3)+x],v=(p&128>>T%6)!=0?M:g;break;case 5:f=o[P+S+Math.floor(T/6)],F=((u&192)<<5)+(f<<3),p=o[C+(F&H)+x],v=(p&128>>T%6)!=0?M:g;break;case 6:f=o[P+S+(T>>3)],x=(u&28)>>2,F=((u&192)<<5)+(f<<3),p=o[C+(F&H)+x],v=(T&4)==0?(p&240)>>4:p&15;break;case 7:v=(T&4)==0?M:g;break}if(v===0&&(v=g),!s){var se=W[T]-1;se>0&&(v=se)}}else v=g;_=J[v],t[i++]=_}}else for(_=J[g],R=0;R>4,this.bgColor=this.registers[7]&15;break}}setVDPWriteCommand3(e){this.setVDPWriteRegister(e)}writeAddress(e){if(!this.latch)this.addressRegister=this.addressRegister&65280|e;else{switch((e&192)>>6){case 0:this.setReadAddress(e);break;case 1:this.setWriteAddress(e);break;case 2:this.setVDPWriteRegister(e);break;case 3:this.setVDPWriteCommand3(e);break}this.redrawRequired=!0}this.latch=!this.latch}updateMode(e,t){if(this.bitmapMode=(e&2)!=0,this.textMode=(t&16)!=0,this.bitmapMode)switch((t&24)>>3){case 0:this.screenMode=2;break;case 1:this.screenMode=6;break;case 2:this.screenMode=5;break;case 3:this.screenMode=7;break}else switch((t&24)>>3){case 0:this.screenMode=0;break;case 1:this.screenMode=3;break;case 2:this.screenMode=1;break;case 3:this.screenMode=7;break}this.bitmapMode?(this.colorTable=(this.registers[3]&128)<<6,this.charPatternTable=(this.registers[4]&4)<<11,this.updateTableMasks()):(this.colorTable=this.registers[3]<<6,this.charPatternTable=(this.registers[4]&7)<<11),this.nameTable=(this.registers[2]&15)<<10,this.spriteAttributeTable=(this.registers[5]&127)<<7,this.spritePatternTable=(this.registers[6]&7)<<11}updateTableMasks(){this.screenMode===2?(this.colorTableMask=(this.registers[3]&127)<<6|63,this.patternTableMask=(this.registers[4]&3)<<11|this.colorTableMask&2047):this.screenMode===5||this.screenMode===6?(this.colorTableMask=this.ramMask,this.patternTableMask=(this.registers[4]&3)<<11|2047):(this.colorTableMask=this.ramMask,this.patternTableMask=this.ramMask)}writeData(e){this.probe.logVRAMWrite(this.addressRegister,e),this.ram[this.addressRegister++]=e,this.prefetchByte=e,this.addressRegister&=this.ramMask,this.latch=!1,this.redrawRequired=!0}readStatus(){var e=this.statusRegister;return this.statusRegister=31,this.interruptsOn&&this.cru.setVDPInterrupt(!1),this.latch=!1,e}readData(){var e=this.prefetchByte;return this.prefetchByte=this.ram[this.addressRegister++],this.probe.logVRAMRead(this.addressRegister-1,this.prefetchByte),this.addressRegister&=this.ramMask,this.latch=!1,e}getRAM(){return this.ram}colorTableSize(){return this.screenMode===0?32:this.screenMode===2?Math.min(this.colorTableMask+1,6144):0}patternTableSize(){return this.bitmapMode?Math.min(this.patternTableMask+1,6144):2048}getDebugTables(){var e=[["Pattern Table",this.charPatternTable,this.patternTableSize()],["Name Table",this.nameTable,768],["Color Table",this.colorTable,this.colorTableSize()],["Sprite Patterns",this.spritePatternTable,64*32],["Sprite Attributes",this.spriteAttributeTable,4*32]];return e}getRegsString(){let e=20;for(var t="Registers:",r=0;r0&&(t+=I(h[0],e)+": $"+w(h[1],4)+" - $"+w(h[1]+h[2]-1,4)+` `);return t+=I("Address Register",e)+": $"+w(this.addressRegister,4)+` @@ -8,4 +8,4 @@ import{c as ae,k as he,n as ne,q as le}from"./chunk-GKVIY6GD.js";import{U as ie, `,this.ramMask!=16383&&(t+=I("RAM Mask",e)+": $"+w(this.ramMask)+` `),t}hexView(e,t,r){for(var i="",h=null,s=e,l=0,a=0;a>2&3)*85,(e>>4&3)*85),this.prefetchByte=e,this.addressRegister&=this.ramMask,this.redrawRequired=!0}else{var r=this.addressRegister;super.writeData(e),this.writeTwiddled(r,e)}this.latch=!1}writeTwiddled(e,t){for(var r=e&16380,i=r*2,h=this.ram[r],s=this.ram[r+1],l=this.ram[r+2],a=this.ram[r+3],n=0;n<8;++n){var d=7-n,m=h>>>d&1|(s>>>d&1)<<1|(l>>>d&1)<<2|(a>>>d&1)<<3;this.vramUntwiddled[i+n]=m}}getState(){var e=super.getState();return e.cram=this.cram.slice(0),e}restoreState(e){super.restoreState(e),this.cram.set(e.cram)}drawScanline(e){this.screenMode==4?this.rasterize_line(e):super.drawScanline(e)}findSprites(e){var t=this.spriteAttributeTable,r=[],i=8,h;for(this.registers[1]&2&&(i=16),h=0;h<64;h++){var s=this.ram[t+h];if(s===208)break;if(s>=240&&(s-=256),e>=s&&e=8)){a=!0;var P=e-M[2],V=h+M[1]*32+P*4,C=V*2+g,D=this.vramUntwiddled[C];if(D!==0){if(n){this.statusRegister|=32;break}this.fb32[t+(r+s-this.registers[8]&255)]=this.cpalette[16+D],n=!0}}}!a&&d>1&&(s+=d-1)}}border_clear(e,t){e=e|0,t=t|0;let r=16+(this.registers[7]&15),i=this.cpalette[r];this.fb32.fill(i,e,e+t)}rasterize_line(e){e|=0;var t=this.registers,r=256,i=this.numVisibleLines,h=this.width-r>>1,s=this.height-i>>1;let l=(e+s)*this.width|0,a=l+h|0;if(!this.displayOn||e<0||e>=i)e=262-s&&this.border_clear((e-262+s)*this.width,this.width);else{var n=e+t[9];n>=224&&(n-=224);let d=this.findSprites(e),m=t[0]&64&&e<16?0:t[8],M=this.nameTable+(n>>>3)*64,g=n&7;this.rasterize_background_line(a,m,M,g),this.rasterize_sprites(e,a,m,d),this.rasterize_foreground_line(a,m,M,g),this.border_clear(l,h),this.border_clear(a+256,h),t[0]&1<<5&&this.border_clear(a,8)}e==i&&(this.statusRegister|=128,this.interruptsOn&&this.cru.setVDPInterrupt(!0)),e<=i?this.lineCounter>0?this.lineCounter--:(this.lineCounter=this.registers[10],this.lineInterruptPending=!0):this.lineCounter=this.registers[10],this.lineInterruptPending&&this.registers[0]&16}getDebugTables(){if(this.screenMode==4){var e=[["Pattern Table",0,512*32],["Name Table",this.nameTable,32*32*2],["Sprite Attributes",this.spriteAttributeTable,256]];return e}else return super.getDebugTables()}},fe=class extends be{constructor(){super(...arguments);this.cram=new Uint8Array(64);this.cram_latch=0}writeData(e){if(this.writeToCRAM){if(this.addressRegister&1){let t=this.cram_latch+(e<<8),r=c((t&15)*17,(t>>4&15)*17,(t>>8&15)*17),i=this.addressRegister&this.cram.length-1;this.cram[i-1]=this.cram_latch,this.cram[i]=e,this.cpalette[i>>1]=r,this.prefetchByte=e,this.addressRegister&=this.ramMask,this.redrawRequired=!0}else this.cram_latch=e;this.addressRegister++}else super.writeData(e);this.latch=!1}};var oe=2,ve=class extends le{constructor(){super(...arguments);this.cpuFrequency=3579545;this.canvasWidth=304;this.numTotalScanlines=262;this.numVisibleScanlines=240;this.cpuCyclesPerLine=this.cpuFrequency/(262*60);this.sampleRate=262*60*oe;this.overscan=!0;this.cpu=new ae}getKeyboardFunction(){return null}init(e,t,r){this.connectCPUMemoryBus(e),this.connectCPUIOBus(t),this.handler=ie(this.inputs,this.getKeyboardMap(),this.getKeyboardFunction()),this.psg=r,this.audioadapter=r&&new he(r.psg,oe,this.sampleRate)}connectVideo(e){super.connectVideo(e);var t={setVDPInterrupt:r=>{r&&this.vdpInterrupt()}};this.vdp=this.newVDP(this.pixels,t,!0)}connectProbe(e){super.connectProbe(e),this.vdp.probe=e||this.nullProbe}newVDP(e,t,r){return new O(e,t,r)}startScanline(){this.audio&&this.audioadapter&&this.audioadapter.generate(this.audio)}drawScanline(){this.vdp.drawScanline(this.scanline)}loadState(e){super.loadState(e),this.vdp.restoreState(e.vdp)}saveState(){var e=super.saveState();return e.vdp=this.vdp.getState(),e}reset(){super.reset(),this.vdp.reset(),this.psg.reset()}getDebugCategories(){return["CPU","Stack","VDP"]}getDebugInfo(e,t){switch(e){case"VDP":return this.vdpStateToLongString(t.vdp)}}vdpStateToLongString(e){return this.vdp.getRegsString()}readVRAMAddress(e){return this.vdp.ram[e&16383]}};export{be as a,fe as b,ve as c}; -//# sourceMappingURL=chunk-ASAEALE3.js.map +//# sourceMappingURL=chunk-2M7BD3S5.js.map diff --git a/gen/chunk-ASAEALE3.js.map b/gen/chunk-2M7BD3S5.js.map similarity index 100% rename from gen/chunk-ASAEALE3.js.map rename to gen/chunk-2M7BD3S5.js.map diff --git a/gen/chunk-36G23HSA.js b/gen/chunk-36G23HSA.js deleted file mode 100644 index b3ff25e5..00000000 --- a/gen/chunk-36G23HSA.js +++ /dev/null @@ -1,2 +0,0 @@ -import{c as _,g as i}from"./chunk-YL2YTMD7.js";var p=[[{N:0},{N:1}],[{N:1},{N:0}],[{V:0},{V:1}],[{V:1},{V:0}],[{C:0},{C:1}],[{C:1},{C:0}],[{Z:0},{Z:1}],[{Z:1},{Z:0}]];function d(C,e){if(C==null||e==null)return null;for(var s in C)if(e[s]!=="undefined")return C[s]==e[s];for(var s in e)if(C[s]!=="undefined")return C[s]==e[s];return null}var S=class{constructor(e){this.pc2minclocks={};this.pc2maxclocks={};this.jsrresult={};this.MAX_CYCLES=2e3;this.platform=e}getClockCountsAtPC(e){var s=this.platform.readAddress(e),t=this.platform.getOpcodeMetadata(s,e);return t}traceInstructions(e,s,t,n,o){this.WRAP_CLOCKS&&(this.pc2minclocks[e]!==void 0&&(s=Math.min(s,this.pc2minclocks[e])),this.pc2maxclocks[e]!==void 0&&(t=Math.max(t,this.pc2maxclocks[e]))),o||(o={});for(var c=!0,x=!1,L=0;c&&!x;L++){if(L>=this.MAX_CYCLES){console.log("too many cycles @",i(e),"routine",i(n));break}c=!1,this.WRAP_CLOCKS&&s>=this.MAX_CLOCKS?(s=s%this.MAX_CLOCKS,t=t%this.MAX_CLOCKS):(s=Math.min(this.MAX_CLOCKS,s),t=Math.min(this.MAX_CLOCKS,t));var r=this.getClockCountsAtPC(e),l=this.platform.readAddress(e+1),m=this.platform.readAddress(e+2),u=l+(m<<8),f=e;if(s>=this.pc2minclocks[f]||(this.pc2minclocks[f]=s,c=!0),t<=this.pc2maxclocks[f]||(this.pc2maxclocks[f]=t,c=!0),!r.insnlength){console.log("Illegal instruction!",i(e),i(r.opcode),r);break}e+=r.insnlength;var A=o;switch(o=null,r.opcode){case 25:case 29:case 57:case 61:case 89:case 93:case 121:case 125:case 153:case 157:case 169:case 173:case 185:case 189:case 188:case 190:case 217:case 221:case 249:case 253:l==0&&(r.maxCycles-=1);break;case 133:l==2&&(s=t=0,r.minCycles=r.maxCycles=0);break;case 44:l==2&&m==32&&(s=0,t=4,r.minCycles=r.maxCycles=0);break;case 32:s+=r.minCycles,t+=r.maxCycles,this.traceInstructions(u,s,t,u,o);var a=this.jsrresult[u];a?(s=a.minclocks,t=a.maxclocks):(console.log("No JSR result!",i(e),i(u)),s=t);break;case 76:e=u;break;case 64:x=!0;break;case 96:if(n){var a=this.jsrresult[n];a?a={minclocks:Math.min(s,a.minclocks),maxclocks:Math.max(t,a.maxclocks)}:a={minclocks:s,maxclocks:t},this.jsrresult[n]=a,console.log("RTS",i(e),i(n),this.jsrresult[n])}return;case 16:case 48:case 80:case 112:case 144:case 176:case 208:case 240:var O=e+_(l),y=e>>8!=O>>8;y||r.maxCycles--;var h=p[Math.floor((r.opcode-16)/32)],b=d(A,h[0]),K=d(A,h[1]);this.traceInstructions(O,s+r.maxCycles,t+r.maxCycles,n,h[0]),K===!1&&(console.log("branch always taken",i(e),A,h[1]),x=!0),o=h[1],r.maxCycles=r.minCycles;break;case 108:console.log("Instruction not supported!",i(e),i(r.opcode),r);return}s+=r.minCycles,t+=r.maxCycles}}showLoopTimingForPC(e){this.pc2minclocks={},this.pc2maxclocks={},this.jsrresult={},this.traceInstructions(e|this.platform.getOriginPC(),this.START_CLOCKS,this.MAX_CLOCKS,0,{})}},M=class extends S{constructor(e){super(e);this.MAX_CLOCKS=this.START_CLOCKS=76*4,this.WRAP_CLOCKS=!1}},v=class extends S{constructor(e){super(e);this.MAX_CLOCKS=114,this.START_CLOCKS=0,this.WRAP_CLOCKS=!0}};export{M as a,v as b}; -//# sourceMappingURL=chunk-36G23HSA.js.map diff --git a/gen/chunk-36G23HSA.js.map b/gen/chunk-36G23HSA.js.map deleted file mode 100644 index d194842a..00000000 --- a/gen/chunk-36G23HSA.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/common/analysis.ts"], - "sourcesContent": ["\nimport { hex, byte2signed } from \"./util\";\nimport { Platform } from \"./baseplatform\";\n\nexport interface CodeAnalyzer {\n showLoopTimingForPC(pc:number);\n pc2minclocks : {[key:number]:number};\n pc2maxclocks : {[key:number]:number};\n MAX_CLOCKS : number;\n}\n\n/// VCS TIMING ANALYSIS\n\n// [taken, not taken]\nconst BRANCH_CONSTRAINTS = [\n [{N:0},{N:1}],\n [{N:1},{N:0}],\n [{V:0},{V:1}],\n [{V:1},{V:0}],\n [{C:0},{C:1}],\n [{C:1},{C:0}],\n [{Z:0},{Z:1}],\n [{Z:1},{Z:0}]\n];\n\nfunction constraintEquals(a,b) {\n if (a == null || b == null)\n return null;\n for (var n in a) {\n if (b[n] !== 'undefined')\n return a[n] == b[n];\n }\n for (var n in b) {\n if (a[n] !== 'undefined')\n return a[n] == b[n];\n }\n return null;\n}\n\nabstract class CodeAnalyzer6502 implements CodeAnalyzer {\n pc2minclocks = {};\n pc2maxclocks = {};\n START_CLOCKS : number;\n MAX_CLOCKS : number;\n WRAP_CLOCKS : boolean;\n jsrresult = {};\n platform : Platform;\n MAX_CYCLES : number = 2000;\n \n constructor(platform : Platform) {\n this.platform = platform;\n }\n\n getClockCountsAtPC(pc) {\n var opcode = this.platform.readAddress(pc);\n var meta = this.platform.getOpcodeMetadata(opcode, pc);\n return meta; // minCycles, maxCycles\n }\n\n traceInstructions(pc:number, minclocks:number, maxclocks:number, subaddr:number, constraints) {\n if (this.WRAP_CLOCKS) {\n if (this.pc2minclocks[pc] !== undefined)\n minclocks = Math.min(minclocks, this.pc2minclocks[pc]);\n if (this.pc2maxclocks[pc] !== undefined)\n maxclocks = Math.max(maxclocks, this.pc2maxclocks[pc]);\n }\n //console.log(\"trace\", hex(pc), minclocks, maxclocks);\n if (!constraints) constraints = {};\n var modified = true;\n var abort = false;\n for (var i=0; modified && !abort; i++) {\n if (i >= this.MAX_CYCLES) {\n console.log(\"too many cycles @\", hex(pc), \"routine\", hex(subaddr));\n break;\n }\n modified = false;\n if (this.WRAP_CLOCKS && minclocks >= this.MAX_CLOCKS) {\n // wrap clocks\n minclocks = minclocks % this.MAX_CLOCKS;\n maxclocks = maxclocks % this.MAX_CLOCKS;\n } else {\n // truncate clocks\n minclocks = Math.min(this.MAX_CLOCKS, minclocks);\n maxclocks = Math.min(this.MAX_CLOCKS, maxclocks);\n }\n var meta = this.getClockCountsAtPC(pc);\n var lob = this.platform.readAddress(pc+1);\n var hib = this.platform.readAddress(pc+2);\n var addr = lob + (hib << 8);\n var pc0 = pc;\n if (!(minclocks >= this.pc2minclocks[pc0])) {\n this.pc2minclocks[pc0] = minclocks;\n modified = true;\n }\n if (!(maxclocks <= this.pc2maxclocks[pc0])) {\n this.pc2maxclocks[pc0] = maxclocks;\n modified = true;\n }\n //console.log(hex(pc),minclocks,maxclocks,modified,meta,constraints);\n if (!meta.insnlength) {\n console.log(\"Illegal instruction!\", hex(pc), hex(meta.opcode), meta);\n break;\n }\n pc += meta.insnlength;\n var oldconstraints = constraints;\n constraints = null;\n // TODO: if jump to zero-page, maybe assume RTS?\n switch (meta.opcode) {\n case 0x19: case 0x1d:\n case 0x39: case 0x3d:\n case 0x59: case 0x5d:\n case 0x79: case 0x7d:\n case 0x99: case 0x9d:\n case 0xa9: case 0xad:\n case 0xb9: case 0xbd: case 0xbc: case 0xbe:\n case 0xd9: case 0xdd:\n case 0xf9: case 0xfd:\n if (lob == 0)\n meta.maxCycles -= 1; // no page boundary crossed\n break;\n // TODO: only VCS\n case 0x85:\n if (lob == 0x2) { // STA WSYNC\n minclocks = maxclocks = 0;\n meta.minCycles = meta.maxCycles = 0;\n }\n break;\n // TODO: only NES (sprite 0 poll)\n case 0x2c:\n if (lob == 0x02 && hib == 0x20) { // BIT $2002\n minclocks = 0;\n maxclocks = 4; // uncertainty b/c of assumed branch poll\n meta.minCycles = meta.maxCycles = 0;\n }\n break;\n // TODO: only Apple2 (vapor lock)\n /*\n case 0xad:\n if (lob == 0x61 && hib == 0xc0) { // LDA $C061\n minclocks = 0;\n maxclocks = 4; // uncertainty?\n meta.minCycles = meta.maxCycles = 0;\n }\n break;\n */\n case 0x20: // JSR\n // TODO: handle bare RTS case\n minclocks += meta.minCycles;\n maxclocks += meta.maxCycles;\n this.traceInstructions(addr, minclocks, maxclocks, addr, constraints);\n var result = this.jsrresult[addr];\n if (result) {\n minclocks = result.minclocks;\n maxclocks = result.maxclocks;\n } else {\n console.log(\"No JSR result!\", hex(pc), hex(addr));\n minclocks = maxclocks;\n //return;\n }\n break;\n case 0x4c: // JMP\n pc = addr; // TODO: make sure in ROM space\n break;\n case 0x40: // RTI\n abort = true;\n break;\n case 0x60: // RTS\n if (subaddr) { // TODO: 0 doesn't work\n // TODO: combine with previous result\n var result = this.jsrresult[subaddr];\n if (!result) {\n result = {minclocks:minclocks, maxclocks:maxclocks};\n } else {\n result = {\n minclocks:Math.min(minclocks,result.minclocks),\n maxclocks:Math.max(maxclocks,result.maxclocks)\n }\n }\n this.jsrresult[subaddr] = result;\n console.log(\"RTS\", hex(pc), hex(subaddr), this.jsrresult[subaddr]);\n }\n return;\n case 0x10: case 0x30: // branch\n case 0x50: case 0x70:\n case 0x90: case 0xB0:\n case 0xD0: case 0xF0:\n var newpc = pc + byte2signed(lob);\n var crosspage = (pc>>8) != (newpc>>8);\n if (!crosspage) meta.maxCycles--;\n // TODO: other instructions might modify flags too\n var cons = BRANCH_CONSTRAINTS[Math.floor((meta.opcode-0x10)/0x20)];\n var cons0 = constraintEquals(oldconstraints, cons[0]);\n var cons1 = constraintEquals(oldconstraints, cons[1]);\n // recursively trace the taken branch\n if (true || cons0 !== false) { // TODO?\n this.traceInstructions(newpc, minclocks+meta.maxCycles, maxclocks+meta.maxCycles, subaddr, cons[0]);\n }\n // abort if we will always take the branch\n if (cons1 === false) {\n console.log(\"branch always taken\", hex(pc), oldconstraints, cons[1]);\n abort = true;\n }\n constraints = cons[1]; // not taken\n meta.maxCycles = meta.minCycles; // branch not taken, no extra clock(s)\n break;\n case 0x6c:\n console.log(\"Instruction not supported!\", hex(pc), hex(meta.opcode), meta); // TODO\n return;\n }\n // add min/max instruction time to min/max clocks bound\n minclocks += meta.minCycles;\n maxclocks += meta.maxCycles;\n }\n }\n\n showLoopTimingForPC(pc:number) {\n this.pc2minclocks = {};\n this.pc2maxclocks = {};\n this.jsrresult = {};\n // recurse through all traces\n this.traceInstructions(pc | this.platform.getOriginPC(), this.START_CLOCKS, this.MAX_CLOCKS, 0, {});\n }\n}\n\n// 76 cycles * 2 (support two scanline kernels)\nexport class CodeAnalyzer_vcs extends CodeAnalyzer6502 {\n constructor(platform : Platform) {\n super(platform);\n this.MAX_CLOCKS = this.START_CLOCKS = 76*4; // 4 scanlines\n this.WRAP_CLOCKS = false;\n }\n}\n\n// https://wiki.nesdev.com/w/index.php/PPU_rendering#Line-by-line_timing\n// TODO: sprite 0 hit, CPU stalls\nexport class CodeAnalyzer_nes extends CodeAnalyzer6502 {\n constructor(platform : Platform) {\n super(platform);\n this.MAX_CLOCKS = 114; // 341 clocks for 3 scanlines\n this.START_CLOCKS = 0;\n this.WRAP_CLOCKS = true;\n }\n}\n\nexport class CodeAnalyzer_apple2 extends CodeAnalyzer6502 {\n constructor(platform : Platform) {\n super(platform);\n this.MAX_CLOCKS = 65;\n this.START_CLOCKS = 0;\n this.WRAP_CLOCKS = true;\n }\n}\n\n"], - "mappings": "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", - "names": [] -} diff --git a/gen/chunk-BMGQJMLR.js b/gen/chunk-47GW3WCW.js similarity index 97% rename from gen/chunk-BMGQJMLR.js rename to gen/chunk-47GW3WCW.js index 2d16c6ce..11130a35 100644 --- a/gen/chunk-BMGQJMLR.js +++ b/gen/chunk-47GW3WCW.js @@ -1,4 +1,4 @@ -import{A as C,C as w,a as p,b as P}from"./chunk-GKVIY6GD.js";import{N as b,P as v,R as S}from"./chunk-YL2YTMD7.js";var m=class{constructor(t){this.loaded=!1;this.preinitted=!1;this.started=!1;this.romtype="cart";this.running=!1;this.initluavars=!1;this.mainElement=t,this.timer=new S(20,this.poll.bind(this))}luacall(t){return this.js_lua_string||(this.js_lua_string=Module.cwrap("_Z13js_lua_stringPKc","string",["string"])),this.js_lua_string(t||"")}_pause(){this.running=!1,this.timer.stop()}pause(){this.loaded&&this.running&&(this.luacall("emu.pause()"),this._pause())}_resume(){this.luacall("emu.unpause()"),this.running=!0,this.timer.start()}resume(){this.loaded&&!this.running&&this._resume()}reset(){this.loaded&&(this.luacall("manager:machine():soft_reset()"),this.running=!0,this.initluavars=!1)}isRunning(){return this.running}bufferConsoleOutput(t){typeof t=="string"&&console.log(t)}startModule(t,e){this.started=!0;var r=this.romfn=this.romfn||e.romfn,a=this.romdata=this.romdata||e.romdata||new v(e.romsize).mem,o=this.romtype=this.romtype||e.romtype,n=this.video=new b(this.mainElement,e.width,e.height);n.create(),$(n.canvas).attr("id","canvas"),console.log("loading",e.jsfile);var u=[e.driver,"-debug","-debugger","none","-verbose","-window","-nokeepaspect","-resolution",n.canvas.width+"x"+n.canvas.height];r&&u.push("-"+o,r),e.extraargs&&(u=u.concat(e.extraargs)),console.log(u),window.JSMESS={},window.Module={arguments:u,screenIsReadOnly:!0,print:this.bufferConsoleOutput,canvas:n.canvas,doNotCaptureKeyboard:!0,keyboardListeningElement:n.canvas,preInit:()=>{console.log("loading FS"),ENV.SDL_EMSCRIPTEN_KEYBOARD_ELEMENT="canvas",e.cfgfile&&(FS.mkdir("/cfg"),FS.writeFile("/cfg/"+e.cfgfile,e.cfgdata,{encoding:"utf8"})),e.biosfile&&(FS.mkdir("/roms"),FS.mkdir("/roms/"+e.driver),FS.writeFile("/roms/"+e.biosfile,e.biosdata,{encoding:"binary"})),FS.mkdir("/emulator"),r&&FS.writeFile(r,a,{encoding:"binary"}),e.preInit&&e.preInit(self),this.preinitted=!0},preRun:[()=>{$(n.canvas).click(i=>{n.canvas.focus()}),this.loaded=!0,console.log("about to run...")}]};var d,c,g=$.Deferred(),f=$.Deferred();if(e.cfgfile&&(d=$.get("mame/cfg/"+e.cfgfile,i=>{e.cfgdata=i,console.log("loaded "+e.cfgfile)},"text")),e.biosfile){var s=new XMLHttpRequest;s.open("GET","mame/roms/"+e.biosfile,!0),s.responseType="arraybuffer",s.onload=i=>{e.biosdata=new Uint8Array(s.response),console.log("loaded "+e.biosfile),g.resolve()},s.ontimeout=function(i){throw Error("Timeout loading "+e.biosfile)},s.send()}else g.resolve();c=$.get("mame/debugger.lua",i=>{this.luadebugscript=i,console.log("loaded debugger.lua")},"text");{var l=new XMLHttpRequest;l.open("GET","mame/"+e.jsfile.replace(".js",".wasm"),!0),l.responseType="arraybuffer",l.onload=i=>{console.log("loaded WASM file"),window.Module.wasmBinary=new Uint8Array(l.response),f.resolve()},l.ontimeout=function(i){throw Error("Timeout loading "+e.jsfile)},l.send()}$.when(c,d,g,f).done(()=>{var i=document.createElement("script");i.src="mame/"+e.jsfile,document.getElementsByTagName("head")[0].appendChild(i),console.log("created script element")}),window.mamelua=i=>(this.initlua(),[i,this.luacall(i)])}loadROMFile(t){this.romdata=t,this.preinitted&&this.romfn&&FS.writeFile(this.romfn,t,{encoding:"binary"})}loadRegion(t,e){if(this.loaded&&e.length>0){for(var r='rgn = manager:machine():memory().regions["'+t+`"] +import{A as C,C as w,a as p,b as P}from"./chunk-6UU4KLMR.js";import{N as b,P as v,R as S}from"./chunk-7LTJUW24.js";var m=class{constructor(t){this.loaded=!1;this.preinitted=!1;this.started=!1;this.romtype="cart";this.running=!1;this.initluavars=!1;this.mainElement=t,this.timer=new S(20,this.poll.bind(this))}luacall(t){return this.js_lua_string||(this.js_lua_string=Module.cwrap("_Z13js_lua_stringPKc","string",["string"])),this.js_lua_string(t||"")}_pause(){this.running=!1,this.timer.stop()}pause(){this.loaded&&this.running&&(this.luacall("emu.pause()"),this._pause())}_resume(){this.luacall("emu.unpause()"),this.running=!0,this.timer.start()}resume(){this.loaded&&!this.running&&this._resume()}reset(){this.loaded&&(this.luacall("manager:machine():soft_reset()"),this.running=!0,this.initluavars=!1)}isRunning(){return this.running}bufferConsoleOutput(t){typeof t=="string"&&console.log(t)}startModule(t,e){this.started=!0;var r=this.romfn=this.romfn||e.romfn,a=this.romdata=this.romdata||e.romdata||new v(e.romsize).mem,o=this.romtype=this.romtype||e.romtype,n=this.video=new b(this.mainElement,e.width,e.height);n.create(),$(n.canvas).attr("id","canvas"),console.log("loading",e.jsfile);var u=[e.driver,"-debug","-debugger","none","-verbose","-window","-nokeepaspect","-resolution",n.canvas.width+"x"+n.canvas.height];r&&u.push("-"+o,r),e.extraargs&&(u=u.concat(e.extraargs)),console.log(u),window.JSMESS={},window.Module={arguments:u,screenIsReadOnly:!0,print:this.bufferConsoleOutput,canvas:n.canvas,doNotCaptureKeyboard:!0,keyboardListeningElement:n.canvas,preInit:()=>{console.log("loading FS"),ENV.SDL_EMSCRIPTEN_KEYBOARD_ELEMENT="canvas",e.cfgfile&&(FS.mkdir("/cfg"),FS.writeFile("/cfg/"+e.cfgfile,e.cfgdata,{encoding:"utf8"})),e.biosfile&&(FS.mkdir("/roms"),FS.mkdir("/roms/"+e.driver),FS.writeFile("/roms/"+e.biosfile,e.biosdata,{encoding:"binary"})),FS.mkdir("/emulator"),r&&FS.writeFile(r,a,{encoding:"binary"}),e.preInit&&e.preInit(self),this.preinitted=!0},preRun:[()=>{$(n.canvas).click(i=>{n.canvas.focus()}),this.loaded=!0,console.log("about to run...")}]};var d,c,g=$.Deferred(),f=$.Deferred();if(e.cfgfile&&(d=$.get("mame/cfg/"+e.cfgfile,i=>{e.cfgdata=i,console.log("loaded "+e.cfgfile)},"text")),e.biosfile){var s=new XMLHttpRequest;s.open("GET","mame/roms/"+e.biosfile,!0),s.responseType="arraybuffer",s.onload=i=>{e.biosdata=new Uint8Array(s.response),console.log("loaded "+e.biosfile),g.resolve()},s.ontimeout=function(i){throw Error("Timeout loading "+e.biosfile)},s.send()}else g.resolve();c=$.get("mame/debugger.lua",i=>{this.luadebugscript=i,console.log("loaded debugger.lua")},"text");{var l=new XMLHttpRequest;l.open("GET","mame/"+e.jsfile.replace(".js",".wasm"),!0),l.responseType="arraybuffer",l.onload=i=>{console.log("loaded WASM file"),window.Module.wasmBinary=new Uint8Array(l.response),f.resolve()},l.ontimeout=function(i){throw Error("Timeout loading "+e.jsfile)},l.send()}$.when(c,d,g,f).done(()=>{var i=document.createElement("script");i.src="mame/"+e.jsfile,document.getElementsByTagName("head")[0].appendChild(i),console.log("created script element")}),window.mamelua=i=>(this.initlua(),[i,this.luacall(i)])}loadROMFile(t){this.romdata=t,this.preinitted&&this.romfn&&FS.writeFile(this.romfn,t,{encoding:"binary"})}loadRegion(t,e){if(this.loaded&&e.length>0){for(var r='rgn = manager:machine():memory().regions["'+t+`"] `,a=0;a=this.MAX_CYCLES){console.log("too many cycles @",s(e),"routine",s(C));break}u=!1,this.WRAP_CLOCKS?(t=t%this.MAX_CLOCKS,r=r%this.MAX_CLOCKS,r==t-1&&(n&&console.log("0-75",s(e),t,r),t=0,r=this.MAX_CLOCKS-1)):(t=Math.min(this.MAX_CLOCKS,t),r=Math.min(this.MAX_CLOCKS,r));let a=this.getClockCountsAtPC(e),c=this.platform.readAddress(e+1),O=this.platform.readAddress(e+2),g=c+(O<<8),h=e,i=this.pc2clockrange[h];if(i==null&&(this.pc2clockrange[h]=i={minclocks:t,maxclocks:r},n&&console.log("new",s(e),s(h),s(C),t,r),u=!0),(i.minclocks!=t||i.maxclocks!=r)&&(this.WRAP_CLOCKS&&t<=r!=i.minclocks<=i.maxclocks&&(n&&console.log("wrap",s(e),s(h),s(C),t,r,i),i.minclocks=t=0,i.maxclocks=r=this.MAX_CLOCKS-1,u=!0),ti.maxclocks&&(n&&console.log("max",s(e),s(h),s(C),t,r,i),i.maxclocks=r,u=!0)),!a.insnlength){console.log("Illegal instruction!",s(e),s(a.opcode),a);break}e+=a.insnlength;var S=f;switch(f=null,a.opcode){case 25:case 29:case 57:case 61:case 89:case 93:case 121:case 125:case 185:case 187:case 188:case 189:case 190:case 191:case 217:case 221:case 249:case 253:c==0&&(a.maxCycles-=1);break;case 133:c==2&&(t=r=0,a.minCycles=a.maxCycles=0);break;case 44:c==2&&O==32&&(t=0,r=4,a.minCycles=a.maxCycles=0);break;case 32:t+=a.minCycles,r+=a.maxCycles,this.traceInstructions(g,t,r,g,f);var o=this.jsrresult[g];o?(t=o.minclocks,r=o.maxclocks):(console.log("No JSR result!",s(e),s(g)),t=r);break;case 76:e=g;break;case 64:A=!0;break;case 96:if(C){var o=this.jsrresult[C];o?o={minclocks:Math.min(t,o.minclocks),maxclocks:Math.max(r,o.maxclocks)}:o={minclocks:t,maxclocks:r},this.jsrresult[C]=o,console.log("RTS",s(e),s(C),this.jsrresult[C])}return;case 16:case 48:case 80:case 112:case 144:case 176:case 208:case 240:var L=e+_(c),K=e>>8!=L>>8;K||a.maxCycles--;var x=M[Math.floor((a.opcode-16)/32)],p=y(S,x[0]),d=y(S,x[1]);this.traceInstructions(L,t+a.maxCycles,r+a.maxCycles,C,x[0]),d===!1&&(console.log("branch always taken",s(e),S,x[1]),A=!0),f=x[1],a.maxCycles=a.minCycles;break;case 108:console.log("Instruction not supported!",s(e),s(a.opcode),a);return}n&&console.log("add",s(e),a.minCycles,a.maxCycles),t+=a.minCycles,r+=a.maxCycles}}showLoopTimingForPC(e){this.pc2clockrange={},this.jsrresult={},this.traceInstructions(e|this.platform.getOriginPC(),this.START_CLOCKS,this.MAX_CLOCKS,0,{})}},R=class extends m{constructor(e){super(e);this.MAX_CLOCKS=76,this.START_CLOCKS=0,this.WRAP_CLOCKS=!0}},P=class extends m{constructor(e){super(e);this.MAX_CLOCKS=114,this.START_CLOCKS=0,this.WRAP_CLOCKS=!0}};export{R as a,P as b}; +//# sourceMappingURL=chunk-4MHYRQST.js.map diff --git a/gen/chunk-4MHYRQST.js.map b/gen/chunk-4MHYRQST.js.map new file mode 100644 index 00000000..9ff14149 --- /dev/null +++ b/gen/chunk-4MHYRQST.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/common/analysis.ts"], + "sourcesContent": ["\nimport { hex, byte2signed } from \"./util\";\nimport { Platform } from \"./baseplatform\";\n\nconst debug = false;\n\nexport interface CodeAnalyzer {\n showLoopTimingForPC(pc:number);\n pc2clockrange : {[key:number]:ClockRange};\n MAX_CLOCKS : number;\n}\n\n/// VCS TIMING ANALYSIS\n\n// [taken, not taken]\nconst BRANCH_CONSTRAINTS = [\n [{N:0},{N:1}],\n [{N:1},{N:0}],\n [{V:0},{V:1}],\n [{V:1},{V:0}],\n [{C:0},{C:1}],\n [{C:1},{C:0}],\n [{Z:0},{Z:1}],\n [{Z:1},{Z:0}]\n];\n\nfunction constraintEquals(a,b) {\n if (a == null || b == null)\n return null;\n for (var n in a) {\n if (b[n] !== 'undefined')\n return a[n] == b[n];\n }\n for (var n in b) {\n if (a[n] !== 'undefined')\n return a[n] == b[n];\n }\n return null;\n}\n\ninterface ClockRange {\n minclocks: number;\n maxclocks: number;\n}\n\nabstract class CodeAnalyzer6502 implements CodeAnalyzer {\n pc2clockrange : {[key:number]:ClockRange} = {};\n jsrresult : {[key:number]:ClockRange} = {};\n START_CLOCKS : number;\n MAX_CLOCKS : number;\n WRAP_CLOCKS : boolean;\n platform : Platform;\n MAX_CYCLES : number = 2000;\n \n constructor(platform : Platform) {\n this.platform = platform;\n }\n\n getClockCountsAtPC(pc) {\n var opcode = this.platform.readAddress(pc);\n var meta = this.platform.getOpcodeMetadata(opcode, pc);\n return meta; // minCycles, maxCycles\n }\n\n traceInstructions(pc:number, minclocks:number, maxclocks:number, subaddr:number, constraints) {\n if (debug) console.log(\"trace\", hex(pc), minclocks, maxclocks);\n if (!constraints) constraints = {};\n var modified = true;\n var abort = false;\n for (let i=0; modified && !abort; i++) {\n if (i >= this.MAX_CYCLES) {\n console.log(\"too many cycles @\", hex(pc), \"routine\", hex(subaddr));\n break;\n }\n modified = false;\n if (this.WRAP_CLOCKS) {\n // wrap clocks\n minclocks = minclocks % this.MAX_CLOCKS;\n maxclocks = maxclocks % this.MAX_CLOCKS;\n if (maxclocks == minclocks-1) {\n if (debug) console.log(\"0-75\", hex(pc), minclocks, maxclocks);\n minclocks = 0;\n maxclocks = this.MAX_CLOCKS-1;\n }\n } else {\n // truncate clocks\n minclocks = Math.min(this.MAX_CLOCKS, minclocks);\n maxclocks = Math.min(this.MAX_CLOCKS, maxclocks);\n }\n let meta = this.getClockCountsAtPC(pc);\n let lob = this.platform.readAddress(pc+1);\n let hib = this.platform.readAddress(pc+2);\n let addr = lob + (hib << 8);\n let pc0 = pc;\n let pcrange = this.pc2clockrange[pc0];\n if (pcrange == null) {\n this.pc2clockrange[pc0] = pcrange = {minclocks:minclocks, maxclocks:maxclocks};\n if (debug) console.log(\"new\", hex(pc), hex(pc0), hex(subaddr), minclocks, maxclocks);\n modified = true;\n }\n //console.log(hex(pc),minclocks,maxclocks, pcrange);\n if (pcrange.minclocks != minclocks || pcrange.maxclocks != maxclocks) {\n if (this.WRAP_CLOCKS && (minclocks <= maxclocks) != (pcrange.minclocks <= pcrange.maxclocks)) {\n if (debug) console.log(\"wrap\", hex(pc), hex(pc0), hex(subaddr), minclocks, maxclocks, pcrange);\n pcrange.minclocks = minclocks = 0;\n pcrange.maxclocks = maxclocks = this.MAX_CLOCKS-1;\n modified = true;\n }\n if (minclocks < pcrange.minclocks) {\n if (debug) console.log(\"min\", hex(pc), hex(pc0), hex(subaddr), minclocks, maxclocks, pcrange);\n pcrange.minclocks = minclocks;\n modified = true;\n }\n if (maxclocks > pcrange.maxclocks) {\n if (debug) console.log(\"max\", hex(pc), hex(pc0), hex(subaddr), minclocks, maxclocks, pcrange);\n pcrange.maxclocks = maxclocks;\n modified = true;\n }\n }\n if (!meta.insnlength) {\n console.log(\"Illegal instruction!\", hex(pc), hex(meta.opcode), meta);\n break;\n }\n pc += meta.insnlength;\n var oldconstraints = constraints;\n constraints = null;\n // TODO: if jump to zero-page, maybe assume RTS?\n switch (meta.opcode) {\n case 0x19: case 0x1d:\n case 0x39: case 0x3d:\n case 0x59: case 0x5d:\n case 0x79: case 0x7d:\n case 0xb9: case 0xbb:\n case 0xbc: case 0xbd: case 0xbe: case 0xbf:\n case 0xd9: case 0xdd:\n case 0xf9: case 0xfd:\n if (lob == 0) meta.maxCycles -= 1; // no page boundary crossed\n break;\n // TODO: only VCS\n case 0x85:\n if (lob == 0x2) { // STA WSYNC\n minclocks = maxclocks = 0;\n meta.minCycles = meta.maxCycles = 0;\n }\n break;\n // TODO: only NES (sprite 0 poll)\n case 0x2c:\n if (lob == 0x02 && hib == 0x20) { // BIT $2002\n minclocks = 0;\n maxclocks = 4; // uncertainty b/c of assumed branch poll\n meta.minCycles = meta.maxCycles = 0;\n }\n break;\n // TODO: only Apple2 (vapor lock)\n /*\n case 0xad:\n if (lob == 0x61 && hib == 0xc0) { // LDA $C061\n minclocks = 0;\n maxclocks = 4; // uncertainty?\n meta.minCycles = meta.maxCycles = 0;\n }\n break;\n */\n case 0x20: // JSR\n // TODO: handle bare RTS case\n minclocks += meta.minCycles;\n maxclocks += meta.maxCycles;\n this.traceInstructions(addr, minclocks, maxclocks, addr, constraints);\n var result = this.jsrresult[addr];\n if (result) {\n minclocks = result.minclocks;\n maxclocks = result.maxclocks;\n } else {\n console.log(\"No JSR result!\", hex(pc), hex(addr));\n minclocks = maxclocks;\n //return;\n }\n break;\n case 0x4c: // JMP\n pc = addr; // TODO: make sure in ROM space\n break;\n case 0x40: // RTI\n abort = true;\n break;\n case 0x60: // RTS\n if (subaddr) { // TODO: 0 doesn't work\n // TODO: combine with previous result\n var result = this.jsrresult[subaddr];\n if (!result) {\n result = {minclocks:minclocks, maxclocks:maxclocks};\n } else {\n result = {\n minclocks:Math.min(minclocks,result.minclocks),\n maxclocks:Math.max(maxclocks,result.maxclocks)\n }\n }\n this.jsrresult[subaddr] = result;\n console.log(\"RTS\", hex(pc), hex(subaddr), this.jsrresult[subaddr]);\n }\n return;\n case 0x10: case 0x30: // branch\n case 0x50: case 0x70:\n case 0x90: case 0xB0:\n case 0xD0: case 0xF0:\n var newpc = pc + byte2signed(lob);\n var crosspage = (pc>>8) != (newpc>>8);\n if (!crosspage) meta.maxCycles--;\n // TODO: other instructions might modify flags too\n var cons = BRANCH_CONSTRAINTS[Math.floor((meta.opcode-0x10)/0x20)];\n var cons0 = constraintEquals(oldconstraints, cons[0]);\n var cons1 = constraintEquals(oldconstraints, cons[1]);\n // recursively trace the taken branch\n if (true || cons0 !== false) { // TODO?\n this.traceInstructions(newpc, minclocks+meta.maxCycles, maxclocks+meta.maxCycles, subaddr, cons[0]);\n }\n // abort if we will always take the branch\n if (cons1 === false) {\n console.log(\"branch always taken\", hex(pc), oldconstraints, cons[1]);\n abort = true;\n }\n constraints = cons[1]; // not taken\n meta.maxCycles = meta.minCycles; // branch not taken, no extra clock(s)\n break;\n case 0x6c:\n console.log(\"Instruction not supported!\", hex(pc), hex(meta.opcode), meta); // TODO\n return;\n }\n // add min/max instruction time to min/max clocks bound\n if (debug) console.log(\"add\", hex(pc), meta.minCycles, meta.maxCycles);\n minclocks += meta.minCycles;\n maxclocks += meta.maxCycles;\n }\n }\n\n showLoopTimingForPC(pc:number) {\n this.pc2clockrange = {};\n this.jsrresult = {};\n // recurse through all traces\n this.traceInstructions(pc | this.platform.getOriginPC(), this.START_CLOCKS, this.MAX_CLOCKS, 0, {});\n }\n}\n\n// 76 cycles\nexport class CodeAnalyzer_vcs extends CodeAnalyzer6502 {\n constructor(platform : Platform) {\n super(platform);\n this.MAX_CLOCKS = 76; // 1 scanline\n this.START_CLOCKS = 0; // TODO?\n this.WRAP_CLOCKS = true;\n }\n}\n\n// https://wiki.nesdev.com/w/index.php/PPU_rendering#Line-by-line_timing\n// TODO: sprite 0 hit, CPU stalls\nexport class CodeAnalyzer_nes extends CodeAnalyzer6502 {\n constructor(platform : Platform) {\n super(platform);\n this.MAX_CLOCKS = 114; // 341 clocks for 3 scanlines\n this.START_CLOCKS = 0;\n this.WRAP_CLOCKS = true;\n }\n}\n\nexport class CodeAnalyzer_apple2 extends CodeAnalyzer6502 {\n constructor(platform : Platform) {\n super(platform);\n this.MAX_CLOCKS = 65;\n this.START_CLOCKS = 0;\n this.WRAP_CLOCKS = true;\n }\n}\n\n"], + "mappings": "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", + "names": [] +} diff --git a/gen/chunk-GKVIY6GD.js b/gen/chunk-6UU4KLMR.js similarity index 95% rename from gen/chunk-GKVIY6GD.js rename to gen/chunk-6UU4KLMR.js index 1b86c0c0..992c74f7 100644 --- a/gen/chunk-GKVIY6GD.js +++ b/gen/chunk-6UU4KLMR.js @@ -1,7 +1,7 @@ -import{C as dt,N as ht,Q as At,R as Ct,S as nt,X as St,g as a0,i as bt,r as tt}from"./chunk-YL2YTMD7.js";var sn=[{mn:"BRK",am:"",nb:1,il:0,c1:7,c2:0,nw:3,br:1,mod:"SI"},{mn:"ORA",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SLO",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:""},{mn:"ORA",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SLO",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"PHP",am:"",nb:1,il:0,c1:3,c2:0,nw:1,br:0,mod:"S"},{mn:"ORA",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"ANC",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"NOP",am:"AAAA",nb:3,il:1,c1:3,c2:0,nw:0,br:0,mod:""},{mn:"ORA",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SLO",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"BPL",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"ORA",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SLO",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"ORA",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SLO",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"CLC",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"C"},{mn:"ORA",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"SLO",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"ORA",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SLO",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"JSR",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:1,mod:"S"},{mn:"AND",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"RLA",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"BIT",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"ZVN"},{mn:"AND",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RLA",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"PLP",am:"",nb:1,il:0,c1:4,c2:0,nw:0,br:0,mod:"SCZIDVN"},{mn:"AND",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"ANC",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"BIT",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"ZVN"},{mn:"AND",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RLA",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"BMI",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"AND",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"RLA",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"AND",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RLA",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"SEC",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"C"},{mn:"AND",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"RLA",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"AND",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RLA",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"RTI",am:"",nb:1,il:0,c1:6,c2:0,nw:0,br:1,mod:"SCZIDVN"},{mn:"EOR",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SRE",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:""},{mn:"EOR",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SRE",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"PHA",am:"",nb:1,il:0,c1:3,c2:0,nw:1,br:0,mod:"S"},{mn:"EOR",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"ASR",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"JMP",am:"AAAA",nb:3,il:0,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"EOR",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SRE",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"BVC",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"EOR",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SRE",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"EOR",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SRE",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"CLI",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"I"},{mn:"EOR",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"SRE",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"EOR",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SRE",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"RTS",am:"",nb:1,il:0,c1:6,c2:0,nw:0,br:1,mod:"S"},{mn:"ADC",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"RRA",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"aa",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:""},{mn:"ADC",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RRA",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"PLA",am:"",nb:1,il:0,c1:4,c2:0,nw:0,br:0,mod:"SAZN"},{mn:"ADC",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"ARR",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"JMP",am:"(AAAA)",nb:3,il:0,c1:5,c2:0,nw:0,br:1,mod:""},{mn:"ADC",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RRA",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"BVS",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"ADC",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"RRA",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"ADC",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RRA",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"SEI",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"I"},{mn:"ADC",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"RRA",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"ADC",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RRA",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"STA",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:1,br:0,mod:""},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"SAX",am:"(aa,x)",nb:2,il:1,c1:6,c2:0,nw:1,br:0,mod:""},{mn:"STY",am:"aa",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:""},{mn:"STA",am:"aa",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:""},{mn:"STX",am:"aa",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:""},{mn:"SAX",am:"aa",nb:2,il:1,c1:3,c2:0,nw:1,br:0,mod:""},{mn:"DEY",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"YZN"},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"TXA",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ANE",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"STY",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"STA",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"STX",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"SAX",am:"AAAA",nb:3,il:1,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"BCC",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"STA",am:"(aa),y",nb:2,il:0,c1:6,c2:0,nw:1,br:0,mod:""},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SHA",am:"(aa),y",nb:2,il:1,c1:6,c2:0,nw:1,br:0,mod:""},{mn:"STY",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"STA",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"STX",am:"aa,y",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"SAX",am:"aa,y",nb:3,il:1,c1:4,c2:0,nw:1,br:1,mod:""},{mn:"TYA",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"STA",am:"AAAA,y",nb:3,il:0,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"TXS",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"S"},{mn:"SHS",am:"AAAA,y",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:"S"},{mn:"SHY",am:"AAAA,x",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"STA",am:"AAAA,x",nb:3,il:0,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"SHX",am:"AAAA,y",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"SHA",am:"AAAA,y",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"LDY",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"(aa,x)",nb:2,il:1,c1:6,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"LDY",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"aa",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"TAY",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"TAX",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LXA",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"LDY",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"AAAA",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"BCS",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"LDA",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"LAX",am:"(aa),y",nb:2,il:1,c1:5,c2:1,nw:0,br:0,mod:"AXZN"},{mn:"LDY",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"aa,y",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"aa,y",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"CLV",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"V"},{mn:"LDA",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"TSX",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAS",am:"AAAA,y",nb:3,il:1,c1:4,c2:1,nw:0,br:0,mod:"SAXZN"},{mn:"LDY",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"AAAA,y",nb:3,il:1,c1:4,c2:1,nw:0,br:0,mod:"AXZN"},{mn:"CPY",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"CZN"},{mn:"CMP",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"CZN"},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"DCP",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"CZN"},{mn:"CPY",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"CZN"},{mn:"CMP",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"CZN"},{mn:"DEC",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"ZN"},{mn:"DCP",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"INY",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"YZN"},{mn:"CMP",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"CZN"},{mn:"DEX",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"SBX",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"XCZN"},{mn:"CPY",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"CZN"},{mn:"CMP",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"CZN"},{mn:"DEC",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"ZN"},{mn:"DCP",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"BNE",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"CMP",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"CZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"DCP",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"CZN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"CMP",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"CZN"},{mn:"DEC",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"ZN"},{mn:"DCP",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"CLD",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"D"},{mn:"CMP",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"CZN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"DCP",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"CMP",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"CZN"},{mn:"DEC",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"ZN"},{mn:"DCP",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"CPX",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"CZN"},{mn:"SBC",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"ISB",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"CPX",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"CZN"},{mn:"SBC",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"INC",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"ZN"},{mn:"ISB",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"INX",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"SBC",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"NOP",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"SBC",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"CPX",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"CZN"},{mn:"SBC",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"INC",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"ZN"},{mn:"ISB",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"BEQ",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"SBC",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"ISB",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"SBC",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"INC",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"ZN"},{mn:"ISB",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"SED",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"D"},{mn:"SBC",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"ISB",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"SBC",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"INC",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"ZN"},{mn:"ISB",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZVN"}];function rt(h,e,r,c){var m=sn[e];if(m==null)return{line:"???",nbytes:1,isaddr:!1};var o=m.mn,d=m.am,x=!1;if(d=="branch"){var a=r<128?h+2+r:h+2-(256-r);a&=65535,d="$"+a0(a,4),x=!0}else d=d.replace("aa","$"+a0(r,2)),d=d.replace("AAAA","$"+a0(r+(c<<8),4)),d.indexOf("#")<0&&d.indexOf("$")>=0&&(x=!0);return{line:m.mn+" "+d,nbytes:m.nb,isaddr:x}}function on(h){let e=h;if(!e||typeof e.mem_read!="function"||typeof e.mem_write!="function"||typeof e.io_read!="function"||typeof e.io_write!="function")throw"Z80: Core object is missing required functions.";let r=0,c=0,m=0,o=0,d=0,x=0,a=0,W=0,y=0,p=0,N=0,k=0,G=0,u0=0,A=0,B=0,I=0,F=0,z=57328,i=0,f={S:0,Z:0,Y:0,H:0,X:0,P:0,N:0,C:0},g0={S:0,Z:0,Y:0,H:0,X:0,P:0,N:0,C:0},T0=0,V=0,D0=0,_=!1,v=!1,Y0=!1,t0=0;function q(){return{PC:i,SP:z,IX:A,IY:B,AF:(r<<8)+X0(),BC:(c<<8)+m,DE:(o<<8)+d,HL:(x<<8)+a,AF_:(W<<8)+W0(),BC_:(y<<8)+p,DE_:(N<<8)+k,HL_:(G<<8)+u0,IR:(I<<8)+F,im:T0,iff1:V,iff2:D0,halted:_,do_delayed_di:v,do_delayed_ei:Y0,cycle_counter:t0}}function V0(t){i=t.PC,z=t.SP,A=t.IX,B=t.IY,r=t.AF>>8&255,F0(t.AF),c=t.BC>>8&255,m=t.BC&255,o=t.DE>>8&255,d=t.DE&255,x=t.HL>>8&255,a=t.HL&255,W=t.AF_>>8&255,w0(t.AF_),y=t.BC_>>8&255,p=t.BC_&255,N=t.DE_>>8&255,k=t.DE_&255,G=t.HL_>>8&255,u0=t.HL_&255,I=t.IR>>8&255,F=t.IR&255,T0=t.im,V=t.iff1,D0=t.iff2,_=t.halted,v=t.do_delayed_di,Y0=t.do_delayed_ei,t0=t.cycle_counter}let K=function(){z=57328,i=0,r=0,F=0,F0(0),T0=0,V=0,D0=0,_=!1,v=!1,Y0=!1,t0=0},U=function(){if(_)return 1;var t=!1,b=!1;v?(v=!1,t=!0):Y0&&(Y0=!1,b=!0),F=F&128|(F&127)+1&127;var P=e.mem_read(i);x0(P),i=i+1&65535,t?(V=0,D0=0):b&&(V=1,D0=1);var y0=t0;return t0=0,y0},A0=function(t,b){if(t)return F=F&128|(F&127)+1&127,_=!1,D0=V,V=0,O0(i),i=102,t0+=11,!0;if(V){if(F=F&128|(F&127)+1&127,_=!1,V=0,D0=0,T0===0)i=i-1&65535,x0(b),i=i+1&65535,t0+=2;else if(T0===1)O0(i),i=56,t0+=13;else if(T0===2){O0(i);var P=I<<8|b;i=e.mem_read(P)|e.mem_read(P+1&65535)<<8,t0+=19}return!0}},x0=function(t){var b=function(L0){return(L0&7)==0?c:(L0&7)==1?m:(L0&7)==2?o:(L0&7)==3?d:(L0&7)==4?x:(L0&7)==5?a:(L0&7)==6?e.mem_read(a|x<<8):r};if(t===118)_=!0;else if(t>=64&&t<128){var P=b(t);(t&56)>>>3==0?c=P:(t&56)>>>3==1?m=P:(t&56)>>>3==2?o=P:(t&56)>>>3==3?d=P:(t&56)>>>3==4?x=P:(t&56)>>>3==5?a=P:(t&56)>>>3==6?e.mem_write(a|x<<8,P):(t&56)>>>3==7&&(r=P)}else if(t>=128&&t<192){var P=b(t),y0=[c0,i0,Z,w,f0,n0,M,T];y0[(t&56)>>>3](P)}else{var J0=S[t];J0()}t0+=u[t]},L=function(t){return t&=255,t&128&&(t=-((255&~t)+1)),t},X0=function(){return f.S<<7|f.Z<<6|f.Y<<5|f.H<<4|f.X<<3|f.P<<2|f.N<<1|f.C},W0=function(){return g0.S<<7|g0.Z<<6|g0.Y<<5|g0.H<<4|g0.X<<3|g0.P<<2|g0.N<<1|g0.C},F0=function(t){f.S=(t&128)>>>7,f.Z=(t&64)>>>6,f.Y=(t&32)>>>5,f.H=(t&16)>>>4,f.X=(t&8)>>>3,f.P=(t&4)>>>2,f.N=(t&2)>>>1,f.C=t&1},w0=function(t){g0.S=(t&128)>>>7,g0.Z=(t&64)>>>6,g0.Y=(t&32)>>>5,g0.H=(t&16)>>>4,g0.X=(t&8)>>>3,g0.P=(t&4)>>>2,g0.N=(t&2)>>>1,g0.C=t&1},Q=function(t){f.Y=(t&32)>>>5,f.X=(t&8)>>>3},l0=function(t){var b=[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1];return b[t]},O0=function(t){z=z-1&65535,e.mem_write(z,(t&65280)>>>8),z=z-1&65535,e.mem_write(z,t&255)},b0=function(){var t=e.mem_read(z)&255;return z=z+1&65535,t|=e.mem_read(z)<<8,z=z+1&65535,t},R0=function(t){t?(i=e.mem_read(i+1&65535)|e.mem_read(i+2&65535)<<8,i=i-1&65535):i=i+2&65535},z0=function(t){if(t){t0+=5;var b=L(e.mem_read(i+1&65535));i=i+b+1&65535}else i=i+1&65535},E0=function(t){t?(t0+=7,O0(i+3&65535),i=e.mem_read(i+1&65535)|e.mem_read(i+2&65535)<<8,i=i-1&65535):i=i+2&65535},U0=function(t){t&&(t0+=6,i=b0()-1&65535)},p0=function(t){O0(i+1&65535),i=t-1&65535},c0=function(t){var b=r+t;f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(t&15)+(r&15)&16?1:0,f.P=(r&128)==(t&128)&&(r&128)!=(b&128)?1:0,f.N=0,f.C=b&256?1:0,r=b&255,Q(r)},i0=function(t){var b=r+t+f.C;f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(t&15)+(r&15)+f.C&16?1:0,f.P=(r&128)==(t&128)&&(r&128)!=(b&128)?1:0,f.N=0,f.C=b&256?1:0,r=b&255,Q(r)},Z=function(t){var b=r-t;f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(r&15)-(t&15)&16?1:0,f.P=(r&128)!=(t&128)&&(r&128)!=(b&128)?1:0,f.N=1,f.C=b&256?1:0,r=b&255,Q(r)},w=function(t){var b=r-t-f.C;f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(r&15)-(t&15)-f.C&16?1:0,f.P=(r&128)!=(t&128)&&(r&128)!=(b&128)?1:0,f.N=1,f.C=b&256?1:0,r=b&255,Q(r)},T=function(t){var b=r;Z(t),r=b,Q(t)},f0=function(t){r&=t&255,f.S=r&128?1:0,f.Z=r?0:1,f.H=1,f.P=l0(r),f.N=0,f.C=0,Q(r)},M=function(t){r=(t|r)&255,f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=l0(r),f.N=0,f.C=0,Q(r)},n0=function(t){r=(t^r)&255,f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=l0(r),f.N=0,f.C=0,Q(r)},O=function(t){var b=t+1;return f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(t&15)==15?1:0,f.P=t===127?1:0,f.N=0,b&=255,Q(b),b},E=function(t){var b=t-1;return f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(t&15)==0?1:0,f.P=t===128?1:0,f.N=1,b&=255,Q(b),b},_0=function(t){var b=a|x<<8,P=b+t;f.N=0,f.C=P&65536?1:0,f.H=(b&4095)+(t&4095)&4096?1:0,a=P&255,x=(P&65280)>>>8,Q(x)},H=function(t){t+=f.C;var b=a|x<<8,P=b+t;f.S=P&32768?1:0,f.Z=P&65535?0:1,f.H=(b&4095)+(t&4095)&4096?1:0,f.P=(b&32768)==(t&32768)&&(P&32768)!=(b&32768)?1:0,f.N=0,f.C=P&65536?1:0,a=P&255,x=P>>>8&255,Q(x)},r0=function(t){t+=f.C;var b=a|x<<8,P=b-t;f.S=P&32768?1:0,f.Z=P&65535?0:1,f.H=(b&4095)-(t&4095)&4096?1:0,f.P=(b&32768)!=(t&32768)&&(P&32768)!=(b&32768)?1:0,f.N=1,f.C=P&65536?1:0,a=P&255,x=P>>>8&255,Q(x)},C0=function(t){var b=e.io_read(t);return f.S=b&128?1:0,f.Z=b?0:1,f.H=0,f.P=l0(b)?1:0,f.N=0,Q(b),b},$=function(){r!==128&&(r=L(r),r=-r&255),f.S=r&128?1:0,f.Z=r?0:1,f.H=(-r&15)>0?1:0,f.P=r===128?1:0,f.N=1,f.C=r?1:0,Q(r)},m0=function(){var t=e.mem_read(a|x<<8);e.mem_write(d|o<<8,t);var b=(d|o<<8)+1;d=b&255,o=(b&65280)>>>8,b=(a|x<<8)+1,a=b&255,x=(b&65280)>>>8,b=(m|c<<8)-1,m=b&255,c=(b&65280)>>>8,f.H=0,f.P=m||c?1:0,f.N=0,f.Y=(r+t&2)>>>1,f.X=(r+t&8)>>>3},N0=function(){var t=f.C,b=e.mem_read(a|x<<8);T(b),f.C=t,f.Y=(r-b-f.H&2)>>>1,f.X=(r-b-f.H&8)>>>3;var P=(a|x<<8)+1;a=P&255,x=(P&65280)>>>8,P=(m|c<<8)-1,m=P&255,c=(P&65280)>>>8,f.P=P?1:0},Y=function(){c=E(c),e.mem_write(a|x<<8,e.io_read(c<<8|m));var t=(a|x<<8)+1;a=t&255,x=(t&65280)>>>8,f.N=1},e0=function(){e.io_write(c<<8|m,e.mem_read(a|x<<8));var t=(a|x<<8)+1;a=t&255,x=(t&65280)>>>8,c=E(c),f.N=1},s0=function(){f.N=0,f.H=0;var t=e.mem_read(a|x<<8);e.mem_write(d|o<<8,t);var b=(d|o<<8)-1;d=b&255,o=(b&65280)>>>8,b=(a|x<<8)-1,a=b&255,x=(b&65280)>>>8,b=(m|c<<8)-1,m=b&255,c=(b&65280)>>>8,f.P=m||c?1:0,f.Y=(r+t&2)>>>1,f.X=(r+t&8)>>>3},P0=function(){var t=f.C,b=e.mem_read(a|x<<8);T(b),f.C=t,f.Y=(r-b-f.H&2)>>>1,f.X=(r-b-f.H&8)>>>3;var P=(a|x<<8)-1;a=P&255,x=(P&65280)>>>8,P=(m|c<<8)-1,m=P&255,c=(P&65280)>>>8,f.P=P?1:0},B0=function(){c=E(c),e.mem_write(a|x<<8,e.io_read(c<<8|m));var t=(a|x<<8)-1;a=t&255,x=(t&65280)>>>8,f.N=1},H0=function(){e.io_write(c<<8|m,e.mem_read(a|x<<8));var t=(a|x<<8)-1;a=t&255,x=(t&65280)>>>8,c=E(c),f.N=1},o0=function(t){return f.N=0,f.H=0,f.C=(t&128)>>>7,t=(t<<1|f.C)&255,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},d0=function(t){return f.N=0,f.H=0,f.C=t&1,t=t>>>1&127|f.C<<7,f.Z=t&255?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t&255},Z0=function(t){f.N=0,f.H=0;var b=f.C;return f.C=(t&128)>>>7,t=(t<<1|b)&255,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},k0=function(t){f.N=0,f.H=0;var b=f.C;return f.C=t&1,t=t>>>1&127|b<<7,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},K0=function(t){return f.N=0,f.H=0,f.C=(t&128)>>>7,t=t<<1&255,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},X=function(t){return f.N=0,f.H=0,f.C=t&1,t=t>>>1&127|t&128,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},j0=function(t){return f.N=0,f.H=0,f.C=(t&128)>>>7,t=t<<1&255|1,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},Q0=function(t){return f.N=0,f.H=0,f.C=t&1,t=t>>>1&127,f.Z=t?0:1,f.P=l0(t),f.S=0,Q(t),t},ee=function(t){f.N=0;var b=A+t;f.C=b&65536?1:0,f.H=(A&4095)+(t&4095)&4096?1:0,Q((b&65280)>>>8),A=b&65535},S=[];S[0]=function(){},S[1]=function(){i=i+1&65535,m=e.mem_read(i),i=i+1&65535,c=e.mem_read(i)},S[2]=function(){e.mem_write(m|c<<8,r)},S[3]=function(){var t=m|c<<8;t+=1,m=t&255,c=(t&65280)>>>8},S[4]=function(){c=O(c)},S[5]=function(){c=E(c)},S[6]=function(){i=i+1&65535,c=e.mem_read(i)},S[7]=function(){var t=f.S,b=f.Z,P=f.P;r=o0(r),f.S=t,f.Z=b,f.P=P},S[8]=function(){var t=r;r=W,W=t,t=X0(),F0(W0()),w0(t)},S[9]=function(){_0(m|c<<8)},S[10]=function(){r=e.mem_read(m|c<<8)},S[11]=function(){var t=m|c<<8;t-=1,m=t&255,c=(t&65280)>>>8},S[12]=function(){m=O(m)},S[13]=function(){m=E(m)},S[14]=function(){i=i+1&65535,m=e.mem_read(i)},S[15]=function(){var t=f.S,b=f.Z,P=f.P;r=d0(r),f.S=t,f.Z=b,f.P=P},S[16]=function(){c=c-1&255,z0(c!==0)},S[17]=function(){i=i+1&65535,d=e.mem_read(i),i=i+1&65535,o=e.mem_read(i)},S[18]=function(){e.mem_write(d|o<<8,r)},S[19]=function(){var t=d|o<<8;t+=1,d=t&255,o=(t&65280)>>>8},S[20]=function(){o=O(o)},S[21]=function(){o=E(o)},S[22]=function(){i=i+1&65535,o=e.mem_read(i)},S[23]=function(){var t=f.S,b=f.Z,P=f.P;r=Z0(r),f.S=t,f.Z=b,f.P=P},S[24]=function(){var t=L(e.mem_read(i+1&65535));i=i+t+1&65535},S[25]=function(){_0(d|o<<8)},S[26]=function(){r=e.mem_read(d|o<<8)},S[27]=function(){var t=d|o<<8;t-=1,d=t&255,o=(t&65280)>>>8},S[28]=function(){d=O(d)},S[29]=function(){d=E(d)},S[30]=function(){i=i+1&65535,d=e.mem_read(i)},S[31]=function(){var t=f.S,b=f.Z,P=f.P;r=k0(r),f.S=t,f.Z=b,f.P=P},S[32]=function(){z0(!f.Z)},S[33]=function(){i=i+1&65535,a=e.mem_read(i),i=i+1&65535,x=e.mem_read(i)},S[34]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,a),e.mem_write(t+1&65535,x)},S[35]=function(){var t=a|x<<8;t+=1,a=t&255,x=(t&65280)>>>8},S[36]=function(){x=O(x)},S[37]=function(){x=E(x)},S[38]=function(){i=i+1&65535,x=e.mem_read(i)},S[39]=function(){var t=r;f.N?((f.H||(r&15)>9)&&(t-=6),(f.C||r>153)&&(t-=96)):((f.H||(r&15)>9)&&(t+=6),(f.C||r>153)&&(t+=96)),f.S=t&128?1:0,f.Z=t&255?0:1,f.H=r&16^t&16?1:0,f.P=l0(t&255),f.C=f.C||r>153?1:0,r=t&255,Q(r)},S[40]=function(){z0(!!f.Z)},S[41]=function(){_0(a|x<<8)},S[42]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,a=e.mem_read(t),x=e.mem_read(t+1&65535)},S[43]=function(){var t=a|x<<8;t-=1,a=t&255,x=(t&65280)>>>8},S[44]=function(){a=O(a)},S[45]=function(){a=E(a)},S[46]=function(){i=i+1&65535,a=e.mem_read(i)},S[47]=function(){r=~r&255,f.N=1,f.H=1,Q(r)},S[48]=function(){z0(!f.C)},S[49]=function(){z=e.mem_read(i+1&65535)|e.mem_read(i+2&65535)<<8,i=i+2&65535},S[50]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,r)},S[51]=function(){z=z+1&65535},S[52]=function(){var t=a|x<<8;e.mem_write(t,O(e.mem_read(t)))},S[53]=function(){var t=a|x<<8;e.mem_write(t,E(e.mem_read(t)))},S[54]=function(){i=i+1&65535,e.mem_write(a|x<<8,e.mem_read(i))},S[55]=function(){f.N=0,f.H=0,f.C=1,Q(r)},S[56]=function(){z0(!!f.C)},S[57]=function(){_0(z)},S[58]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,r=e.mem_read(t)},S[59]=function(){z=z-1&65535},S[60]=function(){r=O(r)},S[61]=function(){r=E(r)},S[62]=function(){r=e.mem_read(i+1&65535),i=i+1&65535},S[63]=function(){f.N=0,f.H=f.C,f.C=f.C?0:1,Q(r)},S[192]=function(){U0(!f.Z)},S[193]=function(){var t=b0();m=t&255,c=(t&65280)>>>8},S[194]=function(){R0(!f.Z)},S[195]=function(){i=e.mem_read(i+1&65535)|e.mem_read(i+2&65535)<<8,i=i-1&65535},S[196]=function(){E0(!f.Z)},S[197]=function(){O0(m|c<<8)},S[198]=function(){i=i+1&65535,c0(e.mem_read(i))},S[199]=function(){p0(0)},S[200]=function(){U0(!!f.Z)},S[201]=function(){i=b0()-1&65535},S[202]=function(){R0(!!f.Z)},S[203]=function(){F=F&128|(F&127)+1&127,i=i+1&65535;var t=e.mem_read(i),b=(t&56)>>>3,P=t&7;if(t<64){var y0=[o0,d0,Z0,k0,K0,X,j0,Q0];P===0?c=y0[b](c):P===1?m=y0[b](m):P===2?o=y0[b](o):P===3?d=y0[b](d):P===4?x=y0[b](x):P===5?a=y0[b](a):P===6?e.mem_write(a|x<<8,y0[b](e.mem_read(a|x<<8))):P===7&&(r=y0[b](r))}else t<128?(P===0?f.Z=c&1<>>8},S[210]=function(){R0(!f.C)},S[211]=function(){i=i+1&65535,e.io_write(r<<8|e.mem_read(i),r)},S[212]=function(){E0(!f.C)},S[213]=function(){O0(d|o<<8)},S[214]=function(){i=i+1&65535,Z(e.mem_read(i))},S[215]=function(){p0(16)},S[216]=function(){U0(!!f.C)},S[217]=function(){var t=c;c=y,y=t,t=m,m=p,p=t,t=o,o=N,N=t,t=d,d=k,k=t,t=x,x=G,G=t,t=a,a=u0,u0=t},S[218]=function(){R0(!!f.C)},S[219]=function(){i=i+1&65535,r=e.io_read(r<<8|e.mem_read(i))},S[220]=function(){E0(!!f.C)},S[221]=function(){F=F&128|(F&127)+1&127,i=i+1&65535;var t=e.mem_read(i),b=D[t];b?(b(),t0+=s[t]):(i=i-1&65535,t0+=u[0])},S[222]=function(){i=i+1&65535,w(e.mem_read(i))},S[223]=function(){p0(24)},S[224]=function(){U0(!f.P)},S[225]=function(){var t=b0();a=t&255,x=(t&65280)>>>8},S[226]=function(){R0(!f.P)},S[227]=function(){var t=e.mem_read(z);e.mem_write(z,a),a=t,t=e.mem_read(z+1&65535),e.mem_write(z+1&65535,x),x=t},S[228]=function(){E0(!f.P)},S[229]=function(){O0(a|x<<8)},S[230]=function(){i=i+1&65535,f0(e.mem_read(i))},S[231]=function(){p0(32)},S[232]=function(){U0(!!f.P)},S[233]=function(){i=a|x<<8,i=i-1&65535},S[234]=function(){R0(!!f.P)},S[235]=function(){var t=o;o=x,x=t,t=d,d=a,a=t},S[236]=function(){E0(!!f.P)},S[237]=function(){F=F&128|(F&127)+1&127,i=i+1&65535;var t=e.mem_read(i),b=R[t];b?(b(),t0+=n[t]):t0+=u[0]},S[238]=function(){i=i+1&65535,n0(e.mem_read(i))},S[239]=function(){p0(40)},S[240]=function(){U0(!f.S)},S[241]=function(){var t=b0();F0(t&255),r=(t&65280)>>>8},S[242]=function(){R0(!f.S)},S[243]=function(){v=!0},S[244]=function(){E0(!f.S)},S[245]=function(){O0(X0()|r<<8)},S[246]=function(){i=i+1&65535,M(e.mem_read(i))},S[247]=function(){p0(48)},S[248]=function(){U0(!!f.S)},S[249]=function(){z=a|x<<8},S[250]=function(){R0(!!f.S)},S[251]=function(){Y0=!0},S[252]=function(){E0(!!f.S)},S[253]=function(){F=F&128|(F&127)+1&127,i=i+1&65535;var t=e.mem_read(i),b=D[t];if(b){var P=A;A=B,b(),B=A,A=P,t0+=s[t]}else i=i-1&65535,t0+=u[0]},S[254]=function(){i=i+1&65535,T(e.mem_read(i))},S[255]=function(){p0(56)};let R=[];R[64]=function(){c=C0(c<<8|m)},R[65]=function(){e.io_write(c<<8|m,c)},R[66]=function(){r0(m|c<<8)},R[67]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,m),e.mem_write(t+1&65535,c)},R[68]=function(){$()},R[69]=function(){i=b0()-1&65535,V=D0},R[70]=function(){T0=0},R[71]=function(){I=r},R[72]=function(){m=C0(c<<8|m)},R[73]=function(){e.io_write(c<<8|m,m)},R[74]=function(){H(m|c<<8)},R[75]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,m=e.mem_read(t),c=e.mem_read(t+1&65535)},R[76]=function(){$()},R[77]=function(){i=b0()-1&65535},R[78]=function(){T0=0},R[79]=function(){F=r},R[80]=function(){o=C0(c<<8|m)},R[81]=function(){e.io_write(c<<8|m,o)},R[82]=function(){r0(d|o<<8)},R[83]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,d),e.mem_write(t+1&65535,o)},R[84]=function(){$()},R[85]=function(){i=b0()-1&65535,V=D0},R[86]=function(){T0=1},R[87]=function(){r=I,f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=D0,f.N=0,Q(r)},R[88]=function(){d=C0(c<<8|m)},R[89]=function(){e.io_write(c<<8|m,d)},R[90]=function(){H(d|o<<8)},R[91]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,d=e.mem_read(t),o=e.mem_read(t+1&65535)},R[92]=function(){$()},R[93]=function(){i=b0()-1&65535,V=D0},R[94]=function(){T0=2},R[95]=function(){r=F,f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=D0,f.N=0,Q(r)},R[96]=function(){x=C0(c<<8|m)},R[97]=function(){e.io_write(c<<8|m,x)},R[98]=function(){r0(a|x<<8)},R[99]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,a),e.mem_write(t+1&65535,x)},R[100]=function(){$()},R[101]=function(){i=b0()-1&65535,V=D0},R[102]=function(){T0=0},R[103]=function(){var t=e.mem_read(a|x<<8),b=t&15,P=r&15;t=(t&240)>>>4|P<<4,r=r&240|b,e.mem_write(a|x<<8,t),f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=l0(r)?1:0,f.N=0,Q(r)},R[104]=function(){a=C0(c<<8|m)},R[105]=function(){e.io_write(c<<8|m,a)},R[106]=function(){H(a|x<<8)},R[107]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,a=e.mem_read(t),x=e.mem_read(t+1&65535)},R[108]=function(){$()},R[109]=function(){i=b0()-1&65535,V=D0},R[110]=function(){T0=0},R[111]=function(){var t=e.mem_read(a|x<<8),b=t&240,P=r&15;t=(t&15)<<4|P,r=r&240|b>>>4,e.mem_write(a|x<<8,t),f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=l0(r)?1:0,f.N=0,Q(r)},R[112]=function(){C0(c<<8|m)},R[113]=function(){e.io_write(c<<8|m,0)},R[114]=function(){r0(z)},R[115]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,z&255),e.mem_write(t+1&65535,z>>>8&255)},R[116]=function(){$()},R[117]=function(){i=b0()-1&65535,V=D0},R[118]=function(){T0=1},R[120]=function(){r=C0(c<<8|m)},R[121]=function(){e.io_write(c<<8|m,r)},R[122]=function(){H(z)},R[123]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,z=e.mem_read(t),z|=e.mem_read(t+1&65535)<<8},R[124]=function(){$()},R[125]=function(){i=b0()-1&65535,V=D0},R[126]=function(){T0=2},R[160]=function(){m0()},R[161]=function(){N0()},R[162]=function(){Y()},R[163]=function(){e0()},R[168]=function(){s0()},R[169]=function(){P0()},R[170]=function(){B0()},R[171]=function(){H0()},R[176]=function(){m0(),(c||m)&&(t0+=5,i=i-2&65535)},R[177]=function(){N0(),!f.Z&&(c||m)&&(t0+=5,i=i-2&65535)},R[178]=function(){Y(),c&&(t0+=5,i=i-2&65535)},R[179]=function(){e0(),c&&(t0+=5,i=i-2&65535)},R[184]=function(){s0(),(c||m)&&(t0+=5,i=i-2&65535)},R[185]=function(){P0(),!f.Z&&(c||m)&&(t0+=5,i=i-2&65535)},R[186]=function(){B0(),c&&(t0+=5,i=i-2&65535)},R[187]=function(){H0(),c&&(t0+=5,i=i-2&65535)};let D=[];D[9]=function(){ee(m|c<<8)},D[25]=function(){ee(d|o<<8)},D[33]=function(){i=i+1&65535,A=e.mem_read(i),i=i+1&65535,A|=e.mem_read(i)<<8},D[34]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,A&255),e.mem_write(t+1&65535,A>>>8&255)},D[35]=function(){A=A+1&65535},D[36]=function(){A=O(A>>>8)<<8|A&255},D[37]=function(){A=E(A>>>8)<<8|A&255},D[38]=function(){i=i+1&65535,A=e.mem_read(i)<<8|A&255},D[41]=function(){ee(A)},D[42]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,A=e.mem_read(t),A|=e.mem_read(t+1&65535)<<8},D[43]=function(){A=A-1&65535},D[44]=function(){A=O(A&255)|A&65280},D[45]=function(){A=E(A&255)|A&65280},D[46]=function(){i=i+1&65535,A=e.mem_read(i)&255|A&65280},D[52]=function(){i=i+1&65535;var t=L(e.mem_read(i)),b=e.mem_read(t+A&65535);e.mem_write(t+A&65535,O(b))},D[53]=function(){i=i+1&65535;var t=L(e.mem_read(i)),b=e.mem_read(t+A&65535);e.mem_write(t+A&65535,E(b))},D[54]=function(){i=i+1&65535;var t=L(e.mem_read(i));i=i+1&65535,e.mem_write(A+t&65535,e.mem_read(i))},D[57]=function(){ee(z)},D[68]=function(){c=A>>>8&255},D[69]=function(){c=A&255},D[70]=function(){i=i+1&65535;var t=L(e.mem_read(i));c=e.mem_read(A+t&65535)},D[76]=function(){m=A>>>8&255},D[77]=function(){m=A&255},D[78]=function(){i=i+1&65535;var t=L(e.mem_read(i));m=e.mem_read(A+t&65535)},D[84]=function(){o=A>>>8&255},D[85]=function(){o=A&255},D[86]=function(){i=i+1&65535;var t=L(e.mem_read(i));o=e.mem_read(A+t&65535)},D[92]=function(){d=A>>>8&255},D[93]=function(){d=A&255},D[94]=function(){i=i+1&65535;var t=L(e.mem_read(i));d=e.mem_read(A+t&65535)},D[96]=function(){A=A&255|c<<8},D[97]=function(){A=A&255|m<<8},D[98]=function(){A=A&255|o<<8},D[99]=function(){A=A&255|d<<8},D[100]=function(){},D[101]=function(){A=A&255|(A&255)<<8},D[102]=function(){i=i+1&65535;var t=L(e.mem_read(i));x=e.mem_read(A+t&65535)},D[103]=function(){A=A&255|r<<8},D[104]=function(){A=A&65280|c},D[105]=function(){A=A&65280|m},D[106]=function(){A=A&65280|o},D[107]=function(){A=A&65280|d},D[108]=function(){A=A&65280|A>>>8},D[109]=function(){},D[110]=function(){i=i+1&65535;var t=L(e.mem_read(i));a=e.mem_read(A+t&65535)},D[111]=function(){A=A&65280|r},D[112]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,c)},D[113]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,m)},D[114]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,o)},D[115]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,d)},D[116]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,x)},D[117]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,a)},D[119]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,r)},D[124]=function(){r=A>>>8&255},D[125]=function(){r=A&255},D[126]=function(){i=i+1&65535;var t=L(e.mem_read(i));r=e.mem_read(A+t&65535)},D[132]=function(){c0(A>>>8&255)},D[133]=function(){c0(A&255)},D[134]=function(){i=i+1&65535;var t=L(e.mem_read(i));c0(e.mem_read(A+t&65535))},D[140]=function(){i0(A>>>8&255)},D[141]=function(){i0(A&255)},D[142]=function(){i=i+1&65535;var t=L(e.mem_read(i));i0(e.mem_read(A+t&65535))},D[148]=function(){Z(A>>>8&255)},D[149]=function(){Z(A&255)},D[150]=function(){i=i+1&65535;var t=L(e.mem_read(i));Z(e.mem_read(A+t&65535))},D[156]=function(){w(A>>>8&255)},D[157]=function(){w(A&255)},D[158]=function(){i=i+1&65535;var t=L(e.mem_read(i));w(e.mem_read(A+t&65535))},D[164]=function(){f0(A>>>8&255)},D[165]=function(){f0(A&255)},D[166]=function(){i=i+1&65535;var t=L(e.mem_read(i));f0(e.mem_read(A+t&65535))},D[172]=function(){n0(A>>>8&255)},D[173]=function(){n0(A&255)},D[174]=function(){i=i+1&65535;var t=L(e.mem_read(i));n0(e.mem_read(A+t&65535))},D[180]=function(){M(A>>>8&255)},D[181]=function(){M(A&255)},D[182]=function(){i=i+1&65535;var t=L(e.mem_read(i));M(e.mem_read(A+t&65535))},D[188]=function(){T(A>>>8&255)},D[189]=function(){T(A&255)},D[190]=function(){i=i+1&65535;var t=L(e.mem_read(i));T(e.mem_read(A+t&65535))},D[203]=function(){i=i+1&65535;var t=L(e.mem_read(i));i=i+1&65535;var b=e.mem_read(i),P;if(b<64){var y0=[o0,d0,Z0,k0,K0,X,j0,Q0],J0=y0[(b&56)>>>3],P=J0(e.mem_read(A+t&65535));e.mem_write(A+t&65535,P)}else{var L0=(b&56)>>>3;b<128?(f.N=0,f.H=1,f.Z=e.mem_read(A+t&65535)&1<>>8&255)},D[229]=function(){O0(A)},D[233]=function(){i=A-1&65535},D[249]=function(){z=A};let u=[4,10,7,6,4,4,7,4,4,11,7,6,4,4,7,4,8,10,7,6,4,4,7,4,12,11,7,6,4,4,7,4,7,10,16,6,4,4,7,4,7,11,16,6,4,4,7,4,7,10,13,6,11,11,10,4,7,11,13,6,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,7,7,7,7,7,7,4,7,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,5,10,10,10,10,11,7,11,5,10,10,0,10,17,7,11,5,10,10,11,10,11,7,11,5,4,10,11,10,0,7,11,5,10,10,19,10,11,7,11,5,4,10,4,10,0,7,11,5,10,10,4,10,11,7,11,5,6,10,4,10,0,7,11],n=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,8,14,8,9,12,12,15,20,8,14,8,9,12,12,15,20,8,14,8,9,12,12,15,20,8,14,8,9,12,12,15,20,8,14,8,18,12,12,15,20,8,14,8,18,12,12,15,20,8,14,8,0,12,12,15,20,8,14,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,0,0,0,0,16,16,16,16,0,0,0,0,16,16,16,16,0,0,0,0,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],g=[8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8],s=[0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,14,20,10,8,8,11,0,0,15,20,10,8,8,11,0,0,0,0,0,23,23,19,0,0,15,0,0,0,0,0,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,8,8,8,8,8,8,19,8,8,8,8,8,8,8,19,8,19,19,19,19,19,19,0,19,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,23,0,15,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0];this.saveState=q,this.loadState=V0,this.reset=K,this.advanceInsn=U,this.interrupt=A0,this.getPC=()=>i,this.getSP=()=>z,this.getHalted=()=>_}var at=class{constructor(){this.retryInterrupts=!1;this.retryData=-1}buildCPU(){this.memBus&&this.ioBus&&(this.cpu=new on({mem_read:this.memBus.read.bind(this.memBus),mem_write:this.memBus.write.bind(this.memBus),io_read:this.ioBus.read.bind(this.ioBus),io_write:this.ioBus.write.bind(this.ioBus)}))}connectMemoryBus(e){this.memBus=e,this.buildCPU()}connectIOBus(e){this.ioBus=e,this.buildCPU()}advanceInsn(){return this.retryInterrupts&&this.retryData>=0&&this.cpu.interrupt(!1,this.retryData)&&(this.retryData=-1),this.cpu.advanceInsn()}reset(){this.cpu.reset()}interrupt(e){!this.cpu.interrupt(!1,e)&&this.retryInterrupts&&(this.retryData=e)}NMI(){this.cpu.interrupt(!0,0)}getSP(){return this.cpu.getSP()}getPC(){return this.cpu.getPC()}isHalted(){return this.cpu.getHalted()}saveState(){return this.cpu.saveState()}loadState(e){this.cpu.loadState(e)}isStable(){return!0}};var vt=class{constructor(){this.master=new MasterChannel}start(){this.looper||(this.looper=new AudioLooper(512),this.looper.setChannel(this.master),this.looper.activate())}stop(){this.looper&&(this.looper.setChannel(null),this.looper=null)}},xn=class{constructor(e){this.psg=new PsgDeviceChannel;this.curreg=0;this.master=e,this.psg.setMode(PsgDeviceChannel.MODE_SIGNED),this.psg.setDevice(PsgDeviceChannel.DEVICE_AY_3_8910),e.master.addChannel(this.psg)}reset(){for(var e=15;e>=0;e--)this.selectRegister(e),this.setData(0)}selectRegister(e){this.curreg=e&15}setData(e){this.psg.writeRegisterAY(this.curreg,e&255)}readData(){return this.psg.readRegister(this.curreg)}currentRegister(){return this.curreg}},un=class{constructor(e){this.psg=new PsgDeviceChannel;this.master=e,this.psg.setMode(PsgDeviceChannel.MODE_SIGNED),this.psg.setDevice(PsgDeviceChannel.DEVICE_SN76489),e.master.addChannel(this.psg)}reset(){}setData(e){this.psg.writeRegisterSN(0,e&255)}};function Zn(h){for(var e=new vt,r=1;r<=h;r++){var c=new mn;e["pokey"+r]=c,e.master.addChannel(c)}return e}function Ne(h,e){for(var r=new Uint8Array(h.length*e.length),c=0,m=0;m.5?1:0;var W0=Ne(L,K),F0=Ne(K,V0),w0=[W0,K,F0,K,L,q,V0,q],Q=Xe(2),l0=Xe(6),O0=Xe(31),b0=Xe(93),R0=Ne(A0,V0),z0=Ne(K,Q),E0=Ne(K,l0),U0=[t0,V0,R0,F0,Q,Q,O0,z0,U,K,O0,t0,l0,l0,b0,E0],p0=new Uint8Array(16),c0=new Float32Array(4),i0=new Float32Array(4),Z=new Float32Array(4),w=new Uint8Array(4),T=[t0,t0,t0,t0],f0,M,n0,O,E=!0;this.setBufferLength=function(H){f0=new Int32Array(H)},this.getBuffer=function(){return f0},this.setSampleRate=function(H){M=H,O=v/H};function _0(H){var r0=p0[8],C0=r0&N?G:k,$,m0=H&4,N0=m0>>1,Y=m0>>2;r0&a>>Y?(r0&d>>Y?$=p0[m0+2]*256+p0[m0+0]+7:$=(p0[m0+2]*256+p0[m0+0]+1)*C0,i0[N0+1]=O/$,i0[N0+0]=0):(r0&d>>Y?$=p0[m0+0]+4:$=(p0[m0+0]+1)*C0,i0[N0+0]=O/$,$=(p0[m0+2]+1)*C0,i0[N0+1]=O/$)}this.setRegister=function(H,r0){if(H&=15,r0&=255,p0[H]!=r0)switch(p0[H]=r0,H){case 0:case 2:case 4:case 6:case 8:E=!0;break;case 1:case 3:case 5:case 7:Z[H>>1]=r0&15,T[H>>1]=w0[r0>>5];break}},this.getRegister=function(H){return H&=15,p0[H]},this.setTIARegister=function(H,r0){switch(H){case 23:case 24:p0[(H&1)*4]=r0&31,E=!0;break;case 21:case 22:T[(H&1)*2]=U0[r0&15];break;case 25:case 26:Z[(H&1)*2]=r0&15;break}},this.generate=function(H){E&&(_0(0),_0(4),E=!1);for(var r0=0;r00&&m0<1&&N0>0){var Y=T[$],e0=c0[$]+=m0;e0>Y.length&&(e0=c0[$]=e0-Math.floor(e0/Y.length)*Y.length);var s0=Y[Math.floor(e0)];s0&&(C0+=N0)}}C0*=64,f0[r0]=C0,f0[r0+1]=C0}}},Mn=function(h){var e,r,c=[],m=0;h.onmessage=function(o){o&&o.data&&o.data.samples&&r&&(c.push(o.data.samples),m+=o.data.samples.length)},this.setBufferLength=function(o){r=new Int16Array(o),m=0},this.getBuffer=function(){return r},this.setSampleRate=function(o){e=o,h.postMessage({sampleRate:o})},this.generate=function(o){if(m=o.length)){d=0,x[W]=o;var u0=(W+1)%x.length;u0==a?W=Math.floor(a+y/2)%x.length:W=u0,o=x[W]}},this.feedSample=function(G,u0){if(m+=G*u0,r+=c*u0,r>=1){for(m/=r;r>=1;)this.addSingleSample(m*c),r-=1;m*=r}}},it=class{constructor(e){this.sa=new ln(e)}feedSample(e,r){this.sa.feedSample(e,r)}start(){this.sa.start()}stop(){this.sa.stop()}},bn=class{constructor(e,r,c){this.audioGain=1/8192;this.bufferLength=r*2,this.channels=e.generate?[e]:e,this.channels.forEach(m=>{m.setBufferLength(this.bufferLength),m.setSampleRate(c)})}generate(e){var r=this.bufferLength,c=this.channels.map(o=>o.getBuffer());this.channels.forEach(o=>{o.generate(r)});for(let o=0;om+=d[o]),e.feedSample(m*this.audioGain,1)}}};var I0;(function(I){I[I.CLOCKS=0]="CLOCKS",I[I.EXECUTE=16777216]="EXECUTE",I[I.INTERRUPT=134217728]="INTERRUPT",I[I.ILLEGAL=150994944]="ILLEGAL",I[I.SP_PUSH=167772160]="SP_PUSH",I[I.SP_POP=184549376]="SP_POP",I[I.HAS_VALUE=268435456]="HAS_VALUE",I[I.MEM_READ=301989888]="MEM_READ",I[I.MEM_WRITE=318767104]="MEM_WRITE",I[I.IO_READ=335544320]="IO_READ",I[I.IO_WRITE=352321536]="IO_WRITE",I[I.VRAM_READ=369098752]="VRAM_READ",I[I.VRAM_WRITE=385875968]="VRAM_WRITE",I[I.DMA_READ=402653184]="DMA_READ",I[I.DMA_WRITE=419430400]="DMA_WRITE",I[I.WAIT=520093696]="WAIT",I[I.SCANLINE=2113929216]="SCANLINE",I[I.FRAME=2130706432]="FRAME"})(I0||(I0={}));var ft=class{constructor(e,r){this.idx=0;this.sl=0;this.cur_sp=-1;this.singleFrame=!0;this.m=e,this.reset(r||1048576)}start(){this.m.connectProbe(this)}stop(){this.m.connectProbe(null)}reset(e){e&&(this.buf=new Uint32Array(e)),this.sl=0,this.cur_sp=-1,this.clear()}clear(){this.idx=0}logData(e){this.log(e)}log(e){this.idx>=this.buf.length||(this.buf[this.idx++]=e)}relog(e){this.buf[this.idx-1]=e}lastOp(){return this.idx>0?this.buf[this.idx-1]&4278190080:-1}lastAddr(){return this.idx>0?this.buf[this.idx-1]&16777215:-1}addLogBuffer(e){this.idx+e.length>this.buf.length&&(e=e.slice(0,this.buf.length-this.idx)),this.buf.set(e,this.idx),this.idx+=e.length}logClocks(e){e|=0,e>0&&(this.lastOp()==0?this.relog(this.lastAddr()+e|0):this.log(e|0))}logNewScanline(){this.log(2113929216),this.sl++}logNewFrame(){this.log(2130706432),this.sl=0,this.singleFrame&&this.clear()}logExecute(e,r){this.cur_sp!==r&&(rthis.cur_sp&&this.log(184549376|r),this.cur_sp=r),this.log(e|16777216)}logInterrupt(e){this.log(e|134217728)}logValue(e,r,c){this.log(e&65535|(r&255)<<16|c)}logRead(e,r){this.logValue(e,r,301989888)}logWrite(e,r){this.logValue(e,r,318767104)}logIORead(e,r){this.logValue(e,r,335544320)}logIOWrite(e,r){this.logValue(e,r,352321536)}logVRAMRead(e,r){this.logValue(e,r,369098752)}logVRAMWrite(e,r){this.logValue(e,r,385875968)}logIllegal(e){this.log(e|150994944)}logWait(e){this.log(e|520093696)}logDMARead(e,r){this.logValue(e,r,402653184)}logDMAWrite(e,r){this.logValue(e,r,419430400)}countEvents(e){for(var r=0,c=0;c{let c=e.read(r);return this.probe.logRead(r,c),c},write:(r,c)=>{this.probe.logWrite(r,c),e.write(r,c)}}}connectCPUMemoryBus(e){this.cpu.connectMemoryBus(this.probeMemoryBus(e))}probeIOBus(e){return{read:r=>{let c=e.read(r);return this.probe.logIORead(r,c),c},write:(r,c)=>{this.probe.logIOWrite(r,c),e.write(r,c)}}}probeDMABus(e){return{read:r=>{let c=e.read(r);return this.probe.logDMARead(r,c),c},write:(r,c)=>{this.probe.logDMAWrite(r,c),e.write(r,c)}}}connectCPUIOBus(e){this.cpu.connectIOBus(this.probeIOBus(e))}},pt=class extends gt{constructor(){super(...arguments);this.overscan=!1;this.rotate=0}getAudioParams(){return{sampleRate:this.sampleRate,stereo:!1}}connectAudio(e){this.audio=e}getVideoParams(){return{width:this.canvasWidth,height:this.numVisibleScanlines,aspect:this.aspectRatio,overscan:this.overscan,rotate:this.rotate}}connectVideo(e){this.pixels=e}},dn=class extends pt{advanceFrame(e){this.preFrame();var r=0,c=0;this.probe.logNewFrame(),this.frameCycles=0;for(var m=0;m=64&&r<=127&&(x=Pt[r-64]),r>=160&&r<=191&&(x=Pt[r-160+64]),d++;break;case 221:case 253:var y=e==221?"ix":"iy";r==203?(x=kt[m],a[2]=m,a[3]=c,d++):x=_t[r],x=x.replace(/[(]hl[)]/,"("+y+"+x)"),x=x.replace(/\bhl\b/,y),d++;break;default:x=_t[e];break}if((!x||!x.length)&&(x="??"),/\bxx\b/.test(x))x=x.replace(/\bxx\b/,"$"+a0(a[d]+(a[d+1]<<8),4)),d+=2,W=!0;else if(/\bx\b/.test(x)){if(x.startsWith("j")){var p=r<128?h+2+r:h+2-(256-r);p&=65535,x=x.replace(/\bx\b/,"$"+a0(p,4)),W=!0}else x=x.replace(/\bx\b/,"$"+a0(a[d],2));d+=1}return{line:x.toUpperCase(),nbytes:d,isaddr:W}}var Ve=class{constructor(e){this.maxROMSize=262144;this.videoOffsetBytes=0;this.prefix=e;var r=this;this.cpu={getPC:r.getPC.bind(r),getSP:r.getSP.bind(r),isStable:r.isStable.bind(r),reset:r.reset.bind(r),saveState:()=>r.getCPUState(),loadState:()=>{console.log("loadState not implemented")},connectMemoryBus(){console.log("connectMemoryBus not implemented")}}}getImports(e){return{}}async fetchWASM(){var e=await fetch("res/"+this.prefix+".wasm");if(e.status==200||e.size){var r=await e.arrayBuffer(),c=await WebAssembly.compile(r),m=await WebAssembly.instantiate(c,this.getImports(c));this.instance=m,this.exports=m.exports}else throw new Error("could not load WASM file")}async fetchBIOS(){var e=await fetch("res/"+this.prefix+".bios");if(e.status==200||e.size){var r=await e.arrayBuffer();this.biosptr=this.exports.malloc(r.byteLength),this.biosarr=new Uint8Array(this.exports.memory.buffer,this.biosptr,r.byteLength),this.loadBIOS(new Uint8Array(r))}else throw new Error("could not load BIOS file")}async initWASM(){this.sys=this.exports.machine_init(this.biosptr);let e=this.exports.machine_get_state_size();this.stateptr=this.exports.malloc(e);let r=this.exports.machine_get_controls_state_size();this.ctrlstateptr=this.exports.malloc(r);let c=this.exports.machine_get_cpu_state_size();this.cpustateptr=this.exports.malloc(c),this.romptr=this.exports.malloc(this.maxROMSize),this.statearr=new Uint8Array(this.exports.memory.buffer,this.stateptr,e),this.ctrlstatearr=new Uint8Array(this.exports.memory.buffer,this.ctrlstateptr,r),this.cpustatearr=new Uint8Array(this.exports.memory.buffer,this.cpustateptr,c);let m=4096*4;this.audioarr=new Float32Array(this.exports.memory.buffer,this.exports.machine_get_sample_buffer(),m),this.romarr=new Uint8Array(this.exports.memory.buffer,this.romptr,this.maxROMSize),console.log("machine_init",this.sys,e,r,c,m)}async loadWASM(){await this.fetchWASM(),this.exports.memory.grow(96),await this.fetchBIOS(),await this.initWASM()}getPC(){return this.exports.machine_cpu_get_pc(this.sys)}getSP(){return this.exports.machine_cpu_get_sp(this.sys)}isStable(){return this.exports.machine_cpu_is_stable(this.sys)}loadROM(e){if(e.length>this.maxROMSize)throw new At(`Rom size too big: ${e.length} bytes`);this.romarr.set(e),this.romlen=e.length,console.log("load rom",e.length,"bytes"),this.reset()}loadBIOS(e){this.biosarr.set(e)}reset(){this.exports.machine_reset(this.sys)}read(e){return this.exports.machine_mem_read(this.sys,e&65535)}readConst(e){return this.exports.machine_mem_read(this.sys,e&65535)}write(e,r){this.exports.machine_mem_write(this.sys,e&65535,r&255)}getAudioParams(){return{sampleRate:44100,stereo:!1}}connectVideo(e){this.pixel_dest=e;var r=this.exports.machine_get_pixel_buffer(this.sys);console.log("connectVideo",r,e.length),this.pixel_src=new Uint32Array(this.exports.memory.buffer,r+this.videoOffsetBytes,e.length)}syncVideo(){this.exports.machine_update_video&&this.exports.machine_update_video(this.sys),this.pixel_dest!=null&&this.pixel_dest.set(this.pixel_src)}saveControlsState(){return this.exports.machine_save_controls_state(this.sys,this.ctrlstateptr),{controls:this.ctrlstatearr.slice(0)}}loadControlsState(e){this.ctrlstatearr.set(e.controls),this.exports.machine_load_controls_state(this.sys,this.ctrlstateptr)}connectAudio(e){this.audio=e}syncAudio(){if(this.audio!=null)for(var e=this.exports.machine_get_sample_count(),r=0;r>1)&128)>>6},K=function(u,n,g){a|=((u^n^g^g>>1)&32768)>>14},U=function(){return(e<<8)+r},A0=function(u){e=u>>8&255,r=u&255},x0=function(u){_(--d,u&255)},L=function(u){_(--d,u&255),_(--d,u>>8&255)},X0=function(u){_(--o,u&255)},W0=function(u){_(--o,u&255),_(--o,u>>8&255)},F0=function(){return v(d++)},w0=function(){return v(d++)*256+v(d++)},Q=function(){return v(o++)},l0=function(){return v(o++)*256+v(o++)},O0=function(u){var n=0;u&128&&(L(x),n+=2),u&64&&(L(o),n+=2),u&32&&(L(m),n+=2),u&16&&(L(c),n+=2),u&8&&(x0(W),n++),u&4&&(x0(r),n++),u&2&&(x0(e),n++),u&1&&(x0(a),n++),V+=n},b0=function(u){var n=0;u&128&&(W0(x),n+=2),u&64&&(W0(d),n+=2),u&32&&(W0(m),n+=2),u&16&&(W0(c),n+=2),u&8&&(X0(W),n++),u&4&&(X0(r),n++),u&2&&(X0(e),n++),u&1&&(X0(a),n++),V+=n},R0=function(u){var n=0;u&1&&(a=F0(),n++),u&2&&(e=F0(),n++),u&4&&(r=F0(),n++),u&8&&(W=F0(),n++),u&16&&(c=w0(),n+=2),u&32&&(m=w0(),n+=2),u&64&&(o=w0(),n+=2),u&128&&(x=w0(),n+=2),V+=n},z0=function(u){var n=0;u&1&&(a=Q(),n++),u&2&&(e=Q(),n++),u&4&&(r=Q(),n++),u&8&&(W=Q(),n++),u&16&&(c=l0(),n+=2),u&32&&(m=l0(),n+=2),u&64&&(d=l0(),n+=2),u&128&&(x=l0(),n+=2),V+=n},E0=function(u){switch(u&15){case 0:return U();case 1:return c;case 2:return m;case 3:return o;case 4:return d;case 5:return x;case 8:return e;case 9:return r;case 10:return a;case 11:return W;default:return null}},U0=function(u,n){switch(u&15){case 0:A0(n);return;case 1:c=n;return;case 2:m=n;return;case 3:o=n;return;case 4:d=n;return;case 5:x=n;return;case 8:e=n;return;case 9:r=n;return;case 10:a=n;return;case 11:W=n;return;default:return}},p0=function(u,n){var g=u&136;(g==128||g==8)&&(g=0),n?(g=E0(u>>4),U0(u>>4,E0(u)),U0(u,g)):U0(u,E0(u>>4))},c0=function(u){return u>127?u-256:u},i0=function(u){return u>32767?u-65536:u},Z=function(){var u=v(x++);return x&=65535,u},w=function(){var u=v(x++);x&=65535;var n=v(x++);return x&=65535,u*256+n},T=function(u){var n=v(u++);u&=65535;var g=v(u++);return u&=65535,n*256+g},f0=function(u,n){_(u++,n>>8&255),u&=65535,_(u,n&255)},M=function(){var u=Z(),n;switch(u&96){case 0:n=c;break;case 32:n=m;break;case 64:n=o;break;case 96:n=d;break}var g=null,s=null,t;if(u&128){switch(u&15){case 0:s=n,g=n+1,V+=2;break;case 1:s=n,g=n+2,V+=3;break;case 2:g=n-1,s=g,V+=2;break;case 3:g=n-2,s=g,V+=3;break;case 4:s=n;break;case 5:s=n+c0(r),V+=1;break;case 6:s=n+c0(e),V+=1;break;case 7:s=0;break;case 8:s=n+c0(Z()),V+=1;break;case 9:s=n+i0(w()),V+=4;break;case 10:s=0;break;case 11:V+=4,s=n+U();break;case 12:t=c0(Z()),s=x+t,V+=1;break;case 13:t=i0(w()),s=x+t,V+=5;break;case 14:s=0;break;case 15:V+=5,s=w();break}s&=65535,u&16&&(s=v(s)*256+v(s+1&65535),V+=3)}else{var b=u&31;b>15&&(b-=32),s=n+b,V+=1}if(g!==null)switch(u&96){case 0:c=g;break;case 32:m=g;break;case 64:o=g;break;case 96:d=g;break}return s&65535},n0=function(u){a&=~(N|k),u===0&&(a|=N),u&32768&&(a|=k)},O=function(u){return u++,u&=255,a&=~(N|p|k),a|=q[u],(u===0||u==128)&&(a|=p),u},E=function(u){return u--,u&=255,a&=~(N|p|k),a|=q[u],(u===127||u==255)&&(a|=p),u},_0=function(u,n){var g=u-n;return a&=~(y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g),g&255},H=function(u,n){var g=u-n;return a&=~(y|N|p|k),(g&65535)==0&&(a|=N),g&32768&&(a|=k),g&65536&&(a|=y),K(u,n,g),g&65535},r0=function(u,n){var g=u+n;return a&=~(u0|y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g),(g^u^n)&16&&(a|=u0),g&255},C0=function(u,n){var g=u+n;return a&=~(y|N|p|k),(g&65535)==0&&(a|=N),g&32768&&(a|=k),g&65536&&(a|=y),K(u,n,g),g&65535},$=function(u,n){var g=u+n+(a&y);return a&=~(u0|y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g),(g^u^n)&16&&(a|=u0),g&255},m0=function(u,n){var g=u-n-(a&y);return a&=~(y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g),g&255},N0=function(u,n){var g=u-n;a&=~(y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g)},Y=function(u,n){var g=u-n;a&=~(y|N|p|k),(g&65535)==0&&(a|=N),g&32768&&(a|=k),g&65536&&(a|=y),K(u,n,g)},e0=function(u){return a&=~(y|N|p|k),u==128&&(a|=p),u=(~u&255)+1,u===0&&(a|=N),u&128&&(a|=k|y),u},s0=function(u){return a&=~(N|y|k),u&1&&(a|=y),u>>=1,u===0&&(a|=N),u&255},P0=function(u){return a&=~(N|y|k),u&1&&(a|=y),u=u&128|u>>1,a|=q[u],u},B0=function(u){var n=u;return a&=~(N|y|k|p),u&128&&(a|=y),u<<=1,a|=q[u],(u^n)&128&&(a|=p),u},H0=function(u){var n=u,g=a&y;return a&=~(N|y|k|p),u&128&&(a|=y),u=u<<1|g,a|=q[u],(u^n)&128&&(a|=p),u},o0=function(u){var n=a&y;return a&=~(N|y|k),u&1&&(a|=y),u=u>>1|n<<7,a|=q[u],u},d0=function(u,n){return a&=~(N|k|p),u^=n,a|=q[u],u},Z0=function(u,n){return a&=~(N|k|p),u|=n,a|=q[u],u},k0=function(u,n){return a&=~(N|k|p),u&=n,a|=q[u],u},K0=function(u){return a&=~(N|k|p),u^=255,a|=q[u],a|=y,u},X=function(){return W*256+Z()},j0=function(){var u=V,n=null,g=null,s=x,t=Z();switch(V+=Y0[t],t){case 0:n=X(),_(n,e0(v(n)));break;case 3:n=X(),_(n,K0(v(n)));break;case 4:n=X(),_(n,s0(v(n)));break;case 6:n=X(),_(n,o0(v(n)));break;case 7:n=X(),_(n,P0(v(n)));break;case 8:n=X(),_(n,B0(v(n)));break;case 9:n=X(),_(n,H0(v(n)));break;case 10:n=X(),_(n,E(v(n)));break;case 12:n=X(),_(n,O(v(n)));break;case 13:n=X(),g=v(n),a&=~(N|k|p),a|=q[g];break;case 14:n=X(),x=n;break;case 15:n=X(),_(n,0),a&=~(y|k|p),a|=N;break;case 18:break;case 19:break;case 22:n=i0(w()),x+=n;break;case 23:n=i0(w()),L(x),x+=n;break;case 25:var b=0,P=e&240,y0=e&15;(y0>9||a&32)&&(b|=6),P>128&&y0>9&&(b|=96),(P>144||a&1)&&(b|=96),n=b+e,a&=~(y|k|N|p),n&256&&(a|=y),e=n&255,a|=q[e];break;case 26:a|=Z();break;case 28:a&=Z();break;case 29:e=r&128?255:0,n0(U()),a&=~p;break;case 30:g=Z(),p0(g,!0);break;case 31:g=Z(),p0(g,!1);break;case 32:n=c0(Z()),x+=n;break;case 33:n=c0(Z());break;case 34:n=c0(Z()),a&(y|N)||(x+=n);break;case 35:n=c0(Z()),a&(y|N)&&(x+=n);break;case 36:n=c0(Z()),a&y||(x+=n);break;case 37:n=c0(Z()),a&y&&(x+=n);break;case 38:n=c0(Z()),a&N||(x+=n);break;case 39:n=c0(Z()),a&N&&(x+=n);break;case 40:n=c0(Z()),a&p||(x+=n);break;case 41:n=c0(Z()),a&p&&(x+=n);break;case 42:n=c0(Z()),a&k||(x+=n);break;case 43:n=c0(Z()),a&k&&(x+=n);break;case 44:n=c0(Z()),a&k^(a&p)<<2||(x+=n);break;case 45:n=c0(Z()),a&k^(a&p)<<2&&(x+=n);break;case 46:n=c0(Z()),a&k^(a&p)<<2||a&N||(x+=n);break;case 47:n=c0(Z()),(a&k^(a&p)<<2||a&N)&&(x+=n);break;case 48:c=M(),c===0?a|=N:a&=~N;break;case 49:m=M(),m===0?a|=N:a&=~N;break;case 50:d=M();break;case 51:o=M();break;case 52:O0(Z());break;case 53:R0(Z());break;case 54:b0(Z());break;case 55:z0(Z());break;case 57:x=w0();break;case 58:c+=r;break;case 59:a=F0(),a&B&&(V+=9,e=F0(),r=F0(),W=F0(),c=w0(),m=w0(),o=w0()),x=w0();break;case 60:a&=Z();break;case 61:n=e*r,n===0?a|=N:a&=~N,n&128?a|=y:a&=~y,A0(n);break;case 63:a|=B,L(x),L(o),L(m),L(c),x0(W),x0(r),x0(e),x0(a),a|=G|A,x=T(z);break;case 64:e=e0(e);break;case 67:e=K0(e);break;case 68:e=s0(e);break;case 70:e=o0(e);break;case 71:e=P0(e);break;case 72:e=B0(e);break;case 73:e=H0(e);break;case 74:e=E(e);break;case 76:e=O(e);break;case 77:a&=~(N|k|p),a|=q[e];break;case 79:e=0,a&=~(k|p|y),a|=N;break;case 80:r=e0(r);break;case 83:r=K0(r);break;case 84:r=s0(r);break;case 86:r=o0(r);break;case 87:r=P0(r);break;case 88:r=B0(r);break;case 89:r=H0(r);break;case 90:r=E(r);break;case 92:r=O(r);break;case 93:a&=~(N|k|p),a|=q[r];break;case 95:r=0,a&=~(k|p|y),a|=N;break;case 96:n=M(),_(n,e0(v(n)));break;case 99:n=M(),_(n,K0(v(n)));break;case 100:n=M(),_(n,s0(v(n)));break;case 102:n=M(),_(n,o0(v(n)));break;case 103:n=M(),_(n,P0(v(n)));break;case 104:n=M(),_(n,B0(v(n)));break;case 105:n=M(),_(n,H0(v(n)));break;case 106:n=M(),_(n,E(v(n)));break;case 108:n=M(),_(n,O(v(n)));break;case 109:n=M(),g=v(n),a&=~(N|k|p),a|=q[g];break;case 110:n=M(),x=n;break;case 111:n=M(),_(n,0),a&=~(y|k|p),a|=N;break;case 112:n=w(),_(n,e0(v(n)));break;case 115:n=w(),_(n,K0(v(n)));break;case 116:n=w(),_(n,s0(v(n)));break;case 118:n=w(),_(n,o0(v(n)));break;case 119:n=w(),_(n,P0(v(n)));break;case 120:n=w(),_(n,B0(v(n)));break;case 121:n=w(),_(n,H0(v(n)));break;case 122:n=w(),_(n,E(v(n)));break;case 124:n=w(),_(n,O(v(n)));break;case 125:n=w(),g=v(n),a&=~(N|k|p),a|=q[g];break;case 126:n=w(),x=n;break;case 127:n=w(),_(n,0),a&=~(y|k|p),a|=N;break;case 128:e=_0(e,Z());break;case 129:N0(e,Z());break;case 130:e=m0(e,Z());break;case 131:A0(H(U(),w()));break;case 132:e=k0(e,Z());break;case 133:k0(e,Z());break;case 134:e=Z(),a&=~(N|k|p),a|=q[e];break;case 136:e=d0(e,Z());break;case 137:e=$(e,Z());break;case 138:e=Z0(e,Z());break;case 139:e=r0(e,Z());break;case 140:Y(c,w());break;case 141:n=c0(Z()),L(x),x+=n;break;case 142:c=w(),n0(c),a&=~p;break;case 144:n=X(),e=_0(e,v(n));break;case 145:n=X(),N0(e,v(n));break;case 146:n=X(),e=m0(e,v(n));break;case 147:n=X(),A0(H(U(),T(n)));break;case 148:n=X(),e=k0(e,v(n));break;case 149:n=X(),k0(e,v(n));break;case 150:n=X(),e=v(n),a&=~(N|k|p),a|=q[e];break;case 151:n=X(),_(n,e),a&=~(N|k|p),a|=q[e];break;case 152:n=X(),e=d0(e,v(n));break;case 153:n=X(),e=$(e,v(n));break;case 154:n=X(),e=Z0(e,v(n));break;case 155:n=X(),e=r0(e,v(n));break;case 156:n=X(),Y(c,T(n));break;case 157:n=X(),L(x),x=n;break;case 158:n=X(),c=T(n),n0(c),a&=~p;break;case 159:n=X(),f0(n,c),n0(c),a&=~p;break;case 160:n=M(),e=_0(e,v(n));break;case 161:n=M(),N0(e,v(n));break;case 162:n=M(),e=m0(e,v(n));break;case 163:n=M(),A0(H(U(),T(n)));break;case 164:n=M(),e=k0(e,v(n));break;case 165:n=M(),k0(e,v(n));break;case 166:n=M(),e=v(n),a&=~(N|k|p),a|=q[e];break;case 167:n=M(),_(n,e),a&=~(N|k|p),a|=q[e];break;case 168:n=M(),e=d0(e,v(n));break;case 169:n=M(),e=$(e,v(n));break;case 170:n=M(),e=Z0(e,v(n));break;case 171:n=M(),e=r0(e,v(n));break;case 172:n=M(),Y(c,T(n));break;case 173:n=M(),L(x),x=n;break;case 174:n=M(),c=T(n),n0(c),a&=~p;break;case 175:n=M(),f0(n,c),n0(c),a&=~p;break;case 176:n=w(),e=_0(e,v(n));break;case 177:n=w(),N0(e,v(n));break;case 178:n=w(),e=m0(e,v(n));break;case 179:n=w(),A0(H(U(),T(n)));break;case 180:n=w(),e=k0(e,v(n));break;case 181:n=w(),k0(e,v(n));break;case 182:n=w(),e=v(n),a&=~(N|k|p),a|=q[e];break;case 183:n=w(),_(n,e),a&=~(N|k|p),a|=q[e];break;case 184:n=w(),e=d0(e,v(n));break;case 185:n=w(),e=$(e,v(n));break;case 186:n=w(),e=Z0(e,v(n));break;case 187:n=w(),e=r0(e,v(n));break;case 188:n=w(),Y(c,T(n));break;case 189:n=w(),L(x),x=n;break;case 190:n=w(),c=T(n),n0(c),a&=~p;break;case 191:n=w(),f0(n,c),n0(c),a&=~p;break;case 192:r=_0(r,Z());break;case 193:N0(r,Z());break;case 194:r=m0(r,Z());break;case 195:A0(C0(U(),w()));break;case 196:r=k0(r,Z());break;case 197:k0(r,Z());break;case 198:r=Z(),a&=~(N|k|p),a|=q[r];break;case 200:r=d0(r,Z());break;case 201:r=$(r,Z());break;case 202:r=Z0(r,Z());break;case 203:r=r0(r,Z());break;case 204:n=w(),A0(n),n0(n),a&=~p;break;case 206:o=w(),n0(o),a&=~p;break;case 208:n=X(),r=_0(r,v(n));break;case 209:n=X(),N0(r,v(n));break;case 210:n=X(),r=m0(r,v(n));break;case 211:n=X(),A0(C0(U(),T(n)));break;case 212:n=X(),r=k0(r,v(n));break;case 213:n=X(),k0(r,v(n));break;case 214:n=X(),r=v(n),a&=~(N|k|p),a|=q[r];break;case 215:n=X(),_(n,r),a&=~(N|k|p),a|=q[r];break;case 216:n=X(),r=d0(r,v(n));break;case 217:n=X(),r=$(r,v(n));break;case 218:n=X(),r=Z0(r,v(n));break;case 219:n=X(),r=r0(r,v(n));break;case 220:n=X(),g=T(n),A0(g),n0(g),a&=~p;break;case 221:n=X(),f0(n,U()),a&=~p;break;case 222:n=X(),o=T(n),n0(o),a&=~p;break;case 223:n=X(),f0(n,o),n0(o),a&=~p;break;case 224:n=M(),r=_0(r,v(n));break;case 225:n=M(),N0(r,v(n));break;case 226:n=M(),r=m0(r,v(n));break;case 227:n=M(),A0(C0(U(),T(n)));break;case 228:n=M(),r=k0(r,v(n));break;case 229:n=M(),k0(r,v(n));break;case 230:n=M(),r=v(n),a&=~(N|k|p),a|=q[r];break;case 231:n=M(),_(n,r),a&=~(N|k|p),a|=q[r];break;case 232:n=M(),r=d0(r,v(n));break;case 233:n=M(),r=$(r,v(n));break;case 234:n=M(),r=Z0(r,v(n));break;case 235:n=M(),r=r0(r,v(n));break;case 236:n=M(),g=T(n),A0(g),n0(g),a&=~p;break;case 237:n=M(),f0(n,U()),a&=~p;break;case 238:n=M(),o=T(n),n0(o),a&=~p;break;case 239:n=M(),f0(n,o),n0(o),a&=~p;break;case 240:n=w(),r=_0(r,v(n));break;case 241:n=w(),N0(r,v(n));break;case 242:n=w(),r=m0(r,v(n));break;case 243:n=w(),A0(C0(U(),T(n)));break;case 244:n=w(),r=k0(r,v(n));break;case 245:n=w(),k0(r,v(n));break;case 246:n=w(),r=v(n),a&=~(N|k|p),a|=q[r];break;case 247:n=w(),_(n,r),a&=~(N|k|p),a|=q[r];break;case 248:n=w(),r=d0(r,v(n));break;case 249:n=w(),r=$(r,v(n));break;case 250:n=w(),r=Z0(r,v(n));break;case 251:n=w(),r=r0(r,v(n));break;case 252:n=w(),g=T(n),A0(g),n0(g),a&=~p;break;case 253:n=w(),f0(n,U()),a&=~p;break;case 254:n=w(),o=T(n),n0(o),a&=~p;break;case 255:n=w(),f0(n,o),n0(o),a&=~p;break;case 16:switch(t=Z(),V+=t0[t],t){case 33:n=i0(w());break;case 34:n=i0(w()),a&(y|N)||(x+=n);break;case 35:n=i0(w()),a&(y|N)&&(x+=n);break;case 36:n=i0(w()),a&y||(x+=n);break;case 37:n=i0(w()),a&y&&(x+=n);break;case 38:n=i0(w()),a&N||(x+=n);break;case 39:n=i0(w()),a&N&&(x+=n);break;case 40:n=i0(w()),a&p||(x+=n);break;case 41:n=i0(w()),a&p&&(x+=n);break;case 42:n=i0(w()),a&k||(x+=n);break;case 43:n=i0(w()),a&k&&(x+=n);break;case 44:n=i0(w()),a&k^(a&p)<<2||(x+=n);break;case 45:n=i0(w()),a&k^(a&p)<<2&&(x+=n);break;case 46:n=i0(w()),a&k^(a&p)<<2||a&N||(x+=n);break;case 47:n=i0(w()),(a&k^(a&p)<<2||a&N)&&(x+=n);break;case 63:a|=B,L(x),L(o),L(m),L(c),x0(W),x0(r),x0(e),x0(a),a|=G|A,x=T(g0);break;case 131:Y(U(),w());break;case 140:Y(m,w());break;case 142:m=w(),n0(m),a&=~p;break;case 147:n=X(),Y(U(),T(n));break;case 156:n=X(),Y(m,T(n));break;case 158:n=X(),m=T(n),n0(m),a&=~p;break;case 159:n=X(),f0(n,m),n0(m),a&=~p;break;case 163:n=M(),Y(U(),T(n));break;case 172:n=M(),Y(m,T(n));break;case 174:n=M(),m=T(n),n0(m),a&=~p;break;case 175:n=M(),f0(n,m),n0(m),a&=~p;break;case 179:n=w(),Y(U(),T(n));break;case 188:n=w(),Y(m,T(n));break;case 190:n=w(),m=T(n),n0(m),a&=~p;break;case 191:n=w(),f0(n,m),n0(m),a&=~p;break;case 206:d=w(),n0(d),a&=~p;break;case 222:n=X(),d=T(n),n0(d),a&=~p;break;case 223:n=X(),f0(n,d),n0(d),a&=~p;break;case 238:n=M(),d=T(n),n0(d),a&=~p;break;case 239:n=M(),f0(n,d),n0(d),a&=~p;break;case 254:n=w(),d=T(n),n0(d),a&=~p;break;case 255:n=w(),f0(n,d),n0(d),a&=~p;break}break;case 17:switch(t=Z(),V+=t0[t],t){case 63:a|=B,L(x),L(o),L(m),L(c),x0(W),x0(r),x0(e),x0(a),a|=G|A,x=T(T0);break;case 131:Y(o,w());break;case 140:Y(d,w());break;case 147:n=X(),Y(o,T(n));break;case 156:n=X(),Y(d,T(n));break;case 163:n=M(),Y(o,T(n));break;case 172:n=M(),Y(d,T(n));break;case 179:n=w(),Y(o,T(n));break;case 188:n=w(),Y(d,T(n));break}break}return e&=255,r&=255,a&=255,W&=255,c&=65535,m&=65535,o&=65535,d&=65535,x&=65535,V-u},Q0=function(){x=T(I),W=0,a|=A|G,V=0,e=r=W=c=m=o=d=0},ee=[[2,1,"NEG"],[1,0,"???"],[1,0,"???"],[2,1,"COM"],[2,1,"LSR"],[1,0,"???"],[2,1,"ROR"],[2,1,"ASR"],[2,1,"LSL"],[2,1,"ROL"],[2,1,"DEC"],[1,0,"???"],[2,1,"INC"],[2,1,"TST"],[2,1,"JMP"],[2,1,"CLR"],[1,0,"Prefix"],[1,0,"Prefix"],[1,2,"NOP"],[1,2,"SYNC"],[1,0,"???"],[1,0,"???"],[3,3,"LBRA"],[3,3,"LBSR"],[1,0,"???"],[1,2,"DAA"],[2,4,"ORCC"],[1,0,"???"],[2,4,"ANDCC"],[1,2,"SEX"],[2,20,"EXG"],[2,20,"TFR"],[2,5,"BRA"],[2,5,"BRN"],[2,5,"BHI"],[2,5,"BLS"],[2,5,"BCC"],[2,5,"BCS"],[2,5,"BNE"],[2,5,"BEQ"],[2,5,"BVC"],[2,5,"BVS"],[2,5,"BPL"],[2,5,"BMI"],[2,5,"BGE"],[2,5,"BLT"],[2,5,"BGT"],[2,5,"BLE"],[2,6,"LEAX"],[2,6,"LEAY"],[2,6,"LEAS"],[2,6,"LEAU"],[2,10,"PSHS"],[2,10,"PULS"],[2,11,"PSHU"],[2,11,"PULU"],[1,0,"???"],[1,2,"RTS"],[1,2,"ABX"],[1,2,"RTI"],[2,2,"CWAI"],[1,2,"MUL"],[1,2,"RESET"],[1,2,"SWI1"],[1,2,"NEGA"],[1,0,"???"],[1,0,"???"],[1,2,"COMA"],[1,2,"LSRA"],[1,0,"???"],[1,2,"RORA"],[1,2,"ASRA"],[1,2,"ASLA"],[1,2,"ROLA"],[1,2,"DECA"],[1,0,"???"],[1,2,"INCA"],[1,2,"TSTA"],[1,0,"???"],[1,2,"CLRA"],[1,2,"NEGB"],[1,0,"???"],[1,0,"???"],[1,2,"COMB"],[1,2,"LSRB"],[1,0,"???"],[1,2,"RORB"],[1,2,"ASRB"],[1,2,"ASLB"],[1,2,"ROLB"],[1,2,"DECB"],[1,0,"???"],[1,2,"INCB"],[1,2,"TSTB"],[1,0,"???"],[1,2,"CLRB"],[2,6,"NEG"],[1,0,"???"],[1,0,"???"],[2,6,"COM"],[2,6,"LSR"],[1,0,"???"],[2,6,"ROR"],[2,6,"ASR"],[2,6,"LSL"],[2,6,"ROL"],[2,6,"DEC"],[1,0,"???"],[2,6,"INC"],[2,6,"TST"],[2,6,"JMP"],[2,6,"CLR"],[3,7,"NEG"],[1,0,"???"],[1,0,"???"],[3,7,"COM"],[3,7,"LSR"],[1,0,"???"],[3,7,"ROR"],[3,7,"ASR"],[3,7,"LSL"],[3,7,"ROL"],[3,7,"DEC"],[1,0,"???"],[3,7,"INC"],[3,7,"TST"],[3,7,"JMP"],[3,7,"CLR"],[2,4,"SUBA"],[2,4,"CMPA"],[2,4,"SBCA"],[3,8,"SUBD"],[2,4,"ANDA"],[2,4,"BITA"],[2,4,"LDA"],[1,0,"???"],[2,4,"EORA"],[2,4,"ADCA"],[2,4,"ORA"],[2,4,"ADDA"],[3,8,"CMPX"],[2,5,"BSR"],[3,8,"LDX"],[1,0,"???"],[2,1,"SUBA"],[2,1,"CMPA"],[2,1,"SBCA"],[2,1,"SUBd"],[2,1,"ANDA"],[2,1,"BITA"],[2,1,"LDA"],[2,1,"STA"],[2,1,"EORA"],[2,1,"ADCA"],[2,1,"ORA"],[2,1,"ADDA"],[2,1,"CMPX"],[2,1,"JSR"],[2,1,"LDX"],[2,1,"STX"],[2,6,"SUBA"],[2,6,"CMPA"],[2,6,"SBCA"],[2,6,"SUBD"],[2,6,"ANDA"],[2,6,"BITA"],[2,6,"LDA"],[2,6,"STA"],[2,6,"EORA"],[2,6,"ADCA"],[2,6,"ORA"],[2,6,"ADDA"],[2,6,"CMPX"],[2,6,"JSR"],[2,6,"LDX"],[2,6,"STX"],[3,7,"SUBA"],[3,7,"CMPA"],[3,7,"SBCA"],[3,7,"SUBD"],[3,7,"ANDA"],[3,7,"BITA"],[3,7,"LDA"],[3,7,"STA"],[3,7,"EORA"],[3,7,"ADCA"],[3,7,"ORA"],[3,7,"ADDA"],[3,7,"CMPX"],[3,7,"JSR"],[3,7,"LDX"],[3,7,"STX"],[2,4,"SUBB"],[2,4,"CMPB"],[2,4,"SBCB"],[3,8,"ADDD"],[2,4,"ANDB"],[2,4,"BITB"],[2,4,"LDB"],[1,0,"???"],[2,4,"EORB"],[2,4,"ADCB"],[2,4,"ORB"],[2,4,"ADDB"],[3,8,"LDD"],[1,0,"???"],[3,8,"LDU"],[1,0,"???"],[2,1,"SUBB"],[2,1,"CMPB"],[2,1,"SBCB"],[2,1,"ADDD"],[2,1,"ANDB"],[2,1,"BITB"],[2,1,"LDB"],[2,1,"STB"],[2,1,"EORB"],[2,1,"ADCB"],[2,1,"ORB "],[2,1,"ADDB"],[2,1,"LDD "],[2,1,"STD "],[2,1,"LDU "],[2,1,"STU "],[2,6,"SUBB"],[2,6,"CMPB"],[2,6,"SBCB"],[2,6,"ADDD"],[2,6,"ANDB"],[2,6,"BITB"],[2,6,"LDB"],[2,6,"STB"],[2,6,"EORB"],[2,6,"ADCB"],[2,6,"ORB"],[2,6,"ADDB"],[2,6,"LDD"],[2,6,"STD"],[2,6,"LDU"],[2,6,"STU"],[3,7,"SUBB"],[3,7,"CMPB"],[3,7,"SBCB"],[3,7,"ADDD"],[3,7,"ANDB"],[3,7,"BITB"],[3,7,"LDB"],[3,7,"STB"],[3,7,"EORB"],[3,7,"ADCB"],[3,7,"ORB"],[3,7,"ADDB"],[3,7,"LDD"],[3,7,"STD"],[3,7,"LDU"],[3,7,"STU"]],S={63:[2,2,"SWI3"],131:[4,8,"CMPU"],140:[4,8,"CMPS"],147:[3,1,"CMPU"],156:[3,1,"CMPS"],163:[3,6,"CMPU"],172:[3,6,"CMPS"],179:[4,7,"CMPU"],188:[4,7,"CMPS"]},R={33:[5,3,"LBRN"],34:[5,3,"LBHI"],35:[5,3,"LBLS"],36:[5,3,"LBCC"],37:[5,3,"LBCS"],38:[5,3,"LBNE"],39:[5,3,"LBEQ"],40:[5,3,"LBVC"],41:[5,3,"LBVS"],42:[5,3,"LBPL"],43:[5,3,"LBMI"],44:[5,3,"LBGE"],45:[5,3,"LBLT"],46:[5,3,"LBGT"],47:[5,3,"LBLE"],63:[2,2,"SWI2"],131:[4,8,"CMPD"],140:[4,8,"CMPY"],142:[4,8,"LDY"],147:[3,1,"CMPD"],156:[3,1,"CMPY"],158:[3,1,"LDY"],159:[3,1,"STY"],163:[3,6,"CMPD"],172:[3,6,"CMPY"],174:[3,6,"LDY"],175:[3,6,"STY"],179:[4,7,"CMPD"],188:[4,7,"CMPY"],190:[4,7,"LDY"],191:[4,7,"STY"],206:[4,8,"LDS"],222:[3,1,"LDS"],223:[3,1,"STS"],238:[3,6,"LDS"],239:[3,6,"STS"],254:[4,7,"LDS"],255:[4,7,"STS"]},D=function(u,n,g,s,t,b){var P=function(le,Je){for(var ke=le.toString(16);ke.length>5];if(!(me&128)){var pe=me&31;pe>15&&(pe=pe-32),J+=pe+","+M0;break}var $e=me&16,Le=me&15,_e=g>127?g-256:g,Pe=g*256+s>32767?g*256+s-65536:g*256+s;if($e)switch(Le){case 0:J+="???";break;case 1:J+="[,"+M0+"++]";break;case 2:J+="???";break;case 3:J+="[,--"+M0+"]";break;case 4:J+="[,"+M0+"]";break;case 5:J+="[B,"+M0+"]";break;case 6:J+="[A,"+M0+"]";break;case 7:J+="???";break;case 8:J+="["+_e+","+M0+"]",$0++;break;case 9:J+="["+Pe+","+M0+"]",$0+=2;break;case 10:J+="???";break;case 11:J+="[D,"+M0+"]";break;case 12:J+="["+_e+",PC]",$0++;break;case 13:J+="["+Pe+",PC]",$0+=2;break;case 14:J+="???";break;case 15:J+="[$"+J0(g*256+s)+"]",$0+=2;break}else switch(Le){case 0:J+=","+M0+"+";break;case 1:J+=","+M0+"++";break;case 2:J+=",-"+M0;break;case 3:J+=",--"+M0;break;case 4:J+=","+M0;break;case 5:J+="B,"+M0;break;case 6:J+="A,"+M0;break;case 7:J+="???";break;case 8:J+=_e+","+M0,$0++;break;case 9:J+=Pe+","+M0,$0+=2;break;case 10:J+="???";break;case 11:J+="D,"+M0;break;case 12:J+=_e+",PC",$0++;break;case 13:J+=Pe+",PC",$0+=2;break;case 14:J+="???";break;case 15:J+="$"+J0(g*256+s),$0+=2;break}break;case 7:J+=" $"+J0(n*256+g);break;case 8:J+=" #$"+J0(n*256+g);break;case 10:for(L0=["PC","U","Y","X","DP","B","A","CC"],re=[],q0=0;q0<8;q0++)(n&1)!=0&&re.push(L0[7-q0]),n>>=1;J+=" "+re.join(",");break;case 11:for(L0=["PC","S","Y","X","DP","B","A","CC"],re=[],q0=0;q0<8;q0++)(n&1)!=0&&re.push(L0[7-q0]),n>>=1;J+=" "+re.join(",");break;case 20:L0=["D","X","Y","U","S","PC","?","?","A","B","CC","DP","?","?","?","?"],J+=" "+L0[n>>4]+","+L0[n&15];break}return{line:J,nbytes:$0}};return{steps:function(u){for(;u>0;)u-=j0()},runFrame:function(u){for(;V>g;s===0?u+=n[g].toLowerCase():u+=n[g]}return u},disasm:D,isStable:function(){return!0}}}var st=function(){var h=this;this.powerOn=function(){this.reset()},this.powerOff=function(){},this.clockPulse=function(){!r||(G++,A[G]())},this.connectBus=function(l){e=l},this.setRDY=function(l){r=l},this.isRDY=function(){return r},this.reset=function(){p=1,G=-1,A=[K],c=e.read(V)|e.read(V+1)<<8,this.setRDY(!0)};var e,r=!1,c=0,m=0,o=0,d=0,x=0,a=0,W=0,y=0,p=0,N=0,k=0,G=-1,u0=-1,A,B=0,I=0,F=0,z=!1,i=0,f=0,g0=0;let T0=65530,V=65532,D0=65534,_=0,v=1,Y0=7,t0=6,q=1,V0=0;this.debug=!1,this.trace=!1;var K=function(){u0=e.read(c),A=t[u0],G=0,c++},U=K,A0=function(){e.read(c)},x0=function(){f=e.read(c),c++},L=function(){I=e.read(c),c++},X0=function(){I|=e.read(c)<<8,c++},W0=function(){I=e.read(F)},F0=function(){I|=e.read(F)<<8},w0=function(){F=e.read(c),c++},Q=function(){F|=e.read(c)<<8,c++},l0=function(){F=e.read(i)},O0=function(){F|=e.read(i)<<8},b0=function(){var l=(F&255)+d;z=l>255,F=F&65280|l&255},R0=function(){var l=(F&255)+x;z=l>255,F=F&65280|l&255},z0=function(){var l=(F&255)+1;z=l>255,F=F&65280|l&255},E0=function(){z&&(F=F+256&65535)},U0=function(){i=e.read(c),c++},p0=function(){i|=e.read(c)<<8,c++},c0=function(){var l=(i&255)+1;i=i&65280|l&255},i0=function(){B=e.read(c),c++},Z=function(){B=e.read(I)},w=function(){B=e.read(F)},T=function(){e.write(I,B)},f0=function(){e.write(F,B)},M=function(){var l=c&255,C=l+f&255;f>127?g0=C>l?-256:0:g0=C>>7,W=l>>>6&1,y=l>>>3&1,p=l>>>2&1,N=l>>>1&1,k=l&1},Y=function(l){h.debug&&h.breakpoint("Illegal Opcode: "+l)},e0=function(l){return[K,A0,function(){l(),U()}]},s0=function(l){return[K,i0,function(){l(),U()}]},P0=function(l){return[K,L,Z,function(){l(),U()}]},B0=function(l){return[K,L,X0,Z,function(){l(),U()}]},H0=function(l){return[K,w0,w,function(){b0(),W0()},function(){z0(),F0()},Z,function(){l(),U()}]},o0=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,Q,function(){C(),w(),E0()},function(){z?w():(j(),U())},function(){j(),U()}]}},d0=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,w,function(){C(),w()},function(){j(),U()}]}},Z0=function(l){return[K,U0,l0,function(){c0(),O0()},function(){R0(),w(),E0()},function(){z?w():(l(),U())},function(){l(),U()}]},k0=function(l){return[K,L,function(){l(),T()},U]},K0=function(l){return[K,L,X0,function(){l(),T()},U]},X=function(l){return[K,w0,w,function(){b0(),W0()},function(){z0(),F0()},function(){l(),T()},U]},j0=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,Q,function(){C(),w(),E0()},function(){j(),f0()},U]}},Q0=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,w,function(){C(),j(),f0()},U]}},ee=function(l){return[K,U0,l0,function(){c0(),O0()},function(){R0(),w(),E0()},function(){l(),f0()},U]},S=function(l){return[K,L,Z,T,function(){l(),T()},U]},R=function(l){return[K,L,X0,Z,T,function(){l(),T()},U]},D=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,w,function(){C(),w()},f0,function(){j(),f0()},U]}},u=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,Q,function(){C(),w(),E0()},w,f0,function(){j(),f0()},U]}},n=function(l){return[K,w0,w,function(){b0(),W0()},function(){z0(),F0()},Z,T,function(){l(),T()},U]},g=function(l){return[K,U0,l0,function(){c0(),O0()},function(){R0(),w(),E0()},w,f0,function(){l(),f0()},U]},s=new Array(256),t=new Array(256);s[0]="BRK",t[0]=Qt(),s[1]="ORA",t[1]=oe(H0),s[2]="uKIL",t[2]=G0(),s[3]="uSLO",t[3]=Se(n),s[4]="uNOP",t[4]=v0(P0),s[5]="ORA",t[5]=oe(P0),s[6]="ASL",t[6]=Oe(S),s[7]="uSLO",t[7]=Se(S),s[8]="PHP",t[8]=jt(),s[9]="ORA",t[9]=oe(s0),s[10]="ASL",t[10]=b(),s[11]="uANC",t[11]=ut(s0),s[12]="uNOP",t[12]=v0(B0),s[13]="ORA",t[13]=oe(B0),s[14]="ASL",t[14]=Oe(R),s[15]="uSLO",t[15]=Se(R),s[16]="BPL",t[16]=xe(Y0,0),s[17]="ORA",t[17]=oe(Z0),s[18]="uKIL",t[18]=G0(),s[19]="uSLO",t[19]=Se(g),s[20]="uNOP",t[20]=v0(d0(_)),s[21]="ORA",t[21]=oe(d0(_)),s[22]="ASL",t[22]=Oe(D(_)),s[23]="uSLO",t[23]=Se(D(_)),s[24]="CLC",t[24]=P(),s[25]="ORA",t[25]=oe(o0(v)),s[26]="uNOP",t[26]=v0(e0),s[27]="uSLO",t[27]=Se(u(v)),s[28]="uNOP",t[28]=v0(o0(_)),s[29]="ORA",t[29]=oe(o0(_)),s[30]="ASL",t[30]=Oe(u(_)),s[31]="uSLO",t[31]=Se(u(_)),s[32]="JSR",t[32]=Gt(),s[33]="AND",t[33]=ie(H0),s[34]="uKIL",t[34]=G0(),s[35]="uRLA",t[35]=Ae(n),s[36]="BIT",t[36]=xt(P0),s[37]="AND",t[37]=ie(P0),s[38]="ROL",t[38]=Te(S),s[39]="uRLA",t[39]=Ae(S),s[40]="PLP",t[40]=Jt(),s[41]="AND",t[41]=ie(s0),s[42]="ROL",t[42]=me(),s[43]="uANC",t[43]=ut(s0),s[44]="BIT",t[44]=xt(B0),s[45]="AND",t[45]=ie(B0),s[46]="ROL",t[46]=Te(R),s[47]="uRLA",t[47]=Ae(R),s[48]="BMI",t[48]=xe(Y0,1),s[49]="AND",t[49]=ie(Z0),s[50]="uKIL",t[50]=G0(),s[51]="uRLA",t[51]=Ae(g),s[52]="uNOP",t[52]=v0(d0(_)),s[53]="AND",t[53]=ie(d0(_)),s[54]="ROL",t[54]=Te(D(_)),s[55]="uRLA",t[55]=Ae(D(_)),s[56]="SEC",t[56]=pe(),s[57]="AND",t[57]=ie(o0(v)),s[58]="uNOP",t[58]=v0(e0),s[59]="uRLA",t[59]=Ae(u(v)),s[60]="uNOP",t[60]=v0(o0(_)),s[61]="AND",t[61]=ie(o0(_)),s[62]="ROL",t[62]=Te(u(_)),s[63]="uRLA",t[63]=Ae(u(_)),s[64]="RTI",t[64]=tn(),s[65]="EOR",t[65]=ce(H0),s[66]="uKIL",t[66]=G0(),s[67]="uSRE",t[67]=ve(n),s[68]="uNOP",t[68]=v0(P0),s[69]="EOR",t[69]=ce(P0),s[70]="LSR",t[70]=Me(S),s[71]="uSRE",t[71]=ve(S),s[72]="PHA",t[72]=Kt(),s[73]="EOR",t[73]=ce(s0),s[74]="LSR",t[74]=je(),s[75]="uASR",t[75]=Ut(s0),s[76]="JMP",t[76]=rn(),s[77]="EOR",t[77]=ce(B0),s[78]="LSR",t[78]=Me(R),s[79]="uSRE",t[79]=ve(R),s[80]="BVC",t[80]=xe(t0,0),s[81]="EOR",t[81]=ce(Z0),s[82]="uKIL",t[82]=G0(),s[83]="uSRE",t[83]=ve(g),s[84]="uNOP",t[84]=v0(d0(_)),s[85]="EOR",t[85]=ce(d0(_)),s[86]="LSR",t[86]=Me(D(_)),s[87]="uSRE",t[87]=ve(D(_)),s[88]="CLI",t[88]=J0(),s[89]="EOR",t[89]=ce(o0(v)),s[90]="uNOP",t[90]=v0(e0),s[91]="uSRE",t[91]=ve(u(v)),s[92]="uNOP",t[92]=v0(o0(_)),s[93]="EOR",t[93]=ce(o0(_)),s[94]="LSR",t[94]=Me(u(_)),s[95]="uSRE",t[95]=ve(u(_)),s[96]="RTS",t[96]=nn(),s[97]="ADC",t[97]=ae(H0),s[98]="uKIL",t[98]=G0(),s[99]="uRRA",t[99]=Ce(n),s[100]="uNOP",t[100]=v0(P0),s[101]="ADC",t[101]=ae(P0),s[102]="ROR",t[102]=Fe(S),s[103]="uRRA",t[103]=Ce(S),s[104]="PLA",t[104]=$t(),s[105]="ADC",t[105]=ae(s0),s[106]="ROR",t[106]=M0(),s[107]="uARR",t[107]=Ft(s0),s[108]="JMP",t[108]=an(),s[109]="ADC",t[109]=ae(B0),s[110]="ROR",t[110]=Fe(R),s[111]="uRRA",t[111]=Ce(R),s[112]="BVS",t[112]=xe(t0,1),s[113]="ADC",t[113]=ae(Z0),s[114]="uKIL",t[114]=G0(),s[115]="uRRA",t[115]=Ce(g),s[116]="uNOP",t[116]=v0(d0(_)),s[117]="ADC",t[117]=ae(d0(_)),s[118]="ROR",t[118]=Fe(D(_)),s[119]="uRRA",t[119]=Ce(D(_)),s[120]="SEI",t[120]=Le(),s[121]="ADC",t[121]=ae(o0(v)),s[122]="uNOP",t[122]=v0(e0),s[123]="uRRA",t[123]=Ce(u(v)),s[124]="uNOP",t[124]=v0(o0(_)),s[125]="ADC",t[125]=ae(o0(_)),s[126]="ROR",t[126]=Fe(u(_)),s[127]="uRRA",t[127]=Ce(u(_)),s[128]="uNOP",t[128]=v0(s0),s[129]="STA",t[129]=be(X),s[130]="uNOP",t[130]=v0(s0),s[131]="uSAX",t[131]=Ie(X),s[132]="STY",t[132]=et(k0),s[133]="STA",t[133]=be(k0),s[134]="STX",t[134]=qe(k0),s[135]="uSAX",t[135]=Ie(k0),s[136]="DEY",t[136]=q0(),s[137]="uNOP",t[137]=v0(s0),s[138]="TXA",t[138]=Je(),s[139]="uANE",t[139]=Tt(s0),s[140]="STY",t[140]=et(K0),s[141]="STA",t[141]=be(K0),s[142]="STX",t[142]=qe(K0),s[143]="uSAX",t[143]=Ie(K0),s[144]="BCC",t[144]=xe(V0,0),s[145]="STA",t[145]=be(ee),s[146]="uKIL",t[146]=G0(),s[147]="uSHA",t[147]=mt(ee),s[148]="STY",t[148]=et(Q0(_)),s[149]="STA",t[149]=be(Q0(_)),s[150]="STX",t[150]=qe(Q0(v)),s[151]="uSAX",t[151]=Ie(Q0(v)),s[152]="TYA",t[152]=Mt(),s[153]="STA",t[153]=be(j0(v)),s[154]="TXS",t[154]=ke(),s[155]="uSHS",t[155]=Yt(j0(v)),s[156]="uSHY",t[156]=zt(j0(_)),s[157]="STA",t[157]=be(j0(_)),s[158]="uSHX",t[158]=Wt(j0(v)),s[159]="uSHA",t[159]=mt(j0(v)),s[160]="LDY",t[160]=Re(s0),s[161]="LDA",t[161]=se(H0),s[162]="LDX",t[162]=Be(s0),s[163]="uLAX",t[163]=we(H0),s[164]="LDY",t[164]=Re(P0),s[165]="LDA",t[165]=se(P0),s[166]="LDX",t[166]=Be(P0),s[167]="uLAX",t[167]=we(P0),s[168]="TAY",t[168]=Pe(),s[169]="LDA",t[169]=se(s0),s[170]="TAX",t[170]=_e(),s[171]="uLXA",t[171]=Ht(s0),s[172]="LDY",t[172]=Re(B0),s[173]="LDA",t[173]=se(B0),s[174]="LDX",t[174]=Be(B0),s[175]="uLAX",t[175]=we(B0),s[176]="BCS",t[176]=xe(V0,1),s[177]="LDA",t[177]=se(Z0),s[178]="uKIL",t[178]=G0(),s[179]="uLAX",t[179]=we(Z0),s[180]="LDY",t[180]=Re(d0(_)),s[181]="LDA",t[181]=se(d0(_)),s[182]="LDX",t[182]=Be(d0(v)),s[183]="uLAX",t[183]=we(d0(v)),s[184]="CLV",t[184]=L0(),s[185]="LDA",t[185]=se(o0(v)),s[186]="TSX",t[186]=le(),s[187]="uLAS",t[187]=Xt(o0(v)),s[188]="LDY",t[188]=Re(o0(_)),s[189]="LDA",t[189]=se(o0(_)),s[190]="LDX",t[190]=Be(o0(v)),s[191]="uLAX",t[191]=we(o0(v)),s[192]="CPY",t[192]=Qe(s0),s[193]="CMP",t[193]=fe(H0),s[194]="uNOP",t[194]=v0(s0),s[195]="uDCP",t[195]=de(n),s[196]="CPY",t[196]=Qe(P0),s[197]="CMP",t[197]=fe(P0),s[198]="DEC",t[198]=Ee(S),s[199]="uDCP",t[199]=de(S),s[200]="INY",t[200]=$0(),s[201]="CMP",t[201]=fe(s0),s[202]="DEX",t[202]=re(),s[203]="uSBX",t[203]=Vt(s0),s[204]="CPY",t[204]=Qe(B0),s[205]="CMP",t[205]=fe(B0),s[206]="DEC",t[206]=Ee(R),s[207]="uDCP",t[207]=de(R),s[208]="BNE",t[208]=xe(q,0),s[209]="CMP",t[209]=fe(Z0),s[210]="uKIL",t[210]=G0(),s[211]="uDCP",t[211]=de(g),s[212]="uNOP",t[212]=v0(d0(_)),s[213]="CMP",t[213]=fe(d0(_)),s[214]="DEC",t[214]=Ee(D(_)),s[215]="uDCP",t[215]=de(D(_)),s[216]="CLD",t[216]=y0(),s[217]="CMP",t[217]=fe(o0(v)),s[218]="uNOP",t[218]=v0(e0),s[219]="uDCP",t[219]=de(u(v)),s[220]="uNOP",t[220]=v0(o0(_)),s[221]="CMP",t[221]=fe(o0(_)),s[222]="DEC",t[222]=Ee(u(_)),s[223]="uDCP",t[223]=de(u(_)),s[224]="CPX",t[224]=Ge(s0),s[225]="SBC",t[225]=ne(H0),s[226]="uNOP",t[226]=v0(s0),s[227]="uISB",t[227]=he(n),s[228]="CPX",t[228]=Ge(P0),s[229]="SBC",t[229]=ne(P0),s[230]="INC",t[230]=Ze(S),s[231]="uISB",t[231]=he(S),s[232]="INX",t[232]=te(),s[233]="SBC",t[233]=ne(s0),s[234]="NOP",t[234]=J(),s[235]="SBC",t[235]=ne(s0),s[236]="CPX",t[236]=Ge(B0),s[237]="SBC",t[237]=ne(B0),s[238]="INC",t[238]=Ze(R),s[239]="uISB",t[239]=he(R),s[240]="BEQ",t[240]=xe(q,1),s[241]="SBC",t[241]=ne(Z0),s[242]="uKIL",t[242]=G0(),s[243]="uISB",t[243]=he(g),s[244]="uNOP",t[244]=v0(d0(_)),s[245]="SBC",t[245]=ne(d0(_)),s[246]="INC",t[246]=Ze(D(_)),s[247]="uISB",t[247]=he(D(_)),s[248]="SED",t[248]=$e(),s[249]="SBC",t[249]=ne(o0(v)),s[250]="uNOP",t[250]=v0(e0),s[251]="uISB",t[251]=he(u(v)),s[252]="uNOP",t[252]=v0(o0(_)),s[253]="SBC",t[253]=ne(o0(_)),s[254]="INC",t[254]=Ze(u(_)),s[255]="uISB",t[255]=he(u(_));function b(){return e0(function(){H(o>127),o=o<<1&255,O(o),E(o)})}function P(){return e0(function(){k=0})}function y0(){return e0(function(){y=0})}function J0(){return e0(function(){p=0})}function L0(){return e0(function(){W=0})}function re(){return e0(function(){d=d-1&255,O(d),E(d)})}function q0(){return e0(function(){x=x-1&255,O(x),E(x)})}function te(){return e0(function(){d=d+1&255,O(d),E(d)})}function $0(){return e0(function(){x=x+1&255,O(x),E(x)})}function je(){return e0(function(){k=o&1,o>>>=1,O(o),a=0})}function J(){return e0(function(){})}function me(){return e0(function(){var l=o>127;o=(o<<1|k)&255,H(l),O(o),E(o)})}function M0(){return e0(function(){var l=o&1;o=o>>>1|k<<7,H(l),O(o),E(o)})}function pe(){return e0(function(){k=1})}function $e(){return e0(function(){y=1})}function Le(){return e0(function(){p=1})}function _e(){return e0(function(){d=o,O(d),E(d)})}function Pe(){return e0(function(){x=o,O(x),E(x)})}function le(){return e0(function(){d=m,O(d),E(d)})}function Je(){return e0(function(){o=d,O(o),E(o)})}function ke(){return e0(function(){m=d})}function Mt(){return e0(function(){o=x,O(o),E(o)})}function G0(){return[K,function(){Y("KIL/HLT/JAM")},function(){G--}]}function v0(l){return l(function(){Y("NOP/DOP")})}function ae(l){return l(function(){if(y){var C=B,j=(o&15)+(C&15)+k;j>9&&(j+=6);var S0=(o>>4)+(C>>4)+(j>15?1:0)<<4;O(o+C+k&255),E(S0),_0((o^S0)&~(o^C)&128),S0>159&&(S0+=96),H(S0>255),o=(S0|j&15)&255}else{var h0=o+B+k;H(h0>255),_0((o^h0)&(B^h0)&128),o=h0&255,O(o),E(o)}})}function ie(l){return l(function(){o&=B,O(o),E(o)})}function xt(l){return l(function(){var C=B;O(o&C),_0(C&64),E(C)})}function fe(l){return l(function(){var C=o-B&255;H(o>=B),O(C),E(C)})}function Ge(l){return l(function(){var C=d-B&255;H(d>=B),O(C),E(C)})}function Qe(l){return l(function(){var C=x-B&255;H(x>=B),O(C),E(C)})}function ce(l){return l(function(){o^=B,O(o),E(o)})}function se(l){return l(function(){o=B,O(o),E(o)})}function Be(l){return l(function(){d=B,O(d),E(d)})}function Re(l){return l(function(){x=B,O(x),E(x)})}function oe(l){return l(function(){o|=B,O(o),E(o)})}function ne(l){return l(function(){if(y){var C=B,j=(o&15)-(C&15)-(1-k),S0=(o>>4)-(C>>4)-(j<0?1:0);j<0&&(j-=6),S0<0&&(S0-=6);var h0=o-C-(1-k);H(~h0&256),_0((o^C)&(o^h0)&128),O(h0&255),E(h0),o=(S0<<4|j&15)&255}else C=~B&255,h0=o+C+k,H(h0>255),_0((o^h0)&(C^h0)&128),o=h0&255,O(o),E(o)})}function ut(l){return l(function(){Y("ANC"),o&=B,O(o),a=k=o&128?1:0})}function Tt(l){return l(function(){Y("ANE")})}function Ft(l){return l(function(){Y("ARR");var C=o&B,j=k?128:0;C=C>>>1|j,o=C,O(C),E(C);var S0=o&96;S0==96?(k=1,W=0):S0==0?(k=0,W=0):S0==32?(k=0,W=1):S0==64&&(k=1,W=1)})}function Ut(l){return l(function(){Y("ASR");var C=o&B;k=C&1,C=C>>>1,o=C,O(C),a=0})}function Xt(l){return l(function(){Y("LAS");var C=m&B;o=C,d=C,m=C,O(C),E(C)})}function we(l){return l(function(){Y("LAX");var C=B;o=C,d=C,O(C),E(C)})}function Ht(l){return l(function(){Y("LXA");var C=o&B;o=C,d=C,O(C),E(C)})}function Vt(l){return l(function(){Y("SBX");var C=o&d,j=B,S0=C-j&255;d=S0,H(C>=j),O(S0),E(S0)})}function be(l){return l(function(){B=o})}function qe(l){return l(function(){B=d})}function et(l){return l(function(){B=x})}function Ie(l){return l(function(){Y("SAX"),B=o&d})}function mt(l){return l(function(){Y("SHA"),B=o&d&(F>>>8)+1&255})}function Yt(l){return l(function(){Y("SHS");var C=o&d;m=C,B=C&(F>>>8)+1&255})}function Wt(l){return l(function(){Y("SHX"),B=d&(F>>>8)+1&255})}function zt(l){return l(function(){Y("SHY"),B=x&(F>>>8)+1&255})}function Oe(l){return l(function(){H(B>127);var C=B<<1&255;B=C,O(C),E(C)})}function Ee(l){return l(function(){var C=B-1&255;B=C,O(C),E(C)})}function Ze(l){return l(function(){var C=B+1&255;B=C,O(C),E(C)})}function Me(l){return l(function(){k=B&1,B>>>=1,O(B),a=0})}function Te(l){return l(function(){var C=B>127,j=(B<<1|k)&255;B=j,H(C),O(j),E(j)})}function Fe(l){return l(function(){var C=B&1,j=B>>>1|k<<7;B=j,H(C),O(j),E(j)})}function de(l){return l(function(){Y("DCP");var C=B-1&255;B=C,C=o-C,H(C>=0),O(C),E(C)})}function he(l){return l(function(){if(Y("ISB"),B=B+1&255,y){var C=B,j=(o&15)-(C&15)-(1-k),S0=(o>>4)-(C>>4)-(j<0?1:0);j<0&&(j-=6),S0<0&&(S0-=6);var h0=o-C-(1-k);H(~h0&256),_0((o^C)&(o^h0)&128),O(h0&255),E(h0),o=(S0<<4|j&15)&255}else C=~B&255,h0=o+C+k,H(h0>255),_0((o^h0)&(C^h0)&128),o=h0&255,O(o),E(o)})}function Ae(l){return l(function(){Y("RLA");var C=B,j=k;H(C&128),C=(C<<1|j)&255,B=C,o&=C,O(C),E(C)})}function Ce(l){return l(function(){Y("RRA");var C=B,j=k?128:0;if(H(C&1),C=C>>>1|j,B=C,y){var S0=B,h0=(o&15)+(S0&15)+k;h0>9&&(h0+=6);var De=(o>>4)+(S0>>4)+(h0>15?1:0)<<4;O(o+S0+k&255),E(De),_0((o^De)&~(o^S0)&128),De>159&&(De+=96),H(De>255),o=(De|h0&15)&255}else{var Ue=o+B+k;H(Ue>255),_0((o^Ue)&(B^Ue)&128),o=Ue&255,O(o),E(o)}})}function Se(l){return l(function(){Y("SLO");var C=B;H(C&128),C=C<<1&255,B=C,C=o|C,o=C,O(C),E(C)})}function ve(l){return l(function(){Y("SRE");var C=B;H(C&1),C=C>>>1,B=C,C=(o^C)&255,o=C,O(C),E(C)})}function Kt(){return[K,A0,function(){$(o)},U]}function jt(){return[K,A0,function(){$(m0())},U]}function $t(){return[K,A0,C0,function(){o=r0(),O(o),E(o)},U]}function Jt(){return[K,A0,C0,function(){N0(r0())},U]}function Gt(){return[K,L,C0,function(){$(c>>>8&255)},function(){$(c&255)},X0,function(){c=I,U()}]}function Qt(){return[K,i0,function(){h.debug&&h.breakpoint("BRK "+B),$(c>>>8&255)},function(){$(c&255)},function(){$(m0())},function(){I=e.read(D0)},function(){I|=e.read(D0+1)<<8},function(){c=I,p=1,U()}]}function qt(){return[K,i0,function(){h.debug&&h.breakpoint("IRQ "+B),$(c>>>8&255)},function(){$(c&255)},function(){$(m0()&~16)},function(){I=e.read(D0)},function(){I|=e.read(D0+1)<<8},function(){c=I,U()}]}function en(){return[K,i0,function(){h.debug&&h.breakpoint("NMI "+B),$(c>>>8&255)},function(){$(c&255)},function(){$(m0()&~16)},function(){I=e.read(T0)},function(){I|=e.read(T0+1)<<8},function(){c=I,U()}]}function tn(){return[K,A0,C0,function(){N0(r0())},function(){I=r0()},function(){I|=r0()<<8},function(){c=I,U()}]}function nn(){return[K,A0,C0,function(){I=r0()},function(){I|=r0()<<8},function(){c=I,i0()},U]}function rn(){return[K,L,X0,function(){c=I,U()}]}function an(){return[K,U0,p0,l0,function(){c0(),O0()},function(){c=F,U()}]}function xe(l,C){var j;return l===q?j=function(){return N===C}:l===Y0?j=function(){return a===C}:l===V0?j=function(){return k===C}:j=function(){return W===C},[K,x0,function(){j()?(A0(),M()):U()},function(){g0?(A0(),n0()):U()},U]}this.saveState=function(){return{PC:c-1&65535,A:o,X:d,Y:x,SP:m,N:a,V:W,D:y,I:p,Z:N,C:k,T:G,o:u0,R:r?1:0,d:B,AD:I,BA:F,BC:z?1:0,IA:i,bo:f,boa:g0}},this.loadState=function(l){c=l.PC+1&65535,o=l.A,d=l.X,x=l.Y,m=l.SP,a=l.N,W=l.V,y=l.D,p=l.I,N=l.Z,k=l.C,G=l.T,u0=l.o,r=!!l.R,B=l.d,I=l.AD,F=l.BA,z=!!l.BC,i=l.IA,f=l.bo,g0=l.boa,A=u0<0?[K]:t[u0]},this.toString=function(){return"CPU PC: "+c.toString(16)+" op: "+u0.toString()+" T: "+G+" data: "+B+` +import{C as dt,N as ht,Q as At,R as Ct,S as nt,X as St,g as a0,i as bt,r as tt}from"./chunk-7LTJUW24.js";var sn=[{mn:"BRK",am:"",nb:1,il:0,c1:7,c2:0,nw:3,br:1,mod:"SI"},{mn:"ORA",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SLO",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:""},{mn:"ORA",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SLO",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"PHP",am:"",nb:1,il:0,c1:3,c2:0,nw:1,br:0,mod:"S"},{mn:"ORA",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"ANC",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"NOP",am:"AAAA",nb:3,il:1,c1:3,c2:0,nw:0,br:0,mod:""},{mn:"ORA",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SLO",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"BPL",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"ORA",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SLO",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"ORA",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SLO",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"CLC",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"C"},{mn:"ORA",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"SLO",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"ORA",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"ASL",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SLO",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"JSR",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:1,mod:"S"},{mn:"AND",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"RLA",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"BIT",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"ZVN"},{mn:"AND",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RLA",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"PLP",am:"",nb:1,il:0,c1:4,c2:0,nw:0,br:0,mod:"SCZIDVN"},{mn:"AND",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"ANC",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"BIT",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"ZVN"},{mn:"AND",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RLA",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"BMI",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"AND",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"RLA",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"AND",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RLA",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"SEC",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"C"},{mn:"AND",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"RLA",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"AND",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"ROL",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RLA",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"RTI",am:"",nb:1,il:0,c1:6,c2:0,nw:0,br:1,mod:"SCZIDVN"},{mn:"EOR",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SRE",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:""},{mn:"EOR",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SRE",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"PHA",am:"",nb:1,il:0,c1:3,c2:0,nw:1,br:0,mod:"S"},{mn:"EOR",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"ASR",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"JMP",am:"AAAA",nb:3,il:0,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"EOR",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SRE",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"BVC",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"EOR",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SRE",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"EOR",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SRE",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"CLI",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"I"},{mn:"EOR",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"SRE",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"EOR",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"LSR",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"SRE",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZN"},{mn:"RTS",am:"",nb:1,il:0,c1:6,c2:0,nw:0,br:1,mod:"S"},{mn:"ADC",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"RRA",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"aa",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:""},{mn:"ADC",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RRA",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"PLA",am:"",nb:1,il:0,c1:4,c2:0,nw:0,br:0,mod:"SAZN"},{mn:"ADC",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZN"},{mn:"ARR",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"JMP",am:"(AAAA)",nb:3,il:0,c1:5,c2:0,nw:0,br:1,mod:""},{mn:"ADC",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RRA",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"BVS",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"ADC",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"RRA",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"ADC",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RRA",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"SEI",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"I"},{mn:"ADC",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"RRA",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"ADC",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"ROR",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"RRA",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"STA",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:1,br:0,mod:""},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"SAX",am:"(aa,x)",nb:2,il:1,c1:6,c2:0,nw:1,br:0,mod:""},{mn:"STY",am:"aa",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:""},{mn:"STA",am:"aa",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:""},{mn:"STX",am:"aa",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:""},{mn:"SAX",am:"aa",nb:2,il:1,c1:3,c2:0,nw:1,br:0,mod:""},{mn:"DEY",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"YZN"},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"TXA",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"ANE",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"STY",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"STA",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"STX",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"SAX",am:"AAAA",nb:3,il:1,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"BCC",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"STA",am:"(aa),y",nb:2,il:0,c1:6,c2:0,nw:1,br:0,mod:""},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"SHA",am:"(aa),y",nb:2,il:1,c1:6,c2:0,nw:1,br:0,mod:""},{mn:"STY",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"STA",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"STX",am:"aa,y",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:""},{mn:"SAX",am:"aa,y",nb:3,il:1,c1:4,c2:0,nw:1,br:1,mod:""},{mn:"TYA",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"STA",am:"AAAA,y",nb:3,il:0,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"TXS",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"S"},{mn:"SHS",am:"AAAA,y",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:"S"},{mn:"SHY",am:"AAAA,x",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"STA",am:"AAAA,x",nb:3,il:0,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"SHX",am:"AAAA,y",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"SHA",am:"AAAA,y",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:""},{mn:"LDY",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"(aa,x)",nb:2,il:1,c1:6,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"LDY",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"aa",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"TAY",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"AZN"},{mn:"TAX",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LXA",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"LDY",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"AAAA",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"BCS",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"LDA",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"AZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"LAX",am:"(aa),y",nb:2,il:1,c1:5,c2:1,nw:0,br:0,mod:"AXZN"},{mn:"LDY",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"aa,y",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"aa,y",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:"AXZN"},{mn:"CLV",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"V"},{mn:"LDA",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"TSX",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"LAS",am:"AAAA,y",nb:3,il:1,c1:4,c2:1,nw:0,br:0,mod:"SAXZN"},{mn:"LDY",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"YZN"},{mn:"LDA",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"AZN"},{mn:"LDX",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"XZN"},{mn:"LAX",am:"AAAA,y",nb:3,il:1,c1:4,c2:1,nw:0,br:0,mod:"AXZN"},{mn:"CPY",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"CZN"},{mn:"CMP",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"CZN"},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"DCP",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"CZN"},{mn:"CPY",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"CZN"},{mn:"CMP",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"CZN"},{mn:"DEC",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"ZN"},{mn:"DCP",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"CZN"},{mn:"INY",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"YZN"},{mn:"CMP",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"CZN"},{mn:"DEX",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"SBX",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"XCZN"},{mn:"CPY",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"CZN"},{mn:"CMP",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"CZN"},{mn:"DEC",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"ZN"},{mn:"DCP",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"BNE",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"CMP",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"CZN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"DCP",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"CZN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"CMP",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"CZN"},{mn:"DEC",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"ZN"},{mn:"DCP",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"CZN"},{mn:"CLD",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"D"},{mn:"CMP",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"CZN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"DCP",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"CMP",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"CZN"},{mn:"DEC",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"ZN"},{mn:"DCP",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"CZN"},{mn:"CPX",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"CZN"},{mn:"SBC",am:"(aa,x)",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"NOP",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"ISB",am:"(aa,x)",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"CPX",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"CZN"},{mn:"SBC",am:"aa",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"INC",am:"aa",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:"ZN"},{mn:"ISB",am:"aa",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"INX",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"XZN"},{mn:"SBC",am:"#aa",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"NOP",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"SBC",am:"#aa",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"CPX",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"CZN"},{mn:"SBC",am:"AAAA",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"INC",am:"AAAA",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:"ZN"},{mn:"ISB",am:"AAAA",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"BEQ",am:"branch",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:""},{mn:"SBC",am:"(aa),y",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"KIL",am:"",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:""},{mn:"ISB",am:"(aa),y",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"aa,x",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"SBC",am:"aa,x",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:"ACZVN"},{mn:"INC",am:"aa,x",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:"ZN"},{mn:"ISB",am:"aa,x",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"SED",am:"",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:"D"},{mn:"SBC",am:"AAAA,y",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"NOP",am:"",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:""},{mn:"ISB",am:"AAAA,y",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZVN"},{mn:"NOP",am:"AAAA,x",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:""},{mn:"SBC",am:"AAAA,x",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:"ACZVN"},{mn:"INC",am:"AAAA,x",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:"ZN"},{mn:"ISB",am:"AAAA,x",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:"ACZVN"}];function rt(h,e,r,c){var m=sn[e];if(m==null)return{line:"???",nbytes:1,isaddr:!1};var o=m.mn,d=m.am,x=!1;if(d=="branch"){var a=r<128?h+2+r:h+2-(256-r);a&=65535,d="$"+a0(a,4),x=!0}else d=d.replace("aa","$"+a0(r,2)),d=d.replace("AAAA","$"+a0(r+(c<<8),4)),d.indexOf("#")<0&&d.indexOf("$")>=0&&(x=!0);return{line:m.mn+" "+d,nbytes:m.nb,isaddr:x}}function on(h){let e=h;if(!e||typeof e.mem_read!="function"||typeof e.mem_write!="function"||typeof e.io_read!="function"||typeof e.io_write!="function")throw"Z80: Core object is missing required functions.";let r=0,c=0,m=0,o=0,d=0,x=0,a=0,W=0,y=0,p=0,N=0,k=0,G=0,u0=0,A=0,B=0,I=0,F=0,z=57328,i=0,f={S:0,Z:0,Y:0,H:0,X:0,P:0,N:0,C:0},g0={S:0,Z:0,Y:0,H:0,X:0,P:0,N:0,C:0},T0=0,V=0,D0=0,_=!1,v=!1,Y0=!1,t0=0;function q(){return{PC:i,SP:z,IX:A,IY:B,AF:(r<<8)+X0(),BC:(c<<8)+m,DE:(o<<8)+d,HL:(x<<8)+a,AF_:(W<<8)+W0(),BC_:(y<<8)+p,DE_:(N<<8)+k,HL_:(G<<8)+u0,IR:(I<<8)+F,im:T0,iff1:V,iff2:D0,halted:_,do_delayed_di:v,do_delayed_ei:Y0,cycle_counter:t0}}function V0(t){i=t.PC,z=t.SP,A=t.IX,B=t.IY,r=t.AF>>8&255,F0(t.AF),c=t.BC>>8&255,m=t.BC&255,o=t.DE>>8&255,d=t.DE&255,x=t.HL>>8&255,a=t.HL&255,W=t.AF_>>8&255,w0(t.AF_),y=t.BC_>>8&255,p=t.BC_&255,N=t.DE_>>8&255,k=t.DE_&255,G=t.HL_>>8&255,u0=t.HL_&255,I=t.IR>>8&255,F=t.IR&255,T0=t.im,V=t.iff1,D0=t.iff2,_=t.halted,v=t.do_delayed_di,Y0=t.do_delayed_ei,t0=t.cycle_counter}let K=function(){z=57328,i=0,r=0,F=0,F0(0),T0=0,V=0,D0=0,_=!1,v=!1,Y0=!1,t0=0},U=function(){if(_)return 1;var t=!1,b=!1;v?(v=!1,t=!0):Y0&&(Y0=!1,b=!0),F=F&128|(F&127)+1&127;var P=e.mem_read(i);x0(P),i=i+1&65535,t?(V=0,D0=0):b&&(V=1,D0=1);var y0=t0;return t0=0,y0},A0=function(t,b){if(t)return F=F&128|(F&127)+1&127,_=!1,D0=V,V=0,O0(i),i=102,t0+=11,!0;if(V){if(F=F&128|(F&127)+1&127,_=!1,V=0,D0=0,T0===0)i=i-1&65535,x0(b),i=i+1&65535,t0+=2;else if(T0===1)O0(i),i=56,t0+=13;else if(T0===2){O0(i);var P=I<<8|b;i=e.mem_read(P)|e.mem_read(P+1&65535)<<8,t0+=19}return!0}},x0=function(t){var b=function(L0){return(L0&7)==0?c:(L0&7)==1?m:(L0&7)==2?o:(L0&7)==3?d:(L0&7)==4?x:(L0&7)==5?a:(L0&7)==6?e.mem_read(a|x<<8):r};if(t===118)_=!0;else if(t>=64&&t<128){var P=b(t);(t&56)>>>3==0?c=P:(t&56)>>>3==1?m=P:(t&56)>>>3==2?o=P:(t&56)>>>3==3?d=P:(t&56)>>>3==4?x=P:(t&56)>>>3==5?a=P:(t&56)>>>3==6?e.mem_write(a|x<<8,P):(t&56)>>>3==7&&(r=P)}else if(t>=128&&t<192){var P=b(t),y0=[c0,i0,Z,w,f0,n0,M,T];y0[(t&56)>>>3](P)}else{var J0=S[t];J0()}t0+=u[t]},L=function(t){return t&=255,t&128&&(t=-((255&~t)+1)),t},X0=function(){return f.S<<7|f.Z<<6|f.Y<<5|f.H<<4|f.X<<3|f.P<<2|f.N<<1|f.C},W0=function(){return g0.S<<7|g0.Z<<6|g0.Y<<5|g0.H<<4|g0.X<<3|g0.P<<2|g0.N<<1|g0.C},F0=function(t){f.S=(t&128)>>>7,f.Z=(t&64)>>>6,f.Y=(t&32)>>>5,f.H=(t&16)>>>4,f.X=(t&8)>>>3,f.P=(t&4)>>>2,f.N=(t&2)>>>1,f.C=t&1},w0=function(t){g0.S=(t&128)>>>7,g0.Z=(t&64)>>>6,g0.Y=(t&32)>>>5,g0.H=(t&16)>>>4,g0.X=(t&8)>>>3,g0.P=(t&4)>>>2,g0.N=(t&2)>>>1,g0.C=t&1},Q=function(t){f.Y=(t&32)>>>5,f.X=(t&8)>>>3},l0=function(t){var b=[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1];return b[t]},O0=function(t){z=z-1&65535,e.mem_write(z,(t&65280)>>>8),z=z-1&65535,e.mem_write(z,t&255)},b0=function(){var t=e.mem_read(z)&255;return z=z+1&65535,t|=e.mem_read(z)<<8,z=z+1&65535,t},R0=function(t){t?(i=e.mem_read(i+1&65535)|e.mem_read(i+2&65535)<<8,i=i-1&65535):i=i+2&65535},z0=function(t){if(t){t0+=5;var b=L(e.mem_read(i+1&65535));i=i+b+1&65535}else i=i+1&65535},E0=function(t){t?(t0+=7,O0(i+3&65535),i=e.mem_read(i+1&65535)|e.mem_read(i+2&65535)<<8,i=i-1&65535):i=i+2&65535},U0=function(t){t&&(t0+=6,i=b0()-1&65535)},p0=function(t){O0(i+1&65535),i=t-1&65535},c0=function(t){var b=r+t;f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(t&15)+(r&15)&16?1:0,f.P=(r&128)==(t&128)&&(r&128)!=(b&128)?1:0,f.N=0,f.C=b&256?1:0,r=b&255,Q(r)},i0=function(t){var b=r+t+f.C;f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(t&15)+(r&15)+f.C&16?1:0,f.P=(r&128)==(t&128)&&(r&128)!=(b&128)?1:0,f.N=0,f.C=b&256?1:0,r=b&255,Q(r)},Z=function(t){var b=r-t;f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(r&15)-(t&15)&16?1:0,f.P=(r&128)!=(t&128)&&(r&128)!=(b&128)?1:0,f.N=1,f.C=b&256?1:0,r=b&255,Q(r)},w=function(t){var b=r-t-f.C;f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(r&15)-(t&15)-f.C&16?1:0,f.P=(r&128)!=(t&128)&&(r&128)!=(b&128)?1:0,f.N=1,f.C=b&256?1:0,r=b&255,Q(r)},T=function(t){var b=r;Z(t),r=b,Q(t)},f0=function(t){r&=t&255,f.S=r&128?1:0,f.Z=r?0:1,f.H=1,f.P=l0(r),f.N=0,f.C=0,Q(r)},M=function(t){r=(t|r)&255,f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=l0(r),f.N=0,f.C=0,Q(r)},n0=function(t){r=(t^r)&255,f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=l0(r),f.N=0,f.C=0,Q(r)},O=function(t){var b=t+1;return f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(t&15)==15?1:0,f.P=t===127?1:0,f.N=0,b&=255,Q(b),b},E=function(t){var b=t-1;return f.S=b&128?1:0,f.Z=b&255?0:1,f.H=(t&15)==0?1:0,f.P=t===128?1:0,f.N=1,b&=255,Q(b),b},_0=function(t){var b=a|x<<8,P=b+t;f.N=0,f.C=P&65536?1:0,f.H=(b&4095)+(t&4095)&4096?1:0,a=P&255,x=(P&65280)>>>8,Q(x)},H=function(t){t+=f.C;var b=a|x<<8,P=b+t;f.S=P&32768?1:0,f.Z=P&65535?0:1,f.H=(b&4095)+(t&4095)&4096?1:0,f.P=(b&32768)==(t&32768)&&(P&32768)!=(b&32768)?1:0,f.N=0,f.C=P&65536?1:0,a=P&255,x=P>>>8&255,Q(x)},r0=function(t){t+=f.C;var b=a|x<<8,P=b-t;f.S=P&32768?1:0,f.Z=P&65535?0:1,f.H=(b&4095)-(t&4095)&4096?1:0,f.P=(b&32768)!=(t&32768)&&(P&32768)!=(b&32768)?1:0,f.N=1,f.C=P&65536?1:0,a=P&255,x=P>>>8&255,Q(x)},C0=function(t){var b=e.io_read(t);return f.S=b&128?1:0,f.Z=b?0:1,f.H=0,f.P=l0(b)?1:0,f.N=0,Q(b),b},$=function(){r!==128&&(r=L(r),r=-r&255),f.S=r&128?1:0,f.Z=r?0:1,f.H=(-r&15)>0?1:0,f.P=r===128?1:0,f.N=1,f.C=r?1:0,Q(r)},m0=function(){var t=e.mem_read(a|x<<8);e.mem_write(d|o<<8,t);var b=(d|o<<8)+1;d=b&255,o=(b&65280)>>>8,b=(a|x<<8)+1,a=b&255,x=(b&65280)>>>8,b=(m|c<<8)-1,m=b&255,c=(b&65280)>>>8,f.H=0,f.P=m||c?1:0,f.N=0,f.Y=(r+t&2)>>>1,f.X=(r+t&8)>>>3},N0=function(){var t=f.C,b=e.mem_read(a|x<<8);T(b),f.C=t,f.Y=(r-b-f.H&2)>>>1,f.X=(r-b-f.H&8)>>>3;var P=(a|x<<8)+1;a=P&255,x=(P&65280)>>>8,P=(m|c<<8)-1,m=P&255,c=(P&65280)>>>8,f.P=P?1:0},Y=function(){c=E(c),e.mem_write(a|x<<8,e.io_read(c<<8|m));var t=(a|x<<8)+1;a=t&255,x=(t&65280)>>>8,f.N=1},e0=function(){e.io_write(c<<8|m,e.mem_read(a|x<<8));var t=(a|x<<8)+1;a=t&255,x=(t&65280)>>>8,c=E(c),f.N=1},s0=function(){f.N=0,f.H=0;var t=e.mem_read(a|x<<8);e.mem_write(d|o<<8,t);var b=(d|o<<8)-1;d=b&255,o=(b&65280)>>>8,b=(a|x<<8)-1,a=b&255,x=(b&65280)>>>8,b=(m|c<<8)-1,m=b&255,c=(b&65280)>>>8,f.P=m||c?1:0,f.Y=(r+t&2)>>>1,f.X=(r+t&8)>>>3},P0=function(){var t=f.C,b=e.mem_read(a|x<<8);T(b),f.C=t,f.Y=(r-b-f.H&2)>>>1,f.X=(r-b-f.H&8)>>>3;var P=(a|x<<8)-1;a=P&255,x=(P&65280)>>>8,P=(m|c<<8)-1,m=P&255,c=(P&65280)>>>8,f.P=P?1:0},B0=function(){c=E(c),e.mem_write(a|x<<8,e.io_read(c<<8|m));var t=(a|x<<8)-1;a=t&255,x=(t&65280)>>>8,f.N=1},H0=function(){e.io_write(c<<8|m,e.mem_read(a|x<<8));var t=(a|x<<8)-1;a=t&255,x=(t&65280)>>>8,c=E(c),f.N=1},o0=function(t){return f.N=0,f.H=0,f.C=(t&128)>>>7,t=(t<<1|f.C)&255,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},d0=function(t){return f.N=0,f.H=0,f.C=t&1,t=t>>>1&127|f.C<<7,f.Z=t&255?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t&255},Z0=function(t){f.N=0,f.H=0;var b=f.C;return f.C=(t&128)>>>7,t=(t<<1|b)&255,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},k0=function(t){f.N=0,f.H=0;var b=f.C;return f.C=t&1,t=t>>>1&127|b<<7,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},K0=function(t){return f.N=0,f.H=0,f.C=(t&128)>>>7,t=t<<1&255,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},X=function(t){return f.N=0,f.H=0,f.C=t&1,t=t>>>1&127|t&128,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},j0=function(t){return f.N=0,f.H=0,f.C=(t&128)>>>7,t=t<<1&255|1,f.Z=t?0:1,f.P=l0(t),f.S=t&128?1:0,Q(t),t},Q0=function(t){return f.N=0,f.H=0,f.C=t&1,t=t>>>1&127,f.Z=t?0:1,f.P=l0(t),f.S=0,Q(t),t},ee=function(t){f.N=0;var b=A+t;f.C=b&65536?1:0,f.H=(A&4095)+(t&4095)&4096?1:0,Q((b&65280)>>>8),A=b&65535},S=[];S[0]=function(){},S[1]=function(){i=i+1&65535,m=e.mem_read(i),i=i+1&65535,c=e.mem_read(i)},S[2]=function(){e.mem_write(m|c<<8,r)},S[3]=function(){var t=m|c<<8;t+=1,m=t&255,c=(t&65280)>>>8},S[4]=function(){c=O(c)},S[5]=function(){c=E(c)},S[6]=function(){i=i+1&65535,c=e.mem_read(i)},S[7]=function(){var t=f.S,b=f.Z,P=f.P;r=o0(r),f.S=t,f.Z=b,f.P=P},S[8]=function(){var t=r;r=W,W=t,t=X0(),F0(W0()),w0(t)},S[9]=function(){_0(m|c<<8)},S[10]=function(){r=e.mem_read(m|c<<8)},S[11]=function(){var t=m|c<<8;t-=1,m=t&255,c=(t&65280)>>>8},S[12]=function(){m=O(m)},S[13]=function(){m=E(m)},S[14]=function(){i=i+1&65535,m=e.mem_read(i)},S[15]=function(){var t=f.S,b=f.Z,P=f.P;r=d0(r),f.S=t,f.Z=b,f.P=P},S[16]=function(){c=c-1&255,z0(c!==0)},S[17]=function(){i=i+1&65535,d=e.mem_read(i),i=i+1&65535,o=e.mem_read(i)},S[18]=function(){e.mem_write(d|o<<8,r)},S[19]=function(){var t=d|o<<8;t+=1,d=t&255,o=(t&65280)>>>8},S[20]=function(){o=O(o)},S[21]=function(){o=E(o)},S[22]=function(){i=i+1&65535,o=e.mem_read(i)},S[23]=function(){var t=f.S,b=f.Z,P=f.P;r=Z0(r),f.S=t,f.Z=b,f.P=P},S[24]=function(){var t=L(e.mem_read(i+1&65535));i=i+t+1&65535},S[25]=function(){_0(d|o<<8)},S[26]=function(){r=e.mem_read(d|o<<8)},S[27]=function(){var t=d|o<<8;t-=1,d=t&255,o=(t&65280)>>>8},S[28]=function(){d=O(d)},S[29]=function(){d=E(d)},S[30]=function(){i=i+1&65535,d=e.mem_read(i)},S[31]=function(){var t=f.S,b=f.Z,P=f.P;r=k0(r),f.S=t,f.Z=b,f.P=P},S[32]=function(){z0(!f.Z)},S[33]=function(){i=i+1&65535,a=e.mem_read(i),i=i+1&65535,x=e.mem_read(i)},S[34]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,a),e.mem_write(t+1&65535,x)},S[35]=function(){var t=a|x<<8;t+=1,a=t&255,x=(t&65280)>>>8},S[36]=function(){x=O(x)},S[37]=function(){x=E(x)},S[38]=function(){i=i+1&65535,x=e.mem_read(i)},S[39]=function(){var t=r;f.N?((f.H||(r&15)>9)&&(t-=6),(f.C||r>153)&&(t-=96)):((f.H||(r&15)>9)&&(t+=6),(f.C||r>153)&&(t+=96)),f.S=t&128?1:0,f.Z=t&255?0:1,f.H=r&16^t&16?1:0,f.P=l0(t&255),f.C=f.C||r>153?1:0,r=t&255,Q(r)},S[40]=function(){z0(!!f.Z)},S[41]=function(){_0(a|x<<8)},S[42]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,a=e.mem_read(t),x=e.mem_read(t+1&65535)},S[43]=function(){var t=a|x<<8;t-=1,a=t&255,x=(t&65280)>>>8},S[44]=function(){a=O(a)},S[45]=function(){a=E(a)},S[46]=function(){i=i+1&65535,a=e.mem_read(i)},S[47]=function(){r=~r&255,f.N=1,f.H=1,Q(r)},S[48]=function(){z0(!f.C)},S[49]=function(){z=e.mem_read(i+1&65535)|e.mem_read(i+2&65535)<<8,i=i+2&65535},S[50]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,r)},S[51]=function(){z=z+1&65535},S[52]=function(){var t=a|x<<8;e.mem_write(t,O(e.mem_read(t)))},S[53]=function(){var t=a|x<<8;e.mem_write(t,E(e.mem_read(t)))},S[54]=function(){i=i+1&65535,e.mem_write(a|x<<8,e.mem_read(i))},S[55]=function(){f.N=0,f.H=0,f.C=1,Q(r)},S[56]=function(){z0(!!f.C)},S[57]=function(){_0(z)},S[58]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,r=e.mem_read(t)},S[59]=function(){z=z-1&65535},S[60]=function(){r=O(r)},S[61]=function(){r=E(r)},S[62]=function(){r=e.mem_read(i+1&65535),i=i+1&65535},S[63]=function(){f.N=0,f.H=f.C,f.C=f.C?0:1,Q(r)},S[192]=function(){U0(!f.Z)},S[193]=function(){var t=b0();m=t&255,c=(t&65280)>>>8},S[194]=function(){R0(!f.Z)},S[195]=function(){i=e.mem_read(i+1&65535)|e.mem_read(i+2&65535)<<8,i=i-1&65535},S[196]=function(){E0(!f.Z)},S[197]=function(){O0(m|c<<8)},S[198]=function(){i=i+1&65535,c0(e.mem_read(i))},S[199]=function(){p0(0)},S[200]=function(){U0(!!f.Z)},S[201]=function(){i=b0()-1&65535},S[202]=function(){R0(!!f.Z)},S[203]=function(){F=F&128|(F&127)+1&127,i=i+1&65535;var t=e.mem_read(i),b=(t&56)>>>3,P=t&7;if(t<64){var y0=[o0,d0,Z0,k0,K0,X,j0,Q0];P===0?c=y0[b](c):P===1?m=y0[b](m):P===2?o=y0[b](o):P===3?d=y0[b](d):P===4?x=y0[b](x):P===5?a=y0[b](a):P===6?e.mem_write(a|x<<8,y0[b](e.mem_read(a|x<<8))):P===7&&(r=y0[b](r))}else t<128?(P===0?f.Z=c&1<>>8},S[210]=function(){R0(!f.C)},S[211]=function(){i=i+1&65535,e.io_write(r<<8|e.mem_read(i),r)},S[212]=function(){E0(!f.C)},S[213]=function(){O0(d|o<<8)},S[214]=function(){i=i+1&65535,Z(e.mem_read(i))},S[215]=function(){p0(16)},S[216]=function(){U0(!!f.C)},S[217]=function(){var t=c;c=y,y=t,t=m,m=p,p=t,t=o,o=N,N=t,t=d,d=k,k=t,t=x,x=G,G=t,t=a,a=u0,u0=t},S[218]=function(){R0(!!f.C)},S[219]=function(){i=i+1&65535,r=e.io_read(r<<8|e.mem_read(i))},S[220]=function(){E0(!!f.C)},S[221]=function(){F=F&128|(F&127)+1&127,i=i+1&65535;var t=e.mem_read(i),b=D[t];b?(b(),t0+=s[t]):(i=i-1&65535,t0+=u[0])},S[222]=function(){i=i+1&65535,w(e.mem_read(i))},S[223]=function(){p0(24)},S[224]=function(){U0(!f.P)},S[225]=function(){var t=b0();a=t&255,x=(t&65280)>>>8},S[226]=function(){R0(!f.P)},S[227]=function(){var t=e.mem_read(z);e.mem_write(z,a),a=t,t=e.mem_read(z+1&65535),e.mem_write(z+1&65535,x),x=t},S[228]=function(){E0(!f.P)},S[229]=function(){O0(a|x<<8)},S[230]=function(){i=i+1&65535,f0(e.mem_read(i))},S[231]=function(){p0(32)},S[232]=function(){U0(!!f.P)},S[233]=function(){i=a|x<<8,i=i-1&65535},S[234]=function(){R0(!!f.P)},S[235]=function(){var t=o;o=x,x=t,t=d,d=a,a=t},S[236]=function(){E0(!!f.P)},S[237]=function(){F=F&128|(F&127)+1&127,i=i+1&65535;var t=e.mem_read(i),b=R[t];b?(b(),t0+=n[t]):t0+=u[0]},S[238]=function(){i=i+1&65535,n0(e.mem_read(i))},S[239]=function(){p0(40)},S[240]=function(){U0(!f.S)},S[241]=function(){var t=b0();F0(t&255),r=(t&65280)>>>8},S[242]=function(){R0(!f.S)},S[243]=function(){v=!0},S[244]=function(){E0(!f.S)},S[245]=function(){O0(X0()|r<<8)},S[246]=function(){i=i+1&65535,M(e.mem_read(i))},S[247]=function(){p0(48)},S[248]=function(){U0(!!f.S)},S[249]=function(){z=a|x<<8},S[250]=function(){R0(!!f.S)},S[251]=function(){Y0=!0},S[252]=function(){E0(!!f.S)},S[253]=function(){F=F&128|(F&127)+1&127,i=i+1&65535;var t=e.mem_read(i),b=D[t];if(b){var P=A;A=B,b(),B=A,A=P,t0+=s[t]}else i=i-1&65535,t0+=u[0]},S[254]=function(){i=i+1&65535,T(e.mem_read(i))},S[255]=function(){p0(56)};let R=[];R[64]=function(){c=C0(c<<8|m)},R[65]=function(){e.io_write(c<<8|m,c)},R[66]=function(){r0(m|c<<8)},R[67]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,m),e.mem_write(t+1&65535,c)},R[68]=function(){$()},R[69]=function(){i=b0()-1&65535,V=D0},R[70]=function(){T0=0},R[71]=function(){I=r},R[72]=function(){m=C0(c<<8|m)},R[73]=function(){e.io_write(c<<8|m,m)},R[74]=function(){H(m|c<<8)},R[75]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,m=e.mem_read(t),c=e.mem_read(t+1&65535)},R[76]=function(){$()},R[77]=function(){i=b0()-1&65535},R[78]=function(){T0=0},R[79]=function(){F=r},R[80]=function(){o=C0(c<<8|m)},R[81]=function(){e.io_write(c<<8|m,o)},R[82]=function(){r0(d|o<<8)},R[83]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,d),e.mem_write(t+1&65535,o)},R[84]=function(){$()},R[85]=function(){i=b0()-1&65535,V=D0},R[86]=function(){T0=1},R[87]=function(){r=I,f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=D0,f.N=0,Q(r)},R[88]=function(){d=C0(c<<8|m)},R[89]=function(){e.io_write(c<<8|m,d)},R[90]=function(){H(d|o<<8)},R[91]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,d=e.mem_read(t),o=e.mem_read(t+1&65535)},R[92]=function(){$()},R[93]=function(){i=b0()-1&65535,V=D0},R[94]=function(){T0=2},R[95]=function(){r=F,f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=D0,f.N=0,Q(r)},R[96]=function(){x=C0(c<<8|m)},R[97]=function(){e.io_write(c<<8|m,x)},R[98]=function(){r0(a|x<<8)},R[99]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,a),e.mem_write(t+1&65535,x)},R[100]=function(){$()},R[101]=function(){i=b0()-1&65535,V=D0},R[102]=function(){T0=0},R[103]=function(){var t=e.mem_read(a|x<<8),b=t&15,P=r&15;t=(t&240)>>>4|P<<4,r=r&240|b,e.mem_write(a|x<<8,t),f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=l0(r)?1:0,f.N=0,Q(r)},R[104]=function(){a=C0(c<<8|m)},R[105]=function(){e.io_write(c<<8|m,a)},R[106]=function(){H(a|x<<8)},R[107]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,a=e.mem_read(t),x=e.mem_read(t+1&65535)},R[108]=function(){$()},R[109]=function(){i=b0()-1&65535,V=D0},R[110]=function(){T0=0},R[111]=function(){var t=e.mem_read(a|x<<8),b=t&240,P=r&15;t=(t&15)<<4|P,r=r&240|b>>>4,e.mem_write(a|x<<8,t),f.S=r&128?1:0,f.Z=r?0:1,f.H=0,f.P=l0(r)?1:0,f.N=0,Q(r)},R[112]=function(){C0(c<<8|m)},R[113]=function(){e.io_write(c<<8|m,0)},R[114]=function(){r0(z)},R[115]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,z&255),e.mem_write(t+1&65535,z>>>8&255)},R[116]=function(){$()},R[117]=function(){i=b0()-1&65535,V=D0},R[118]=function(){T0=1},R[120]=function(){r=C0(c<<8|m)},R[121]=function(){e.io_write(c<<8|m,r)},R[122]=function(){H(z)},R[123]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,z=e.mem_read(t),z|=e.mem_read(t+1&65535)<<8},R[124]=function(){$()},R[125]=function(){i=b0()-1&65535,V=D0},R[126]=function(){T0=2},R[160]=function(){m0()},R[161]=function(){N0()},R[162]=function(){Y()},R[163]=function(){e0()},R[168]=function(){s0()},R[169]=function(){P0()},R[170]=function(){B0()},R[171]=function(){H0()},R[176]=function(){m0(),(c||m)&&(t0+=5,i=i-2&65535)},R[177]=function(){N0(),!f.Z&&(c||m)&&(t0+=5,i=i-2&65535)},R[178]=function(){Y(),c&&(t0+=5,i=i-2&65535)},R[179]=function(){e0(),c&&(t0+=5,i=i-2&65535)},R[184]=function(){s0(),(c||m)&&(t0+=5,i=i-2&65535)},R[185]=function(){P0(),!f.Z&&(c||m)&&(t0+=5,i=i-2&65535)},R[186]=function(){B0(),c&&(t0+=5,i=i-2&65535)},R[187]=function(){H0(),c&&(t0+=5,i=i-2&65535)};let D=[];D[9]=function(){ee(m|c<<8)},D[25]=function(){ee(d|o<<8)},D[33]=function(){i=i+1&65535,A=e.mem_read(i),i=i+1&65535,A|=e.mem_read(i)<<8},D[34]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,e.mem_write(t,A&255),e.mem_write(t+1&65535,A>>>8&255)},D[35]=function(){A=A+1&65535},D[36]=function(){A=O(A>>>8)<<8|A&255},D[37]=function(){A=E(A>>>8)<<8|A&255},D[38]=function(){i=i+1&65535,A=e.mem_read(i)<<8|A&255},D[41]=function(){ee(A)},D[42]=function(){i=i+1&65535;var t=e.mem_read(i);i=i+1&65535,t|=e.mem_read(i)<<8,A=e.mem_read(t),A|=e.mem_read(t+1&65535)<<8},D[43]=function(){A=A-1&65535},D[44]=function(){A=O(A&255)|A&65280},D[45]=function(){A=E(A&255)|A&65280},D[46]=function(){i=i+1&65535,A=e.mem_read(i)&255|A&65280},D[52]=function(){i=i+1&65535;var t=L(e.mem_read(i)),b=e.mem_read(t+A&65535);e.mem_write(t+A&65535,O(b))},D[53]=function(){i=i+1&65535;var t=L(e.mem_read(i)),b=e.mem_read(t+A&65535);e.mem_write(t+A&65535,E(b))},D[54]=function(){i=i+1&65535;var t=L(e.mem_read(i));i=i+1&65535,e.mem_write(A+t&65535,e.mem_read(i))},D[57]=function(){ee(z)},D[68]=function(){c=A>>>8&255},D[69]=function(){c=A&255},D[70]=function(){i=i+1&65535;var t=L(e.mem_read(i));c=e.mem_read(A+t&65535)},D[76]=function(){m=A>>>8&255},D[77]=function(){m=A&255},D[78]=function(){i=i+1&65535;var t=L(e.mem_read(i));m=e.mem_read(A+t&65535)},D[84]=function(){o=A>>>8&255},D[85]=function(){o=A&255},D[86]=function(){i=i+1&65535;var t=L(e.mem_read(i));o=e.mem_read(A+t&65535)},D[92]=function(){d=A>>>8&255},D[93]=function(){d=A&255},D[94]=function(){i=i+1&65535;var t=L(e.mem_read(i));d=e.mem_read(A+t&65535)},D[96]=function(){A=A&255|c<<8},D[97]=function(){A=A&255|m<<8},D[98]=function(){A=A&255|o<<8},D[99]=function(){A=A&255|d<<8},D[100]=function(){},D[101]=function(){A=A&255|(A&255)<<8},D[102]=function(){i=i+1&65535;var t=L(e.mem_read(i));x=e.mem_read(A+t&65535)},D[103]=function(){A=A&255|r<<8},D[104]=function(){A=A&65280|c},D[105]=function(){A=A&65280|m},D[106]=function(){A=A&65280|o},D[107]=function(){A=A&65280|d},D[108]=function(){A=A&65280|A>>>8},D[109]=function(){},D[110]=function(){i=i+1&65535;var t=L(e.mem_read(i));a=e.mem_read(A+t&65535)},D[111]=function(){A=A&65280|r},D[112]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,c)},D[113]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,m)},D[114]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,o)},D[115]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,d)},D[116]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,x)},D[117]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,a)},D[119]=function(){i=i+1&65535;var t=L(e.mem_read(i));e.mem_write(A+t&65535,r)},D[124]=function(){r=A>>>8&255},D[125]=function(){r=A&255},D[126]=function(){i=i+1&65535;var t=L(e.mem_read(i));r=e.mem_read(A+t&65535)},D[132]=function(){c0(A>>>8&255)},D[133]=function(){c0(A&255)},D[134]=function(){i=i+1&65535;var t=L(e.mem_read(i));c0(e.mem_read(A+t&65535))},D[140]=function(){i0(A>>>8&255)},D[141]=function(){i0(A&255)},D[142]=function(){i=i+1&65535;var t=L(e.mem_read(i));i0(e.mem_read(A+t&65535))},D[148]=function(){Z(A>>>8&255)},D[149]=function(){Z(A&255)},D[150]=function(){i=i+1&65535;var t=L(e.mem_read(i));Z(e.mem_read(A+t&65535))},D[156]=function(){w(A>>>8&255)},D[157]=function(){w(A&255)},D[158]=function(){i=i+1&65535;var t=L(e.mem_read(i));w(e.mem_read(A+t&65535))},D[164]=function(){f0(A>>>8&255)},D[165]=function(){f0(A&255)},D[166]=function(){i=i+1&65535;var t=L(e.mem_read(i));f0(e.mem_read(A+t&65535))},D[172]=function(){n0(A>>>8&255)},D[173]=function(){n0(A&255)},D[174]=function(){i=i+1&65535;var t=L(e.mem_read(i));n0(e.mem_read(A+t&65535))},D[180]=function(){M(A>>>8&255)},D[181]=function(){M(A&255)},D[182]=function(){i=i+1&65535;var t=L(e.mem_read(i));M(e.mem_read(A+t&65535))},D[188]=function(){T(A>>>8&255)},D[189]=function(){T(A&255)},D[190]=function(){i=i+1&65535;var t=L(e.mem_read(i));T(e.mem_read(A+t&65535))},D[203]=function(){i=i+1&65535;var t=L(e.mem_read(i));i=i+1&65535;var b=e.mem_read(i),P;if(b<64){var y0=[o0,d0,Z0,k0,K0,X,j0,Q0],J0=y0[(b&56)>>>3],P=J0(e.mem_read(A+t&65535));e.mem_write(A+t&65535,P)}else{var L0=(b&56)>>>3;b<128?(f.N=0,f.H=1,f.Z=e.mem_read(A+t&65535)&1<>>8&255)},D[229]=function(){O0(A)},D[233]=function(){i=A-1&65535},D[249]=function(){z=A};let u=[4,10,7,6,4,4,7,4,4,11,7,6,4,4,7,4,8,10,7,6,4,4,7,4,12,11,7,6,4,4,7,4,7,10,16,6,4,4,7,4,7,11,16,6,4,4,7,4,7,10,13,6,11,11,10,4,7,11,13,6,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,7,7,7,7,7,7,4,7,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,7,4,5,10,10,10,10,11,7,11,5,10,10,0,10,17,7,11,5,10,10,11,10,11,7,11,5,4,10,11,10,0,7,11,5,10,10,19,10,11,7,11,5,4,10,4,10,0,7,11,5,10,10,4,10,11,7,11,5,6,10,4,10,0,7,11],n=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,8,14,8,9,12,12,15,20,8,14,8,9,12,12,15,20,8,14,8,9,12,12,15,20,8,14,8,9,12,12,15,20,8,14,8,18,12,12,15,20,8,14,8,18,12,12,15,20,8,14,8,0,12,12,15,20,8,14,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,0,0,0,0,16,16,16,16,0,0,0,0,16,16,16,16,0,0,0,0,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],g=[8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8,8,8,8,8,8,8,15,8],s=[0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,14,20,10,8,8,11,0,0,15,20,10,8,8,11,0,0,0,0,0,23,23,19,0,0,15,0,0,0,0,0,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,8,8,8,8,8,8,19,8,8,8,8,8,8,8,19,8,19,19,19,19,19,19,0,19,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,8,8,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,23,0,15,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0];this.saveState=q,this.loadState=V0,this.reset=K,this.advanceInsn=U,this.interrupt=A0,this.getPC=()=>i,this.getSP=()=>z,this.getHalted=()=>_}var at=class{constructor(){this.retryInterrupts=!1;this.retryData=-1}buildCPU(){this.memBus&&this.ioBus&&(this.cpu=new on({mem_read:this.memBus.read.bind(this.memBus),mem_write:this.memBus.write.bind(this.memBus),io_read:this.ioBus.read.bind(this.ioBus),io_write:this.ioBus.write.bind(this.ioBus)}))}connectMemoryBus(e){this.memBus=e,this.buildCPU()}connectIOBus(e){this.ioBus=e,this.buildCPU()}advanceInsn(){return this.retryInterrupts&&this.retryData>=0&&this.cpu.interrupt(!1,this.retryData)&&(this.retryData=-1),this.cpu.advanceInsn()}reset(){this.cpu.reset()}interrupt(e){!this.cpu.interrupt(!1,e)&&this.retryInterrupts&&(this.retryData=e)}NMI(){this.cpu.interrupt(!0,0)}getSP(){return this.cpu.getSP()}getPC(){return this.cpu.getPC()}isHalted(){return this.cpu.getHalted()}saveState(){return this.cpu.saveState()}loadState(e){this.cpu.loadState(e)}isStable(){return!0}};var vt=class{constructor(){this.master=new MasterChannel}start(){this.looper||(this.looper=new AudioLooper(512),this.looper.setChannel(this.master),this.looper.activate())}stop(){this.looper&&(this.looper.setChannel(null),this.looper=null)}},xn=class{constructor(e){this.psg=new PsgDeviceChannel;this.curreg=0;this.master=e,this.psg.setMode(PsgDeviceChannel.MODE_SIGNED),this.psg.setDevice(PsgDeviceChannel.DEVICE_AY_3_8910),e.master.addChannel(this.psg)}reset(){for(var e=15;e>=0;e--)this.selectRegister(e),this.setData(0)}selectRegister(e){this.curreg=e&15}setData(e){this.psg.writeRegisterAY(this.curreg,e&255)}readData(){return this.psg.readRegister(this.curreg)}currentRegister(){return this.curreg}},un=class{constructor(e){this.psg=new PsgDeviceChannel;this.master=e,this.psg.setMode(PsgDeviceChannel.MODE_SIGNED),this.psg.setDevice(PsgDeviceChannel.DEVICE_SN76489),e.master.addChannel(this.psg)}reset(){}setData(e){this.psg.writeRegisterSN(0,e&255)}};function Zn(h){for(var e=new vt,r=1;r<=h;r++){var c=new mn;e["pokey"+r]=c,e.master.addChannel(c)}return e}function Ne(h,e){for(var r=new Uint8Array(h.length*e.length),c=0,m=0;m.5?1:0;var W0=Ne(L,K),F0=Ne(K,V0),w0=[W0,K,F0,K,L,q,V0,q],Q=Xe(2),l0=Xe(6),O0=Xe(31),b0=Xe(93),R0=Ne(A0,V0),z0=Ne(K,Q),E0=Ne(K,l0),U0=[t0,V0,R0,F0,Q,Q,O0,z0,U,K,O0,t0,l0,l0,b0,E0],p0=new Uint8Array(16),c0=new Float32Array(4),i0=new Float32Array(4),Z=new Float32Array(4),w=new Uint8Array(4),T=[t0,t0,t0,t0],f0,M,n0,O,E=!0;this.setBufferLength=function(H){f0=new Int32Array(H)},this.getBuffer=function(){return f0},this.setSampleRate=function(H){M=H,O=v/H};function _0(H){var r0=p0[8],C0=r0&N?G:k,$,m0=H&4,N0=m0>>1,Y=m0>>2;r0&a>>Y?(r0&d>>Y?$=p0[m0+2]*256+p0[m0+0]+7:$=(p0[m0+2]*256+p0[m0+0]+1)*C0,i0[N0+1]=O/$,i0[N0+0]=0):(r0&d>>Y?$=p0[m0+0]+4:$=(p0[m0+0]+1)*C0,i0[N0+0]=O/$,$=(p0[m0+2]+1)*C0,i0[N0+1]=O/$)}this.setRegister=function(H,r0){if(H&=15,r0&=255,p0[H]!=r0)switch(p0[H]=r0,H){case 0:case 2:case 4:case 6:case 8:E=!0;break;case 1:case 3:case 5:case 7:Z[H>>1]=r0&15,T[H>>1]=w0[r0>>5];break}},this.getRegister=function(H){return H&=15,p0[H]},this.setTIARegister=function(H,r0){switch(H){case 23:case 24:p0[(H&1)*4]=r0&31,E=!0;break;case 21:case 22:T[(H&1)*2]=U0[r0&15];break;case 25:case 26:Z[(H&1)*2]=r0&15;break}},this.generate=function(H){E&&(_0(0),_0(4),E=!1);for(var r0=0;r00&&m0<1&&N0>0){var Y=T[$],e0=c0[$]+=m0;e0>Y.length&&(e0=c0[$]=e0-Math.floor(e0/Y.length)*Y.length);var s0=Y[Math.floor(e0)];s0&&(C0+=N0)}}C0*=64,f0[r0]=C0,f0[r0+1]=C0}}},Mn=function(h){var e,r,c=[],m=0;h.onmessage=function(o){o&&o.data&&o.data.samples&&r&&(c.push(o.data.samples),m+=o.data.samples.length)},this.setBufferLength=function(o){r=new Int16Array(o),m=0},this.getBuffer=function(){return r},this.setSampleRate=function(o){e=o,h.postMessage({sampleRate:o})},this.generate=function(o){if(m=o.length)){d=0,x[W]=o;var u0=(W+1)%x.length;u0==a?W=Math.floor(a+y/2)%x.length:W=u0,o=x[W]}},this.feedSample=function(G,u0){if(m+=G*u0,r+=c*u0,r>=1){for(m/=r;r>=1;)this.addSingleSample(m*c),r-=1;m*=r}}},it=class{constructor(e){this.sa=new ln(e)}feedSample(e,r){this.sa.feedSample(e,r)}start(){this.sa.start()}stop(){this.sa.stop()}},bn=class{constructor(e,r,c){this.audioGain=1/8192;this.bufferLength=r*2,this.channels=e.generate?[e]:e,this.channels.forEach(m=>{m.setBufferLength(this.bufferLength),m.setSampleRate(c)})}generate(e){var r=this.bufferLength,c=this.channels.map(o=>o.getBuffer());this.channels.forEach(o=>{o.generate(r)});for(let o=0;om+=d[o]),e.feedSample(m*this.audioGain,1)}}};var I0;(function(I){I[I.CLOCKS=0]="CLOCKS",I[I.EXECUTE=16777216]="EXECUTE",I[I.INTERRUPT=134217728]="INTERRUPT",I[I.ILLEGAL=150994944]="ILLEGAL",I[I.SP_PUSH=167772160]="SP_PUSH",I[I.SP_POP=184549376]="SP_POP",I[I.HAS_VALUE=268435456]="HAS_VALUE",I[I.MEM_READ=301989888]="MEM_READ",I[I.MEM_WRITE=318767104]="MEM_WRITE",I[I.IO_READ=335544320]="IO_READ",I[I.IO_WRITE=352321536]="IO_WRITE",I[I.VRAM_READ=369098752]="VRAM_READ",I[I.VRAM_WRITE=385875968]="VRAM_WRITE",I[I.DMA_READ=402653184]="DMA_READ",I[I.DMA_WRITE=419430400]="DMA_WRITE",I[I.WAIT=520093696]="WAIT",I[I.SCANLINE=2113929216]="SCANLINE",I[I.FRAME=2130706432]="FRAME"})(I0||(I0={}));var ft=class{constructor(e,r){this.idx=0;this.sl=0;this.cur_sp=-1;this.singleFrame=!0;this.m=e,this.reset(r||1048576)}start(){this.m.connectProbe(this)}stop(){this.m.connectProbe(null)}reset(e){e&&(this.buf=new Uint32Array(e)),this.sl=0,this.cur_sp=-1,this.clear()}clear(){this.idx=0}logData(e){this.log(e)}log(e){this.idx>=this.buf.length||(this.buf[this.idx++]=e)}relog(e){this.buf[this.idx-1]=e}lastOp(){return this.idx>0?this.buf[this.idx-1]&4278190080:-1}lastAddr(){return this.idx>0?this.buf[this.idx-1]&16777215:-1}addLogBuffer(e){this.idx+e.length>this.buf.length&&(e=e.slice(0,this.buf.length-this.idx)),this.buf.set(e,this.idx),this.idx+=e.length}logClocks(e){e|=0,e>0&&(this.lastOp()==0?this.relog(this.lastAddr()+e|0):this.log(e|0))}logNewScanline(){this.log(2113929216),this.sl++}logNewFrame(){this.log(2130706432),this.sl=0,this.singleFrame&&this.clear()}logExecute(e,r){this.cur_sp!==r&&(rthis.cur_sp&&this.log(184549376|r),this.cur_sp=r),this.log(e|16777216)}logInterrupt(e){this.log(e|134217728)}logValue(e,r,c){this.log(e&65535|(r&255)<<16|c)}logRead(e,r){this.logValue(e,r,301989888)}logWrite(e,r){this.logValue(e,r,318767104)}logIORead(e,r){this.logValue(e,r,335544320)}logIOWrite(e,r){this.logValue(e,r,352321536)}logVRAMRead(e,r){this.logValue(e,r,369098752)}logVRAMWrite(e,r){this.logValue(e,r,385875968)}logIllegal(e){this.log(e|150994944)}logWait(e){this.log(e|520093696)}logDMARead(e,r){this.logValue(e,r,402653184)}logDMAWrite(e,r){this.logValue(e,r,419430400)}countEvents(e){for(var r=0,c=0;c{let c=e.read(r);return this.probe.logRead(r,c),c},write:(r,c)=>{this.probe.logWrite(r,c),e.write(r,c)}}}connectCPUMemoryBus(e){this.cpu.connectMemoryBus(this.probeMemoryBus(e))}probeIOBus(e){return{read:r=>{let c=e.read(r);return this.probe.logIORead(r,c),c},write:(r,c)=>{this.probe.logIOWrite(r,c),e.write(r,c)}}}probeDMABus(e){return{read:r=>{let c=e.read(r);return this.probe.logDMARead(r,c),c},write:(r,c)=>{this.probe.logDMAWrite(r,c),e.write(r,c)}}}connectCPUIOBus(e){this.cpu.connectIOBus(this.probeIOBus(e))}},pt=class extends gt{constructor(){super(...arguments);this.overscan=!1;this.rotate=0}getAudioParams(){return{sampleRate:this.sampleRate,stereo:!1}}connectAudio(e){this.audio=e}getVideoParams(){return{width:this.canvasWidth,height:this.numVisibleScanlines,aspect:this.aspectRatio,overscan:this.overscan,rotate:this.rotate}}connectVideo(e){this.pixels=e}},dn=class extends pt{advanceFrame(e){this.preFrame();var r=0,c=0;this.probe.logNewFrame(),this.frameCycles=0;for(var m=0;m=64&&r<=127&&(x=Pt[r-64]),r>=160&&r<=191&&(x=Pt[r-160+64]),d++;break;case 221:case 253:var y=e==221?"ix":"iy";r==203?(x=kt[m],a[2]=m,a[3]=c,d++):x=_t[r],x=x.replace(/[(]hl[)]/,"("+y+"+x)"),x=x.replace(/\bhl\b/,y),d++;break;default:x=_t[e];break}if((!x||!x.length)&&(x="??"),/\bxx\b/.test(x))x=x.replace(/\bxx\b/,"$"+a0(a[d]+(a[d+1]<<8),4)),d+=2,W=!0;else if(/\bx\b/.test(x)){if(x.startsWith("j")){var p=r<128?h+2+r:h+2-(256-r);p&=65535,x=x.replace(/\bx\b/,"$"+a0(p,4)),W=!0}else x=x.replace(/\bx\b/,"$"+a0(a[d],2));d+=1}return{line:x.toUpperCase(),nbytes:d,isaddr:W}}var Ve=class{constructor(e){this.maxROMSize=262144;this.videoOffsetBytes=0;this.prefix=e;var r=this;this.cpu={getPC:r.getPC.bind(r),getSP:r.getSP.bind(r),isStable:r.isStable.bind(r),reset:r.reset.bind(r),saveState:()=>r.getCPUState(),loadState:()=>{console.log("loadState not implemented")},connectMemoryBus(){console.log("connectMemoryBus not implemented")}}}getImports(e){return{}}async fetchWASM(){var e=await fetch("res/"+this.prefix+".wasm");if(e.status==200||e.size){var r=await e.arrayBuffer(),c=await WebAssembly.compile(r),m=await WebAssembly.instantiate(c,this.getImports(c));this.instance=m,this.exports=m.exports}else throw new Error("could not load WASM file")}async fetchBIOS(){var e=await fetch("res/"+this.prefix+".bios");if(e.status==200||e.size){var r=await e.arrayBuffer();this.biosptr=this.exports.malloc(r.byteLength),this.biosarr=new Uint8Array(this.exports.memory.buffer,this.biosptr,r.byteLength),this.loadBIOS(new Uint8Array(r))}else throw new Error("could not load BIOS file")}async initWASM(){this.sys=this.exports.machine_init(this.biosptr);let e=this.exports.machine_get_state_size();this.stateptr=this.exports.malloc(e);let r=this.exports.machine_get_controls_state_size();this.ctrlstateptr=this.exports.malloc(r);let c=this.exports.machine_get_cpu_state_size();this.cpustateptr=this.exports.malloc(c),this.romptr=this.exports.malloc(this.maxROMSize),this.statearr=new Uint8Array(this.exports.memory.buffer,this.stateptr,e),this.ctrlstatearr=new Uint8Array(this.exports.memory.buffer,this.ctrlstateptr,r),this.cpustatearr=new Uint8Array(this.exports.memory.buffer,this.cpustateptr,c);let m=4096*4;this.audioarr=new Float32Array(this.exports.memory.buffer,this.exports.machine_get_sample_buffer(),m),this.romarr=new Uint8Array(this.exports.memory.buffer,this.romptr,this.maxROMSize),console.log("machine_init",this.sys,e,r,c,m)}async loadWASM(){await this.fetchWASM(),this.exports.memory.grow(96),await this.fetchBIOS(),await this.initWASM()}getPC(){return this.exports.machine_cpu_get_pc(this.sys)}getSP(){return this.exports.machine_cpu_get_sp(this.sys)}isStable(){return this.exports.machine_cpu_is_stable(this.sys)}loadROM(e){if(e.length>this.maxROMSize)throw new At(`Rom size too big: ${e.length} bytes`);this.romarr.set(e),this.romlen=e.length,console.log("load rom",e.length,"bytes"),this.reset()}loadBIOS(e){this.biosarr.set(e)}reset(){this.exports.machine_reset(this.sys)}read(e){return this.exports.machine_mem_read(this.sys,e&65535)}readConst(e){return this.exports.machine_mem_read(this.sys,e&65535)}write(e,r){this.exports.machine_mem_write(this.sys,e&65535,r&255)}getAudioParams(){return{sampleRate:44100,stereo:!1}}connectVideo(e){this.pixel_dest=e;var r=this.exports.machine_get_pixel_buffer(this.sys);console.log("connectVideo",r,e.length),this.pixel_src=new Uint32Array(this.exports.memory.buffer,r+this.videoOffsetBytes,e.length)}syncVideo(){this.exports.machine_update_video&&this.exports.machine_update_video(this.sys),this.pixel_dest!=null&&this.pixel_dest.set(this.pixel_src)}saveControlsState(){return this.exports.machine_save_controls_state(this.sys,this.ctrlstateptr),{controls:this.ctrlstatearr.slice(0)}}loadControlsState(e){this.ctrlstatearr.set(e.controls),this.exports.machine_load_controls_state(this.sys,this.ctrlstateptr)}connectAudio(e){this.audio=e}syncAudio(){if(this.audio!=null)for(var e=this.exports.machine_get_sample_count(),r=0;r>1)&128)>>6},K=function(u,n,g){a|=((u^n^g^g>>1)&32768)>>14},U=function(){return(e<<8)+r},A0=function(u){e=u>>8&255,r=u&255},x0=function(u){_(--d,u&255)},L=function(u){_(--d,u&255),_(--d,u>>8&255)},X0=function(u){_(--o,u&255)},W0=function(u){_(--o,u&255),_(--o,u>>8&255)},F0=function(){return v(d++)},w0=function(){return v(d++)*256+v(d++)},Q=function(){return v(o++)},l0=function(){return v(o++)*256+v(o++)},O0=function(u){var n=0;u&128&&(L(x),n+=2),u&64&&(L(o),n+=2),u&32&&(L(m),n+=2),u&16&&(L(c),n+=2),u&8&&(x0(W),n++),u&4&&(x0(r),n++),u&2&&(x0(e),n++),u&1&&(x0(a),n++),V+=n},b0=function(u){var n=0;u&128&&(W0(x),n+=2),u&64&&(W0(d),n+=2),u&32&&(W0(m),n+=2),u&16&&(W0(c),n+=2),u&8&&(X0(W),n++),u&4&&(X0(r),n++),u&2&&(X0(e),n++),u&1&&(X0(a),n++),V+=n},R0=function(u){var n=0;u&1&&(a=F0(),n++),u&2&&(e=F0(),n++),u&4&&(r=F0(),n++),u&8&&(W=F0(),n++),u&16&&(c=w0(),n+=2),u&32&&(m=w0(),n+=2),u&64&&(o=w0(),n+=2),u&128&&(x=w0(),n+=2),V+=n},z0=function(u){var n=0;u&1&&(a=Q(),n++),u&2&&(e=Q(),n++),u&4&&(r=Q(),n++),u&8&&(W=Q(),n++),u&16&&(c=l0(),n+=2),u&32&&(m=l0(),n+=2),u&64&&(d=l0(),n+=2),u&128&&(x=l0(),n+=2),V+=n},E0=function(u){switch(u&15){case 0:return U();case 1:return c;case 2:return m;case 3:return o;case 4:return d;case 5:return x;case 8:return e;case 9:return r;case 10:return a;case 11:return W;default:return null}},U0=function(u,n){switch(u&15){case 0:A0(n);return;case 1:c=n;return;case 2:m=n;return;case 3:o=n;return;case 4:d=n;return;case 5:x=n;return;case 8:e=n;return;case 9:r=n;return;case 10:a=n;return;case 11:W=n;return;default:return}},p0=function(u,n){var g=u&136;(g==128||g==8)&&(g=0),n?(g=E0(u>>4),U0(u>>4,E0(u)),U0(u,g)):U0(u,E0(u>>4))},c0=function(u){return u>127?u-256:u},i0=function(u){return u>32767?u-65536:u},Z=function(){var u=v(x++);return x&=65535,u},w=function(){var u=v(x++);x&=65535;var n=v(x++);return x&=65535,u*256+n},T=function(u){var n=v(u++);u&=65535;var g=v(u++);return u&=65535,n*256+g},f0=function(u,n){_(u++,n>>8&255),u&=65535,_(u,n&255)},M=function(){var u=Z(),n;switch(u&96){case 0:n=c;break;case 32:n=m;break;case 64:n=o;break;case 96:n=d;break}var g=null,s=null,t;if(u&128){switch(u&15){case 0:s=n,g=n+1,V+=2;break;case 1:s=n,g=n+2,V+=3;break;case 2:g=n-1,s=g,V+=2;break;case 3:g=n-2,s=g,V+=3;break;case 4:s=n;break;case 5:s=n+c0(r),V+=1;break;case 6:s=n+c0(e),V+=1;break;case 7:s=0;break;case 8:s=n+c0(Z()),V+=1;break;case 9:s=n+i0(w()),V+=4;break;case 10:s=0;break;case 11:V+=4,s=n+U();break;case 12:t=c0(Z()),s=x+t,V+=1;break;case 13:t=i0(w()),s=x+t,V+=5;break;case 14:s=0;break;case 15:V+=5,s=w();break}s&=65535,u&16&&(s=v(s)*256+v(s+1&65535),V+=3)}else{var b=u&31;b>15&&(b-=32),s=n+b,V+=1}if(g!==null)switch(u&96){case 0:c=g;break;case 32:m=g;break;case 64:o=g;break;case 96:d=g;break}return s&65535},n0=function(u){a&=~(N|k),u===0&&(a|=N),u&32768&&(a|=k)},O=function(u){return u++,u&=255,a&=~(N|p|k),a|=q[u],(u===0||u==128)&&(a|=p),u},E=function(u){return u--,u&=255,a&=~(N|p|k),a|=q[u],(u===127||u==255)&&(a|=p),u},_0=function(u,n){var g=u-n;return a&=~(y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g),g&255},H=function(u,n){var g=u-n;return a&=~(y|N|p|k),(g&65535)==0&&(a|=N),g&32768&&(a|=k),g&65536&&(a|=y),K(u,n,g),g&65535},r0=function(u,n){var g=u+n;return a&=~(u0|y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g),(g^u^n)&16&&(a|=u0),g&255},C0=function(u,n){var g=u+n;return a&=~(y|N|p|k),(g&65535)==0&&(a|=N),g&32768&&(a|=k),g&65536&&(a|=y),K(u,n,g),g&65535},$=function(u,n){var g=u+n+(a&y);return a&=~(u0|y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g),(g^u^n)&16&&(a|=u0),g&255},m0=function(u,n){var g=u-n-(a&y);return a&=~(y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g),g&255},N0=function(u,n){var g=u-n;a&=~(y|N|p|k),a|=q[g&255],g&256&&(a|=y),V0(u,n,g)},Y=function(u,n){var g=u-n;a&=~(y|N|p|k),(g&65535)==0&&(a|=N),g&32768&&(a|=k),g&65536&&(a|=y),K(u,n,g)},e0=function(u){return a&=~(y|N|p|k),u==128&&(a|=p),u=(~u&255)+1,u===0&&(a|=N),u&128&&(a|=k|y),u},s0=function(u){return a&=~(N|y|k),u&1&&(a|=y),u>>=1,u===0&&(a|=N),u&255},P0=function(u){return a&=~(N|y|k),u&1&&(a|=y),u=u&128|u>>1,a|=q[u],u},B0=function(u){var n=u;return a&=~(N|y|k|p),u&128&&(a|=y),u<<=1,a|=q[u],(u^n)&128&&(a|=p),u},H0=function(u){var n=u,g=a&y;return a&=~(N|y|k|p),u&128&&(a|=y),u=u<<1|g,a|=q[u],(u^n)&128&&(a|=p),u},o0=function(u){var n=a&y;return a&=~(N|y|k),u&1&&(a|=y),u=u>>1|n<<7,a|=q[u],u},d0=function(u,n){return a&=~(N|k|p),u^=n,a|=q[u],u},Z0=function(u,n){return a&=~(N|k|p),u|=n,a|=q[u],u},k0=function(u,n){return a&=~(N|k|p),u&=n,a|=q[u],u},K0=function(u){return a&=~(N|k|p),u^=255,a|=q[u],a|=y,u},X=function(){return W*256+Z()},j0=function(){var u=V,n=null,g=null,s=x,t=Z();switch(V+=Y0[t],t){case 0:n=X(),_(n,e0(v(n)));break;case 3:n=X(),_(n,K0(v(n)));break;case 4:n=X(),_(n,s0(v(n)));break;case 6:n=X(),_(n,o0(v(n)));break;case 7:n=X(),_(n,P0(v(n)));break;case 8:n=X(),_(n,B0(v(n)));break;case 9:n=X(),_(n,H0(v(n)));break;case 10:n=X(),_(n,E(v(n)));break;case 12:n=X(),_(n,O(v(n)));break;case 13:n=X(),g=v(n),a&=~(N|k|p),a|=q[g];break;case 14:n=X(),x=n;break;case 15:n=X(),_(n,0),a&=~(y|k|p),a|=N;break;case 18:break;case 19:break;case 22:n=i0(w()),x+=n;break;case 23:n=i0(w()),L(x),x+=n;break;case 25:var b=0,P=e&240,y0=e&15;(y0>9||a&32)&&(b|=6),P>128&&y0>9&&(b|=96),(P>144||a&1)&&(b|=96),n=b+e,a&=~(y|k|N|p),n&256&&(a|=y),e=n&255,a|=q[e];break;case 26:a|=Z();break;case 28:a&=Z();break;case 29:e=r&128?255:0,n0(U()),a&=~p;break;case 30:g=Z(),p0(g,!0);break;case 31:g=Z(),p0(g,!1);break;case 32:n=c0(Z()),x+=n;break;case 33:n=c0(Z());break;case 34:n=c0(Z()),a&(y|N)||(x+=n);break;case 35:n=c0(Z()),a&(y|N)&&(x+=n);break;case 36:n=c0(Z()),a&y||(x+=n);break;case 37:n=c0(Z()),a&y&&(x+=n);break;case 38:n=c0(Z()),a&N||(x+=n);break;case 39:n=c0(Z()),a&N&&(x+=n);break;case 40:n=c0(Z()),a&p||(x+=n);break;case 41:n=c0(Z()),a&p&&(x+=n);break;case 42:n=c0(Z()),a&k||(x+=n);break;case 43:n=c0(Z()),a&k&&(x+=n);break;case 44:n=c0(Z()),a&k^(a&p)<<2||(x+=n);break;case 45:n=c0(Z()),a&k^(a&p)<<2&&(x+=n);break;case 46:n=c0(Z()),a&k^(a&p)<<2||a&N||(x+=n);break;case 47:n=c0(Z()),(a&k^(a&p)<<2||a&N)&&(x+=n);break;case 48:c=M(),c===0?a|=N:a&=~N;break;case 49:m=M(),m===0?a|=N:a&=~N;break;case 50:d=M();break;case 51:o=M();break;case 52:O0(Z());break;case 53:R0(Z());break;case 54:b0(Z());break;case 55:z0(Z());break;case 57:x=w0();break;case 58:c+=r;break;case 59:a=F0(),a&B&&(V+=9,e=F0(),r=F0(),W=F0(),c=w0(),m=w0(),o=w0()),x=w0();break;case 60:a&=Z();break;case 61:n=e*r,n===0?a|=N:a&=~N,n&128?a|=y:a&=~y,A0(n);break;case 63:a|=B,L(x),L(o),L(m),L(c),x0(W),x0(r),x0(e),x0(a),a|=G|A,x=T(z);break;case 64:e=e0(e);break;case 67:e=K0(e);break;case 68:e=s0(e);break;case 70:e=o0(e);break;case 71:e=P0(e);break;case 72:e=B0(e);break;case 73:e=H0(e);break;case 74:e=E(e);break;case 76:e=O(e);break;case 77:a&=~(N|k|p),a|=q[e];break;case 79:e=0,a&=~(k|p|y),a|=N;break;case 80:r=e0(r);break;case 83:r=K0(r);break;case 84:r=s0(r);break;case 86:r=o0(r);break;case 87:r=P0(r);break;case 88:r=B0(r);break;case 89:r=H0(r);break;case 90:r=E(r);break;case 92:r=O(r);break;case 93:a&=~(N|k|p),a|=q[r];break;case 95:r=0,a&=~(k|p|y),a|=N;break;case 96:n=M(),_(n,e0(v(n)));break;case 99:n=M(),_(n,K0(v(n)));break;case 100:n=M(),_(n,s0(v(n)));break;case 102:n=M(),_(n,o0(v(n)));break;case 103:n=M(),_(n,P0(v(n)));break;case 104:n=M(),_(n,B0(v(n)));break;case 105:n=M(),_(n,H0(v(n)));break;case 106:n=M(),_(n,E(v(n)));break;case 108:n=M(),_(n,O(v(n)));break;case 109:n=M(),g=v(n),a&=~(N|k|p),a|=q[g];break;case 110:n=M(),x=n;break;case 111:n=M(),_(n,0),a&=~(y|k|p),a|=N;break;case 112:n=w(),_(n,e0(v(n)));break;case 115:n=w(),_(n,K0(v(n)));break;case 116:n=w(),_(n,s0(v(n)));break;case 118:n=w(),_(n,o0(v(n)));break;case 119:n=w(),_(n,P0(v(n)));break;case 120:n=w(),_(n,B0(v(n)));break;case 121:n=w(),_(n,H0(v(n)));break;case 122:n=w(),_(n,E(v(n)));break;case 124:n=w(),_(n,O(v(n)));break;case 125:n=w(),g=v(n),a&=~(N|k|p),a|=q[g];break;case 126:n=w(),x=n;break;case 127:n=w(),_(n,0),a&=~(y|k|p),a|=N;break;case 128:e=_0(e,Z());break;case 129:N0(e,Z());break;case 130:e=m0(e,Z());break;case 131:A0(H(U(),w()));break;case 132:e=k0(e,Z());break;case 133:k0(e,Z());break;case 134:e=Z(),a&=~(N|k|p),a|=q[e];break;case 136:e=d0(e,Z());break;case 137:e=$(e,Z());break;case 138:e=Z0(e,Z());break;case 139:e=r0(e,Z());break;case 140:Y(c,w());break;case 141:n=c0(Z()),L(x),x+=n;break;case 142:c=w(),n0(c),a&=~p;break;case 144:n=X(),e=_0(e,v(n));break;case 145:n=X(),N0(e,v(n));break;case 146:n=X(),e=m0(e,v(n));break;case 147:n=X(),A0(H(U(),T(n)));break;case 148:n=X(),e=k0(e,v(n));break;case 149:n=X(),k0(e,v(n));break;case 150:n=X(),e=v(n),a&=~(N|k|p),a|=q[e];break;case 151:n=X(),_(n,e),a&=~(N|k|p),a|=q[e];break;case 152:n=X(),e=d0(e,v(n));break;case 153:n=X(),e=$(e,v(n));break;case 154:n=X(),e=Z0(e,v(n));break;case 155:n=X(),e=r0(e,v(n));break;case 156:n=X(),Y(c,T(n));break;case 157:n=X(),L(x),x=n;break;case 158:n=X(),c=T(n),n0(c),a&=~p;break;case 159:n=X(),f0(n,c),n0(c),a&=~p;break;case 160:n=M(),e=_0(e,v(n));break;case 161:n=M(),N0(e,v(n));break;case 162:n=M(),e=m0(e,v(n));break;case 163:n=M(),A0(H(U(),T(n)));break;case 164:n=M(),e=k0(e,v(n));break;case 165:n=M(),k0(e,v(n));break;case 166:n=M(),e=v(n),a&=~(N|k|p),a|=q[e];break;case 167:n=M(),_(n,e),a&=~(N|k|p),a|=q[e];break;case 168:n=M(),e=d0(e,v(n));break;case 169:n=M(),e=$(e,v(n));break;case 170:n=M(),e=Z0(e,v(n));break;case 171:n=M(),e=r0(e,v(n));break;case 172:n=M(),Y(c,T(n));break;case 173:n=M(),L(x),x=n;break;case 174:n=M(),c=T(n),n0(c),a&=~p;break;case 175:n=M(),f0(n,c),n0(c),a&=~p;break;case 176:n=w(),e=_0(e,v(n));break;case 177:n=w(),N0(e,v(n));break;case 178:n=w(),e=m0(e,v(n));break;case 179:n=w(),A0(H(U(),T(n)));break;case 180:n=w(),e=k0(e,v(n));break;case 181:n=w(),k0(e,v(n));break;case 182:n=w(),e=v(n),a&=~(N|k|p),a|=q[e];break;case 183:n=w(),_(n,e),a&=~(N|k|p),a|=q[e];break;case 184:n=w(),e=d0(e,v(n));break;case 185:n=w(),e=$(e,v(n));break;case 186:n=w(),e=Z0(e,v(n));break;case 187:n=w(),e=r0(e,v(n));break;case 188:n=w(),Y(c,T(n));break;case 189:n=w(),L(x),x=n;break;case 190:n=w(),c=T(n),n0(c),a&=~p;break;case 191:n=w(),f0(n,c),n0(c),a&=~p;break;case 192:r=_0(r,Z());break;case 193:N0(r,Z());break;case 194:r=m0(r,Z());break;case 195:A0(C0(U(),w()));break;case 196:r=k0(r,Z());break;case 197:k0(r,Z());break;case 198:r=Z(),a&=~(N|k|p),a|=q[r];break;case 200:r=d0(r,Z());break;case 201:r=$(r,Z());break;case 202:r=Z0(r,Z());break;case 203:r=r0(r,Z());break;case 204:n=w(),A0(n),n0(n),a&=~p;break;case 206:o=w(),n0(o),a&=~p;break;case 208:n=X(),r=_0(r,v(n));break;case 209:n=X(),N0(r,v(n));break;case 210:n=X(),r=m0(r,v(n));break;case 211:n=X(),A0(C0(U(),T(n)));break;case 212:n=X(),r=k0(r,v(n));break;case 213:n=X(),k0(r,v(n));break;case 214:n=X(),r=v(n),a&=~(N|k|p),a|=q[r];break;case 215:n=X(),_(n,r),a&=~(N|k|p),a|=q[r];break;case 216:n=X(),r=d0(r,v(n));break;case 217:n=X(),r=$(r,v(n));break;case 218:n=X(),r=Z0(r,v(n));break;case 219:n=X(),r=r0(r,v(n));break;case 220:n=X(),g=T(n),A0(g),n0(g),a&=~p;break;case 221:n=X(),f0(n,U()),a&=~p;break;case 222:n=X(),o=T(n),n0(o),a&=~p;break;case 223:n=X(),f0(n,o),n0(o),a&=~p;break;case 224:n=M(),r=_0(r,v(n));break;case 225:n=M(),N0(r,v(n));break;case 226:n=M(),r=m0(r,v(n));break;case 227:n=M(),A0(C0(U(),T(n)));break;case 228:n=M(),r=k0(r,v(n));break;case 229:n=M(),k0(r,v(n));break;case 230:n=M(),r=v(n),a&=~(N|k|p),a|=q[r];break;case 231:n=M(),_(n,r),a&=~(N|k|p),a|=q[r];break;case 232:n=M(),r=d0(r,v(n));break;case 233:n=M(),r=$(r,v(n));break;case 234:n=M(),r=Z0(r,v(n));break;case 235:n=M(),r=r0(r,v(n));break;case 236:n=M(),g=T(n),A0(g),n0(g),a&=~p;break;case 237:n=M(),f0(n,U()),a&=~p;break;case 238:n=M(),o=T(n),n0(o),a&=~p;break;case 239:n=M(),f0(n,o),n0(o),a&=~p;break;case 240:n=w(),r=_0(r,v(n));break;case 241:n=w(),N0(r,v(n));break;case 242:n=w(),r=m0(r,v(n));break;case 243:n=w(),A0(C0(U(),T(n)));break;case 244:n=w(),r=k0(r,v(n));break;case 245:n=w(),k0(r,v(n));break;case 246:n=w(),r=v(n),a&=~(N|k|p),a|=q[r];break;case 247:n=w(),_(n,r),a&=~(N|k|p),a|=q[r];break;case 248:n=w(),r=d0(r,v(n));break;case 249:n=w(),r=$(r,v(n));break;case 250:n=w(),r=Z0(r,v(n));break;case 251:n=w(),r=r0(r,v(n));break;case 252:n=w(),g=T(n),A0(g),n0(g),a&=~p;break;case 253:n=w(),f0(n,U()),a&=~p;break;case 254:n=w(),o=T(n),n0(o),a&=~p;break;case 255:n=w(),f0(n,o),n0(o),a&=~p;break;case 16:switch(t=Z(),V+=t0[t],t){case 33:n=i0(w());break;case 34:n=i0(w()),a&(y|N)||(x+=n);break;case 35:n=i0(w()),a&(y|N)&&(x+=n);break;case 36:n=i0(w()),a&y||(x+=n);break;case 37:n=i0(w()),a&y&&(x+=n);break;case 38:n=i0(w()),a&N||(x+=n);break;case 39:n=i0(w()),a&N&&(x+=n);break;case 40:n=i0(w()),a&p||(x+=n);break;case 41:n=i0(w()),a&p&&(x+=n);break;case 42:n=i0(w()),a&k||(x+=n);break;case 43:n=i0(w()),a&k&&(x+=n);break;case 44:n=i0(w()),a&k^(a&p)<<2||(x+=n);break;case 45:n=i0(w()),a&k^(a&p)<<2&&(x+=n);break;case 46:n=i0(w()),a&k^(a&p)<<2||a&N||(x+=n);break;case 47:n=i0(w()),(a&k^(a&p)<<2||a&N)&&(x+=n);break;case 63:a|=B,L(x),L(o),L(m),L(c),x0(W),x0(r),x0(e),x0(a),a|=G|A,x=T(g0);break;case 131:Y(U(),w());break;case 140:Y(m,w());break;case 142:m=w(),n0(m),a&=~p;break;case 147:n=X(),Y(U(),T(n));break;case 156:n=X(),Y(m,T(n));break;case 158:n=X(),m=T(n),n0(m),a&=~p;break;case 159:n=X(),f0(n,m),n0(m),a&=~p;break;case 163:n=M(),Y(U(),T(n));break;case 172:n=M(),Y(m,T(n));break;case 174:n=M(),m=T(n),n0(m),a&=~p;break;case 175:n=M(),f0(n,m),n0(m),a&=~p;break;case 179:n=w(),Y(U(),T(n));break;case 188:n=w(),Y(m,T(n));break;case 190:n=w(),m=T(n),n0(m),a&=~p;break;case 191:n=w(),f0(n,m),n0(m),a&=~p;break;case 206:d=w(),n0(d),a&=~p;break;case 222:n=X(),d=T(n),n0(d),a&=~p;break;case 223:n=X(),f0(n,d),n0(d),a&=~p;break;case 238:n=M(),d=T(n),n0(d),a&=~p;break;case 239:n=M(),f0(n,d),n0(d),a&=~p;break;case 254:n=w(),d=T(n),n0(d),a&=~p;break;case 255:n=w(),f0(n,d),n0(d),a&=~p;break}break;case 17:switch(t=Z(),V+=t0[t],t){case 63:a|=B,L(x),L(o),L(m),L(c),x0(W),x0(r),x0(e),x0(a),a|=G|A,x=T(T0);break;case 131:Y(o,w());break;case 140:Y(d,w());break;case 147:n=X(),Y(o,T(n));break;case 156:n=X(),Y(d,T(n));break;case 163:n=M(),Y(o,T(n));break;case 172:n=M(),Y(d,T(n));break;case 179:n=w(),Y(o,T(n));break;case 188:n=w(),Y(d,T(n));break}break}return e&=255,r&=255,a&=255,W&=255,c&=65535,m&=65535,o&=65535,d&=65535,x&=65535,V-u},Q0=function(){x=T(I),W=0,a|=A|G,V=0,e=r=W=c=m=o=d=0},ee=[[2,1,"NEG"],[1,0,"???"],[1,0,"???"],[2,1,"COM"],[2,1,"LSR"],[1,0,"???"],[2,1,"ROR"],[2,1,"ASR"],[2,1,"LSL"],[2,1,"ROL"],[2,1,"DEC"],[1,0,"???"],[2,1,"INC"],[2,1,"TST"],[2,1,"JMP"],[2,1,"CLR"],[1,0,"Prefix"],[1,0,"Prefix"],[1,2,"NOP"],[1,2,"SYNC"],[1,0,"???"],[1,0,"???"],[3,3,"LBRA"],[3,3,"LBSR"],[1,0,"???"],[1,2,"DAA"],[2,4,"ORCC"],[1,0,"???"],[2,4,"ANDCC"],[1,2,"SEX"],[2,20,"EXG"],[2,20,"TFR"],[2,5,"BRA"],[2,5,"BRN"],[2,5,"BHI"],[2,5,"BLS"],[2,5,"BCC"],[2,5,"BCS"],[2,5,"BNE"],[2,5,"BEQ"],[2,5,"BVC"],[2,5,"BVS"],[2,5,"BPL"],[2,5,"BMI"],[2,5,"BGE"],[2,5,"BLT"],[2,5,"BGT"],[2,5,"BLE"],[2,6,"LEAX"],[2,6,"LEAY"],[2,6,"LEAS"],[2,6,"LEAU"],[2,10,"PSHS"],[2,10,"PULS"],[2,11,"PSHU"],[2,11,"PULU"],[1,0,"???"],[1,2,"RTS"],[1,2,"ABX"],[1,2,"RTI"],[2,2,"CWAI"],[1,2,"MUL"],[1,2,"RESET"],[1,2,"SWI1"],[1,2,"NEGA"],[1,0,"???"],[1,0,"???"],[1,2,"COMA"],[1,2,"LSRA"],[1,0,"???"],[1,2,"RORA"],[1,2,"ASRA"],[1,2,"ASLA"],[1,2,"ROLA"],[1,2,"DECA"],[1,0,"???"],[1,2,"INCA"],[1,2,"TSTA"],[1,0,"???"],[1,2,"CLRA"],[1,2,"NEGB"],[1,0,"???"],[1,0,"???"],[1,2,"COMB"],[1,2,"LSRB"],[1,0,"???"],[1,2,"RORB"],[1,2,"ASRB"],[1,2,"ASLB"],[1,2,"ROLB"],[1,2,"DECB"],[1,0,"???"],[1,2,"INCB"],[1,2,"TSTB"],[1,0,"???"],[1,2,"CLRB"],[2,6,"NEG"],[1,0,"???"],[1,0,"???"],[2,6,"COM"],[2,6,"LSR"],[1,0,"???"],[2,6,"ROR"],[2,6,"ASR"],[2,6,"LSL"],[2,6,"ROL"],[2,6,"DEC"],[1,0,"???"],[2,6,"INC"],[2,6,"TST"],[2,6,"JMP"],[2,6,"CLR"],[3,7,"NEG"],[1,0,"???"],[1,0,"???"],[3,7,"COM"],[3,7,"LSR"],[1,0,"???"],[3,7,"ROR"],[3,7,"ASR"],[3,7,"LSL"],[3,7,"ROL"],[3,7,"DEC"],[1,0,"???"],[3,7,"INC"],[3,7,"TST"],[3,7,"JMP"],[3,7,"CLR"],[2,4,"SUBA"],[2,4,"CMPA"],[2,4,"SBCA"],[3,8,"SUBD"],[2,4,"ANDA"],[2,4,"BITA"],[2,4,"LDA"],[1,0,"???"],[2,4,"EORA"],[2,4,"ADCA"],[2,4,"ORA"],[2,4,"ADDA"],[3,8,"CMPX"],[2,5,"BSR"],[3,8,"LDX"],[1,0,"???"],[2,1,"SUBA"],[2,1,"CMPA"],[2,1,"SBCA"],[2,1,"SUBd"],[2,1,"ANDA"],[2,1,"BITA"],[2,1,"LDA"],[2,1,"STA"],[2,1,"EORA"],[2,1,"ADCA"],[2,1,"ORA"],[2,1,"ADDA"],[2,1,"CMPX"],[2,1,"JSR"],[2,1,"LDX"],[2,1,"STX"],[2,6,"SUBA"],[2,6,"CMPA"],[2,6,"SBCA"],[2,6,"SUBD"],[2,6,"ANDA"],[2,6,"BITA"],[2,6,"LDA"],[2,6,"STA"],[2,6,"EORA"],[2,6,"ADCA"],[2,6,"ORA"],[2,6,"ADDA"],[2,6,"CMPX"],[2,6,"JSR"],[2,6,"LDX"],[2,6,"STX"],[3,7,"SUBA"],[3,7,"CMPA"],[3,7,"SBCA"],[3,7,"SUBD"],[3,7,"ANDA"],[3,7,"BITA"],[3,7,"LDA"],[3,7,"STA"],[3,7,"EORA"],[3,7,"ADCA"],[3,7,"ORA"],[3,7,"ADDA"],[3,7,"CMPX"],[3,7,"JSR"],[3,7,"LDX"],[3,7,"STX"],[2,4,"SUBB"],[2,4,"CMPB"],[2,4,"SBCB"],[3,8,"ADDD"],[2,4,"ANDB"],[2,4,"BITB"],[2,4,"LDB"],[1,0,"???"],[2,4,"EORB"],[2,4,"ADCB"],[2,4,"ORB"],[2,4,"ADDB"],[3,8,"LDD"],[1,0,"???"],[3,8,"LDU"],[1,0,"???"],[2,1,"SUBB"],[2,1,"CMPB"],[2,1,"SBCB"],[2,1,"ADDD"],[2,1,"ANDB"],[2,1,"BITB"],[2,1,"LDB"],[2,1,"STB"],[2,1,"EORB"],[2,1,"ADCB"],[2,1,"ORB "],[2,1,"ADDB"],[2,1,"LDD "],[2,1,"STD "],[2,1,"LDU "],[2,1,"STU "],[2,6,"SUBB"],[2,6,"CMPB"],[2,6,"SBCB"],[2,6,"ADDD"],[2,6,"ANDB"],[2,6,"BITB"],[2,6,"LDB"],[2,6,"STB"],[2,6,"EORB"],[2,6,"ADCB"],[2,6,"ORB"],[2,6,"ADDB"],[2,6,"LDD"],[2,6,"STD"],[2,6,"LDU"],[2,6,"STU"],[3,7,"SUBB"],[3,7,"CMPB"],[3,7,"SBCB"],[3,7,"ADDD"],[3,7,"ANDB"],[3,7,"BITB"],[3,7,"LDB"],[3,7,"STB"],[3,7,"EORB"],[3,7,"ADCB"],[3,7,"ORB"],[3,7,"ADDB"],[3,7,"LDD"],[3,7,"STD"],[3,7,"LDU"],[3,7,"STU"]],S={63:[2,2,"SWI3"],131:[4,8,"CMPU"],140:[4,8,"CMPS"],147:[3,1,"CMPU"],156:[3,1,"CMPS"],163:[3,6,"CMPU"],172:[3,6,"CMPS"],179:[4,7,"CMPU"],188:[4,7,"CMPS"]},R={33:[5,3,"LBRN"],34:[5,3,"LBHI"],35:[5,3,"LBLS"],36:[5,3,"LBCC"],37:[5,3,"LBCS"],38:[5,3,"LBNE"],39:[5,3,"LBEQ"],40:[5,3,"LBVC"],41:[5,3,"LBVS"],42:[5,3,"LBPL"],43:[5,3,"LBMI"],44:[5,3,"LBGE"],45:[5,3,"LBLT"],46:[5,3,"LBGT"],47:[5,3,"LBLE"],63:[2,2,"SWI2"],131:[4,8,"CMPD"],140:[4,8,"CMPY"],142:[4,8,"LDY"],147:[3,1,"CMPD"],156:[3,1,"CMPY"],158:[3,1,"LDY"],159:[3,1,"STY"],163:[3,6,"CMPD"],172:[3,6,"CMPY"],174:[3,6,"LDY"],175:[3,6,"STY"],179:[4,7,"CMPD"],188:[4,7,"CMPY"],190:[4,7,"LDY"],191:[4,7,"STY"],206:[4,8,"LDS"],222:[3,1,"LDS"],223:[3,1,"STS"],238:[3,6,"LDS"],239:[3,6,"STS"],254:[4,7,"LDS"],255:[4,7,"STS"]},D=function(u,n,g,s,t,b){var P=function(le,Je){for(var ke=le.toString(16);ke.length>5];if(!(me&128)){var pe=me&31;pe>15&&(pe=pe-32),J+=pe+","+M0;break}var $e=me&16,Le=me&15,_e=g>127?g-256:g,Pe=g*256+s>32767?g*256+s-65536:g*256+s;if($e)switch(Le){case 0:J+="???";break;case 1:J+="[,"+M0+"++]";break;case 2:J+="???";break;case 3:J+="[,--"+M0+"]";break;case 4:J+="[,"+M0+"]";break;case 5:J+="[B,"+M0+"]";break;case 6:J+="[A,"+M0+"]";break;case 7:J+="???";break;case 8:J+="["+_e+","+M0+"]",$0++;break;case 9:J+="["+Pe+","+M0+"]",$0+=2;break;case 10:J+="???";break;case 11:J+="[D,"+M0+"]";break;case 12:J+="["+_e+",PC]",$0++;break;case 13:J+="["+Pe+",PC]",$0+=2;break;case 14:J+="???";break;case 15:J+="[$"+J0(g*256+s)+"]",$0+=2;break}else switch(Le){case 0:J+=","+M0+"+";break;case 1:J+=","+M0+"++";break;case 2:J+=",-"+M0;break;case 3:J+=",--"+M0;break;case 4:J+=","+M0;break;case 5:J+="B,"+M0;break;case 6:J+="A,"+M0;break;case 7:J+="???";break;case 8:J+=_e+","+M0,$0++;break;case 9:J+=Pe+","+M0,$0+=2;break;case 10:J+="???";break;case 11:J+="D,"+M0;break;case 12:J+=_e+",PC",$0++;break;case 13:J+=Pe+",PC",$0+=2;break;case 14:J+="???";break;case 15:J+="$"+J0(g*256+s),$0+=2;break}break;case 7:J+=" $"+J0(n*256+g);break;case 8:J+=" #$"+J0(n*256+g);break;case 10:for(L0=["PC","U","Y","X","DP","B","A","CC"],re=[],q0=0;q0<8;q0++)(n&1)!=0&&re.push(L0[7-q0]),n>>=1;J+=" "+re.join(",");break;case 11:for(L0=["PC","S","Y","X","DP","B","A","CC"],re=[],q0=0;q0<8;q0++)(n&1)!=0&&re.push(L0[7-q0]),n>>=1;J+=" "+re.join(",");break;case 20:L0=["D","X","Y","U","S","PC","?","?","A","B","CC","DP","?","?","?","?"],J+=" "+L0[n>>4]+","+L0[n&15];break}return{line:J,nbytes:$0}};return{steps:function(u){for(;u>0;)u-=j0()},runFrame:function(u){for(;V>g;s===0?u+=n[g].toLowerCase():u+=n[g]}return u},disasm:D,isStable:function(){return!0}}}var st=function(){var h=this;this.powerOn=function(){this.reset()},this.powerOff=function(){},this.clockPulse=function(){!r||(G++,A[G]())},this.connectBus=function(l){e=l},this.setRDY=function(l){r=l},this.isRDY=function(){return r},this.reset=function(){p=1,G=-1,A=[K],c=e.read(V)|e.read(V+1)<<8,this.setRDY(!0)};var e,r=!1,c=0,m=0,o=0,d=0,x=0,a=0,W=0,y=0,p=0,N=0,k=0,G=-1,u0=-1,A,B=0,I=0,F=0,z=!1,i=0,f=0,g0=0;let T0=65530,V=65532,D0=65534,_=0,v=1,Y0=7,t0=6,q=1,V0=0;this.debug=!1,this.trace=!1;var K=function(){u0=e.read(c),A=t[u0],G=0,c++},U=K,A0=function(){e.read(c)},x0=function(){f=e.read(c),c++},L=function(){I=e.read(c),c++},X0=function(){I|=e.read(c)<<8,c++},W0=function(){I=e.read(F)},F0=function(){I|=e.read(F)<<8},w0=function(){F=e.read(c),c++},Q=function(){F|=e.read(c)<<8,c++},l0=function(){F=e.read(i)},O0=function(){F|=e.read(i)<<8},b0=function(){var l=(F&255)+d;z=l>255,F=F&65280|l&255},R0=function(){var l=(F&255)+x;z=l>255,F=F&65280|l&255},z0=function(){var l=(F&255)+1;z=l>255,F=F&65280|l&255},E0=function(){z&&(F=F+256&65535)},U0=function(){i=e.read(c),c++},p0=function(){i|=e.read(c)<<8,c++},c0=function(){var l=(i&255)+1;i=i&65280|l&255},i0=function(){B=e.read(c),c++},Z=function(){B=e.read(I)},w=function(){B=e.read(F)},T=function(){e.write(I,B)},f0=function(){e.write(F,B)},M=function(){var l=c&255,C=l+f&255;f>127?g0=C>l?-256:0:g0=C>>7,W=l>>>6&1,y=l>>>3&1,p=l>>>2&1,N=l>>>1&1,k=l&1},Y=function(l){h.debug&&h.breakpoint("Illegal Opcode: "+l)},e0=function(l){return[K,A0,function(){l(),U()}]},s0=function(l){return[K,i0,function(){l(),U()}]},P0=function(l){return[K,L,Z,function(){l(),U()}]},B0=function(l){return[K,L,X0,Z,function(){l(),U()}]},H0=function(l){return[K,w0,w,function(){b0(),W0()},function(){z0(),F0()},Z,function(){l(),U()}]},o0=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,Q,function(){C(),w(),E0()},function(){z?w():(j(),U())},function(){j(),U()}]}},d0=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,w,function(){C(),w()},function(){j(),U()}]}},Z0=function(l){return[K,U0,l0,function(){c0(),O0()},function(){R0(),w(),E0()},function(){z?w():(l(),U())},function(){l(),U()}]},k0=function(l){return[K,L,function(){l(),T()},U]},K0=function(l){return[K,L,X0,function(){l(),T()},U]},X=function(l){return[K,w0,w,function(){b0(),W0()},function(){z0(),F0()},function(){l(),T()},U]},j0=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,Q,function(){C(),w(),E0()},function(){j(),f0()},U]}},Q0=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,w,function(){C(),j(),f0()},U]}},ee=function(l){return[K,U0,l0,function(){c0(),O0()},function(){R0(),w(),E0()},function(){l(),f0()},U]},S=function(l){return[K,L,Z,T,function(){l(),T()},U]},R=function(l){return[K,L,X0,Z,T,function(){l(),T()},U]},D=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,w,function(){C(),w()},f0,function(){j(),f0()},U]}},u=function(l){var C=l===_?b0:R0;return function(j){return[K,w0,Q,function(){C(),w(),E0()},w,f0,function(){j(),f0()},U]}},n=function(l){return[K,w0,w,function(){b0(),W0()},function(){z0(),F0()},Z,T,function(){l(),T()},U]},g=function(l){return[K,U0,l0,function(){c0(),O0()},function(){R0(),w(),E0()},w,f0,function(){l(),f0()},U]},s=new Array(256),t=new Array(256);s[0]="BRK",t[0]=Qt(),s[1]="ORA",t[1]=oe(H0),s[2]="uKIL",t[2]=G0(),s[3]="uSLO",t[3]=Se(n),s[4]="uNOP",t[4]=v0(P0),s[5]="ORA",t[5]=oe(P0),s[6]="ASL",t[6]=Oe(S),s[7]="uSLO",t[7]=Se(S),s[8]="PHP",t[8]=jt(),s[9]="ORA",t[9]=oe(s0),s[10]="ASL",t[10]=b(),s[11]="uANC",t[11]=ut(s0),s[12]="uNOP",t[12]=v0(B0),s[13]="ORA",t[13]=oe(B0),s[14]="ASL",t[14]=Oe(R),s[15]="uSLO",t[15]=Se(R),s[16]="BPL",t[16]=xe(Y0,0),s[17]="ORA",t[17]=oe(Z0),s[18]="uKIL",t[18]=G0(),s[19]="uSLO",t[19]=Se(g),s[20]="uNOP",t[20]=v0(d0(_)),s[21]="ORA",t[21]=oe(d0(_)),s[22]="ASL",t[22]=Oe(D(_)),s[23]="uSLO",t[23]=Se(D(_)),s[24]="CLC",t[24]=P(),s[25]="ORA",t[25]=oe(o0(v)),s[26]="uNOP",t[26]=v0(e0),s[27]="uSLO",t[27]=Se(u(v)),s[28]="uNOP",t[28]=v0(o0(_)),s[29]="ORA",t[29]=oe(o0(_)),s[30]="ASL",t[30]=Oe(u(_)),s[31]="uSLO",t[31]=Se(u(_)),s[32]="JSR",t[32]=Gt(),s[33]="AND",t[33]=ie(H0),s[34]="uKIL",t[34]=G0(),s[35]="uRLA",t[35]=Ae(n),s[36]="BIT",t[36]=xt(P0),s[37]="AND",t[37]=ie(P0),s[38]="ROL",t[38]=Te(S),s[39]="uRLA",t[39]=Ae(S),s[40]="PLP",t[40]=Jt(),s[41]="AND",t[41]=ie(s0),s[42]="ROL",t[42]=me(),s[43]="uANC",t[43]=ut(s0),s[44]="BIT",t[44]=xt(B0),s[45]="AND",t[45]=ie(B0),s[46]="ROL",t[46]=Te(R),s[47]="uRLA",t[47]=Ae(R),s[48]="BMI",t[48]=xe(Y0,1),s[49]="AND",t[49]=ie(Z0),s[50]="uKIL",t[50]=G0(),s[51]="uRLA",t[51]=Ae(g),s[52]="uNOP",t[52]=v0(d0(_)),s[53]="AND",t[53]=ie(d0(_)),s[54]="ROL",t[54]=Te(D(_)),s[55]="uRLA",t[55]=Ae(D(_)),s[56]="SEC",t[56]=pe(),s[57]="AND",t[57]=ie(o0(v)),s[58]="uNOP",t[58]=v0(e0),s[59]="uRLA",t[59]=Ae(u(v)),s[60]="uNOP",t[60]=v0(o0(_)),s[61]="AND",t[61]=ie(o0(_)),s[62]="ROL",t[62]=Te(u(_)),s[63]="uRLA",t[63]=Ae(u(_)),s[64]="RTI",t[64]=tn(),s[65]="EOR",t[65]=ce(H0),s[66]="uKIL",t[66]=G0(),s[67]="uSRE",t[67]=ve(n),s[68]="uNOP",t[68]=v0(P0),s[69]="EOR",t[69]=ce(P0),s[70]="LSR",t[70]=Me(S),s[71]="uSRE",t[71]=ve(S),s[72]="PHA",t[72]=Kt(),s[73]="EOR",t[73]=ce(s0),s[74]="LSR",t[74]=je(),s[75]="uASR",t[75]=Ut(s0),s[76]="JMP",t[76]=rn(),s[77]="EOR",t[77]=ce(B0),s[78]="LSR",t[78]=Me(R),s[79]="uSRE",t[79]=ve(R),s[80]="BVC",t[80]=xe(t0,0),s[81]="EOR",t[81]=ce(Z0),s[82]="uKIL",t[82]=G0(),s[83]="uSRE",t[83]=ve(g),s[84]="uNOP",t[84]=v0(d0(_)),s[85]="EOR",t[85]=ce(d0(_)),s[86]="LSR",t[86]=Me(D(_)),s[87]="uSRE",t[87]=ve(D(_)),s[88]="CLI",t[88]=J0(),s[89]="EOR",t[89]=ce(o0(v)),s[90]="uNOP",t[90]=v0(e0),s[91]="uSRE",t[91]=ve(u(v)),s[92]="uNOP",t[92]=v0(o0(_)),s[93]="EOR",t[93]=ce(o0(_)),s[94]="LSR",t[94]=Me(u(_)),s[95]="uSRE",t[95]=ve(u(_)),s[96]="RTS",t[96]=nn(),s[97]="ADC",t[97]=ae(H0),s[98]="uKIL",t[98]=G0(),s[99]="uRRA",t[99]=Ce(n),s[100]="uNOP",t[100]=v0(P0),s[101]="ADC",t[101]=ae(P0),s[102]="ROR",t[102]=Fe(S),s[103]="uRRA",t[103]=Ce(S),s[104]="PLA",t[104]=$t(),s[105]="ADC",t[105]=ae(s0),s[106]="ROR",t[106]=M0(),s[107]="uARR",t[107]=Ft(s0),s[108]="JMP",t[108]=an(),s[109]="ADC",t[109]=ae(B0),s[110]="ROR",t[110]=Fe(R),s[111]="uRRA",t[111]=Ce(R),s[112]="BVS",t[112]=xe(t0,1),s[113]="ADC",t[113]=ae(Z0),s[114]="uKIL",t[114]=G0(),s[115]="uRRA",t[115]=Ce(g),s[116]="uNOP",t[116]=v0(d0(_)),s[117]="ADC",t[117]=ae(d0(_)),s[118]="ROR",t[118]=Fe(D(_)),s[119]="uRRA",t[119]=Ce(D(_)),s[120]="SEI",t[120]=Le(),s[121]="ADC",t[121]=ae(o0(v)),s[122]="uNOP",t[122]=v0(e0),s[123]="uRRA",t[123]=Ce(u(v)),s[124]="uNOP",t[124]=v0(o0(_)),s[125]="ADC",t[125]=ae(o0(_)),s[126]="ROR",t[126]=Fe(u(_)),s[127]="uRRA",t[127]=Ce(u(_)),s[128]="uNOP",t[128]=v0(s0),s[129]="STA",t[129]=be(X),s[130]="uNOP",t[130]=v0(s0),s[131]="uSAX",t[131]=Ie(X),s[132]="STY",t[132]=et(k0),s[133]="STA",t[133]=be(k0),s[134]="STX",t[134]=qe(k0),s[135]="uSAX",t[135]=Ie(k0),s[136]="DEY",t[136]=q0(),s[137]="uNOP",t[137]=v0(s0),s[138]="TXA",t[138]=Je(),s[139]="uANE",t[139]=Tt(s0),s[140]="STY",t[140]=et(K0),s[141]="STA",t[141]=be(K0),s[142]="STX",t[142]=qe(K0),s[143]="uSAX",t[143]=Ie(K0),s[144]="BCC",t[144]=xe(V0,0),s[145]="STA",t[145]=be(ee),s[146]="uKIL",t[146]=G0(),s[147]="uSHA",t[147]=mt(ee),s[148]="STY",t[148]=et(Q0(_)),s[149]="STA",t[149]=be(Q0(_)),s[150]="STX",t[150]=qe(Q0(v)),s[151]="uSAX",t[151]=Ie(Q0(v)),s[152]="TYA",t[152]=Mt(),s[153]="STA",t[153]=be(j0(v)),s[154]="TXS",t[154]=ke(),s[155]="uSHS",t[155]=Yt(j0(v)),s[156]="uSHY",t[156]=zt(j0(_)),s[157]="STA",t[157]=be(j0(_)),s[158]="uSHX",t[158]=Wt(j0(v)),s[159]="uSHA",t[159]=mt(j0(v)),s[160]="LDY",t[160]=Re(s0),s[161]="LDA",t[161]=se(H0),s[162]="LDX",t[162]=Be(s0),s[163]="uLAX",t[163]=we(H0),s[164]="LDY",t[164]=Re(P0),s[165]="LDA",t[165]=se(P0),s[166]="LDX",t[166]=Be(P0),s[167]="uLAX",t[167]=we(P0),s[168]="TAY",t[168]=Pe(),s[169]="LDA",t[169]=se(s0),s[170]="TAX",t[170]=_e(),s[171]="uLXA",t[171]=Ht(s0),s[172]="LDY",t[172]=Re(B0),s[173]="LDA",t[173]=se(B0),s[174]="LDX",t[174]=Be(B0),s[175]="uLAX",t[175]=we(B0),s[176]="BCS",t[176]=xe(V0,1),s[177]="LDA",t[177]=se(Z0),s[178]="uKIL",t[178]=G0(),s[179]="uLAX",t[179]=we(Z0),s[180]="LDY",t[180]=Re(d0(_)),s[181]="LDA",t[181]=se(d0(_)),s[182]="LDX",t[182]=Be(d0(v)),s[183]="uLAX",t[183]=we(d0(v)),s[184]="CLV",t[184]=L0(),s[185]="LDA",t[185]=se(o0(v)),s[186]="TSX",t[186]=le(),s[187]="uLAS",t[187]=Xt(o0(v)),s[188]="LDY",t[188]=Re(o0(_)),s[189]="LDA",t[189]=se(o0(_)),s[190]="LDX",t[190]=Be(o0(v)),s[191]="uLAX",t[191]=we(o0(v)),s[192]="CPY",t[192]=Qe(s0),s[193]="CMP",t[193]=fe(H0),s[194]="uNOP",t[194]=v0(s0),s[195]="uDCP",t[195]=de(n),s[196]="CPY",t[196]=Qe(P0),s[197]="CMP",t[197]=fe(P0),s[198]="DEC",t[198]=Ee(S),s[199]="uDCP",t[199]=de(S),s[200]="INY",t[200]=$0(),s[201]="CMP",t[201]=fe(s0),s[202]="DEX",t[202]=re(),s[203]="uSBX",t[203]=Vt(s0),s[204]="CPY",t[204]=Qe(B0),s[205]="CMP",t[205]=fe(B0),s[206]="DEC",t[206]=Ee(R),s[207]="uDCP",t[207]=de(R),s[208]="BNE",t[208]=xe(q,0),s[209]="CMP",t[209]=fe(Z0),s[210]="uKIL",t[210]=G0(),s[211]="uDCP",t[211]=de(g),s[212]="uNOP",t[212]=v0(d0(_)),s[213]="CMP",t[213]=fe(d0(_)),s[214]="DEC",t[214]=Ee(D(_)),s[215]="uDCP",t[215]=de(D(_)),s[216]="CLD",t[216]=y0(),s[217]="CMP",t[217]=fe(o0(v)),s[218]="uNOP",t[218]=v0(e0),s[219]="uDCP",t[219]=de(u(v)),s[220]="uNOP",t[220]=v0(o0(_)),s[221]="CMP",t[221]=fe(o0(_)),s[222]="DEC",t[222]=Ee(u(_)),s[223]="uDCP",t[223]=de(u(_)),s[224]="CPX",t[224]=Ge(s0),s[225]="SBC",t[225]=ne(H0),s[226]="uNOP",t[226]=v0(s0),s[227]="uISB",t[227]=he(n),s[228]="CPX",t[228]=Ge(P0),s[229]="SBC",t[229]=ne(P0),s[230]="INC",t[230]=Ze(S),s[231]="uISB",t[231]=he(S),s[232]="INX",t[232]=te(),s[233]="SBC",t[233]=ne(s0),s[234]="NOP",t[234]=J(),s[235]="SBC",t[235]=ne(s0),s[236]="CPX",t[236]=Ge(B0),s[237]="SBC",t[237]=ne(B0),s[238]="INC",t[238]=Ze(R),s[239]="uISB",t[239]=he(R),s[240]="BEQ",t[240]=xe(q,1),s[241]="SBC",t[241]=ne(Z0),s[242]="uKIL",t[242]=G0(),s[243]="uISB",t[243]=he(g),s[244]="uNOP",t[244]=v0(d0(_)),s[245]="SBC",t[245]=ne(d0(_)),s[246]="INC",t[246]=Ze(D(_)),s[247]="uISB",t[247]=he(D(_)),s[248]="SED",t[248]=$e(),s[249]="SBC",t[249]=ne(o0(v)),s[250]="uNOP",t[250]=v0(e0),s[251]="uISB",t[251]=he(u(v)),s[252]="uNOP",t[252]=v0(o0(_)),s[253]="SBC",t[253]=ne(o0(_)),s[254]="INC",t[254]=Ze(u(_)),s[255]="uISB",t[255]=he(u(_));function b(){return e0(function(){H(o>127),o=o<<1&255,O(o),E(o)})}function P(){return e0(function(){k=0})}function y0(){return e0(function(){y=0})}function J0(){return e0(function(){p=0})}function L0(){return e0(function(){W=0})}function re(){return e0(function(){d=d-1&255,O(d),E(d)})}function q0(){return e0(function(){x=x-1&255,O(x),E(x)})}function te(){return e0(function(){d=d+1&255,O(d),E(d)})}function $0(){return e0(function(){x=x+1&255,O(x),E(x)})}function je(){return e0(function(){k=o&1,o>>>=1,O(o),a=0})}function J(){return e0(function(){})}function me(){return e0(function(){var l=o>127;o=(o<<1|k)&255,H(l),O(o),E(o)})}function M0(){return e0(function(){var l=o&1;o=o>>>1|k<<7,H(l),O(o),E(o)})}function pe(){return e0(function(){k=1})}function $e(){return e0(function(){y=1})}function Le(){return e0(function(){p=1})}function _e(){return e0(function(){d=o,O(d),E(d)})}function Pe(){return e0(function(){x=o,O(x),E(x)})}function le(){return e0(function(){d=m,O(d),E(d)})}function Je(){return e0(function(){o=d,O(o),E(o)})}function ke(){return e0(function(){m=d})}function Mt(){return e0(function(){o=x,O(o),E(o)})}function G0(){return[K,function(){Y("KIL/HLT/JAM")},function(){G--}]}function v0(l){return l(function(){Y("NOP/DOP")})}function ae(l){return l(function(){if(y){var C=B,j=(o&15)+(C&15)+k;j>9&&(j+=6);var S0=(o>>4)+(C>>4)+(j>15?1:0)<<4;O(o+C+k&255),E(S0),_0((o^S0)&~(o^C)&128),S0>159&&(S0+=96),H(S0>255),o=(S0|j&15)&255}else{var h0=o+B+k;H(h0>255),_0((o^h0)&(B^h0)&128),o=h0&255,O(o),E(o)}})}function ie(l){return l(function(){o&=B,O(o),E(o)})}function xt(l){return l(function(){var C=B;O(o&C),_0(C&64),E(C)})}function fe(l){return l(function(){var C=o-B&255;H(o>=B),O(C),E(C)})}function Ge(l){return l(function(){var C=d-B&255;H(d>=B),O(C),E(C)})}function Qe(l){return l(function(){var C=x-B&255;H(x>=B),O(C),E(C)})}function ce(l){return l(function(){o^=B,O(o),E(o)})}function se(l){return l(function(){o=B,O(o),E(o)})}function Be(l){return l(function(){d=B,O(d),E(d)})}function Re(l){return l(function(){x=B,O(x),E(x)})}function oe(l){return l(function(){o|=B,O(o),E(o)})}function ne(l){return l(function(){if(y){var C=B,j=(o&15)-(C&15)-(1-k),S0=(o>>4)-(C>>4)-(j<0?1:0);j<0&&(j-=6),S0<0&&(S0-=6);var h0=o-C-(1-k);H(~h0&256),_0((o^C)&(o^h0)&128),O(h0&255),E(h0),o=(S0<<4|j&15)&255}else C=~B&255,h0=o+C+k,H(h0>255),_0((o^h0)&(C^h0)&128),o=h0&255,O(o),E(o)})}function ut(l){return l(function(){Y("ANC"),o&=B,O(o),a=k=o&128?1:0})}function Tt(l){return l(function(){Y("ANE")})}function Ft(l){return l(function(){Y("ARR");var C=o&B,j=k?128:0;C=C>>>1|j,o=C,O(C),E(C);var S0=o&96;S0==96?(k=1,W=0):S0==0?(k=0,W=0):S0==32?(k=0,W=1):S0==64&&(k=1,W=1)})}function Ut(l){return l(function(){Y("ASR");var C=o&B;k=C&1,C=C>>>1,o=C,O(C),a=0})}function Xt(l){return l(function(){Y("LAS");var C=m&B;o=C,d=C,m=C,O(C),E(C)})}function we(l){return l(function(){Y("LAX");var C=B;o=C,d=C,O(C),E(C)})}function Ht(l){return l(function(){Y("LXA");var C=o&B;o=C,d=C,O(C),E(C)})}function Vt(l){return l(function(){Y("SBX");var C=o&d,j=B,S0=C-j&255;d=S0,H(C>=j),O(S0),E(S0)})}function be(l){return l(function(){B=o})}function qe(l){return l(function(){B=d})}function et(l){return l(function(){B=x})}function Ie(l){return l(function(){Y("SAX"),B=o&d})}function mt(l){return l(function(){Y("SHA"),B=o&d&(F>>>8)+1&255})}function Yt(l){return l(function(){Y("SHS");var C=o&d;m=C,B=C&(F>>>8)+1&255})}function Wt(l){return l(function(){Y("SHX"),B=d&(F>>>8)+1&255})}function zt(l){return l(function(){Y("SHY"),B=x&(F>>>8)+1&255})}function Oe(l){return l(function(){H(B>127);var C=B<<1&255;B=C,O(C),E(C)})}function Ee(l){return l(function(){var C=B-1&255;B=C,O(C),E(C)})}function Ze(l){return l(function(){var C=B+1&255;B=C,O(C),E(C)})}function Me(l){return l(function(){k=B&1,B>>>=1,O(B),a=0})}function Te(l){return l(function(){var C=B>127,j=(B<<1|k)&255;B=j,H(C),O(j),E(j)})}function Fe(l){return l(function(){var C=B&1,j=B>>>1|k<<7;B=j,H(C),O(j),E(j)})}function de(l){return l(function(){Y("DCP");var C=B-1&255;B=C,C=o-C,H(C>=0),O(C),E(C)})}function he(l){return l(function(){if(Y("ISB"),B=B+1&255,y){var C=B,j=(o&15)-(C&15)-(1-k),S0=(o>>4)-(C>>4)-(j<0?1:0);j<0&&(j-=6),S0<0&&(S0-=6);var h0=o-C-(1-k);H(~h0&256),_0((o^C)&(o^h0)&128),O(h0&255),E(h0),o=(S0<<4|j&15)&255}else C=~B&255,h0=o+C+k,H(h0>255),_0((o^h0)&(C^h0)&128),o=h0&255,O(o),E(o)})}function Ae(l){return l(function(){Y("RLA");var C=B,j=k;H(C&128),C=(C<<1|j)&255,B=C,o&=C,O(C),E(C)})}function Ce(l){return l(function(){Y("RRA");var C=B,j=k?128:0;if(H(C&1),C=C>>>1|j,B=C,y){var S0=B,h0=(o&15)+(S0&15)+k;h0>9&&(h0+=6);var De=(o>>4)+(S0>>4)+(h0>15?1:0)<<4;O(o+S0+k&255),E(De),_0((o^De)&~(o^S0)&128),De>159&&(De+=96),H(De>255),o=(De|h0&15)&255}else{var Ue=o+B+k;H(Ue>255),_0((o^Ue)&(B^Ue)&128),o=Ue&255,O(o),E(o)}})}function Se(l){return l(function(){Y("SLO");var C=B;H(C&128),C=C<<1&255,B=C,C=o|C,o=C,O(C),E(C)})}function ve(l){return l(function(){Y("SRE");var C=B;H(C&1),C=C>>>1,B=C,C=(o^C)&255,o=C,O(C),E(C)})}function Kt(){return[K,A0,function(){$(o)},U]}function jt(){return[K,A0,function(){$(m0())},U]}function $t(){return[K,A0,C0,function(){o=r0(),O(o),E(o)},U]}function Jt(){return[K,A0,C0,function(){N0(r0())},U]}function Gt(){return[K,L,C0,function(){$(c>>>8&255)},function(){$(c&255)},X0,function(){c=I,U()}]}function Qt(){return[K,i0,function(){h.debug&&h.breakpoint("BRK "+B),$(c>>>8&255)},function(){$(c&255)},function(){$(m0())},function(){I=e.read(D0)},function(){I|=e.read(D0+1)<<8},function(){c=I,p=1,U()}]}function qt(){return[K,i0,function(){h.debug&&h.breakpoint("IRQ "+B),$(c>>>8&255)},function(){$(c&255)},function(){$(m0()&~16)},function(){I=e.read(D0)},function(){I|=e.read(D0+1)<<8},function(){c=I,U()}]}function en(){return[K,i0,function(){h.debug&&h.breakpoint("NMI "+B),$(c>>>8&255)},function(){$(c&255)},function(){$(m0()&~16)},function(){I=e.read(T0)},function(){I|=e.read(T0+1)<<8},function(){c=I,U()}]}function tn(){return[K,A0,C0,function(){N0(r0())},function(){I=r0()},function(){I|=r0()<<8},function(){c=I,U()}]}function nn(){return[K,A0,C0,function(){I=r0()},function(){I|=r0()<<8},function(){c=I,i0()},U]}function rn(){return[K,L,X0,function(){c=I,U()}]}function an(){return[K,U0,p0,l0,function(){c0(),O0()},function(){c=F,U()}]}function xe(l,C){var j;return l===q?j=function(){return N===C}:l===Y0?j=function(){return a===C}:l===V0?j=function(){return k===C}:j=function(){return W===C},[K,x0,function(){j()?(A0(),M()):U()},function(){g0?(A0(),n0()):U()},U]}this.saveState=function(){return{PC:c-1&65535,A:o,X:d,Y:x,SP:m,N:a,V:W,D:y,I:p,Z:N,C:k,T:G,o:u0,R:r?1:0,d:B,AD:I,BA:F,BC:z?1:0,IA:i,bo:f,boa:g0}},this.loadState=function(l){c=l.PC+1&65535,o=l.A,d=l.X,x=l.Y,m=l.SP,a=l.N,W=l.V,y=l.D,p=l.I,N=l.Z,k=l.C,G=l.T,u0=l.o,r=!!l.R,B=l.d,I=l.AD,F=l.BA,z=!!l.BC,i=l.IA,f=l.bo,g0=l.boa,A=u0<0?[K]:t[u0]},this.toString=function(){return"CPU PC: "+c.toString(16)+" op: "+u0.toString()+" T: "+G+" data: "+B+` A: `+o.toString(16)+" X: "+d.toString(16)+" Y: "+x.toString(16)+" SP: "+m.toString(16)+" N"+a+" V"+W+" D"+y+" I"+p+" Z"+N+" C"+k+" "},this.breakpoint=function(l){if(this.trace)var C="CPU Breakpoint! "+(l?"("+l+")":"")+` -`+this.toString()};var lt=[7,6,0,8,3,3,5,5,3,2,2,2,4,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,6,6,0,8,3,3,5,5,4,2,2,2,4,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,6,6,0,8,3,3,5,5,3,2,2,2,3,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,6,6,0,8,3,3,5,5,4,2,2,2,5,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,0,6,0,6,3,3,3,3,2,0,2,0,4,4,4,4,2,6,0,0,4,4,4,4,2,5,2,0,0,5,0,0,2,6,2,6,3,3,3,3,2,2,2,0,4,4,4,4,2,5,0,5,4,4,4,4,2,4,2,0,4,4,4,4,2,6,0,8,3,3,5,5,2,2,2,2,4,4,3,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,2,6,0,8,3,3,5,5,2,2,2,0,4,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7],fn=[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1],cn=[1,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,3,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,1,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,1,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,0,2,0,2,2,2,2,2,1,0,1,0,3,3,3,3,2,2,0,0,2,2,2,3,1,3,1,0,0,3,0,0,2,2,2,2,2,2,2,2,1,2,1,0,3,3,3,3,2,2,0,2,2,2,2,2,1,3,1,0,3,3,3,3,2,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,2,2,0,2,2,2,2,2,1,2,1,0,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3],Ln=[1,2,0,0,0,2,2,0,1,2,1,0,0,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,3,2,0,0,2,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,1,2,0,0,0,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,1,2,0,0,0,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,0,2,0,0,2,2,2,0,1,0,1,0,3,3,3,0,2,2,0,0,2,2,2,0,1,3,1,0,0,3,0,0,2,2,2,0,2,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,2,2,2,0,1,3,1,0,3,3,3,0,2,2,0,0,2,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,2,2,0,0,2,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0];this.getOpcodeMetadata=function(l,C){return{opcode:l,mnenomic:s[l],minCycles:lt[l],maxCycles:lt[l]+fn[l],insnlength:cn[l]}},this.setNMI=function(){A=en(),G=1,c=c-1&65535},this.setIRQ=function(){p||(A=qt(),G=1,c=c-1&65535)},this.getSP=function(){return m},this.getPC=function(){return c-1&65535},this.getT=function(){return G},this.isHalted=function(){return s[u0]=="uKIL"},this.isPCStable=function(){return G==0}},ue;(function(c){c[c.None=0]="None",c[c.NMI=1]="NMI",c[c.IRQ=2]="IRQ"})(ue||(ue={}));var hn=class{constructor(){this.cpu=new st;this.interruptType=0}connectMemoryBus(e){this.cpu.connectBus(e)}advanceClock(){if(this.interruptType&&this.isStable()){switch(this.interruptType){case 1:this.cpu.setNMI();break;case 2:this.cpu.setIRQ();break}this.interruptType=0}this.cpu.clockPulse()}advanceInsn(){do this.advanceClock();while(!this.isStable())}reset(){this.cpu.reset(),this.interruptType=0}interrupt(e){this.interruptType!=1&&(this.interruptType=e)}NMI(){this.interrupt(1)}IRQ(){this.interrupt(2)}getSP(){return this.cpu.getSP()}getPC(){return this.cpu.getPC()}isHalted(){return this.cpu.isHalted()}saveState(){var e=this.cpu.saveState();return e.it=this.interruptType,e}loadState(e){this.cpu.loadState(e),this.interruptType=e.it}isStable(){return this.cpu.isPCStable()}};var An=class{constructor(e,r){this.symbolmap=e,this.debuginfo=r,this.addr2symbol=bt(e),this.addr2symbol[0]||(this.addr2symbol[0]="$00"),this.addr2symbol[65536]="__END__"}};function ge(h){return h&&typeof h.getDebugCategories=="function"}var wt=class{constructor(){this.id2bp={}}getDebugCondition(){return Object.keys(this.id2bp).length==0?null:()=>{var e=!1;for(var r in this.id2bp)this.id2bp[r].cond()&&(e=!0);return e}}},Dt=class{constructor(){this.recorder=null;this.internalFiles={}}setRecorder(e){this.recorder=e}updateRecorder(){this.recorder&&this.isRunning()&&this.recorder.frameRequested()&&this.recorder.recordFrame(this.saveState())}inspect(e){return Cn(this,e)}getDebugTree(){var r;var e={};return e.state=this.saveState(),((r=this.debugSymbols)==null?void 0:r.debuginfo)&&(e.debuginfo=this.debugSymbols.debuginfo),e}readFile(e){return this.internalFiles[e]}writeFile(e,r){return this.internalFiles[e]=r,!0}},We=class extends Dt{constructor(){super(...arguments);this.debugSavedState=null;this.debugBreakState=null;this.debugTargetClock=0;this.debugClock=0;this.breakpoints=new wt;this.frameCount=0}setBreakpoint(e,r){r?(this.breakpoints.id2bp[e]={cond:r},this.restartDebugging()):this.clearBreakpoint(e)}clearBreakpoint(e){delete this.breakpoints.id2bp[e]}hasBreakpoint(e){return this.breakpoints.id2bp[e]!=null}getDebugCallback(){return this.breakpoints.getDebugCondition()}setupDebug(e){this.onBreakpointHit=e}clearDebug(){this.debugBreakState!=null&&this.loadState(this.debugSavedState),this.debugSavedState=null,this.debugBreakState=null,this.debugTargetClock=-1,this.debugClock=0,this.onBreakpointHit=null,this.clearBreakpoint("debug"),this.frameCount=0}setDebugCondition(e){this.setBreakpoint("debug",e)}resetDebugging(){this.debugSavedState?this.loadState(this.debugSavedState):this.debugSavedState=this.saveState(),this.debugClock=0,this.debugCallback=this.getDebugCallback(),this.debugBreakState=null}restartDebugging(){this.resetDebugging(),this.resume()}preFrame(){this.debugCallback&&!this.debugBreakState&&(this.debugSavedState=this.saveState(),this.debugTargetClock-=this.debugClock,this.debugClock=0)}postFrame(){this.debugCallback&&this.debugBreakState&&this.loadState(this.debugBreakState),this.frameCount++}pollControls(){}nextFrame(e){this.pollControls(),this.updateRecorder(),this.preFrame();var r=this.advance(e);return this.postFrame(),r}evalDebugCondition(){this.debugCallback&&!this.debugBreakState&&this.debugCallback()}wasBreakpointHit(){return this.debugBreakState!=null}breakpointHit(e,r){console.log(this.debugTargetClock,e,this.debugClock,this.isStable()),this.debugTargetClock=e,this.debugBreakState=this.saveState(),console.log("Breakpoint at clk",this.debugClock,"PC",this.debugBreakState.c.PC.toString(16)),this.pause(),this.onBreakpointHit&&this.onBreakpointHit(this.debugBreakState,r)}haltAndCatchFire(e){this.breakpointHit(this.debugClock,e)}runEval(e){this.setDebugCondition(()=>{if(++this.debugClock>=this.debugTargetClock&&this.isStable()){var r=this.getCPUState();return e(r)?(this.breakpointHit(this.debugClock),!0):!1}})}runToPC(e){this.debugTargetClock++,this.runEval(r=>r.PC==e)}runUntilReturn(){var e=this.getSP();this.runEval(r=>r.SP>e)}runToFrameClock(e){this.restartDebugging(),this.debugTargetClock=e,this.runEval(()=>!0)}step(){this.runToFrameClock(this.debugClock+1)}stepBack(){var e,r,c=this.debugTargetClock;this.restartDebugging(),this.debugTargetClock=c-25,this.runEval(m=>this.debugClockthis.frameCount>e)}};function Cn(h,e){if(!!h.debugSymbols){var r=h.debugSymbols.symbolmap,c=h.debugSymbols.addr2symbol;if(!r||!h.readAddress)return null;var m=r["_"+e]||r[e];if(typeof m!="number")return null;var o=h.readAddress(m);if(c&&c[m+1]!=null)return"$"+a0(m,4)+" = $"+a0(o,2)+" ("+o+" decimal)";{let d=h.readAddress(m+1),x=o|d<<8;return"$"+a0(m,4)+" = $"+a0(o,2)+" $"+a0(d,2)+" ("+(x<<16>>16)+" decimal)"}}}function Bt(h){return h.endsWith("-llvm.c")?"remote:llvm-mos":h.endsWith(".c")||h.endsWith(".h")?"cc65":h.endsWith(".s")||h.endsWith(".ca65")?"ca65":h.endsWith(".dasm")?"dasm":h.endsWith(".acme")?"acme":h.endsWith(".wiz")?"wiz":h.endsWith(".ecs")?"ecs":"dasm"}var Sn=class extends We{constructor(){super(...arguments);this.debugPCDelta=-1;this.getToolForFilename=Bt}fixPC(e){return e.PC=e.PC+this.debugPCDelta&65535,e}unfixPC(e){return e.PC=e.PC-this.debugPCDelta&65535,e}getSP(){return this.getCPUState().SP}getPC(){return this.getCPUState().PC}isStable(){return!this.getCPUState().T}newCPU(e){var r=new st;return r.connectBus(e),r}getOpcodeMetadata(e,r){return Nt(e,r)}getOriginPC(){return(this.readAddress(65532)|this.readAddress(65533)<<8)&65535}disassemble(e,r){return rt(e,r(e),r(e+1),r(e+2))}getDefaultExtension(){return".a"}getDebugCategories(){return["CPU","ZPRAM","Stack"]}getDebugInfo(e,r){switch(e){case"CPU":return Rt(r.c);case"ZPRAM":return nt(r.b||r.ram,0,256);case"Stack":return ye(this,r.b||r.ram,256,511,256+r.c.SP,32)}}};function Rt(h){function e(r){var c="";return c+=r.N?" N":" -",c+=r.V?" V":" -",c+=r.D?" D":" -",c+=r.Z?" Z":" -",c+=r.C?" C":" -",c+=r.I?" I":" -",c}return"PC "+a0(h.PC,4)+" "+e(h)+` +`+this.toString()};var lt=[7,6,0,8,3,3,5,5,3,2,2,2,4,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,6,6,0,8,3,3,5,5,4,2,2,2,4,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,6,6,0,8,3,3,5,5,3,2,2,2,3,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,6,6,0,8,3,3,5,5,4,2,2,2,5,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,0,6,0,6,3,3,3,3,2,0,2,0,4,4,4,4,2,6,0,0,4,4,4,4,2,5,2,0,0,5,0,0,2,6,2,6,3,3,3,3,2,2,2,0,4,4,4,4,2,5,0,5,4,4,4,4,2,4,2,0,4,4,4,4,2,6,0,8,3,3,5,5,2,2,2,2,4,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7,2,6,0,8,3,3,5,5,2,2,2,0,4,4,6,6,2,5,0,8,4,4,6,6,2,4,0,7,4,4,7,7],fn=[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1],cn=[1,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,3,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,1,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,1,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,0,2,0,2,2,2,2,2,1,0,1,0,3,3,3,3,2,2,0,0,2,2,2,3,1,3,1,0,0,3,0,0,2,2,2,2,2,2,2,2,1,2,1,0,3,3,3,3,2,2,0,2,2,2,2,2,1,3,1,0,3,3,3,3,2,2,0,2,2,2,2,2,1,2,1,2,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3,2,2,0,2,2,2,2,2,1,2,1,0,3,3,3,3,2,2,0,2,2,2,2,2,1,3,0,3,3,3,3,3],Ln=[1,2,0,0,0,2,2,0,1,2,1,0,0,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,3,2,0,0,2,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,1,2,0,0,0,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,1,2,0,0,0,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,0,2,0,0,2,2,2,0,1,0,1,0,3,3,3,0,2,2,0,0,2,2,2,0,1,3,1,0,0,3,0,0,2,2,2,0,2,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,2,2,2,0,1,3,1,0,3,3,3,0,2,2,0,0,2,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0,2,2,0,0,2,2,2,0,1,2,1,0,3,3,3,0,2,2,0,0,0,2,2,0,1,3,0,0,0,3,3,0];this.getOpcodeMetadata=function(l,C){return{opcode:l,mnenomic:s[l],minCycles:lt[l],maxCycles:lt[l]+fn[l],insnlength:cn[l]}},this.setNMI=function(){A=en(),G=1,c=c-1&65535},this.setIRQ=function(){p||(A=qt(),G=1,c=c-1&65535)},this.getSP=function(){return m},this.getPC=function(){return c-1&65535},this.getT=function(){return G},this.isHalted=function(){return s[u0]=="uKIL"},this.isPCStable=function(){return G==0}},ue;(function(c){c[c.None=0]="None",c[c.NMI=1]="NMI",c[c.IRQ=2]="IRQ"})(ue||(ue={}));var hn=class{constructor(){this.cpu=new st;this.interruptType=0}connectMemoryBus(e){this.cpu.connectBus(e)}advanceClock(){if(this.interruptType&&this.isStable()){switch(this.interruptType){case 1:this.cpu.setNMI();break;case 2:this.cpu.setIRQ();break}this.interruptType=0}this.cpu.clockPulse()}advanceInsn(){do this.advanceClock();while(!this.isStable())}reset(){this.cpu.reset(),this.interruptType=0}interrupt(e){this.interruptType!=1&&(this.interruptType=e)}NMI(){this.interrupt(1)}IRQ(){this.interrupt(2)}getSP(){return this.cpu.getSP()}getPC(){return this.cpu.getPC()}isHalted(){return this.cpu.isHalted()}saveState(){var e=this.cpu.saveState();return e.it=this.interruptType,e}loadState(e){this.cpu.loadState(e),this.interruptType=e.it}isStable(){return this.cpu.isPCStable()}getOpcodeMetadata(e){return this.cpu.getOpcodeMetadata(e)}};var An=class{constructor(e,r){this.symbolmap=e,this.debuginfo=r,this.addr2symbol=bt(e),this.addr2symbol[0]||(this.addr2symbol[0]="$00"),this.addr2symbol[65536]="__END__"}};function ge(h){return h&&typeof h.getDebugCategories=="function"}var wt=class{constructor(){this.id2bp={}}getDebugCondition(){return Object.keys(this.id2bp).length==0?null:()=>{var e=!1;for(var r in this.id2bp)this.id2bp[r].cond()&&(e=!0);return e}}},Dt=class{constructor(){this.recorder=null;this.internalFiles={}}setRecorder(e){this.recorder=e}updateRecorder(){this.recorder&&this.isRunning()&&this.recorder.frameRequested()&&this.recorder.recordFrame(this.saveState())}inspect(e){return Cn(this,e)}getDebugTree(){var r;var e={};return e.state=this.saveState(),((r=this.debugSymbols)==null?void 0:r.debuginfo)&&(e.debuginfo=this.debugSymbols.debuginfo),e}readFile(e){return this.internalFiles[e]}writeFile(e,r){return this.internalFiles[e]=r,!0}},We=class extends Dt{constructor(){super(...arguments);this.debugSavedState=null;this.debugBreakState=null;this.debugTargetClock=0;this.debugClock=0;this.breakpoints=new wt;this.frameCount=0}setBreakpoint(e,r){r?(this.breakpoints.id2bp[e]={cond:r},this.restartDebugging()):this.clearBreakpoint(e)}clearBreakpoint(e){delete this.breakpoints.id2bp[e]}hasBreakpoint(e){return this.breakpoints.id2bp[e]!=null}getDebugCallback(){return this.breakpoints.getDebugCondition()}setupDebug(e){this.onBreakpointHit=e}clearDebug(){this.debugBreakState!=null&&this.debugSavedState!=null&&this.loadState(this.debugSavedState),this.debugSavedState=null,this.debugBreakState=null,this.debugTargetClock=-1,this.debugClock=0,this.onBreakpointHit=null,this.clearBreakpoint("debug"),this.frameCount=0}setDebugCondition(e){this.setBreakpoint("debug",e)}resetDebugging(){this.debugSavedState?this.loadState(this.debugSavedState):this.debugSavedState=this.saveState(),this.debugClock=0,this.debugCallback=this.getDebugCallback(),this.debugBreakState=null}restartDebugging(){this.resetDebugging(),this.resume()}preFrame(){this.debugCallback&&!this.debugBreakState&&(this.debugSavedState=this.saveState(),this.debugTargetClock-=this.debugClock,this.debugClock=0)}postFrame(){this.debugCallback&&this.debugBreakState&&this.loadState(this.debugBreakState),this.frameCount++}pollControls(){}nextFrame(e){this.pollControls(),this.updateRecorder(),this.preFrame();var r=this.advance(e);return this.postFrame(),r}evalDebugCondition(){this.debugCallback&&!this.debugBreakState&&this.debugCallback()}wasBreakpointHit(){return this.debugBreakState!=null}breakpointHit(e,r){console.log(this.debugTargetClock,e,this.debugClock,this.isStable()),this.debugTargetClock=e,this.debugBreakState=this.saveState(),console.log("Breakpoint at clk",this.debugClock,"PC",this.debugBreakState.c.PC.toString(16)),this.pause(),this.onBreakpointHit&&this.onBreakpointHit(this.debugBreakState,r)}haltAndCatchFire(e){this.breakpointHit(this.debugClock,e)}runEval(e){this.setDebugCondition(()=>{if(++this.debugClock>=this.debugTargetClock&&this.isStable()){var r=this.getCPUState();return e(r)?(this.breakpointHit(this.debugClock),!0):!1}})}runToPC(e){this.debugTargetClock++,this.runEval(r=>r.PC==e)}runUntilReturn(){var e=this.getSP();this.runEval(r=>r.SP>e)}runToFrameClock(e){this.restartDebugging(),this.debugTargetClock=e,this.runEval(()=>!0)}step(){this.runToFrameClock(this.debugClock+1)}stepBack(){var e,r,c=this.debugTargetClock;this.restartDebugging(),this.debugTargetClock=c-25,this.runEval(m=>this.debugClockthis.frameCount>e)}};function Cn(h,e){if(!!h.debugSymbols){var r=h.debugSymbols.symbolmap,c=h.debugSymbols.addr2symbol;if(!r||!h.readAddress)return null;var m=r["_"+e]||r[e];if(typeof m!="number")return null;var o=h.readAddress(m);if(c&&c[m+1]!=null)return"$"+a0(m,4)+" = $"+a0(o,2)+" ("+o+" decimal)";{let d=h.readAddress(m+1),x=o|d<<8;return"$"+a0(m,4)+" = $"+a0(o,2)+" $"+a0(d,2)+" ("+(x<<16>>16)+" decimal)"}}}function Bt(h){return h.endsWith("-llvm.c")?"remote:llvm-mos":h.endsWith(".c")||h.endsWith(".h")?"cc65":h.endsWith(".s")||h.endsWith(".ca65")?"ca65":h.endsWith(".dasm")?"dasm":h.endsWith(".acme")?"acme":h.endsWith(".wiz")?"wiz":h.endsWith(".ecs")?"ecs":"dasm"}var Sn=class extends We{constructor(){super(...arguments);this.debugPCDelta=-1;this.getToolForFilename=Bt}fixPC(e){return e.PC=e.PC+this.debugPCDelta&65535,e}unfixPC(e){return e.PC=e.PC-this.debugPCDelta&65535,e}getSP(){return this.getCPUState().SP}getPC(){return this.getCPUState().PC}isStable(){return!this.getCPUState().T}newCPU(e){var r=new st;return r.connectBus(e),r}getOpcodeMetadata(e,r){return Nt(e,r)}getOriginPC(){return(this.readAddress(65532)|this.readAddress(65533)<<8)&65535}disassemble(e,r){return rt(e,r(e),r(e+1),r(e+2))}getDefaultExtension(){return".a"}getDebugCategories(){return["CPU","ZPRAM","Stack"]}getDebugInfo(e,r){switch(e){case"CPU":return Rt(r.c);case"ZPRAM":return nt(r.b||r.ram,0,256);case"Stack":return ye(this,r.b||r.ram,256,511,256+r.c.SP,32)}}};function Rt(h){function e(r){var c="";return c+=r.N?" N":" -",c+=r.V?" V":" -",c+=r.D?" D":" -",c+=r.Z?" Z":" -",c+=r.C?" C":" -",c+=r.I?" I":" -",c}return"PC "+a0(h.PC,4)+" "+e(h)+` A `+a0(h.A)+" "+(h.R?"":"BUSY")+` X `+a0(h.X)+` Y `+a0(h.Y)+" SP "+a0(h.SP)+` @@ -23,4 +23,4 @@ $`+a0(m)+": ",x+=a0(y,4)+" "+gn(h,y,!0),m++,a=0):(a==0&&(x+=` $`+a0(m)+": "),x+=a0(W(m))+" ",++a==8&&(a=0))}return x+` `}function gn(h,e,r){for(var c=e,m=h.debugSymbols&&h.debugSymbols.addr2symbol;m&&e>=0;){var o=m[e];if(o){var o=m[e];return r?o+" + $"+a0(c-e):o}if(!r)break;e--}return""}function pn(h){return typeof h.connectVideo=="function"}function _n(h){return typeof h.connectAudio=="function"}function Pn(h){return typeof h.setKeyInput=="function"}function Et(h){return typeof h.setPaddleInput=="function"}function kn(h){return typeof h.getRasterY=="function"}function wn(h){return typeof h.connectProbe=="function"}function Dn(h){return typeof h.loadBIOS=="function"}function Bn(h){return typeof h.connectSerialIO=="function"}var Ke=class extends We{constructor(e){super();this.mainElement=e}reset(){this.machine.reset(),this.serialVisualizer!=null&&this.serialVisualizer.reset()}loadState(e){this.machine.loadState(e)}saveState(){return this.machine.saveState()}getSP(){return this.machine.cpu.getSP()}getPC(){return this.machine.cpu.getPC()}isStable(){return this.machine.cpu.isStable()}getCPUState(){return this.machine.cpu.saveState()}loadControlsState(e){this.machine.loadControlsState(e)}saveControlsState(){return this.machine.saveControlsState()}async start(){this.machine=this.newMachine();let e=this.machine;e instanceof Ve&&await e.loadWASM();var r;if(pn(e)){var c=e.getVideoParams();this.video=new ht(this.mainElement,c.width,c.height,{overscan:!!c.overscan,rotate:c.rotate|0,aspect:c.aspect}),this.video.create(),e.connectVideo(this.video.getFrameData()),Pn(e)&&(this.video.setKeyboardEvents(e.setKeyInput.bind(e)),this.poller=new St(e.setKeyInput.bind(e))),r=c.videoFrequency}if(this.timer=new Ct(r||60,this.nextFrame.bind(this)),_n(e)){var m=e.getAudioParams();this.audio=new it(m.sampleRate),this.audio.start(),e.connectAudio(this.audio)}Et(e)&&this.video.setupMouseEvents(),wn(e)&&(this.probeRecorder=new ft(e),this.startProbing=()=>(e.connectProbe(this.probeRecorder),this.probeRecorder),this.stopProbing=()=>{e.connectProbe(null)}),Dn(e)&&(this.loadBIOS=(o,d)=>{e.loadBIOS(d,o)}),Bn(e)&&(this.serialIOInterface==null?this.serialVisualizer=new Zt(this.mainElement,e):e.connectSerialIO(this.serialIOInterface))}loadROM(e,r){this.machine.loadROM(r,e),this.reset()}pollControls(){this.poller&&this.poller.poll(),Et(this.machine)&&(this.machine.setPaddleInput(0,this.video.paddle_x),this.machine.setPaddleInput(1,this.video.paddle_y)),this.machine.pollControls&&this.machine.pollControls()}advance(e){let r=this.getDebugCallback();var c=this.machine.advanceFrame(r);return!e&&this.video&&this.video.updateFrame(),!e&&this.serialVisualizer&&this.serialVisualizer.refresh(),c}advanceFrameClock(e,r){if(r>0)return this.machine instanceof Ve?this.machine.advanceFrameClock(e,r):this.machine.advanceFrame(()=>--r<=0)}isRunning(){return this.timer&&this.timer.isRunning()}resume(){this.timer.start(),this.audio&&this.audio.start()}pause(){this.timer.stop(),this.audio&&this.audio.stop()}runToVsync(){this.restartDebugging();var e=!1;this.runEval(()=>{if(this.getRasterScanline()>0)e=!0;else return e})}getRasterScanline(){return kn(this.machine)&&this.machine.getRasterY()}readAddress(e){return this.machine.read(e)}getDebugCategories(){if(ge(this.machine))return this.machine.getDebugCategories()}getDebugInfo(e,r){return ge(this.machine)&&this.machine.getDebugInfo(e,r)}},Rn=class extends Ke{constructor(){super(...arguments);this.getOpcodeMetadata=Nt;this.getToolForFilename=Bt}disassemble(e,r){return rt(e,r(e),r(e+1),r(e+2))}getDebugCategories(){return ge(this.machine)?this.machine.getDebugCategories():["CPU","ZPRAM","Stack"]}getDebugInfo(e,r){switch(e){case"CPU":return Rt(r.c);case"ZPRAM":return nt(r.b||r.ram,0,256);case"Stack":return ye(this,r.b||r.ram,256,511,256+r.c.SP,32);default:return ge(this.machine)&&this.machine.getDebugInfo(e,r)}}},Nn=class extends Ke{constructor(){super(...arguments);this.getToolForFilename=It}getDebugCategories(){return ge(this.machine)?this.machine.getDebugCategories():["CPU","Stack"]}getDebugInfo(e,r){switch(e){case"CPU":return yt(r.c);case"Stack":{var c=r.c.SP-1&65535,m=c&65280,o=m+255;return c==0&&(c=65536),ye(this,[],m,o,c,205)}default:return ge(this.machine)&&this.machine.getDebugInfo(e,r)}}disassemble(e,r){return ct(e,r(e),r(e+1),r(e+2),r(e+3))}},yn=class extends Ke{constructor(){super(...arguments);this.getToolForFilename=Ot}getDebugCategories(){return ge(this.machine)?this.machine.getDebugCategories():["CPU","Stack"]}getDebugInfo(e,r){switch(e){case"CPU":return ot(r.c);case"Stack":{var c=r.c.SP-1&65535,m=c&65280,o=m+255;return c==0&&(c=65536),ye(this,[],m,o,c,23,!0)}default:return super.getDebugInfo(e,r)}}disassemble(e,r){return Object.create(Ye()).disasm(r(e),r(e+1),r(e+2),r(e+3),r(e+4),e)}},Zt=class{constructor(e,r){this.lastOutCount=-1;this.lastInCount=-1;this.device=r,this.textarea=document.createElement("textarea"),this.textarea.classList.add("transcript"),this.textarea.classList.add("transcript-style-2"),this.textarea.style.display="none",e.appendChild(this.textarea)}reset(){this.lastOutCount=0,this.lastInCount=0,this.textarea.style.display="none"}refresh(){var e="";if(this.device.serialOut.length!=this.lastOutCount){var r="";for(var c of this.device.serialOut)e!=c.op&&(r!=""&&(r+=` `),c.op==="read"?r+="<< ":c.op==="write"&&(r+=">> "),e=c.op),c.value==10?(r+="\u21B5",e=""):r+=dt(c.value);this.textarea.value=r,this.lastOutCount=this.device.serialOut.length,this.textarea.style.display="block"}}};export{rt as a,ct as b,at as c,vt as d,xn as e,un as f,Zn as g,mn as h,Mn as i,ln as j,bn as k,I0 as l,ft as m,He as n,gt as o,pt as p,dn as q,Ve as r,Ye as s,hn as t,An as u,ge as v,Dt as w,Cn as x,Bt as y,Sn as z,Rt as A,Nt as B,yt as C,Lt as D,It as E,vn as F,ye as G,Ke as H,Rn as I,Nn as J,yn as K}; -//# sourceMappingURL=chunk-GKVIY6GD.js.map +//# sourceMappingURL=chunk-6UU4KLMR.js.map diff --git a/gen/chunk-GKVIY6GD.js.map b/gen/chunk-6UU4KLMR.js.map similarity index 92% rename from gen/chunk-GKVIY6GD.js.map rename to gen/chunk-6UU4KLMR.js.map index 8c0db5ad..41bd52c8 100644 --- a/gen/chunk-GKVIY6GD.js.map +++ b/gen/chunk-6UU4KLMR.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/common/cpu/disasm6502.ts", "../src/common/cpu/ZilogZ80.ts", "../src/common/audio.ts", "../src/common/probe.ts", "../src/common/devices.ts", "../src/common/cpu/disasmz80.ts", "../src/common/wasmplatform.ts", "../src/common/cpu/6809.ts", "../src/common/cpu/MOS6502.ts", "../src/common/baseplatform.ts"], - "sourcesContent": ["\nimport { hex } from \"../util\";\n\nexport var OPS_6502 = [\n {mn:\"BRK\",am:\"\",nb:1,il:0,c1:7,c2:0,nw:3,br:1,mod:\"SI\"}, // 0\n {mn:\"ORA\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"AZN\"}, // 1\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 2\n {mn:\"SLO\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 3\n {mn:\"NOP\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:\"\"}, // 4\n {mn:\"ORA\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"AZN\"}, // 5\n {mn:\"ASL\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // 6\n {mn:\"SLO\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 7\n {mn:\"PHP\",am:\"\",nb:1,il:0,c1:3,c2:0,nw:1,br:0,mod:\"S\"}, // 8\n {mn:\"ORA\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 9\n {mn:\"ASL\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // a\n {mn:\"ANC\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // b\n {mn:\"NOP\",am:\"AAAA\",nb:3,il:1,c1:3,c2:0,nw:0,br:0,mod:\"\"}, // c\n {mn:\"ORA\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // d\n {mn:\"ASL\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // e\n {mn:\"SLO\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // f\n {mn:\"BPL\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 10\n {mn:\"ORA\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"AZN\"}, // 11\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 12\n {mn:\"SLO\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 13\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 14\n {mn:\"ORA\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 15\n {mn:\"ASL\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 16\n {mn:\"SLO\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 17\n {mn:\"CLC\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"C\"}, // 18\n {mn:\"ORA\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 19\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 1a\n {mn:\"SLO\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 1b\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 1c\n {mn:\"ORA\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 1d\n {mn:\"ASL\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // 1e\n {mn:\"SLO\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 1f\n {mn:\"JSR\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:1,mod:\"S\"}, // 20\n {mn:\"AND\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"AZN\"}, // 21\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 22\n {mn:\"RLA\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 23\n {mn:\"BIT\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"ZVN\"}, // 24\n {mn:\"AND\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"AZN\"}, // 25\n {mn:\"ROL\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // 26\n {mn:\"RLA\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 27\n {mn:\"PLP\",am:\"\",nb:1,il:0,c1:4,c2:0,nw:0,br:0,mod:\"SCZIDVN\"}, // 28\n {mn:\"AND\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 29\n {mn:\"ROL\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 2a\n {mn:\"ANC\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 2b\n {mn:\"BIT\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ZVN\"}, // 2c\n {mn:\"AND\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 2d\n {mn:\"ROL\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 2e\n {mn:\"RLA\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 2f\n {mn:\"BMI\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 30\n {mn:\"AND\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"AZN\"}, // 31\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 32\n {mn:\"RLA\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 33\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 34\n {mn:\"AND\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 35\n {mn:\"ROL\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 36\n {mn:\"RLA\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 37\n {mn:\"SEC\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"C\"}, // 38\n {mn:\"AND\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 39\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 3a\n {mn:\"RLA\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 3b\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 3c\n {mn:\"AND\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 3d\n {mn:\"ROL\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // 3e\n {mn:\"RLA\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 3f\n {mn:\"RTI\",am:\"\",nb:1,il:0,c1:6,c2:0,nw:0,br:1,mod:\"SCZIDVN\"}, // 40\n {mn:\"EOR\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"AZN\"}, // 41\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 42\n {mn:\"SRE\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 43\n {mn:\"NOP\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:\"\"}, // 44\n {mn:\"EOR\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"AZN\"}, // 45\n {mn:\"LSR\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // 46\n {mn:\"SRE\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 47\n {mn:\"PHA\",am:\"\",nb:1,il:0,c1:3,c2:0,nw:1,br:0,mod:\"S\"}, // 48\n {mn:\"EOR\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 49\n {mn:\"LSR\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 4a\n {mn:\"ASR\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 4b\n {mn:\"JMP\",am:\"AAAA\",nb:3,il:0,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 4c\n {mn:\"EOR\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 4d\n {mn:\"LSR\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 4e\n {mn:\"SRE\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 4f\n {mn:\"BVC\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 50\n {mn:\"EOR\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"AZN\"}, // 51\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 52\n {mn:\"SRE\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 53\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 54\n {mn:\"EOR\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 55\n {mn:\"LSR\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 56\n {mn:\"SRE\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 57\n {mn:\"CLI\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"I\"}, // 58\n {mn:\"EOR\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 59\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 5a\n {mn:\"SRE\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 5b\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 5c\n {mn:\"EOR\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 5d\n {mn:\"LSR\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // 5e\n {mn:\"SRE\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 5f\n {mn:\"RTS\",am:\"\",nb:1,il:0,c1:6,c2:0,nw:0,br:1,mod:\"S\"}, // 60\n {mn:\"ADC\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 61\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 62\n {mn:\"RRA\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 63\n {mn:\"NOP\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:\"\"}, // 64\n {mn:\"ADC\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 65\n {mn:\"ROR\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // 66\n {mn:\"RRA\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 67\n {mn:\"PLA\",am:\"\",nb:1,il:0,c1:4,c2:0,nw:0,br:0,mod:\"SAZN\"}, // 68\n {mn:\"ADC\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 69\n {mn:\"ROR\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 6a\n {mn:\"ARR\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 6b\n {mn:\"JMP\",am:\"(AAAA)\",nb:3,il:0,c1:5,c2:0,nw:0,br:1,mod:\"\"}, // 6c\n {mn:\"ADC\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 6d\n {mn:\"ROR\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 6e\n {mn:\"RRA\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 6f\n {mn:\"BVS\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 70\n {mn:\"ADC\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // 71\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 72\n {mn:\"RRA\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 73\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 74\n {mn:\"ADC\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 75\n {mn:\"ROR\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 76\n {mn:\"RRA\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 77\n {mn:\"SEI\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"I\"}, // 78\n {mn:\"ADC\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // 79\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 7a\n {mn:\"RRA\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 7b\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 7c\n {mn:\"ADC\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // 7d\n {mn:\"ROR\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // 7e\n {mn:\"RRA\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 7f\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 80\n {mn:\"STA\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:1,br:0,mod:\"\"}, // 81\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 82\n {mn:\"SAX\",am:\"(aa,x)\",nb:2,il:1,c1:6,c2:0,nw:1,br:0,mod:\"\"}, // 83\n {mn:\"STY\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:\"\"}, // 84\n {mn:\"STA\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:\"\"}, // 85\n {mn:\"STX\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:\"\"}, // 86\n {mn:\"SAX\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:1,br:0,mod:\"\"}, // 87\n {mn:\"DEY\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"YZN\"}, // 88\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 89\n {mn:\"TXA\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 8a\n {mn:\"ANE\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 8b\n {mn:\"STY\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 8c\n {mn:\"STA\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 8d\n {mn:\"STX\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 8e\n {mn:\"SAX\",am:\"AAAA\",nb:3,il:1,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 8f\n {mn:\"BCC\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 90\n {mn:\"STA\",am:\"(aa),y\",nb:2,il:0,c1:6,c2:0,nw:1,br:0,mod:\"\"}, // 91\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 92\n {mn:\"SHA\",am:\"(aa),y\",nb:2,il:1,c1:6,c2:0,nw:1,br:0,mod:\"\"}, // 93\n {mn:\"STY\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 94\n {mn:\"STA\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 95\n {mn:\"STX\",am:\"aa,y\",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 96\n {mn:\"SAX\",am:\"aa,y\",nb:3,il:1,c1:4,c2:0,nw:1,br:1,mod:\"\"}, // 97\n {mn:\"TYA\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 98\n {mn:\"STA\",am:\"AAAA,y\",nb:3,il:0,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 99\n {mn:\"TXS\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"S\"}, // 9a\n {mn:\"SHS\",am:\"AAAA,y\",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:\"S\"}, // 9b\n {mn:\"SHY\",am:\"AAAA,x\",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 9c\n {mn:\"STA\",am:\"AAAA,x\",nb:3,il:0,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 9d\n {mn:\"SHX\",am:\"AAAA,y\",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 9e\n {mn:\"SHA\",am:\"AAAA,y\",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 9f\n {mn:\"LDY\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"YZN\"}, // a0\n {mn:\"LDA\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"AZN\"}, // a1\n {mn:\"LDX\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // a2\n {mn:\"LAX\",am:\"(aa,x)\",nb:2,il:1,c1:6,c2:0,nw:0,br:0,mod:\"AXZN\"}, // a3\n {mn:\"LDY\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"YZN\"}, // a4\n {mn:\"LDA\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"AZN\"}, // a5\n {mn:\"LDX\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"XZN\"}, // a6\n {mn:\"LAX\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:\"AXZN\"}, // a7\n {mn:\"TAY\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"YZN\"}, // a8\n {mn:\"LDA\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // a9\n {mn:\"TAX\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // aa\n {mn:\"LXA\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"AXZN\"}, // ab\n {mn:\"LDY\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"YZN\"}, // ac\n {mn:\"LDA\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // ad\n {mn:\"LDX\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"XZN\"}, // ae\n {mn:\"LAX\",am:\"AAAA\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"AXZN\"}, // af\n {mn:\"BCS\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // b0\n {mn:\"LDA\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"AZN\"}, // b1\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // b2\n {mn:\"LAX\",am:\"(aa),y\",nb:2,il:1,c1:5,c2:1,nw:0,br:0,mod:\"AXZN\"}, // b3\n {mn:\"LDY\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"YZN\"}, // b4\n {mn:\"LDA\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // b5\n {mn:\"LDX\",am:\"aa,y\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"XZN\"}, // b6\n {mn:\"LAX\",am:\"aa,y\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"AXZN\"}, // b7\n {mn:\"CLV\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"V\"}, // b8\n {mn:\"LDA\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // b9\n {mn:\"TSX\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // ba\n {mn:\"LAS\",am:\"AAAA,y\",nb:3,il:1,c1:4,c2:1,nw:0,br:0,mod:\"SAXZN\"}, // bb\n {mn:\"LDY\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"YZN\"}, // bc\n {mn:\"LDA\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // bd\n {mn:\"LDX\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"XZN\"}, // be\n {mn:\"LAX\",am:\"AAAA,y\",nb:3,il:1,c1:4,c2:1,nw:0,br:0,mod:\"AXZN\"}, // bf\n {mn:\"CPY\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"CZN\"}, // c0\n {mn:\"CMP\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"CZN\"}, // c1\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // c2\n {mn:\"DCP\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"CZN\"}, // c3\n {mn:\"CPY\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"CZN\"}, // c4\n {mn:\"CMP\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"CZN\"}, // c5\n {mn:\"DEC\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"ZN\"}, // c6\n {mn:\"DCP\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // c7\n {mn:\"INY\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"YZN\"}, // c8\n {mn:\"CMP\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"CZN\"}, // c9\n {mn:\"DEX\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // ca\n {mn:\"SBX\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"XCZN\"}, // cb\n {mn:\"CPY\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"CZN\"}, // cc\n {mn:\"CMP\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"CZN\"}, // cd\n {mn:\"DEC\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"ZN\"}, // ce\n {mn:\"DCP\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // cf\n {mn:\"BNE\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // d0\n {mn:\"CMP\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"CZN\"}, // d1\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // d2\n {mn:\"DCP\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"CZN\"}, // d3\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // d4\n {mn:\"CMP\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"CZN\"}, // d5\n {mn:\"DEC\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"ZN\"}, // d6\n {mn:\"DCP\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // d7\n {mn:\"CLD\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"D\"}, // d8\n {mn:\"CMP\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"CZN\"}, // d9\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // da\n {mn:\"DCP\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // db\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // dc\n {mn:\"CMP\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"CZN\"}, // dd\n {mn:\"DEC\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"ZN\"}, // de\n {mn:\"DCP\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // df\n {mn:\"CPX\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"CZN\"}, // e0\n {mn:\"SBC\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // e1\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // e2\n {mn:\"ISB\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // e3\n {mn:\"CPX\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"CZN\"}, // e4\n {mn:\"SBC\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // e5\n {mn:\"INC\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"ZN\"}, // e6\n {mn:\"ISB\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // e7\n {mn:\"INX\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // e8\n {mn:\"SBC\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // e9\n {mn:\"NOP\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // ea\n {mn:\"SBC\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // eb\n {mn:\"CPX\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"CZN\"}, // ec\n {mn:\"SBC\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // ed\n {mn:\"INC\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"ZN\"}, // ee\n {mn:\"ISB\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // ef\n {mn:\"BEQ\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // f0\n {mn:\"SBC\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // f1\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // f2\n {mn:\"ISB\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // f3\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // f4\n {mn:\"SBC\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // f5\n {mn:\"INC\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"ZN\"}, // f6\n {mn:\"ISB\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // f7\n {mn:\"SED\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"D\"}, // f8\n {mn:\"SBC\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // f9\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // fa\n {mn:\"ISB\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // fb\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // fc\n {mn:\"SBC\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // fd\n {mn:\"INC\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"ZN\"}, // fe\n {mn:\"ISB\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // ff\n];\n\nexport function disassemble6502(pc:number, b0:number, b1:number, b2:number) : {line:string, nbytes:number, isaddr:boolean} {\n\n var op = OPS_6502[b0];\n if (op == null) return {line:\"???\", nbytes:1, isaddr:false};\n var s = op.mn;\n var am = op.am;\n var isaddr = false;\n if (am == 'branch') {\n var offset = (b1 < 0x80) ? (pc+2+b1) : (pc+2-(256-b1));\n offset &= 0xffff;\n am = '$'+hex(offset, 4);\n isaddr = true;\n } else {\n am = am.replace('aa','$'+hex(b1, 2));\n am = am.replace('AAAA','$'+hex(b1+(b2<<8), 4));\n if (am.indexOf('#') < 0 && am.indexOf('$') >= 0)\n isaddr = true;\n }\n return {line:op.mn + \" \" + am, nbytes:op.nb, isaddr:isaddr};\n};\n", "// Generated by CoffeeScript 1.9.3\n\nimport { CPU, Bus, InstructionBased, IOBusConnected, SavesState, Interruptable } from \"../devices\";\n\n///////////////////////////////////////////////////////////////////////////////\n/// @file Z80.js\n///\n/// @brief Emulator for the Zilog Z80 microprocessor\n///\n/// @author Matthew Howell\n///\n/// @remarks\n/// This module is a simple, straightforward instruction interpreter.\n/// There is no fancy dynamic recompilation or cycle-accurate emulation.\n/// The author believes that this should be sufficient for any emulator that\n/// would be feasible to write in JavaScript anyway.\n/// The code and the comments in this file assume that the reader is familiar\n/// with the Z80 architecture. If you're not, here are some references I use:\n/// http://clrhome.org/table/ - Z80 instruction set tables\n/// http://www.zilog.com/docs/z80/um0080.pdf - The official manual\n/// http://www.myquest.nl/z80undocumented/z80-documented-v0.91.pdf\n/// - The Undocumented Z80, Documented\n///\n/// @copyright (c) 2013 Matthew Howell\n/// This code is released under the MIT license,\n/// a copy of which is available in the associated README.md file,\n/// or at http://opensource.org/licenses/MIT\n///////////////////////////////////////////////////////////////////////////////\n\n///////////////////////////////////////////////////////////////////////////////\n/// We'll begin with the object constructor and the public API functions.\n///////////////////////////////////////////////////////////////////////////////\nfunction FastZ80(coreParameter)\n{\n // Obviously we'll be needing the core object's functions again.\n const core = coreParameter;\n \n // The argument to this constructor should be an object containing 4 functions:\n // mem_read(address) should return the byte at the given memory address,\n // mem_write(address, value) should write the given value to the given memory address,\n // io_read(port) should read a return a byte read from the given I/O port,\n // io_write(port, value) should write the given byte to the given I/O port.\n // If any of those functions is missing, this module cannot run.\n if (!core || (typeof core.mem_read !== \"function\") || (typeof core.mem_write !== \"function\") ||\n (typeof core.io_read !== \"function\") || (typeof core.io_write !== \"function\"))\n throw(\"Z80: Core object is missing required functions.\");\n \n // All right, let's initialize the registers.\n // First, the standard 8080 registers.\n let a = 0x00;\n let b = 0x00;\n let c = 0x00;\n let d = 0x00;\n let e = 0x00;\n let h = 0x00;\n let l = 0x00;\n // Now the special Z80 copies of the 8080 registers\n // (the ones used for the SWAP instruction and such).\n let a_prime = 0x00;\n let b_prime = 0x00;\n let c_prime = 0x00;\n let d_prime = 0x00;\n let e_prime = 0x00;\n let h_prime = 0x00;\n let l_prime = 0x00;\n // And now the Z80 index registers.\n let ix = 0x0000;\n let iy = 0x0000;\n // Then the \"utility\" registers: the interrupt vector,\n // the memory refresh, the stack pointer, and the program counter.\n let i = 0x00;\n let r = 0x00;\n let sp = 0xdff0;\n let pc = 0x0000;\n // We don't keep an F register for the flags,\n // because most of the time we're only accessing a single flag,\n // so we optimize for that case and use utility functions\n // for the rarer occasions when we need to access the whole register.\n let flags = {S:0, Z:0, Y:0, H:0, X:0, P:0, N:0, C:0};\n let flags_prime = {S:0, Z:0, Y:0, H:0, X:0, P:0, N:0, C:0};\n // And finally we have the interrupt mode and flip-flop registers.\n let imode = 0;\n let iff1 = 0;\n let iff2 = 0;\n \n // These are all specific to this implementation, not Z80 features.\n // Keep track of whether we've had a HALT instruction called.\n let halted = false;\n // EI and DI wait one instruction before they take effect;\n // these flags tell us when we're in that wait state.\n let do_delayed_di = false;\n let do_delayed_ei = false;\n // This tracks the number of cycles spent in a single instruction run,\n // including processing any prefixes and handling interrupts.\n let cycle_counter = 0;\n \n function getState():Z80State {\n return {\n PC:pc,\n SP:sp,\n IX:ix,\n IY:iy,\n AF:(a<<8)+get_flags_register(),\n BC:(b<<8)+c,\n DE:(d<<8)+e,\n HL:(h<<8)+l,\n AF_:(a_prime<<8)+get_flags_prime(),\n BC_:(b_prime<<8)+c_prime,\n DE_:(d_prime<<8)+e_prime,\n HL_:(h_prime<<8)+l_prime,\n IR:(i<<8)+r,\n im : imode,\n iff1 : iff1,\n iff2 : iff2,\n halted : halted,\n do_delayed_di : do_delayed_di,\n do_delayed_ei : do_delayed_ei,\n cycle_counter : cycle_counter\n }; \n }\n\n function setState(state:Z80State) {\n pc = state.PC;\n sp = state.SP;\n ix = state.IX;\n iy = state.IY;\n a = (state.AF >> 8) & 0xff;\n set_flags_register(state.AF);\n b = (state.BC >> 8) & 0xff;\n c = state.BC & 0xff;\n d = (state.DE >> 8) & 0xff;\n e = state.DE & 0xff;\n h = (state.HL >> 8) & 0xff;\n l = state.HL & 0xff;\n a_prime = (state.AF_ >> 8) & 0xff;\n set_flags_prime(state.AF_);\n b_prime = (state.BC_ >> 8) & 0xff;\n c_prime = state.BC_ & 0xff;\n d_prime = (state.DE_ >> 8) & 0xff;\n e_prime = state.DE_ & 0xff;\n h_prime = (state.HL_ >> 8) & 0xff;\n l_prime = state.HL_ & 0xff;\n i = (state.IR >> 8) & 0xff;\n r = state.IR & 0xff;\n imode = state.im;\n iff1 = state.iff1;\n iff2 = state.iff2;\n halted = state.halted;\n do_delayed_di = state.do_delayed_di;\n do_delayed_ei = state.do_delayed_ei;\n cycle_counter = state.cycle_counter;\n }\n\n///////////////////////////////////////////////////////////////////////////////\n/// @public reset\n///\n/// @brief Re-initialize the processor as if a reset or power on had occured\n///////////////////////////////////////////////////////////////////////////////\nlet reset = function()\n{\n // These registers are the ones that have predictable states\n // immediately following a power-on or a reset.\n // The others are left alone, because their states are unpredictable.\n sp = 0xdff0;\n pc = 0x0000;\n a = 0x00;\n r = 0x00;\n set_flags_register(0);\n // Start up with interrupts disabled.\n imode = 0;\n iff1 = 0;\n iff2 = 0;\n // Don't start halted or in a delayed DI or EI.\n halted = false;\n do_delayed_di = false;\n do_delayed_ei = false;\n // Obviously we've not used any cycles yet.\n cycle_counter = 0;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n/// @public run_instruction\n///\n/// @brief Runs a single instruction\n///\n/// @return The number of T cycles the instruction took to run,\n/// plus any time that went into handling interrupts that fired\n/// while this instruction was executing\n///////////////////////////////////////////////////////////////////////////////\nlet run_instruction = function()\n{\n if (!halted)\n {\n // If the previous instruction was a DI or an EI,\n // we'll need to disable or enable interrupts\n // after whatever instruction we're about to run is finished.\n var doing_delayed_di = false, doing_delayed_ei = false;\n if (do_delayed_di)\n {\n do_delayed_di = false;\n doing_delayed_di = true;\n }\n else if (do_delayed_ei)\n {\n do_delayed_ei = false;\n doing_delayed_ei = true;\n }\n\n // R is incremented at the start of every instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n \n // Read the byte at the PC and run the instruction it encodes.\n var opcode = core.mem_read(pc);\n decode_instruction(opcode);\n pc = (pc + 1) & 0xffff;\n \n // Actually do the delayed interrupt disable/enable if we have one.\n if (doing_delayed_di)\n {\n iff1 = 0;\n iff2 = 0;\n //console.log(\"DI\",pc);\n }\n else if (doing_delayed_ei)\n {\n iff1 = 1;\n iff2 = 1;\n //console.log(\"EI\",pc);\n }\n \n // And finally clear out the cycle counter for the next instruction\n // before returning it to the emulator core.\n var retval = cycle_counter;\n cycle_counter = 0;\n return retval;\n }\n else\n {\n // While we're halted, claim that we spent a cycle doing nothing,\n // so that the rest of the emulator can still proceed.\n return 1;\n }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n/// @public interrupt\n///\n/// @brief Simulates pulsing the processor's INT (or NMI) pin\n///\n/// @param non_maskable - true if this is a non-maskable interrupt\n/// @param data - the value to be placed on the data bus, if needed\n///////////////////////////////////////////////////////////////////////////////\nlet interrupt = function(non_maskable:boolean, data:number) : boolean\n{\n //console.log(non_maskable, data, iff1, iff2, do_delayed_ei, do_delayed_di);\n if (non_maskable)\n {\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n // Non-maskable interrupts are always handled the same way;\n // clear IFF1 and then do a CALL 0x0066.\n // Also, all interrupts reset the HALT state.\n halted = false;\n iff2 = iff1;\n iff1 = 0;\n push_word(pc);\n pc = 0x66;\n cycle_counter += 11;\n return true;\n }\n else if (iff1)\n {\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n \n halted = false;\n iff1 = 0;\n iff2 = 0;\n \n if (imode === 0)\n {\n // In the 8080-compatible interrupt mode,\n // decode the content of the data bus as an instruction and run it.\n pc = (pc - 1) & 0xffff; //SEH: so do_reset() pushes right value\n decode_instruction(data);\n pc = (pc + 1) & 0xffff; //SEH: so do_reset() pushes right value\n cycle_counter += 2;\n }\n else if (imode === 1)\n {\n // Mode 1 is always just RST 0x38.\n push_word(pc);\n pc = 0x38;\n cycle_counter += 13;\n }\n else if (imode === 2)\n {\n // Mode 2 uses the value on the data bus as in index\n // into the vector table pointer to by the I register.\n push_word(pc);\n // The Z80 manual says that this address must be 2-byte aligned,\n // but it doesn't appear that this is actually the case on the hardware,\n // so we don't attempt to enforce that here.\n var vector_address = ((i << 8) | data);\n pc = core.mem_read(vector_address) | \n (core.mem_read((vector_address + 1) & 0xffff) << 8);\n \n cycle_counter += 19;\n }\n //console.log(imode,data,pc);\n return true;\n }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n/// The public API functions end here.\n///\n/// What begins here are just general utility functions, used variously.\n///////////////////////////////////////////////////////////////////////////////\nlet decode_instruction = function(opcode)\n{\n // The register-to-register loads and ALU instructions\n // are all so uniform that we can decode them directly\n // instead of going into the instruction array for them.\n // This function gets the operand for all of these instructions.\n var get_operand = function(opcode)\n {\n return ((opcode & 0x07) === 0) ? b :\n ((opcode & 0x07) === 1) ? c :\n ((opcode & 0x07) === 2) ? d :\n ((opcode & 0x07) === 3) ? e :\n ((opcode & 0x07) === 4) ? h :\n ((opcode & 0x07) === 5) ? l :\n ((opcode & 0x07) === 6) ? core.mem_read(l | (h << 8)) : a;\n };\n\n // Handle HALT right up front, because it fouls up our LD decoding\n // by falling where LD (HL), (HL) ought to be.\n if (opcode === 0x76)\n {\n halted = true;\n }\n else if ((opcode >= 0x40) && (opcode < 0x80))\n {\n // This entire range is all 8-bit register loads.\n // Get the operand and assign it to the correct destination.\n var operand = get_operand(opcode);\n \n if (((opcode & 0x38) >>> 3) === 0)\n b = operand;\n else if (((opcode & 0x38) >>> 3) === 1)\n c = operand;\n else if (((opcode & 0x38) >>> 3) === 2)\n d = operand;\n else if (((opcode & 0x38) >>> 3) === 3)\n e = operand;\n else if (((opcode & 0x38) >>> 3) === 4)\n h = operand;\n else if (((opcode & 0x38) >>> 3) === 5)\n l = operand;\n else if (((opcode & 0x38) >>> 3) === 6)\n core.mem_write(l | (h << 8), operand);\n else if (((opcode & 0x38) >>> 3) === 7)\n a = operand;\n }\n else if ((opcode >= 0x80) && (opcode < 0xc0))\n {\n // These are the 8-bit register ALU instructions.\n // We'll get the operand and then use this \"jump table\"\n // to call the correct utility function for the instruction.\n var operand = get_operand(opcode),\n op_array = [do_add, do_adc, do_sub, do_sbc,\n do_and, do_xor, do_or, do_cp];\n \n op_array[(opcode & 0x38) >>> 3]( operand);\n }\n else\n {\n // This is one of the less formulaic instructions;\n // we'll get the specific function for it from our array.\n var func = instructions[opcode];\n func();\n }\n \n // Update the cycle counter with however many cycles\n // the base instruction took.\n // If this was a prefixed instruction, then\n // the prefix handler has added its extra cycles already.\n cycle_counter += cycle_counts[opcode];\n};\n\nlet get_signed_offset_byte = function(value)\n{\n // This function requires some explanation.\n // We just use JavaScript Number variables for our registers,\n // not like a typed array or anything.\n // That means that, when we have a byte value that's supposed\n // to represent a signed offset, the value we actually see\n // isn't signed at all, it's just a small integer.\n // So, this function converts that byte into something JavaScript\n // will recognize as signed, so we can easily do arithmetic with it.\n // First, we clamp the value to a single byte, just in case.\n value &= 0xff;\n // We don't have to do anything if the value is positive.\n if (value & 0x80)\n {\n // But if the value is negative, we need to manually un-two's-compliment it.\n // I'm going to assume you can figure out what I meant by that,\n // because I don't know how else to explain it.\n // We could also just do value |= 0xffffff00, but I prefer\n // not caring how many bits are in the integer representation\n // of a JavaScript number in the currently running browser.\n value = -((0xff & ~value) + 1);\n }\n return value;\n};\n\nlet get_flags_register = function()\n{\n // We need the whole F register for some reason.\n // probably a PUSH AF instruction,\n // so make the F register out of our separate flags.\n return (flags.S << 7) |\n (flags.Z << 6) |\n (flags.Y << 5) |\n (flags.H << 4) |\n (flags.X << 3) |\n (flags.P << 2) |\n (flags.N << 1) |\n (flags.C);\n};\n\nlet get_flags_prime = function()\n{\n // This is the same as the above for the F' register.\n return (flags_prime.S << 7) |\n (flags_prime.Z << 6) |\n (flags_prime.Y << 5) |\n (flags_prime.H << 4) |\n (flags_prime.X << 3) |\n (flags_prime.P << 2) |\n (flags_prime.N << 1) |\n (flags_prime.C);\n};\n\nlet set_flags_register = function(operand)\n{\n // We need to set the F register, probably for a POP AF,\n // so break out the given value into our separate flags.\n flags.S = (operand & 0x80) >>> 7;\n flags.Z = (operand & 0x40) >>> 6;\n flags.Y = (operand & 0x20) >>> 5;\n flags.H = (operand & 0x10) >>> 4;\n flags.X = (operand & 0x08) >>> 3;\n flags.P = (operand & 0x04) >>> 2;\n flags.N = (operand & 0x02) >>> 1;\n flags.C = (operand & 0x01);\n};\n\nlet set_flags_prime = function(operand)\n{\n // Again, this is the same as the above for F'.\n flags_prime.S = (operand & 0x80) >>> 7;\n flags_prime.Z = (operand & 0x40) >>> 6;\n flags_prime.Y = (operand & 0x20) >>> 5;\n flags_prime.H = (operand & 0x10) >>> 4;\n flags_prime.X = (operand & 0x08) >>> 3;\n flags_prime.P = (operand & 0x04) >>> 2;\n flags_prime.N = (operand & 0x02) >>> 1;\n flags_prime.C = (operand & 0x01);\n};\n\nlet update_xy_flags = function(result)\n{\n // Most of the time, the undocumented flags\n // (sometimes called X and Y, or 3 and 5),\n // take their values from the corresponding bits\n // of the result of the instruction,\n // or from some other related value.\n // This is a utility function to set those flags based on those bits.\n flags.Y = (result & 0x20) >>> 5;\n flags.X = (result & 0x08) >>> 3;\n};\n\nlet get_parity = function(value)\n{\n // We could try to actually calculate the parity every time,\n // but why calculate what you can pre-calculate?\n var parity_bits = [\n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,\n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1\n ];\n return parity_bits[value];\n};\n\nlet push_word = function(operand)\n{\n // Pretty obvious what this function does; given a 16-bit value,\n // decrement the stack pointer, write the high byte to the new\n // stack pointer location, then repeat for the low byte.\n sp = (sp - 1) & 0xffff;\n core.mem_write(sp, (operand & 0xff00) >>> 8);\n sp = (sp - 1) & 0xffff;\n core.mem_write(sp, operand & 0x00ff);\n};\n\nlet pop_word = function()\n{\n // Again, not complicated; read a byte off the top of the stack,\n // increment the stack pointer, rinse and repeat.\n var retval = core.mem_read(sp) & 0xff;\n sp = (sp + 1) & 0xffff;\n retval |= core.mem_read(sp) << 8;\n sp = (sp + 1) & 0xffff;\n return retval;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n/// Now, the way most instructions work in this emulator is that they set up\n/// their operands according to their addressing mode, and then they call a\n/// utility function that handles all variations of that instruction.\n/// Those utility functions begin here.\n///////////////////////////////////////////////////////////////////////////////\nlet do_conditional_absolute_jump = function(condition)\n{\n // This function implements the JP [condition],nn instructions.\n if (condition)\n {\n // We're taking this jump, so write the new PC,\n // and then decrement the thing we just wrote,\n // because the instruction decoder increments the PC\n // unconditionally at the end of every instruction\n // and we need to counteract that so we end up at the jump target.\n pc = core.mem_read((pc + 1) & 0xffff) |\n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc - 1) & 0xffff;\n }\n else\n {\n // We're not taking this jump, just move the PC past the operand.\n pc = (pc + 2) & 0xffff;\n }\n};\n\nlet do_conditional_relative_jump = function(condition)\n{\n // This function implements the JR [condition],n instructions.\n if (condition)\n {\n // We need a few more cycles to actually take the jump.\n cycle_counter += 5;\n // Calculate the offset specified by our operand.\n var offset = get_signed_offset_byte(core.mem_read((pc + 1) & 0xffff));\n // Add the offset to the PC, also skipping past this instruction.\n pc = (pc + offset + 1) & 0xffff;\n }\n else\n {\n // No jump happening, just skip the operand.\n pc = (pc + 1) & 0xffff;\n }\n};\n\nlet do_conditional_call = function(condition)\n{\n // This function is the CALL [condition],nn instructions.\n // If you've seen the previous functions, you know this drill.\n if (condition)\n {\n cycle_counter += 7;\n push_word((pc + 3) & 0xffff);\n pc = core.mem_read((pc + 1) & 0xffff) |\n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc - 1) & 0xffff;\n }\n else\n {\n pc = (pc + 2) & 0xffff;\n }\n};\n\nlet do_conditional_return = function(condition)\n{\n if (condition)\n {\n cycle_counter += 6;\n pc = (pop_word() - 1) & 0xffff;\n }\n};\n\nlet do_reset = function(address)\n{\n // The RST [address] instructions go through here.\n push_word((pc + 1) & 0xffff);\n pc = (address - 1) & 0xffff;\n};\n\nlet do_add = function(operand)\n{\n // This is the ADD A, [operand] instructions.\n // We'll do the literal addition, which includes any overflow,\n // so that we can more easily figure out whether we had\n // an overflow or a carry and set the flags accordingly.\n var result = a + operand;\n \n // The great majority of the work for the arithmetic instructions\n // turns out to be setting the flags rather than the actual operation.\n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = (((operand & 0x0f) + (a & 0x0f)) & 0x10) ? 1 : 0;\n // An overflow has happened if the sign bits of the accumulator and the operand\n // don't match the sign bit of the result value.\n flags.P = ((a & 0x80) === (operand & 0x80)) && ((a & 0x80) !== (result & 0x80)) ? 1 : 0;\n flags.N = 0;\n flags.C = (result & 0x100) ? 1 : 0;\n \n a = result & 0xff;\n update_xy_flags(a);\n};\n\nlet do_adc = function(operand)\n{\n var result = a + operand + flags.C;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = (((operand & 0x0f) + (a & 0x0f) + flags.C) & 0x10) ? 1 : 0;\n flags.P = ((a & 0x80) === (operand & 0x80)) && ((a & 0x80) !== (result & 0x80)) ? 1 : 0;\n flags.N = 0;\n flags.C = (result & 0x100) ? 1 : 0;\n \n a = result & 0xff;\n update_xy_flags(a);\n};\n\nlet do_sub = function(operand)\n{\n var result = a - operand;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = (((a & 0x0f) - (operand & 0x0f)) & 0x10) ? 1 : 0;\n flags.P = ((a & 0x80) !== (operand & 0x80)) && ((a & 0x80) !== (result & 0x80)) ? 1 : 0;\n flags.N = 1;\n flags.C = (result & 0x100) ? 1 : 0;\n \n a = result & 0xff;\n update_xy_flags(a);\n};\n\nlet do_sbc = function(operand)\n{\n var result = a - operand - flags.C;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = (((a & 0x0f) - (operand & 0x0f) - flags.C) & 0x10) ? 1 : 0;\n flags.P = ((a & 0x80) !== (operand & 0x80)) && ((a & 0x80) !== (result & 0x80)) ? 1 : 0;\n flags.N = 1;\n flags.C = (result & 0x100) ? 1 : 0;\n \n a = result & 0xff;\n update_xy_flags(a);\n};\n\nlet do_cp = function(operand)\n{\n // A compare instruction is just a subtraction that doesn't save the value,\n // so we implement it as... a subtraction that doesn't save the value.\n var temp = a;\n do_sub(operand);\n a = temp;\n // Since this instruction has no \"result\" value, the undocumented flags\n // are set based on the operand instead.\n update_xy_flags(operand);\n};\n\nlet do_and = function(operand)\n{\n // The logic instructions are all pretty straightforward.\n a &= operand & 0xff;\n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = !a ? 1 : 0;\n flags.H = 1;\n flags.P = get_parity(a);\n flags.N = 0;\n flags.C = 0;\n update_xy_flags(a);\n};\n\nlet do_or = function(operand)\n{\n a = (operand | a) & 0xff;\n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = !a ? 1 : 0;\n flags.H = 0;\n flags.P = get_parity(a);\n flags.N = 0;\n flags.C = 0;\n update_xy_flags(a);\n};\n\nlet do_xor = function(operand)\n{\n a = (operand ^ a) & 0xff;\n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = !a ? 1 : 0;\n flags.H = 0;\n flags.P = get_parity(a);\n flags.N = 0;\n flags.C = 0;\n update_xy_flags(a);\n};\n\nlet do_inc = function(operand)\n{\n var result = operand + 1;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = ((operand & 0x0f) === 0x0f) ? 1 : 0;\n // It's a good deal easier to detect overflow for an increment/decrement.\n flags.P = (operand === 0x7f) ? 1 : 0;\n flags.N = 0;\n \n result &= 0xff;\n update_xy_flags(result);\n \n return result;\n};\n\nlet do_dec = function(operand)\n{\n var result = operand - 1;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = ((operand & 0x0f) === 0x00) ? 1 : 0;\n flags.P = (operand === 0x80) ? 1 : 0;\n flags.N = 1;\n \n result &= 0xff;\n update_xy_flags(result);\n \n return result;\n};\n\nlet do_hl_add = function(operand)\n{\n // The HL arithmetic instructions are the same as the A ones,\n // just with twice as many bits happening.\n var hl = l | (h << 8), result = hl + operand;\n \n flags.N = 0;\n flags.C = (result & 0x10000) ? 1 : 0;\n flags.H = (((hl & 0x0fff) + (operand & 0x0fff)) & 0x1000) ? 1 : 0;\n \n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n\n update_xy_flags(h);\n};\n\nlet do_hl_adc = function(operand)\n{\n operand += flags.C;\n var hl = l | (h << 8), result = hl + operand;\n \n flags.S = (result & 0x8000) ? 1 : 0;\n flags.Z = !(result & 0xffff) ? 1 : 0;\n flags.H = (((hl & 0x0fff) + (operand & 0x0fff)) & 0x1000) ? 1 : 0;\n flags.P = ((hl & 0x8000) === (operand & 0x8000)) && ((result & 0x8000) !== (hl & 0x8000)) ? 1 : 0;\n flags.N = 0;\n flags.C = (result & 0x10000) ? 1 : 0;\n \n l = result & 0xff;\n h = (result >>> 8) & 0xff;\n \n update_xy_flags(h);\n};\n\nlet do_hl_sbc = function(operand)\n{\n operand += flags.C;\n var hl = l | (h << 8), result = hl - operand;\n \n flags.S = (result & 0x8000) ? 1 : 0;\n flags.Z = !(result & 0xffff) ? 1 : 0;\n flags.H = (((hl & 0x0fff) - (operand & 0x0fff)) & 0x1000) ? 1 : 0;\n flags.P = ((hl & 0x8000) !== (operand & 0x8000)) && ((result & 0x8000) !== (hl & 0x8000)) ? 1 : 0;\n flags.N = 1;\n flags.C = (result & 0x10000) ? 1 : 0;\n \n l = result & 0xff;\n h = (result >>> 8) & 0xff;\n \n update_xy_flags(h);\n};\n\nlet do_in = function(port)\n{\n var result = core.io_read(port);\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = result ? 0 : 1;\n flags.H = 0;\n flags.P = get_parity(result) ? 1 : 0;\n flags.N = 0;\n update_xy_flags(result);\n \n return result;\n};\n\nlet do_neg = function()\n{\n // This instruction is defined to not alter the register if it === 0x80.\n if (a !== 0x80)\n {\n // This is a signed operation, so convert A to a signed value.\n a = get_signed_offset_byte(a);\n \n a = (-a) & 0xff;\n }\n \n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = !a ? 1 : 0;\n flags.H = (((-a) & 0x0f) > 0) ? 1 : 0;\n flags.P = (a === 0x80) ? 1 : 0;\n flags.N = 1;\n flags.C = a ? 1 : 0;\n update_xy_flags(a);\n};\n\nlet do_ldi = function()\n{\n // Copy the value that we're supposed to copy.\n var read_value = core.mem_read(l | (h << 8));\n core.mem_write(e | (d << 8), read_value);\n \n // Increment DE and HL, and decrement BC.\n var result = (e | (d << 8)) + 1;\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n result = (l | (h << 8)) + 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n result = (c | (b << 8)) - 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n \n flags.H = 0;\n flags.P = (c || b) ? 1 : 0;\n flags.N = 0;\n flags.Y = ((a + read_value) & 0x02) >>> 1;\n flags.X = ((a + read_value) & 0x08) >>> 3;\n};\n\nlet do_cpi = function()\n{\n var temp_carry = flags.C;\n var read_value = core.mem_read(l | (h << 8))\n do_cp(read_value);\n flags.C = temp_carry;\n flags.Y = ((a - read_value - flags.H) & 0x02) >>> 1;\n flags.X = ((a - read_value - flags.H) & 0x08) >>> 3;\n \n var result = (l | (h << 8)) + 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n result = (c | (b << 8)) - 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n \n flags.P = result ? 1 : 0;\n};\n\nlet do_ini = function()\n{\n b = do_dec(b);\n \n core.mem_write(l | (h << 8), core.io_read((b << 8) | c));\n \n var result = (l | (h << 8)) + 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n\n flags.N = 1;\n};\n\nlet do_outi = function()\n{\n core.io_write((b << 8) | c, core.mem_read(l | (h << 8)));\n \n var result = (l | (h << 8)) + 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n \n b = do_dec(b);\n flags.N = 1;\n};\n\nlet do_ldd = function()\n{\n flags.N = 0;\n flags.H = 0;\n \n var read_value = core.mem_read(l | (h << 8));\n core.mem_write(e | (d << 8), read_value);\n \n var result = (e | (d << 8)) - 1;\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n result = (l | (h << 8)) - 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n result = (c | (b << 8)) - 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n \n flags.P = (c || b) ? 1 : 0;\n flags.Y = ((a + read_value) & 0x02) >>> 1;\n flags.X = ((a + read_value) & 0x08) >>> 3;\n};\n\nlet do_cpd = function()\n{\n var temp_carry = flags.C\n var read_value = core.mem_read(l | (h << 8))\n do_cp(read_value);\n flags.C = temp_carry;\n flags.Y = ((a - read_value - flags.H) & 0x02) >>> 1;\n flags.X = ((a - read_value - flags.H) & 0x08) >>> 3;\n \n var result = (l | (h << 8)) - 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n result = (c | (b << 8)) - 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n \n flags.P = result ? 1 : 0;\n};\n\nlet do_ind = function()\n{\n b = do_dec(b);\n \n core.mem_write(l | (h << 8), core.io_read((b << 8) | c));\n \n var result = (l | (h << 8)) - 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n \n flags.N = 1;\n};\n\nlet do_outd = function()\n{\n core.io_write((b << 8) | c, core.mem_read(l | (h << 8)));\n \n var result = (l | (h << 8)) - 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n \n b = do_dec(b);\n flags.N = 1;\n};\n\nlet do_rlc = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = (operand & 0x80) >>> 7;\n operand = ((operand << 1) | flags.C) & 0xff;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_rrc = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = operand & 1;\n operand = ((operand >>> 1) & 0x7f) | (flags.C << 7);\n \n flags.Z = !(operand & 0xff) ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand & 0xff;\n};\n\nlet do_rl = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n var temp = flags.C;\n flags.C = (operand & 0x80) >>> 7;\n operand = ((operand << 1) | temp) & 0xff;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n\n return operand;\n};\n\nlet do_rr = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n var temp = flags.C;\n flags.C = operand & 1;\n operand = ((operand >>> 1) & 0x7f) | (temp << 7);\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n\n return operand;\n};\n\nlet do_sla = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = (operand & 0x80) >>> 7;\n operand = (operand << 1) & 0xff;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_sra = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = operand & 1;\n operand = ((operand >>> 1) & 0x7f) | (operand & 0x80);\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_sll = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = (operand & 0x80) >>> 7;\n operand = ((operand << 1) & 0xff) | 1;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_srl = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = operand & 1;\n operand = (operand >>> 1) & 0x7f;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_ix_add = function(operand)\n{\n flags.N = 0;\n \n var result = ix + operand;\n \n flags.C = (result & 0x10000) ? 1 : 0;\n flags.H = (((ix & 0xfff) + (operand & 0xfff)) & 0x1000) ? 1 : 0;\n update_xy_flags((result & 0xff00) >>> 8);\n \n ix = result & 0xffff;\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n/// This table contains the implementations for the instructions that weren't\n/// implemented directly in the decoder function (everything but the 8-bit\n/// register loads and the accumulator ALU instructions, in other words).\n/// Similar tables for the ED and DD/FD prefixes follow this one.\n///////////////////////////////////////////////////////////////////////////////\nlet instructions = [];\n\n// 0x00 : NOP\ninstructions[0x00] = function() { };\n// 0x01 : LD BC, nn\ninstructions[0x01] = function()\n{\n pc = (pc + 1) & 0xffff;\n c = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n b = core.mem_read(pc);\n};\n// 0x02 : LD (BC), A\ninstructions[0x02] = function()\n{\n core.mem_write(c | (b << 8), a);\n};\n// 0x03 : INC BC\ninstructions[0x03] = function()\n{\n var result = (c | (b << 8));\n result += 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n};\n// 0x04 : INC B\ninstructions[0x04] = function()\n{\n b = do_inc(b);\n};\n// 0x05 : DEC B\ninstructions[0x05] = function()\n{\n b = do_dec(b);\n};\n// 0x06 : LD B, n\ninstructions[0x06] = function()\n{\n pc = (pc + 1) & 0xffff;\n b = core.mem_read(pc);\n};\n// 0x07 : RLCA\ninstructions[0x07] = function()\n{\n // This instruction is implemented as a special case of the\n // more general Z80-specific RLC instruction.\n // Specifially, RLCA is a version of RLC A that affects fewer flags.\n // The same applies to RRCA, RLA, and RRA.\n var temp_s = flags.S, temp_z = flags.Z, temp_p = flags.P;\n a = do_rlc(a);\n flags.S = temp_s;\n flags.Z = temp_z;\n flags.P = temp_p;\n};\n// 0x08 : EX AF, AF'\ninstructions[0x08] = function()\n{\n var temp = a;\n a = a_prime;\n a_prime = temp;\n \n temp = get_flags_register();\n set_flags_register(get_flags_prime());\n set_flags_prime(temp);\n};\n// 0x09 : ADD HL, BC\ninstructions[0x09] = function()\n{\n do_hl_add(c | (b << 8));\n};\n// 0x0a : LD A, (BC)\ninstructions[0x0a] = function()\n{\n a = core.mem_read(c | (b << 8));\n};\n// 0x0b : DEC BC\ninstructions[0x0b] = function()\n{\n var result = (c | (b << 8));\n result -= 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n};\n// 0x0c : INC C\ninstructions[0x0c] = function()\n{\n c = do_inc(c);\n};\n// 0x0d : DEC C\ninstructions[0x0d] = function()\n{\n c = do_dec(c);\n};\n// 0x0e : LD C, n\ninstructions[0x0e] = function()\n{\n pc = (pc + 1) & 0xffff;\n c = core.mem_read(pc);\n};\n// 0x0f : RRCA\ninstructions[0x0f] = function()\n{\n var temp_s = flags.S, temp_z = flags.Z, temp_p = flags.P;\n a = do_rrc(a);\n flags.S = temp_s;\n flags.Z = temp_z;\n flags.P = temp_p;\n};\n// 0x10 : DJNZ nn\ninstructions[0x10] = function()\n{\n b = (b - 1) & 0xff;\n do_conditional_relative_jump(b !== 0);\n};\n// 0x11 : LD DE, nn\ninstructions[0x11] = function()\n{\n pc = (pc + 1) & 0xffff;\n e = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n d = core.mem_read(pc);\n};\n// 0x12 : LD (DE), A\ninstructions[0x12] = function()\n{\n core.mem_write(e | (d << 8), a);\n};\n// 0x13 : INC DE\ninstructions[0x13] = function()\n{\n var result = (e | (d << 8));\n result += 1;\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n};\n// 0x14 : INC D\ninstructions[0x14] = function()\n{\n d = do_inc(d);\n};\n// 0x15 : DEC D\ninstructions[0x15] = function()\n{\n d = do_dec(d);\n};\n// 0x16 : LD D, n\ninstructions[0x16] = function()\n{\n pc = (pc + 1) & 0xffff;\n d = core.mem_read(pc);\n};\n// 0x17 : RLA\ninstructions[0x17] = function()\n{\n var temp_s = flags.S, temp_z = flags.Z, temp_p = flags.P;\n a = do_rl(a);\n flags.S = temp_s;\n flags.Z = temp_z;\n flags.P = temp_p;\n};\n// 0x18 : JR n\ninstructions[0x18] = function()\n{\n var offset = get_signed_offset_byte(core.mem_read((pc + 1) & 0xffff));\n pc = (pc + offset + 1) & 0xffff;\n};\n// 0x19 : ADD HL, DE\ninstructions[0x19] = function()\n{\n do_hl_add(e | (d << 8));\n};\n// 0x1a : LD A, (DE)\ninstructions[0x1a] = function()\n{\n a = core.mem_read(e | (d << 8));\n};\n// 0x1b : DEC DE\ninstructions[0x1b] = function()\n{\n var result = (e | (d << 8));\n result -= 1;\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n};\n// 0x1c : INC E\ninstructions[0x1c] = function()\n{\n e = do_inc(e);\n};\n// 0x1d : DEC E\ninstructions[0x1d] = function()\n{\n e = do_dec(e);\n};\n// 0x1e : LD E, n\ninstructions[0x1e] = function()\n{\n pc = (pc + 1) & 0xffff;\n e = core.mem_read(pc);\n};\n// 0x1f : RRA\ninstructions[0x1f] = function()\n{\n var temp_s = flags.S, temp_z = flags.Z, temp_p = flags.P;\n a = do_rr(a);\n flags.S = temp_s;\n flags.Z = temp_z;\n flags.P = temp_p;\n};\n// 0x20 : JR NZ, n\ninstructions[0x20] = function()\n{\n do_conditional_relative_jump(!flags.Z);\n};\n// 0x21 : LD HL, nn\ninstructions[0x21] = function()\n{\n pc = (pc + 1) & 0xffff;\n l = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n h = core.mem_read(pc);\n};\n// 0x22 : LD (nn), HL\ninstructions[0x22] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, l);\n core.mem_write((address + 1) & 0xffff, h);\n};\n// 0x23 : INC HL\ninstructions[0x23] = function()\n{\n var result = (l | (h << 8));\n result += 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n};\n// 0x24 : INC H\ninstructions[0x24] = function()\n{\n h = do_inc(h);\n};\n// 0x25 : DEC H\ninstructions[0x25] = function()\n{\n h = do_dec(h);\n};\n// 0x26 : LD H, n\ninstructions[0x26] = function()\n{\n pc = (pc + 1) & 0xffff;\n h = core.mem_read(pc);\n};\n// 0x27 : DAA\ninstructions[0x27] = function()\n{\n var temp = a;\n if (!flags.N)\n {\n if (flags.H || ((a & 0x0f) > 9))\n temp += 0x06;\n if (flags.C || (a > 0x99))\n temp += 0x60;\n }\n else\n {\n if (flags.H || ((a & 0x0f) > 9))\n temp -= 0x06;\n if (flags.C || (a > 0x99))\n temp -= 0x60;\n }\n \n flags.S = (temp & 0x80) ? 1 : 0;\n flags.Z = !(temp & 0xff) ? 1 : 0;\n flags.H = ((a & 0x10) ^ (temp & 0x10)) ? 1 : 0;\n flags.P = get_parity(temp & 0xff);\n // DAA never clears the carry flag if it was already set,\n // but it is able to set the carry flag if it was clear.\n // Don't ask me, I don't know.\n // Note also that we check for a BCD carry, instead of the usual.\n flags.C = (flags.C || (a > 0x99)) ? 1 : 0;\n \n a = temp & 0xff;\n \n update_xy_flags(a);\n};\n// 0x28 : JR Z, n\ninstructions[0x28] = function()\n{\n do_conditional_relative_jump(!!flags.Z);\n};\n// 0x29 : ADD HL, HL\ninstructions[0x29] = function()\n{\n do_hl_add(l | (h << 8));\n};\n// 0x2a : LD HL, (nn)\ninstructions[0x2a] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n l = core.mem_read(address);\n h = core.mem_read((address + 1) & 0xffff);\n};\n// 0x2b : DEC HL\ninstructions[0x2b] = function()\n{\n var result = (l | (h << 8));\n result -= 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n};\n// 0x2c : INC L\ninstructions[0x2c] = function()\n{\n l = do_inc(l);\n};\n// 0x2d : DEC L\ninstructions[0x2d] = function()\n{\n l = do_dec(l);\n};\n// 0x2e : LD L, n\ninstructions[0x2e] = function()\n{\n pc = (pc + 1) & 0xffff;\n l = core.mem_read(pc);\n};\n// 0x2f : CPL\ninstructions[0x2f] = function()\n{\n a = (~a) & 0xff;\n flags.N = 1;\n flags.H = 1;\n update_xy_flags(a);\n};\n// 0x30 : JR NC, n\ninstructions[0x30] = function()\n{\n do_conditional_relative_jump(!flags.C);\n};\n// 0x31 : LD SP, nn\ninstructions[0x31] = function()\n{\n sp = core.mem_read((pc + 1) & 0xffff) | \n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc + 2) & 0xffff;\n};\n// 0x32 : LD (nn), A\ninstructions[0x32] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, a);\n};\n// 0x33 : INC SP\ninstructions[0x33] = function()\n{\n sp = (sp + 1) & 0xffff;\n};\n// 0x34 : INC (HL)\ninstructions[0x34] = function()\n{\n var address = l | (h << 8);\n core.mem_write(address, do_inc(core.mem_read(address)));\n};\n// 0x35 : DEC (HL)\ninstructions[0x35] = function()\n{\n var address = l | (h << 8);\n core.mem_write(address, do_dec(core.mem_read(address)));\n};\n// 0x36 : LD (HL), n\ninstructions[0x36] = function()\n{\n pc = (pc + 1) & 0xffff;\n core.mem_write(l | (h << 8), core.mem_read(pc));\n};\n// 0x37 : SCF\ninstructions[0x37] = function()\n{\n flags.N = 0;\n flags.H = 0;\n flags.C = 1;\n update_xy_flags(a);\n};\n// 0x38 : JR C, n\ninstructions[0x38] = function()\n{\n do_conditional_relative_jump(!!flags.C);\n};\n// 0x39 : ADD HL, SP\ninstructions[0x39] = function()\n{\n do_hl_add(sp);\n};\n// 0x3a : LD A, (nn)\ninstructions[0x3a] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n a = core.mem_read(address);\n};\n// 0x3b : DEC SP\ninstructions[0x3b] = function()\n{\n sp = (sp - 1) & 0xffff;\n};\n// 0x3c : INC A\ninstructions[0x3c] = function()\n{\n a = do_inc(a);\n};\n// 0x3d : DEC A\ninstructions[0x3d] = function()\n{\n a = do_dec(a);\n};\n// 0x3e : LD A, n\ninstructions[0x3e] = function()\n{\n a = core.mem_read((pc + 1) & 0xffff);\n pc = (pc + 1) & 0xffff;\n};\n// 0x3f : CCF\ninstructions[0x3f] = function()\n{\n flags.N = 0;\n flags.H = flags.C;\n flags.C = flags.C ? 0 : 1;\n update_xy_flags(a);\n};\n// 0xc0 : RET NZ\ninstructions[0xc0] = function()\n{\n do_conditional_return(!flags.Z);\n};\n// 0xc1 : POP BC\ninstructions[0xc1] = function()\n{\n var result = pop_word();\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n};\n// 0xc2 : JP NZ, nn\ninstructions[0xc2] = function()\n{\n do_conditional_absolute_jump(!flags.Z);\n};\n// 0xc3 : JP nn\ninstructions[0xc3] = function()\n{\n pc = core.mem_read((pc + 1) & 0xffff) |\n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc - 1) & 0xffff;\n};\n// 0xc4 : CALL NZ, nn\ninstructions[0xc4] = function()\n{\n do_conditional_call(!flags.Z);\n};\n// 0xc5 : PUSH BC\ninstructions[0xc5] = function()\n{\n push_word(c | (b << 8));\n};\n// 0xc6 : ADD A, n\ninstructions[0xc6] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_add(core.mem_read(pc));\n};\n// 0xc7 : RST 00h\ninstructions[0xc7] = function()\n{\n do_reset(0x00);\n};\n// 0xc8 : RET Z\ninstructions[0xc8] = function()\n{\n do_conditional_return(!!flags.Z);\n};\n// 0xc9 : RET\ninstructions[0xc9] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n};\n// 0xca : JP Z, nn\ninstructions[0xca] = function()\n{\n do_conditional_absolute_jump(!!flags.Z);\n};\n// 0xcb : CB Prefix\ninstructions[0xcb] = function()\n{\n // R is incremented at the start of the second instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n\n // We don't have a table for this prefix,\n // the instructions are all so uniform that we can directly decode them.\n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc),\n bit_number = (opcode & 0x38) >>> 3,\n reg_code = opcode & 0x07;\n \n if (opcode < 0x40)\n {\n // Shift/rotate instructions\n var op_array = [do_rlc, do_rrc, do_rl, do_rr,\n do_sla, do_sra, do_sll, do_srl];\n \n if (reg_code === 0)\n b = op_array[bit_number]( b);\n else if (reg_code === 1)\n c = op_array[bit_number]( c);\n else if (reg_code === 2)\n d = op_array[bit_number]( d);\n else if (reg_code === 3)\n e = op_array[bit_number]( e);\n else if (reg_code === 4)\n h = op_array[bit_number]( h);\n else if (reg_code === 5)\n l = op_array[bit_number]( l);\n else if (reg_code === 6)\n core.mem_write(l | (h << 8),\n op_array[bit_number]( core.mem_read(l | (h << 8))));\n else if (reg_code === 7)\n a = op_array[bit_number]( a);\n }\n else if (opcode < 0x80)\n {\n // BIT instructions\n if (reg_code === 0)\n flags.Z = !(b & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 1)\n flags.Z = !(c & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 2)\n flags.Z = !(d & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 3)\n flags.Z = !(e & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 4)\n flags.Z = !(h & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 5)\n flags.Z = !(l & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 6)\n flags.Z = !((core.mem_read(l | (h << 8))) & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 7)\n flags.Z = !(a & (1 << bit_number)) ? 1 : 0;\n \n flags.N = 0;\n flags.H = 1;\n flags.P = flags.Z;\n flags.S = ((bit_number === 7) && !flags.Z) ? 1 : 0;\n // For the BIT n, (HL) instruction, the X and Y flags are obtained\n // from what is apparently an internal temporary register used for\n // some of the 16-bit arithmetic instructions.\n // I haven't implemented that register here,\n // so for now we'll set X and Y the same way for every BIT opcode,\n // which means that they will usually be wrong for BIT n, (HL).\n flags.Y = ((bit_number === 5) && !flags.Z) ? 1 : 0;\n flags.X = ((bit_number === 3) && !flags.Z) ? 1 : 0;\n }\n else if (opcode < 0xc0)\n {\n // RES instructions\n if (reg_code === 0)\n b &= (0xff & ~(1 << bit_number));\n else if (reg_code === 1)\n c &= (0xff & ~(1 << bit_number));\n else if (reg_code === 2)\n d &= (0xff & ~(1 << bit_number));\n else if (reg_code === 3)\n e &= (0xff & ~(1 << bit_number));\n else if (reg_code === 4)\n h &= (0xff & ~(1 << bit_number));\n else if (reg_code === 5)\n l &= (0xff & ~(1 << bit_number));\n else if (reg_code === 6)\n core.mem_write(l | (h << 8),\n core.mem_read(l | (h << 8)) & ~(1 << bit_number));\n else if (reg_code === 7)\n a &= (0xff & ~(1 << bit_number));\n }\n else\n {\n // SET instructions\n if (reg_code === 0)\n b |= (1 << bit_number);\n else if (reg_code === 1)\n c |= (1 << bit_number);\n else if (reg_code === 2)\n d |= (1 << bit_number);\n else if (reg_code === 3)\n e |= (1 << bit_number);\n else if (reg_code === 4)\n h |= (1 << bit_number);\n else if (reg_code === 5)\n l |= (1 << bit_number);\n else if (reg_code === 6)\n core.mem_write(l | (h << 8),\n core.mem_read(l | (h << 8)) | (1 << bit_number));\n else if (reg_code === 7)\n a |= (1 << bit_number);\n }\n \n cycle_counter += cycle_counts_cb[opcode];\n};\n// 0xcc : CALL Z, nn\ninstructions[0xcc] = function()\n{\n do_conditional_call(!!flags.Z);\n};\n// 0xcd : CALL nn\ninstructions[0xcd] = function()\n{\n push_word((pc + 3) & 0xffff);\n pc = core.mem_read((pc + 1) & 0xffff) |\n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc - 1) & 0xffff;\n};\n// 0xce : ADC A, n\ninstructions[0xce] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_adc(core.mem_read(pc));\n};\n// 0xcf : RST 08h\ninstructions[0xcf] = function()\n{\n do_reset(0x08);\n};\n// 0xd0 : RET NC\ninstructions[0xd0] = function()\n{\n do_conditional_return(!flags.C);\n};\n// 0xd1 : POP DE\ninstructions[0xd1] = function()\n{\n var result = pop_word();\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n};\n// 0xd2 : JP NC, nn\ninstructions[0xd2] = function()\n{\n do_conditional_absolute_jump(!flags.C);\n};\n// 0xd3 : OUT (n), A\ninstructions[0xd3] = function()\n{\n pc = (pc + 1) & 0xffff;\n core.io_write((a << 8) | core.mem_read(pc), a);\n};\n// 0xd4 : CALL NC, nn\ninstructions[0xd4] = function()\n{\n do_conditional_call(!flags.C);\n};\n// 0xd5 : PUSH DE\ninstructions[0xd5] = function()\n{\n push_word(e | (d << 8));\n};\n// 0xd6 : SUB n\ninstructions[0xd6] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_sub(core.mem_read(pc));\n};\n// 0xd7 : RST 10h\ninstructions[0xd7] = function()\n{\n do_reset(0x10);\n};\n// 0xd8 : RET C\ninstructions[0xd8] = function()\n{\n do_conditional_return(!!flags.C);\n};\n// 0xd9 : EXX\ninstructions[0xd9] = function()\n{\n var temp = b;\n b = b_prime;\n b_prime = temp;\n temp = c;\n c = c_prime;\n c_prime = temp;\n temp = d;\n d = d_prime;\n d_prime = temp;\n temp = e;\n e = e_prime;\n e_prime = temp;\n temp = h;\n h = h_prime;\n h_prime = temp;\n temp = l;\n l = l_prime;\n l_prime = temp;\n};\n// 0xda : JP C, nn\ninstructions[0xda] = function()\n{\n do_conditional_absolute_jump(!!flags.C);\n};\n// 0xdb : IN A, (n)\ninstructions[0xdb] = function()\n{\n pc = (pc + 1) & 0xffff;\n a = core.io_read((a << 8) | core.mem_read(pc));\n};\n// 0xdc : CALL C, nn\ninstructions[0xdc] = function()\n{\n do_conditional_call(!!flags.C);\n};\n// 0xdd : DD Prefix (IX instructions)\ninstructions[0xdd] = function()\n{\n // R is incremented at the start of the second instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n\n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc),\n func = dd_instructions[opcode];\n \n if (func)\n {\n //func = func.bind(this);\n func();\n cycle_counter += cycle_counts_dd[opcode];\n }\n else\n {\n // Apparently if a DD opcode doesn't exist,\n // it gets treated as an unprefixed opcode.\n // What we'll do to handle that is just back up the \n // program counter, so that this byte gets decoded\n // as a normal instruction.\n pc = (pc - 1) & 0xffff;\n // And we'll add in the cycle count for a NOP.\n cycle_counter += cycle_counts[0];\n }\n};\n// 0xde : SBC n\ninstructions[0xde] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_sbc(core.mem_read(pc));\n};\n// 0xdf : RST 18h\ninstructions[0xdf] = function()\n{\n do_reset(0x18);\n};\n// 0xe0 : RET PO\ninstructions[0xe0] = function()\n{\n do_conditional_return(!flags.P);\n};\n// 0xe1 : POP HL\ninstructions[0xe1] = function()\n{\n var result = pop_word();\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n};\n// 0xe2 : JP PO, (nn)\ninstructions[0xe2] = function()\n{\n do_conditional_absolute_jump(!flags.P);\n};\n// 0xe3 : EX (SP), HL\ninstructions[0xe3] = function()\n{\n var temp = core.mem_read(sp);\n core.mem_write(sp, l);\n l = temp;\n temp = core.mem_read((sp + 1) & 0xffff);\n core.mem_write((sp + 1) & 0xffff, h);\n h = temp;\n};\n// 0xe4 : CALL PO, nn\ninstructions[0xe4] = function()\n{\n do_conditional_call(!flags.P);\n};\n// 0xe5 : PUSH HL\ninstructions[0xe5] = function()\n{\n push_word(l | (h << 8));\n};\n// 0xe6 : AND n\ninstructions[0xe6] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_and(core.mem_read(pc));\n};\n// 0xe7 : RST 20h\ninstructions[0xe7] = function()\n{\n do_reset(0x20);\n};\n// 0xe8 : RET PE\ninstructions[0xe8] = function()\n{\n do_conditional_return(!!flags.P);\n};\n// 0xe9 : JP (HL)\ninstructions[0xe9] = function()\n{\n pc = l | (h << 8);\n pc = (pc - 1) & 0xffff;\n};\n// 0xea : JP PE, nn\ninstructions[0xea] = function()\n{\n do_conditional_absolute_jump(!!flags.P);\n};\n// 0xeb : EX DE, HL\ninstructions[0xeb] = function()\n{\n var temp = d;\n d = h;\n h = temp;\n temp = e;\n e = l;\n l = temp;\n};\n// 0xec : CALL PE, nn\ninstructions[0xec] = function()\n{\n do_conditional_call(!!flags.P);\n};\n// 0xed : ED Prefix\ninstructions[0xed] = function()\n{\n // R is incremented at the start of the second instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n\n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc),\n func = ed_instructions[opcode];\n \n if (func)\n {\n //func = func.bind(this);\n func();\n cycle_counter += cycle_counts_ed[opcode];\n }\n else\n {\n // If the opcode didn't exist, the whole thing is a two-byte NOP.\n cycle_counter += cycle_counts[0];\n }\n};\n// 0xee : XOR n\ninstructions[0xee] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_xor(core.mem_read(pc));\n};\n// 0xef : RST 28h\ninstructions[0xef] = function()\n{\n do_reset(0x28);\n};\n// 0xf0 : RET P\ninstructions[0xf0] = function()\n{\n do_conditional_return(!flags.S);\n};\n// 0xf1 : POP AF\ninstructions[0xf1] = function()\n{\n var result = pop_word();\n set_flags_register(result & 0xff);\n a = (result & 0xff00) >>> 8;\n};\n// 0xf2 : JP P, nn\ninstructions[0xf2] = function()\n{\n do_conditional_absolute_jump(!flags.S);\n};\n// 0xf3 : DI\ninstructions[0xf3] = function()\n{\n // DI doesn't actually take effect until after the next instruction.\n do_delayed_di = true;\n};\n// 0xf4 : CALL P, nn\ninstructions[0xf4] = function()\n{\n do_conditional_call(!flags.S);\n};\n// 0xf5 : PUSH AF\ninstructions[0xf5] = function()\n{\n push_word(get_flags_register() | (a << 8));\n};\n// 0xf6 : OR n\ninstructions[0xf6] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_or(core.mem_read(pc));\n};\n// 0xf7 : RST 30h\ninstructions[0xf7] = function()\n{\n do_reset(0x30);\n};\n// 0xf8 : RET M\ninstructions[0xf8] = function()\n{\n do_conditional_return(!!flags.S);\n};\n// 0xf9 : LD SP, HL\ninstructions[0xf9] = function()\n{\n sp = l | (h << 8);\n};\n// 0xfa : JP M, nn\ninstructions[0xfa] = function()\n{\n do_conditional_absolute_jump(!!flags.S);\n};\n// 0xfb : EI\ninstructions[0xfb] = function()\n{\n // EI doesn't actually take effect until after the next instruction.\n do_delayed_ei = true;\n};\n// 0xfc : CALL M, nn\ninstructions[0xfc] = function()\n{\n do_conditional_call(!!flags.S);\n};\n// 0xfd : FD Prefix (IY instructions)\ninstructions[0xfd] = function()\n{\n // R is incremented at the start of the second instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n \n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc),\n func = dd_instructions[opcode];\n \n if (func)\n {\n // Rather than copy and paste all the IX instructions into IY instructions,\n // what we'll do is sneakily copy IY into IX, run the IX instruction,\n // and then copy the result into IY and restore the old IX.\n var temp = ix;\n ix = iy;\n //func = func.bind(this);\n func();\n iy = ix;\n ix = temp;\n \n cycle_counter += cycle_counts_dd[opcode];\n }\n else\n {\n // Apparently if an FD opcode doesn't exist,\n // it gets treated as an unprefixed opcode.\n // What we'll do to handle that is just back up the \n // program counter, so that this byte gets decoded\n // as a normal instruction.\n pc = (pc - 1) & 0xffff;\n // And we'll add in the cycle count for a NOP.\n cycle_counter += cycle_counts[0];\n }\n};\n// 0xfe : CP n\ninstructions[0xfe] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_cp(core.mem_read(pc));\n};\n// 0xff : RST 38h\ninstructions[0xff] = function()\n{\n do_reset(0x38);\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n/// This table of ED opcodes is pretty sparse;\n/// there are not very many valid ED-prefixed opcodes in the Z80,\n/// and many of the ones that are valid are not documented.\n///////////////////////////////////////////////////////////////////////////////\nlet ed_instructions = [];\n// 0x40 : IN B, (C)\ned_instructions[0x40] = function()\n{\n b = do_in((b << 8) | c);\n};\n// 0x41 : OUT (C), B\ned_instructions[0x41] = function()\n{\n core.io_write((b << 8) | c, b);\n};\n// 0x42 : SBC HL, BC\ned_instructions[0x42] = function()\n{\n do_hl_sbc(c | (b << 8));\n};\n// 0x43 : LD (nn), BC\ned_instructions[0x43] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, c);\n core.mem_write((address + 1) & 0xffff, b);\n};\n// 0x44 : NEG\ned_instructions[0x44] = function()\n{\n do_neg();\n};\n// 0x45 : RETN\ned_instructions[0x45] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x46 : IM 0\ned_instructions[0x46] = function()\n{\n imode = 0;\n};\n// 0x47 : LD I, A\ned_instructions[0x47] = function()\n{\n i = a\n};\n// 0x48 : IN C, (C)\ned_instructions[0x48] = function()\n{\n c = do_in((b << 8) | c);\n};\n// 0x49 : OUT (C), C\ned_instructions[0x49] = function()\n{\n core.io_write((b << 8) | c, c);\n};\n// 0x4a : ADC HL, BC\ned_instructions[0x4a] = function()\n{\n do_hl_adc(c | (b << 8));\n};\n// 0x4b : LD BC, (nn)\ned_instructions[0x4b] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n c = core.mem_read(address);\n b = core.mem_read((address + 1) & 0xffff);\n};\n// 0x4c : NEG (Undocumented)\ned_instructions[0x4c] = function()\n{\n do_neg();\n};\n// 0x4d : RETI\ned_instructions[0x4d] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n};\n// 0x4e : IM 0 (Undocumented)\ned_instructions[0x4e] = function()\n{\n imode = 0;\n};\n// 0x4f : LD R, A\ned_instructions[0x4f] = function()\n{\n r = a;\n};\n// 0x50 : IN D, (C)\ned_instructions[0x50] = function()\n{\n d = do_in((b << 8) | c);\n};\n// 0x51 : OUT (C), D\ned_instructions[0x51] = function()\n{\n core.io_write((b << 8) | c, d);\n};\n// 0x52 : SBC HL, DE\ned_instructions[0x52] = function()\n{\n do_hl_sbc(e | (d << 8));\n};\n// 0x53 : LD (nn), DE\ned_instructions[0x53] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, e);\n core.mem_write((address + 1) & 0xffff, d);\n};\n// 0x54 : NEG (Undocumented)\ned_instructions[0x54] = function()\n{\n do_neg();\n};\n// 0x55 : RETN\ned_instructions[0x55] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x56 : IM 1\ned_instructions[0x56] = function()\n{\n imode = 1;\n};\n// 0x57 : LD A, I\ned_instructions[0x57] = function()\n{\n a = i;\n flags.S = a & 0x80 ? 1 : 0;\n flags.Z = a ? 0 : 1;\n flags.H = 0;\n flags.P = iff2;\n flags.N = 0;\n update_xy_flags(a);\n};\n// 0x58 : IN E, (C)\ned_instructions[0x58] = function()\n{\n e = do_in((b << 8) | c);\n};\n// 0x59 : OUT (C), E\ned_instructions[0x59] = function()\n{\n core.io_write((b << 8) | c, e);\n};\n// 0x5a : ADC HL, DE\ned_instructions[0x5a] = function()\n{\n do_hl_adc(e | (d << 8));\n};\n// 0x5b : LD DE, (nn)\ned_instructions[0x5b] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n e = core.mem_read(address);\n d = core.mem_read((address + 1) & 0xffff);\n};\n// 0x5c : NEG (Undocumented)\ned_instructions[0x5c] = function()\n{\n do_neg();\n};\n// 0x5d : RETN\ned_instructions[0x5d] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x5e : IM 2\ned_instructions[0x5e] = function()\n{\n imode = 2;\n};\n// 0x5f : LD A, R\ned_instructions[0x5f] = function()\n{\n a = r;\n flags.S = a & 0x80 ? 1 : 0;\n flags.Z = a ? 0 : 1;\n flags.H = 0;\n flags.P = iff2;\n flags.N = 0;\n update_xy_flags(a);\n};\n// 0x60 : IN H, (C)\ned_instructions[0x60] = function()\n{\n h = do_in((b << 8) | c);\n};\n// 0x61 : OUT (C), H\ned_instructions[0x61] = function()\n{\n core.io_write((b << 8) | c, h);\n};\n// 0x62 : SBC HL, HL\ned_instructions[0x62] = function()\n{\n do_hl_sbc(l | (h << 8));\n};\n// 0x63 : LD (nn), HL (Undocumented)\ned_instructions[0x63] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, l);\n core.mem_write((address + 1) & 0xffff, h);\n};\n// 0x64 : NEG (Undocumented)\ned_instructions[0x64] = function()\n{\n do_neg();\n};\n// 0x65 : RETN\ned_instructions[0x65] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x66 : IM 0\ned_instructions[0x66] = function()\n{\n imode = 0;\n};\n// 0x67 : RRD\ned_instructions[0x67] = function()\n{\n var hl_value = core.mem_read(l | (h << 8));\n var temp1 = hl_value & 0x0f, temp2 = a & 0x0f;\n hl_value = ((hl_value & 0xf0) >>> 4) | (temp2 << 4);\n a = (a & 0xf0) | temp1;\n core.mem_write(l | (h << 8), hl_value);\n \n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = a ? 0 : 1;\n flags.H = 0;\n flags.P = get_parity(a) ? 1 : 0;\n flags.N = 0;\n update_xy_flags(a);\n};\n// 0x68 : IN L, (C)\ned_instructions[0x68] = function()\n{\n l = do_in((b << 8) | c);\n};\n// 0x69 : OUT (C), L\ned_instructions[0x69] = function()\n{\n core.io_write((b << 8) | c, l);\n};\n// 0x6a : ADC HL, HL\ned_instructions[0x6a] = function()\n{\n do_hl_adc(l | (h << 8));\n};\n// 0x6b : LD HL, (nn) (Undocumented)\ned_instructions[0x6b] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n l = core.mem_read(address);\n h = core.mem_read((address + 1) & 0xffff);\n};\n// 0x6c : NEG (Undocumented)\ned_instructions[0x6c] = function()\n{\n do_neg();\n};\n// 0x6d : RETN\ned_instructions[0x6d] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x6e : IM 0 (Undocumented)\ned_instructions[0x6e] = function()\n{\n imode = 0;\n};\n// 0x6f : RLD\ned_instructions[0x6f] = function()\n{\n var hl_value = core.mem_read(l | (h << 8));\n var temp1 = hl_value & 0xf0, temp2 = a & 0x0f;\n hl_value = ((hl_value & 0x0f) << 4) | temp2;\n a = (a & 0xf0) | (temp1 >>> 4);\n core.mem_write(l | (h << 8), hl_value);\n \n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = a ? 0 : 1;\n flags.H = 0;\n flags.P = get_parity(a) ? 1 : 0;\n flags.N = 0;\n update_xy_flags(a);\n};\n// 0x70 : IN (C) (Undocumented)\ned_instructions[0x70] = function()\n{\n do_in((b << 8) | c);\n};\n// 0x71 : OUT (C), 0 (Undocumented)\ned_instructions[0x71] = function()\n{\n core.io_write((b << 8) | c, 0);\n};\n// 0x72 : SBC HL, SP\ned_instructions[0x72] = function()\n{\n do_hl_sbc(sp);\n};\n// 0x73 : LD (nn), SP\ned_instructions[0x73] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, sp & 0xff);\n core.mem_write((address + 1) & 0xffff, (sp >>> 8) & 0xff);\n};\n// 0x74 : NEG (Undocumented)\ned_instructions[0x74] = function()\n{\n do_neg();\n};\n// 0x75 : RETN\ned_instructions[0x75] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x76 : IM 1\ned_instructions[0x76] = function()\n{\n imode = 1;\n};\n// 0x78 : IN A, (C)\ned_instructions[0x78] = function()\n{\n a = do_in((b << 8) | c);\n};\n// 0x79 : OUT (C), A\ned_instructions[0x79] = function()\n{\n core.io_write((b << 8) | c, a);\n};\n// 0x7a : ADC HL, SP\ned_instructions[0x7a] = function()\n{\n do_hl_adc(sp);\n};\n// 0x7b : LD SP, (nn)\ned_instructions[0x7b] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n sp = core.mem_read(address);\n sp |= core.mem_read((address + 1) & 0xffff) << 8;\n};\n// 0x7c : NEG (Undocumented)\ned_instructions[0x7c] = function()\n{\n do_neg();\n};\n// 0x7d : RETN\ned_instructions[0x7d] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x7e : IM 2\ned_instructions[0x7e] = function()\n{\n imode = 2;\n};\n// 0xa0 : LDI\ned_instructions[0xa0] = function()\n{\n do_ldi();\n};\n// 0xa1 : CPI\ned_instructions[0xa1] = function()\n{\n do_cpi();\n};\n// 0xa2 : INI\ned_instructions[0xa2] = function()\n{\n do_ini();\n};\n// 0xa3 : OUTI\ned_instructions[0xa3] = function()\n{\n do_outi();\n};\n// 0xa8 : LDD\ned_instructions[0xa8] = function()\n{\n do_ldd();\n};\n// 0xa9 : CPD\ned_instructions[0xa9] = function()\n{\n do_cpd();\n};\n// 0xaa : IND\ned_instructions[0xaa] = function()\n{\n do_ind();\n};\n// 0xab : OUTD\ned_instructions[0xab] = function()\n{\n do_outd();\n};\n// 0xb0 : LDIR\ned_instructions[0xb0] = function()\n{\n do_ldi();\n if (b || c)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb1 : CPIR\ned_instructions[0xb1] = function()\n{\n do_cpi();\n if (!flags.Z && (b || c))\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb2 : INIR\ned_instructions[0xb2] = function()\n{\n do_ini();\n if (b)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb3 : OTIR\ned_instructions[0xb3] = function()\n{\n do_outi();\n if (b)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb8 : LDDR\ned_instructions[0xb8] = function()\n{\n do_ldd();\n if (b || c)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb9 : CPDR\ned_instructions[0xb9] = function()\n{\n do_cpd();\n if (!flags.Z && (b || c))\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xba : INDR\ned_instructions[0xba] = function()\n{\n do_ind();\n if (b)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xbb : OTDR\ned_instructions[0xbb] = function()\n{\n do_outd();\n if (b)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n/// Like ED, this table is quite sparse,\n/// and many of the opcodes here are also undocumented.\n/// The undocumented instructions here are those that deal with only one byte\n/// of the two-byte IX register; the bytes are designed IXH and IXL here.\n///////////////////////////////////////////////////////////////////////////////\nlet dd_instructions = [];\n// 0x09 : ADD IX, BC\ndd_instructions[0x09] = function()\n{\n do_ix_add(c | (b << 8));\n};\n// 0x19 : ADD IX, DE\ndd_instructions[0x19] = function()\n{\n do_ix_add(e | (d << 8));\n};\n// 0x21 : LD IX, nn\ndd_instructions[0x21] = function()\n{\n pc = (pc + 1) & 0xffff;\n ix = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n ix |= (core.mem_read(pc) << 8);\n};\n// 0x22 : LD (nn), IX\ndd_instructions[0x22] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= (core.mem_read(pc) << 8);\n \n core.mem_write(address, ix & 0xff);\n core.mem_write((address + 1) & 0xffff, (ix >>> 8) & 0xff);\n};\n// 0x23 : INC IX\ndd_instructions[0x23] = function()\n{\n ix = (ix + 1) & 0xffff;\n};\n// 0x24 : INC IXH (Undocumented)\ndd_instructions[0x24] = function()\n{\n ix = (do_inc(ix >>> 8) << 8) | (ix & 0xff);\n};\n// 0x25 : DEC IXH (Undocumented)\ndd_instructions[0x25] = function()\n{\n ix = (do_dec(ix >>> 8) << 8) | (ix & 0xff);\n};\n// 0x26 : LD IXH, n (Undocumented)\ndd_instructions[0x26] = function()\n{\n pc = (pc + 1) & 0xffff;\n ix = (core.mem_read(pc) << 8) | (ix & 0xff);\n};\n// 0x29 : ADD IX, IX\ndd_instructions[0x29] = function()\n{\n do_ix_add(ix);\n};\n// 0x2a : LD IX, (nn)\ndd_instructions[0x2a] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= (core.mem_read(pc) << 8);\n \n ix = core.mem_read(address);\n ix |= (core.mem_read((address + 1) & 0xffff) << 8);\n};\n// 0x2b : DEC IX\ndd_instructions[0x2b] = function()\n{\n ix = (ix - 1) & 0xffff;\n};\n// 0x2c : INC IXL (Undocumented)\ndd_instructions[0x2c] = function()\n{\n ix = do_inc(ix & 0xff) | (ix & 0xff00);\n};\n// 0x2d : DEC IXL (Undocumented)\ndd_instructions[0x2d] = function()\n{\n ix = do_dec(ix & 0xff) | (ix & 0xff00);\n};\n// 0x2e : LD IXL, n (Undocumented)\ndd_instructions[0x2e] = function()\n{\n pc = (pc + 1) & 0xffff;\n ix = (core.mem_read(pc) & 0xff) | (ix & 0xff00);\n};\n// 0x34 : INC (IX+n)\ndd_instructions[0x34] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc)),\n value = core.mem_read((offset + ix) & 0xffff);\n core.mem_write((offset + ix) & 0xffff, do_inc(value));\n};\n// 0x35 : DEC (IX+n)\ndd_instructions[0x35] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc)),\n value = core.mem_read((offset + ix) & 0xffff);\n core.mem_write((offset + ix) & 0xffff, do_dec(value));\n};\n// 0x36 : LD (IX+n), n\ndd_instructions[0x36] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n pc = (pc + 1) & 0xffff;\n core.mem_write((ix + offset) & 0xffff, core.mem_read(pc)); \n};\n// 0x39 : ADD IX, SP\ndd_instructions[0x39] = function()\n{\n do_ix_add(sp);\n};\n// 0x44 : LD B, IXH (Undocumented)\ndd_instructions[0x44] = function()\n{\n b = (ix >>> 8) & 0xff;\n};\n// 0x45 : LD B, IXL (Undocumented)\ndd_instructions[0x45] = function()\n{\n b = ix & 0xff;\n};\n// 0x46 : LD B, (IX+n)\ndd_instructions[0x46] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n b = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x4c : LD C, IXH (Undocumented)\ndd_instructions[0x4c] = function()\n{\n c = (ix >>> 8) & 0xff;\n};\n// 0x4d : LD C, IXL (Undocumented)\ndd_instructions[0x4d] = function()\n{\n c = ix & 0xff;\n};\n// 0x4e : LD C, (IX+n)\ndd_instructions[0x4e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n c = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x54 : LD D, IXH (Undocumented)\ndd_instructions[0x54] = function()\n{\n d = (ix >>> 8) & 0xff;\n};\n// 0x55 : LD D, IXL (Undocumented)\ndd_instructions[0x55] = function()\n{\n d = ix & 0xff;\n};\n// 0x56 : LD D, (IX+n)\ndd_instructions[0x56] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n d = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x5c : LD E, IXH (Undocumented)\ndd_instructions[0x5c] = function()\n{\n e = (ix >>> 8) & 0xff;\n};\n// 0x5d : LD E, IXL (Undocumented)\ndd_instructions[0x5d] = function()\n{\n e = ix & 0xff;\n};\n// 0x5e : LD E, (IX+n)\ndd_instructions[0x5e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n e = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x60 : LD IXH, B (Undocumented)\ndd_instructions[0x60] = function()\n{\n ix = (ix & 0xff) | (b << 8);\n};\n// 0x61 : LD IXH, C (Undocumented)\ndd_instructions[0x61] = function()\n{\n ix = (ix & 0xff) | (c << 8);\n};\n// 0x62 : LD IXH, D (Undocumented)\ndd_instructions[0x62] = function()\n{\n ix = (ix & 0xff) | (d << 8);\n};\n// 0x63 : LD IXH, E (Undocumented)\ndd_instructions[0x63] = function()\n{\n ix = (ix & 0xff) | (e << 8);\n};\n// 0x64 : LD IXH, IXH (Undocumented)\ndd_instructions[0x64] = function()\n{\n // No-op.\n};\n// 0x65 : LD IXH, IXL (Undocumented)\ndd_instructions[0x65] = function()\n{\n ix = (ix & 0xff) | ((ix & 0xff) << 8);\n};\n// 0x66 : LD H, (IX+n)\ndd_instructions[0x66] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n h = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x67 : LD IXH, A (Undocumented)\ndd_instructions[0x67] = function()\n{\n ix = (ix & 0xff) | (a << 8);\n};\n// 0x68 : LD IXL, B (Undocumented)\ndd_instructions[0x68] = function()\n{\n ix = (ix & 0xff00) | b;\n};\n// 0x69 : LD IXL, C (Undocumented)\ndd_instructions[0x69] = function()\n{\n ix = (ix & 0xff00) | c;\n};\n// 0x6a : LD IXL, D (Undocumented)\ndd_instructions[0x6a] = function()\n{\n ix = (ix & 0xff00) | d;\n};\n// 0x6b : LD IXL, E (Undocumented)\ndd_instructions[0x6b] = function()\n{\n ix = (ix & 0xff00) | e;\n};\n// 0x6c : LD IXL, IXH (Undocumented)\ndd_instructions[0x6c] = function()\n{\n ix = (ix & 0xff00) | (ix >>> 8);\n};\n// 0x6d : LD IXL, IXL (Undocumented)\ndd_instructions[0x6d] = function()\n{\n // No-op.\n};\n// 0x6e : LD L, (IX+n)\ndd_instructions[0x6e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n l = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x6f : LD IXL, A (Undocumented)\ndd_instructions[0x6f] = function()\n{\n ix = (ix & 0xff00) | a;\n};\n// 0x70 : LD (IX+n), B\ndd_instructions[0x70] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, b);\n};\n// 0x71 : LD (IX+n), C\ndd_instructions[0x71] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, c);\n};\n// 0x72 : LD (IX+n), D\ndd_instructions[0x72] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, d);\n};\n// 0x73 : LD (IX+n), E\ndd_instructions[0x73] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, e);\n};\n// 0x74 : LD (IX+n), H\ndd_instructions[0x74] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, h);\n};\n// 0x75 : LD (IX+n), L\ndd_instructions[0x75] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, l);\n};\n// 0x77 : LD (IX+n), A\ndd_instructions[0x77] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, a);\n};\n// 0x7c : LD A, IXH (Undocumented)\ndd_instructions[0x7c] = function()\n{\n a = (ix >>> 8) & 0xff;\n};\n// 0x7d : LD A, IXL (Undocumented)\ndd_instructions[0x7d] = function()\n{\n a = ix & 0xff;\n};\n// 0x7e : LD A, (IX+n)\ndd_instructions[0x7e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n a = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x84 : ADD A, IXH (Undocumented)\ndd_instructions[0x84] = function()\n{\n do_add((ix >>> 8) & 0xff);\n};\n// 0x85 : ADD A, IXL (Undocumented)\ndd_instructions[0x85] = function()\n{\n do_add(ix & 0xff);\n};\n// 0x86 : ADD A, (IX+n)\ndd_instructions[0x86] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_add(core.mem_read((ix + offset) & 0xffff));\n};\n// 0x8c : ADC A, IXH (Undocumented)\ndd_instructions[0x8c] = function()\n{\n do_adc((ix >>> 8) & 0xff);\n};\n// 0x8d : ADC A, IXL (Undocumented)\ndd_instructions[0x8d] = function()\n{\n do_adc(ix & 0xff);\n};\n// 0x8e : ADC A, (IX+n)\ndd_instructions[0x8e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_adc(core.mem_read((ix + offset) & 0xffff));\n};\n// 0x94 : SUB IXH (Undocumented)\ndd_instructions[0x94] = function()\n{\n do_sub((ix >>> 8) & 0xff);\n};\n// 0x95 : SUB IXL (Undocumented)\ndd_instructions[0x95] = function()\n{\n do_sub(ix & 0xff);\n};\n// 0x96 : SUB A, (IX+n)\ndd_instructions[0x96] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_sub(core.mem_read((ix + offset) & 0xffff));\n};\n// 0x9c : SBC IXH (Undocumented)\ndd_instructions[0x9c] = function()\n{\n do_sbc((ix >>> 8) & 0xff);\n};\n// 0x9d : SBC IXL (Undocumented)\ndd_instructions[0x9d] = function()\n{\n do_sbc(ix & 0xff);\n};\n// 0x9e : SBC A, (IX+n)\ndd_instructions[0x9e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_sbc(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xa4 : AND IXH (Undocumented)\ndd_instructions[0xa4] = function()\n{\n do_and((ix >>> 8) & 0xff);\n};\n// 0xa5 : AND IXL (Undocumented)\ndd_instructions[0xa5] = function()\n{\n do_and(ix & 0xff);\n};\n// 0xa6 : AND A, (IX+n)\ndd_instructions[0xa6] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_and(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xac : XOR IXH (Undocumented)\ndd_instructions[0xac] = function()\n{\n do_xor((ix >>> 8) & 0xff);\n};\n// 0xad : XOR IXL (Undocumented)\ndd_instructions[0xad] = function()\n{\n do_xor(ix & 0xff);\n};\n// 0xae : XOR A, (IX+n)\ndd_instructions[0xae] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_xor(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xb4 : OR IXH (Undocumented)\ndd_instructions[0xb4] = function()\n{\n do_or((ix >>> 8) & 0xff);\n};\n// 0xb5 : OR IXL (Undocumented)\ndd_instructions[0xb5] = function()\n{\n do_or(ix & 0xff);\n};\n// 0xb6 : OR A, (IX+n)\ndd_instructions[0xb6] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_or(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xbc : CP IXH (Undocumented)\ndd_instructions[0xbc] = function()\n{\n do_cp((ix >>> 8) & 0xff);\n};\n// 0xbd : CP IXL (Undocumented)\ndd_instructions[0xbd] = function()\n{\n do_cp(ix & 0xff);\n};\n// 0xbe : CP A, (IX+n)\ndd_instructions[0xbe] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_cp(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xcb : CB Prefix (IX bit instructions)\ndd_instructions[0xcb] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc), value;\n \n // As with the \"normal\" CB prefix, we implement the DDCB prefix\n // by decoding the opcode directly, rather than using a table.\n if (opcode < 0x40)\n {\n // Shift and rotate instructions.\n var ddcb_functions = [do_rlc, do_rrc, do_rl, do_rr,\n do_sla, do_sra, do_sll, do_srl];\n \n // Most of the opcodes in this range are not valid,\n // so we map this opcode onto one of the ones that is.\n var func = ddcb_functions[(opcode & 0x38) >>> 3],\n value = func( core.mem_read((ix + offset) & 0xffff));\n \n core.mem_write((ix + offset) & 0xffff, value);\n }\n else\n {\n var bit_number = (opcode & 0x38) >>> 3;\n \n if (opcode < 0x80)\n {\n // BIT\n flags.N = 0;\n flags.H = 1;\n flags.Z = !(core.mem_read((ix + offset) & 0xffff) & (1 << bit_number)) ? 1 : 0;\n flags.P = flags.Z;\n flags.S = ((bit_number === 7) && !flags.Z) ? 1 : 0;\n }\n else if (opcode < 0xc0)\n {\n // RES\n value = core.mem_read((ix + offset) & 0xffff) & ~(1 << bit_number) & 0xff;\n core.mem_write((ix + offset) & 0xffff, value);\n }\n else\n {\n // SET\n value = core.mem_read((ix + offset) & 0xffff) | (1 << bit_number);\n core.mem_write((ix + offset) & 0xffff, value);\n }\n }\n \n // This implements the undocumented shift, RES, and SET opcodes,\n // which write their result to memory and also to an 8080 register.\n if (value !== undefined)\n {\n if ((opcode & 0x07) === 0)\n b = value;\n else if ((opcode & 0x07) === 1)\n c = value;\n else if ((opcode & 0x07) === 2)\n d = value;\n else if ((opcode & 0x07) === 3)\n e = value;\n else if ((opcode & 0x07) === 4)\n h = value;\n else if ((opcode & 0x07) === 5)\n l = value;\n // 6 is the documented opcode, which doesn't set a register.\n else if ((opcode & 0x07) === 7)\n a = value;\n }\n \n cycle_counter += cycle_counts_cb[opcode] + 8;\n};\n// 0xe1 : POP IX\ndd_instructions[0xe1] = function()\n{\n ix = pop_word();\n};\n// 0xe3 : EX (SP), IX\ndd_instructions[0xe3] = function()\n{\n var temp = ix;\n ix = core.mem_read(sp);\n ix |= core.mem_read((sp + 1) & 0xffff) << 8;\n core.mem_write(sp, temp & 0xff);\n core.mem_write((sp + 1) & 0xffff, (temp >>> 8) & 0xff);\n};\n// 0xe5 : PUSH IX\ndd_instructions[0xe5] = function()\n{\n push_word(ix);\n};\n// 0xe9 : JP (IX)\ndd_instructions[0xe9] = function()\n{\n pc = (ix - 1) & 0xffff;\n};\n// 0xf9 : LD SP, IX\ndd_instructions[0xf9] = function()\n{\n sp = ix;\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n/// These tables contain the number of T cycles used for each instruction.\n/// In a few special cases, such as conditional control flow instructions,\n/// additional cycles might be added to these values.\n/// The total number of cycles is the return value of run_instruction().\n///////////////////////////////////////////////////////////////////////////////\nlet cycle_counts = [\n 4, 10, 7, 6, 4, 4, 7, 4, 4, 11, 7, 6, 4, 4, 7, 4,\n 8, 10, 7, 6, 4, 4, 7, 4, 12, 11, 7, 6, 4, 4, 7, 4,\n 7, 10, 16, 6, 4, 4, 7, 4, 7, 11, 16, 6, 4, 4, 7, 4,\n 7, 10, 13, 6, 11, 11, 10, 4, 7, 11, 13, 6, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 5, 10, 10, 10, 10, 11, 7, 11, 5, 10, 10, 0, 10, 17, 7, 11,\n 5, 10, 10, 11, 10, 11, 7, 11, 5, 4, 10, 11, 10, 0, 7, 11,\n 5, 10, 10, 19, 10, 11, 7, 11, 5, 4, 10, 4, 10, 0, 7, 11,\n 5, 10, 10, 4, 10, 11, 7, 11, 5, 6, 10, 4, 10, 0, 7, 11\n];\n\nlet cycle_counts_ed = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 12, 12, 15, 20, 8, 14, 8, 9, 12, 12, 15, 20, 8, 14, 8, 9,\n 12, 12, 15, 20, 8, 14, 8, 9, 12, 12, 15, 20, 8, 14, 8, 9,\n 12, 12, 15, 20, 8, 14, 8, 18, 12, 12, 15, 20, 8, 14, 8, 18,\n 12, 12, 15, 20, 8, 14, 8, 0, 12, 12, 15, 20, 8, 14, 8, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 16, 16, 16, 16, 0, 0, 0, 0, 16, 16, 16, 16, 0, 0, 0, 0,\n 16, 16, 16, 16, 0, 0, 0, 0, 16, 16, 16, 16, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n];\n\nlet cycle_counts_cb = [\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 8, 8, 12, 8,\n 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 8, 8, 12, 8,\n 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 8, 8, 12, 8,\n 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 8, 8, 12, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8\n];\n\nlet cycle_counts_dd = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0,\n 0, 14, 20, 10, 8, 8, 11, 0, 0, 15, 20, 10, 8, 8, 11, 0,\n 0, 0, 0, 0, 23, 23, 19, 0, 0, 15, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 8, 8, 8, 8, 8, 8, 19, 8, 8, 8, 8, 8, 8, 8, 19, 8,\n 19, 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 14, 0, 23, 0, 15, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0\n];\n\n // There's tons of stuff in this object,\n // but only these three functions are the public API.\n this.saveState = getState;\n this.loadState = setState;\n this.reset = reset;\n this.advanceInsn = run_instruction;\n this.interrupt = interrupt;\n this.getPC = ():number => { return pc; }\n this.getSP = ():number => { return sp; }\n this.getHalted = ():boolean => { return halted; }\n}\n\nexport interface Z80State {\nAF : number;\nBC : number;\nDE : number;\nHL : number;\nAF_ : number;\nBC_ : number;\nDE_ : number;\nHL_ : number;\nIX : number;\nIY : number;\nSP : number;\nPC : number;\nIR : number;\niff1 : number;\niff2 : number;\nim : number;\nhalted : boolean;\ndo_delayed_di : boolean;\ndo_delayed_ei : boolean;\ncycle_counter : number;\n}\n\nexport class Z80 implements CPU, InstructionBased, IOBusConnected, SavesState, Interruptable {\n\n cpu;\n interruptType;\n memBus : Bus;\n ioBus : Bus;\n retryInterrupts : boolean = false;\n retryData : number = -1;\n \n private buildCPU() {\n if (this.memBus && this.ioBus) {\n this.cpu = new FastZ80({\n mem_read: this.memBus.read.bind(this.memBus),\n mem_write: this.memBus.write.bind(this.memBus),\n io_read: this.ioBus.read.bind(this.ioBus),\n io_write: this.ioBus.write.bind(this.ioBus),\n });\n }\n }\n connectMemoryBus(bus:Bus) {\n this.memBus = bus;\n this.buildCPU();\n }\n connectIOBus(bus:Bus) {\n this.ioBus = bus;\n this.buildCPU();\n }\n advanceInsn() {\n if (this.retryInterrupts && this.retryData >= 0 && this.cpu.interrupt(false, this.retryData)) {\n this.retryData = -1;\n }\n return this.cpu.advanceInsn();\n }\n reset() {\n this.cpu.reset();\n }\n interrupt(data:number) {\n if (!this.cpu.interrupt(false, data) && this.retryInterrupts) {\n this.retryData = data;\n }\n }\n NMI() {\n this.cpu.interrupt(true, 0);\n }\n getSP() {\n return this.cpu.getSP();\n }\n getPC() {\n return this.cpu.getPC();\n }\n isHalted() {\n return this.cpu.getHalted();\n }\n saveState() {\n return this.cpu.saveState();\n }\n loadState(s) {\n this.cpu.loadState(s);\n }\n isStable() { return true; }\n // TODO: metadata\n // TODO: disassembler\n}\n", "\nimport { SampledAudioSink } from \"./devices\";\n\n// from TSS\ndeclare var MasterChannel, AudioLooper, PsgDeviceChannel;\n\nexport class MasterAudio {\n master = new MasterChannel();\n looper;\n start() {\n if (!this.looper) {\n this.looper = new AudioLooper(512);\n this.looper.setChannel(this.master);\n this.looper.activate();\n }\n }\n stop() {\n if (this.looper) {\n this.looper.setChannel(null);\n this.looper = null;\n }\n }\n}\n\nexport class AY38910_Audio {\n master : MasterAudio;\n psg = new PsgDeviceChannel();\n curreg = 0;\n\n constructor(master : MasterAudio) {\n this.master = master;\n this.psg.setMode(PsgDeviceChannel.MODE_SIGNED);\n this.psg.setDevice(PsgDeviceChannel.DEVICE_AY_3_8910);\n master.master.addChannel(this.psg);\n }\n\n reset() {\n for (var i=15; i>=0; i--) {\n this.selectRegister(i);\n this.setData(0);\n }\n }\n selectRegister(val : number) {\n this.curreg = val & 0xf;\n }\n setData(val : number) {\n this.psg.writeRegisterAY(this.curreg, val & 0xff);\n }\n readData() {\n return this.psg.readRegister(this.curreg);\n }\n currentRegister() { return this.curreg; }\n}\n\nexport class SN76489_Audio {\n master : MasterAudio;\n psg = new PsgDeviceChannel();\n\n constructor(master : MasterAudio) {\n this.master = master;\n this.psg.setMode(PsgDeviceChannel.MODE_SIGNED);\n this.psg.setDevice(PsgDeviceChannel.DEVICE_SN76489);\n master.master.addChannel(this.psg);\n }\n reset() {\n // TODO\n }\n setData(val : number) {\n this.psg.writeRegisterSN(0, val & 0xff);\n }\n}\n\n// https://en.wikipedia.org/wiki/POKEY\n// https://user.xmission.com/~trevin/atari/pokey_regs.html\n// http://krap.pl/mirrorz/atari/homepage.ntlworld.com/kryten_droid/Atari/800XL/atari_hw/pokey.htm\n\nexport function newPOKEYAudio(count:number) {\n var audio = new MasterAudio();\n for (var i=1; i<=count; i++) {\n var pokey = new POKEYDeviceChannel();\n audio['pokey'+i] = pokey; // TODO: cheezy\n audio.master.addChannel(pokey);\n }\n return audio;\n}\n\nfunction combinePolys(a, b) {\n var arr = new Uint8Array(a.length * b.length);\n var n = 0;\n for (var i=0; i 0.5 ? 1 : 0;\n }\n var bit17_5 = combinePolys(bit17, bit5);\n var bit5_4 = combinePolys(bit5, bit4);\n var wavetones = [\n bit17_5, bit5, bit5_4, bit5,\n bit17, bit2, bit4, bit2\n ];\n // TIA\n var div2 = divideBy(2);\n var div6 = divideBy(6);\n var div31 = divideBy(31);\n var div93 = divideBy(93);\n var bit15_4 = combinePolys(bit15, bit4);\n var bit5_2 = combinePolys(bit5, div2);\n var bit5_6 = combinePolys(bit5, div6);\n var tiawavetones = [\n bit1, bit4, bit15_4, bit5_4,\n div2, div2, div31, bit5_2,\n bit9, bit5, div31, bit1,\n div6, div6, div93, bit5_6\n ];\n \n // registers\n var regs = new Uint8Array(16);\n var counters = new Float32Array(4);\n var deltas = new Float32Array(4);\n var volume = new Float32Array(4);\n var audc = new Uint8Array(4);\n var waveforms = [bit1, bit1, bit1, bit1];\n var buffer;\n var sampleRate;\n var clock, baseDelta;\n var dirty = true;\n\n //\n\n this.setBufferLength = function (length) {\n buffer = new Int32Array(length);\n };\n\n this.getBuffer = function () {\n return buffer;\n };\n\n this.setSampleRate = function (rate) {\n sampleRate = rate;\n baseDelta = FREQ_17_EXACT / rate;\n };\n\n function updateValues(addr) {\n var ctrl = regs[8];\n var base = (ctrl & CLOCK_15) ? DIV_15 : DIV_64;\n var div;\n var i = addr & 4;\n var j = i>>1;\n var k = i>>2;\n if (ctrl & (CH1_CH2>>k)) {\n if (ctrl & (CH1_179>>k))\n div = regs[i+2] * 256 + regs[i+0] + 7;\n else\n div = (regs[i+2] * 256 + regs[i+0] + 1) * base;\n deltas[j+1] = baseDelta / div;\n deltas[j+0] = 0;\n } else {\n if (ctrl & (CH1_179>>k)) {\n div = regs[i+0] + 4;\n } else {\n div = (regs[i+0] + 1) * base;\n }\n deltas[j+0] = baseDelta / div;\n div = (regs[i+2] + 1) * base;\n deltas[j+1] = baseDelta / div;\n }\n //console.log(addr, ctrl.toString(16), div, deltas[j+0], deltas[j+1]);\n }\n\n this.setRegister = function(addr, value) {\n addr &= 0xf;\n value &= 0xff;\n if (regs[addr] != value) {\n regs[addr] = value;\n switch (addr) {\n case 0:\n case 2:\n case 4:\n case 6: // AUDF\n case 8: // ctrl\n dirty = true;\n break;\n case 1:\n case 3:\n case 5:\n case 7: // AUDC\n volume[addr>>1] = value & 0xf;\n waveforms[addr>>1] = wavetones[value>>5];\n break;\n }\n }\n }\n\n this.getRegister = function(addr) {\n addr &= 0xf;\n return regs[addr];\n }\n \n this.setTIARegister = function(addr, value) {\n switch (addr) {\n case 0x17:\n case 0x18:\n regs[(addr&1)*4] = value & 0x1f;\n dirty = true;\n break;\n case 0x15:\n case 0x16:\n waveforms[(addr&1)*2] = tiawavetones[value & 0xf];\n break;\n case 0x19:\n case 0x1a:\n volume[(addr&1)*2] = value & 0xf;\n break;\n }\n }\n\n this.generate = function (length) {\n if (dirty) {\n updateValues(0);\n updateValues(4);\n dirty = false;\n }\n for (var s=0; s 0 && d < 1 && v > 0) {\n var wav = waveforms[i];\n var cnt = counters[i] += d;\n if (cnt > wav.length) {\n cnt = counters[i] = cnt - Math.floor(cnt / wav.length) * wav.length;\n }\n var on = wav[Math.floor(cnt)];\n if (on) {\n sample += v;\n }\n }\n }\n sample *= 64;\n buffer[s] = sample;\n buffer[s+1] = sample;\n }\n }\n}\n\n////// Worker sound\n\nexport var WorkerSoundChannel = function(worker) {\n var sampleRate;\n var output;\n var pending = [];\n var pendingLength = 0;\n\n worker.onmessage = function(e) {\n if (e && e.data && e.data.samples && output) {\n pending.push(e.data.samples);\n pendingLength += e.data.samples.length;\n }\n };\n\n this.setBufferLength = function (length) {\n output = new Int16Array(length);\n //worker.postMessage({bufferLength:length,numChannels:2});\n pendingLength = 0;\n };\n\n this.getBuffer = function () {\n return output;\n };\n\n this.setSampleRate = function (rate) {\n sampleRate = rate;\n worker.postMessage({sampleRate:rate});\n };\n\n this.generate = function (length) {\n if (pendingLength < length*3) {\n //console.log(length, pendingLength);\n output.fill(0);\n return; // TODO: send sync msg?\n }\n for (var i=0; i= buffer.length) {\n bufpos = 0;\n bufferlist[ifill] = buffer;\n var inext = (ifill + 1) % bufferlist.length;\n if (inext == idrain) {\n ifill = Math.floor(idrain + nbuffers/2) % bufferlist.length;\n //console.log('SampleAudio: skipped buffer', idrain, ifill); // TODO\n } else {\n ifill = inext;\n }\n buffer = bufferlist[ifill];\n }\n }\n\n this.feedSample = function(value, count) {\n accum += value * count;\n sfrac += sinc * count;\n if (sfrac >= 1) {\n accum /= sfrac;\n while (sfrac >= 1) {\n this.addSingleSample(accum * sinc);\n sfrac -= 1;\n }\n accum *= sfrac;\n }\n }\n \n}\n\n\nexport class SampledAudio {\n sa;\n constructor(sampleRate : number) {\n this.sa = new SampleAudio(sampleRate);\n }\n feedSample(value:number, count:number) {\n this.sa.feedSample(value, count);\n }\n start() {\n this.sa.start();\n }\n stop() {\n this.sa.stop();\n }\n}\n\ninterface TssChannel {\n setBufferLength(len : number) : void;\n setSampleRate(rate : number) : void;\n getBuffer() : number[];\n generate(numSamples : number) : void;\n}\n\nexport class TssChannelAdapter {\n channels : TssChannel[];\n audioGain = 1.0 / 8192;\n bufferLength : number;\n\n constructor(chans, oversample:number, sampleRate:number) {\n this.bufferLength = oversample * 2;\n this.channels = chans.generate ? [chans] : chans; // array or single channel\n this.channels.forEach((c) => {\n c.setBufferLength(this.bufferLength);\n c.setSampleRate(sampleRate);\n });\n }\n\n generate(sink:SampledAudioSink) {\n var l = this.bufferLength;\n var bufs = this.channels.map((ch) => ch.getBuffer());\n this.channels.forEach((ch) => {\n ch.generate(l);\n });\n for (let i=0; i total += buf[i]);\n sink.feedSample(total * this.audioGain, 1);\n };\n }\n}\n\n", "\nimport { Probeable, ProbeAll } from \"./devices\";\n\nexport enum ProbeFlags {\n CLOCKS\t = 0x00000000,\n EXECUTE\t = 0x01000000,\n INTERRUPT\t= 0x08000000,\n ILLEGAL\t = 0x09000000,\n SP_PUSH\t = 0x0a000000,\n SP_POP\t = 0x0b000000,\n HAS_VALUE = 0x10000000,\n MEM_READ\t= 0x12000000,\n MEM_WRITE\t= 0x13000000,\n IO_READ\t = 0x14000000,\n IO_WRITE\t= 0x15000000,\n VRAM_READ\t= 0x16000000,\n VRAM_WRITE= 0x17000000,\n DMA_READ = 0x18000000,\n DMA_WRITE = 0x19000000,\n WAIT = 0x1f000000,\n SCANLINE\t= 0x7e000000,\n FRAME\t\t = 0x7f000000,\n}\n\nclass ProbeFrame {\n data : Uint32Array;\n len : number;\n}\n\nexport class ProbeRecorder implements ProbeAll {\n\n m : Probeable; // machine to probe\n buf : Uint32Array; // buffer\n idx : number = 0; // index into buffer\n sl : number = 0; // scanline\n cur_sp = -1; // last stack pointer\n singleFrame : boolean = true; // clear between frames\n\n constructor(m:Probeable, buflen?:number) {\n this.m = m;\n this.reset(buflen || 0x100000);\n }\n start() {\n this.m.connectProbe(this);\n }\n stop() {\n this.m.connectProbe(null);\n }\n reset(newbuflen? : number) {\n if (newbuflen) this.buf = new Uint32Array(newbuflen);\n this.sl = 0;\n this.cur_sp = -1;\n this.clear();\n }\n clear() {\n this.idx = 0;\n }\n logData(a:number) {\n this.log(a);\n }\n log(a:number) {\n // TODO: coalesce READ and EXECUTE and PUSH/POP\n if (this.idx >= this.buf.length) return;\n this.buf[this.idx++] = a;\n }\n relog(a:number) {\n this.buf[this.idx-1] = a;\n }\n lastOp() {\n if (this.idx > 0)\n return this.buf[this.idx-1] & 0xff000000;\n else\n return -1;\n }\n lastAddr() {\n if (this.idx > 0)\n return this.buf[this.idx-1] & 0xffffff;\n else\n return -1;\n }\n addLogBuffer(src: Uint32Array) {\n if (this.idx + src.length > this.buf.length) {\n src = src.slice(0, this.buf.length - this.idx);\n }\n this.buf.set(src, this.idx);\n this.idx += src.length;\n}\n logClocks(clocks:number) {\n clocks |= 0;\n if (clocks > 0) {\n if (this.lastOp() == ProbeFlags.CLOCKS)\n this.relog((this.lastAddr() + clocks) | ProbeFlags.CLOCKS); // coalesce clocks\n else\n this.log(clocks | ProbeFlags.CLOCKS);\n }\n }\n logNewScanline() {\n this.log(ProbeFlags.SCANLINE);\n this.sl++;\n }\n logNewFrame() {\n this.log(ProbeFlags.FRAME);\n this.sl = 0;\n if (this.singleFrame) this.clear();\n }\n logExecute(address:number, SP:number) {\n // record stack pushes/pops (from last instruction)\n if (this.cur_sp !== SP) {\n if (SP < this.cur_sp) {\n this.log(ProbeFlags.SP_PUSH | SP);\n }\n if (SP > this.cur_sp) {\n this.log(ProbeFlags.SP_POP | SP);\n }\n this.cur_sp = SP;\n }\n this.log(address | ProbeFlags.EXECUTE);\n }\n logInterrupt(type:number) {\n this.log(type | ProbeFlags.INTERRUPT);\n }\n logValue(address:number, value:number, op:number) {\n this.log((address & 0xffff) | ((value & 0xff)<<16) | op);\n }\n logRead(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.MEM_READ);\n }\n logWrite(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.MEM_WRITE);\n }\n logIORead(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.IO_READ);\n }\n logIOWrite(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.IO_WRITE);\n }\n logVRAMRead(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.VRAM_READ);\n }\n logVRAMWrite(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.VRAM_WRITE);\n }\n logIllegal(address:number) {\n this.log(address | ProbeFlags.ILLEGAL);\n }\n logWait(address:number) {\n this.log(address | ProbeFlags.WAIT);\n }\n logDMARead(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.DMA_READ);\n }\n logDMAWrite(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.DMA_WRITE);\n }\n countEvents(op : number) : number {\n var count = 0;\n for (var i=0; i {\n saveState() : S;\n loadState(state:S) : void;\n}\n\nexport interface Bus {\n read(a:number) : number;\n write(a:number, v:number) : void;\n readConst?(a:number) : number;\n}\n\nexport interface ClockBased {\n advanceClock() : void;\n}\n\nexport interface InstructionBased {\n advanceInsn() : number;\n}\n\nexport type TrapCondition = () => boolean;\n\nexport interface FrameBased {\n advanceFrame(trap:TrapCondition) : number;\n}\n\nexport interface VideoSource {\n getVideoParams() : VideoParams;\n connectVideo(pixels:Uint32Array) : void;\n}\n\nexport interface RasterFrameBased extends FrameBased, VideoSource {\n getRasterY() : number;\n getRasterX() : number;\n}\n\nexport interface VideoParams {\n width : number;\n height : number;\n overscan? : boolean;\n rotate? : number;\n videoFrequency? : number; // default = 60\n aspect? : number;\n}\n\n// TODO: frame buffer optimization (apple2, etc)\n\nexport interface SampledAudioParams {\n sampleRate : number;\n stereo : boolean;\n}\n\nexport interface SampledAudioSink {\n feedSample(value:number, count:number) : void;\n //sendAudioFrame(samples:Uint16Array) : void;\n}\n\nexport interface SampledAudioSource {\n getAudioParams() : SampledAudioParams;\n connectAudio(audio : SampledAudioSink) : void;\n}\n\nexport interface AcceptsROM {\n loadROM(data:Uint8Array, title?:string) : void;\n}\n\nexport interface AcceptsBIOS {\n loadBIOS(data:Uint8Array, title?:string) : void;\n}\n\nexport interface Resettable {\n reset() : void;\n}\n\nexport interface MemoryBusConnected {\n connectMemoryBus(bus:Bus) : void;\n}\n\nexport interface IOBusConnected {\n connectIOBus(bus:Bus) : void;\n}\n\nexport interface CPU extends MemoryBusConnected, Resettable, SavesState {\n getPC() : number;\n getSP() : number;\n isStable() : boolean;\n}\n\nexport interface HasCPU extends Resettable {\n cpu : CPU;\n}\n\nexport interface Interruptable {\n interrupt(type:IT) : void;\n}\n\nexport interface SavesInputState {\n loadControlsState(cs:CS) : void;\n saveControlsState() : CS;\n}\n\nexport interface AcceptsKeyInput {\n setKeyInput(key:number, code:number, flags:number) : void;\n}\n\nexport interface AcceptsPaddleInput {\n setPaddleInput(controller:number, value:number) : void;\n}\n\n// TODO: interface not yet used (setKeyInput() handles joystick)\nexport interface AcceptsJoyInput {\n setJoyInput(joy:number, bitmask:number) : void;\n}\n\n// SERIAL I/O\n\nexport interface SerialEvent {\n op: 'read' | 'write';\n value: number;\n nbits: number;\n}\n\n// TODO: all these needed?\nexport interface SerialIOInterface {\n // from machine to platform\n clearToSend() : boolean;\n sendByte(b : number);\n // from platform to machine\n byteAvailable() : boolean;\n recvByte() : number;\n // implement these too\n reset() : void;\n advance(clocks: number) : void;\n// refresh() : void;\n}\n\nexport interface HasSerialIO {\n connectSerialIO(serial: SerialIOInterface);\n serialOut?: SerialEvent[]; // outgoing event log\n serialIn?: SerialEvent[]; // incoming queue\n}\n\n/// PROFILER\n\nexport interface Probeable {\n connectProbe(probe: ProbeAll) : void;\n}\n\nexport interface ProbeTime {\n logClocks(clocks:number);\n logNewScanline();\n logNewFrame();\n}\n\nexport interface ProbeCPU {\n logExecute(address:number, SP:number);\n logInterrupt(type:number);\n logIllegal(address:number);\n logWait(address:number);\n}\n\nexport interface ProbeBus {\n logRead(address:number, value:number);\n logWrite(address:number, value:number);\n logDMARead(address:number, value:number);\n logDMAWrite(address:number, value:number);\n}\n\nexport interface ProbeIO {\n logIORead(address:number, value:number);\n logIOWrite(address:number, value:number);\n}\n\nexport interface ProbeVRAM {\n logVRAMRead(address:number, value:number);\n logVRAMWrite(address:number, value:number);\n}\n\nexport interface ProbeAll extends ProbeTime, ProbeCPU, ProbeBus, ProbeIO, ProbeVRAM {\n logData(data:number); // entire 32 bits\n addLogBuffer(src: Uint32Array);\n}\n\nexport class NullProbe implements ProbeAll {\n logClocks()\t\t{}\n logNewScanline()\t{}\n logNewFrame()\t\t{}\n logExecute()\t\t{}\n logInterrupt()\t{}\n logRead()\t\t{}\n logWrite()\t\t{}\n logIORead()\t\t{}\n logIOWrite()\t\t{}\n logVRAMRead()\t\t{}\n logVRAMWrite()\t{}\n logIllegal()\t\t{}\n logWait()\t\t{}\n logDMARead()\t\t{}\n logDMAWrite()\t\t{}\n logData() {}\n addLogBuffer(src: Uint32Array) {}\n}\n\n/// CONVENIENCE\n\nexport interface BasicMachineControlsState {\n inputs: Uint8Array;\n}\n\nexport interface BasicMachineState extends BasicMachineControlsState {\n c: any; // TODO\n ram: Uint8Array;\n}\n\nexport abstract class BasicHeadlessMachine implements HasCPU, Bus, AcceptsROM, Probeable,\n SavesState, SavesInputState {\n\n abstract cpuFrequency : number;\n abstract defaultROMSize : number;\n\n abstract cpu : CPU;\n abstract ram : Uint8Array; \n\n rom : Uint8Array;\n inputs : Uint8Array = new Uint8Array(32);\n handler : (key,code,flags) => void; // keyboard handler\n\n nullProbe = new NullProbe();\n probe : ProbeAll = this.nullProbe;\n \n abstract read(a:number) : number;\n abstract write(a:number, v:number) : void;\n\n setKeyInput(key:number, code:number, flags:number) : void {\n this.handler && this.handler(key,code,flags);\n }\n connectProbe(probe: ProbeAll) : void {\n this.probe = probe || this.nullProbe;\n }\n reset() {\n this.cpu.reset();\n }\n loadROM(data:Uint8Array, title?:string) : void {\n if (!this.rom) this.rom = new Uint8Array(this.defaultROMSize);\n this.rom.set(data);\n }\n loadState(state) {\n this.cpu.loadState(state.c);\n this.ram.set(state.ram);\n this.inputs.set(state.inputs);\n }\n saveState() {\n return {\n c:this.cpu.saveState(),\n ram:this.ram.slice(0),\n inputs:this.inputs.slice(0),\n };\n }\n loadControlsState(state) {\n this.inputs.set(state.inputs);\n }\n saveControlsState() {\n return {\n inputs:this.inputs.slice(0)\n };\n }\n advanceCPU() {\n var c = this.cpu as any;\n var n = 1;\n if (this.cpu.isStable()) { this.probe.logExecute(this.cpu.getPC(), this.cpu.getSP()); }\n if (c.advanceClock) { c.advanceClock(); }\n else if (c.advanceInsn) { n = c.advanceInsn(1); }\n this.probe.logClocks(n);\n return n;\n }\n probeMemoryBus(membus:Bus) : Bus {\n return {\n read: (a) => {\n let val = membus.read(a);\n this.probe.logRead(a,val);\n return val;\n },\n write: (a,v) => {\n this.probe.logWrite(a,v);\n membus.write(a,v);\n }\n };\n }\n connectCPUMemoryBus(membus:Bus) : void {\n this.cpu.connectMemoryBus(this.probeMemoryBus(membus));\n }\n probeIOBus(iobus:Bus) : Bus {\n return {\n read: (a) => {\n let val = iobus.read(a);\n this.probe.logIORead(a,val);\n return val;\n },\n write: (a,v) => {\n this.probe.logIOWrite(a,v);\n iobus.write(a,v);\n }\n };\n }\n probeDMABus(iobus:Bus) : Bus {\n return {\n read: (a) => {\n let val = iobus.read(a);\n this.probe.logDMARead(a,val);\n return val;\n },\n write: (a,v) => {\n this.probe.logDMAWrite(a,v);\n iobus.write(a,v);\n }\n };\n }\n connectCPUIOBus(iobus:Bus) : void {\n this.cpu['connectIOBus'](this.probeIOBus(iobus));\n }\n}\n\nexport abstract class BasicMachine extends BasicHeadlessMachine implements SampledAudioSource {\n\n abstract canvasWidth : number;\n abstract numVisibleScanlines : number;\n abstract sampleRate : number;\n overscan : boolean = false;\n rotate : number = 0;\n aspectRatio : number;\n \n pixels : Uint32Array;\n audio : SampledAudioSink;\n\n scanline : number;\n \n getAudioParams() : SampledAudioParams {\n return {sampleRate:this.sampleRate, stereo:false};\n }\n connectAudio(audio : SampledAudioSink) : void {\n this.audio = audio;\n }\n getVideoParams() : VideoParams {\n return {width:this.canvasWidth,\n height:this.numVisibleScanlines,\n aspect:this.aspectRatio,\n overscan:this.overscan,\n rotate:this.rotate};\n }\n connectVideo(pixels:Uint32Array) : void {\n this.pixels = pixels;\n }\n}\n\nexport abstract class BasicScanlineMachine extends BasicMachine implements RasterFrameBased {\n\n abstract numTotalScanlines : number;\n abstract cpuCyclesPerLine : number;\n\n abstract startScanline() : void;\n abstract drawScanline() : void;\n\n frameCycles : number;\n \n advanceFrame(trap: TrapCondition) : number {\n this.preFrame();\n var endLineClock = 0;\n var steps = 0;\n this.probe.logNewFrame();\n this.frameCycles = 0;\n for (var sl=0; sl= 0x40 && b1 <= 0x7f) am = Z80_OPS_ED[b1 - 0x40];\n if (b1 >= 0xa0 && b1 <= 0xbf) am = Z80_OPS_ED[b1 - 0xa0 + 0x40];\n n++;\n break;\n case 0xdd:\n case 0xfd:\n var ireg = (b0 == 0xdd) ? 'ix' : 'iy';\n if (b1 == 0xcb) {\n // swap the 3rd and 4th bytes [$dd $cb displacement opcode]\n am = Z80_OPS_CB[b3];\n bytes[2] = b3;\n bytes[3] = b2;\n n++;\n } else {\n am = Z80_OPS[b1];\n }\n am = am.replace(/[(]hl[)]/, '('+ireg+'+x)');\n am = am.replace(/\\bhl\\b/, ireg);\n n++;\n break;\n default:\n am = Z80_OPS[b0];\n break;\n }\n if (!am || !am.length) am = \"??\";\n if (/\\bxx\\b/.test(am)) {\n am = am.replace(/\\bxx\\b/,'$'+hex(bytes[n]+(bytes[n+1]<<8), 4));\n n += 2;\n isaddr = true;\n } else if (/\\bx\\b/.test(am)) {\n if (am.startsWith('j')) {\n var offset = (b1 < 0x80) ? (pc+2+b1) : (pc+2-(256-b1));\n offset &= 0xffff;\n am = am.replace(/\\bx\\b/,'$'+hex(offset, 4));\n isaddr = true;\n } else {\n am = am.replace(/\\bx\\b/,'$'+hex(bytes[n], 2));\n }\n n += 1;\n }\n return {line:am.toUpperCase(), nbytes:n, isaddr:isaddr};\n};\n", "\nimport { CpuState, EmuState } from \"./baseplatform\";\nimport { CPU, SampledAudioSink, ProbeAll, NullProbe } from \"./devices\";\nimport { EmuHalt } from \"./emu\";\n\n// WASM Support\n// TODO: detangle from c64\n\nexport abstract class BaseWASMMachine {\n prefix : string;\n instance : WebAssembly.Instance;\n exports : any;\n sys : number;\n pixel_dest : Uint32Array;\n pixel_src : Uint32Array;\n stateptr : number;\n statearr : Uint8Array;\n cpustateptr : number;\n cpustatearr : Uint8Array;\n ctrlstateptr : number;\n ctrlstatearr : Uint8Array;\n cpu : CPU;\n romptr : number;\n romlen : number;\n romarr : Uint8Array;\n biosptr : number;\n biosarr : Uint8Array;\n audio : SampledAudioSink;\n audioarr : Float32Array;\n probe : ProbeAll;\n maxROMSize : number = 0x40000;\n\n abstract getCPUState() : CpuState;\n abstract saveState() : EmuState;\n abstract loadState(state: EmuState);\n\n constructor(prefix: string) {\n this.prefix = prefix;\n var self = this;\n this.cpu = {\n getPC: self.getPC.bind(self),\n getSP: self.getSP.bind(self),\n isStable: self.isStable.bind(self),\n reset: self.reset.bind(self),\n saveState: () => {\n return self.getCPUState();\n },\n loadState: () => {\n console.log(\"loadState not implemented\")\n },\n connectMemoryBus() {\n console.log(\"connectMemoryBus not implemented\")\n },\n }\n }\n getImports(wmod: WebAssembly.Module) {\n return {};\n }\n async fetchWASM() {\n var wasmResponse = await fetch('res/'+this.prefix+'.wasm');\n if (wasmResponse.status == 200 || (wasmResponse as any as Blob).size) {\n var wasmBinary = await wasmResponse.arrayBuffer();\n var wasmCompiled = await WebAssembly.compile(wasmBinary);\n var wasmResult = await WebAssembly.instantiate(wasmCompiled, this.getImports(wasmCompiled));\n this.instance = wasmResult;\n this.exports = wasmResult.exports;\n } else throw new Error('could not load WASM file');\n }\n async fetchBIOS() {\n var biosResponse = await fetch('res/'+this.prefix+'.bios');\n if (biosResponse.status == 200 || (biosResponse as any as Blob).size) {\n var biosBinary = await biosResponse.arrayBuffer();\n this.biosptr = this.exports.malloc(biosBinary.byteLength);\n this.biosarr = new Uint8Array(this.exports.memory.buffer, this.biosptr, biosBinary.byteLength);\n this.loadBIOS(new Uint8Array(biosBinary));\n } else throw new Error('could not load BIOS file');\n }\n async initWASM() {\n // init machine instance\n this.sys = this.exports.machine_init(this.biosptr);\n let statesize = this.exports.machine_get_state_size();\n this.stateptr = this.exports.malloc(statesize);\n let ctrlstatesize = this.exports.machine_get_controls_state_size();\n this.ctrlstateptr = this.exports.malloc(ctrlstatesize);\n let cpustatesize = this.exports.machine_get_cpu_state_size();\n this.cpustateptr = this.exports.malloc(cpustatesize);\n this.romptr = this.exports.malloc(this.maxROMSize);\n // create state buffers\n // must do this after allocating memory (and everytime we grow memory?)\n this.statearr = new Uint8Array(this.exports.memory.buffer, this.stateptr, statesize);\n this.ctrlstatearr = new Uint8Array(this.exports.memory.buffer, this.ctrlstateptr, ctrlstatesize);\n this.cpustatearr = new Uint8Array(this.exports.memory.buffer, this.cpustateptr, cpustatesize);\n // create audio buffer\n let sampbufsize = 4096*4;\n this.audioarr = new Float32Array(this.exports.memory.buffer, this.exports.machine_get_sample_buffer(), sampbufsize);\n // create ROM buffer\n this.romarr = new Uint8Array(this.exports.memory.buffer, this.romptr, this.maxROMSize);\n // enable c64 joystick map to arrow keys (TODO)\n //this.exports.c64_set_joystick_type(this.sys, 1);\n console.log('machine_init', this.sys, statesize, ctrlstatesize, cpustatesize, sampbufsize);\n }\n async loadWASM() {\n await this.fetchWASM();\n this.exports.memory.grow(96); // TODO: need more when probing?\n await this.fetchBIOS();\n await this.initWASM();\n }\n getPC() : number {\n return this.exports.machine_cpu_get_pc(this.sys);\n }\n getSP() : number {\n return this.exports.machine_cpu_get_sp(this.sys);\n }\n isStable() : boolean {\n return this.exports.machine_cpu_is_stable(this.sys);\n }\n loadROM(rom: Uint8Array) {\n if (rom.length > this.maxROMSize) throw new EmuHalt(`Rom size too big: ${rom.length} bytes`);\n this.romarr.set(rom);\n this.romlen = rom.length;\n console.log('load rom', rom.length, 'bytes');\n this.reset(); // TODO?\n }\n // TODO: can't load after machine_init\n loadBIOS(srcArray: Uint8Array) {\n this.biosarr.set(srcArray);\n }\n reset() {\n this.exports.machine_reset(this.sys);\n }\n /* TODO: we don't need this because c64_exec does this?\n pollControls() {\n this.exports.machine_start_frame(this.sys);\n }\n */\n read(address: number) : number {\n return this.exports.machine_mem_read(this.sys, address & 0xffff);\n }\n readConst(address: number) : number {\n return this.exports.machine_mem_read(this.sys, address & 0xffff);\n }\n write(address: number, value: number) : void {\n this.exports.machine_mem_write(this.sys, address & 0xffff, value & 0xff);\n }\n getAudioParams() {\n return {sampleRate:44100, stereo:false};\n }\n videoOffsetBytes = 0;\n connectVideo(pixels:Uint32Array) : void {\n this.pixel_dest = pixels;\n var pixbuf = this.exports.machine_get_pixel_buffer(this.sys); // save video pointer\n console.log('connectVideo', pixbuf, pixels.length);\n this.pixel_src = new Uint32Array(this.exports.memory.buffer, pixbuf+this.videoOffsetBytes, pixels.length);\n }\n syncVideo() {\n if (this.exports.machine_update_video) {\n this.exports.machine_update_video(this.sys);\n }\n if (this.pixel_dest != null) {\n this.pixel_dest.set(this.pixel_src);\n }\n }\n // assume controls buffer is smaller than cpu buffer\n saveControlsState() : any {\n //console.log(1, this.romptr, this.romlen, this.ctrlstateptr, this.romarr.slice(0,4), this.ctrlstatearr.slice(0,4));\n this.exports.machine_save_controls_state(this.sys, this.ctrlstateptr);\n //console.log(2, this.romptr, this.romlen, this.ctrlstateptr, this.romarr.slice(0,4), this.ctrlstatearr.slice(0,4));\n return { controls:this.ctrlstatearr.slice(0) }\n }\n loadControlsState(state) : void {\n this.ctrlstatearr.set(state.controls);\n this.exports.machine_load_controls_state(this.sys, this.ctrlstateptr);\n }\n connectAudio(audio : SampledAudioSink) : void {\n this.audio = audio;\n }\n syncAudio() {\n if (this.audio != null) {\n var n = this.exports.machine_get_sample_count();\n for (var i=0; i>1))&0x80)>>6);};\nvar setV16 = function(a,b,r) {CC |= (((a^b^r^(r>>1))&0x8000)>>14);};\nvar getD = function() {return (rA<<8)+rB;};\nvar setD = function(v) {rA = (v>>8)& 0xff;rB=v&0xff;};\nvar PUSHB = function(b) {\n byteTo(--rS, b & 0xff);\n};\nvar PUSHW = function(b) {\n byteTo(--rS, b & 0xff);\n byteTo(--rS, (b>>8) & 0xff);\n};\n\nvar PUSHBU = function(b) {\n byteTo(--rU, b & 0xff);\n};\nvar PUSHWU = function(b) {\n byteTo(--rU, b & 0xff);\n byteTo(--rU, (b>>8) & 0xff);\n};\nvar PULLB = function() {\n return byteAt(rS++);\n};\nvar PULLW = function() {\n return byteAt(rS++) * 256 + byteAt(rS++);\n};\n\nvar PULLBU = function() {\n return byteAt(rU++);\n};\nvar PULLWU = function() {\n return byteAt(rU++) * 256 + byteAt(rU++);\n};\n\nvar PSHS = function(ucTemp) {\n var i = 0;\n if (ucTemp & 0x80) {PUSHW(PC);i += 2;}\n if (ucTemp & 0x40) {PUSHW(rU);i += 2;}\n if (ucTemp & 0x20){PUSHW(rY);i += 2;}\n if (ucTemp & 0x10){PUSHW(rX);i += 2;}\n if (ucTemp & 0x8){PUSHB(DP); i++;}\n if (ucTemp & 0x4){PUSHB(rB); i++;}\n if (ucTemp & 0x2){PUSHB(rA); i++;}\n if (ucTemp & 0x1){PUSHB(CC); i++;}\n T+=i; //timing\n};\nvar PSHU = function(ucTemp) {\n var i = 0;\n if (ucTemp & 0x80) {PUSHWU(PC);i += 2;}\n if (ucTemp & 0x40) {PUSHWU(rS);i += 2;}\n if (ucTemp & 0x20){PUSHWU(rY);i += 2;}\n if (ucTemp & 0x10){PUSHWU(rX);i += 2;}\n if (ucTemp & 0x8){PUSHBU(DP); i++;}\n if (ucTemp & 0x4){PUSHBU(rB); i++;}\n if (ucTemp & 0x2){PUSHBU(rA); i++;}\n if (ucTemp & 0x1){PUSHBU(CC); i++;}\n T+=i; //timing\n};\nvar PULS = function(ucTemp) {\n var i = 0;\n if (ucTemp & 0x1){CC = PULLB(); i++;}\n if (ucTemp & 0x2){rA = PULLB(); i++;}\n if (ucTemp & 0x4){rB = PULLB(); i++;}\n if (ucTemp & 0x8){DP = PULLB(); i++;}\n if (ucTemp & 0x10){rX = PULLW();i += 2;}\n if (ucTemp & 0x20){rY = PULLW();i += 2;}\n if (ucTemp & 0x40) {rU = PULLW();i += 2;}\n if (ucTemp & 0x80) {PC = PULLW();i += 2;}\n T+=i; //timing\n};\nvar PULU = function(ucTemp) {\n var i = 0;\n if (ucTemp & 0x1){CC = PULLBU(); i++;}\n if (ucTemp & 0x2){rA = PULLBU(); i++;}\n if (ucTemp & 0x4){rB = PULLBU(); i++;}\n if (ucTemp & 0x8){DP = PULLBU(); i++;}\n if (ucTemp & 0x10){rX = PULLWU();i += 2;}\n if (ucTemp & 0x20){rY = PULLWU();i += 2;}\n if (ucTemp & 0x40) {rS = PULLWU();i += 2;}\n if (ucTemp & 0x80) {PC = PULLWU();i += 2;}\n T+=i; //timing\n};\n\n\nvar getPBR = function(ucPostByte) {\n switch(ucPostByte & 0xf) {\n case 0x00: /* D */\n return getD();\n case 0x1: /* X */\n return rX;\n case 0x2: /* Y */\n return rY;\n case 0x3: /* U */\n return rU;\n case 0x4: /* S */\n return rS;\n case 0x5: /* PC */\n return PC;\n case 0x8: /* A */\n return rA;\n case 0x9: /* B */\n return rB;\n case 0xA: /* CC */\n return CC;\n case 0xB: /* DP */\n return DP;\n default: /* illegal */\n return null;\n }\n};\nvar setPBR = function(ucPostByte, v) {\n switch(ucPostByte & 0xf) /* Get destination register */\n {\n case 0x00: /* D */\n setD(v);return;\n case 0x1: /* X */\n rX = v; return;\n case 0x2: /* Y */\n rY = v; return;\n case 0x3: /* U */\n rU = v; return;\n case 0x4: /* S */\n rS = v; return;\n case 0x5: /* PC */\n PC = v; return;\n case 0x8: /* A */\n rA = v; return;\n case 0x9: /* B */\n rB = v; return;\n case 0xA: /* CC */\n CC = v; return;\n case 0xB: /* DP */\n DP = v; return;\n default: /* illegal */\n return;\n }\n};\n\nvar TFREXG = function(ucPostByte, bExchange)\n{\n\n var ucTemp = ucPostByte & 0x88;\n if (ucTemp == 0x80 || ucTemp == 0x08)\n ucTemp = 0; /* PROBLEM! */\n\n if (bExchange)\n {\n ucTemp = getPBR(ucPostByte>>4);\n setPBR(ucPostByte>>4, getPBR(ucPostByte));\n setPBR(ucPostByte, ucTemp);\n }\n else /* Transfer */ {\n setPBR(ucPostByte, getPBR(ucPostByte>>4));\n }\n} ;\n\nvar signed = function(x) {\n return (x>127)?(x-256):x;\n};\nvar signed16 = function(x) {\n return (x>32767)?(x-65536):x;\n};\n\nvar fetch = function() {\n var v = byteAt(PC++);\n PC &= 0xffff;\n return v;\n};\nvar fetch16 = function() {\n var v1 = byteAt(PC++);\n PC &= 0xffff;\n var v2 = byteAt(PC++);\n PC &= 0xffff;\n return v1*256+v2;\n};\n\nvar ReadWord = function(addr) {\n var v1 = byteAt(addr++);\n addr &= 0xffff;\n var v2 = byteAt(addr++);\n addr &= 0xffff;\n return v1*256+v2;\n};\nvar WriteWord = function(addr,v) {\n byteTo(addr++,(v>>8)&0xff);\n addr &= 0xffff;\n byteTo(addr,v&0xff);\n};\n\nvar PostByte = function() {\n var pb = fetch();\n var preg;\n switch (pb & 0x60) {\n case 0:\n preg = rX; break;\n case 0x20:\n preg = rY; break;\n case 0x40:\n preg = rU; break;\n case 0x60:\n preg = rS; break;\n }\n\n var xchg = null;\n var addr = null;\n var sTemp;\n\n if (pb & 0x80) /* Complex stuff */\n {\n switch (pb & 0x0f)\n {\n case 0: /* EA = ,reg+ */\n addr = preg;\n xchg = preg + 1;\n T += 2;\n break;\n case 1: /* EA = ,reg++ */\n addr = preg;\n xchg = preg + 2;\n T += 3;\n break;\n case 2: /* EA = ,-reg */\n xchg = preg - 1;\n addr = xchg;\n T += 2;\n break;\n case 3: /* EA = ,--reg */\n xchg = preg - 2;\n addr = xchg;\n T += 3;\n break;\n case 4: /* EA = ,reg */\n addr = preg;\n break;\n case 5: /* EA = ,reg + B */\n //usAddr = *pReg + (signed short)(signed char)regs->ucRegB;\n addr = preg + signed(rB);\n T += 1;\n break;\n case 6: /* EA = ,reg + A */\n addr = preg + signed(rA);\n T += 1;\n break;\n case 7: /* illegal */\n addr = 0;\n break;\n case 8: /* EA = ,reg + 8-bit offset */\n addr = preg + signed(fetch());\n T += 1;\n break;\n case 9: /* EA = ,reg + 16-bit offset */\n addr = preg + signed16(fetch16());\n T += 4;\n break;\n case 0xA: /* illegal */\n addr = 0;\n break;\n case 0xB: /* EA = ,reg + D */\n T += 4;\n addr = preg + getD();\n break;\n case 0xC: /* EA = PC + 8-bit offset */\n sTemp = signed(fetch());\n addr = PC + sTemp;\n T += 1;\n break;\n case 0xD: /* EA = PC + 16-bit offset */\n sTemp = signed16(fetch16());\n addr = PC + sTemp;\n T += 5;\n break;\n case 0xe: /* Illegal */\n addr = 0;\n break;\n case 0xF: /* EA = [,address] */\n T += 5;\n addr = fetch16();\n break;\n } /* switch */\n\n addr &= 0xffff;\n\n if (pb & 0x10) /* Indirect addressing */\n {\n addr = byteAt(addr)*256+byteAt((addr+1) & 0xffff);\n T += 3;\n }\n }\n else /* Just a 5 bit signed offset + register */\n {\n var sByte = pb & 0x1f;\n if (sByte > 15) /* Two's complement 5-bit value */\n sByte -= 32;\n addr = preg + sByte;\n T += 1;\n }\n\n if (xchg!==null) {\n switch (pb & 0x60) {\n case 0:\n rX = xchg; break;\n case 0x20:\n rY = xchg; break;\n case 0x40:\n rU = xchg; break;\n case 0x60:\n rS = xchg; break;\n }\n\n }\n\n return addr & 0xffff; /* Return the effective address */\n};\n\nvar flagsNZ16 = function(word) {\n CC &= ~(F_ZERO | F_NEGATIVE);\n if (word===0) CC |= F_ZERO;\n if (word & 0x8000) CC |= F_NEGATIVE;\n};\n\n// ============= Operations\n\nvar oINC = function(b) {\n b++;\n b &= 0xff;\n CC &= ~(F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[b];\n if (b === 0 || b == 0x80) CC |= F_OVERFLOW;\n return b;\n};\nvar oDEC = function(b) {\n b--;\n b &= 0xff;\n CC &= ~(F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[b];\n if (b === 0x7f || b == 0xff) CC |= F_OVERFLOW;\n return b;\n};\nvar oSUB = function(b,v) {\n var temp = b-v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n return temp&0xff;\n};\nvar oSUB16 = function(b,v) {\n var temp = b-v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n if ((temp&0xffff)===0) CC|=F_ZERO;\n if (temp&0x8000) CC|=F_NEGATIVE;\n if (temp&0x10000) CC|=F_CARRY;\n setV16(b,v,temp);\n return temp&0xffff;\n};\nvar oADD = function(b,v) {\n var temp = b+v;\n //temp &= 0xff;\n CC &= ~(F_HALFCARRY | F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n if ((temp ^ b ^ v)&0x10) CC |= F_HALFCARRY;\n return temp&0xff;\n};\nvar oADD16 = function(b,v) {\n var temp = b+v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n if ((temp&0xffff)===0) CC|=F_ZERO;\n if (temp&0x8000) CC|=F_NEGATIVE;\n if (temp&0x10000) CC|=F_CARRY;\n setV16(b,v,temp);\n return temp&0xffff;\n};\nvar oADC = function(b,v) {\n var temp = b+v+(CC & F_CARRY);\n //temp &= 0xff;\n CC &= ~(F_HALFCARRY | F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n if ((temp ^ b ^ v)&0x10) CC |= F_HALFCARRY;\n return temp&0xff;\n};\nvar oSBC = function(b,v) {\n var temp = b-v-(CC & F_CARRY);\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n return temp&0xff;\n};\nvar oCMP = function(b,v) {\n var temp = b-v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n return;\n};\nvar oCMP16 = function(b,v) {\n var temp = b-v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n if ((temp&0xffff)===0) CC|=F_ZERO;\n if (temp&0x8000) CC|=F_NEGATIVE;\n if (temp&0x10000) CC|=F_CARRY;\n setV16(b,v,temp);\n return;\n};\n\nvar oNEG = function(b) {\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n if (b == 0x80)\n CC |= F_OVERFLOW;\n b = ((~b)&0xff) + 1;\n if (b === 0) CC |= F_ZERO;\n if (b & 0x80) CC |= F_NEGATIVE | F_CARRY;\n return b;\n};\n\nvar oLSR = function(b) {\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE);\n if (b & 0x01) CC |= F_CARRY;\n b >>= 1;\n if (b === 0) CC |= F_ZERO;\n return b & 0xff;\n};\nvar oASR = function(b) {\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE);\n if (b & 0x01) CC |= F_CARRY;\n b = (b & 0x80) | (b>>1);\n CC |= flagsNZ[b];\n return b;\n};\nvar oASL = function(b) {\n var temp = b;\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE | F_OVERFLOW);\n if (b & 0x80) CC |= F_CARRY;\n b <<= 1;\n CC |= flagsNZ[b];\n if ((b ^ temp) & 0x80) CC|=F_OVERFLOW;\n return b;\n};\nvar oROL = function(b) {\n var temp = b;\n var oldc = CC&F_CARRY;\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE | F_OVERFLOW);\n if (b & 0x80) CC |= F_CARRY;\n b = b<<1 | oldc;\n CC |= flagsNZ[b];\n if ((b ^ temp) & 0x80) CC|=F_OVERFLOW;\n return b;\n};\nvar oROR = function(b) {\n var oldc = CC&F_CARRY;\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE);\n if (b & 0x01) CC |= F_CARRY;\n b = b>>1 | oldc<<7;\n CC |= flagsNZ[b];\n// if ((b ^ temp) & 0x80) CC|=F_OVERFLOW;\n return b;\n};\n\nvar oEOR = function(b,v) {\n CC &= ~(F_ZERO | F_NEGATIVE | F_OVERFLOW);\n b ^= v;\n CC |= flagsNZ[b];\n return b;\n};\nvar oOR = function(b,v) {\n CC &= ~(F_ZERO | F_NEGATIVE | F_OVERFLOW);\n b |= v;\n CC |= flagsNZ[b];\n return b;\n};\nvar oAND = function(b,v) {\n CC &= ~(F_ZERO | F_NEGATIVE | F_OVERFLOW);\n b &= v;\n CC |= flagsNZ[b];\n return b;\n};\nvar oCOM = function(b) {\n CC &= ~(F_ZERO | F_NEGATIVE | F_OVERFLOW);\n b ^= 0xff;\n CC |= flagsNZ[b];\n CC |= F_CARRY;\n return b;\n};\n\n//----common\nvar dpadd = function() {\n //direct page + 8bit index\n return DP*256 + fetch();\n};\n\nvar step = function() {\n var oldT = T;\n\n var addr = null;\n var pb = null;\n\n var oldPC = PC;\n var opcode = fetch();\n T+=cycles[opcode];\n switch (opcode) {\n case 0x00: //NEG DP\n addr = dpadd();\n byteTo(addr, oNEG(byteAt(addr)));\n break;\n case 0x03: //COM DP\n addr = dpadd();\n byteTo(addr, oCOM(byteAt(addr)));\n break;\n case 0x04: //LSR DP\n addr = dpadd();\n byteTo(addr, oLSR(byteAt(addr)));\n break;\n case 0x06: //ROR DP\n addr = dpadd();\n byteTo(addr, oROR(byteAt(addr)));\n break;\n case 0x07: //ASR DP\n addr = dpadd();\n byteTo(addr, oASR(byteAt(addr)));\n break;\n case 0x08: //ASL DP\n addr = dpadd();\n byteTo(addr, oASL(byteAt(addr)));\n break;\n case 0x09: //ROL DP\n addr = dpadd();\n byteTo(addr, oROL(byteAt(addr)));\n break;\n\n case 0x0A: //DEC DP\n addr = dpadd();\n byteTo(addr, oDEC(byteAt(addr)));\n break;\n case 0x0C: //INC DP\n addr = dpadd();\n byteTo(addr, oINC(byteAt(addr)));\n break;\n\n case 0x0D: //TST DP\n addr = dpadd();\n pb = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[pb];\n break;\n\n case 0x0E: //JMP DP\n addr = dpadd();\n PC = addr;\n break;\n case 0x0F: //CLR DP\n addr = dpadd();\n byteTo(addr,0);\n CC&=~(F_CARRY|F_NEGATIVE|F_OVERFLOW);\n CC |= F_ZERO;\n break;\n\n case 0x12: //NOP\n break;\n case 0x13: //SYNC\n break;\n case 0x16: //LBRA relative\n addr = signed16(fetch16());\n PC += addr;\n break;\n case 0x17: //LBSR relative\n addr = signed16(fetch16());\n PUSHW(PC);\n PC += addr;\n break;\n case 0x19: //DAA\n var cf = 0;\n var nhi = rA & 0xf0, nlo = rA & 0x0f;\n if( nlo>0x09 || CC & 0x20 ) cf |= 0x06;\n if( nhi>0x80 && nlo>0x09 ) cf |= 0x60;\n if( nhi>0x90 || CC & 0x01 ) cf |= 0x60;\n addr = cf + rA;\n CC &= ~(F_CARRY | F_NEGATIVE | F_ZERO | F_OVERFLOW);\n if (addr & 0x100)\n CC |= F_CARRY;\n rA = addr & 0xff;\n CC |= flagsNZ[rA];\n break;\n case 0x1A: //ORCC\n CC |= fetch();\n break;\n case 0x1C: //ANDCC\n CC &= fetch();\n break;\n case 0x1D: //SEX\n rA = (rB & 0x80)?0xff:0;\n flagsNZ16(getD());\n CC &= ~F_OVERFLOW;\n break;\n case 0x1E: //EXG\n pb = fetch();\n TFREXG(pb,true);\n break;\n case 0x1F: //EXG\n pb = fetch();\n TFREXG(pb,false);\n break;\n\n case 0x20: //BRA\n addr = signed(fetch());\n PC += addr;\n break;\n case 0x21: //BRN\n addr = signed(fetch());\n break;\n case 0x22: //BHI\n addr = signed(fetch());\n if (!(CC&(F_CARRY | F_ZERO))) PC += addr;\n break;\n case 0x23: //BLS\n addr = signed(fetch());\n if (CC&(F_CARRY | F_ZERO)) PC += addr;\n break;\n case 0x24: //BCC\n addr = signed(fetch());\n if (!(CC&F_CARRY)) PC += addr;\n break;\n case 0x25: //BCS\n addr = signed(fetch());\n if (CC&F_CARRY) PC += addr;\n break;\n case 0x26: //BNE\n addr = signed(fetch());\n if (!(CC&F_ZERO)) PC += addr;\n break;\n case 0x27: //BEQ\n addr = signed(fetch());\n if (CC&F_ZERO) PC += addr;\n break;\n case 0x28: //BVC\n addr = signed(fetch());\n if (!(CC&F_OVERFLOW)) PC += addr;\n break;\n case 0x29: //BVS\n addr = signed(fetch());\n if (CC&F_OVERFLOW) PC += addr;\n break;\n case 0x2A: //BPL\n addr = signed(fetch());\n if (!(CC&F_NEGATIVE)) PC += addr;\n break;\n case 0x2B: //BMI\n addr = signed(fetch());\n if (CC&F_NEGATIVE) PC += addr;\n break;\n case 0x2C: //BGE\n addr = signed(fetch());\n if (!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2))) PC += addr;\n break;\n case 0x2D: //BLT\n addr = signed(fetch());\n if ((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2)) PC += addr;\n break;\n case 0x2E: //BGT\n addr = signed(fetch());\n if (!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO))) PC += addr;\n break;\n case 0x2F: //BLE\n addr = signed(fetch());\n if ((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO)) PC += addr;\n break;\n\n case 0x30: //LEAX\n rX = PostByte();\n if (rX===0) CC|=F_ZERO; else CC&=~F_ZERO;\n break;\n case 0x31: //LEAY\n rY = PostByte();\n if (rY===0) CC|=F_ZERO; else CC&=~F_ZERO;\n break;\n case 0x32: //LEAS\n rS = PostByte();\n break;\n case 0x33: //LEAU\n rU = PostByte();\n break;\n\n case 0x34: //PSHS\n PSHS(fetch());\n break;\n case 0x35: //PULS\n PULS(fetch());\n break;\n case 0x36: //PSHU\n PSHU(fetch());\n break;\n case 0x37: //PULU\n PULU(fetch());\n break;\n case 0x39: //RTS\n PC = PULLW();\n break;\n case 0x3A: //ABX\n rX += rB;\n break;\n case 0x3B: //RTI\n CC = PULLB();\n if (CC & F_ENTIRE) {\n T+=9;\n rA = PULLB();\n rB = PULLB();\n DP = PULLB();\n rX = PULLW();\n rY = PULLW();\n rU = PULLW();\n }\n PC = PULLW();\n break;\n case 0x3C: //CWAI **todo\n CC &= fetch();\n break;\n case 0x3D: //MUL\n addr = rA * rB;\n if (addr===0) CC|=F_ZERO; else CC&=~F_ZERO;\n if (addr&0x80) CC|=F_CARRY; else CC&=~F_CARRY;\n setD(addr);\n break;\n case 0x3F: //SWI\n CC |= F_ENTIRE;\n PUSHW(PC);\n PUSHW(rU);\n PUSHW(rY);\n PUSHW(rX);\n PUSHB(DP);\n PUSHB(rB);\n PUSHB(rA);\n PUSHB(CC);\n CC |= F_IRQMASK | F_FIRQMASK;\n PC = ReadWord(vecSWI);\n break;\n\n case 0x40:\n rA = oNEG(rA);\n break;\n case 0x43:\n rA = oCOM(rA);\n break;\n case 0x44:\n rA = oLSR(rA);\n break;\n case 0x46:\n rA = oROR(rA);\n break;\n case 0x47:\n rA = oASR(rA);\n break;\n case 0x48:\n rA = oASL(rA);\n break;\n case 0x49:\n rA = oROL(rA);\n break;\n case 0x4A:\n rA = oDEC(rA);\n break;\n case 0x4C:\n rA = oINC(rA);\n break;\n case 0x4D:\n CC &= ~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0x4F:\n rA = 0;\n CC &= ~(F_NEGATIVE|F_OVERFLOW|F_CARRY);\n CC |= F_ZERO;\n break;\n\n case 0x50:\n rB = oNEG(rB);\n break;\n case 0x53:\n rB = oCOM(rB);\n break;\n case 0x54:\n rB = oLSR(rB);\n break;\n case 0x56:\n rB = oROR(rB);\n break;\n case 0x57:\n rB = oASR(rB);\n break;\n case 0x58:\n rB = oASL(rB);\n break;\n case 0x59:\n rB = oROL(rB);\n break;\n case 0x5A:\n rB = oDEC(rB);\n break;\n case 0x5C:\n rB = oINC(rB);\n break;\n case 0x5D:\n CC &= ~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0x5F:\n rB = 0;\n CC &= ~(F_NEGATIVE|F_OVERFLOW|F_CARRY);\n CC |= F_ZERO;\n break;\n\n case 0x60: //NEG indexed\n addr = PostByte();\n byteTo(addr, oNEG(byteAt(addr)));\n break;\n case 0x63: //COM indexed\n addr = PostByte();\n byteTo(addr, oCOM(byteAt(addr)));\n break;\n case 0x64: //LSR indexed\n addr = PostByte();\n byteTo(addr, oLSR(byteAt(addr)));\n break;\n case 0x66: //ROR indexed\n addr = PostByte();\n byteTo(addr, oROR(byteAt(addr)));\n break;\n case 0x67: //ASR indexed\n addr = PostByte();\n byteTo(addr, oASR(byteAt(addr)));\n break;\n case 0x68: //ASL indexed\n addr = PostByte();\n byteTo(addr, oASL(byteAt(addr)));\n break;\n case 0x69: //ROL indexed\n addr = PostByte();\n byteTo(addr, oROL(byteAt(addr)));\n break;\n\n case 0x6A: //DEC indexed\n addr = PostByte();\n byteTo(addr, oDEC(byteAt(addr)));\n break;\n case 0x6C: //INC indexed\n addr = PostByte();\n byteTo(addr, oINC(byteAt(addr)));\n break;\n\n case 0x6D: //TST indexed\n addr = PostByte();\n pb = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[pb];\n break;\n\n case 0x6E: //JMP indexed\n addr = PostByte();\n PC = addr;\n break;\n case 0x6F: //CLR indexed\n addr = PostByte();\n byteTo(addr,0);\n CC&=~(F_CARRY|F_NEGATIVE|F_OVERFLOW);\n CC |= F_ZERO;\n break;\n\n\n case 0x70: //NEG extended\n addr = fetch16();\n byteTo(addr, oNEG(byteAt(addr)));\n break;\n case 0x73: //COM extended\n addr = fetch16();\n byteTo(addr, oCOM(byteAt(addr)));\n break;\n case 0x74: //LSR extended\n addr = fetch16();\n byteTo(addr, oLSR(byteAt(addr)));\n break;\n case 0x76: //ROR extended\n addr = fetch16();\n byteTo(addr, oROR(byteAt(addr)));\n break;\n case 0x77: //ASR extended\n addr = fetch16();\n byteTo(addr, oASR(byteAt(addr)));\n break;\n case 0x78: //ASL extended\n addr = fetch16();\n byteTo(addr, oASL(byteAt(addr)));\n break;\n case 0x79: //ROL extended\n addr = fetch16();\n byteTo(addr, oROL(byteAt(addr)));\n break;\n\n case 0x7A: //DEC extended\n addr = fetch16();\n byteTo(addr, oDEC(byteAt(addr)));\n break;\n case 0x7C: //INC extended\n addr = fetch16();\n byteTo(addr, oINC(byteAt(addr)));\n break;\n\n case 0x7D: //TST extended\n addr = fetch16();\n pb = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[pb];\n break;\n\n case 0x7E: //JMP extended\n addr = fetch16();\n PC = addr;\n break;\n case 0x7F: //CLR extended\n addr = fetch16();\n byteTo(addr,0);\n CC&=~(F_CARRY|F_NEGATIVE|F_OVERFLOW);\n CC |= F_ZERO;\n break;\n\n // regs A,X\n\n case 0x80: //SUBA imm\n rA = oSUB(rA, fetch());\n break;\n case 0x81: //CMPA imm\n oCMP(rA, fetch());\n break;\n case 0x82: //SBCA imm\n rA = oSBC(rA, fetch());\n break;\n case 0x83: //SUBD imm\n setD(oSUB16(getD(),fetch16()));\n break;\n case 0x84: //ANDA imm\n rA = oAND(rA, fetch());\n break;\n case 0x85: //BITA imm\n oAND(rA, fetch());\n break;\n case 0x86: //LDA imm\n rA = fetch();\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0x88: //EORA imm\n rA = oEOR(rA, fetch());\n break;\n case 0x89: //ADCA imm\n rA = oADC(rA, fetch());\n break;\n case 0x8A: //ORA imm\n rA = oOR(rA, fetch());\n break;\n case 0x8B: //ADDA imm\n rA = oADD(rA, fetch());\n break;\n case 0x8C: //CMPX imm\n oCMP16(rX, fetch16());\n break;\n\n case 0x8D: //JSR imm\n addr = signed(fetch());\n PUSHW(PC);\n PC+=addr;\n break;\n case 0x8E: //LDX imm\n rX = fetch16();\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n\n\n case 0x90: //SUBA direct\n addr = dpadd();\n rA = oSUB(rA, byteAt(addr));\n break;\n case 0x91: //CMPA direct\n addr = dpadd();\n oCMP(rA, byteAt(addr));\n break;\n case 0x92: //SBCA direct\n addr = dpadd();\n rA = oSBC(rA, byteAt(addr));\n break;\n case 0x93: //SUBD direct\n addr = dpadd();\n setD(oSUB16(getD(),ReadWord(addr)));\n break;\n case 0x94: //ANDA direct\n addr = dpadd();\n rA = oAND(rA, byteAt(addr));\n break;\n case 0x95: //BITA direct\n addr = dpadd();\n oAND(rA, byteAt(addr));\n break;\n case 0x96: //LDA direct\n addr = dpadd();\n rA = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0x97: //STA direct\n addr = dpadd();\n byteTo(addr,rA);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0x98: //EORA direct\n addr = dpadd();\n rA = oEOR(rA, byteAt(addr));\n break;\n case 0x99: //ADCA direct\n addr = dpadd();\n rA = oADC(rA, byteAt(addr));\n break;\n case 0x9A: //ORA direct\n addr = dpadd();\n rA = oOR(rA, byteAt(addr));\n break;\n case 0x9B: //ADDA direct\n addr = dpadd();\n rA = oADD(rA, byteAt(addr));\n break;\n case 0x9C: //CMPX direct\n addr = dpadd();\n oCMP16(rX, ReadWord(addr));\n break;\n\n case 0x9D: //JSR direct\n addr = dpadd();\n PUSHW(PC);\n PC=addr;\n break;\n case 0x9E: //LDX direct\n addr = dpadd();\n rX = ReadWord(addr);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n case 0x9F: //STX direct\n addr = dpadd();\n WriteWord(addr,rX);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n case 0xA0: //SUBA indexed\n addr = PostByte();\n rA = oSUB(rA, byteAt(addr));\n break;\n case 0xA1: //CMPA indexed\n addr = PostByte();\n oCMP(rA, byteAt(addr));\n break;\n case 0xA2: //SBCA indexed\n addr = PostByte();\n rA = oSBC(rA, byteAt(addr));\n break;\n case 0xA3: //SUBD indexed\n addr = PostByte();\n setD(oSUB16(getD(),ReadWord(addr)));\n break;\n case 0xA4: //ANDA indexed\n addr = PostByte();\n rA = oAND(rA, byteAt(addr));\n break;\n case 0xA5: //BITA indexed\n addr = PostByte();\n oAND(rA, byteAt(addr));\n break;\n case 0xA6: //LDA indexed\n addr = PostByte();\n rA = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0xA7: //STA indexed\n addr = PostByte();\n byteTo(addr,rA);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0xA8: //EORA indexed\n addr = PostByte();\n rA = oEOR(rA, byteAt(addr));\n break;\n case 0xA9: //ADCA indexed\n addr = PostByte();\n rA = oADC(rA, byteAt(addr));\n break;\n case 0xAA: //ORA indexed\n addr = PostByte();\n rA = oOR(rA, byteAt(addr));\n break;\n case 0xAB: //ADDA indexed\n addr = PostByte();\n rA = oADD(rA, byteAt(addr));\n break;\n case 0xAC: //CMPX indexed\n addr = PostByte();\n oCMP16(rX, ReadWord(addr));\n break;\n\n case 0xAD: //JSR indexed\n addr = PostByte();\n PUSHW(PC);\n PC=addr;\n break;\n case 0xAE: //LDX indexed\n addr = PostByte();\n rX = ReadWord(addr);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n case 0xAF: //STX indexed\n addr = PostByte();\n WriteWord(addr,rX);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n\n\n case 0xB0: //SUBA extended\n addr = fetch16();\n rA = oSUB(rA, byteAt(addr));\n break;\n case 0xB1: //CMPA extended\n addr = fetch16();\n oCMP(rA, byteAt(addr));\n break;\n case 0xB2: //SBCA extended\n addr = fetch16();\n rA = oSBC(rA, byteAt(addr));\n break;\n case 0xB3: //SUBD extended\n addr = fetch16();\n setD(oSUB16(getD(),ReadWord(addr)));\n break;\n case 0xB4: //ANDA extended\n addr = fetch16();\n rA = oAND(rA, byteAt(addr));\n break;\n case 0xB5: //BITA extended\n addr = fetch16();\n oAND(rA, byteAt(addr));\n break;\n case 0xB6: //LDA extended\n addr = fetch16();\n rA = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0xB7: //STA extended\n addr = fetch16();\n byteTo(addr,rA);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0xB8: //EORA extended\n addr = fetch16();\n rA = oEOR(rA, byteAt(addr));\n break;\n case 0xB9: //ADCA extended\n addr = fetch16();\n rA = oADC(rA, byteAt(addr));\n break;\n case 0xBA: //ORA extended\n addr = fetch16();\n rA = oOR(rA, byteAt(addr));\n break;\n case 0xBB: //ADDA extended\n addr = fetch16();\n rA = oADD(rA, byteAt(addr));\n break;\n case 0xBC: //CMPX extended\n addr = fetch16();\n oCMP16(rX, ReadWord(addr));\n break;\n\n case 0xBD: //JSR extended\n addr = fetch16();\n PUSHW(PC);\n PC=addr;\n break;\n case 0xBE: //LDX extended\n addr = fetch16();\n rX = ReadWord(addr);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n case 0xBF: //STX extended\n addr = fetch16();\n WriteWord(addr,rX);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n\n //Regs B, Y\n\n case 0xC0: //SUBB imm\n rB = oSUB(rB, fetch());\n break;\n case 0xC1: //CMPB imm\n oCMP(rB, fetch());\n break;\n case 0xC2: //SBCB imm\n rB = oSBC(rB, fetch());\n break;\n case 0xC3: //ADDD imm\n setD(oADD16(getD(),fetch16()));\n break;\n case 0xC4: //ANDB imm\n rB = oAND(rB, fetch());\n break;\n case 0xC5: //BITB imm\n oAND(rB, fetch());\n break;\n case 0xC6: //LDB imm\n rB = fetch();\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xC8: //EORB imm\n rB = oEOR(rB, fetch());\n break;\n case 0xC9: //ADCB imm\n rB = oADC(rB, fetch());\n break;\n case 0xCA: //ORB imm\n rB = oOR(rB, fetch());\n break;\n case 0xCB: //ADDB imm\n rB = oADD(rB, fetch());\n break;\n case 0xCC: //LDD imm\n addr = fetch16();\n setD(addr);\n flagsNZ16(addr);\n CC&=~F_OVERFLOW;\n break;\n\n case 0xCE: //LDU imm\n rU = fetch16();\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n\n\n case 0xD0: //SUBB direct\n addr = dpadd();\n rB = oSUB(rB, byteAt(addr));\n break;\n case 0xD1: //CMPB direct\n addr = dpadd();\n oCMP(rB, byteAt(addr));\n break;\n case 0xD2: //SBCB direct\n addr = dpadd();\n rB = oSBC(rB, byteAt(addr));\n break;\n case 0xD3: //ADDD direct\n addr = dpadd();\n setD(oADD16(getD(),ReadWord(addr)));\n break;\n case 0xD4: //ANDB direct\n addr = dpadd();\n rB = oAND(rB, byteAt(addr));\n break;\n case 0xD5: //BITB direct\n addr = dpadd();\n oAND(rB, byteAt(addr));\n break;\n case 0xD6: //LDB direct\n addr = dpadd();\n rB = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xD7: //STB direct\n addr = dpadd();\n byteTo(addr,rB);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xD8: //EORB direct\n addr = dpadd();\n rB = oEOR(rB, byteAt(addr));\n break;\n case 0xD9: //ADCB direct\n addr = dpadd();\n rB = oADC(rB, byteAt(addr));\n break;\n case 0xDA: //ORB direct\n addr = dpadd();\n rB = oOR(rB, byteAt(addr));\n break;\n case 0xDB: //ADDB direct\n addr = dpadd();\n rB = oADD(rB, byteAt(addr));\n break;\n case 0xDC: //LDD direct\n addr = dpadd();\n pb = ReadWord(addr);\n setD(pb);\n flagsNZ16(pb);\n CC&=~F_OVERFLOW;\n break;\n\n case 0xDD: //STD direct\n addr = dpadd();\n WriteWord(addr, getD());\n CC&=~F_OVERFLOW;\n break;\n case 0xDE: //LDU direct\n addr = dpadd();\n rU = ReadWord(addr);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n case 0xDF: //STU direct\n addr = dpadd();\n WriteWord(addr,rU);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n case 0xE0: //SUBB indexed\n addr = PostByte();\n rB = oSUB(rB, byteAt(addr));\n break;\n case 0xE1: //CMPB indexed\n addr = PostByte();\n oCMP(rB, byteAt(addr));\n break;\n case 0xE2: //SBCB indexed\n addr = PostByte();\n rB = oSBC(rB, byteAt(addr));\n break;\n case 0xE3: //ADDD indexed\n addr = PostByte();\n setD(oADD16(getD(),ReadWord(addr)));\n break;\n case 0xE4: //ANDB indexed\n addr = PostByte();\n rB = oAND(rB, byteAt(addr));\n break;\n case 0xE5: //BITB indexed\n addr = PostByte();\n oAND(rB, byteAt(addr));\n break;\n case 0xE6: //LDB indexed\n addr = PostByte();\n rB = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xE7: //STB indexed\n addr = PostByte();\n byteTo(addr,rB);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xE8: //EORB indexed\n addr = PostByte();\n rB = oEOR(rB, byteAt(addr));\n break;\n case 0xE9: //ADCB indexed\n addr = PostByte();\n rB = oADC(rB, byteAt(addr));\n break;\n case 0xEA: //ORB indexed\n addr = PostByte();\n rB = oOR(rB, byteAt(addr));\n break;\n case 0xEB: //ADDB indexed\n addr = PostByte();\n rB = oADD(rB, byteAt(addr));\n break;\n case 0xEC: //LDD indexed\n addr = PostByte();\n pb = ReadWord(addr);\n setD(pb);\n flagsNZ16(pb);\n CC&=~F_OVERFLOW;\n break;\n\n case 0xED: //STD indexed\n addr = PostByte();\n WriteWord(addr, getD());\n CC&=~F_OVERFLOW;\n break;\n case 0xEE: //LDU indexed\n addr = PostByte();\n rU = ReadWord(addr);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n case 0xEF: //STU indexed\n addr = PostByte();\n WriteWord(addr,rU);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n\n\n case 0xF0: //SUBB extended\n addr = fetch16();\n rB = oSUB(rB, byteAt(addr));\n break;\n case 0xF1: //CMPB extended\n addr = fetch16();\n oCMP(rB, byteAt(addr));\n break;\n case 0xF2: //SBCB extended\n addr = fetch16();\n rB = oSBC(rB, byteAt(addr));\n break;\n case 0xF3: //ADDD extended\n addr = fetch16();\n setD(oADD16(getD(),ReadWord(addr)));\n break;\n case 0xF4: //ANDB extended\n addr = fetch16();\n rB = oAND(rB, byteAt(addr));\n break;\n case 0xF5: //BITB extended\n addr = fetch16();\n oAND(rB, byteAt(addr));\n break;\n case 0xF6: //LDB extended\n addr = fetch16();\n rB = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xF7: //STB extended\n addr = fetch16();\n byteTo(addr,rB);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xF8: //EORB extended\n addr = fetch16();\n rB = oEOR(rB, byteAt(addr));\n break;\n case 0xF9: //ADCB extended\n addr = fetch16();\n rB = oADC(rB, byteAt(addr));\n break;\n case 0xFA: //ORB extended\n addr = fetch16();\n rB = oOR(rB, byteAt(addr));\n break;\n case 0xFB: //ADDB extended\n addr = fetch16();\n rB = oADD(rB, byteAt(addr));\n break;\n case 0xFC: //LDD extended\n addr = fetch16();\n pb = ReadWord(addr);\n setD(pb);\n flagsNZ16(pb);\n CC&=~F_OVERFLOW;\n break;\n\n case 0xFD: //STD extended\n addr = fetch16();\n WriteWord(addr, getD());\n CC&=~F_OVERFLOW;\n break;\n case 0xFE: //LDU extended\n addr = fetch16();\n rU = ReadWord(addr);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n case 0xFF: //STU extended\n addr = fetch16();\n WriteWord(addr,rU);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n\n // page 1\n case 0x10: //page 1\n {\n opcode = fetch();\n T+=cycles2[opcode];\n switch(opcode) {\n case 0x21: //BRN\n addr = signed16(fetch16());\n break;\n case 0x22: //BHI\n addr = signed16(fetch16());\n if (!(CC&(F_CARRY | F_ZERO))) PC += addr;\n break;\n case 0x23: //BLS\n addr = signed16(fetch16());\n if (CC&(F_CARRY | F_ZERO)) PC += addr;\n break;\n case 0x24: //BCC\n addr = signed16(fetch16());\n if (!(CC&F_CARRY)) PC += addr;\n break;\n case 0x25: //BCS\n addr = signed16(fetch16());\n if (CC&F_CARRY) PC += addr;\n break;\n case 0x26: //BNE\n addr = signed16(fetch16());\n if (!(CC&F_ZERO)) PC += addr;\n break;\n case 0x27: //BEQ\n addr = signed16(fetch16());\n if (CC&F_ZERO) PC += addr;\n break;\n case 0x28: //BVC\n addr = signed16(fetch16());\n if (!(CC&F_OVERFLOW)) PC += addr;\n break;\n case 0x29: //BVS\n addr = signed16(fetch16());\n if (CC&F_OVERFLOW) PC += addr;\n break;\n case 0x2A: //BPL\n addr = signed16(fetch16());\n if (!(CC&F_NEGATIVE)) PC += addr;\n break;\n case 0x2B: //BMI\n addr = signed16(fetch16());\n if (CC&F_NEGATIVE) PC += addr;\n break;\n case 0x2C: //BGE\n addr = signed16(fetch16());\n if (!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2))) PC += addr;\n break;\n case 0x2D: //BLT\n addr = signed16(fetch16());\n if ((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2)) PC += addr;\n break;\n case 0x2E: //BGT\n addr = signed16(fetch16());\n if (!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO))) PC += addr;\n break;\n case 0x2F: //BLE\n addr = signed16(fetch16());\n if ((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO)) PC += addr;\n break;\n case 0x3f: //SWI2\n CC |= F_ENTIRE;\n PUSHW(PC);\n PUSHW(rU);\n PUSHW(rY);\n PUSHW(rX);\n PUSHB(DP);\n PUSHB(rB);\n PUSHB(rA);\n PUSHB(CC);\n CC |= F_IRQMASK | F_FIRQMASK;\n PC = ReadWord(vecSWI2);\n break;\n case 0x83: //CMPD imm\n oCMP16(getD(),fetch16());\n break;\n case 0x8C: //CMPY imm\n oCMP16(rY,fetch16());\n break;\n case 0x8E: //LDY imm\n rY = fetch16();\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0x93: //CMPD direct\n addr = dpadd();\n oCMP16(getD(),ReadWord(addr));\n break;\n case 0x9C: //CMPY direct\n addr = dpadd();\n oCMP16(rY,ReadWord(addr));\n break;\n case 0x9E: //LDY direct\n addr = dpadd();\n rY = ReadWord(addr);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0x9F: //STY direct\n addr = dpadd();\n WriteWord(addr,rY);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xA3: //CMPD indexed\n addr = PostByte();\n oCMP16(getD(),ReadWord(addr));\n break;\n case 0xAC: //CMPY indexed\n addr = PostByte();\n oCMP16(rY,ReadWord(addr));\n break;\n case 0xAE: //LDY indexed\n addr = PostByte();\n rY = ReadWord(addr);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xAF: //STY indexed\n addr = PostByte();\n WriteWord(addr,rY);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xB3: //CMPD extended\n addr = fetch16();\n oCMP16(getD(),ReadWord(addr));\n break;\n case 0xBC: //CMPY extended\n addr = fetch16();\n oCMP16(rY,ReadWord(addr));\n break;\n case 0xBE: //LDY extended\n addr = fetch16();\n rY = ReadWord(addr);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xBF: //STY extended\n addr = fetch16();\n WriteWord(addr,rY);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xCE: //LDS imm\n rS = fetch16();\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xDE: //LDS direct\n addr = dpadd();\n rS = ReadWord(addr);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xDF: //STS direct\n addr = dpadd();\n WriteWord(addr,rS);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xEE: //LDS indexed\n addr = PostByte();\n rS = ReadWord(addr);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xEF: //STS indexed\n addr = PostByte();\n WriteWord(addr,rS);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xFE: //LDS extended\n addr = fetch16();\n rS = ReadWord(addr);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xFF: //STS extended\n addr = fetch16();\n WriteWord(addr,rS);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n }\n }\n break;\n // page 2\n case 0x11: //page 2\n {\n opcode = fetch();\n T+=cycles2[opcode];\n switch(opcode) {\n case 0x3f: //SWI3\n CC |= F_ENTIRE;\n PUSHW(PC);\n PUSHW(rU);\n PUSHW(rY);\n PUSHW(rX);\n PUSHB(DP);\n PUSHB(rB);\n PUSHB(rA);\n PUSHB(CC);\n CC |= F_IRQMASK | F_FIRQMASK;\n PC = ReadWord(vecSWI3);\n break;\n case 0x83: //CMPU imm\n oCMP16(rU, fetch16());\n break;\n case 0x8C: //CMPS imm\n oCMP16(rS, fetch16());\n break;\n case 0x93: //CMPU imm\n addr = dpadd();\n oCMP16(rU, ReadWord(addr));\n break;\n case 0x9C: //CMPS imm\n addr = dpadd();\n oCMP16(rS, ReadWord(addr));\n break;\n case 0xA3: //CMPU imm\n addr = PostByte();\n oCMP16(rU, ReadWord(addr));\n break;\n case 0xAC: //CMPS imm\n addr = PostByte();\n oCMP16(rS, ReadWord(addr));\n break;\n case 0xB3: //CMPU imm\n addr = fetch16();\n oCMP16(rU, ReadWord(addr));\n break;\n case 0xBC: //CMPS imm\n addr = fetch16();\n oCMP16(rS, ReadWord(addr));\n break;\n\n }\n }\n break;\n\n\n }\n\n rA &= 0xff;\n rB &= 0xff;\n CC &= 0xff;\n DP &= 0xff;\n rX &= 0xffff;\n rY &= 0xffff;\n rU &= 0xffff;\n rS &= 0xffff;\n PC &= 0xffff;\n return T-oldT;\n\n};\n\nvar reset = function(){\n PC = ReadWord(vecRESET);\n DP = 0;\n CC |= F_FIRQMASK | F_IRQMASK;\n T=0;\n rA=rB=DP=rX=rY=rU=rS=0;\n};\n\n//---------- Disassembler\n\n/*\nILLEGAL 0\nDIRECT 1\nINHERENT 2\nBRANCH_REL_16 3\nIMMEDIAT_8 4\nBRANCH_REL_8 5\nINDEXED 6\nEXTENDED 7\nIMMEDIAT_16 8\n\nPSHS 10\nPSHU 11\n\nEXG, TFR 20\n*/\nvar ds = [\n[2, 1,\"NEG\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[2, 1,\"COM\"],\n[2, 1,\"LSR\"],\n[1, 0,\"???\"],\n[2, 1,\"ROR\"],\n[2, 1,\"ASR\"],\n[2, 1,\"LSL\"],\n[2, 1,\"ROL\"],\n[2, 1,\"DEC\"],\n[1, 0,\"???\"],\n[2, 1,\"INC\"],\n[2, 1,\"TST\"],\n[2, 1,\"JMP\"],\n[2, 1,\"CLR\"],\n[1, 0,\"Prefix\"],\n[1, 0,\"Prefix\"],\n[1, 2,\"NOP\"],\n[1, 2,\"SYNC\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[3, 3,\"LBRA\"],\n[3, 3,\"LBSR\"],\n[1, 0,\"???\"],\n[1, 2,\"DAA\"],\n[2, 4,\"ORCC\"],\n[1, 0,\"???\"],\n[2, 4,\"ANDCC\"],\n[1, 2,\"SEX\"],\n[2, 20,\"EXG\"],\n[2, 20,\"TFR\"],\n[2, 5,\"BRA\"],\n[2, 5,\"BRN\"],\n[2, 5,\"BHI\"],\n[2, 5,\"BLS\"],\n[2, 5,\"BCC\"],\n[2, 5,\"BCS\"],\n[2, 5,\"BNE\"],\n[2, 5,\"BEQ\"],\n[2, 5,\"BVC\"],\n[2, 5,\"BVS\"],\n[2, 5,\"BPL\"],\n[2, 5,\"BMI\"],\n[2, 5,\"BGE\"],\n[2, 5,\"BLT\"],\n[2, 5,\"BGT\"],\n[2, 5,\"BLE\"],\n[2, 6,\"LEAX\"],\n[2, 6,\"LEAY\"],\n[2, 6,\"LEAS\"],\n[2, 6,\"LEAU\"],\n[2, 10,\"PSHS\"],\n[2, 10,\"PULS\"],\n[2, 11,\"PSHU\"],\n[2, 11,\"PULU\"],\n[1, 0,\"???\"],\n[1, 2,\"RTS\"],\n[1, 2,\"ABX\"],\n[1, 2,\"RTI\"],\n[2, 2,\"CWAI\"],\n[1, 2,\"MUL\"],\n[1, 2,\"RESET\"],\n[1, 2,\"SWI1\"],\n[1, 2,\"NEGA\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[1, 2,\"COMA\"],\n[1, 2,\"LSRA\"],\n[1, 0,\"???\"],\n[1, 2,\"RORA\"],\n[1, 2,\"ASRA\"],\n[1, 2,\"ASLA\"],\n[1, 2,\"ROLA\"],\n[1, 2,\"DECA\"],\n[1, 0,\"???\"],\n[1, 2,\"INCA\"],\n[1, 2,\"TSTA\"],\n[1, 0,\"???\"],\n[1, 2,\"CLRA\"],\n[1, 2,\"NEGB\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[1, 2,\"COMB\"],\n[1, 2,\"LSRB\"],\n[1, 0,\"???\"],\n[1, 2,\"RORB\"],\n[1, 2,\"ASRB\"],\n[1, 2,\"ASLB\"],\n[1, 2,\"ROLB\"],\n[1, 2,\"DECB\"],\n[1, 0,\"???\"],\n[1, 2,\"INCB\"],\n[1, 2,\"TSTB\"],\n[1, 0,\"???\"],\n[1, 2,\"CLRB\"],\n[2, 6,\"NEG\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[2, 6,\"COM\"],\n[2, 6,\"LSR\"],\n[1, 0,\"???\"],\n[2, 6,\"ROR\"],\n[2, 6,\"ASR\"],\n[2, 6,\"LSL\"],\n[2, 6,\"ROL\"],\n[2, 6,\"DEC\"],\n[1, 0,\"???\"],\n[2, 6,\"INC\"],\n[2, 6,\"TST\"],\n[2, 6,\"JMP\"],\n[2, 6,\"CLR\"],\n[3, 7,\"NEG\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[3, 7,\"COM\"],\n[3, 7,\"LSR\"],\n[1, 0,\"???\"],\n[3, 7,\"ROR\"],\n[3, 7,\"ASR\"],\n[3, 7,\"LSL\"],\n[3, 7,\"ROL\"],\n[3, 7,\"DEC\"],\n[1, 0,\"???\"],\n[3, 7,\"INC\"],\n[3, 7,\"TST\"],\n[3, 7,\"JMP\"],\n[3, 7,\"CLR\"],\n[2, 4,\"SUBA\"],\n[2, 4,\"CMPA\"],\n[2, 4,\"SBCA\"],\n[3, 8,\"SUBD\"],\n[2, 4,\"ANDA\"],\n[2, 4,\"BITA\"],\n[2, 4,\"LDA\"],\n[1, 0,\"???\"],\n[2, 4,\"EORA\"],\n[2, 4,\"ADCA\"],\n[2, 4,\"ORA\"],\n[2, 4,\"ADDA\"],\n[3, 8,\"CMPX\"],\n[2, 5,\"BSR\"],\n[3, 8,\"LDX\"],\n[1, 0,\"???\"],\n[2, 1,\"SUBA\"],\n[2, 1,\"CMPA\"],\n[2, 1,\"SBCA\"],\n[2, 1,\"SUBd\"],\n[2, 1,\"ANDA\"],\n[2, 1,\"BITA\"],\n[2, 1,\"LDA\"],\n[2, 1,\"STA\"],\n[2, 1,\"EORA\"],\n[2, 1,\"ADCA\"],\n[2, 1,\"ORA\"],\n[2, 1,\"ADDA\"],\n[2, 1,\"CMPX\"],\n[2, 1,\"JSR\"],\n[2, 1,\"LDX\"],\n[2, 1,\"STX\"],\n[2, 6,\"SUBA\"],\n[2, 6,\"CMPA\"],\n[2, 6,\"SBCA\"],\n[2, 6,\"SUBD\"],\n[2, 6,\"ANDA\"],\n[2, 6,\"BITA\"],\n[2, 6,\"LDA\"],\n[2, 6,\"STA\"],\n[2, 6,\"EORA\"],\n[2, 6,\"ADCA\"],\n[2, 6,\"ORA\"],\n[2, 6,\"ADDA\"],\n[2, 6,\"CMPX\"],\n[2, 6,\"JSR\"],\n[2, 6,\"LDX\"],\n[2, 6,\"STX\"],\n[3, 7,\"SUBA\"],\n[3, 7,\"CMPA\"],\n[3, 7,\"SBCA\"],\n[3, 7,\"SUBD\"],\n[3, 7,\"ANDA\"],\n[3, 7,\"BITA\"],\n[3, 7,\"LDA\"],\n[3, 7,\"STA\"],\n[3, 7,\"EORA\"],\n[3, 7,\"ADCA\"],\n[3, 7,\"ORA\"],\n[3, 7,\"ADDA\"],\n[3, 7,\"CMPX\"],\n[3, 7,\"JSR\"],\n[3, 7,\"LDX\"],\n[3, 7,\"STX\"],\n[2, 4,\"SUBB\"],\n[2, 4,\"CMPB\"],\n[2, 4,\"SBCB\"],\n[3, 8,\"ADDD\"],\n[2, 4,\"ANDB\"],\n[2, 4,\"BITB\"],\n[2, 4,\"LDB\"],\n[1, 0,\"???\"],\n[2, 4,\"EORB\"],\n[2, 4,\"ADCB\"],\n[2, 4,\"ORB\"],\n[2, 4,\"ADDB\"],\n[3, 8,\"LDD\"],\n[1, 0,\"???\"],\n[3, 8,\"LDU\"],\n[1, 0,\"???\"],\n[2, 1,\"SUBB\"],\n[2, 1,\"CMPB\"],\n[2, 1,\"SBCB\"],\n[2, 1,\"ADDD\"],\n[2, 1,\"ANDB\"],\n[2, 1,\"BITB\"],\n[2, 1,\"LDB\"],\n[2, 1,\"STB\"],\n[2, 1,\"EORB\"],\n[2, 1,\"ADCB\"],\n[2, 1,\"ORB \"],\n[2, 1,\"ADDB\"],\n[2, 1,\"LDD \"],\n[2, 1,\"STD \"],\n[2, 1,\"LDU \"],\n[2, 1,\"STU \"],\n[2, 6,\"SUBB\"],\n[2, 6,\"CMPB\"],\n[2, 6,\"SBCB\"],\n[2, 6,\"ADDD\"],\n[2, 6,\"ANDB\"],\n[2, 6,\"BITB\"],\n[2, 6,\"LDB\"],\n[2, 6,\"STB\"],\n[2, 6,\"EORB\"],\n[2, 6,\"ADCB\"],\n[2, 6,\"ORB\"],\n[2, 6,\"ADDB\"],\n[2, 6,\"LDD\"],\n[2, 6,\"STD\"],\n[2, 6,\"LDU\"],\n[2, 6,\"STU\"],\n[3, 7,\"SUBB\"],\n[3, 7,\"CMPB\"],\n[3, 7,\"SBCB\"],\n[3, 7,\"ADDD\"],\n[3, 7,\"ANDB\"],\n[3, 7,\"BITB\"],\n[3, 7,\"LDB\"],\n[3, 7,\"STB\"],\n[3, 7,\"EORB\"],\n[3, 7,\"ADCB\"],\n[3, 7,\"ORB\"],\n[3, 7,\"ADDB\"],\n[3, 7,\"LDD\"],\n[3, 7,\"STD\"],\n[3, 7,\"LDU\"],\n[3, 7,\"STU\"]\n];\n\nvar ds11 = {\n0x3F: [2,2,\"SWI3\"],\n0x83: [4,8,\"CMPU\"],\n0x8C: [4,8,\"CMPS\"],\n0x93: [3,1,\"CMPU\"],\n0x9C: [3,1,\"CMPS\"],\n0xA3: [3,6,\"CMPU\"],\n0xAC: [3,6,\"CMPS\"],\n0xB3: [4,7,\"CMPU\"],\n0xBC: [4,7,\"CMPS\"]\n};\n\nvar ds10 = {\n0x21:[5,3,\"LBRN\"],\n0x22:[5,3,\"LBHI\"],\n0x23:[5,3,\"LBLS\"],\n0x24:[5,3,\"LBCC\"],\n0x25:[5,3,\"LBCS\"],\n0x26:[5,3,\"LBNE\"],\n0x27:[5,3,\"LBEQ\"],\n0x28:[5,3,\"LBVC\"],\n0x29:[5,3,\"LBVS\"],\n0x2a:[5,3,\"LBPL\"],\n0x2b:[5,3,\"LBMI\"],\n0x2c:[5,3,\"LBGE\"],\n0x2d:[5,3,\"LBLT\"],\n0x2e:[5,3,\"LBGT\"],\n0x2f:[5,3,\"LBLE\"],\n0x3F:[2,2,\"SWI2\"],\n0x83:[4,8,\"CMPD\"],\n0x8C:[4,8,\"CMPY\"],\n0x8E:[4,8,\"LDY\"],\n0x93:[3,1,\"CMPD\"],\n0x9C:[3,1,\"CMPY\"],\n0x9E:[3,1,\"LDY\"],\n0x9F:[3,1,\"STY\"],\n0xA3:[3,6,\"CMPD\"],\n0xAC:[3,6,\"CMPY\"],\n0xAE:[3,6,\"LDY\"],\n0xAF:[3,6,\"STY\"],\n0xB3:[4,7,\"CMPD\"],\n0xBC:[4,7,\"CMPY\"],\n0xBE:[4,7,\"LDY\"],\n0xBF:[4,7,\"STY\"],\n0xCE:[4,8,\"LDS\"],\n0xDE:[3,1,\"LDS\"],\n0xDF:[3,1,\"STS\"],\n0xEE:[3,6,\"LDS\"],\n0xEF:[3,6,\"STS\"],\n0xFE:[4,7,\"LDS\"],\n0xFF:[4,7,\"STS\"]\n};\n/*\nILLEGAL 0\nDIRECT 1\nINHERENT 2\nBRANCH_REL_16 3\nIMMEDIAT_8 4\nBRANCH_REL_8 5\nINDEXED 6\nEXTENDED 7\nIMMEDIAT_16 8\n*/\n\nvar disasm = function(i,a,b,c,d,pc) {\n var toHexN = function(n,d) {\n var s = n.toString(16);\n while (s.length >5];\n if (!(pb & 0x80)) {\n //direct5\n var disp = pb & 0x1f;\n if (disp>15) disp = disp-32;\n mnemo+=disp+','+ixr;\n break;\n }\n var ind = pb & 0x10;\n var mod = pb & 0x0f;\n var ofs8 = (b>127)?(b-256):b;\n var ofs16 = ((b*256+c)>32767)?((b*256+c)-65536):(b*256+c);\n if (!ind) {\n switch (mod) {\n case 0: mnemo += \",\"+ixr+'+'; break;\n case 1: mnemo += \",\"+ixr+'++'; break;\n case 2: mnemo += \",-\"+ixr; break;\n case 3: mnemo += \",--\"+ixr; break;\n case 4: mnemo += \",\"+ixr; break;\n case 5: mnemo += \"B,\"+ixr; break;\n case 6: mnemo += \"A,\"+ixr; break;\n case 7: mnemo += \"???\"; break;\n case 8: mnemo += ofs8+\",\"+ixr; bytes++; break;\n case 9: mnemo += ofs16+\",\"+ixr; bytes+=2; break;\n case 10: mnemo += \"???\"; break;\n case 11: mnemo += \"D,\"+ixr; break;\n case 12: mnemo += ofs8+\",PC\"; bytes++; break;\n case 13: mnemo += ofs16+\",PC\"; bytes+=2; break;\n case 14: mnemo += \"???\"; break;\n case 15: mnemo += \"$\"+toHex4((b*256+c)); bytes+=2; break;\n }\n } else {\n switch (mod) {\n case 0: mnemo += \"???\"; break;\n case 1: mnemo += \"[,\"+ixr+'++]'; break;\n case 2: mnemo += \"???\"; break;\n case 3: mnemo += \"[,--\"+ixr+']'; break;\n case 4: mnemo += \"[,\"+ixr+']'; break;\n case 5: mnemo += \"[B,\"+ixr+']'; break;\n case 6: mnemo += \"[A,\"+ixr+']'; break;\n case 7: mnemo += \"???\"; break;\n case 8: mnemo += \"[\"+ofs8+\",\"+ixr+']'; bytes++; break;\n case 9: mnemo += \"[\"+ofs16+\",\"+ixr+']'; bytes+=2; break;\n case 10: mnemo += \"???\"; break;\n case 11: mnemo += \"[D,\"+ixr+']'; break;\n case 12: mnemo += \"[\"+ofs8+\",PC]\"; bytes++; break;\n case 13: mnemo += \"[\"+ofs16+\",PC]\"; bytes+=2; break;\n case 14: mnemo += \"???\"; break;\n case 15: mnemo += \"[$\"+toHex4((b*256+c))+']'; bytes+=2; break;\n }\n }\n\n break;\n case 7: //extended\n mnemo+=\"\\t$\"+toHex4(a*256+b); break;\n case 8: //imm16\n mnemo+=\"\\t#$\"+toHex4(a*256+b); break;\n\n case 10: //pshs, puls\n rx = ['PC','U','Y','X','DP','B','A','CC'];\n ro = [];\n for (j=0;j<8;j++) {\n if ((a & 1)!==0) {ro.push(rx[7-j]);}\n a>>=1;\n }\n mnemo += '\\t'+ro.join(',');\n break;\n case 11: //pshs, puls\n rx = ['PC','S','Y','X','DP','B','A','CC'];\n ro = [];\n for (j=0;j<8;j++) {\n if ((a & 1)!==0) {ro.push(rx[7-j]);}\n a>>=1;\n }\n mnemo += '\\t'+ro.join(',');\n break;\n case 20: //TFR etc\n rx = ['D','X','Y','U','S','PC','?','?','A','B','CC','DP','?','?','?','?'];\n mnemo += '\\t'+rx[a>>4]+','+rx[a&0x0f];\n break;\n }\n\n return {line:mnemo,nbytes:bytes};\n };\n\n\n//---------- Exports\n\nreturn {\n steps: function(Ts){\n //T=0;\n while (Ts>0){\n Ts-=step();\n }\n },\n runFrame: function(Tt){\n while (T>i);\n if (n===0) {f+=fx[i].toLowerCase();} else {f+=fx[i];}\n }\n return f;\n },\n disasm: disasm,\n isStable: function() { return true; }\n};\n\n};\n", "\nimport { CPU, Bus, ClockBased, SavesState, Interruptable } from \"../devices\";\n\n// Copyright 2015 by Paulo Augusto Peccin. See license.txt distributed with this file.\n\nexport var _MOS6502 = function() {\n var self = this;\n\n this.powerOn = function() {\n this.reset();\n };\n\n this.powerOff = function() {\n };\n\n this.clockPulse = function() {\n if (!RDY) return; // TODO Should be ignored in the last cycle of the instruction\n T++;\n instruction[T]();\n };\n\n this.connectBus = function(aBus) {\n bus = aBus;\n };\n\n this.setRDY = function(boo) {\n RDY = boo;\n };\n\n this.isRDY = function() {\n return RDY;\n }\n\n this.reset = function() {\n I = 1;\n T = -1;\n instruction = [ fetchOpcodeAndDecodeInstruction ]; // Bootstrap instruction\n PC = bus.read(RESET_VECTOR) | (bus.read(RESET_VECTOR + 1) << 8);\n this.setRDY(true);\n };\n\n // Interfaces\n var bus : Bus;\n var RDY : boolean = false;\n\n // Registers\n var PC : number = 0;\n var SP : number = 0;\n var A : number = 0;\n var X : number = 0;\n var Y : number = 0;\n\n // Status Bits\n var N : number = 0;\n var V : number = 0;\n var D : number = 0;\n var I : number = 0;\n var Z : number = 0;\n var C : number = 0;\n\n // Internal decoding registers\n var T : number = -1;\n var opcode : number = -1;\n var instruction : (() => void)[];\n var data : number = 0;\n var AD : number = 0;\n var BA : number = 0;\n var BALCrossed : boolean = false;\n var IA : number = 0;\n var branchOffset : number = 0;\n var branchOffsetCrossAdjust : number = 0;\n\n // Vectors\n const NMI_VECTOR = 0xfffa;\n const RESET_VECTOR = 0xfffc;\n const IRQ_VECTOR = 0xfffe;\n\n // Index registers names\n const rX = 0;\n const rY = 1;\n\n // Status bits names\n const bN = 7;\n const bV = 6;\n // const bE = 5;\t// Not used\n // const bB = 4;\t// Not used\n // const bD = 3; // Not used\n // const bI = 2; // Not used\n const bZ = 1;\n const bC = 0;\n\n // Auxiliary variables\n // TODO\n //noinspection JSUnusedGlobalSymbols\n this.debug = false;\n //noinspection JSUnusedGlobalSymbols\n this.trace = false;\n\n\n // Internal operations\n\n var fetchOpcodeAndDecodeInstruction = function() {\n opcode = bus.read(PC);\n instruction = instructions[opcode];\n T = 0;\n\n // if (self.trace) self.breakpoint(\"TRACE\");\n // console.log(\"PC: \" + PC + \", op: \" + opcode + \": \" + opcodes[opcode]);\n\n PC++;\n };\n\n var fetchNextOpcode = fetchOpcodeAndDecodeInstruction;\n\n var fetchOpcodeAndDiscard = function() {\n bus.read(PC);\n };\n\n var fetchBranchOffset = function() {\n branchOffset = bus.read(PC);\n PC++;\n };\n\n var fetchADL = function() {\n AD = bus.read(PC);\n PC++;\n };\n\n var fetchADH = function() {\n AD |= bus.read(PC) << 8;\n PC++;\n };\n\n var fetchADLFromBA = function() {\n AD = bus.read(BA);\n };\n\n var fetchADHFromBA = function() {\n AD |= bus.read(BA) << 8;\n };\n\n var fetchBAL = function() {\n BA = bus.read(PC);\n PC++;\n };\n\n var fetchBAH = function() {\n BA |= bus.read(PC) << 8;\n PC++;\n };\n\n var fetchBALFromIA = function() {\n BA = bus.read(IA);\n };\n\n var fetchBAHFromIA = function() {\n BA |= bus.read(IA) << 8;\n };\n\n var addXtoBAL = function() {\n var low = (BA & 255) + X;\n BALCrossed = low > 255;\n BA = (BA & 0xff00) | (low & 255);\n };\n\n var addYtoBAL = function() {\n var low = (BA & 255) + Y;\n BALCrossed = low > 255;\n BA = (BA & 0xff00) | (low & 255);\n };\n\n var add1toBAL = function() {\n var low = (BA & 255) + 1;\n BALCrossed = low > 255;\n BA = (BA & 0xff00) | (low & 255);\n };\n\n var add1toBAHifBALCrossed = function() {\n if (BALCrossed)\n BA = (BA + 0x0100) & 0xffff;\n };\n\n var fetchIAL = function() {\n IA = bus.read(PC);\n PC++;\n };\n\n var fetchIAH = function() {\n IA |= bus.read(PC) << 8;\n PC++;\n };\n\n var add1toIAL = function() {\n var low = (IA & 255) + 1;\n IA = (IA & 0xff00) | (low & 255);\n };\n\n var fetchDataFromImmediate = function() {\n data = bus.read(PC);\n PC++;\n };\n\n var fetchDataFromAD = function() {\n data = bus.read(AD);\n };\n\n var fetchDataFromBA = function() {\n data = bus.read(BA);\n };\n\n var writeDataToAD = function() {\n bus.write(AD, data);\n };\n\n var writeDataToBA = function() {\n bus.write(BA, data);\n };\n\n var addBranchOffsetToPCL = function() {\n var oldLow = (PC & 0x00ff);\n var newLow = (oldLow + branchOffset) & 255;\n // Negative offset?\n if (branchOffset > 127)\n branchOffsetCrossAdjust = (newLow > oldLow) ? -0x0100 : 0;\n else\n branchOffsetCrossAdjust = (newLow < oldLow) ? 0x0100 : 0;\n PC = (PC & 0xff00) | newLow;\n };\n\n var adjustPCHForBranchOffsetCross = function() {\n PC = (PC + branchOffsetCrossAdjust) & 0xffff;\n };\n\n var setZ = function(val) {\n Z = (val === 0) ? 1 : 0;\n };\n\n var setN = function(val) {\n N = (val & 0x080) ? 1 : 0;\n };\n\n var setV = function(boo) {\n V = boo ? 1 : 0;\n };\n\n var setC = function(boo) {\n C = boo ? 1 : 0;\n };\n\n var popFromStack = function() {\n SP = (SP + 1) & 255;\n return bus.read(0x0100 + SP);\n };\n\n var peekFromStack = function() {\n return bus.read(0x0100 + SP);\n };\n\n var pushToStack = function(val) {\n bus.write(0x0100 + SP, val);\n SP = (SP - 1) & 255;\n };\n\n var getStatusBits = function() {\n return N << 7 | V << 6 | 0x30 // Always push with E (bit 5) and B (bit 4) ON\n | D << 3 | I << 2 | Z << 1 | C;\n };\n\n var setStatusBits = function(val) {\n N = val >>> 7; V = val >>> 6 & 1; // E and B flags actually do not exist as real flags, so ignore\n D = val >>> 3 & 1; I = val >>> 2 & 1; Z = val >>> 1 & 1; C = val & 1;\n };\n\n var illegalOpcode = function(op) {\n if (self.debug) self.breakpoint(\"Illegal Opcode: \" + op);\n };\n\n\n // Addressing routines\n\n var implied = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var immediateRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchDataFromImmediate,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var zeroPageRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL, // ADH will be zero\n fetchDataFromAD,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var absoluteRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n fetchADH,\n fetchDataFromAD,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var indirectXRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addXtoBAL();\n fetchADLFromBA();\n },\n function() {\n add1toBAL();\n fetchADHFromBA();\n },\n fetchDataFromAD,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var absoluteIndexedRead = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL,\n fetchBAH,\n function() {\n addIndex();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n function() {\n if (BALCrossed) {\n fetchDataFromBA();\n } else {\n operation();\n fetchNextOpcode();\n }\n },\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n };\n\n var zeroPageIndexedRead = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addIndex();\n fetchDataFromBA();\n },\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n };\n\n var indirectYRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchIAL, // IAH will be zero\n fetchBALFromIA,\n function() {\n add1toIAL();\n fetchBAHFromIA();\n },\n function() {\n addYtoBAL();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n function() {\n if(BALCrossed) {\n fetchDataFromBA();\n } else {\n operation();\n fetchNextOpcode();\n }\n },\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var zeroPageWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL, // ADH will be zero\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var absoluteWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n fetchADH,\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var indirectXWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addXtoBAL();\n fetchADLFromBA();\n },\n function() {\n add1toBAL();\n fetchADHFromBA();\n },\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var absoluteIndexedWrite = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL,\n fetchBAH,\n function() {\n addIndex();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n function() {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n };\n\n var zeroPageIndexedWrite = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addIndex();\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n };\n\n var indirectYWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchIAL, // IAH will be zero\n fetchBALFromIA,\n function() {\n add1toIAL();\n fetchBAHFromIA();\n },\n function() {\n addYtoBAL();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n function() {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n\n\n var zeroPageReadModifyWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL, // ADH will be zero\n fetchDataFromAD,\n writeDataToAD,\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var absoluteReadModifyWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n fetchADH,\n fetchDataFromAD,\n writeDataToAD,\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var zeroPageIndexedReadModifyWrite = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function () {\n addIndex();\n fetchDataFromBA();\n },\n writeDataToBA,\n function () {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n };\n\n var absoluteIndexedReadModifyWrite = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL,\n fetchBAH,\n function () {\n addIndex();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n fetchDataFromBA,\n writeDataToBA,\n function () {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n };\n\n var indirectXReadModifyWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addXtoBAL();\n fetchADLFromBA();\n },\n function() {\n add1toBAL();\n fetchADHFromBA();\n },\n fetchDataFromAD,\n writeDataToAD,\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var indirectYReadModifyWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchIAL, // IAH will be zero\n fetchBALFromIA,\n function() {\n add1toIAL();\n fetchBAHFromIA();\n },\n function() {\n addYtoBAL();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n fetchDataFromBA,\n writeDataToBA,\n function() {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n\n\n // Instructions ========================================================================================\n\n // Complete instruction set\n var opcodes = new Array(256);\n var instructions = new Array(256);\n\n opcodes[0x00] = \"BRK\"; instructions[0x00] = BRK();\n opcodes[0x01] = \"ORA\"; instructions[0x01] = ORA(indirectXRead);\n opcodes[0x02] = \"uKIL\"; instructions[0x02] = uKIL();\n opcodes[0x03] = \"uSLO\"; instructions[0x03] = uSLO(indirectXReadModifyWrite);\n opcodes[0x04] = \"uNOP\"; instructions[0x04] = uNOP(zeroPageRead);\n opcodes[0x05] = \"ORA\"; instructions[0x05] = ORA(zeroPageRead);\n opcodes[0x06] = \"ASL\"; instructions[0x06] = ASL(zeroPageReadModifyWrite);\n opcodes[0x07] = \"uSLO\"; instructions[0x07] = uSLO(zeroPageReadModifyWrite);\n opcodes[0x08] = \"PHP\"; instructions[0x08] = PHP();\n opcodes[0x09] = \"ORA\"; instructions[0x09] = ORA(immediateRead);\n opcodes[0x0a] = \"ASL\"; instructions[0x0a] = ASL_ACC();\n opcodes[0x0b] = \"uANC\"; instructions[0x0b] = uANC(immediateRead);\n opcodes[0x0c] = \"uNOP\"; instructions[0x0c] = uNOP(absoluteRead);\n opcodes[0x0d] = \"ORA\"; instructions[0x0d] = ORA(absoluteRead);\n opcodes[0x0e] = \"ASL\"; instructions[0x0e] = ASL(absoluteReadModifyWrite);\n opcodes[0x0f] = \"uSLO\"; instructions[0x0f] = uSLO(absoluteReadModifyWrite);\n opcodes[0x10] = \"BPL\"; instructions[0x10] = Bxx(bN, 0); // BPL\n opcodes[0x11] = \"ORA\"; instructions[0x11] = ORA(indirectYRead);\n opcodes[0x12] = \"uKIL\"; instructions[0x12] = uKIL();\n opcodes[0x13] = \"uSLO\"; instructions[0x13] = uSLO(indirectYReadModifyWrite);\n opcodes[0x14] = \"uNOP\"; instructions[0x14] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0x15] = \"ORA\"; instructions[0x15] = ORA(zeroPageIndexedRead(rX));\n opcodes[0x16] = \"ASL\"; instructions[0x16] = ASL(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x17] = \"uSLO\"; instructions[0x17] = uSLO(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x18] = \"CLC\"; instructions[0x18] = CLC();\n opcodes[0x19] = \"ORA\"; instructions[0x19] = ORA(absoluteIndexedRead(rY));\n opcodes[0x1a] = \"uNOP\"; instructions[0x1a] = uNOP(implied);\n opcodes[0x1b] = \"uSLO\"; instructions[0x1b] = uSLO(absoluteIndexedReadModifyWrite(rY));\n opcodes[0x1c] = \"uNOP\"; instructions[0x1c] = uNOP(absoluteIndexedRead(rX));\n opcodes[0x1d] = \"ORA\"; instructions[0x1d] = ORA(absoluteIndexedRead(rX));\n opcodes[0x1e] = \"ASL\"; instructions[0x1e] = ASL(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x1f] = \"uSLO\"; instructions[0x1f] = uSLO(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x20] = \"JSR\"; instructions[0x20] = JSR();\n opcodes[0x21] = \"AND\"; instructions[0x21] = AND(indirectXRead);\n opcodes[0x22] = \"uKIL\"; instructions[0x22] = uKIL();\n opcodes[0x23] = \"uRLA\"; instructions[0x23] = uRLA(indirectXReadModifyWrite);\n opcodes[0x24] = \"BIT\"; instructions[0x24] = BIT(zeroPageRead);\n opcodes[0x25] = \"AND\"; instructions[0x25] = AND(zeroPageRead);\n opcodes[0x26] = \"ROL\"; instructions[0x26] = ROL(zeroPageReadModifyWrite);\n opcodes[0x27] = \"uRLA\"; instructions[0x27] = uRLA(zeroPageReadModifyWrite);\n opcodes[0x28] = \"PLP\"; instructions[0x28] = PLP();\n opcodes[0x29] = \"AND\"; instructions[0x29] = AND(immediateRead);\n opcodes[0x2a] = \"ROL\"; instructions[0x2a] = ROL_ACC();\n opcodes[0x2b] = \"uANC\"; instructions[0x2b] = uANC(immediateRead);\n opcodes[0x2c] = \"BIT\"; instructions[0x2c] = BIT(absoluteRead);\n opcodes[0x2d] = \"AND\"; instructions[0x2d] = AND(absoluteRead);\n opcodes[0x2e] = \"ROL\"; instructions[0x2e] = ROL(absoluteReadModifyWrite);\n opcodes[0x2f] = \"uRLA\"; instructions[0x2f] = uRLA(absoluteReadModifyWrite);\n opcodes[0x30] = \"BMI\"; instructions[0x30] = Bxx(bN, 1); // BMI\n opcodes[0x31] = \"AND\"; instructions[0x31] = AND(indirectYRead);\n opcodes[0x32] = \"uKIL\"; instructions[0x32] = uKIL();\n opcodes[0x33] = \"uRLA\"; instructions[0x33] = uRLA(indirectYReadModifyWrite);\n opcodes[0x34] = \"uNOP\"; instructions[0x34] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0x35] = \"AND\"; instructions[0x35] = AND(zeroPageIndexedRead(rX));\n opcodes[0x36] = \"ROL\"; instructions[0x36] = ROL(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x37] = \"uRLA\"; instructions[0x37] = uRLA(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x38] = \"SEC\"; instructions[0x38] = SEC();\n opcodes[0x39] = \"AND\"; instructions[0x39] = AND(absoluteIndexedRead(rY));\n opcodes[0x3a] = \"uNOP\"; instructions[0x3a] = uNOP(implied);\n opcodes[0x3b] = \"uRLA\"; instructions[0x3b] = uRLA(absoluteIndexedReadModifyWrite(rY));\n opcodes[0x3c] = \"uNOP\"; instructions[0x3c] = uNOP(absoluteIndexedRead(rX));\n opcodes[0x3d] = \"AND\"; instructions[0x3d] = AND(absoluteIndexedRead(rX));\n opcodes[0x3e] = \"ROL\"; instructions[0x3e] = ROL(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x3f] = \"uRLA\"; instructions[0x3f] = uRLA(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x40] = \"RTI\"; instructions[0x40] = RTI();\n opcodes[0x41] = \"EOR\"; instructions[0x41] = EOR(indirectXRead);\n opcodes[0x42] = \"uKIL\"; instructions[0x42] = uKIL();\n opcodes[0x43] = \"uSRE\"; instructions[0x43] = uSRE(indirectXReadModifyWrite);\n opcodes[0x44] = \"uNOP\"; instructions[0x44] = uNOP(zeroPageRead);\n opcodes[0x45] = \"EOR\"; instructions[0x45] = EOR(zeroPageRead);\n opcodes[0x46] = \"LSR\"; instructions[0x46] = LSR(zeroPageReadModifyWrite);\n opcodes[0x47] = \"uSRE\"; instructions[0x47] = uSRE(zeroPageReadModifyWrite);\n opcodes[0x48] = \"PHA\"; instructions[0x48] = PHA();\n opcodes[0x49] = \"EOR\"; instructions[0x49] = EOR(immediateRead);\n opcodes[0x4a] = \"LSR\"; instructions[0x4a] = LSR_ACC();\n opcodes[0x4b] = \"uASR\"; instructions[0x4b] = uASR(immediateRead);\n opcodes[0x4c] = \"JMP\"; instructions[0x4c] = JMP_ABS();\n opcodes[0x4d] = \"EOR\"; instructions[0x4d] = EOR(absoluteRead);\n opcodes[0x4e] = \"LSR\"; instructions[0x4e] = LSR(absoluteReadModifyWrite);\n opcodes[0x4f] = \"uSRE\"; instructions[0x4f] = uSRE(absoluteReadModifyWrite);\n opcodes[0x50] = \"BVC\"; instructions[0x50] = Bxx(bV, 0); // BVC\n opcodes[0x51] = \"EOR\"; instructions[0x51] = EOR(indirectYRead);\n opcodes[0x52] = \"uKIL\"; instructions[0x52] = uKIL();\n opcodes[0x53] = \"uSRE\"; instructions[0x53] = uSRE(indirectYReadModifyWrite);\n opcodes[0x54] = \"uNOP\"; instructions[0x54] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0x55] = \"EOR\"; instructions[0x55] = EOR(zeroPageIndexedRead(rX));\n opcodes[0x56] = \"LSR\"; instructions[0x56] = LSR(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x57] = \"uSRE\"; instructions[0x57] = uSRE(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x58] = \"CLI\"; instructions[0x58] = CLI();\n opcodes[0x59] = \"EOR\"; instructions[0x59] = EOR(absoluteIndexedRead(rY));\n opcodes[0x5a] = \"uNOP\"; instructions[0x5a] = uNOP(implied);\n opcodes[0x5b] = \"uSRE\"; instructions[0x5b] = uSRE(absoluteIndexedReadModifyWrite(rY));\n opcodes[0x5c] = \"uNOP\"; instructions[0x5c] = uNOP(absoluteIndexedRead(rX));\n opcodes[0x5d] = \"EOR\"; instructions[0x5d] = EOR(absoluteIndexedRead(rX));\n opcodes[0x5e] = \"LSR\"; instructions[0x5e] = LSR(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x5f] = \"uSRE\"; instructions[0x5f] = uSRE(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x60] = \"RTS\"; instructions[0x60] = RTS();\n opcodes[0x61] = \"ADC\"; instructions[0x61] = ADC(indirectXRead);\n opcodes[0x62] = \"uKIL\"; instructions[0x62] = uKIL();\n opcodes[0x63] = \"uRRA\"; instructions[0x63] = uRRA(indirectXReadModifyWrite);\n opcodes[0x64] = \"uNOP\"; instructions[0x64] = uNOP(zeroPageRead);\n opcodes[0x65] = \"ADC\"; instructions[0x65] = ADC(zeroPageRead);\n opcodes[0x66] = \"ROR\"; instructions[0x66] = ROR(zeroPageReadModifyWrite);\n opcodes[0x67] = \"uRRA\"; instructions[0x67] = uRRA(zeroPageReadModifyWrite);\n opcodes[0x68] = \"PLA\"; instructions[0x68] = PLA();\n opcodes[0x69] = \"ADC\"; instructions[0x69] = ADC(immediateRead);\n opcodes[0x6a] = \"ROR\"; instructions[0x6a] = ROR_ACC();\n opcodes[0x6b] = \"uARR\"; instructions[0x6b] = uARR(immediateRead);\n opcodes[0x6c] = \"JMP\"; instructions[0x6c] = JMP_IND();\n opcodes[0x6d] = \"ADC\"; instructions[0x6d] = ADC(absoluteRead);\n opcodes[0x6e] = \"ROR\"; instructions[0x6e] = ROR(absoluteReadModifyWrite);\n opcodes[0x6f] = \"uRRA\"; instructions[0x6f] = uRRA(absoluteReadModifyWrite);\n opcodes[0x70] = \"BVS\"; instructions[0x70] = Bxx(bV, 1); // BVS\n opcodes[0x71] = \"ADC\"; instructions[0x71] = ADC(indirectYRead);\n opcodes[0x72] = \"uKIL\"; instructions[0x72] = uKIL();\n opcodes[0x73] = \"uRRA\"; instructions[0x73] = uRRA(indirectYReadModifyWrite);\n opcodes[0x74] = \"uNOP\"; instructions[0x74] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0x75] = \"ADC\"; instructions[0x75] = ADC(zeroPageIndexedRead(rX));\n opcodes[0x76] = \"ROR\"; instructions[0x76] = ROR(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x77] = \"uRRA\"; instructions[0x77] = uRRA(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x78] = \"SEI\"; instructions[0x78] = SEI();\n opcodes[0x79] = \"ADC\"; instructions[0x79] = ADC(absoluteIndexedRead(rY));\n opcodes[0x7a] = \"uNOP\"; instructions[0x7a] = uNOP(implied);\n opcodes[0x7b] = \"uRRA\"; instructions[0x7b] = uRRA(absoluteIndexedReadModifyWrite(rY));\n opcodes[0x7c] = \"uNOP\"; instructions[0x7c] = uNOP(absoluteIndexedRead(rX));\n opcodes[0x7d] = \"ADC\"; instructions[0x7d] = ADC(absoluteIndexedRead(rX));\n opcodes[0x7e] = \"ROR\"; instructions[0x7e] = ROR(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x7f] = \"uRRA\"; instructions[0x7f] = uRRA(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x80] = \"uNOP\"; instructions[0x80] = uNOP(immediateRead);\n opcodes[0x81] = \"STA\"; instructions[0x81] = STA(indirectXWrite);\n opcodes[0x82] = \"uNOP\"; instructions[0x82] = uNOP(immediateRead);\n opcodes[0x83] = \"uSAX\"; instructions[0x83] = uSAX(indirectXWrite);\n opcodes[0x84] = \"STY\"; instructions[0x84] = STY(zeroPageWrite);\n opcodes[0x85] = \"STA\"; instructions[0x85] = STA(zeroPageWrite);\n opcodes[0x86] = \"STX\"; instructions[0x86] = STX(zeroPageWrite);\n opcodes[0x87] = \"uSAX\"; instructions[0x87] = uSAX(zeroPageWrite);\n opcodes[0x88] = \"DEY\"; instructions[0x88] = DEY();\n opcodes[0x89] = \"uNOP\"; instructions[0x89] = uNOP(immediateRead);\n opcodes[0x8a] = \"TXA\"; instructions[0x8a] = TXA();\n opcodes[0x8b] = \"uANE\"; instructions[0x8b] = uANE(immediateRead);\n opcodes[0x8c] = \"STY\"; instructions[0x8c] = STY(absoluteWrite);\n opcodes[0x8d] = \"STA\"; instructions[0x8d] = STA(absoluteWrite);\n opcodes[0x8e] = \"STX\"; instructions[0x8e] = STX(absoluteWrite);\n opcodes[0x8f] = \"uSAX\"; instructions[0x8f] = uSAX(absoluteWrite);\n opcodes[0x90] = \"BCC\"; instructions[0x90] = Bxx(bC, 0); // BCC\n opcodes[0x91] = \"STA\"; instructions[0x91] = STA(indirectYWrite);\n opcodes[0x92] = \"uKIL\"; instructions[0x92] = uKIL();\n opcodes[0x93] = \"uSHA\"; instructions[0x93] = uSHA(indirectYWrite);\n opcodes[0x94] = \"STY\"; instructions[0x94] = STY(zeroPageIndexedWrite(rX));\n opcodes[0x95] = \"STA\"; instructions[0x95] = STA(zeroPageIndexedWrite(rX));\n opcodes[0x96] = \"STX\"; instructions[0x96] = STX(zeroPageIndexedWrite(rY));\n opcodes[0x97] = \"uSAX\"; instructions[0x97] = uSAX(zeroPageIndexedWrite(rY));\n opcodes[0x98] = \"TYA\"; instructions[0x98] = TYA();\n opcodes[0x99] = \"STA\"; instructions[0x99] = STA(absoluteIndexedWrite(rY));\n opcodes[0x9a] = \"TXS\"; instructions[0x9a] = TXS();\n opcodes[0x9b] = \"uSHS\"; instructions[0x9b] = uSHS(absoluteIndexedWrite(rY));\n opcodes[0x9c] = \"uSHY\"; instructions[0x9c] = uSHY(absoluteIndexedWrite(rX));\n opcodes[0x9d] = \"STA\"; instructions[0x9d] = STA(absoluteIndexedWrite(rX));\n opcodes[0x9e] = \"uSHX\"; instructions[0x9e] = uSHX(absoluteIndexedWrite(rY));\n opcodes[0x9f] = \"uSHA\"; instructions[0x9f] = uSHA(absoluteIndexedWrite(rY));\n opcodes[0xa0] = \"LDY\"; instructions[0xa0] = LDY(immediateRead);\n opcodes[0xa1] = \"LDA\"; instructions[0xa1] = LDA(indirectXRead);\n opcodes[0xa2] = \"LDX\"; instructions[0xa2] = LDX(immediateRead);\n opcodes[0xa3] = \"uLAX\"; instructions[0xa3] = uLAX(indirectXRead);\n opcodes[0xa4] = \"LDY\"; instructions[0xa4] = LDY(zeroPageRead);\n opcodes[0xa5] = \"LDA\"; instructions[0xa5] = LDA(zeroPageRead);\n opcodes[0xa6] = \"LDX\"; instructions[0xa6] = LDX(zeroPageRead);\n opcodes[0xa7] = \"uLAX\"; instructions[0xa7] = uLAX(zeroPageRead);\n opcodes[0xa8] = \"TAY\"; instructions[0xa8] = TAY();\n opcodes[0xa9] = \"LDA\"; instructions[0xa9] = LDA(immediateRead);\n opcodes[0xaa] = \"TAX\"; instructions[0xaa] = TAX();\n opcodes[0xab] = \"uLXA\"; instructions[0xab] = uLXA(immediateRead);\n opcodes[0xac] = \"LDY\"; instructions[0xac] = LDY(absoluteRead);\n opcodes[0xad] = \"LDA\"; instructions[0xad] = LDA(absoluteRead);\n opcodes[0xae] = \"LDX\"; instructions[0xae] = LDX(absoluteRead);\n opcodes[0xaf] = \"uLAX\"; instructions[0xaf] = uLAX(absoluteRead);\n opcodes[0xb0] = \"BCS\"; instructions[0xb0] = Bxx(bC, 1); // BCS\n opcodes[0xb1] = \"LDA\"; instructions[0xb1] = LDA(indirectYRead);\n opcodes[0xb2] = \"uKIL\"; instructions[0xb2] = uKIL();\n opcodes[0xb3] = \"uLAX\"; instructions[0xb3] = uLAX(indirectYRead);\n opcodes[0xb4] = \"LDY\"; instructions[0xb4] = LDY(zeroPageIndexedRead(rX));\n opcodes[0xb5] = \"LDA\"; instructions[0xb5] = LDA(zeroPageIndexedRead(rX));\n opcodes[0xb6] = \"LDX\"; instructions[0xb6] = LDX(zeroPageIndexedRead(rY));\n opcodes[0xb7] = \"uLAX\"; instructions[0xb7] = uLAX(zeroPageIndexedRead(rY));\n opcodes[0xb8] = \"CLV\"; instructions[0xb8] = CLV();\n opcodes[0xb9] = \"LDA\"; instructions[0xb9] = LDA(absoluteIndexedRead(rY));\n opcodes[0xba] = \"TSX\"; instructions[0xba] = TSX();\n opcodes[0xbb] = \"uLAS\"; instructions[0xbb] = uLAS(absoluteIndexedRead(rY));\n opcodes[0xbc] = \"LDY\"; instructions[0xbc] = LDY(absoluteIndexedRead(rX));\n opcodes[0xbd] = \"LDA\"; instructions[0xbd] = LDA(absoluteIndexedRead(rX));\n opcodes[0xbe] = \"LDX\"; instructions[0xbe] = LDX(absoluteIndexedRead(rY));\n opcodes[0xbf] = \"uLAX\"; instructions[0xbf] = uLAX(absoluteIndexedRead(rY));\n opcodes[0xc0] = \"CPY\"; instructions[0xc0] = CPY(immediateRead);\n opcodes[0xc1] = \"CMP\"; instructions[0xc1] = CMP(indirectXRead);\n opcodes[0xc2] = \"uNOP\"; instructions[0xc2] = uNOP(immediateRead);\n opcodes[0xc3] = \"uDCP\"; instructions[0xc3] = uDCP(indirectXReadModifyWrite);\n opcodes[0xc4] = \"CPY\"; instructions[0xc4] = CPY(zeroPageRead);\n opcodes[0xc5] = \"CMP\"; instructions[0xc5] = CMP(zeroPageRead);\n opcodes[0xc6] = \"DEC\"; instructions[0xc6] = DEC(zeroPageReadModifyWrite);\n opcodes[0xc7] = \"uDCP\"; instructions[0xc7] = uDCP(zeroPageReadModifyWrite);\n opcodes[0xc8] = \"INY\"; instructions[0xc8] = INY();\n opcodes[0xc9] = \"CMP\"; instructions[0xc9] = CMP(immediateRead);\n opcodes[0xca] = \"DEX\"; instructions[0xca] = DEX();\n opcodes[0xcb] = \"uSBX\"; instructions[0xcb] = uSBX(immediateRead);\n opcodes[0xcc] = \"CPY\"; instructions[0xcc] = CPY(absoluteRead);\n opcodes[0xcd] = \"CMP\"; instructions[0xcd] = CMP(absoluteRead);\n opcodes[0xce] = \"DEC\"; instructions[0xce] = DEC(absoluteReadModifyWrite);\n opcodes[0xcf] = \"uDCP\"; instructions[0xcf] = uDCP(absoluteReadModifyWrite);\n opcodes[0xd0] = \"BNE\"; instructions[0xd0] = Bxx(bZ, 0); // BNE\n opcodes[0xd1] = \"CMP\"; instructions[0xd1] = CMP(indirectYRead);\n opcodes[0xd2] = \"uKIL\"; instructions[0xd2] = uKIL();\n opcodes[0xd3] = \"uDCP\"; instructions[0xd3] = uDCP(indirectYReadModifyWrite);\n opcodes[0xd4] = \"uNOP\"; instructions[0xd4] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0xd5] = \"CMP\"; instructions[0xd5] = CMP(zeroPageIndexedRead(rX));\n opcodes[0xd6] = \"DEC\"; instructions[0xd6] = DEC(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0xd7] = \"uDCP\"; instructions[0xd7] = uDCP(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0xd8] = \"CLD\"; instructions[0xd8] = CLD();\n opcodes[0xd9] = \"CMP\"; instructions[0xd9] = CMP(absoluteIndexedRead(rY));\n opcodes[0xda] = \"uNOP\"; instructions[0xda] = uNOP(implied);\n opcodes[0xdb] = \"uDCP\"; instructions[0xdb] = uDCP(absoluteIndexedReadModifyWrite(rY));\n opcodes[0xdc] = \"uNOP\"; instructions[0xdc] = uNOP(absoluteIndexedRead(rX));\n opcodes[0xdd] = \"CMP\"; instructions[0xdd] = CMP(absoluteIndexedRead(rX));\n opcodes[0xde] = \"DEC\"; instructions[0xde] = DEC(absoluteIndexedReadModifyWrite(rX));\n opcodes[0xdf] = \"uDCP\"; instructions[0xdf] = uDCP(absoluteIndexedReadModifyWrite(rX));\n opcodes[0xe0] = \"CPX\"; instructions[0xe0] = CPX(immediateRead);\n opcodes[0xe1] = \"SBC\"; instructions[0xe1] = SBC(indirectXRead);\n opcodes[0xe2] = \"uNOP\"; instructions[0xe2] = uNOP(immediateRead);\n opcodes[0xe3] = \"uISB\"; instructions[0xe3] = uISB(indirectXReadModifyWrite);\n opcodes[0xe4] = \"CPX\"; instructions[0xe4] = CPX(zeroPageRead);\n opcodes[0xe5] = \"SBC\"; instructions[0xe5] = SBC(zeroPageRead);\n opcodes[0xe6] = \"INC\"; instructions[0xe6] = INC(zeroPageReadModifyWrite);\n opcodes[0xe7] = \"uISB\"; instructions[0xe7] = uISB(zeroPageReadModifyWrite);\n opcodes[0xe8] = \"INX\"; instructions[0xe8] = INX();\n opcodes[0xe9] = \"SBC\"; instructions[0xe9] = SBC(immediateRead);\n opcodes[0xea] = \"NOP\"; instructions[0xea] = NOP();\n opcodes[0xeb] = \"SBC\"; instructions[0xeb] = SBC(immediateRead);\n opcodes[0xec] = \"CPX\"; instructions[0xec] = CPX(absoluteRead);\n opcodes[0xed] = \"SBC\"; instructions[0xed] = SBC(absoluteRead);\n opcodes[0xee] = \"INC\"; instructions[0xee] = INC(absoluteReadModifyWrite);\n opcodes[0xef] = \"uISB\"; instructions[0xef] = uISB(absoluteReadModifyWrite);\n opcodes[0xf0] = \"BEQ\"; instructions[0xf0] = Bxx(bZ, 1); // BEQ\n opcodes[0xf1] = \"SBC\"; instructions[0xf1] = SBC(indirectYRead);\n opcodes[0xf2] = \"uKIL\"; instructions[0xf2] = uKIL();\n opcodes[0xf3] = \"uISB\"; instructions[0xf3] = uISB(indirectYReadModifyWrite);\n opcodes[0xf4] = \"uNOP\"; instructions[0xf4] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0xf5] = \"SBC\"; instructions[0xf5] = SBC(zeroPageIndexedRead(rX));\n opcodes[0xf6] = \"INC\"; instructions[0xf6] = INC(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0xf7] = \"uISB\"; instructions[0xf7] = uISB(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0xf8] = \"SED\"; instructions[0xf8] = SED();\n opcodes[0xf9] = \"SBC\"; instructions[0xf9] = SBC(absoluteIndexedRead(rY));\n opcodes[0xfa] = \"uNOP\"; instructions[0xfa] = uNOP(implied);\n opcodes[0xfb] = \"uISB\"; instructions[0xfb] = uISB(absoluteIndexedReadModifyWrite(rY));\n opcodes[0xfc] = \"uNOP\"; instructions[0xfc] = uNOP(absoluteIndexedRead(rX));\n opcodes[0xfd] = \"SBC\"; instructions[0xfd] = SBC(absoluteIndexedRead(rX));\n opcodes[0xfe] = \"INC\"; instructions[0xfe] = INC(absoluteIndexedReadModifyWrite(rX));\n opcodes[0xff] = \"uISB\"; instructions[0xff] = uISB(absoluteIndexedReadModifyWrite(rX));\n\n\n // Single Byte instructions\n\n function ASL_ACC() {\n return implied(function() {\n setC(A > 127);\n A = (A << 1) & 255;\n setZ(A);\n setN(A);\n });\n }\n\n function CLC() {\n return implied(function() {\n C = 0;\n });\n }\n\n function CLD() {\n return implied(function() {\n D = 0;\n });\n }\n\n function CLI() {\n return implied(function() {\n I = 0;\n });\n }\n\n function CLV() {\n return implied(function() {\n V = 0;\n });\n }\n\n function DEX() {\n return implied(function() {\n X = (X - 1) & 255;\n setZ(X);\n setN(X);\n });\n }\n\n function DEY() {\n return implied(function() {\n Y = (Y - 1) & 255;\n setZ(Y);\n setN(Y);\n });\n }\n\n function INX() {\n return implied(function() {\n X = (X + 1) & 255;\n setZ(X);\n setN(X);\n });\n }\n\n function INY() {\n return implied(function() {\n Y = (Y + 1) & 255;\n setZ(Y);\n setN(Y);\n });\n }\n\n function LSR_ACC() {\n return implied(function() {\n C = A & 0x01;\n A >>>= 1;\n setZ(A);\n N = 0;\n });\n }\n\n function NOP() {\n return implied(function() {\n // nothing\n });\n }\n\n function ROL_ACC() {\n return implied(function() {\n var newC = A > 127;\n A = ((A << 1) | C) & 255;\n setC(newC);\n setZ(A);\n setN(A);\n });\n }\n\n function ROR_ACC() {\n return implied(function() {\n var newC = A & 0x01;\n A = (A >>> 1) | (C << 7);\n setC(newC);\n setZ(A);\n setN(A);\n });\n }\n\n function SEC() {\n return implied(function() {\n C = 1;\n });\n }\n\n function SED() {\n return implied(function() {\n D = 1;\n });\n }\n\n function SEI() {\n return implied(function() {\n I = 1;\n });\n }\n\n function TAX() {\n return implied(function() {\n X = A;\n setZ(X);\n setN(X);\n });\n }\n\n function TAY() {\n return implied(function() {\n Y = A;\n setZ(Y);\n setN(Y);\n });\n }\n\n function TSX() {\n return implied(function() {\n X = SP;\n setZ(X);\n setN(X);\n });\n }\n\n function TXA() {\n return implied(function() {\n A = X;\n setZ(A);\n setN(A);\n });\n }\n\n function TXS() {\n return implied(function() {\n SP = X;\n });\n }\n\n function TYA() {\n return implied(function() {\n A = Y;\n setZ(A);\n setN(A);\n });\n }\n\n function uKIL() {\n return [\n fetchOpcodeAndDecodeInstruction,\n function() {\n illegalOpcode(\"KIL/HLT/JAM\");\n },\n function() {\n T--; // Causes the processor to be stuck in this instruction forever\n }\n ];\n }\n\n function uNOP(addressing) {\n return addressing(function() {\n illegalOpcode(\"NOP/DOP\");\n // nothing\n });\n }\n\n\n // Internal Execution on Memory Data\n\n function ADC(addressing) {\n return addressing(function() {\n if (D) {\n var operand = data;\n var AL = (A & 15) + (operand & 15) + C;\n if (AL > 9) { AL += 6; }\n var AH = ((A >> 4) + (operand >> 4) + ((AL > 15)?1:0)) << 4;\n setZ((A + operand + C) & 255);\n setN(AH);\n setV(((A ^AH) & ~(A ^ operand)) & 128);\n if (AH > 0x9f) { AH += 0x60; }\n setC(AH > 255);\n A = (AH | (AL & 15)) & 255;\n } else {\n var add = A + data + C;\n setC(add > 255);\n setV(((A ^ add) & (data ^ add)) & 0x80);\n A = add & 255;\n setZ(A);\n setN(A);\n }\n });\n }\n\n function AND(addressing) {\n return addressing(function() {\n A &= data;\n setZ(A);\n setN(A);\n });\n }\n\n function BIT(addressing) {\n return addressing(function() {\n var par = data;\n setZ(A & par);\n setV(par & 0x40);\n setN(par);\n });\n }\n\n function CMP(addressing) {\n return addressing(function() {\n var val = (A - data) & 255;\n setC(A >= data);\n setZ(val);\n setN(val);\n });\n }\n\n function CPX(addressing) {\n return addressing(function() {\n var val = (X - data) & 255;\n setC(X >= data);\n setZ(val);\n setN(val);\n });\n }\n\n function CPY(addressing) {\n return addressing(function() {\n var val = (Y - data) & 255;\n setC(Y >= data);\n setZ(val);\n setN(val);\n });\n }\n\n function EOR(addressing) {\n return addressing(function() {\n A ^= data;\n setZ(A);\n setN(A);\n });\n }\n\n function LDA(addressing) {\n return addressing(function() {\n A = data;\n setZ(A);\n setN(A);\n });\n }\n\n function LDX(addressing) {\n return addressing(function() {\n X = data;\n setZ(X);\n setN(X);\n });\n }\n\n function LDY(addressing) {\n return addressing(function() {\n Y = data;\n setZ(Y);\n setN(Y);\n });\n }\n\n function ORA(addressing) {\n return addressing(function() {\n A |= data;\n setZ(A);\n setN(A);\n });\n }\n\n function SBC(addressing) {\n return addressing(function() {\n if (D) {\n var operand = data;\n var AL = (A & 15) - (operand & 15) - (1-C);\n var AH = (A >> 4) - (operand >> 4) - ((AL < 0)?1:0);\n if (AL < 0) { AL -= 6; }\n if (AH < 0) { AH -= 6; }\n var sub = A - operand - (1-C);\n setC(~sub & 256);\n setV(((A ^ operand) & (A ^ sub)) & 128);\n setZ(sub & 255);\n setN(sub);\n A = ((AH << 4) | (AL & 15)) & 255;\n } else {\n operand = (~data) & 255;\n sub = A + operand + C;\n setC(sub > 255);\n setV(((A ^ sub) & (operand ^ sub) & 0x80));\n A = sub & 255;\n setZ(A);\n setN(A);\n }\n });\n }\n\n function uANC(addressing) {\n return addressing(function() {\n illegalOpcode(\"ANC\");\n A &= data;\n setZ(A);\n N = C = (A & 0x080) ? 1 : 0;\n });\n }\n\n function uANE(addressing) {\n return addressing(function() {\n illegalOpcode(\"ANE\");\n // Exact operation unknown. Do nothing\n });\n }\n\n function uARR(addressing) {\n // Some sources say flags are affected per ROR, others say its more complex. The complex one is chosen\n return addressing(function() {\n illegalOpcode(\"ARR\");\n var val = A & data;\n var oldC = C ? 0x80 : 0;\n val = (val >>> 1) | oldC;\n A = val;\n setZ(val);\n setN(val);\n var comp = A & 0x60;\n if (comp == 0x60) \t\t{ C = 1; V = 0; }\n else if (comp == 0x00) \t{ C = 0; V = 0; }\n else if (comp == 0x20) \t{ C = 0; V = 1; }\n else if (comp == 0x40) \t{ C = 1; V = 1; }\n });\n }\n\n function uASR(addressing) {\n return addressing(function() {\n illegalOpcode(\"ASR\");\n var val = A & data;\n C = (val & 0x01);\t\t// bit 0\n val = val >>> 1;\n A = val;\n setZ(val);\n N = 0;\n });\n }\n\n function uLAS(addressing) {\n return addressing(function() {\n illegalOpcode(\"LAS\");\n var val = SP & data;\n A = val;\n X = val;\n SP = val;\n setZ(val);\n setN(val);\n });\n }\n\n function uLAX(addressing) {\n return addressing(function() {\n illegalOpcode(\"LAX\");\n var val = data;\n A = val;\n X = val;\n setZ(val);\n setN(val);\n });\n }\n\n function uLXA(addressing) {\n return addressing(function() {\n // Some sources say its an OR with $EE then AND with IMM, others exclude the OR,\n // others exclude both the OR and the AND. Excluding just the OR...\n illegalOpcode(\"LXA\");\n var val = A /* | 0xEE) */ & data;\n A = val;\n X = val;\n setZ(val);\n setN(val);\n });\n }\n\n function uSBX(addressing) {\n return addressing(function() {\n illegalOpcode(\"SBX\");\n var par = A & X;\n var val = data;\n var newX = (par - val) & 255;\n X = newX;\n setC(par >= val);\n setZ(newX);\n setN(newX);\n });\n }\n\n\n // Store operations\n\n function STA(addressing) {\n return addressing(function() {\n data = A;\n });\n }\n\n function STX(addressing) {\n return addressing(function() {\n data = X;\n });\n }\n\n function STY(addressing) {\n return addressing(function() {\n data = Y;\n });\n }\n\n function uSAX(addressing) {\n return addressing(function() {\n // Some sources say it would affect N and Z flags, some say it wouldn't. Chose not to affect\n illegalOpcode(\"SAX\");\n data = A & X;\n });\n }\n\n function uSHA(addressing) {\n return addressing(function() {\n illegalOpcode(\"SHA\");\n data = A & X & ((BA >>> 8) + 1) & 255; // A & X & (High byte of effective address + 1) !!!\n // data would also be stored BAH if page boundary is crossed. Unobservable, not needed here\n });\n }\n\n function uSHS(addressing) {\n return addressing(function() {\n illegalOpcode(\"SHS\");\n var val = A & X;\n SP = val;\n data = val & ((BA >>> 8) + 1) & 255; // A & X & (High byte of effective address + 1) !!!\n // data would also be stored BAH if page boundary is crossed. Unobservable, not needed here\n });\n }\n\n function uSHX(addressing) {\n return addressing(function() {\n illegalOpcode(\"SHX\");\n data = X & ((BA >>> 8) + 1) & 255; // X & (High byte of effective address + 1) !!!\n // data would also be stored BAH if page boundary is crossed. Unobservable, not needed here\n });\n }\n\n function uSHY(addressing) {\n return addressing(function() {\n illegalOpcode(\"SHY\");\n data = Y & ((BA >>> 8) + 1) & 255; // Y & (High byte of effective address + 1) !!!\n // data would also be stored BAH if page boundary is crossed. Unobservable, not needed here\n });\n }\n\n\n // Read-Modify-Write operations\n\n function ASL(addressing) {\n return addressing(function() {\n setC(data > 127);\n var par = (data << 1) & 255;\n data = par;\n setZ(par);\n setN(par);\n });\n }\n\n function DEC(addressing) {\n return addressing(function() {\n var par = (data - 1) & 255;\n data = par;\n setZ(par);\n setN(par);\n });\n }\n\n function INC(addressing) {\n return addressing(function() {\n var par = (data + 1) & 255;\n data = par;\n setZ(par);\n setN(par);\n });\n }\n\n function LSR(addressing) {\n return addressing(function() {\n C = data & 0x01;\n data >>>= 1;\n setZ(data);\n N = 0;\n });\n }\n\n function ROL(addressing) {\n return addressing(function() {\n var newC = data > 127;\n var par = ((data << 1) | C) & 255;\n data = par;\n setC(newC);\n setZ(par);\n setN(par);\n });\n }\n\n function ROR(addressing) {\n return addressing(function() {\n var newC = data & 0x01;\n var par = (data >>> 1) | (C << 7);\n data = par;\n setC(newC);\n setZ(par);\n setN(par);\n });\n }\n\n function uDCP(addressing) {\n return addressing(function() {\n illegalOpcode(\"DCP\");\n var par = (data - 1) & 255;\n data = par;\n par = A - par;\n setC(par >= 0);\n setZ(par);\n setN(par);\n });\n }\n\n function uISB(addressing) {\n return addressing(function() {\n illegalOpcode(\"ISB\");\n data = (data + 1) & 255; // ISB is the same as SBC but incs the operand first\n if (D) {\n var operand = data;\n var AL = (A & 15) - (operand & 15) - (1-C);\n var AH = (A >> 4) - (operand >> 4) - ((AL < 0)?1:0);\n if (AL < 0) { AL -= 6; }\n if (AH < 0) { AH -= 6; }\n var sub = A - operand - (1-C);\n setC(~sub & 256);\n setV(((A ^ operand) & (A ^ sub)) & 128);\n setZ(sub & 255);\n setN(sub);\n A = ((AH << 4) | (AL & 15)) & 255;\n } else {\n operand = (~data) & 255;\n sub = A + operand + C;\n setC(sub > 255);\n setV(((A ^ sub) & (operand ^ sub) & 0x80));\n A = sub & 255;\n setZ(A);\n setN(A);\n }\n });\n }\n\n function uRLA(addressing) {\n return addressing(function() {\n illegalOpcode(\"RLA\");\n var val = data;\n var oldC = C;\n setC(val & 0x80);\t\t// bit 7 was set\n val = ((val << 1) | oldC) & 255;\n data = val;\n A &= val;\n setZ(val); // TODO Verify. May be A instead of val in the flags setting\n setN(val);\n });\n }\n\n function uRRA(addressing) {\n return addressing(function() {\n illegalOpcode(\"RRA\");\n var val = data;\n var oldC = C ? 0x80 : 0;\n setC(val & 0x01);\t\t// bit 0 was set\n val = (val >>> 1) | oldC;\n data = val;\n // RRA is the same as ADC from here\n if (D) {\n var operand = data;\n var AL = (A & 15) + (operand & 15) + C;\n if (AL > 9) { AL += 6; }\n var AH = ((A >> 4) + (operand >> 4) + ((AL > 15)?1:0)) << 4;\n setZ((A + operand + C) & 255);\n setN(AH);\n setV(((A ^AH) & ~(A ^ operand)) & 128);\n if (AH > 0x9f) { AH += 0x60; }\n setC(AH > 255);\n A = (AH | (AL & 15)) & 255;\n } else {\n var add = A + data + C;\n setC(add > 255);\n setV(((A ^ add) & (data ^ add)) & 0x80);\n A = add & 255;\n setZ(A);\n setN(A);\n }\n });\n }\n\n function uSLO(addressing) {\n return addressing(function() {\n illegalOpcode(\"SLO\");\n var val = data;\n setC(val & 0x80);\t\t// bit 7 was set\n val = (val << 1) & 255;\n data = val;\n val = A | val;\n A = val;\n setZ(val);\n setN(val);\n });\n }\n\n function uSRE(addressing) {\n return addressing(function() {\n illegalOpcode(\"SRE\");\n var val = data;\n setC(val & 0x01);\t\t// bit 0 was set\n val = val >>> 1;\n data = val;\n val = (A ^ val) & 255;\n A = val;\n setZ(val);\n setN(val);\n });\n }\n\n\n // Miscellaneous operations\n\n function PHA() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n function() { pushToStack(A); },\n fetchNextOpcode\n ];\n }\n\n function PHP() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n function() { pushToStack(getStatusBits()); },\n fetchNextOpcode\n ];\n }\n\n function PLA() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n peekFromStack,\n function() {\n A = popFromStack();\n setZ(A);\n setN(A);\n },\n fetchNextOpcode\n ];\n }\n\n function PLP() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n peekFromStack,\n function() { setStatusBits(popFromStack()); },\n fetchNextOpcode\n ];\n }\n\n function JSR() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n peekFromStack,\n function() { pushToStack((PC >>> 8) & 0xff); },\n function() { pushToStack(PC & 0xff); },\n fetchADH,\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function BRK() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchDataFromImmediate, // For debugging purposes, use operand as an arg for BRK!\n function() {\n if (self.debug) self.breakpoint(\"BRK \" + data);\n pushToStack((PC >>> 8) & 0xff);\n },\n function() { pushToStack(PC & 0xff); },\n function() { pushToStack(getStatusBits()); }, // set B flag\n function() { AD = bus.read(IRQ_VECTOR); },\n function() { AD |= bus.read(IRQ_VECTOR + 1) << 8; },\n function() { PC = AD; I = 1; fetchNextOpcode(); }\n ];\n }\n\n function IRQ() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchDataFromImmediate, // For debugging purposes, use operand as an arg for BRK!\n function() {\n if (self.debug) self.breakpoint(\"IRQ \" + data);\n pushToStack((PC >>> 8) & 0xff);\n },\n function() { pushToStack(PC & 0xff); },\n function() { pushToStack(getStatusBits() & ~0x10); }, // no BRK flag\n function() { AD = bus.read(IRQ_VECTOR); },\n function() { AD |= bus.read(IRQ_VECTOR + 1) << 8; },\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function NMI() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchDataFromImmediate,\n function() {\n if (self.debug) self.breakpoint(\"NMI \" + data);\n pushToStack((PC >>> 8) & 0xff);\n },\n function() { pushToStack(PC & 0xff); },\n function() { pushToStack(getStatusBits() & ~0x10); }, // no BRK flag\n function() { AD = bus.read(NMI_VECTOR); },\n function() { AD |= bus.read(NMI_VECTOR + 1) << 8; },\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function RTI() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n peekFromStack,\n function() { setStatusBits(popFromStack()); },\n function() { AD = popFromStack(); },\n function() { AD |= popFromStack() << 8; },\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function RTS() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n peekFromStack,\n function() { AD = popFromStack(); },\n function() { AD |= popFromStack() << 8; },\n function() { PC = AD; fetchDataFromImmediate(); },\n fetchNextOpcode\n ];\n }\n\n function JMP_ABS() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n fetchADH,\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function JMP_IND() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchIAL, // IAH will be zero\n fetchIAH,\n fetchBALFromIA,\n function() {\n add1toIAL();\n fetchBAHFromIA();\n },\n function() { PC = BA; fetchNextOpcode(); }\n ];\n }\n\n function Bxx(reg, cond) {\n var branchTaken;\n if (reg === bZ) branchTaken = function() { return Z === cond; };\n else if (reg === bN) branchTaken = function() { return N === cond; };\n else if (reg === bC) branchTaken = function() { return C === cond; };\n else branchTaken = function() { return V === cond; };\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBranchOffset,\n function() {\n if (branchTaken()) {\n fetchOpcodeAndDiscard();\n addBranchOffsetToPCL();\n } else {\n fetchNextOpcode();\n }\n },\n function() {\n if(branchOffsetCrossAdjust) {\n fetchOpcodeAndDiscard();\n adjustPCHForBranchOffsetCross();\n } else {\n fetchNextOpcode();\n }\n },\n fetchNextOpcode\n ];\n }\n\n\n // Savestate -------------------------------------------\n\n this.saveState = function():MOS6502State {\n return {\n PC: (PC-1) & 0xffff,\n A: A, X: X, Y: Y, SP: SP,\n N: N, V: V, D: D, I: I, Z: Z, C: C,\n T: T, o: opcode, R: RDY?1:0,\n d: data, AD: AD, BA: BA, BC: BALCrossed?1:0, IA: IA,\n bo: branchOffset, boa: branchOffsetCrossAdjust\n };\n };\n\n this.loadState = function(state:MOS6502State) {\n PC = (state.PC+1) & 0xffff;\n A = state.A; X = state.X; Y = state.Y; SP = state.SP;\n N = state.N; V = state.V; D = state.D; I = state.I; Z = state.Z; C = state.C;\n T = state.T; opcode = state.o; RDY = !!state.R;\n data = state.d; AD = state.AD; BA = state.BA; BALCrossed = !!state.BC; IA = state.IA;\n branchOffset = state.bo; branchOffsetCrossAdjust = state.boa;\n instruction = opcode < 0 ? [ fetchOpcodeAndDecodeInstruction ] : instructions[opcode];\n };\n\n\n // Accessory methods\n\n this.toString = function() {\n return \"CPU \" +\n \" PC: \" + PC.toString(16) + \" op: \" + opcode.toString() + \" T: \" + T + \" data: \" + data + \"\\n\" +\n \" A: \" + A.toString(16) + \" X: \" + X.toString(16) + \" Y: \" + Y.toString(16) + \" SP: \" + SP.toString(16) + \" \" +\n \"N\" + N + \" \" + \"V\" + V + \" \" + \"D\" + D + \" \" + \"I\" + I + \" \" + \"Z\" + Z + \" \" + \"C\" + C + \" \";\n };\n\n this.breakpoint = function(mes) {\n //jt.Util.log(mes);\n if (this.trace) {\n var text = \"CPU Breakpoint! \" + (mes ? \"(\" + mes + \")\" : \"\") + \"\\n\\n\" + this.toString();\n //jt.Util.message(text);\n }\n };\n\n var cycletime = [\n 7, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 6, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 0, 6, 0, 6, 3, 3, 3, 3, 2, 0, 2, 0, 4, 4, 4, 4,\n 2, 6, 0, 0, 4, 4, 4, 4, 2, 5, 2, 0, 0, 5, 0, 0,\n 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 0, 4, 4, 4, 4,\n 2, 5, 0, 5, 4, 4, 4, 4, 2, 4, 2, 0, 4, 4, 4, 4,\n 2, 6, 0, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 3, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 2, 6, 0, 8, 3, 3, 5, 5, 2, 2, 2, 0, 4, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7\n ];\n\n var extracycles = [\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1\n ];\n\n var insnlengths = [\n 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 3, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 0, 2, 0, 2, 2, 2, 2, 2, 1, 0, 1, 0, 3, 3, 3, 3,\n 2, 2, 0, 0, 2, 2, 2, 3, 1, 3, 1, 0, 0, 3, 0, 0,\n 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 0, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 1, 0, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 0, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3\n ];\n\n var validinsns = [\n 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 0, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 3, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 0, 2, 0, 0, 2, 2, 2, 0, 1, 0, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 2, 2, 2, 0, 1, 3, 1, 0, 0, 3, 0, 0,\n 2, 2, 2, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 2, 2, 2, 0, 1, 3, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 2, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0\n ];\n\n this.getOpcodeMetadata = function(opcode, address) {\n // TODO: more intelligent maximum cycles\n //var i = instructions[opcode];\n return {\n opcode:opcode,\n mnenomic:opcodes[opcode],\n minCycles:cycletime[opcode],\n maxCycles:cycletime[opcode] + extracycles[opcode],\n insnlength:insnlengths[opcode]\n };\n }\n\n // only call when isPCStable() is true\n this.setNMI = function() {\n instruction = NMI();\n T = 1;\n PC = (PC-1) & 0xffff;\n }\n this.setIRQ = function() {\n if (!I) { // only if not disabled\n instruction = IRQ();\n T = 1;\n PC = (PC-1) & 0xffff;\n }\n }\n\n this.getSP = function() { return SP; }\n this.getPC = function() { return (PC-1) & 0xffff; }\n this.getT = function() { return T; }\n this.isHalted = function() { return opcodes[opcode] == \"uKIL\"; }\n \n this.isPCStable = function() {\n return T == 0;\n }\n};\n\nexport interface MOS6502State {\nPC : number;\nSP : number;\nA : number;\nX : number;\nY : number;\nN : number;\nV : number;\nD : number;\nI : number;\nZ : number;\nC : number;\nT : number;\no : number;\nR : number;\nd : number;\nAD : number;\nBA : number;\nBC : number;\nIA : number;\nbo : number;\nboa : number;\n}\n\nexport enum MOS6502Interrupts { None=0, NMI=1, IRQ=2 };\n\nexport class MOS6502 implements CPU, ClockBased, SavesState, Interruptable {\n\n cpu = new _MOS6502();\n interruptType : MOS6502Interrupts = MOS6502Interrupts.None;\n \n connectMemoryBus(bus:Bus) {\n this.cpu.connectBus(bus);\n }\n advanceClock() {\n if (this.interruptType && this.isStable()) {\n switch (this.interruptType) {\n case MOS6502Interrupts.NMI: this.cpu.setNMI(); break;\n case MOS6502Interrupts.IRQ: this.cpu.setIRQ(); break;\n }\n this.interruptType = 0;\n }\n this.cpu.clockPulse();\n }\n advanceInsn() {\n do {\n this.advanceClock();\n } while (!this.isStable());\n }\n reset() {\n this.cpu.reset();\n this.interruptType = 0;\n }\n interrupt(itype:number) {\n if (this.interruptType != MOS6502Interrupts.NMI) {\n this.interruptType = itype;\n }\n }\n NMI() {\n this.interrupt(MOS6502Interrupts.NMI);\n }\n IRQ() {\n this.interrupt(MOS6502Interrupts.IRQ);\n }\n getSP() {\n return this.cpu.getSP();\n }\n getPC() {\n return this.cpu.getPC();\n }\n isHalted() {\n return this.cpu.isHalted();\n }\n saveState() {\n var s = this.cpu.saveState();\n s.it = this.interruptType;\n return s;\n }\n loadState(s) {\n this.cpu.loadState(s);\n this.interruptType = s.it;\n }\n isStable() : boolean {\n return this.cpu.isPCStable();\n }\n // TODO: metadata\n // TODO: disassembler\n}\n", "\nimport { RasterVideo, dumpRAM, AnimationTimer, ControllerPoller } from \"./emu\";\nimport { hex, printFlags, invertMap, byteToASCII } from \"./util\";\nimport { CodeAnalyzer } from \"./analysis\";\nimport { Segment, FileData } from \"./workertypes\";\nimport { disassemble6502 } from \"./cpu/disasm6502\";\nimport { disassembleZ80 } from \"./cpu/disasmz80\";\nimport { Z80 } from \"./cpu/ZilogZ80\";\n\nimport { Bus, Resettable, FrameBased, VideoSource, SampledAudioSource, AcceptsROM, AcceptsBIOS, AcceptsKeyInput, SavesState, SavesInputState, HasCPU, HasSerialIO, SerialIOInterface, AcceptsJoyInput } from \"./devices\";\nimport { Probeable, RasterFrameBased, AcceptsPaddleInput } from \"./devices\";\nimport { SampledAudio } from \"./audio\";\nimport { ProbeRecorder } from \"./probe\";\nimport { BaseWASMMachine } from \"./wasmplatform\";\nimport { CPU6809 } from \"./cpu/6809\";\nimport { _MOS6502 } from \"./cpu/MOS6502\";\n\n///\n\nexport interface OpcodeMetadata {\n minCycles: number;\n maxCycles: number;\n insnlength: number;\n opcode: number;\n}\n\nexport interface CpuState {\n PC:number;\n EPC?:number; // effective PC (for bankswitching)\n o?:number;/*opcode*/\n SP?:number\n /*\n A:number, X:number, Y:number, SP:number, R:boolean,\n N,V,D,Z,C:boolean*/\n};\nexport interface EmuState {\n c?:CpuState,\t// CPU state\n b?:Uint8Array|number[], \t// RAM (TODO: not for vcs, support Uint8Array)\n ram?:Uint8Array,\n o?:{},\t\t\t\t// verilog\n};\nexport interface EmuControlsState {\n}\nexport type DisasmLine = {\n line:string,\n nbytes:number,\n isaddr:boolean\n};\n\nexport type SymbolMap = {[ident:string]:number};\nexport type AddrSymbolMap = {[address:number]:string};\n\nexport class DebugSymbols {\n symbolmap : SymbolMap;\t// symbol -> address\n addr2symbol : AddrSymbolMap;\t// address -> symbol\n debuginfo : {}; // extra platform-specific debug info\n\n constructor(symbolmap : SymbolMap, debuginfo : {}) {\n this.symbolmap = symbolmap;\n this.debuginfo = debuginfo;\n this.addr2symbol = invertMap(symbolmap);\n //// TODO: shouldn't be necc.\n if (!this.addr2symbol[0x0]) this.addr2symbol[0x0] = '$00'; // needed for ...\n this.addr2symbol[0x10000] = '__END__'; // ... dump memory to work\n }\n}\n\ntype MemoryMapType = \"main\" | \"vram\";\ntype MemoryMap = { [type:string] : Segment[] };\n\nexport function isDebuggable(arg:any): arg is Debuggable {\n return arg && typeof arg.getDebugCategories === 'function';\n}\n\nexport interface Debuggable {\n getDebugCategories?() : string[];\n getDebugInfo?(category:string, state:EmuState) : string;\n}\n\nexport interface Platform {\n start() : void | Promise;\n reset() : void;\n isRunning() : boolean;\n getToolForFilename(s:string) : string;\n getDefaultExtension() : string;\n getPresets?() : Preset[];\n pause() : void;\n resume() : void;\n loadROM(title:string, rom:any); // TODO: Uint8Array\n loadBIOS?(title:string, rom:Uint8Array);\n getROMExtension?(rom:FileData) : string;\n\n loadState?(state : EmuState) : void;\n saveState?() : EmuState;\n loadControlsState?(state : EmuControlsState) : void;\n saveControlsState?() : EmuControlsState;\n\n inspect?(ident:string) : string;\n disassemble?(addr:number, readfn:(addr:number)=>number) : DisasmLine;\n readAddress?(addr:number) : number;\n readVRAMAddress?(addr:number) : number;\n \n setFrameRate?(fps:number) : void;\n getFrameRate?() : number;\n\n setupDebug?(callback : BreakpointCallback) : void;\n clearDebug?() : void;\n step?() : void;\n runToVsync?() : void;\n runToPC?(pc:number) : void;\n runUntilReturn?() : void;\n stepBack?() : void;\n runEval?(evalfunc : DebugEvalCondition) : void;\n runToFrameClock?(clock : number) : void;\n stepOver?() : void;\n restartAtPC?(pc:number) : boolean;\n\n getOpcodeMetadata?(opcode:number, offset:number) : OpcodeMetadata; //TODO\n getSP?() : number;\n getPC?() : number;\n getOriginPC?() : number;\n newCodeAnalyzer?() : CodeAnalyzer;\n \n getPlatformName?() : string;\n getMemoryMap?() : MemoryMap;\n\n setRecorder?(recorder : EmuRecorder) : void;\n advance?(novideo? : boolean) : number;\n advanceFrameClock?(trap:DebugCondition, step:number) : number;\n showHelp?() : string;\n resize?() : void;\n\n getRasterScanline?() : number;\n getRasterLineClock?() : number;\n setBreakpoint?(id : string, cond : DebugCondition);\n clearBreakpoint?(id : string);\n hasBreakpoint?(id : string) : boolean;\n getCPUState?() : CpuState;\n\n debugSymbols? : DebugSymbols;\n getDebugTree?() : {};\n \n startProbing?() : ProbeRecorder;\n stopProbing?() : void;\n\n isBlocked?() : boolean; // is blocked, halted, or waiting for input?\n\n readFile?(path: string) : FileData;\n writeFile?(path: string, data: FileData) : boolean;\n sourceFileFetch?: (path:string) => FileData;\n\n getDownloadFile?() : {extension:string, blob:Blob};\n getDebugSymbolFile?() : {extension:string, blob:Blob};\n}\n\nexport interface Preset {\n id : string;\n name : string;\n chapter? : number;\n title? : string;\n}\n\nexport interface MemoryBus {\n read : (address:number) => number;\n write : (address:number, value:number) => void;\n contend?: (address:number, cycles:number) => number;\n isContended?: (address:number) => boolean;\n}\n\nexport type DebugCondition = () => boolean;\nexport type DebugEvalCondition = (c:CpuState) => boolean;\nexport type BreakpointCallback = (s:EmuState, msg?:string) => void;\n// for composite breakpoints w/ single debug function\nexport class BreakpointList {\n id2bp : {[id:string] : Breakpoint} = {};\n getDebugCondition() : DebugCondition {\n if (Object.keys(this.id2bp).length == 0) {\n return null; // no breakpoints\n } else {\n // evaluate all breakpoints\n return () => {\n var result = false;\n for (var id in this.id2bp)\n if (this.id2bp[id].cond())\n result = true;\n return result;\n };\n }\n }\n}\nexport interface Breakpoint {\n cond: DebugCondition;\n};\n\nexport interface EmuRecorder {\n frameRequested() : boolean;\n recordFrame(state : EmuState);\n}\n\n/////\n\nexport abstract class BasePlatform {\n recorder : EmuRecorder = null;\n debugSymbols : DebugSymbols;\n internalFiles : {[path:string] : FileData} = {};\n\n abstract loadState(state : EmuState) : void;\n abstract saveState() : EmuState;\n abstract pause() : void;\n abstract resume() : void;\n abstract advance(novideo? : boolean) : number;\n\n setRecorder(recorder : EmuRecorder) : void {\n this.recorder = recorder;\n }\n updateRecorder() {\n // are we recording and do we need to save a frame?\n if (this.recorder && (this).isRunning() && this.recorder.frameRequested()) {\n this.recorder.recordFrame(this.saveState());\n }\n }\n inspect(sym: string) : string {\n return inspectSymbol((this as any) as Platform, sym);\n }\n getDebugTree() : {} {\n var o : any = { };\n o.state = this.saveState();\n if (this.debugSymbols?.debuginfo) o.debuginfo = this.debugSymbols.debuginfo;\n return o;\n }\n readFile(path: string) : FileData {\n return this.internalFiles[path];\n }\n writeFile(path: string, data: FileData) : boolean {\n this.internalFiles[path] = data;\n return true;\n }\n}\n\nexport abstract class BaseDebugPlatform extends BasePlatform {\n onBreakpointHit : BreakpointCallback;\n debugCallback : DebugCondition;\n debugSavedState : EmuState = null;\n debugBreakState : EmuState = null;\n debugTargetClock : number = 0;\n debugClock : number = 0;\n breakpoints : BreakpointList = new BreakpointList();\n frameCount : number = 0;\n\n abstract getCPUState() : CpuState;\n\n setBreakpoint(id : string, cond : DebugCondition) {\n if (cond) {\n this.breakpoints.id2bp[id] = {cond:cond};\n this.restartDebugging();\n } else {\n this.clearBreakpoint(id);\n }\n }\n clearBreakpoint(id : string) {\n delete this.breakpoints.id2bp[id];\n }\n hasBreakpoint(id : string) {\n return this.breakpoints.id2bp[id] != null;\n }\n getDebugCallback() : DebugCondition {\n return this.breakpoints.getDebugCondition();\n }\n setupDebug(callback : BreakpointCallback) : void {\n this.onBreakpointHit = callback;\n }\n clearDebug() {\n if (this.debugBreakState != null) {\n this.loadState(this.debugSavedState);\n }\n this.debugSavedState = null;\n this.debugBreakState = null;\n this.debugTargetClock = -1;\n this.debugClock = 0;\n this.onBreakpointHit = null;\n this.clearBreakpoint('debug');\n this.frameCount = 0;\n }\n setDebugCondition(debugCond : DebugCondition) {\n this.setBreakpoint('debug', debugCond);\n }\n resetDebugging() {\n if (this.debugSavedState) {\n this.loadState(this.debugSavedState);\n } else {\n this.debugSavedState = this.saveState();\n }\n this.debugClock = 0;\n this.debugCallback = this.getDebugCallback();\n this.debugBreakState = null;\n }\n restartDebugging() {\n this.resetDebugging();\n this.resume();\n }\n preFrame() {\n // save state before frame, to record any inputs that happened pre-frame\n if (this.debugCallback && !this.debugBreakState) {\n // save state every frame and rewind debug clocks\n this.debugSavedState = this.saveState();\n this.debugTargetClock -= this.debugClock;\n this.debugClock = 0;\n }\n }\n postFrame() {\n // reload debug state at end of frame after breakpoint\n if (this.debugCallback && this.debugBreakState) {\n this.loadState(this.debugBreakState);\n }\n this.frameCount++;\n }\n pollControls() {\n }\n nextFrame(novideo : boolean) : number {\n this.pollControls();\n this.updateRecorder();\n this.preFrame();\n var steps = this.advance(novideo);\n this.postFrame();\n return steps;\n }\n // default debugging\n abstract getSP() : number;\n abstract getPC() : number;\n abstract isStable() : boolean;\n\n evalDebugCondition() {\n if (this.debugCallback && !this.debugBreakState) {\n this.debugCallback();\n }\n }\n wasBreakpointHit() : boolean {\n return this.debugBreakState != null;\n }\n breakpointHit(targetClock : number, reason? : string) {\n console.log(this.debugTargetClock, targetClock, this.debugClock, this.isStable());\n this.debugTargetClock = targetClock;\n this.debugBreakState = this.saveState();\n console.log(\"Breakpoint at clk\", this.debugClock, \"PC\", this.debugBreakState.c.PC.toString(16));\n this.pause();\n if (this.onBreakpointHit) {\n this.onBreakpointHit(this.debugBreakState, reason);\n }\n }\n haltAndCatchFire(reason : string) {\n this.breakpointHit(this.debugClock, reason);\n }\n runEval(evalfunc : DebugEvalCondition) {\n this.setDebugCondition( () => {\n if (++this.debugClock >= this.debugTargetClock && this.isStable()) {\n var cpuState = this.getCPUState();\n if (evalfunc(cpuState)) {\n this.breakpointHit(this.debugClock);\n return true;\n } else {\n return false;\n }\n }\n });\n }\n runToPC(pc: number) {\n this.debugTargetClock++;\n this.runEval((c) => {\n return c.PC == pc;\n });\n }\n runUntilReturn() {\n var SP0 = this.getSP();\n this.runEval( (c:CpuState) : boolean => {\n return c.SP > SP0; // TODO: check for RTS/RET opcode\n });\n }\n runToFrameClock(clock : number) : void {\n this.restartDebugging();\n this.debugTargetClock = clock;\n this.runEval(() : boolean => { return true; });\n }\n step() {\n this.runToFrameClock(this.debugClock+1);\n }\n stepBack() {\n var prevState;\n var prevClock;\n var clock0 = this.debugTargetClock;\n this.restartDebugging();\n this.debugTargetClock = clock0 - 25; // TODO: depends on CPU\n this.runEval( (c:CpuState) : boolean => {\n if (this.debugClock < clock0) {\n prevState = this.saveState();\n prevClock = this.debugClock;\n return false;\n } else {\n if (prevState) {\n this.loadState(prevState);\n this.debugClock = prevClock;\n }\n return true;\n }\n });\n }\n runToVsync() {\n this.restartDebugging();\n var frame0 = this.frameCount;\n this.runEval( () : boolean => {\n return this.frameCount > frame0;\n });\n }\n}\n\nexport function inspectSymbol(platform : Platform, sym : string) : string {\n if (!platform.debugSymbols) return;\n var symmap = platform.debugSymbols.symbolmap;\n var addr2sym = platform.debugSymbols.addr2symbol;\n if (!symmap || !platform.readAddress) return null;\n var addr = symmap[\"_\"+sym] || symmap[sym]; // look for C or asm symbol\n if (!(typeof addr == 'number')) return null;\n var b = platform.readAddress(addr);\n // don't show 2 bytes if there's a symbol at the next address\n if (addr2sym && addr2sym[addr+1] != null) {\n return \"$\"+hex(addr,4) + \" = $\"+hex(b,2)+\" (\"+b+\" decimal)\"; // unsigned\n } else {\n let b2 = platform.readAddress(addr+1);\n let w = b | (b2<<8);\n return \"$\"+hex(addr,4) + \" = $\"+hex(b,2)+\" $\"+hex(b2,2)+\" (\"+((w<<16)>>16)+\" decimal)\"; // signed\n }\n}\n\n////// 6502\n\nexport function getToolForFilename_6502(fn:string) : string {\n if (fn.endsWith(\"-llvm.c\")) return \"remote:llvm-mos\";\n if (fn.endsWith(\".c\")) return \"cc65\";\n if (fn.endsWith(\".h\")) return \"cc65\";\n if (fn.endsWith(\".s\")) return \"ca65\";\n if (fn.endsWith(\".ca65\")) return \"ca65\";\n if (fn.endsWith(\".dasm\")) return \"dasm\";\n if (fn.endsWith(\".acme\")) return \"acme\";\n if (fn.endsWith(\".wiz\")) return \"wiz\";\n if (fn.endsWith(\".ecs\")) return \"ecs\";\n return \"dasm\"; // .a\n}\n\n// TODO: can merge w/ Z80?\nexport abstract class Base6502Platform extends BaseDebugPlatform {\n\n // some platforms store their PC one byte before or after the first opcode\n // so we correct when saving and loading from state\n debugPCDelta = -1;\n fixPC(c) { c.PC = (c.PC + this.debugPCDelta) & 0xffff; return c; }\n unfixPC(c) { c.PC = (c.PC - this.debugPCDelta) & 0xffff; return c;}\n getSP() { return this.getCPUState().SP };\n getPC() { return this.getCPUState().PC };\n isStable() { return !this.getCPUState()['T']; }\n abstract readAddress(addr:number) : number;\n\n newCPU(membus : MemoryBus) {\n var cpu = new _MOS6502();\n cpu.connectBus(membus);\n return cpu;\n }\n\n getOpcodeMetadata(opcode, offset) {\n return getOpcodeMetadata_6502(opcode, offset);\n }\n\n getOriginPC() : number {\n return (this.readAddress(0xfffc) | (this.readAddress(0xfffd) << 8)) & 0xffff;\n }\n\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassemble6502(pc, read(pc), read(pc+1), read(pc+2));\n }\n getToolForFilename = getToolForFilename_6502;\n getDefaultExtension() { return \".a\"; };\n\n getDebugCategories() {\n return ['CPU','ZPRAM','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_6502(state.c);\n case 'ZPRAM': return dumpRAM(state.b||state.ram, 0x0, 0x100);\n case 'Stack': return dumpStackToString(this, state.b||state.ram, 0x100, 0x1ff, 0x100+state.c.SP, 0x20);\n }\n }\n}\n\nexport function cpuStateToLongString_6502(c) : string {\n function decodeFlags(c) {\n var s = \"\";\n s += c.N ? \" N\" : \" -\";\n s += c.V ? \" V\" : \" -\";\n s += c.D ? \" D\" : \" -\";\n s += c.Z ? \" Z\" : \" -\";\n s += c.C ? \" C\" : \" -\";\n s += c.I ? \" I\" : \" -\";\n return s;\n }\n return \"PC \" + hex(c.PC,4) + \" \" + decodeFlags(c) + \"\\n\"\n + \" A \" + hex(c.A) + \" \" + (c.R ? \"\" : \"BUSY\") + \"\\n\"\n + \" X \" + hex(c.X) + \"\\n\"\n + \" Y \" + hex(c.Y) + \" \" + \"SP \" + hex(c.SP) + \"\\n\";\n}\n\nvar OPMETA_6502 = {\n cycletime: [\n 7, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 6, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 0, 6, 0, 6, 3, 3, 3, 3, 2, 0, 2, 0, 4, 4, 4, 4, 2, 6, 0, 0, 4, 4, 4, 4, 2, 5, 2, 0, 0, 5, 0, 0, 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 0, 4, 4, 4, 4, 2, 5, 0, 5, 4, 4, 4, 4, 2, 4, 2, 0, 4, 4, 4, 4, 2, 6, 0, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 3, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 2, 6, 0, 8, 3, 3, 5, 5, 2, 2, 2, 0, 4, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7\n ],\n extracycles: [\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1\n ],\n insnlengths: [\n 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 3, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 0, 2, 0, 2, 2, 2, 2, 2, 1, 0, 1, 0, 3, 3, 3, 3, 2, 2, 0, 0, 2, 2, 2, 3, 1, 3, 1, 0, 0, 3, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 0, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 1, 0, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 0, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3\n ],\n validinsns: [\n 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 0, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 3, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 0, 2, 0, 0, 2, 2, 2, 0, 1, 0, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 3, 1, 0, 0, 3, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 3, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0\n ],\n}\n\nexport function getOpcodeMetadata_6502(opcode, address) {\n // TODO: more intelligent maximum cycles\n // TODO: must always be new object, b/c we might modify it\n return {\n opcode:opcode,\n minCycles:OPMETA_6502.cycletime[opcode],\n maxCycles:OPMETA_6502.cycletime[opcode] + OPMETA_6502.extracycles[opcode],\n insnlength:OPMETA_6502.insnlengths[opcode]\n };\n}\n\n////// Z80\n\nexport function cpuStateToLongString_Z80(c) {\n function decodeFlags(flags) {\n return printFlags(flags, [\"S\",\"Z\",,\"H\",,\"V\",\"N\",\"C\"], true);\n }\n return \"PC \" + hex(c.PC,4) + \" \" + decodeFlags(c.AF) + \" \" + (c.iff1?\"I\":\"-\") + (c.iff2?\"I\":\"-\") + \"\\n\"\n + \"SP \" + hex(c.SP,4) + \" IR \" + hex(c.IR,4) + \"\\n\"\n + \"IX \" + hex(c.IX,4) + \" IY \" + hex(c.IY,4) + \"\\n\"\n + \"AF \" + hex(c.AF,4) + \" BC \" + hex(c.BC,4) + \"\\n\"\n + \"DE \" + hex(c.DE,4) + \" HL \" + hex(c.HL,4) + \"\\n\"\n ;\n}\n\nexport abstract class BaseZ80Platform extends BaseDebugPlatform {\n\n _cpu;\n waitCycles : number = 0;\n\n newCPU(membus : MemoryBus, iobus : MemoryBus) {\n this._cpu = new Z80();\n this._cpu.connectMemoryBus(membus);\n this._cpu.connectIOBus(iobus);\n return this._cpu;\n }\n\n getPC() { return this._cpu.getPC(); }\n getSP() { return this._cpu.getSP(); }\n isStable() { return true; }\n\n // TODO: refactor other parts into here\n runCPU(cpu, cycles:number) : number {\n this._cpu = cpu; // TODO?\n this.waitCycles = 0; // TODO: needs to spill over betwenn calls\n if (this.wasBreakpointHit())\n return 0;\n var debugCond = this.getDebugCallback();\n var n = 0;\n this.waitCycles += cycles;\n while (this.waitCycles > 0) {\n if (debugCond && debugCond()) {\n debugCond = null;\n break;\n }\n var cyc = cpu.advanceInsn();\n n += cyc;\n this.waitCycles -= cyc;\n }\n return n;\n }\n\n getToolForFilename = getToolForFilename_z80;\n getDefaultExtension() { return \".c\"; };\n // TODO: Z80 opcode metadata\n //this.getOpcodeMetadata = function() { }\n\n getDebugCategories() {\n return ['CPU','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_Z80(state.c);\n case 'Stack': {\n var sp = (state.c.SP-1) & 0xffff;\n var start = sp & 0xff00;\n var end = start + 0xff;\n if (sp == 0) sp = 0x10000;\n console.log(sp,start,end);\n return dumpStackToString(this, [], start, end, sp, 0xcd);\n }\n }\n }\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassembleZ80(pc, read(pc), read(pc+1), read(pc+2), read(pc+3));\n }\n}\n\nexport function getToolForFilename_z80(fn:string) : string {\n if (fn.endsWith(\".c\")) return \"sdcc\";\n if (fn.endsWith(\".h\")) return \"sdcc\";\n if (fn.endsWith(\".s\")) return \"sdasz80\";\n if (fn.endsWith(\".ns\")) return \"naken\";\n if (fn.endsWith(\".scc\")) return \"sccz80\";\n if (fn.endsWith(\".z\")) return \"zmac\";\n if (fn.endsWith(\".wiz\")) return \"wiz\";\n return \"zmac\";\n}\n\n////// 6809\n\nexport function cpuStateToLongString_6809(c) {\n function decodeFlags(flags) {\n return printFlags(flags, [\"E\",\"F\",\"H\",\"I\", \"N\",\"Z\",\"V\",\"C\"], true);\n }\n return \"PC \" + hex(c.PC,4) + \" \" + decodeFlags(c.CC) + \"\\n\"\n + \"SP \" + hex(c.SP,4) + \"\\n\"\n + \"DP \" + hex(c.DP,2) + \"\\n\"\n + \" A \" + hex(c.A,2) + \"\\n\"\n + \" B \" + hex(c.B,2) + \"\\n\"\n + \" X \" + hex(c.X,4) + \"\\n\"\n + \" Y \" + hex(c.Y,4) + \"\\n\"\n + \" U \" + hex(c.U,4) + \"\\n\"\n ;\n}\n\nexport function getToolForFilename_6809(fn:string) : string {\n if (fn.endsWith(\".c\")) return \"cmoc\";\n if (fn.endsWith(\".h\")) return \"cmoc\";\n if (fn.endsWith(\".xasm\")) return \"xasm6809\";\n if (fn.endsWith(\".lwasm\")) return \"lwasm\";\n return \"cmoc\";\n}\n\nexport abstract class Base6809Platform extends BaseZ80Platform {\n\n newCPU(membus : MemoryBus) {\n var cpu = Object.create(CPU6809());\n cpu.init(membus.write, membus.read, 0);\n return cpu;\n }\n\n cpuStateToLongString(c:CpuState) {\n return cpuStateToLongString_6809(c);\n }\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n // TODO: don't create new CPU\n return Object.create(CPU6809()).disasm(read(pc), read(pc+1), read(pc+2), read(pc+3), read(pc+4), pc);\n }\n getDefaultExtension() : string { return \".asm\"; };\n //this.getOpcodeMetadata = function() { }\n getToolForFilename = getToolForFilename_6809;\n getDebugCategories() {\n return ['CPU','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_6809(state.c);\n default: return super.getDebugInfo(category, state);\n }\n }\n}\n\n\n//TODO: how to get stack_end?\nexport function dumpStackToString(platform:Platform, mem:Uint8Array|number[], start:number, end:number, sp:number, jsrop:number, bigendian?:boolean) : string {\n var s = \"\";\n var nraw = 0;\n //s = dumpRAM(mem.slice(start,start+end+1), start, end-start+1);\n function read(addr) {\n if (addr < mem.length) return mem[addr];\n else return platform.readAddress(addr);\n }\n while (sp < end) {\n sp++;\n // see if there's a JSR on the stack here\n // TODO: make work with roms and memory maps\n var addr = read(sp) + read(sp+1)*256;\n if (bigendian) { addr = ((addr & 0xff) << 8) | ((addr & 0xff00) >> 8) }\n var jsrofs = jsrop==0x20 ? -2 : -3; // 6502 vs Z80\n var opcode = read(addr + jsrofs); // might be out of bounds\n if (opcode == jsrop) { // JSR\n s += \"\\n$\" + hex(sp) + \": \";\n s += hex(addr,4) + \" \" + lookupSymbol(platform, addr, true);\n sp++;\n nraw = 0;\n } else {\n if (nraw == 0)\n s += \"\\n$\" + hex(sp) + \": \";\n s += hex(read(sp)) + \" \";\n if (++nraw == 8) nraw = 0;\n }\n }\n return s+\"\\n\";\n}\n\n// TODO: slow, funky, uses global\nexport function lookupSymbol(platform:Platform, addr:number, extra:boolean) {\n var start = addr;\n var addr2symbol = platform.debugSymbols && platform.debugSymbols.addr2symbol;\n while (addr2symbol && addr >= 0) {\n var sym = addr2symbol[addr];\n if (sym) { // return first symbol we find\n var sym = addr2symbol[addr];\n return extra ? (sym + \" + $\" + hex(start-addr)) : sym;\n }\n if (!extra) break;\n addr--;\n }\n return \"\";\n}\n\n/// new Machine platform adapters\n\nexport interface Machine extends Bus, Resettable, FrameBased, AcceptsROM, HasCPU, SavesState, SavesInputState {\n}\n\nexport function hasVideo(arg:any): arg is VideoSource {\n return typeof arg.connectVideo === 'function';\n}\nexport function hasAudio(arg:any): arg is SampledAudioSource {\n return typeof arg.connectAudio === 'function';\n}\nexport function hasKeyInput(arg:any): arg is AcceptsKeyInput {\n return typeof arg.setKeyInput === 'function';\n}\nexport function hasJoyInput(arg:any): arg is AcceptsJoyInput {\n return typeof arg.setJoyInput === 'function';\n}\nexport function hasPaddleInput(arg:any): arg is AcceptsPaddleInput {\n return typeof arg.setPaddleInput === 'function';\n}\nexport function isRaster(arg:any): arg is RasterFrameBased {\n return typeof arg.getRasterY === 'function';\n}\nexport function hasProbe(arg:any): arg is Probeable {\n return typeof arg.connectProbe == 'function';\n}\nexport function hasBIOS(arg:any): arg is AcceptsBIOS {\n return typeof arg.loadBIOS == 'function';\n}\nexport function hasSerialIO(arg:any): arg is HasSerialIO {\n return typeof arg.connectSerialIO === 'function';\n}\n\nexport abstract class BaseMachinePlatform extends BaseDebugPlatform implements Platform {\n machine : T;\n mainElement : HTMLElement;\n timer : AnimationTimer;\n video : RasterVideo;\n audio : SampledAudio;\n poller : ControllerPoller;\n serialIOInterface : SerialIOInterface;\n serialVisualizer : SerialIOVisualizer;\n\n probeRecorder : ProbeRecorder;\n startProbing;\n stopProbing;\n\n abstract newMachine() : T;\n abstract getToolForFilename(s:string) : string;\n abstract getDefaultExtension() : string;\n abstract getPresets() : Preset[];\n \n constructor(mainElement : HTMLElement) {\n super();\n this.mainElement = mainElement;\n }\n\n reset() {\n this.machine.reset();\n if (this.serialVisualizer != null) this.serialVisualizer.reset();\n }\n loadState(s) { this.machine.loadState(s); }\n saveState() { return this.machine.saveState(); }\n getSP() { return this.machine.cpu.getSP(); }\n getPC() { return this.machine.cpu.getPC(); }\n isStable() \t { return this.machine.cpu.isStable(); }\n getCPUState() { return this.machine.cpu.saveState(); }\n loadControlsState(s) { this.machine.loadControlsState(s); }\n saveControlsState() { return this.machine.saveControlsState(); }\n \n async start() {\n this.machine = this.newMachine();\n const m = this.machine;\n // block on WASM loading\n if (m instanceof BaseWASMMachine) {\n await m.loadWASM();\n }\n var videoFrequency;\n if (hasVideo(m)) {\n var vp = m.getVideoParams();\n this.video = new RasterVideo(this.mainElement, vp.width, vp.height, \n {overscan: !!vp.overscan,\n rotate: vp.rotate|0,\n aspect: vp.aspect});\n this.video.create();\n m.connectVideo(this.video.getFrameData());\n // TODO: support keyboard w/o video?\n if (hasKeyInput(m)) {\n this.video.setKeyboardEvents(m.setKeyInput.bind(m));\n this.poller = new ControllerPoller(m.setKeyInput.bind(m));\n }\n videoFrequency = vp.videoFrequency;\n }\n this.timer = new AnimationTimer(videoFrequency || 60, this.nextFrame.bind(this));\n if (hasAudio(m)) {\n var ap = m.getAudioParams();\n this.audio = new SampledAudio(ap.sampleRate);\n this.audio.start();\n m.connectAudio(this.audio);\n }\n if (hasPaddleInput(m)) {\n this.video.setupMouseEvents();\n }\n if (hasProbe(m)) {\n this.probeRecorder = new ProbeRecorder(m);\n this.startProbing = () => {\n m.connectProbe(this.probeRecorder);\n return this.probeRecorder;\n };\n this.stopProbing = () => {\n m.connectProbe(null);\n };\n }\n if (hasBIOS(m)) {\n this.loadBIOS = (title, data) => {\n m.loadBIOS(data, title);\n };\n }\n if (hasSerialIO(m)) {\n if (this.serialIOInterface == null) {\n this.serialVisualizer = new SerialIOVisualizer(this.mainElement, m);\n } else {\n m.connectSerialIO(this.serialIOInterface);\n }\n }\n }\n \n loadROM(title, data) {\n this.machine.loadROM(data, title);\n this.reset();\n }\n\n loadBIOS : (title, data) => void; // only set if hasBIOS() is true\n\n pollControls() {\n this.poller && this.poller.poll();\n if (hasPaddleInput(this.machine)) {\n this.machine.setPaddleInput(0, this.video.paddle_x);\n this.machine.setPaddleInput(1, this.video.paddle_y);\n }\n // TODO: put into interface\n if (this.machine['pollControls']) {\n this.machine['pollControls']();\n }\n }\n\n advance(novideo:boolean) {\n let trap = this.getDebugCallback();\n var steps = this.machine.advanceFrame(trap);\n if (!novideo && this.video) this.video.updateFrame();\n if (!novideo && this.serialVisualizer) this.serialVisualizer.refresh();\n return steps;\n }\n\n advanceFrameClock(trap, step) {\n if (!(step > 0)) return;\n if (this.machine instanceof BaseWASMMachine) {\n return this.machine.advanceFrameClock(trap, step);\n } else {\n return this.machine.advanceFrame(() => {\n return --step <= 0;\n });\n }\n }\n\n isRunning() {\n return this.timer && this.timer.isRunning();\n }\n\n resume() {\n this.timer.start();\n this.audio && this.audio.start();\n }\n\n pause() {\n this.timer.stop();\n this.audio && this.audio.stop();\n }\n\n // so probe views stick around TODO: must be a better way?\n runToVsync() {\n this.restartDebugging();\n var flag = false;\n this.runEval( () : boolean => {\n if (this.getRasterScanline() > 0) flag = true;\n else return flag;\n });\n }\n\n // TODO: reset target clock counter\n getRasterScanline() {\n return isRaster(this.machine) && this.machine.getRasterY();\n }\n\n readAddress(addr : number) : number {\n return this.machine.read(addr);\n }\n\n getDebugCategories() {\n if (isDebuggable(this.machine))\n return this.machine.getDebugCategories();\n }\n getDebugInfo(category:string, state:EmuState) : string {\n return isDebuggable(this.machine) && this.machine.getDebugInfo(category, state);\n }\n}\n\n// TODO: move debug info into CPU?\n\nexport abstract class Base6502MachinePlatform extends BaseMachinePlatform {\n\n getOpcodeMetadata = getOpcodeMetadata_6502;\n getToolForFilename = getToolForFilename_6502;\n\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassemble6502(pc, read(pc), read(pc+1), read(pc+2));\n }\n getDebugCategories() {\n if (isDebuggable(this.machine))\n return this.machine.getDebugCategories();\n else\n return ['CPU','ZPRAM','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_6502(state.c);\n case 'ZPRAM': return dumpRAM(state.b||state.ram, 0x0, 0x100);\n case 'Stack': return dumpStackToString(this, state.b||state.ram, 0x100, 0x1ff, 0x100+state.c.SP, 0x20);\n default: return isDebuggable(this.machine) && this.machine.getDebugInfo(category, state);\n }\n }\n}\n\nexport abstract class BaseZ80MachinePlatform extends BaseMachinePlatform {\n\n //getOpcodeMetadata = getOpcodeMetadata_z80;\n getToolForFilename = getToolForFilename_z80;\n\n getDebugCategories() {\n if (isDebuggable(this.machine))\n return this.machine.getDebugCategories();\n else\n return ['CPU','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_Z80(state.c);\n case 'Stack': {\n var sp = (state.c.SP-1) & 0xffff;\n var start = sp & 0xff00;\n var end = start + 0xff;\n if (sp == 0) sp = 0x10000;\n return dumpStackToString(this, [], start, end, sp, 0xcd);\n }\n default: return isDebuggable(this.machine) && this.machine.getDebugInfo(category, state);\n }\n }\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassembleZ80(pc, read(pc), read(pc+1), read(pc+2), read(pc+3));\n }\n\n}\n\nexport abstract class Base6809MachinePlatform extends BaseMachinePlatform {\n\n getToolForFilename = getToolForFilename_6809;\n\n getDebugCategories() {\n if (isDebuggable(this.machine))\n return this.machine.getDebugCategories();\n else\n return ['CPU','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_6809(state.c);\n case 'Stack': {\n var sp = (state.c.SP-1) & 0xffff;\n var start = sp & 0xff00;\n var end = start + 0xff;\n if (sp == 0) sp = 0x10000;\n return dumpStackToString(this, [], start, end, sp, 0x17, true);\n }\n default: return super.getDebugInfo(category, state);\n }\n }\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n // TODO: don't create new CPU\n return Object.create(CPU6809()).disasm(read(pc), read(pc+1), read(pc+2), read(pc+3), read(pc+4), pc);\n }\n}\n\n///\n\nclass SerialIOVisualizer {\n\n textarea : HTMLTextAreaElement;\n //vlist: VirtualTextScroller;\n device: HasSerialIO;\n lastOutCount = -1;\n lastInCount = -1;\n\n constructor(parentElement: HTMLElement, device: HasSerialIO) {\n this.device = device;\n this.textarea = document.createElement(\"textarea\");\n this.textarea.classList.add('transcript');\n this.textarea.classList.add('transcript-style-2');\n this.textarea.style.display = 'none';\n parentElement.appendChild(this.textarea);\n /*\n this.vlist = new VirtualTextScroller(parentElement);\n this.vlist.create(parentElement, 1024, this.getMemoryLineAt.bind(this));\n this.vlist.maindiv.style.height = '8em';\n this.vlist.maindiv.style.overflow = 'clip';\n */\n }\n reset() {\n this.lastOutCount = 0;\n this.lastInCount = 0;\n this.textarea.style.display = 'none';\n }\n refresh() {\n var lastop = '';\n if (this.device.serialOut.length != this.lastOutCount) {\n var s = '';\n for (var ev of this.device.serialOut) {\n if (lastop != ev.op) {\n if (s != '') s += '\\n';\n if (ev.op === 'read') s += '<< ';\n else if (ev.op === 'write') s += '>> ';\n lastop = ev.op;\n }\n if (ev.value == 10) { s += '\\u21b5'; lastop = ''; }\n else { s += byteToASCII(ev.value); }\n }\n this.textarea.value = s;\n this.lastOutCount = this.device.serialOut.length;\n this.textarea.style.display = 'block';\n }\n }\n}\n"], - "mappings": "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,GAAI,GAAI,GAAI,GAAK,EAAI,EAAI,EAAI,EAC7D,GAAI,GAAI,GAAI,GAAK,EAAI,EAAI,EAAI,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAG5D,EAAkB,CAClB,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,GAG5D,EAAkB,CAClB,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC7D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAG,GAAK,EAAG,GAAK,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,GAK7D,KAAK,UAAY,EACjB,KAAK,UAAY,GACjB,KAAK,MAAQ,EACb,KAAK,YAAc,EACnB,KAAK,UAAY,GACjB,KAAK,MAAQ,IAAsB,EACnC,KAAK,MAAQ,IAAsB,EACnC,KAAK,UAAY,IAAuB,EA0BpC,YAAwG,CAAxG,aA/yGP,CAqzGE,qBAA4B,GAC5B,eAAqB,GAEb,UAAW,CACjB,AAAI,KAAK,QAAU,KAAK,OACtB,MAAK,IAAM,GAAI,IAAQ,CACrB,SAAU,KAAK,OAAO,KAAK,KAAK,KAAK,QACrC,UAAW,KAAK,OAAO,MAAM,KAAK,KAAK,QACvC,QAAS,KAAK,MAAM,KAAK,KAAK,KAAK,OACnC,SAAU,KAAK,MAAM,MAAM,KAAK,KAAK,UAI3C,iBAAiB,EAAS,CACxB,KAAK,OAAS,EACd,KAAK,WAEP,aAAa,EAAS,CACpB,KAAK,MAAQ,EACb,KAAK,WAEP,aAAc,CACZ,MAAI,MAAK,iBAAmB,KAAK,WAAa,GAAK,KAAK,IAAI,UAAU,GAAO,KAAK,YACjF,MAAK,UAAY,IAEX,KAAK,IAAI,cAElB,OAAQ,CACN,KAAK,IAAI,QAEX,UAAU,EAAa,CACrB,AAAI,CAAC,KAAK,IAAI,UAAU,GAAO,IAAS,KAAK,iBAC5C,MAAK,UAAY,GAGpB,KAAM,CACJ,KAAK,IAAI,UAAU,GAAM,GAE3B,OAAQ,CACN,MAAO,MAAK,IAAI,QAElB,OAAQ,CACN,MAAO,MAAK,IAAI,QAElB,UAAW,CACV,MAAO,MAAK,IAAI,YAEjB,WAAY,CACV,MAAO,MAAK,IAAI,YAElB,UAAU,EAAG,CACX,KAAK,IAAI,UAAU,GAErB,UAAW,CAAE,MAAO,KCp2Gf,YAAkB,CAAlB,aANP,CAOE,YAAS,GAAI,eAEb,OAAQ,CACN,AAAK,KAAK,QACR,MAAK,OAAS,GAAI,aAAY,KAC9B,KAAK,OAAO,WAAW,KAAK,QAC5B,KAAK,OAAO,YAGhB,MAAO,CACL,AAAI,KAAK,QACP,MAAK,OAAO,WAAW,MACvB,KAAK,OAAS,QAKb,QAAoB,CAKzB,YAAY,EAAsB,CAHlC,SAAM,GAAI,kBACV,YAAS,EAGP,KAAK,OAAS,EACd,KAAK,IAAI,QAAQ,iBAAiB,aAClC,KAAK,IAAI,UAAU,iBAAiB,kBACpC,EAAO,OAAO,WAAW,KAAK,KAGhC,OAAQ,CACN,OAAS,GAAE,GAAI,GAAG,EAAG,IACnB,KAAK,eAAe,GACpB,KAAK,QAAQ,GAGjB,eAAe,EAAc,CAC3B,KAAK,OAAS,EAAM,GAEtB,QAAQ,EAAc,CACpB,KAAK,IAAI,gBAAgB,KAAK,OAAQ,EAAM,KAE9C,UAAW,CACT,MAAO,MAAK,IAAI,aAAa,KAAK,QAEpC,iBAAkB,CAAE,MAAO,MAAK,SAG3B,QAAoB,CAIzB,YAAY,EAAsB,CAFlC,SAAM,GAAI,kBAGR,KAAK,OAAS,EACd,KAAK,IAAI,QAAQ,iBAAiB,aAClC,KAAK,IAAI,UAAU,iBAAiB,gBACpC,EAAO,OAAO,WAAW,KAAK,KAEhC,OAAQ,EAGR,QAAQ,EAAc,CACpB,KAAK,IAAI,gBAAgB,EAAG,EAAM,OAQ/B,YAAuB,EAAc,CAE1C,OADI,GAAQ,GAAI,IACP,EAAE,EAAG,GAAG,EAAO,IAAK,CAC3B,GAAI,GAAQ,GAAI,IAChB,EAAM,QAAQ,GAAK,EACnB,EAAM,OAAO,WAAW,GAE1B,MAAO,GAGT,YAAsB,EAAG,EAAG,CAG1B,OAFI,GAAM,GAAI,YAAW,EAAE,OAAS,EAAE,QAClC,EAAI,EACC,EAAE,EAAG,EAAE,EAAI,OAAQ,IAC1B,EAAI,GAAK,EAAE,EAAI,EAAE,QACb,EAAE,EAAI,EAAE,SAAS,IAEvB,MAAO,GAGT,YAAkB,EAAG,CACnB,GAAI,GAAM,GAAI,YAAW,EAAE,GAC3B,SAAI,KAAK,EAAG,EAAG,GACR,EAGF,GAAI,IAAqB,UAAW,CAsDzC,OAnDI,GAAc,IACd,EAAc,GACd,EAAc,GACd,EAAc,GACd,EAAc,GAGd,EAAc,IACd,EAAc,GACd,EAAc,GACd,EAAc,GACd,EAAc,EACd,EAAc,EACd,EAAc,EACd,EAAc,EAId,EAAc,GACd,EAAc,IAGd,GAAc,GACd,EAAc,GACd,EAAc,IAEd,EAAc,OAGd,EAAc,EACd,EAAc,EACd,EAAc,EACd,EAAc,EACd,GAAc,EACd,GAAc,EACd,EAAc,EACd,GAAc,GACd,EAAc,IAEd,EAAoB,QACpB,GAAoB,QAGpB,GAAO,GAAI,YAAY,CAAE,IACzB,EAAO,GAAI,YAAY,CAAE,EAAE,IAC3B,GAAO,GAAI,YAAY,CAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IACrD,EAAO,GAAI,YAAY,CAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IACrF,EAAO,GAAI,YAAY,CAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IACrhC,GAAQ,GAAI,YAAY,CA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C9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAGhC,GAAU,CACR,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAGhC,EAAU,CACR,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAEhC,GAAQ,SAAS,EAAE,EAAE,EAAG,CAAC,GAAS,IAAE,EAAE,EAAG,GAAG,GAAI,MAAO,GACvD,EAAS,SAAS,EAAE,EAAE,EAAG,CAAC,GAAS,IAAE,EAAE,EAAG,GAAG,GAAI,QAAS,IAC1D,EAAO,UAAW,CAAC,MAAQ,IAAI,GAAG,GAClC,GAAO,SAAS,EAAG,CAAC,EAAM,GAAG,EAAI,IAAK,EAAG,EAAE,KAC3C,GAAQ,SAAS,EAAG,CACpB,EAAO,EAAE,EAAI,EAAI,MAEjB,EAAQ,SAAS,EAAG,CACpB,EAAO,EAAE,EAAI,EAAI,KACjB,EAAO,EAAE,EAAK,GAAG,EAAK,MAGtB,GAAS,SAAS,EAAG,CACrB,EAAO,EAAE,EAAI,EAAI,MAEjB,GAAS,SAAS,EAAG,CACrB,EAAO,EAAE,EAAI,EAAI,KACjB,EAAO,EAAE,EAAK,GAAG,EAAK,MAEtB,GAAQ,UAAW,CACnB,MAAO,GAAO,MAEd,GAAQ,UAAW,CACnB,MAAO,GAAO,KAAQ,IAAM,EAAO,MAGnC,EAAS,UAAW,CACpB,MAAO,GAAO,MAEd,GAAS,UAAW,CACpB,MAAO,GAAO,KAAQ,IAAM,EAAO,MAGnC,GAAO,SAAS,EAAS,CACvB,GAAI,GAAI,EACL,AAAI,EAAS,KAAO,GAAM,GAAI,GAAK,GAC/B,EAAS,IAAO,GAAM,GAAI,GAAK,GAC/B,EAAS,IAAM,GAAM,GAAI,GAAK,GAC9B,EAAS,IAAM,GAAM,GAAI,GAAK,GAC9B,EAAS,GAAK,IAAM,GAAK,KACzB,EAAS,GAAK,IAAM,GAAK,KACzB,EAAS,GAAK,IAAM,GAAK,KACzB,EAAS,GAAK,IAAM,GAAK,KAC7B,GAAG,GAER,GAAO,SAAS,EAAS,CACvB,GAAI,GAAI,EACL,AAAI,EAAS,KAAO,IAAO,GAAI,GAAK,GAChC,EAAS,IAAO,IAAO,GAAI,GAAK,GAChC,EAAS,IAAM,IAAO,GAAI,GAAK,GAC/B,EAAS,IAAM,IAAO,GAAI,GAAK,GAC/B,EAAS,GAAK,IAAO,GAAK,KAC1B,EAAS,GAAK,IAAO,GAAK,KAC1B,EAAS,GAAK,IAAO,GAAK,KAC1B,EAAS,GAAK,IAAO,GAAK,KAC9B,GAAG,GAER,GAAO,SAAS,EAAS,CACvB,GAAI,GAAI,EACR,AAAI,EAAS,GAAK,GAAK,KAAS,KAC5B,EAAS,GAAK,GAAK,KAAS,KAC5B,EAAS,GAAK,GAAK,KAAS,KAC5B,EAAS,GAAK,GAAK,KAAS,KAC5B,EAAS,IAAM,GAAK,KAAQ,GAAK,GACjC,EAAS,IAAM,GAAK,KAAQ,GAAK,GACjC,EAAS,IAAO,GAAK,KAAQ,GAAK,GAClC,EAAS,KAAO,GAAK,KAAQ,GAAK,GACtC,GAAG,GAEL,GAAO,SAAS,EAAS,CACvB,GAAI,GAAI,EACR,AAAI,EAAS,GAAK,GAAK,IAAU,KAC7B,EAAS,GAAK,GAAK,IAAU,KAC7B,EAAS,GAAK,GAAK,IAAU,KAC7B,EAAS,GAAK,GAAK,IAAU,KAC7B,EAAS,IAAM,GAAK,KAAS,GAAK,GAClC,EAAS,IAAM,GAAK,KAAS,GAAK,GAClC,EAAS,IAAO,GAAK,KAAS,GAAK,GACnC,EAAS,KAAO,GAAK,KAAS,GAAK,GACvC,GAAG,GAIL,GAAS,SAAS,EAAY,CAC9B,OAAO,EAAa,QACZ,GACA,MAAO,SACP,GACF,MAAO,OACL,GACF,MAAO,OACL,GACF,MAAO,OACL,GACF,MAAO,OACL,GACF,MAAO,OACL,GACF,MAAO,OACL,GACF,MAAO,OACL,IACF,MAAO,OACL,IACF,MAAO,WAEP,MAAO,QAGb,GAAS,SAAS,EAAY,EAAG,CACjC,OAAO,EAAa,QAEZ,GACA,GAAK,GAAG,WACR,GACF,EAAK,EAAG,WACN,GACF,EAAK,EAAG,WACN,GACF,EAAK,EAAG,WACN,GACF,EAAK,EAAG,WACN,GACF,EAAK,EAAG,WACN,GACF,EAAK,EAAG,WACN,GACF,EAAK,EAAG,WACN,IACF,EAAK,EAAG,WACN,IACF,EAAK,EAAG,eAER,SAIN,GAAS,SAAS,EAAY,EAClC,CAEG,GAAI,GAAS,EAAa,IAC1B,AAAI,IAAU,KAAQ,GAAU,IAC7B,GAAS,GAEX,AAAI,EAEE,GAAS,GAAO,GAAY,GAC5B,GAAO,GAAY,EAAG,GAAO,IAC7B,GAAO,EAAY,IAGnB,GAAO,EAAY,GAAO,GAAY,KAI5C,GAAS,SAAS,EAAG,CACrB,MAAQ,GAAE,IAAM,EAAE,IAAK,GAEvB,GAAW,SAAS,EAAG,CACvB,MAAQ,GAAE,MAAQ,EAAE,MAAO,GAG3B,EAAQ,UAAW,CACnB,GAAI,GAAI,EAAO,KACf,UAAM,MACC,GAEP,EAAU,UAAW,CACrB,GAAI,GAAK,EAAO,KAChB,GAAM,MACN,GAAI,GAAK,EAAO,KAChB,UAAM,MACC,EAAG,IAAI,GAGd,EAAW,SAAS,EAAM,CAC1B,GAAI,GAAK,EAAO,KAChB,GAAQ,MACR,GAAI,GAAK,EAAO,KAChB,UAAQ,MACD,EAAG,IAAI,GAEd,GAAY,SAAS,EAAK,EAAG,CAC7B,EAAO,IAAQ,GAAG,EAAG,KACrB,GAAQ,MACR,EAAO,EAAK,EAAE,MAGd,EAAW,UAAW,CACtB,GAAI,GAAK,IACL,EACJ,OAAQ,EAAK,QACJ,GACD,EAAO,EAAI,UACV,IACD,EAAO,EAAI,UACV,IACD,EAAO,EAAI,UACV,IACD,EAAO,EAAI,MAGnB,GAAI,GAAO,KACP,EAAO,KACP,EAEJ,GAAI,EAAK,IACN,CACA,OAAQ,EAAK,QAEL,GACF,EAAO,EACP,EAAO,EAAO,EACd,GAAK,EACL,UACE,GACF,EAAO,EACP,EAAO,EAAO,EACd,GAAK,EACL,UACE,GACF,EAAO,EAAO,EACd,EAAO,EACP,GAAK,EACL,UACE,GACF,EAAO,EAAO,EACd,EAAO,EACP,GAAK,EACL,UACE,GACF,EAAO,EACP,UACE,GAEF,EAAO,EAAO,GAAO,GACrB,GAAK,EACL,UACE,GACD,EAAO,EAAO,GAAO,GACrB,GAAK,EACN,UACE,GACF,EAAO,EACP,UACE,GACF,EAAO,EAAO,GAAO,KACrB,GAAK,EACL,UACE,GACF,EAAO,EAAO,GAAS,KACvB,GAAK,EACL,UACE,IACF,EAAO,EACP,UACE,IACF,GAAK,EACL,EAAO,EAAO,IACd,UACE,IACF,EAAQ,GAAO,KACf,EAAO,EAAK,EACZ,GAAK,EACL,UACE,IACF,EAAS,GAAS,KAClB,EAAO,EAAK,EACZ,GAAK,EACL,UACE,IACF,EAAO,EACP,UACE,IACF,GAAK,EACL,EAAO,IACP,MAGN,GAAQ,MAEJ,EAAK,IAEN,GAAO,EAAO,GAAM,IAAI,EAAQ,EAAK,EAAK,OAC1C,GAAK,OAIR,CACA,GAAI,GAAQ,EAAK,GACjB,AAAI,EAAQ,IACT,IAAS,IACZ,EAAO,EAAO,EACd,GAAK,EAGR,GAAI,IAAO,KACP,OAAQ,EAAK,QACJ,GACD,EAAK,EAAM,UACV,IACD,EAAK,EAAM,UACV,IACD,EAAK,EAAM,UACV,IACD,EAAK,EAAM,MAKvB,MAAO,GAAO,OAGd,GAAY,SAAS,EAAM,CAC3B,GAAM,CAAE,GAAS,GACb,IAAO,GAAG,IAAM,GAChB,EAAO,OAAQ,IAAM,IAKzB,EAAO,SAAS,EAAG,CACpB,WACA,GAAK,IACL,GAAM,CAAE,GAAS,EAAa,GAC9B,GAAM,EAAQ,GACV,KAAM,GAAK,GAAK,MAAM,IAAM,GACzB,GAEN,EAAO,SAAS,EAAG,CACpB,WACA,GAAK,IACL,GAAM,CAAE,GAAS,EAAa,GAC9B,GAAM,EAAQ,GACV,KAAM,KAAQ,GAAK,MAAM,IAAM,GAC5B,GAEN,GAAO,SAAS,EAAE,EAAG,CACtB,GAAI,GAAO,EAAE,EAEb,UAAM,CAAE,GAAU,EAAS,EAAa,GACxC,GAAM,EAAQ,EAAO,KACjB,EAAK,KAAO,IAAI,GACpB,GAAM,EAAE,EAAE,GACH,EAAK,KAEX,EAAS,SAAS,EAAE,EAAG,CACxB,GAAI,GAAO,EAAE,EAEb,UAAM,CAAE,GAAU,EAAS,EAAa,GACnC,GAAK,QAAU,GAAG,IAAI,GACvB,EAAK,OAAQ,IAAI,GACjB,EAAK,OAAS,IAAI,GACtB,EAAO,EAAE,EAAE,GACJ,EAAK,OAEX,GAAO,SAAS,EAAE,EAAG,CACtB,GAAI,GAAO,EAAE,EAEb,UAAM,CAAE,IAAc,EAAU,EAAS,EAAa,GACtD,GAAM,EAAQ,EAAO,KACjB,EAAK,KAAO,IAAI,GACpB,GAAM,EAAE,EAAE,GACL,GAAO,EAAI,GAAG,IAAM,IAAM,IACxB,EAAK,KAEX,GAAS,SAAS,EAAE,EAAG,CACxB,GAAI,GAAO,EAAE,EAEb,UAAM,CAAE,GAAU,EAAS,EAAa,GACnC,GAAK,QAAU,GAAG,IAAI,GACvB,EAAK,OAAQ,IAAI,GACjB,EAAK,OAAS,IAAI,GACtB,EAAO,EAAE,EAAE,GACJ,EAAK,OAEX,EAAO,SAAS,EAAE,EAAG,CACtB,GAAI,GAAO,EAAE,EAAG,GAAK,GAErB,UAAM,CAAE,IAAc,EAAU,EAAS,EAAa,GACtD,GAAM,EAAQ,EAAO,KACjB,EAAK,KAAO,IAAI,GACpB,GAAM,EAAE,EAAE,GACL,GAAO,EAAI,GAAG,IAAM,IAAM,IACxB,EAAK,KAEX,GAAO,SAAS,EAAE,EAAG,CACtB,GAAI,GAAO,EAAE,EAAG,GAAK,GAErB,UAAM,CAAE,GAAU,EAAS,EAAa,GACxC,GAAM,EAAQ,EAAO,KACjB,EAAK,KAAO,IAAI,GACpB,GAAM,EAAE,EAAE,GACH,EAAK,KAEX,GAAO,SAAS,EAAE,EAAG,CACtB,GAAI,GAAO,EAAE,EAEb,GAAM,CAAE,GAAU,EAAS,EAAa,GACxC,GAAM,EAAQ,EAAO,KACjB,EAAK,KAAO,IAAI,GACpB,GAAM,EAAE,EAAE,IAGT,EAAS,SAAS,EAAE,EAAG,CACxB,GAAI,GAAO,EAAE,EAEb,GAAM,CAAE,GAAU,EAAS,EAAa,GACnC,GAAK,QAAU,GAAG,IAAI,GACvB,EAAK,OAAQ,IAAI,GACjB,EAAK,OAAS,IAAI,GACtB,EAAO,EAAE,EAAE,IAIV,GAAO,SAAS,EAAG,CACnB,UAAM,CAAE,GAAU,EAAS,EAAa,GACrC,GAAK,KACN,IAAM,GACT,EAAM,EAAC,EAAG,KAAQ,EACd,IAAM,GAAG,IAAM,GACf,EAAI,KAAM,IAAM,EAAa,GAC1B,GAGN,GAAO,SAAS,EAAG,CACnB,UAAM,CAAE,GAAS,EAAU,GACvB,EAAI,GAAM,IAAM,GACpB,IAAM,EACF,IAAM,GAAG,IAAM,GACZ,EAAI,KAEX,GAAO,SAAS,EAAG,CACnB,UAAM,CAAE,GAAS,EAAU,GACvB,EAAI,GAAM,IAAM,GACpB,EAAK,EAAI,IAAS,GAAG,EACrB,GAAM,EAAQ,GACP,GAEP,GAAO,SAAS,EAAG,CACnB,GAAI,GAAO,EACX,UAAM,CAAE,GAAS,EAAU,EAAa,GACpC,EAAI,KAAM,IAAM,GACpB,IAAM,EACN,GAAM,EAAQ,GACT,GAAI,GAAQ,KAAM,IAAI,GACpB,GAEP,GAAO,SAAS,EAAG,CACnB,GAAI,GAAO,EACP,EAAO,EAAG,EACd,UAAM,CAAE,GAAS,EAAU,EAAa,GACpC,EAAI,KAAM,IAAM,GACpB,EAAI,GAAG,EAAI,EACX,GAAM,EAAQ,GACT,GAAI,GAAQ,KAAM,IAAI,GACpB,GAEP,GAAO,SAAS,EAAG,CACnB,GAAI,GAAO,EAAG,EACd,UAAM,CAAE,GAAS,EAAU,GACvB,EAAI,GAAM,IAAM,GACpB,EAAI,GAAG,EAAI,GAAM,EACjB,GAAM,EAAQ,GAEP,GAGP,GAAO,SAAS,EAAE,EAAG,CACrB,UAAM,CAAE,GAAS,EAAa,GAC9B,GAAK,EACL,GAAM,EAAQ,GACP,GAEP,GAAM,SAAS,EAAE,EAAG,CACpB,UAAM,CAAE,GAAS,EAAa,GAC9B,GAAK,EACL,GAAM,EAAQ,GACP,GAEP,GAAO,SAAS,EAAE,EAAG,CACrB,UAAM,CAAE,GAAS,EAAa,GAC9B,GAAK,EACL,GAAM,EAAQ,GACP,GAEP,GAAO,SAAS,EAAG,CACnB,UAAM,CAAE,GAAS,EAAa,GAC9B,GAAK,IACL,GAAM,EAAQ,GACd,GAAM,EACC,GAIP,EAAQ,UAAW,CAEnB,MAAO,GAAG,IAAM,KAGhB,GAAO,UAAW,CAClB,GAAI,GAAO,EAEP,EAAO,KACP,EAAK,KAEL,EAAQ,EACR,EAAS,IAEb,OADA,GAAG,GAAO,GACF,OACC,GACD,EAAO,IACP,EAAO,EAAM,GAAK,EAAO,KACzB,UACC,GACD,EAAO,IACP,EAAO,EAAM,GAAK,EAAO,KACzB,UACC,GACD,EAAO,IACP,EAAO,EAAM,GAAK,EAAO,KACzB,UACC,GACD,EAAO,IACP,EAAO,EAAM,GAAK,EAAO,KAC7B,UACK,GACD,EAAO,IACP,EAAO,EAAM,GAAK,EAAO,KAC7B,UACK,GACD,EAAO,IACP,EAAO,EAAM,GAAK,EAAO,KAC7B,UACK,GACD,EAAO,IACP,EAAO,EAAM,GAAK,EAAO,KAC7B,UAEK,IACD,EAAO,IACP,EAAO,EAAM,EAAK,EAAO,KAC7B,UACK,IACD,EAAO,IACP,EAAO,EAAM,EAAK,EAAO,KAC7B,UAEK,IACD,EAAO,IACP,EAAK,EAAO,GACZ,GAAI,CAAE,GAAO,EAAW,GACxB,GAAM,EAAQ,GAClB,UAEK,IACD,EAAO,IACP,EAAK,EACT,UACK,IACD,EAAO,IACP,EAAO,EAAK,GACZ,GAAI,CAAE,GAAQ,EAAW,GACzB,GAAM,EACV,UAEK,IACD,UACC,IACD,UACC,IACD,EAAO,GAAS,KAChB,GAAM,EACN,UACC,IACD,EAAO,GAAS,KAChB,EAAM,GACN,GAAM,EACN,UACC,IACD,GAAI,GAAK,EACL,EAAM,EAAK,IAAM,GAAM,EAAK,GAChC,AAAI,IAAI,GAAQ,EAAK,KAAO,IAAM,GAC9B,EAAI,KAAQ,GAAI,GAAO,IAAM,IAC7B,GAAI,KAAQ,EAAK,IAAO,IAAM,IAClC,EAAO,EAAK,EACZ,GAAO,CAAE,GAAU,EAAa,EAAS,GACrC,EAAO,KACR,IAAO,GACV,EAAK,EAAO,IACZ,GAAO,EAAQ,GACf,UACC,IACD,GAAM,IACN,UACC,IACD,GAAM,IACN,UACC,IACD,EAAM,EAAK,IAAM,IAAK,EACtB,GAAU,KACV,GAAM,CAAC,EACP,UACC,IACD,EAAK,IACL,GAAO,EAAG,IACV,UACC,IACD,EAAK,IACL,GAAO,EAAG,IACV,UAEC,IACD,EAAO,GAAO,KACd,GAAM,EACN,UACC,IACD,EAAO,GAAO,KACd,UACC,IACD,EAAO,GAAO,KACR,EAAI,GAAU,IAAU,IAAM,GACxC,UACK,IACD,EAAO,GAAO,KACV,EAAI,GAAU,IAAS,IAAM,GACrC,UACK,IACD,EAAO,GAAO,KACR,EAAG,GAAU,IAAM,GAC7B,UACK,IACD,EAAO,GAAO,KACV,EAAG,GAAS,IAAM,GAC1B,UACK,IACD,EAAO,GAAO,KACR,EAAG,GAAS,IAAM,GAC5B,UACK,IACD,EAAO,GAAO,KACV,EAAG,GAAQ,IAAM,GACzB,UACK,IACD,EAAO,GAAO,KACR,EAAG,GAAa,IAAM,GAChC,UACK,IACD,EAAO,GAAO,KACV,EAAG,GAAY,IAAM,GAC7B,UACK,IACD,EAAO,GAAO,KACR,EAAG,GAAa,IAAM,GAChC,UACK,IACD,EAAO,GAAO,KACV,EAAG,GAAY,IAAM,GAC7B,UACK,IACD,EAAO,GAAO,KACP,EAAG,EAAgB,GAAG,IAAa,GAAK,IAAM,GACzD,UACK,IACD,EAAO,GAAO,KACT,EAAG,EAAgB,GAAG,IAAa,GAAI,IAAM,GACtD,UACK,IACD,EAAO,GAAO,KACP,EAAG,EAAgB,GAAG,IAAa,GAAO,EAAG,GAAU,IAAM,GACxE,UACK,IACD,EAAO,GAAO,KACT,GAAG,EAAgB,GAAG,IAAa,GAAO,EAAG,IAAS,IAAM,GACrE,UAEK,IACD,EAAK,IACL,AAAI,IAAK,EAAG,GAAI,EAAa,GAAI,CAAC,EACtC,UACK,IACD,EAAK,IACL,AAAI,IAAK,EAAG,GAAI,EAAa,GAAI,CAAC,EACtC,UACK,IACD,EAAK,IACT,UACK,IACD,EAAK,IACT,UAEK,IACD,GAAK,KACT,UACK,IACD,GAAK,KACT,UACK,IACD,GAAK,KACT,UACK,IACD,GAAK,KACT,UACK,IACD,EAAK,KACT,UACK,IACD,GAAM,EACV,UACK,IACD,EAAK,KACD,EAAK,GACL,IAAG,EACH,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MAET,EAAK,KACT,UACK,IACD,GAAM,IACV,UACK,IACD,EAAO,EAAK,EACZ,AAAI,IAAO,EAAG,GAAI,EAAa,GAAI,CAAC,EACpC,AAAI,EAAK,IAAM,GAAI,EAAc,GAAI,CAAC,EACtC,GAAK,GACT,UACK,IACD,GAAM,EACN,EAAM,GACN,EAAM,GACN,EAAM,GACN,EAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,EAAY,EAClB,EAAK,EAAS,GAClB,UAEK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,EAAK,GACd,UACK,IACD,EAAK,EAAK,GACd,UACK,IACD,GAAM,CAAE,GAAO,EAAW,GAC1B,GAAM,EAAQ,GAClB,UACK,IACD,EAAK,EACL,GAAM,CAAE,GAAW,EAAW,GAC9B,GAAM,EACV,UAEK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,EAAK,GACd,UACK,IACD,EAAK,EAAK,GACd,UACK,IACD,GAAM,CAAE,GAAO,EAAW,GAC1B,GAAM,EAAQ,GAClB,UACK,IACD,EAAK,EACL,GAAM,CAAE,GAAW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,IACvB,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,EAAO,IAAO,EAAS,IAC3B,UACK,KACD,EAAO,IACP,EAAO,EAAG,EAAS,IACvB,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAK,IACL,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,MAGZ,UAEK,IAIG,OAFA,EAAS,IACT,GAAG,GAAQ,GACJ,OACE,IACD,GAAM,EACN,EAAM,GACN,EAAM,GACN,EAAM,GACN,EAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,EAAY,EAClB,EAAK,EAAS,IAClB,UACK,KACD,EAAO,EAAI,KACf,UACK,KACD,EAAO,EAAI,KACf,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,MAIZ,MAKJ,UAAM,IACN,GAAM,IACN,GAAM,IACN,GAAM,IACN,GAAM,MACN,GAAM,MACN,GAAM,MACN,GAAM,MACN,GAAM,MACC,EAAE,GAIT,GAAQ,UAAU,CAClB,EAAK,EAAS,GACd,EAAK,EACL,GAAM,EAAa,EACnB,EAAE,EACF,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAqBrB,GAAK,CACT,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,UACP,CAAC,EAAI,EAAE,UACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,SACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,GAAG,OACR,CAAC,EAAI,GAAG,OACR,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,GAAG,QACR,CAAC,EAAI,GAAG,QACR,CAAC,EAAI,GAAG,QACR,CAAC,EAAI,GAAG,QACR,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,SACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC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EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAG3C,GAAc,CAChB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAG3C,GAAc,CAChB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAG3C,GAAa,CACf,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG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AAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAE1yB,YAAa,CACb,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAE1yB,YAAa,CACb,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAE1yB,WAAY,CACZ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,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", + "sourcesContent": ["\nimport { hex } from \"../util\";\n\nexport var OPS_6502 = [\n {mn:\"BRK\",am:\"\",nb:1,il:0,c1:7,c2:0,nw:3,br:1,mod:\"SI\"}, // 0\n {mn:\"ORA\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"AZN\"}, // 1\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 2\n {mn:\"SLO\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 3\n {mn:\"NOP\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:\"\"}, // 4\n {mn:\"ORA\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"AZN\"}, // 5\n {mn:\"ASL\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // 6\n {mn:\"SLO\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 7\n {mn:\"PHP\",am:\"\",nb:1,il:0,c1:3,c2:0,nw:1,br:0,mod:\"S\"}, // 8\n {mn:\"ORA\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 9\n {mn:\"ASL\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // a\n {mn:\"ANC\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // b\n {mn:\"NOP\",am:\"AAAA\",nb:3,il:1,c1:3,c2:0,nw:0,br:0,mod:\"\"}, // c\n {mn:\"ORA\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // d\n {mn:\"ASL\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // e\n {mn:\"SLO\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // f\n {mn:\"BPL\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 10\n {mn:\"ORA\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"AZN\"}, // 11\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 12\n {mn:\"SLO\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 13\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 14\n {mn:\"ORA\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 15\n {mn:\"ASL\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 16\n {mn:\"SLO\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 17\n {mn:\"CLC\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"C\"}, // 18\n {mn:\"ORA\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 19\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 1a\n {mn:\"SLO\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 1b\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 1c\n {mn:\"ORA\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 1d\n {mn:\"ASL\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // 1e\n {mn:\"SLO\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 1f\n {mn:\"JSR\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:1,mod:\"S\"}, // 20\n {mn:\"AND\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"AZN\"}, // 21\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 22\n {mn:\"RLA\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 23\n {mn:\"BIT\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"ZVN\"}, // 24\n {mn:\"AND\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"AZN\"}, // 25\n {mn:\"ROL\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // 26\n {mn:\"RLA\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 27\n {mn:\"PLP\",am:\"\",nb:1,il:0,c1:4,c2:0,nw:0,br:0,mod:\"SCZIDVN\"}, // 28\n {mn:\"AND\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 29\n {mn:\"ROL\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 2a\n {mn:\"ANC\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 2b\n {mn:\"BIT\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ZVN\"}, // 2c\n {mn:\"AND\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 2d\n {mn:\"ROL\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 2e\n {mn:\"RLA\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 2f\n {mn:\"BMI\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 30\n {mn:\"AND\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"AZN\"}, // 31\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 32\n {mn:\"RLA\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 33\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 34\n {mn:\"AND\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 35\n {mn:\"ROL\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 36\n {mn:\"RLA\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 37\n {mn:\"SEC\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"C\"}, // 38\n {mn:\"AND\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 39\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 3a\n {mn:\"RLA\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 3b\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 3c\n {mn:\"AND\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 3d\n {mn:\"ROL\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // 3e\n {mn:\"RLA\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 3f\n {mn:\"RTI\",am:\"\",nb:1,il:0,c1:6,c2:0,nw:0,br:1,mod:\"SCZIDVN\"}, // 40\n {mn:\"EOR\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"AZN\"}, // 41\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 42\n {mn:\"SRE\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 43\n {mn:\"NOP\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:\"\"}, // 44\n {mn:\"EOR\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"AZN\"}, // 45\n {mn:\"LSR\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // 46\n {mn:\"SRE\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 47\n {mn:\"PHA\",am:\"\",nb:1,il:0,c1:3,c2:0,nw:1,br:0,mod:\"S\"}, // 48\n {mn:\"EOR\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 49\n {mn:\"LSR\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 4a\n {mn:\"ASR\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 4b\n {mn:\"JMP\",am:\"AAAA\",nb:3,il:0,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 4c\n {mn:\"EOR\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 4d\n {mn:\"LSR\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 4e\n {mn:\"SRE\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 4f\n {mn:\"BVC\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 50\n {mn:\"EOR\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"AZN\"}, // 51\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 52\n {mn:\"SRE\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 53\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 54\n {mn:\"EOR\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // 55\n {mn:\"LSR\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 56\n {mn:\"SRE\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 57\n {mn:\"CLI\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"I\"}, // 58\n {mn:\"EOR\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 59\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 5a\n {mn:\"SRE\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 5b\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 5c\n {mn:\"EOR\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // 5d\n {mn:\"LSR\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // 5e\n {mn:\"SRE\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZN\"}, // 5f\n {mn:\"RTS\",am:\"\",nb:1,il:0,c1:6,c2:0,nw:0,br:1,mod:\"S\"}, // 60\n {mn:\"ADC\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 61\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 62\n {mn:\"RRA\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 63\n {mn:\"NOP\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:\"\"}, // 64\n {mn:\"ADC\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 65\n {mn:\"ROR\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // 66\n {mn:\"RRA\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 67\n {mn:\"PLA\",am:\"\",nb:1,il:0,c1:4,c2:0,nw:0,br:0,mod:\"SAZN\"}, // 68\n {mn:\"ADC\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 69\n {mn:\"ROR\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZN\"}, // 6a\n {mn:\"ARR\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 6b\n {mn:\"JMP\",am:\"(AAAA)\",nb:3,il:0,c1:5,c2:0,nw:0,br:1,mod:\"\"}, // 6c\n {mn:\"ADC\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 6d\n {mn:\"ROR\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 6e\n {mn:\"RRA\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 6f\n {mn:\"BVS\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 70\n {mn:\"ADC\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // 71\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 72\n {mn:\"RRA\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 73\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 74\n {mn:\"ADC\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // 75\n {mn:\"ROR\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // 76\n {mn:\"RRA\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 77\n {mn:\"SEI\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"I\"}, // 78\n {mn:\"ADC\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // 79\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 7a\n {mn:\"RRA\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 7b\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // 7c\n {mn:\"ADC\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // 7d\n {mn:\"ROR\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // 7e\n {mn:\"RRA\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // 7f\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 80\n {mn:\"STA\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:1,br:0,mod:\"\"}, // 81\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 82\n {mn:\"SAX\",am:\"(aa,x)\",nb:2,il:1,c1:6,c2:0,nw:1,br:0,mod:\"\"}, // 83\n {mn:\"STY\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:\"\"}, // 84\n {mn:\"STA\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:\"\"}, // 85\n {mn:\"STX\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:1,br:0,mod:\"\"}, // 86\n {mn:\"SAX\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:1,br:0,mod:\"\"}, // 87\n {mn:\"DEY\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"YZN\"}, // 88\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // 89\n {mn:\"TXA\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 8a\n {mn:\"ANE\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 8b\n {mn:\"STY\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 8c\n {mn:\"STA\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 8d\n {mn:\"STX\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 8e\n {mn:\"SAX\",am:\"AAAA\",nb:3,il:1,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 8f\n {mn:\"BCC\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // 90\n {mn:\"STA\",am:\"(aa),y\",nb:2,il:0,c1:6,c2:0,nw:1,br:0,mod:\"\"}, // 91\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // 92\n {mn:\"SHA\",am:\"(aa),y\",nb:2,il:1,c1:6,c2:0,nw:1,br:0,mod:\"\"}, // 93\n {mn:\"STY\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 94\n {mn:\"STA\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 95\n {mn:\"STX\",am:\"aa,y\",nb:2,il:0,c1:4,c2:0,nw:1,br:0,mod:\"\"}, // 96\n {mn:\"SAX\",am:\"aa,y\",nb:3,il:1,c1:4,c2:0,nw:1,br:1,mod:\"\"}, // 97\n {mn:\"TYA\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // 98\n {mn:\"STA\",am:\"AAAA,y\",nb:3,il:0,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 99\n {mn:\"TXS\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"S\"}, // 9a\n {mn:\"SHS\",am:\"AAAA,y\",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:\"S\"}, // 9b\n {mn:\"SHY\",am:\"AAAA,x\",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 9c\n {mn:\"STA\",am:\"AAAA,x\",nb:3,il:0,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 9d\n {mn:\"SHX\",am:\"AAAA,y\",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 9e\n {mn:\"SHA\",am:\"AAAA,y\",nb:3,il:1,c1:5,c2:0,nw:1,br:0,mod:\"\"}, // 9f\n {mn:\"LDY\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"YZN\"}, // a0\n {mn:\"LDA\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"AZN\"}, // a1\n {mn:\"LDX\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // a2\n {mn:\"LAX\",am:\"(aa,x)\",nb:2,il:1,c1:6,c2:0,nw:0,br:0,mod:\"AXZN\"}, // a3\n {mn:\"LDY\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"YZN\"}, // a4\n {mn:\"LDA\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"AZN\"}, // a5\n {mn:\"LDX\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"XZN\"}, // a6\n {mn:\"LAX\",am:\"aa\",nb:2,il:1,c1:3,c2:0,nw:0,br:0,mod:\"AXZN\"}, // a7\n {mn:\"TAY\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"YZN\"}, // a8\n {mn:\"LDA\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"AZN\"}, // a9\n {mn:\"TAX\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // aa\n {mn:\"LXA\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"AXZN\"}, // ab\n {mn:\"LDY\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"YZN\"}, // ac\n {mn:\"LDA\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // ad\n {mn:\"LDX\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"XZN\"}, // ae\n {mn:\"LAX\",am:\"AAAA\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"AXZN\"}, // af\n {mn:\"BCS\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // b0\n {mn:\"LDA\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"AZN\"}, // b1\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // b2\n {mn:\"LAX\",am:\"(aa),y\",nb:2,il:1,c1:5,c2:1,nw:0,br:0,mod:\"AXZN\"}, // b3\n {mn:\"LDY\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"YZN\"}, // b4\n {mn:\"LDA\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"AZN\"}, // b5\n {mn:\"LDX\",am:\"aa,y\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"XZN\"}, // b6\n {mn:\"LAX\",am:\"aa,y\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"AXZN\"}, // b7\n {mn:\"CLV\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"V\"}, // b8\n {mn:\"LDA\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // b9\n {mn:\"TSX\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // ba\n {mn:\"LAS\",am:\"AAAA,y\",nb:3,il:1,c1:4,c2:1,nw:0,br:0,mod:\"SAXZN\"}, // bb\n {mn:\"LDY\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"YZN\"}, // bc\n {mn:\"LDA\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"AZN\"}, // bd\n {mn:\"LDX\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"XZN\"}, // be\n {mn:\"LAX\",am:\"AAAA,y\",nb:3,il:1,c1:4,c2:1,nw:0,br:0,mod:\"AXZN\"}, // bf\n {mn:\"CPY\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"CZN\"}, // c0\n {mn:\"CMP\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"CZN\"}, // c1\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // c2\n {mn:\"DCP\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"CZN\"}, // c3\n {mn:\"CPY\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"CZN\"}, // c4\n {mn:\"CMP\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"CZN\"}, // c5\n {mn:\"DEC\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"ZN\"}, // c6\n {mn:\"DCP\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"CZN\"}, // c7\n {mn:\"INY\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"YZN\"}, // c8\n {mn:\"CMP\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"CZN\"}, // c9\n {mn:\"DEX\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // ca\n {mn:\"SBX\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"XCZN\"}, // cb\n {mn:\"CPY\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"CZN\"}, // cc\n {mn:\"CMP\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"CZN\"}, // cd\n {mn:\"DEC\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"ZN\"}, // ce\n {mn:\"DCP\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // cf\n {mn:\"BNE\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // d0\n {mn:\"CMP\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"CZN\"}, // d1\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // d2\n {mn:\"DCP\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"CZN\"}, // d3\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // d4\n {mn:\"CMP\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"CZN\"}, // d5\n {mn:\"DEC\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"ZN\"}, // d6\n {mn:\"DCP\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"CZN\"}, // d7\n {mn:\"CLD\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"D\"}, // d8\n {mn:\"CMP\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"CZN\"}, // d9\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // da\n {mn:\"DCP\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // db\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // dc\n {mn:\"CMP\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"CZN\"}, // dd\n {mn:\"DEC\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"ZN\"}, // de\n {mn:\"DCP\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"CZN\"}, // df\n {mn:\"CPX\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"CZN\"}, // e0\n {mn:\"SBC\",am:\"(aa,x)\",nb:2,il:0,c1:6,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // e1\n {mn:\"NOP\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // e2\n {mn:\"ISB\",am:\"(aa,x)\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // e3\n {mn:\"CPX\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"CZN\"}, // e4\n {mn:\"SBC\",am:\"aa\",nb:2,il:0,c1:3,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // e5\n {mn:\"INC\",am:\"aa\",nb:2,il:0,c1:5,c2:0,nw:2,br:0,mod:\"ZN\"}, // e6\n {mn:\"ISB\",am:\"aa\",nb:2,il:1,c1:5,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // e7\n {mn:\"INX\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"XZN\"}, // e8\n {mn:\"SBC\",am:\"#aa\",nb:2,il:0,c1:2,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // e9\n {mn:\"NOP\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // ea\n {mn:\"SBC\",am:\"#aa\",nb:2,il:1,c1:2,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // eb\n {mn:\"CPX\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"CZN\"}, // ec\n {mn:\"SBC\",am:\"AAAA\",nb:3,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // ed\n {mn:\"INC\",am:\"AAAA\",nb:3,il:0,c1:6,c2:0,nw:2,br:0,mod:\"ZN\"}, // ee\n {mn:\"ISB\",am:\"AAAA\",nb:3,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // ef\n {mn:\"BEQ\",am:\"branch\",nb:2,il:0,c1:2,c2:2,nw:0,br:1,mod:\"\"}, // f0\n {mn:\"SBC\",am:\"(aa),y\",nb:2,il:0,c1:5,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // f1\n {mn:\"KIL\",am:\"\",nb:1,il:2,c1:3,c2:0,nw:0,br:1,mod:\"\"}, // f2\n {mn:\"ISB\",am:\"(aa),y\",nb:2,il:1,c1:8,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // f3\n {mn:\"NOP\",am:\"aa,x\",nb:2,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // f4\n {mn:\"SBC\",am:\"aa,x\",nb:2,il:0,c1:4,c2:0,nw:0,br:0,mod:\"ACZVN\"}, // f5\n {mn:\"INC\",am:\"aa,x\",nb:2,il:0,c1:6,c2:0,nw:2,br:0,mod:\"ZN\"}, // f6\n {mn:\"ISB\",am:\"aa,x\",nb:2,il:1,c1:6,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // f7\n {mn:\"SED\",am:\"\",nb:1,il:0,c1:2,c2:0,nw:0,br:0,mod:\"D\"}, // f8\n {mn:\"SBC\",am:\"AAAA,y\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // f9\n {mn:\"NOP\",am:\"\",nb:1,il:1,c1:2,c2:0,nw:0,br:0,mod:\"\"}, // fa\n {mn:\"ISB\",am:\"AAAA,y\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // fb\n {mn:\"NOP\",am:\"AAAA,x\",nb:3,il:1,c1:4,c2:0,nw:0,br:0,mod:\"\"}, // fc\n {mn:\"SBC\",am:\"AAAA,x\",nb:3,il:0,c1:4,c2:1,nw:0,br:0,mod:\"ACZVN\"}, // fd\n {mn:\"INC\",am:\"AAAA,x\",nb:3,il:0,c1:7,c2:0,nw:2,br:0,mod:\"ZN\"}, // fe\n {mn:\"ISB\",am:\"AAAA,x\",nb:3,il:1,c1:7,c2:0,nw:2,br:0,mod:\"ACZVN\"}, // ff\n];\n\nexport function disassemble6502(pc:number, b0:number, b1:number, b2:number) : {line:string, nbytes:number, isaddr:boolean} {\n\n var op = OPS_6502[b0];\n if (op == null) return {line:\"???\", nbytes:1, isaddr:false};\n var s = op.mn;\n var am = op.am;\n var isaddr = false;\n if (am == 'branch') {\n var offset = (b1 < 0x80) ? (pc+2+b1) : (pc+2-(256-b1));\n offset &= 0xffff;\n am = '$'+hex(offset, 4);\n isaddr = true;\n } else {\n am = am.replace('aa','$'+hex(b1, 2));\n am = am.replace('AAAA','$'+hex(b1+(b2<<8), 4));\n if (am.indexOf('#') < 0 && am.indexOf('$') >= 0)\n isaddr = true;\n }\n return {line:op.mn + \" \" + am, nbytes:op.nb, isaddr:isaddr};\n};\n", "// Generated by CoffeeScript 1.9.3\n\nimport { CPU, Bus, InstructionBased, IOBusConnected, SavesState, Interruptable } from \"../devices\";\n\n///////////////////////////////////////////////////////////////////////////////\n/// @file Z80.js\n///\n/// @brief Emulator for the Zilog Z80 microprocessor\n///\n/// @author Matthew Howell\n///\n/// @remarks\n/// This module is a simple, straightforward instruction interpreter.\n/// There is no fancy dynamic recompilation or cycle-accurate emulation.\n/// The author believes that this should be sufficient for any emulator that\n/// would be feasible to write in JavaScript anyway.\n/// The code and the comments in this file assume that the reader is familiar\n/// with the Z80 architecture. If you're not, here are some references I use:\n/// http://clrhome.org/table/ - Z80 instruction set tables\n/// http://www.zilog.com/docs/z80/um0080.pdf - The official manual\n/// http://www.myquest.nl/z80undocumented/z80-documented-v0.91.pdf\n/// - The Undocumented Z80, Documented\n///\n/// @copyright (c) 2013 Matthew Howell\n/// This code is released under the MIT license,\n/// a copy of which is available in the associated README.md file,\n/// or at http://opensource.org/licenses/MIT\n///////////////////////////////////////////////////////////////////////////////\n\n///////////////////////////////////////////////////////////////////////////////\n/// We'll begin with the object constructor and the public API functions.\n///////////////////////////////////////////////////////////////////////////////\nfunction FastZ80(coreParameter)\n{\n // Obviously we'll be needing the core object's functions again.\n const core = coreParameter;\n \n // The argument to this constructor should be an object containing 4 functions:\n // mem_read(address) should return the byte at the given memory address,\n // mem_write(address, value) should write the given value to the given memory address,\n // io_read(port) should read a return a byte read from the given I/O port,\n // io_write(port, value) should write the given byte to the given I/O port.\n // If any of those functions is missing, this module cannot run.\n if (!core || (typeof core.mem_read !== \"function\") || (typeof core.mem_write !== \"function\") ||\n (typeof core.io_read !== \"function\") || (typeof core.io_write !== \"function\"))\n throw(\"Z80: Core object is missing required functions.\");\n \n // All right, let's initialize the registers.\n // First, the standard 8080 registers.\n let a = 0x00;\n let b = 0x00;\n let c = 0x00;\n let d = 0x00;\n let e = 0x00;\n let h = 0x00;\n let l = 0x00;\n // Now the special Z80 copies of the 8080 registers\n // (the ones used for the SWAP instruction and such).\n let a_prime = 0x00;\n let b_prime = 0x00;\n let c_prime = 0x00;\n let d_prime = 0x00;\n let e_prime = 0x00;\n let h_prime = 0x00;\n let l_prime = 0x00;\n // And now the Z80 index registers.\n let ix = 0x0000;\n let iy = 0x0000;\n // Then the \"utility\" registers: the interrupt vector,\n // the memory refresh, the stack pointer, and the program counter.\n let i = 0x00;\n let r = 0x00;\n let sp = 0xdff0;\n let pc = 0x0000;\n // We don't keep an F register for the flags,\n // because most of the time we're only accessing a single flag,\n // so we optimize for that case and use utility functions\n // for the rarer occasions when we need to access the whole register.\n let flags = {S:0, Z:0, Y:0, H:0, X:0, P:0, N:0, C:0};\n let flags_prime = {S:0, Z:0, Y:0, H:0, X:0, P:0, N:0, C:0};\n // And finally we have the interrupt mode and flip-flop registers.\n let imode = 0;\n let iff1 = 0;\n let iff2 = 0;\n \n // These are all specific to this implementation, not Z80 features.\n // Keep track of whether we've had a HALT instruction called.\n let halted = false;\n // EI and DI wait one instruction before they take effect;\n // these flags tell us when we're in that wait state.\n let do_delayed_di = false;\n let do_delayed_ei = false;\n // This tracks the number of cycles spent in a single instruction run,\n // including processing any prefixes and handling interrupts.\n let cycle_counter = 0;\n \n function getState():Z80State {\n return {\n PC:pc,\n SP:sp,\n IX:ix,\n IY:iy,\n AF:(a<<8)+get_flags_register(),\n BC:(b<<8)+c,\n DE:(d<<8)+e,\n HL:(h<<8)+l,\n AF_:(a_prime<<8)+get_flags_prime(),\n BC_:(b_prime<<8)+c_prime,\n DE_:(d_prime<<8)+e_prime,\n HL_:(h_prime<<8)+l_prime,\n IR:(i<<8)+r,\n im : imode,\n iff1 : iff1,\n iff2 : iff2,\n halted : halted,\n do_delayed_di : do_delayed_di,\n do_delayed_ei : do_delayed_ei,\n cycle_counter : cycle_counter\n }; \n }\n\n function setState(state:Z80State) {\n pc = state.PC;\n sp = state.SP;\n ix = state.IX;\n iy = state.IY;\n a = (state.AF >> 8) & 0xff;\n set_flags_register(state.AF);\n b = (state.BC >> 8) & 0xff;\n c = state.BC & 0xff;\n d = (state.DE >> 8) & 0xff;\n e = state.DE & 0xff;\n h = (state.HL >> 8) & 0xff;\n l = state.HL & 0xff;\n a_prime = (state.AF_ >> 8) & 0xff;\n set_flags_prime(state.AF_);\n b_prime = (state.BC_ >> 8) & 0xff;\n c_prime = state.BC_ & 0xff;\n d_prime = (state.DE_ >> 8) & 0xff;\n e_prime = state.DE_ & 0xff;\n h_prime = (state.HL_ >> 8) & 0xff;\n l_prime = state.HL_ & 0xff;\n i = (state.IR >> 8) & 0xff;\n r = state.IR & 0xff;\n imode = state.im;\n iff1 = state.iff1;\n iff2 = state.iff2;\n halted = state.halted;\n do_delayed_di = state.do_delayed_di;\n do_delayed_ei = state.do_delayed_ei;\n cycle_counter = state.cycle_counter;\n }\n\n///////////////////////////////////////////////////////////////////////////////\n/// @public reset\n///\n/// @brief Re-initialize the processor as if a reset or power on had occured\n///////////////////////////////////////////////////////////////////////////////\nlet reset = function()\n{\n // These registers are the ones that have predictable states\n // immediately following a power-on or a reset.\n // The others are left alone, because their states are unpredictable.\n sp = 0xdff0;\n pc = 0x0000;\n a = 0x00;\n r = 0x00;\n set_flags_register(0);\n // Start up with interrupts disabled.\n imode = 0;\n iff1 = 0;\n iff2 = 0;\n // Don't start halted or in a delayed DI or EI.\n halted = false;\n do_delayed_di = false;\n do_delayed_ei = false;\n // Obviously we've not used any cycles yet.\n cycle_counter = 0;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n/// @public run_instruction\n///\n/// @brief Runs a single instruction\n///\n/// @return The number of T cycles the instruction took to run,\n/// plus any time that went into handling interrupts that fired\n/// while this instruction was executing\n///////////////////////////////////////////////////////////////////////////////\nlet run_instruction = function()\n{\n if (!halted)\n {\n // If the previous instruction was a DI or an EI,\n // we'll need to disable or enable interrupts\n // after whatever instruction we're about to run is finished.\n var doing_delayed_di = false, doing_delayed_ei = false;\n if (do_delayed_di)\n {\n do_delayed_di = false;\n doing_delayed_di = true;\n }\n else if (do_delayed_ei)\n {\n do_delayed_ei = false;\n doing_delayed_ei = true;\n }\n\n // R is incremented at the start of every instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n \n // Read the byte at the PC and run the instruction it encodes.\n var opcode = core.mem_read(pc);\n decode_instruction(opcode);\n pc = (pc + 1) & 0xffff;\n \n // Actually do the delayed interrupt disable/enable if we have one.\n if (doing_delayed_di)\n {\n iff1 = 0;\n iff2 = 0;\n //console.log(\"DI\",pc);\n }\n else if (doing_delayed_ei)\n {\n iff1 = 1;\n iff2 = 1;\n //console.log(\"EI\",pc);\n }\n \n // And finally clear out the cycle counter for the next instruction\n // before returning it to the emulator core.\n var retval = cycle_counter;\n cycle_counter = 0;\n return retval;\n }\n else\n {\n // While we're halted, claim that we spent a cycle doing nothing,\n // so that the rest of the emulator can still proceed.\n return 1;\n }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n/// @public interrupt\n///\n/// @brief Simulates pulsing the processor's INT (or NMI) pin\n///\n/// @param non_maskable - true if this is a non-maskable interrupt\n/// @param data - the value to be placed on the data bus, if needed\n///////////////////////////////////////////////////////////////////////////////\nlet interrupt = function(non_maskable:boolean, data:number) : boolean\n{\n //console.log(non_maskable, data, iff1, iff2, do_delayed_ei, do_delayed_di);\n if (non_maskable)\n {\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n // Non-maskable interrupts are always handled the same way;\n // clear IFF1 and then do a CALL 0x0066.\n // Also, all interrupts reset the HALT state.\n halted = false;\n iff2 = iff1;\n iff1 = 0;\n push_word(pc);\n pc = 0x66;\n cycle_counter += 11;\n return true;\n }\n else if (iff1)\n {\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n \n halted = false;\n iff1 = 0;\n iff2 = 0;\n \n if (imode === 0)\n {\n // In the 8080-compatible interrupt mode,\n // decode the content of the data bus as an instruction and run it.\n pc = (pc - 1) & 0xffff; //SEH: so do_reset() pushes right value\n decode_instruction(data);\n pc = (pc + 1) & 0xffff; //SEH: so do_reset() pushes right value\n cycle_counter += 2;\n }\n else if (imode === 1)\n {\n // Mode 1 is always just RST 0x38.\n push_word(pc);\n pc = 0x38;\n cycle_counter += 13;\n }\n else if (imode === 2)\n {\n // Mode 2 uses the value on the data bus as in index\n // into the vector table pointer to by the I register.\n push_word(pc);\n // The Z80 manual says that this address must be 2-byte aligned,\n // but it doesn't appear that this is actually the case on the hardware,\n // so we don't attempt to enforce that here.\n var vector_address = ((i << 8) | data);\n pc = core.mem_read(vector_address) | \n (core.mem_read((vector_address + 1) & 0xffff) << 8);\n \n cycle_counter += 19;\n }\n //console.log(imode,data,pc);\n return true;\n }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n/// The public API functions end here.\n///\n/// What begins here are just general utility functions, used variously.\n///////////////////////////////////////////////////////////////////////////////\nlet decode_instruction = function(opcode)\n{\n // The register-to-register loads and ALU instructions\n // are all so uniform that we can decode them directly\n // instead of going into the instruction array for them.\n // This function gets the operand for all of these instructions.\n var get_operand = function(opcode)\n {\n return ((opcode & 0x07) === 0) ? b :\n ((opcode & 0x07) === 1) ? c :\n ((opcode & 0x07) === 2) ? d :\n ((opcode & 0x07) === 3) ? e :\n ((opcode & 0x07) === 4) ? h :\n ((opcode & 0x07) === 5) ? l :\n ((opcode & 0x07) === 6) ? core.mem_read(l | (h << 8)) : a;\n };\n\n // Handle HALT right up front, because it fouls up our LD decoding\n // by falling where LD (HL), (HL) ought to be.\n if (opcode === 0x76)\n {\n halted = true;\n }\n else if ((opcode >= 0x40) && (opcode < 0x80))\n {\n // This entire range is all 8-bit register loads.\n // Get the operand and assign it to the correct destination.\n var operand = get_operand(opcode);\n \n if (((opcode & 0x38) >>> 3) === 0)\n b = operand;\n else if (((opcode & 0x38) >>> 3) === 1)\n c = operand;\n else if (((opcode & 0x38) >>> 3) === 2)\n d = operand;\n else if (((opcode & 0x38) >>> 3) === 3)\n e = operand;\n else if (((opcode & 0x38) >>> 3) === 4)\n h = operand;\n else if (((opcode & 0x38) >>> 3) === 5)\n l = operand;\n else if (((opcode & 0x38) >>> 3) === 6)\n core.mem_write(l | (h << 8), operand);\n else if (((opcode & 0x38) >>> 3) === 7)\n a = operand;\n }\n else if ((opcode >= 0x80) && (opcode < 0xc0))\n {\n // These are the 8-bit register ALU instructions.\n // We'll get the operand and then use this \"jump table\"\n // to call the correct utility function for the instruction.\n var operand = get_operand(opcode),\n op_array = [do_add, do_adc, do_sub, do_sbc,\n do_and, do_xor, do_or, do_cp];\n \n op_array[(opcode & 0x38) >>> 3]( operand);\n }\n else\n {\n // This is one of the less formulaic instructions;\n // we'll get the specific function for it from our array.\n var func = instructions[opcode];\n func();\n }\n \n // Update the cycle counter with however many cycles\n // the base instruction took.\n // If this was a prefixed instruction, then\n // the prefix handler has added its extra cycles already.\n cycle_counter += cycle_counts[opcode];\n};\n\nlet get_signed_offset_byte = function(value)\n{\n // This function requires some explanation.\n // We just use JavaScript Number variables for our registers,\n // not like a typed array or anything.\n // That means that, when we have a byte value that's supposed\n // to represent a signed offset, the value we actually see\n // isn't signed at all, it's just a small integer.\n // So, this function converts that byte into something JavaScript\n // will recognize as signed, so we can easily do arithmetic with it.\n // First, we clamp the value to a single byte, just in case.\n value &= 0xff;\n // We don't have to do anything if the value is positive.\n if (value & 0x80)\n {\n // But if the value is negative, we need to manually un-two's-compliment it.\n // I'm going to assume you can figure out what I meant by that,\n // because I don't know how else to explain it.\n // We could also just do value |= 0xffffff00, but I prefer\n // not caring how many bits are in the integer representation\n // of a JavaScript number in the currently running browser.\n value = -((0xff & ~value) + 1);\n }\n return value;\n};\n\nlet get_flags_register = function()\n{\n // We need the whole F register for some reason.\n // probably a PUSH AF instruction,\n // so make the F register out of our separate flags.\n return (flags.S << 7) |\n (flags.Z << 6) |\n (flags.Y << 5) |\n (flags.H << 4) |\n (flags.X << 3) |\n (flags.P << 2) |\n (flags.N << 1) |\n (flags.C);\n};\n\nlet get_flags_prime = function()\n{\n // This is the same as the above for the F' register.\n return (flags_prime.S << 7) |\n (flags_prime.Z << 6) |\n (flags_prime.Y << 5) |\n (flags_prime.H << 4) |\n (flags_prime.X << 3) |\n (flags_prime.P << 2) |\n (flags_prime.N << 1) |\n (flags_prime.C);\n};\n\nlet set_flags_register = function(operand)\n{\n // We need to set the F register, probably for a POP AF,\n // so break out the given value into our separate flags.\n flags.S = (operand & 0x80) >>> 7;\n flags.Z = (operand & 0x40) >>> 6;\n flags.Y = (operand & 0x20) >>> 5;\n flags.H = (operand & 0x10) >>> 4;\n flags.X = (operand & 0x08) >>> 3;\n flags.P = (operand & 0x04) >>> 2;\n flags.N = (operand & 0x02) >>> 1;\n flags.C = (operand & 0x01);\n};\n\nlet set_flags_prime = function(operand)\n{\n // Again, this is the same as the above for F'.\n flags_prime.S = (operand & 0x80) >>> 7;\n flags_prime.Z = (operand & 0x40) >>> 6;\n flags_prime.Y = (operand & 0x20) >>> 5;\n flags_prime.H = (operand & 0x10) >>> 4;\n flags_prime.X = (operand & 0x08) >>> 3;\n flags_prime.P = (operand & 0x04) >>> 2;\n flags_prime.N = (operand & 0x02) >>> 1;\n flags_prime.C = (operand & 0x01);\n};\n\nlet update_xy_flags = function(result)\n{\n // Most of the time, the undocumented flags\n // (sometimes called X and Y, or 3 and 5),\n // take their values from the corresponding bits\n // of the result of the instruction,\n // or from some other related value.\n // This is a utility function to set those flags based on those bits.\n flags.Y = (result & 0x20) >>> 5;\n flags.X = (result & 0x08) >>> 3;\n};\n\nlet get_parity = function(value)\n{\n // We could try to actually calculate the parity every time,\n // but why calculate what you can pre-calculate?\n var parity_bits = [\n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,\n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, \n 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1\n ];\n return parity_bits[value];\n};\n\nlet push_word = function(operand)\n{\n // Pretty obvious what this function does; given a 16-bit value,\n // decrement the stack pointer, write the high byte to the new\n // stack pointer location, then repeat for the low byte.\n sp = (sp - 1) & 0xffff;\n core.mem_write(sp, (operand & 0xff00) >>> 8);\n sp = (sp - 1) & 0xffff;\n core.mem_write(sp, operand & 0x00ff);\n};\n\nlet pop_word = function()\n{\n // Again, not complicated; read a byte off the top of the stack,\n // increment the stack pointer, rinse and repeat.\n var retval = core.mem_read(sp) & 0xff;\n sp = (sp + 1) & 0xffff;\n retval |= core.mem_read(sp) << 8;\n sp = (sp + 1) & 0xffff;\n return retval;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n/// Now, the way most instructions work in this emulator is that they set up\n/// their operands according to their addressing mode, and then they call a\n/// utility function that handles all variations of that instruction.\n/// Those utility functions begin here.\n///////////////////////////////////////////////////////////////////////////////\nlet do_conditional_absolute_jump = function(condition)\n{\n // This function implements the JP [condition],nn instructions.\n if (condition)\n {\n // We're taking this jump, so write the new PC,\n // and then decrement the thing we just wrote,\n // because the instruction decoder increments the PC\n // unconditionally at the end of every instruction\n // and we need to counteract that so we end up at the jump target.\n pc = core.mem_read((pc + 1) & 0xffff) |\n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc - 1) & 0xffff;\n }\n else\n {\n // We're not taking this jump, just move the PC past the operand.\n pc = (pc + 2) & 0xffff;\n }\n};\n\nlet do_conditional_relative_jump = function(condition)\n{\n // This function implements the JR [condition],n instructions.\n if (condition)\n {\n // We need a few more cycles to actually take the jump.\n cycle_counter += 5;\n // Calculate the offset specified by our operand.\n var offset = get_signed_offset_byte(core.mem_read((pc + 1) & 0xffff));\n // Add the offset to the PC, also skipping past this instruction.\n pc = (pc + offset + 1) & 0xffff;\n }\n else\n {\n // No jump happening, just skip the operand.\n pc = (pc + 1) & 0xffff;\n }\n};\n\nlet do_conditional_call = function(condition)\n{\n // This function is the CALL [condition],nn instructions.\n // If you've seen the previous functions, you know this drill.\n if (condition)\n {\n cycle_counter += 7;\n push_word((pc + 3) & 0xffff);\n pc = core.mem_read((pc + 1) & 0xffff) |\n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc - 1) & 0xffff;\n }\n else\n {\n pc = (pc + 2) & 0xffff;\n }\n};\n\nlet do_conditional_return = function(condition)\n{\n if (condition)\n {\n cycle_counter += 6;\n pc = (pop_word() - 1) & 0xffff;\n }\n};\n\nlet do_reset = function(address)\n{\n // The RST [address] instructions go through here.\n push_word((pc + 1) & 0xffff);\n pc = (address - 1) & 0xffff;\n};\n\nlet do_add = function(operand)\n{\n // This is the ADD A, [operand] instructions.\n // We'll do the literal addition, which includes any overflow,\n // so that we can more easily figure out whether we had\n // an overflow or a carry and set the flags accordingly.\n var result = a + operand;\n \n // The great majority of the work for the arithmetic instructions\n // turns out to be setting the flags rather than the actual operation.\n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = (((operand & 0x0f) + (a & 0x0f)) & 0x10) ? 1 : 0;\n // An overflow has happened if the sign bits of the accumulator and the operand\n // don't match the sign bit of the result value.\n flags.P = ((a & 0x80) === (operand & 0x80)) && ((a & 0x80) !== (result & 0x80)) ? 1 : 0;\n flags.N = 0;\n flags.C = (result & 0x100) ? 1 : 0;\n \n a = result & 0xff;\n update_xy_flags(a);\n};\n\nlet do_adc = function(operand)\n{\n var result = a + operand + flags.C;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = (((operand & 0x0f) + (a & 0x0f) + flags.C) & 0x10) ? 1 : 0;\n flags.P = ((a & 0x80) === (operand & 0x80)) && ((a & 0x80) !== (result & 0x80)) ? 1 : 0;\n flags.N = 0;\n flags.C = (result & 0x100) ? 1 : 0;\n \n a = result & 0xff;\n update_xy_flags(a);\n};\n\nlet do_sub = function(operand)\n{\n var result = a - operand;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = (((a & 0x0f) - (operand & 0x0f)) & 0x10) ? 1 : 0;\n flags.P = ((a & 0x80) !== (operand & 0x80)) && ((a & 0x80) !== (result & 0x80)) ? 1 : 0;\n flags.N = 1;\n flags.C = (result & 0x100) ? 1 : 0;\n \n a = result & 0xff;\n update_xy_flags(a);\n};\n\nlet do_sbc = function(operand)\n{\n var result = a - operand - flags.C;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = (((a & 0x0f) - (operand & 0x0f) - flags.C) & 0x10) ? 1 : 0;\n flags.P = ((a & 0x80) !== (operand & 0x80)) && ((a & 0x80) !== (result & 0x80)) ? 1 : 0;\n flags.N = 1;\n flags.C = (result & 0x100) ? 1 : 0;\n \n a = result & 0xff;\n update_xy_flags(a);\n};\n\nlet do_cp = function(operand)\n{\n // A compare instruction is just a subtraction that doesn't save the value,\n // so we implement it as... a subtraction that doesn't save the value.\n var temp = a;\n do_sub(operand);\n a = temp;\n // Since this instruction has no \"result\" value, the undocumented flags\n // are set based on the operand instead.\n update_xy_flags(operand);\n};\n\nlet do_and = function(operand)\n{\n // The logic instructions are all pretty straightforward.\n a &= operand & 0xff;\n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = !a ? 1 : 0;\n flags.H = 1;\n flags.P = get_parity(a);\n flags.N = 0;\n flags.C = 0;\n update_xy_flags(a);\n};\n\nlet do_or = function(operand)\n{\n a = (operand | a) & 0xff;\n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = !a ? 1 : 0;\n flags.H = 0;\n flags.P = get_parity(a);\n flags.N = 0;\n flags.C = 0;\n update_xy_flags(a);\n};\n\nlet do_xor = function(operand)\n{\n a = (operand ^ a) & 0xff;\n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = !a ? 1 : 0;\n flags.H = 0;\n flags.P = get_parity(a);\n flags.N = 0;\n flags.C = 0;\n update_xy_flags(a);\n};\n\nlet do_inc = function(operand)\n{\n var result = operand + 1;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = ((operand & 0x0f) === 0x0f) ? 1 : 0;\n // It's a good deal easier to detect overflow for an increment/decrement.\n flags.P = (operand === 0x7f) ? 1 : 0;\n flags.N = 0;\n \n result &= 0xff;\n update_xy_flags(result);\n \n return result;\n};\n\nlet do_dec = function(operand)\n{\n var result = operand - 1;\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = !(result & 0xff) ? 1 : 0;\n flags.H = ((operand & 0x0f) === 0x00) ? 1 : 0;\n flags.P = (operand === 0x80) ? 1 : 0;\n flags.N = 1;\n \n result &= 0xff;\n update_xy_flags(result);\n \n return result;\n};\n\nlet do_hl_add = function(operand)\n{\n // The HL arithmetic instructions are the same as the A ones,\n // just with twice as many bits happening.\n var hl = l | (h << 8), result = hl + operand;\n \n flags.N = 0;\n flags.C = (result & 0x10000) ? 1 : 0;\n flags.H = (((hl & 0x0fff) + (operand & 0x0fff)) & 0x1000) ? 1 : 0;\n \n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n\n update_xy_flags(h);\n};\n\nlet do_hl_adc = function(operand)\n{\n operand += flags.C;\n var hl = l | (h << 8), result = hl + operand;\n \n flags.S = (result & 0x8000) ? 1 : 0;\n flags.Z = !(result & 0xffff) ? 1 : 0;\n flags.H = (((hl & 0x0fff) + (operand & 0x0fff)) & 0x1000) ? 1 : 0;\n flags.P = ((hl & 0x8000) === (operand & 0x8000)) && ((result & 0x8000) !== (hl & 0x8000)) ? 1 : 0;\n flags.N = 0;\n flags.C = (result & 0x10000) ? 1 : 0;\n \n l = result & 0xff;\n h = (result >>> 8) & 0xff;\n \n update_xy_flags(h);\n};\n\nlet do_hl_sbc = function(operand)\n{\n operand += flags.C;\n var hl = l | (h << 8), result = hl - operand;\n \n flags.S = (result & 0x8000) ? 1 : 0;\n flags.Z = !(result & 0xffff) ? 1 : 0;\n flags.H = (((hl & 0x0fff) - (operand & 0x0fff)) & 0x1000) ? 1 : 0;\n flags.P = ((hl & 0x8000) !== (operand & 0x8000)) && ((result & 0x8000) !== (hl & 0x8000)) ? 1 : 0;\n flags.N = 1;\n flags.C = (result & 0x10000) ? 1 : 0;\n \n l = result & 0xff;\n h = (result >>> 8) & 0xff;\n \n update_xy_flags(h);\n};\n\nlet do_in = function(port)\n{\n var result = core.io_read(port);\n \n flags.S = (result & 0x80) ? 1 : 0;\n flags.Z = result ? 0 : 1;\n flags.H = 0;\n flags.P = get_parity(result) ? 1 : 0;\n flags.N = 0;\n update_xy_flags(result);\n \n return result;\n};\n\nlet do_neg = function()\n{\n // This instruction is defined to not alter the register if it === 0x80.\n if (a !== 0x80)\n {\n // This is a signed operation, so convert A to a signed value.\n a = get_signed_offset_byte(a);\n \n a = (-a) & 0xff;\n }\n \n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = !a ? 1 : 0;\n flags.H = (((-a) & 0x0f) > 0) ? 1 : 0;\n flags.P = (a === 0x80) ? 1 : 0;\n flags.N = 1;\n flags.C = a ? 1 : 0;\n update_xy_flags(a);\n};\n\nlet do_ldi = function()\n{\n // Copy the value that we're supposed to copy.\n var read_value = core.mem_read(l | (h << 8));\n core.mem_write(e | (d << 8), read_value);\n \n // Increment DE and HL, and decrement BC.\n var result = (e | (d << 8)) + 1;\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n result = (l | (h << 8)) + 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n result = (c | (b << 8)) - 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n \n flags.H = 0;\n flags.P = (c || b) ? 1 : 0;\n flags.N = 0;\n flags.Y = ((a + read_value) & 0x02) >>> 1;\n flags.X = ((a + read_value) & 0x08) >>> 3;\n};\n\nlet do_cpi = function()\n{\n var temp_carry = flags.C;\n var read_value = core.mem_read(l | (h << 8))\n do_cp(read_value);\n flags.C = temp_carry;\n flags.Y = ((a - read_value - flags.H) & 0x02) >>> 1;\n flags.X = ((a - read_value - flags.H) & 0x08) >>> 3;\n \n var result = (l | (h << 8)) + 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n result = (c | (b << 8)) - 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n \n flags.P = result ? 1 : 0;\n};\n\nlet do_ini = function()\n{\n b = do_dec(b);\n \n core.mem_write(l | (h << 8), core.io_read((b << 8) | c));\n \n var result = (l | (h << 8)) + 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n\n flags.N = 1;\n};\n\nlet do_outi = function()\n{\n core.io_write((b << 8) | c, core.mem_read(l | (h << 8)));\n \n var result = (l | (h << 8)) + 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n \n b = do_dec(b);\n flags.N = 1;\n};\n\nlet do_ldd = function()\n{\n flags.N = 0;\n flags.H = 0;\n \n var read_value = core.mem_read(l | (h << 8));\n core.mem_write(e | (d << 8), read_value);\n \n var result = (e | (d << 8)) - 1;\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n result = (l | (h << 8)) - 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n result = (c | (b << 8)) - 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n \n flags.P = (c || b) ? 1 : 0;\n flags.Y = ((a + read_value) & 0x02) >>> 1;\n flags.X = ((a + read_value) & 0x08) >>> 3;\n};\n\nlet do_cpd = function()\n{\n var temp_carry = flags.C\n var read_value = core.mem_read(l | (h << 8))\n do_cp(read_value);\n flags.C = temp_carry;\n flags.Y = ((a - read_value - flags.H) & 0x02) >>> 1;\n flags.X = ((a - read_value - flags.H) & 0x08) >>> 3;\n \n var result = (l | (h << 8)) - 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n result = (c | (b << 8)) - 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n \n flags.P = result ? 1 : 0;\n};\n\nlet do_ind = function()\n{\n b = do_dec(b);\n \n core.mem_write(l | (h << 8), core.io_read((b << 8) | c));\n \n var result = (l | (h << 8)) - 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n \n flags.N = 1;\n};\n\nlet do_outd = function()\n{\n core.io_write((b << 8) | c, core.mem_read(l | (h << 8)));\n \n var result = (l | (h << 8)) - 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n \n b = do_dec(b);\n flags.N = 1;\n};\n\nlet do_rlc = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = (operand & 0x80) >>> 7;\n operand = ((operand << 1) | flags.C) & 0xff;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_rrc = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = operand & 1;\n operand = ((operand >>> 1) & 0x7f) | (flags.C << 7);\n \n flags.Z = !(operand & 0xff) ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand & 0xff;\n};\n\nlet do_rl = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n var temp = flags.C;\n flags.C = (operand & 0x80) >>> 7;\n operand = ((operand << 1) | temp) & 0xff;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n\n return operand;\n};\n\nlet do_rr = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n var temp = flags.C;\n flags.C = operand & 1;\n operand = ((operand >>> 1) & 0x7f) | (temp << 7);\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n\n return operand;\n};\n\nlet do_sla = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = (operand & 0x80) >>> 7;\n operand = (operand << 1) & 0xff;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_sra = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = operand & 1;\n operand = ((operand >>> 1) & 0x7f) | (operand & 0x80);\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_sll = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = (operand & 0x80) >>> 7;\n operand = ((operand << 1) & 0xff) | 1;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = (operand & 0x80) ? 1 : 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_srl = function(operand)\n{\n flags.N = 0;\n flags.H = 0;\n \n flags.C = operand & 1;\n operand = (operand >>> 1) & 0x7f;\n \n flags.Z = !operand ? 1 : 0;\n flags.P = get_parity(operand);\n flags.S = 0;\n update_xy_flags(operand);\n \n return operand;\n};\n\nlet do_ix_add = function(operand)\n{\n flags.N = 0;\n \n var result = ix + operand;\n \n flags.C = (result & 0x10000) ? 1 : 0;\n flags.H = (((ix & 0xfff) + (operand & 0xfff)) & 0x1000) ? 1 : 0;\n update_xy_flags((result & 0xff00) >>> 8);\n \n ix = result & 0xffff;\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n/// This table contains the implementations for the instructions that weren't\n/// implemented directly in the decoder function (everything but the 8-bit\n/// register loads and the accumulator ALU instructions, in other words).\n/// Similar tables for the ED and DD/FD prefixes follow this one.\n///////////////////////////////////////////////////////////////////////////////\nlet instructions = [];\n\n// 0x00 : NOP\ninstructions[0x00] = function() { };\n// 0x01 : LD BC, nn\ninstructions[0x01] = function()\n{\n pc = (pc + 1) & 0xffff;\n c = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n b = core.mem_read(pc);\n};\n// 0x02 : LD (BC), A\ninstructions[0x02] = function()\n{\n core.mem_write(c | (b << 8), a);\n};\n// 0x03 : INC BC\ninstructions[0x03] = function()\n{\n var result = (c | (b << 8));\n result += 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n};\n// 0x04 : INC B\ninstructions[0x04] = function()\n{\n b = do_inc(b);\n};\n// 0x05 : DEC B\ninstructions[0x05] = function()\n{\n b = do_dec(b);\n};\n// 0x06 : LD B, n\ninstructions[0x06] = function()\n{\n pc = (pc + 1) & 0xffff;\n b = core.mem_read(pc);\n};\n// 0x07 : RLCA\ninstructions[0x07] = function()\n{\n // This instruction is implemented as a special case of the\n // more general Z80-specific RLC instruction.\n // Specifially, RLCA is a version of RLC A that affects fewer flags.\n // The same applies to RRCA, RLA, and RRA.\n var temp_s = flags.S, temp_z = flags.Z, temp_p = flags.P;\n a = do_rlc(a);\n flags.S = temp_s;\n flags.Z = temp_z;\n flags.P = temp_p;\n};\n// 0x08 : EX AF, AF'\ninstructions[0x08] = function()\n{\n var temp = a;\n a = a_prime;\n a_prime = temp;\n \n temp = get_flags_register();\n set_flags_register(get_flags_prime());\n set_flags_prime(temp);\n};\n// 0x09 : ADD HL, BC\ninstructions[0x09] = function()\n{\n do_hl_add(c | (b << 8));\n};\n// 0x0a : LD A, (BC)\ninstructions[0x0a] = function()\n{\n a = core.mem_read(c | (b << 8));\n};\n// 0x0b : DEC BC\ninstructions[0x0b] = function()\n{\n var result = (c | (b << 8));\n result -= 1;\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n};\n// 0x0c : INC C\ninstructions[0x0c] = function()\n{\n c = do_inc(c);\n};\n// 0x0d : DEC C\ninstructions[0x0d] = function()\n{\n c = do_dec(c);\n};\n// 0x0e : LD C, n\ninstructions[0x0e] = function()\n{\n pc = (pc + 1) & 0xffff;\n c = core.mem_read(pc);\n};\n// 0x0f : RRCA\ninstructions[0x0f] = function()\n{\n var temp_s = flags.S, temp_z = flags.Z, temp_p = flags.P;\n a = do_rrc(a);\n flags.S = temp_s;\n flags.Z = temp_z;\n flags.P = temp_p;\n};\n// 0x10 : DJNZ nn\ninstructions[0x10] = function()\n{\n b = (b - 1) & 0xff;\n do_conditional_relative_jump(b !== 0);\n};\n// 0x11 : LD DE, nn\ninstructions[0x11] = function()\n{\n pc = (pc + 1) & 0xffff;\n e = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n d = core.mem_read(pc);\n};\n// 0x12 : LD (DE), A\ninstructions[0x12] = function()\n{\n core.mem_write(e | (d << 8), a);\n};\n// 0x13 : INC DE\ninstructions[0x13] = function()\n{\n var result = (e | (d << 8));\n result += 1;\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n};\n// 0x14 : INC D\ninstructions[0x14] = function()\n{\n d = do_inc(d);\n};\n// 0x15 : DEC D\ninstructions[0x15] = function()\n{\n d = do_dec(d);\n};\n// 0x16 : LD D, n\ninstructions[0x16] = function()\n{\n pc = (pc + 1) & 0xffff;\n d = core.mem_read(pc);\n};\n// 0x17 : RLA\ninstructions[0x17] = function()\n{\n var temp_s = flags.S, temp_z = flags.Z, temp_p = flags.P;\n a = do_rl(a);\n flags.S = temp_s;\n flags.Z = temp_z;\n flags.P = temp_p;\n};\n// 0x18 : JR n\ninstructions[0x18] = function()\n{\n var offset = get_signed_offset_byte(core.mem_read((pc + 1) & 0xffff));\n pc = (pc + offset + 1) & 0xffff;\n};\n// 0x19 : ADD HL, DE\ninstructions[0x19] = function()\n{\n do_hl_add(e | (d << 8));\n};\n// 0x1a : LD A, (DE)\ninstructions[0x1a] = function()\n{\n a = core.mem_read(e | (d << 8));\n};\n// 0x1b : DEC DE\ninstructions[0x1b] = function()\n{\n var result = (e | (d << 8));\n result -= 1;\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n};\n// 0x1c : INC E\ninstructions[0x1c] = function()\n{\n e = do_inc(e);\n};\n// 0x1d : DEC E\ninstructions[0x1d] = function()\n{\n e = do_dec(e);\n};\n// 0x1e : LD E, n\ninstructions[0x1e] = function()\n{\n pc = (pc + 1) & 0xffff;\n e = core.mem_read(pc);\n};\n// 0x1f : RRA\ninstructions[0x1f] = function()\n{\n var temp_s = flags.S, temp_z = flags.Z, temp_p = flags.P;\n a = do_rr(a);\n flags.S = temp_s;\n flags.Z = temp_z;\n flags.P = temp_p;\n};\n// 0x20 : JR NZ, n\ninstructions[0x20] = function()\n{\n do_conditional_relative_jump(!flags.Z);\n};\n// 0x21 : LD HL, nn\ninstructions[0x21] = function()\n{\n pc = (pc + 1) & 0xffff;\n l = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n h = core.mem_read(pc);\n};\n// 0x22 : LD (nn), HL\ninstructions[0x22] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, l);\n core.mem_write((address + 1) & 0xffff, h);\n};\n// 0x23 : INC HL\ninstructions[0x23] = function()\n{\n var result = (l | (h << 8));\n result += 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n};\n// 0x24 : INC H\ninstructions[0x24] = function()\n{\n h = do_inc(h);\n};\n// 0x25 : DEC H\ninstructions[0x25] = function()\n{\n h = do_dec(h);\n};\n// 0x26 : LD H, n\ninstructions[0x26] = function()\n{\n pc = (pc + 1) & 0xffff;\n h = core.mem_read(pc);\n};\n// 0x27 : DAA\ninstructions[0x27] = function()\n{\n var temp = a;\n if (!flags.N)\n {\n if (flags.H || ((a & 0x0f) > 9))\n temp += 0x06;\n if (flags.C || (a > 0x99))\n temp += 0x60;\n }\n else\n {\n if (flags.H || ((a & 0x0f) > 9))\n temp -= 0x06;\n if (flags.C || (a > 0x99))\n temp -= 0x60;\n }\n \n flags.S = (temp & 0x80) ? 1 : 0;\n flags.Z = !(temp & 0xff) ? 1 : 0;\n flags.H = ((a & 0x10) ^ (temp & 0x10)) ? 1 : 0;\n flags.P = get_parity(temp & 0xff);\n // DAA never clears the carry flag if it was already set,\n // but it is able to set the carry flag if it was clear.\n // Don't ask me, I don't know.\n // Note also that we check for a BCD carry, instead of the usual.\n flags.C = (flags.C || (a > 0x99)) ? 1 : 0;\n \n a = temp & 0xff;\n \n update_xy_flags(a);\n};\n// 0x28 : JR Z, n\ninstructions[0x28] = function()\n{\n do_conditional_relative_jump(!!flags.Z);\n};\n// 0x29 : ADD HL, HL\ninstructions[0x29] = function()\n{\n do_hl_add(l | (h << 8));\n};\n// 0x2a : LD HL, (nn)\ninstructions[0x2a] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n l = core.mem_read(address);\n h = core.mem_read((address + 1) & 0xffff);\n};\n// 0x2b : DEC HL\ninstructions[0x2b] = function()\n{\n var result = (l | (h << 8));\n result -= 1;\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n};\n// 0x2c : INC L\ninstructions[0x2c] = function()\n{\n l = do_inc(l);\n};\n// 0x2d : DEC L\ninstructions[0x2d] = function()\n{\n l = do_dec(l);\n};\n// 0x2e : LD L, n\ninstructions[0x2e] = function()\n{\n pc = (pc + 1) & 0xffff;\n l = core.mem_read(pc);\n};\n// 0x2f : CPL\ninstructions[0x2f] = function()\n{\n a = (~a) & 0xff;\n flags.N = 1;\n flags.H = 1;\n update_xy_flags(a);\n};\n// 0x30 : JR NC, n\ninstructions[0x30] = function()\n{\n do_conditional_relative_jump(!flags.C);\n};\n// 0x31 : LD SP, nn\ninstructions[0x31] = function()\n{\n sp = core.mem_read((pc + 1) & 0xffff) | \n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc + 2) & 0xffff;\n};\n// 0x32 : LD (nn), A\ninstructions[0x32] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, a);\n};\n// 0x33 : INC SP\ninstructions[0x33] = function()\n{\n sp = (sp + 1) & 0xffff;\n};\n// 0x34 : INC (HL)\ninstructions[0x34] = function()\n{\n var address = l | (h << 8);\n core.mem_write(address, do_inc(core.mem_read(address)));\n};\n// 0x35 : DEC (HL)\ninstructions[0x35] = function()\n{\n var address = l | (h << 8);\n core.mem_write(address, do_dec(core.mem_read(address)));\n};\n// 0x36 : LD (HL), n\ninstructions[0x36] = function()\n{\n pc = (pc + 1) & 0xffff;\n core.mem_write(l | (h << 8), core.mem_read(pc));\n};\n// 0x37 : SCF\ninstructions[0x37] = function()\n{\n flags.N = 0;\n flags.H = 0;\n flags.C = 1;\n update_xy_flags(a);\n};\n// 0x38 : JR C, n\ninstructions[0x38] = function()\n{\n do_conditional_relative_jump(!!flags.C);\n};\n// 0x39 : ADD HL, SP\ninstructions[0x39] = function()\n{\n do_hl_add(sp);\n};\n// 0x3a : LD A, (nn)\ninstructions[0x3a] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n a = core.mem_read(address);\n};\n// 0x3b : DEC SP\ninstructions[0x3b] = function()\n{\n sp = (sp - 1) & 0xffff;\n};\n// 0x3c : INC A\ninstructions[0x3c] = function()\n{\n a = do_inc(a);\n};\n// 0x3d : DEC A\ninstructions[0x3d] = function()\n{\n a = do_dec(a);\n};\n// 0x3e : LD A, n\ninstructions[0x3e] = function()\n{\n a = core.mem_read((pc + 1) & 0xffff);\n pc = (pc + 1) & 0xffff;\n};\n// 0x3f : CCF\ninstructions[0x3f] = function()\n{\n flags.N = 0;\n flags.H = flags.C;\n flags.C = flags.C ? 0 : 1;\n update_xy_flags(a);\n};\n// 0xc0 : RET NZ\ninstructions[0xc0] = function()\n{\n do_conditional_return(!flags.Z);\n};\n// 0xc1 : POP BC\ninstructions[0xc1] = function()\n{\n var result = pop_word();\n c = result & 0xff;\n b = (result & 0xff00) >>> 8;\n};\n// 0xc2 : JP NZ, nn\ninstructions[0xc2] = function()\n{\n do_conditional_absolute_jump(!flags.Z);\n};\n// 0xc3 : JP nn\ninstructions[0xc3] = function()\n{\n pc = core.mem_read((pc + 1) & 0xffff) |\n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc - 1) & 0xffff;\n};\n// 0xc4 : CALL NZ, nn\ninstructions[0xc4] = function()\n{\n do_conditional_call(!flags.Z);\n};\n// 0xc5 : PUSH BC\ninstructions[0xc5] = function()\n{\n push_word(c | (b << 8));\n};\n// 0xc6 : ADD A, n\ninstructions[0xc6] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_add(core.mem_read(pc));\n};\n// 0xc7 : RST 00h\ninstructions[0xc7] = function()\n{\n do_reset(0x00);\n};\n// 0xc8 : RET Z\ninstructions[0xc8] = function()\n{\n do_conditional_return(!!flags.Z);\n};\n// 0xc9 : RET\ninstructions[0xc9] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n};\n// 0xca : JP Z, nn\ninstructions[0xca] = function()\n{\n do_conditional_absolute_jump(!!flags.Z);\n};\n// 0xcb : CB Prefix\ninstructions[0xcb] = function()\n{\n // R is incremented at the start of the second instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n\n // We don't have a table for this prefix,\n // the instructions are all so uniform that we can directly decode them.\n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc),\n bit_number = (opcode & 0x38) >>> 3,\n reg_code = opcode & 0x07;\n \n if (opcode < 0x40)\n {\n // Shift/rotate instructions\n var op_array = [do_rlc, do_rrc, do_rl, do_rr,\n do_sla, do_sra, do_sll, do_srl];\n \n if (reg_code === 0)\n b = op_array[bit_number]( b);\n else if (reg_code === 1)\n c = op_array[bit_number]( c);\n else if (reg_code === 2)\n d = op_array[bit_number]( d);\n else if (reg_code === 3)\n e = op_array[bit_number]( e);\n else if (reg_code === 4)\n h = op_array[bit_number]( h);\n else if (reg_code === 5)\n l = op_array[bit_number]( l);\n else if (reg_code === 6)\n core.mem_write(l | (h << 8),\n op_array[bit_number]( core.mem_read(l | (h << 8))));\n else if (reg_code === 7)\n a = op_array[bit_number]( a);\n }\n else if (opcode < 0x80)\n {\n // BIT instructions\n if (reg_code === 0)\n flags.Z = !(b & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 1)\n flags.Z = !(c & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 2)\n flags.Z = !(d & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 3)\n flags.Z = !(e & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 4)\n flags.Z = !(h & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 5)\n flags.Z = !(l & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 6)\n flags.Z = !((core.mem_read(l | (h << 8))) & (1 << bit_number)) ? 1 : 0;\n else if (reg_code === 7)\n flags.Z = !(a & (1 << bit_number)) ? 1 : 0;\n \n flags.N = 0;\n flags.H = 1;\n flags.P = flags.Z;\n flags.S = ((bit_number === 7) && !flags.Z) ? 1 : 0;\n // For the BIT n, (HL) instruction, the X and Y flags are obtained\n // from what is apparently an internal temporary register used for\n // some of the 16-bit arithmetic instructions.\n // I haven't implemented that register here,\n // so for now we'll set X and Y the same way for every BIT opcode,\n // which means that they will usually be wrong for BIT n, (HL).\n flags.Y = ((bit_number === 5) && !flags.Z) ? 1 : 0;\n flags.X = ((bit_number === 3) && !flags.Z) ? 1 : 0;\n }\n else if (opcode < 0xc0)\n {\n // RES instructions\n if (reg_code === 0)\n b &= (0xff & ~(1 << bit_number));\n else if (reg_code === 1)\n c &= (0xff & ~(1 << bit_number));\n else if (reg_code === 2)\n d &= (0xff & ~(1 << bit_number));\n else if (reg_code === 3)\n e &= (0xff & ~(1 << bit_number));\n else if (reg_code === 4)\n h &= (0xff & ~(1 << bit_number));\n else if (reg_code === 5)\n l &= (0xff & ~(1 << bit_number));\n else if (reg_code === 6)\n core.mem_write(l | (h << 8),\n core.mem_read(l | (h << 8)) & ~(1 << bit_number));\n else if (reg_code === 7)\n a &= (0xff & ~(1 << bit_number));\n }\n else\n {\n // SET instructions\n if (reg_code === 0)\n b |= (1 << bit_number);\n else if (reg_code === 1)\n c |= (1 << bit_number);\n else if (reg_code === 2)\n d |= (1 << bit_number);\n else if (reg_code === 3)\n e |= (1 << bit_number);\n else if (reg_code === 4)\n h |= (1 << bit_number);\n else if (reg_code === 5)\n l |= (1 << bit_number);\n else if (reg_code === 6)\n core.mem_write(l | (h << 8),\n core.mem_read(l | (h << 8)) | (1 << bit_number));\n else if (reg_code === 7)\n a |= (1 << bit_number);\n }\n \n cycle_counter += cycle_counts_cb[opcode];\n};\n// 0xcc : CALL Z, nn\ninstructions[0xcc] = function()\n{\n do_conditional_call(!!flags.Z);\n};\n// 0xcd : CALL nn\ninstructions[0xcd] = function()\n{\n push_word((pc + 3) & 0xffff);\n pc = core.mem_read((pc + 1) & 0xffff) |\n (core.mem_read((pc + 2) & 0xffff) << 8);\n pc = (pc - 1) & 0xffff;\n};\n// 0xce : ADC A, n\ninstructions[0xce] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_adc(core.mem_read(pc));\n};\n// 0xcf : RST 08h\ninstructions[0xcf] = function()\n{\n do_reset(0x08);\n};\n// 0xd0 : RET NC\ninstructions[0xd0] = function()\n{\n do_conditional_return(!flags.C);\n};\n// 0xd1 : POP DE\ninstructions[0xd1] = function()\n{\n var result = pop_word();\n e = result & 0xff;\n d = (result & 0xff00) >>> 8;\n};\n// 0xd2 : JP NC, nn\ninstructions[0xd2] = function()\n{\n do_conditional_absolute_jump(!flags.C);\n};\n// 0xd3 : OUT (n), A\ninstructions[0xd3] = function()\n{\n pc = (pc + 1) & 0xffff;\n core.io_write((a << 8) | core.mem_read(pc), a);\n};\n// 0xd4 : CALL NC, nn\ninstructions[0xd4] = function()\n{\n do_conditional_call(!flags.C);\n};\n// 0xd5 : PUSH DE\ninstructions[0xd5] = function()\n{\n push_word(e | (d << 8));\n};\n// 0xd6 : SUB n\ninstructions[0xd6] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_sub(core.mem_read(pc));\n};\n// 0xd7 : RST 10h\ninstructions[0xd7] = function()\n{\n do_reset(0x10);\n};\n// 0xd8 : RET C\ninstructions[0xd8] = function()\n{\n do_conditional_return(!!flags.C);\n};\n// 0xd9 : EXX\ninstructions[0xd9] = function()\n{\n var temp = b;\n b = b_prime;\n b_prime = temp;\n temp = c;\n c = c_prime;\n c_prime = temp;\n temp = d;\n d = d_prime;\n d_prime = temp;\n temp = e;\n e = e_prime;\n e_prime = temp;\n temp = h;\n h = h_prime;\n h_prime = temp;\n temp = l;\n l = l_prime;\n l_prime = temp;\n};\n// 0xda : JP C, nn\ninstructions[0xda] = function()\n{\n do_conditional_absolute_jump(!!flags.C);\n};\n// 0xdb : IN A, (n)\ninstructions[0xdb] = function()\n{\n pc = (pc + 1) & 0xffff;\n a = core.io_read((a << 8) | core.mem_read(pc));\n};\n// 0xdc : CALL C, nn\ninstructions[0xdc] = function()\n{\n do_conditional_call(!!flags.C);\n};\n// 0xdd : DD Prefix (IX instructions)\ninstructions[0xdd] = function()\n{\n // R is incremented at the start of the second instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n\n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc),\n func = dd_instructions[opcode];\n \n if (func)\n {\n //func = func.bind(this);\n func();\n cycle_counter += cycle_counts_dd[opcode];\n }\n else\n {\n // Apparently if a DD opcode doesn't exist,\n // it gets treated as an unprefixed opcode.\n // What we'll do to handle that is just back up the \n // program counter, so that this byte gets decoded\n // as a normal instruction.\n pc = (pc - 1) & 0xffff;\n // And we'll add in the cycle count for a NOP.\n cycle_counter += cycle_counts[0];\n }\n};\n// 0xde : SBC n\ninstructions[0xde] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_sbc(core.mem_read(pc));\n};\n// 0xdf : RST 18h\ninstructions[0xdf] = function()\n{\n do_reset(0x18);\n};\n// 0xe0 : RET PO\ninstructions[0xe0] = function()\n{\n do_conditional_return(!flags.P);\n};\n// 0xe1 : POP HL\ninstructions[0xe1] = function()\n{\n var result = pop_word();\n l = result & 0xff;\n h = (result & 0xff00) >>> 8;\n};\n// 0xe2 : JP PO, (nn)\ninstructions[0xe2] = function()\n{\n do_conditional_absolute_jump(!flags.P);\n};\n// 0xe3 : EX (SP), HL\ninstructions[0xe3] = function()\n{\n var temp = core.mem_read(sp);\n core.mem_write(sp, l);\n l = temp;\n temp = core.mem_read((sp + 1) & 0xffff);\n core.mem_write((sp + 1) & 0xffff, h);\n h = temp;\n};\n// 0xe4 : CALL PO, nn\ninstructions[0xe4] = function()\n{\n do_conditional_call(!flags.P);\n};\n// 0xe5 : PUSH HL\ninstructions[0xe5] = function()\n{\n push_word(l | (h << 8));\n};\n// 0xe6 : AND n\ninstructions[0xe6] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_and(core.mem_read(pc));\n};\n// 0xe7 : RST 20h\ninstructions[0xe7] = function()\n{\n do_reset(0x20);\n};\n// 0xe8 : RET PE\ninstructions[0xe8] = function()\n{\n do_conditional_return(!!flags.P);\n};\n// 0xe9 : JP (HL)\ninstructions[0xe9] = function()\n{\n pc = l | (h << 8);\n pc = (pc - 1) & 0xffff;\n};\n// 0xea : JP PE, nn\ninstructions[0xea] = function()\n{\n do_conditional_absolute_jump(!!flags.P);\n};\n// 0xeb : EX DE, HL\ninstructions[0xeb] = function()\n{\n var temp = d;\n d = h;\n h = temp;\n temp = e;\n e = l;\n l = temp;\n};\n// 0xec : CALL PE, nn\ninstructions[0xec] = function()\n{\n do_conditional_call(!!flags.P);\n};\n// 0xed : ED Prefix\ninstructions[0xed] = function()\n{\n // R is incremented at the start of the second instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n\n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc),\n func = ed_instructions[opcode];\n \n if (func)\n {\n //func = func.bind(this);\n func();\n cycle_counter += cycle_counts_ed[opcode];\n }\n else\n {\n // If the opcode didn't exist, the whole thing is a two-byte NOP.\n cycle_counter += cycle_counts[0];\n }\n};\n// 0xee : XOR n\ninstructions[0xee] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_xor(core.mem_read(pc));\n};\n// 0xef : RST 28h\ninstructions[0xef] = function()\n{\n do_reset(0x28);\n};\n// 0xf0 : RET P\ninstructions[0xf0] = function()\n{\n do_conditional_return(!flags.S);\n};\n// 0xf1 : POP AF\ninstructions[0xf1] = function()\n{\n var result = pop_word();\n set_flags_register(result & 0xff);\n a = (result & 0xff00) >>> 8;\n};\n// 0xf2 : JP P, nn\ninstructions[0xf2] = function()\n{\n do_conditional_absolute_jump(!flags.S);\n};\n// 0xf3 : DI\ninstructions[0xf3] = function()\n{\n // DI doesn't actually take effect until after the next instruction.\n do_delayed_di = true;\n};\n// 0xf4 : CALL P, nn\ninstructions[0xf4] = function()\n{\n do_conditional_call(!flags.S);\n};\n// 0xf5 : PUSH AF\ninstructions[0xf5] = function()\n{\n push_word(get_flags_register() | (a << 8));\n};\n// 0xf6 : OR n\ninstructions[0xf6] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_or(core.mem_read(pc));\n};\n// 0xf7 : RST 30h\ninstructions[0xf7] = function()\n{\n do_reset(0x30);\n};\n// 0xf8 : RET M\ninstructions[0xf8] = function()\n{\n do_conditional_return(!!flags.S);\n};\n// 0xf9 : LD SP, HL\ninstructions[0xf9] = function()\n{\n sp = l | (h << 8);\n};\n// 0xfa : JP M, nn\ninstructions[0xfa] = function()\n{\n do_conditional_absolute_jump(!!flags.S);\n};\n// 0xfb : EI\ninstructions[0xfb] = function()\n{\n // EI doesn't actually take effect until after the next instruction.\n do_delayed_ei = true;\n};\n// 0xfc : CALL M, nn\ninstructions[0xfc] = function()\n{\n do_conditional_call(!!flags.S);\n};\n// 0xfd : FD Prefix (IY instructions)\ninstructions[0xfd] = function()\n{\n // R is incremented at the start of the second instruction cycle,\n // before the instruction actually runs.\n // The high bit of R is not affected by this increment,\n // it can only be changed using the LD R, A instruction.\n r = (r & 0x80) | (((r & 0x7f) + 1) & 0x7f);\n \n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc),\n func = dd_instructions[opcode];\n \n if (func)\n {\n // Rather than copy and paste all the IX instructions into IY instructions,\n // what we'll do is sneakily copy IY into IX, run the IX instruction,\n // and then copy the result into IY and restore the old IX.\n var temp = ix;\n ix = iy;\n //func = func.bind(this);\n func();\n iy = ix;\n ix = temp;\n \n cycle_counter += cycle_counts_dd[opcode];\n }\n else\n {\n // Apparently if an FD opcode doesn't exist,\n // it gets treated as an unprefixed opcode.\n // What we'll do to handle that is just back up the \n // program counter, so that this byte gets decoded\n // as a normal instruction.\n pc = (pc - 1) & 0xffff;\n // And we'll add in the cycle count for a NOP.\n cycle_counter += cycle_counts[0];\n }\n};\n// 0xfe : CP n\ninstructions[0xfe] = function()\n{\n pc = (pc + 1) & 0xffff;\n do_cp(core.mem_read(pc));\n};\n// 0xff : RST 38h\ninstructions[0xff] = function()\n{\n do_reset(0x38);\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n/// This table of ED opcodes is pretty sparse;\n/// there are not very many valid ED-prefixed opcodes in the Z80,\n/// and many of the ones that are valid are not documented.\n///////////////////////////////////////////////////////////////////////////////\nlet ed_instructions = [];\n// 0x40 : IN B, (C)\ned_instructions[0x40] = function()\n{\n b = do_in((b << 8) | c);\n};\n// 0x41 : OUT (C), B\ned_instructions[0x41] = function()\n{\n core.io_write((b << 8) | c, b);\n};\n// 0x42 : SBC HL, BC\ned_instructions[0x42] = function()\n{\n do_hl_sbc(c | (b << 8));\n};\n// 0x43 : LD (nn), BC\ned_instructions[0x43] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, c);\n core.mem_write((address + 1) & 0xffff, b);\n};\n// 0x44 : NEG\ned_instructions[0x44] = function()\n{\n do_neg();\n};\n// 0x45 : RETN\ned_instructions[0x45] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x46 : IM 0\ned_instructions[0x46] = function()\n{\n imode = 0;\n};\n// 0x47 : LD I, A\ned_instructions[0x47] = function()\n{\n i = a\n};\n// 0x48 : IN C, (C)\ned_instructions[0x48] = function()\n{\n c = do_in((b << 8) | c);\n};\n// 0x49 : OUT (C), C\ned_instructions[0x49] = function()\n{\n core.io_write((b << 8) | c, c);\n};\n// 0x4a : ADC HL, BC\ned_instructions[0x4a] = function()\n{\n do_hl_adc(c | (b << 8));\n};\n// 0x4b : LD BC, (nn)\ned_instructions[0x4b] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n c = core.mem_read(address);\n b = core.mem_read((address + 1) & 0xffff);\n};\n// 0x4c : NEG (Undocumented)\ned_instructions[0x4c] = function()\n{\n do_neg();\n};\n// 0x4d : RETI\ned_instructions[0x4d] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n};\n// 0x4e : IM 0 (Undocumented)\ned_instructions[0x4e] = function()\n{\n imode = 0;\n};\n// 0x4f : LD R, A\ned_instructions[0x4f] = function()\n{\n r = a;\n};\n// 0x50 : IN D, (C)\ned_instructions[0x50] = function()\n{\n d = do_in((b << 8) | c);\n};\n// 0x51 : OUT (C), D\ned_instructions[0x51] = function()\n{\n core.io_write((b << 8) | c, d);\n};\n// 0x52 : SBC HL, DE\ned_instructions[0x52] = function()\n{\n do_hl_sbc(e | (d << 8));\n};\n// 0x53 : LD (nn), DE\ned_instructions[0x53] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, e);\n core.mem_write((address + 1) & 0xffff, d);\n};\n// 0x54 : NEG (Undocumented)\ned_instructions[0x54] = function()\n{\n do_neg();\n};\n// 0x55 : RETN\ned_instructions[0x55] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x56 : IM 1\ned_instructions[0x56] = function()\n{\n imode = 1;\n};\n// 0x57 : LD A, I\ned_instructions[0x57] = function()\n{\n a = i;\n flags.S = a & 0x80 ? 1 : 0;\n flags.Z = a ? 0 : 1;\n flags.H = 0;\n flags.P = iff2;\n flags.N = 0;\n update_xy_flags(a);\n};\n// 0x58 : IN E, (C)\ned_instructions[0x58] = function()\n{\n e = do_in((b << 8) | c);\n};\n// 0x59 : OUT (C), E\ned_instructions[0x59] = function()\n{\n core.io_write((b << 8) | c, e);\n};\n// 0x5a : ADC HL, DE\ned_instructions[0x5a] = function()\n{\n do_hl_adc(e | (d << 8));\n};\n// 0x5b : LD DE, (nn)\ned_instructions[0x5b] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n e = core.mem_read(address);\n d = core.mem_read((address + 1) & 0xffff);\n};\n// 0x5c : NEG (Undocumented)\ned_instructions[0x5c] = function()\n{\n do_neg();\n};\n// 0x5d : RETN\ned_instructions[0x5d] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x5e : IM 2\ned_instructions[0x5e] = function()\n{\n imode = 2;\n};\n// 0x5f : LD A, R\ned_instructions[0x5f] = function()\n{\n a = r;\n flags.S = a & 0x80 ? 1 : 0;\n flags.Z = a ? 0 : 1;\n flags.H = 0;\n flags.P = iff2;\n flags.N = 0;\n update_xy_flags(a);\n};\n// 0x60 : IN H, (C)\ned_instructions[0x60] = function()\n{\n h = do_in((b << 8) | c);\n};\n// 0x61 : OUT (C), H\ned_instructions[0x61] = function()\n{\n core.io_write((b << 8) | c, h);\n};\n// 0x62 : SBC HL, HL\ned_instructions[0x62] = function()\n{\n do_hl_sbc(l | (h << 8));\n};\n// 0x63 : LD (nn), HL (Undocumented)\ned_instructions[0x63] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, l);\n core.mem_write((address + 1) & 0xffff, h);\n};\n// 0x64 : NEG (Undocumented)\ned_instructions[0x64] = function()\n{\n do_neg();\n};\n// 0x65 : RETN\ned_instructions[0x65] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x66 : IM 0\ned_instructions[0x66] = function()\n{\n imode = 0;\n};\n// 0x67 : RRD\ned_instructions[0x67] = function()\n{\n var hl_value = core.mem_read(l | (h << 8));\n var temp1 = hl_value & 0x0f, temp2 = a & 0x0f;\n hl_value = ((hl_value & 0xf0) >>> 4) | (temp2 << 4);\n a = (a & 0xf0) | temp1;\n core.mem_write(l | (h << 8), hl_value);\n \n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = a ? 0 : 1;\n flags.H = 0;\n flags.P = get_parity(a) ? 1 : 0;\n flags.N = 0;\n update_xy_flags(a);\n};\n// 0x68 : IN L, (C)\ned_instructions[0x68] = function()\n{\n l = do_in((b << 8) | c);\n};\n// 0x69 : OUT (C), L\ned_instructions[0x69] = function()\n{\n core.io_write((b << 8) | c, l);\n};\n// 0x6a : ADC HL, HL\ned_instructions[0x6a] = function()\n{\n do_hl_adc(l | (h << 8));\n};\n// 0x6b : LD HL, (nn) (Undocumented)\ned_instructions[0x6b] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n l = core.mem_read(address);\n h = core.mem_read((address + 1) & 0xffff);\n};\n// 0x6c : NEG (Undocumented)\ned_instructions[0x6c] = function()\n{\n do_neg();\n};\n// 0x6d : RETN\ned_instructions[0x6d] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x6e : IM 0 (Undocumented)\ned_instructions[0x6e] = function()\n{\n imode = 0;\n};\n// 0x6f : RLD\ned_instructions[0x6f] = function()\n{\n var hl_value = core.mem_read(l | (h << 8));\n var temp1 = hl_value & 0xf0, temp2 = a & 0x0f;\n hl_value = ((hl_value & 0x0f) << 4) | temp2;\n a = (a & 0xf0) | (temp1 >>> 4);\n core.mem_write(l | (h << 8), hl_value);\n \n flags.S = (a & 0x80) ? 1 : 0;\n flags.Z = a ? 0 : 1;\n flags.H = 0;\n flags.P = get_parity(a) ? 1 : 0;\n flags.N = 0;\n update_xy_flags(a);\n};\n// 0x70 : IN (C) (Undocumented)\ned_instructions[0x70] = function()\n{\n do_in((b << 8) | c);\n};\n// 0x71 : OUT (C), 0 (Undocumented)\ned_instructions[0x71] = function()\n{\n core.io_write((b << 8) | c, 0);\n};\n// 0x72 : SBC HL, SP\ned_instructions[0x72] = function()\n{\n do_hl_sbc(sp);\n};\n// 0x73 : LD (nn), SP\ned_instructions[0x73] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n core.mem_write(address, sp & 0xff);\n core.mem_write((address + 1) & 0xffff, (sp >>> 8) & 0xff);\n};\n// 0x74 : NEG (Undocumented)\ned_instructions[0x74] = function()\n{\n do_neg();\n};\n// 0x75 : RETN\ned_instructions[0x75] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x76 : IM 1\ned_instructions[0x76] = function()\n{\n imode = 1;\n};\n// 0x78 : IN A, (C)\ned_instructions[0x78] = function()\n{\n a = do_in((b << 8) | c);\n};\n// 0x79 : OUT (C), A\ned_instructions[0x79] = function()\n{\n core.io_write((b << 8) | c, a);\n};\n// 0x7a : ADC HL, SP\ned_instructions[0x7a] = function()\n{\n do_hl_adc(sp);\n};\n// 0x7b : LD SP, (nn)\ned_instructions[0x7b] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= core.mem_read(pc) << 8;\n \n sp = core.mem_read(address);\n sp |= core.mem_read((address + 1) & 0xffff) << 8;\n};\n// 0x7c : NEG (Undocumented)\ned_instructions[0x7c] = function()\n{\n do_neg();\n};\n// 0x7d : RETN\ned_instructions[0x7d] = function()\n{\n pc = (pop_word() - 1) & 0xffff;\n iff1 = iff2;\n};\n// 0x7e : IM 2\ned_instructions[0x7e] = function()\n{\n imode = 2;\n};\n// 0xa0 : LDI\ned_instructions[0xa0] = function()\n{\n do_ldi();\n};\n// 0xa1 : CPI\ned_instructions[0xa1] = function()\n{\n do_cpi();\n};\n// 0xa2 : INI\ned_instructions[0xa2] = function()\n{\n do_ini();\n};\n// 0xa3 : OUTI\ned_instructions[0xa3] = function()\n{\n do_outi();\n};\n// 0xa8 : LDD\ned_instructions[0xa8] = function()\n{\n do_ldd();\n};\n// 0xa9 : CPD\ned_instructions[0xa9] = function()\n{\n do_cpd();\n};\n// 0xaa : IND\ned_instructions[0xaa] = function()\n{\n do_ind();\n};\n// 0xab : OUTD\ned_instructions[0xab] = function()\n{\n do_outd();\n};\n// 0xb0 : LDIR\ned_instructions[0xb0] = function()\n{\n do_ldi();\n if (b || c)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb1 : CPIR\ned_instructions[0xb1] = function()\n{\n do_cpi();\n if (!flags.Z && (b || c))\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb2 : INIR\ned_instructions[0xb2] = function()\n{\n do_ini();\n if (b)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb3 : OTIR\ned_instructions[0xb3] = function()\n{\n do_outi();\n if (b)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb8 : LDDR\ned_instructions[0xb8] = function()\n{\n do_ldd();\n if (b || c)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xb9 : CPDR\ned_instructions[0xb9] = function()\n{\n do_cpd();\n if (!flags.Z && (b || c))\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xba : INDR\ned_instructions[0xba] = function()\n{\n do_ind();\n if (b)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n// 0xbb : OTDR\ned_instructions[0xbb] = function()\n{\n do_outd();\n if (b)\n {\n cycle_counter += 5;\n pc = (pc - 2) & 0xffff;\n }\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n/// Like ED, this table is quite sparse,\n/// and many of the opcodes here are also undocumented.\n/// The undocumented instructions here are those that deal with only one byte\n/// of the two-byte IX register; the bytes are designed IXH and IXL here.\n///////////////////////////////////////////////////////////////////////////////\nlet dd_instructions = [];\n// 0x09 : ADD IX, BC\ndd_instructions[0x09] = function()\n{\n do_ix_add(c | (b << 8));\n};\n// 0x19 : ADD IX, DE\ndd_instructions[0x19] = function()\n{\n do_ix_add(e | (d << 8));\n};\n// 0x21 : LD IX, nn\ndd_instructions[0x21] = function()\n{\n pc = (pc + 1) & 0xffff;\n ix = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n ix |= (core.mem_read(pc) << 8);\n};\n// 0x22 : LD (nn), IX\ndd_instructions[0x22] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= (core.mem_read(pc) << 8);\n \n core.mem_write(address, ix & 0xff);\n core.mem_write((address + 1) & 0xffff, (ix >>> 8) & 0xff);\n};\n// 0x23 : INC IX\ndd_instructions[0x23] = function()\n{\n ix = (ix + 1) & 0xffff;\n};\n// 0x24 : INC IXH (Undocumented)\ndd_instructions[0x24] = function()\n{\n ix = (do_inc(ix >>> 8) << 8) | (ix & 0xff);\n};\n// 0x25 : DEC IXH (Undocumented)\ndd_instructions[0x25] = function()\n{\n ix = (do_dec(ix >>> 8) << 8) | (ix & 0xff);\n};\n// 0x26 : LD IXH, n (Undocumented)\ndd_instructions[0x26] = function()\n{\n pc = (pc + 1) & 0xffff;\n ix = (core.mem_read(pc) << 8) | (ix & 0xff);\n};\n// 0x29 : ADD IX, IX\ndd_instructions[0x29] = function()\n{\n do_ix_add(ix);\n};\n// 0x2a : LD IX, (nn)\ndd_instructions[0x2a] = function()\n{\n pc = (pc + 1) & 0xffff;\n var address = core.mem_read(pc);\n pc = (pc + 1) & 0xffff;\n address |= (core.mem_read(pc) << 8);\n \n ix = core.mem_read(address);\n ix |= (core.mem_read((address + 1) & 0xffff) << 8);\n};\n// 0x2b : DEC IX\ndd_instructions[0x2b] = function()\n{\n ix = (ix - 1) & 0xffff;\n};\n// 0x2c : INC IXL (Undocumented)\ndd_instructions[0x2c] = function()\n{\n ix = do_inc(ix & 0xff) | (ix & 0xff00);\n};\n// 0x2d : DEC IXL (Undocumented)\ndd_instructions[0x2d] = function()\n{\n ix = do_dec(ix & 0xff) | (ix & 0xff00);\n};\n// 0x2e : LD IXL, n (Undocumented)\ndd_instructions[0x2e] = function()\n{\n pc = (pc + 1) & 0xffff;\n ix = (core.mem_read(pc) & 0xff) | (ix & 0xff00);\n};\n// 0x34 : INC (IX+n)\ndd_instructions[0x34] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc)),\n value = core.mem_read((offset + ix) & 0xffff);\n core.mem_write((offset + ix) & 0xffff, do_inc(value));\n};\n// 0x35 : DEC (IX+n)\ndd_instructions[0x35] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc)),\n value = core.mem_read((offset + ix) & 0xffff);\n core.mem_write((offset + ix) & 0xffff, do_dec(value));\n};\n// 0x36 : LD (IX+n), n\ndd_instructions[0x36] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n pc = (pc + 1) & 0xffff;\n core.mem_write((ix + offset) & 0xffff, core.mem_read(pc)); \n};\n// 0x39 : ADD IX, SP\ndd_instructions[0x39] = function()\n{\n do_ix_add(sp);\n};\n// 0x44 : LD B, IXH (Undocumented)\ndd_instructions[0x44] = function()\n{\n b = (ix >>> 8) & 0xff;\n};\n// 0x45 : LD B, IXL (Undocumented)\ndd_instructions[0x45] = function()\n{\n b = ix & 0xff;\n};\n// 0x46 : LD B, (IX+n)\ndd_instructions[0x46] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n b = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x4c : LD C, IXH (Undocumented)\ndd_instructions[0x4c] = function()\n{\n c = (ix >>> 8) & 0xff;\n};\n// 0x4d : LD C, IXL (Undocumented)\ndd_instructions[0x4d] = function()\n{\n c = ix & 0xff;\n};\n// 0x4e : LD C, (IX+n)\ndd_instructions[0x4e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n c = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x54 : LD D, IXH (Undocumented)\ndd_instructions[0x54] = function()\n{\n d = (ix >>> 8) & 0xff;\n};\n// 0x55 : LD D, IXL (Undocumented)\ndd_instructions[0x55] = function()\n{\n d = ix & 0xff;\n};\n// 0x56 : LD D, (IX+n)\ndd_instructions[0x56] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n d = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x5c : LD E, IXH (Undocumented)\ndd_instructions[0x5c] = function()\n{\n e = (ix >>> 8) & 0xff;\n};\n// 0x5d : LD E, IXL (Undocumented)\ndd_instructions[0x5d] = function()\n{\n e = ix & 0xff;\n};\n// 0x5e : LD E, (IX+n)\ndd_instructions[0x5e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n e = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x60 : LD IXH, B (Undocumented)\ndd_instructions[0x60] = function()\n{\n ix = (ix & 0xff) | (b << 8);\n};\n// 0x61 : LD IXH, C (Undocumented)\ndd_instructions[0x61] = function()\n{\n ix = (ix & 0xff) | (c << 8);\n};\n// 0x62 : LD IXH, D (Undocumented)\ndd_instructions[0x62] = function()\n{\n ix = (ix & 0xff) | (d << 8);\n};\n// 0x63 : LD IXH, E (Undocumented)\ndd_instructions[0x63] = function()\n{\n ix = (ix & 0xff) | (e << 8);\n};\n// 0x64 : LD IXH, IXH (Undocumented)\ndd_instructions[0x64] = function()\n{\n // No-op.\n};\n// 0x65 : LD IXH, IXL (Undocumented)\ndd_instructions[0x65] = function()\n{\n ix = (ix & 0xff) | ((ix & 0xff) << 8);\n};\n// 0x66 : LD H, (IX+n)\ndd_instructions[0x66] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n h = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x67 : LD IXH, A (Undocumented)\ndd_instructions[0x67] = function()\n{\n ix = (ix & 0xff) | (a << 8);\n};\n// 0x68 : LD IXL, B (Undocumented)\ndd_instructions[0x68] = function()\n{\n ix = (ix & 0xff00) | b;\n};\n// 0x69 : LD IXL, C (Undocumented)\ndd_instructions[0x69] = function()\n{\n ix = (ix & 0xff00) | c;\n};\n// 0x6a : LD IXL, D (Undocumented)\ndd_instructions[0x6a] = function()\n{\n ix = (ix & 0xff00) | d;\n};\n// 0x6b : LD IXL, E (Undocumented)\ndd_instructions[0x6b] = function()\n{\n ix = (ix & 0xff00) | e;\n};\n// 0x6c : LD IXL, IXH (Undocumented)\ndd_instructions[0x6c] = function()\n{\n ix = (ix & 0xff00) | (ix >>> 8);\n};\n// 0x6d : LD IXL, IXL (Undocumented)\ndd_instructions[0x6d] = function()\n{\n // No-op.\n};\n// 0x6e : LD L, (IX+n)\ndd_instructions[0x6e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n l = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x6f : LD IXL, A (Undocumented)\ndd_instructions[0x6f] = function()\n{\n ix = (ix & 0xff00) | a;\n};\n// 0x70 : LD (IX+n), B\ndd_instructions[0x70] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, b);\n};\n// 0x71 : LD (IX+n), C\ndd_instructions[0x71] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, c);\n};\n// 0x72 : LD (IX+n), D\ndd_instructions[0x72] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, d);\n};\n// 0x73 : LD (IX+n), E\ndd_instructions[0x73] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, e);\n};\n// 0x74 : LD (IX+n), H\ndd_instructions[0x74] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, h);\n};\n// 0x75 : LD (IX+n), L\ndd_instructions[0x75] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, l);\n};\n// 0x77 : LD (IX+n), A\ndd_instructions[0x77] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n core.mem_write((ix + offset) & 0xffff, a);\n};\n// 0x7c : LD A, IXH (Undocumented)\ndd_instructions[0x7c] = function()\n{\n a = (ix >>> 8) & 0xff;\n};\n// 0x7d : LD A, IXL (Undocumented)\ndd_instructions[0x7d] = function()\n{\n a = ix & 0xff;\n};\n// 0x7e : LD A, (IX+n)\ndd_instructions[0x7e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n a = core.mem_read((ix + offset) & 0xffff);\n};\n// 0x84 : ADD A, IXH (Undocumented)\ndd_instructions[0x84] = function()\n{\n do_add((ix >>> 8) & 0xff);\n};\n// 0x85 : ADD A, IXL (Undocumented)\ndd_instructions[0x85] = function()\n{\n do_add(ix & 0xff);\n};\n// 0x86 : ADD A, (IX+n)\ndd_instructions[0x86] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_add(core.mem_read((ix + offset) & 0xffff));\n};\n// 0x8c : ADC A, IXH (Undocumented)\ndd_instructions[0x8c] = function()\n{\n do_adc((ix >>> 8) & 0xff);\n};\n// 0x8d : ADC A, IXL (Undocumented)\ndd_instructions[0x8d] = function()\n{\n do_adc(ix & 0xff);\n};\n// 0x8e : ADC A, (IX+n)\ndd_instructions[0x8e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_adc(core.mem_read((ix + offset) & 0xffff));\n};\n// 0x94 : SUB IXH (Undocumented)\ndd_instructions[0x94] = function()\n{\n do_sub((ix >>> 8) & 0xff);\n};\n// 0x95 : SUB IXL (Undocumented)\ndd_instructions[0x95] = function()\n{\n do_sub(ix & 0xff);\n};\n// 0x96 : SUB A, (IX+n)\ndd_instructions[0x96] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_sub(core.mem_read((ix + offset) & 0xffff));\n};\n// 0x9c : SBC IXH (Undocumented)\ndd_instructions[0x9c] = function()\n{\n do_sbc((ix >>> 8) & 0xff);\n};\n// 0x9d : SBC IXL (Undocumented)\ndd_instructions[0x9d] = function()\n{\n do_sbc(ix & 0xff);\n};\n// 0x9e : SBC A, (IX+n)\ndd_instructions[0x9e] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_sbc(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xa4 : AND IXH (Undocumented)\ndd_instructions[0xa4] = function()\n{\n do_and((ix >>> 8) & 0xff);\n};\n// 0xa5 : AND IXL (Undocumented)\ndd_instructions[0xa5] = function()\n{\n do_and(ix & 0xff);\n};\n// 0xa6 : AND A, (IX+n)\ndd_instructions[0xa6] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_and(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xac : XOR IXH (Undocumented)\ndd_instructions[0xac] = function()\n{\n do_xor((ix >>> 8) & 0xff);\n};\n// 0xad : XOR IXL (Undocumented)\ndd_instructions[0xad] = function()\n{\n do_xor(ix & 0xff);\n};\n// 0xae : XOR A, (IX+n)\ndd_instructions[0xae] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_xor(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xb4 : OR IXH (Undocumented)\ndd_instructions[0xb4] = function()\n{\n do_or((ix >>> 8) & 0xff);\n};\n// 0xb5 : OR IXL (Undocumented)\ndd_instructions[0xb5] = function()\n{\n do_or(ix & 0xff);\n};\n// 0xb6 : OR A, (IX+n)\ndd_instructions[0xb6] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_or(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xbc : CP IXH (Undocumented)\ndd_instructions[0xbc] = function()\n{\n do_cp((ix >>> 8) & 0xff);\n};\n// 0xbd : CP IXL (Undocumented)\ndd_instructions[0xbd] = function()\n{\n do_cp(ix & 0xff);\n};\n// 0xbe : CP A, (IX+n)\ndd_instructions[0xbe] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n do_cp(core.mem_read((ix + offset) & 0xffff));\n};\n// 0xcb : CB Prefix (IX bit instructions)\ndd_instructions[0xcb] = function()\n{\n pc = (pc + 1) & 0xffff;\n var offset = get_signed_offset_byte(core.mem_read(pc));\n pc = (pc + 1) & 0xffff;\n var opcode = core.mem_read(pc), value;\n \n // As with the \"normal\" CB prefix, we implement the DDCB prefix\n // by decoding the opcode directly, rather than using a table.\n if (opcode < 0x40)\n {\n // Shift and rotate instructions.\n var ddcb_functions = [do_rlc, do_rrc, do_rl, do_rr,\n do_sla, do_sra, do_sll, do_srl];\n \n // Most of the opcodes in this range are not valid,\n // so we map this opcode onto one of the ones that is.\n var func = ddcb_functions[(opcode & 0x38) >>> 3],\n value = func( core.mem_read((ix + offset) & 0xffff));\n \n core.mem_write((ix + offset) & 0xffff, value);\n }\n else\n {\n var bit_number = (opcode & 0x38) >>> 3;\n \n if (opcode < 0x80)\n {\n // BIT\n flags.N = 0;\n flags.H = 1;\n flags.Z = !(core.mem_read((ix + offset) & 0xffff) & (1 << bit_number)) ? 1 : 0;\n flags.P = flags.Z;\n flags.S = ((bit_number === 7) && !flags.Z) ? 1 : 0;\n }\n else if (opcode < 0xc0)\n {\n // RES\n value = core.mem_read((ix + offset) & 0xffff) & ~(1 << bit_number) & 0xff;\n core.mem_write((ix + offset) & 0xffff, value);\n }\n else\n {\n // SET\n value = core.mem_read((ix + offset) & 0xffff) | (1 << bit_number);\n core.mem_write((ix + offset) & 0xffff, value);\n }\n }\n \n // This implements the undocumented shift, RES, and SET opcodes,\n // which write their result to memory and also to an 8080 register.\n if (value !== undefined)\n {\n if ((opcode & 0x07) === 0)\n b = value;\n else if ((opcode & 0x07) === 1)\n c = value;\n else if ((opcode & 0x07) === 2)\n d = value;\n else if ((opcode & 0x07) === 3)\n e = value;\n else if ((opcode & 0x07) === 4)\n h = value;\n else if ((opcode & 0x07) === 5)\n l = value;\n // 6 is the documented opcode, which doesn't set a register.\n else if ((opcode & 0x07) === 7)\n a = value;\n }\n \n cycle_counter += cycle_counts_cb[opcode] + 8;\n};\n// 0xe1 : POP IX\ndd_instructions[0xe1] = function()\n{\n ix = pop_word();\n};\n// 0xe3 : EX (SP), IX\ndd_instructions[0xe3] = function()\n{\n var temp = ix;\n ix = core.mem_read(sp);\n ix |= core.mem_read((sp + 1) & 0xffff) << 8;\n core.mem_write(sp, temp & 0xff);\n core.mem_write((sp + 1) & 0xffff, (temp >>> 8) & 0xff);\n};\n// 0xe5 : PUSH IX\ndd_instructions[0xe5] = function()\n{\n push_word(ix);\n};\n// 0xe9 : JP (IX)\ndd_instructions[0xe9] = function()\n{\n pc = (ix - 1) & 0xffff;\n};\n// 0xf9 : LD SP, IX\ndd_instructions[0xf9] = function()\n{\n sp = ix;\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n/// These tables contain the number of T cycles used for each instruction.\n/// In a few special cases, such as conditional control flow instructions,\n/// additional cycles might be added to these values.\n/// The total number of cycles is the return value of run_instruction().\n///////////////////////////////////////////////////////////////////////////////\nlet cycle_counts = [\n 4, 10, 7, 6, 4, 4, 7, 4, 4, 11, 7, 6, 4, 4, 7, 4,\n 8, 10, 7, 6, 4, 4, 7, 4, 12, 11, 7, 6, 4, 4, 7, 4,\n 7, 10, 16, 6, 4, 4, 7, 4, 7, 11, 16, 6, 4, 4, 7, 4,\n 7, 10, 13, 6, 11, 11, 10, 4, 7, 11, 13, 6, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,\n 5, 10, 10, 10, 10, 11, 7, 11, 5, 10, 10, 0, 10, 17, 7, 11,\n 5, 10, 10, 11, 10, 11, 7, 11, 5, 4, 10, 11, 10, 0, 7, 11,\n 5, 10, 10, 19, 10, 11, 7, 11, 5, 4, 10, 4, 10, 0, 7, 11,\n 5, 10, 10, 4, 10, 11, 7, 11, 5, 6, 10, 4, 10, 0, 7, 11\n];\n\nlet cycle_counts_ed = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 12, 12, 15, 20, 8, 14, 8, 9, 12, 12, 15, 20, 8, 14, 8, 9,\n 12, 12, 15, 20, 8, 14, 8, 9, 12, 12, 15, 20, 8, 14, 8, 9,\n 12, 12, 15, 20, 8, 14, 8, 18, 12, 12, 15, 20, 8, 14, 8, 18,\n 12, 12, 15, 20, 8, 14, 8, 0, 12, 12, 15, 20, 8, 14, 8, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 16, 16, 16, 16, 0, 0, 0, 0, 16, 16, 16, 16, 0, 0, 0, 0,\n 16, 16, 16, 16, 0, 0, 0, 0, 16, 16, 16, 16, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n];\n\nlet cycle_counts_cb = [\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 8, 8, 12, 8,\n 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 8, 8, 12, 8,\n 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 8, 8, 12, 8,\n 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 8, 8, 12, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8,\n 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 15, 8\n];\n\nlet cycle_counts_dd = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0,\n 0, 14, 20, 10, 8, 8, 11, 0, 0, 15, 20, 10, 8, 8, 11, 0,\n 0, 0, 0, 0, 23, 23, 19, 0, 0, 15, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 8, 8, 8, 8, 8, 8, 19, 8, 8, 8, 8, 8, 8, 8, 19, 8,\n 19, 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 8, 8, 19, 0, 0, 0, 0, 0, 8, 8, 19, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 14, 0, 23, 0, 15, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0\n];\n\n // There's tons of stuff in this object,\n // but only these three functions are the public API.\n this.saveState = getState;\n this.loadState = setState;\n this.reset = reset;\n this.advanceInsn = run_instruction;\n this.interrupt = interrupt;\n this.getPC = ():number => { return pc; }\n this.getSP = ():number => { return sp; }\n this.getHalted = ():boolean => { return halted; }\n}\n\nexport interface Z80State {\nAF : number;\nBC : number;\nDE : number;\nHL : number;\nAF_ : number;\nBC_ : number;\nDE_ : number;\nHL_ : number;\nIX : number;\nIY : number;\nSP : number;\nPC : number;\nIR : number;\niff1 : number;\niff2 : number;\nim : number;\nhalted : boolean;\ndo_delayed_di : boolean;\ndo_delayed_ei : boolean;\ncycle_counter : number;\n}\n\nexport class Z80 implements CPU, InstructionBased, IOBusConnected, SavesState, Interruptable {\n\n cpu;\n interruptType;\n memBus : Bus;\n ioBus : Bus;\n retryInterrupts : boolean = false;\n retryData : number = -1;\n \n private buildCPU() {\n if (this.memBus && this.ioBus) {\n this.cpu = new FastZ80({\n mem_read: this.memBus.read.bind(this.memBus),\n mem_write: this.memBus.write.bind(this.memBus),\n io_read: this.ioBus.read.bind(this.ioBus),\n io_write: this.ioBus.write.bind(this.ioBus),\n });\n }\n }\n connectMemoryBus(bus:Bus) {\n this.memBus = bus;\n this.buildCPU();\n }\n connectIOBus(bus:Bus) {\n this.ioBus = bus;\n this.buildCPU();\n }\n advanceInsn() {\n if (this.retryInterrupts && this.retryData >= 0 && this.cpu.interrupt(false, this.retryData)) {\n this.retryData = -1;\n }\n return this.cpu.advanceInsn();\n }\n reset() {\n this.cpu.reset();\n }\n interrupt(data:number) {\n if (!this.cpu.interrupt(false, data) && this.retryInterrupts) {\n this.retryData = data;\n }\n }\n NMI() {\n this.cpu.interrupt(true, 0);\n }\n getSP() {\n return this.cpu.getSP();\n }\n getPC() {\n return this.cpu.getPC();\n }\n isHalted() {\n return this.cpu.getHalted();\n }\n saveState() {\n return this.cpu.saveState();\n }\n loadState(s) {\n this.cpu.loadState(s);\n }\n isStable() { return true; }\n // TODO: metadata\n // TODO: disassembler\n}\n", "\nimport { SampledAudioSink } from \"./devices\";\n\n// from TSS\ndeclare var MasterChannel, AudioLooper, PsgDeviceChannel;\n\nexport class MasterAudio {\n master = new MasterChannel();\n looper;\n start() {\n if (!this.looper) {\n this.looper = new AudioLooper(512);\n this.looper.setChannel(this.master);\n this.looper.activate();\n }\n }\n stop() {\n if (this.looper) {\n this.looper.setChannel(null);\n this.looper = null;\n }\n }\n}\n\nexport class AY38910_Audio {\n master : MasterAudio;\n psg = new PsgDeviceChannel();\n curreg = 0;\n\n constructor(master : MasterAudio) {\n this.master = master;\n this.psg.setMode(PsgDeviceChannel.MODE_SIGNED);\n this.psg.setDevice(PsgDeviceChannel.DEVICE_AY_3_8910);\n master.master.addChannel(this.psg);\n }\n\n reset() {\n for (var i=15; i>=0; i--) {\n this.selectRegister(i);\n this.setData(0);\n }\n }\n selectRegister(val : number) {\n this.curreg = val & 0xf;\n }\n setData(val : number) {\n this.psg.writeRegisterAY(this.curreg, val & 0xff);\n }\n readData() {\n return this.psg.readRegister(this.curreg);\n }\n currentRegister() { return this.curreg; }\n}\n\nexport class SN76489_Audio {\n master : MasterAudio;\n psg = new PsgDeviceChannel();\n\n constructor(master : MasterAudio) {\n this.master = master;\n this.psg.setMode(PsgDeviceChannel.MODE_SIGNED);\n this.psg.setDevice(PsgDeviceChannel.DEVICE_SN76489);\n master.master.addChannel(this.psg);\n }\n reset() {\n // TODO\n }\n setData(val : number) {\n this.psg.writeRegisterSN(0, val & 0xff);\n }\n}\n\n// https://en.wikipedia.org/wiki/POKEY\n// https://user.xmission.com/~trevin/atari/pokey_regs.html\n// http://krap.pl/mirrorz/atari/homepage.ntlworld.com/kryten_droid/Atari/800XL/atari_hw/pokey.htm\n\nexport function newPOKEYAudio(count:number) {\n var audio = new MasterAudio();\n for (var i=1; i<=count; i++) {\n var pokey = new POKEYDeviceChannel();\n audio['pokey'+i] = pokey; // TODO: cheezy\n audio.master.addChannel(pokey);\n }\n return audio;\n}\n\nfunction combinePolys(a, b) {\n var arr = new Uint8Array(a.length * b.length);\n var n = 0;\n for (var i=0; i 0.5 ? 1 : 0;\n }\n var bit17_5 = combinePolys(bit17, bit5);\n var bit5_4 = combinePolys(bit5, bit4);\n var wavetones = [\n bit17_5, bit5, bit5_4, bit5,\n bit17, bit2, bit4, bit2\n ];\n // TIA\n var div2 = divideBy(2);\n var div6 = divideBy(6);\n var div31 = divideBy(31);\n var div93 = divideBy(93);\n var bit15_4 = combinePolys(bit15, bit4);\n var bit5_2 = combinePolys(bit5, div2);\n var bit5_6 = combinePolys(bit5, div6);\n var tiawavetones = [\n bit1, bit4, bit15_4, bit5_4,\n div2, div2, div31, bit5_2,\n bit9, bit5, div31, bit1,\n div6, div6, div93, bit5_6\n ];\n \n // registers\n var regs = new Uint8Array(16);\n var counters = new Float32Array(4);\n var deltas = new Float32Array(4);\n var volume = new Float32Array(4);\n var audc = new Uint8Array(4);\n var waveforms = [bit1, bit1, bit1, bit1];\n var buffer;\n var sampleRate;\n var clock, baseDelta;\n var dirty = true;\n\n //\n\n this.setBufferLength = function (length) {\n buffer = new Int32Array(length);\n };\n\n this.getBuffer = function () {\n return buffer;\n };\n\n this.setSampleRate = function (rate) {\n sampleRate = rate;\n baseDelta = FREQ_17_EXACT / rate;\n };\n\n function updateValues(addr) {\n var ctrl = regs[8];\n var base = (ctrl & CLOCK_15) ? DIV_15 : DIV_64;\n var div;\n var i = addr & 4;\n var j = i>>1;\n var k = i>>2;\n if (ctrl & (CH1_CH2>>k)) {\n if (ctrl & (CH1_179>>k))\n div = regs[i+2] * 256 + regs[i+0] + 7;\n else\n div = (regs[i+2] * 256 + regs[i+0] + 1) * base;\n deltas[j+1] = baseDelta / div;\n deltas[j+0] = 0;\n } else {\n if (ctrl & (CH1_179>>k)) {\n div = regs[i+0] + 4;\n } else {\n div = (regs[i+0] + 1) * base;\n }\n deltas[j+0] = baseDelta / div;\n div = (regs[i+2] + 1) * base;\n deltas[j+1] = baseDelta / div;\n }\n //console.log(addr, ctrl.toString(16), div, deltas[j+0], deltas[j+1]);\n }\n\n this.setRegister = function(addr, value) {\n addr &= 0xf;\n value &= 0xff;\n if (regs[addr] != value) {\n regs[addr] = value;\n switch (addr) {\n case 0:\n case 2:\n case 4:\n case 6: // AUDF\n case 8: // ctrl\n dirty = true;\n break;\n case 1:\n case 3:\n case 5:\n case 7: // AUDC\n volume[addr>>1] = value & 0xf;\n waveforms[addr>>1] = wavetones[value>>5];\n break;\n }\n }\n }\n\n this.getRegister = function(addr) {\n addr &= 0xf;\n return regs[addr];\n }\n \n this.setTIARegister = function(addr, value) {\n switch (addr) {\n case 0x17:\n case 0x18:\n regs[(addr&1)*4] = value & 0x1f;\n dirty = true;\n break;\n case 0x15:\n case 0x16:\n waveforms[(addr&1)*2] = tiawavetones[value & 0xf];\n break;\n case 0x19:\n case 0x1a:\n volume[(addr&1)*2] = value & 0xf;\n break;\n }\n }\n\n this.generate = function (length) {\n if (dirty) {\n updateValues(0);\n updateValues(4);\n dirty = false;\n }\n for (var s=0; s 0 && d < 1 && v > 0) {\n var wav = waveforms[i];\n var cnt = counters[i] += d;\n if (cnt > wav.length) {\n cnt = counters[i] = cnt - Math.floor(cnt / wav.length) * wav.length;\n }\n var on = wav[Math.floor(cnt)];\n if (on) {\n sample += v;\n }\n }\n }\n sample *= 64;\n buffer[s] = sample;\n buffer[s+1] = sample;\n }\n }\n}\n\n////// Worker sound\n\nexport var WorkerSoundChannel = function(worker) {\n var sampleRate;\n var output;\n var pending = [];\n var pendingLength = 0;\n\n worker.onmessage = function(e) {\n if (e && e.data && e.data.samples && output) {\n pending.push(e.data.samples);\n pendingLength += e.data.samples.length;\n }\n };\n\n this.setBufferLength = function (length) {\n output = new Int16Array(length);\n //worker.postMessage({bufferLength:length,numChannels:2});\n pendingLength = 0;\n };\n\n this.getBuffer = function () {\n return output;\n };\n\n this.setSampleRate = function (rate) {\n sampleRate = rate;\n worker.postMessage({sampleRate:rate});\n };\n\n this.generate = function (length) {\n if (pendingLength < length*3) {\n //console.log(length, pendingLength);\n output.fill(0);\n return; // TODO: send sync msg?\n }\n for (var i=0; i= buffer.length) {\n bufpos = 0;\n bufferlist[ifill] = buffer;\n var inext = (ifill + 1) % bufferlist.length;\n if (inext == idrain) {\n ifill = Math.floor(idrain + nbuffers/2) % bufferlist.length;\n //console.log('SampleAudio: skipped buffer', idrain, ifill); // TODO\n } else {\n ifill = inext;\n }\n buffer = bufferlist[ifill];\n }\n }\n\n this.feedSample = function(value, count) {\n accum += value * count;\n sfrac += sinc * count;\n if (sfrac >= 1) {\n accum /= sfrac;\n while (sfrac >= 1) {\n this.addSingleSample(accum * sinc);\n sfrac -= 1;\n }\n accum *= sfrac;\n }\n }\n \n}\n\n\nexport class SampledAudio {\n sa;\n constructor(sampleRate : number) {\n this.sa = new SampleAudio(sampleRate);\n }\n feedSample(value:number, count:number) {\n this.sa.feedSample(value, count);\n }\n start() {\n this.sa.start();\n }\n stop() {\n this.sa.stop();\n }\n}\n\ninterface TssChannel {\n setBufferLength(len : number) : void;\n setSampleRate(rate : number) : void;\n getBuffer() : number[];\n generate(numSamples : number) : void;\n}\n\nexport class TssChannelAdapter {\n channels : TssChannel[];\n audioGain = 1.0 / 8192;\n bufferLength : number;\n\n constructor(chans, oversample:number, sampleRate:number) {\n this.bufferLength = oversample * 2;\n this.channels = chans.generate ? [chans] : chans; // array or single channel\n this.channels.forEach((c) => {\n c.setBufferLength(this.bufferLength);\n c.setSampleRate(sampleRate);\n });\n }\n\n generate(sink:SampledAudioSink) {\n var l = this.bufferLength;\n var bufs = this.channels.map((ch) => ch.getBuffer());\n this.channels.forEach((ch) => {\n ch.generate(l);\n });\n for (let i=0; i total += buf[i]);\n sink.feedSample(total * this.audioGain, 1);\n };\n }\n}\n\n", "\nimport { Probeable, ProbeAll } from \"./devices\";\n\nexport enum ProbeFlags {\n CLOCKS\t = 0x00000000,\n EXECUTE\t = 0x01000000,\n INTERRUPT\t= 0x08000000,\n ILLEGAL\t = 0x09000000,\n SP_PUSH\t = 0x0a000000,\n SP_POP\t = 0x0b000000,\n HAS_VALUE = 0x10000000,\n MEM_READ\t= 0x12000000,\n MEM_WRITE\t= 0x13000000,\n IO_READ\t = 0x14000000,\n IO_WRITE\t= 0x15000000,\n VRAM_READ\t= 0x16000000,\n VRAM_WRITE= 0x17000000,\n DMA_READ = 0x18000000,\n DMA_WRITE = 0x19000000,\n WAIT = 0x1f000000,\n SCANLINE\t= 0x7e000000,\n FRAME\t\t = 0x7f000000,\n}\n\nclass ProbeFrame {\n data : Uint32Array;\n len : number;\n}\n\nexport class ProbeRecorder implements ProbeAll {\n\n m : Probeable; // machine to probe\n buf : Uint32Array; // buffer\n idx : number = 0; // index into buffer\n sl : number = 0; // scanline\n cur_sp = -1; // last stack pointer\n singleFrame : boolean = true; // clear between frames\n\n constructor(m:Probeable, buflen?:number) {\n this.m = m;\n this.reset(buflen || 0x100000);\n }\n start() {\n this.m.connectProbe(this);\n }\n stop() {\n this.m.connectProbe(null);\n }\n reset(newbuflen? : number) {\n if (newbuflen) this.buf = new Uint32Array(newbuflen);\n this.sl = 0;\n this.cur_sp = -1;\n this.clear();\n }\n clear() {\n this.idx = 0;\n }\n logData(a:number) {\n this.log(a);\n }\n log(a:number) {\n // TODO: coalesce READ and EXECUTE and PUSH/POP\n if (this.idx >= this.buf.length) return;\n this.buf[this.idx++] = a;\n }\n relog(a:number) {\n this.buf[this.idx-1] = a;\n }\n lastOp() {\n if (this.idx > 0)\n return this.buf[this.idx-1] & 0xff000000;\n else\n return -1;\n }\n lastAddr() {\n if (this.idx > 0)\n return this.buf[this.idx-1] & 0xffffff;\n else\n return -1;\n }\n addLogBuffer(src: Uint32Array) {\n if (this.idx + src.length > this.buf.length) {\n src = src.slice(0, this.buf.length - this.idx);\n }\n this.buf.set(src, this.idx);\n this.idx += src.length;\n}\n logClocks(clocks:number) {\n clocks |= 0;\n if (clocks > 0) {\n if (this.lastOp() == ProbeFlags.CLOCKS)\n this.relog((this.lastAddr() + clocks) | ProbeFlags.CLOCKS); // coalesce clocks\n else\n this.log(clocks | ProbeFlags.CLOCKS);\n }\n }\n logNewScanline() {\n this.log(ProbeFlags.SCANLINE);\n this.sl++;\n }\n logNewFrame() {\n this.log(ProbeFlags.FRAME);\n this.sl = 0;\n if (this.singleFrame) this.clear();\n }\n logExecute(address:number, SP:number) {\n // record stack pushes/pops (from last instruction)\n if (this.cur_sp !== SP) {\n if (SP < this.cur_sp) {\n this.log(ProbeFlags.SP_PUSH | SP);\n }\n if (SP > this.cur_sp) {\n this.log(ProbeFlags.SP_POP | SP);\n }\n this.cur_sp = SP;\n }\n this.log(address | ProbeFlags.EXECUTE);\n }\n logInterrupt(type:number) {\n this.log(type | ProbeFlags.INTERRUPT);\n }\n logValue(address:number, value:number, op:number) {\n this.log((address & 0xffff) | ((value & 0xff)<<16) | op);\n }\n logRead(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.MEM_READ);\n }\n logWrite(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.MEM_WRITE);\n }\n logIORead(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.IO_READ);\n }\n logIOWrite(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.IO_WRITE);\n }\n logVRAMRead(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.VRAM_READ);\n }\n logVRAMWrite(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.VRAM_WRITE);\n }\n logIllegal(address:number) {\n this.log(address | ProbeFlags.ILLEGAL);\n }\n logWait(address:number) {\n this.log(address | ProbeFlags.WAIT);\n }\n logDMARead(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.DMA_READ);\n }\n logDMAWrite(address:number, value:number) {\n this.logValue(address, value, ProbeFlags.DMA_WRITE);\n }\n countEvents(op : number) : number {\n var count = 0;\n for (var i=0; i {\n saveState() : S;\n loadState(state:S) : void;\n}\n\nexport interface Bus {\n read(a:number) : number;\n write(a:number, v:number) : void;\n readConst?(a:number) : number;\n}\n\nexport interface ClockBased {\n advanceClock() : void;\n}\n\nexport interface InstructionBased {\n advanceInsn() : number;\n}\n\nexport type TrapCondition = () => boolean;\n\nexport interface FrameBased {\n advanceFrame(trap:TrapCondition) : number;\n}\n\nexport interface VideoSource {\n getVideoParams() : VideoParams;\n connectVideo(pixels:Uint32Array) : void;\n}\n\nexport interface RasterFrameBased extends FrameBased, VideoSource {\n getRasterY() : number;\n getRasterX() : number;\n}\n\nexport interface VideoParams {\n width : number;\n height : number;\n overscan? : boolean;\n rotate? : number;\n videoFrequency? : number; // default = 60\n aspect? : number;\n}\n\n// TODO: frame buffer optimization (apple2, etc)\n\nexport interface SampledAudioParams {\n sampleRate : number;\n stereo : boolean;\n}\n\nexport interface SampledAudioSink {\n feedSample(value:number, count:number) : void;\n //sendAudioFrame(samples:Uint16Array) : void;\n}\n\nexport interface SampledAudioSource {\n getAudioParams() : SampledAudioParams;\n connectAudio(audio : SampledAudioSink) : void;\n}\n\nexport interface AcceptsROM {\n loadROM(data:Uint8Array, title?:string) : void;\n}\n\nexport interface AcceptsBIOS {\n loadBIOS(data:Uint8Array, title?:string) : void;\n}\n\nexport interface Resettable {\n reset() : void;\n}\n\nexport interface MemoryBusConnected {\n connectMemoryBus(bus:Bus) : void;\n}\n\nexport interface IOBusConnected {\n connectIOBus(bus:Bus) : void;\n}\n\nexport interface CPU extends MemoryBusConnected, Resettable, SavesState {\n getPC() : number;\n getSP() : number;\n isStable() : boolean;\n}\n\nexport interface HasCPU extends Resettable {\n cpu : CPU;\n}\n\nexport interface Interruptable {\n interrupt(type:IT) : void;\n}\n\nexport interface SavesInputState {\n loadControlsState(cs:CS) : void;\n saveControlsState() : CS;\n}\n\nexport interface AcceptsKeyInput {\n setKeyInput(key:number, code:number, flags:number) : void;\n}\n\nexport interface AcceptsPaddleInput {\n setPaddleInput(controller:number, value:number) : void;\n}\n\n// TODO: interface not yet used (setKeyInput() handles joystick)\nexport interface AcceptsJoyInput {\n setJoyInput(joy:number, bitmask:number) : void;\n}\n\n// SERIAL I/O\n\nexport interface SerialEvent {\n op: 'read' | 'write';\n value: number;\n nbits: number;\n}\n\n// TODO: all these needed?\nexport interface SerialIOInterface {\n // from machine to platform\n clearToSend() : boolean;\n sendByte(b : number);\n // from platform to machine\n byteAvailable() : boolean;\n recvByte() : number;\n // implement these too\n reset() : void;\n advance(clocks: number) : void;\n// refresh() : void;\n}\n\nexport interface HasSerialIO {\n connectSerialIO(serial: SerialIOInterface);\n serialOut?: SerialEvent[]; // outgoing event log\n serialIn?: SerialEvent[]; // incoming queue\n}\n\n/// PROFILER\n\nexport interface Probeable {\n connectProbe(probe: ProbeAll) : void;\n}\n\nexport interface ProbeTime {\n logClocks(clocks:number);\n logNewScanline();\n logNewFrame();\n}\n\nexport interface ProbeCPU {\n logExecute(address:number, SP:number);\n logInterrupt(type:number);\n logIllegal(address:number);\n logWait(address:number);\n}\n\nexport interface ProbeBus {\n logRead(address:number, value:number);\n logWrite(address:number, value:number);\n logDMARead(address:number, value:number);\n logDMAWrite(address:number, value:number);\n}\n\nexport interface ProbeIO {\n logIORead(address:number, value:number);\n logIOWrite(address:number, value:number);\n}\n\nexport interface ProbeVRAM {\n logVRAMRead(address:number, value:number);\n logVRAMWrite(address:number, value:number);\n}\n\nexport interface ProbeAll extends ProbeTime, ProbeCPU, ProbeBus, ProbeIO, ProbeVRAM {\n logData(data:number); // entire 32 bits\n addLogBuffer(src: Uint32Array);\n}\n\nexport class NullProbe implements ProbeAll {\n logClocks()\t\t{}\n logNewScanline()\t{}\n logNewFrame()\t\t{}\n logExecute()\t\t{}\n logInterrupt()\t{}\n logRead()\t\t{}\n logWrite()\t\t{}\n logIORead()\t\t{}\n logIOWrite()\t\t{}\n logVRAMRead()\t\t{}\n logVRAMWrite()\t{}\n logIllegal()\t\t{}\n logWait()\t\t{}\n logDMARead()\t\t{}\n logDMAWrite()\t\t{}\n logData() {}\n addLogBuffer(src: Uint32Array) {}\n}\n\n/// CONVENIENCE\n\nexport interface BasicMachineControlsState {\n inputs: Uint8Array;\n}\n\nexport interface BasicMachineState extends BasicMachineControlsState {\n c: any; // TODO\n ram: Uint8Array;\n}\n\nexport abstract class BasicHeadlessMachine implements HasCPU, Bus, AcceptsROM, Probeable,\n SavesState, SavesInputState {\n\n abstract cpuFrequency : number;\n abstract defaultROMSize : number;\n\n abstract cpu : CPU;\n abstract ram : Uint8Array; \n\n rom : Uint8Array;\n inputs : Uint8Array = new Uint8Array(32);\n handler : (key,code,flags) => void; // keyboard handler\n\n nullProbe = new NullProbe();\n probe : ProbeAll = this.nullProbe;\n \n abstract read(a:number) : number;\n abstract write(a:number, v:number) : void;\n\n setKeyInput(key:number, code:number, flags:number) : void {\n this.handler && this.handler(key,code,flags);\n }\n connectProbe(probe: ProbeAll) : void {\n this.probe = probe || this.nullProbe;\n }\n reset() {\n this.cpu.reset();\n }\n loadROM(data:Uint8Array, title?:string) : void {\n if (!this.rom) this.rom = new Uint8Array(this.defaultROMSize);\n this.rom.set(data);\n }\n loadState(state) {\n this.cpu.loadState(state.c);\n this.ram.set(state.ram);\n this.inputs.set(state.inputs);\n }\n saveState() {\n return {\n c:this.cpu.saveState(),\n ram:this.ram.slice(0),\n inputs:this.inputs.slice(0),\n };\n }\n loadControlsState(state) {\n this.inputs.set(state.inputs);\n }\n saveControlsState() {\n return {\n inputs:this.inputs.slice(0)\n };\n }\n advanceCPU() {\n var c = this.cpu as any;\n var n = 1;\n if (this.cpu.isStable()) { this.probe.logExecute(this.cpu.getPC(), this.cpu.getSP()); }\n if (c.advanceClock) { c.advanceClock(); }\n else if (c.advanceInsn) { n = c.advanceInsn(1); }\n this.probe.logClocks(n);\n return n;\n }\n probeMemoryBus(membus:Bus) : Bus {\n return {\n read: (a) => {\n let val = membus.read(a);\n this.probe.logRead(a,val);\n return val;\n },\n write: (a,v) => {\n this.probe.logWrite(a,v);\n membus.write(a,v);\n }\n };\n }\n connectCPUMemoryBus(membus:Bus) : void {\n this.cpu.connectMemoryBus(this.probeMemoryBus(membus));\n }\n probeIOBus(iobus:Bus) : Bus {\n return {\n read: (a) => {\n let val = iobus.read(a);\n this.probe.logIORead(a,val);\n return val;\n },\n write: (a,v) => {\n this.probe.logIOWrite(a,v);\n iobus.write(a,v);\n }\n };\n }\n probeDMABus(iobus:Bus) : Bus {\n return {\n read: (a) => {\n let val = iobus.read(a);\n this.probe.logDMARead(a,val);\n return val;\n },\n write: (a,v) => {\n this.probe.logDMAWrite(a,v);\n iobus.write(a,v);\n }\n };\n }\n connectCPUIOBus(iobus:Bus) : void {\n this.cpu['connectIOBus'](this.probeIOBus(iobus));\n }\n}\n\nexport abstract class BasicMachine extends BasicHeadlessMachine implements SampledAudioSource {\n\n abstract canvasWidth : number;\n abstract numVisibleScanlines : number;\n abstract sampleRate : number;\n overscan : boolean = false;\n rotate : number = 0;\n aspectRatio : number;\n \n pixels : Uint32Array;\n audio : SampledAudioSink;\n\n scanline : number;\n \n getAudioParams() : SampledAudioParams {\n return {sampleRate:this.sampleRate, stereo:false};\n }\n connectAudio(audio : SampledAudioSink) : void {\n this.audio = audio;\n }\n getVideoParams() : VideoParams {\n return {width:this.canvasWidth,\n height:this.numVisibleScanlines,\n aspect:this.aspectRatio,\n overscan:this.overscan,\n rotate:this.rotate};\n }\n connectVideo(pixels:Uint32Array) : void {\n this.pixels = pixels;\n }\n}\n\nexport abstract class BasicScanlineMachine extends BasicMachine implements RasterFrameBased {\n\n abstract numTotalScanlines : number;\n abstract cpuCyclesPerLine : number;\n\n abstract startScanline() : void;\n abstract drawScanline() : void;\n\n frameCycles : number;\n \n advanceFrame(trap: TrapCondition) : number {\n this.preFrame();\n var endLineClock = 0;\n var steps = 0;\n this.probe.logNewFrame();\n this.frameCycles = 0;\n for (var sl=0; sl= 0x40 && b1 <= 0x7f) am = Z80_OPS_ED[b1 - 0x40];\n if (b1 >= 0xa0 && b1 <= 0xbf) am = Z80_OPS_ED[b1 - 0xa0 + 0x40];\n n++;\n break;\n case 0xdd:\n case 0xfd:\n var ireg = (b0 == 0xdd) ? 'ix' : 'iy';\n if (b1 == 0xcb) {\n // swap the 3rd and 4th bytes [$dd $cb displacement opcode]\n am = Z80_OPS_CB[b3];\n bytes[2] = b3;\n bytes[3] = b2;\n n++;\n } else {\n am = Z80_OPS[b1];\n }\n am = am.replace(/[(]hl[)]/, '('+ireg+'+x)');\n am = am.replace(/\\bhl\\b/, ireg);\n n++;\n break;\n default:\n am = Z80_OPS[b0];\n break;\n }\n if (!am || !am.length) am = \"??\";\n if (/\\bxx\\b/.test(am)) {\n am = am.replace(/\\bxx\\b/,'$'+hex(bytes[n]+(bytes[n+1]<<8), 4));\n n += 2;\n isaddr = true;\n } else if (/\\bx\\b/.test(am)) {\n if (am.startsWith('j')) {\n var offset = (b1 < 0x80) ? (pc+2+b1) : (pc+2-(256-b1));\n offset &= 0xffff;\n am = am.replace(/\\bx\\b/,'$'+hex(offset, 4));\n isaddr = true;\n } else {\n am = am.replace(/\\bx\\b/,'$'+hex(bytes[n], 2));\n }\n n += 1;\n }\n return {line:am.toUpperCase(), nbytes:n, isaddr:isaddr};\n};\n", "\nimport { CpuState, EmuState } from \"./baseplatform\";\nimport { CPU, SampledAudioSink, ProbeAll, NullProbe } from \"./devices\";\nimport { EmuHalt } from \"./emu\";\n\n// WASM Support\n// TODO: detangle from c64\n\nexport abstract class BaseWASMMachine {\n prefix : string;\n instance : WebAssembly.Instance;\n exports : any;\n sys : number;\n pixel_dest : Uint32Array;\n pixel_src : Uint32Array;\n stateptr : number;\n statearr : Uint8Array;\n cpustateptr : number;\n cpustatearr : Uint8Array;\n ctrlstateptr : number;\n ctrlstatearr : Uint8Array;\n cpu : CPU;\n romptr : number;\n romlen : number;\n romarr : Uint8Array;\n biosptr : number;\n biosarr : Uint8Array;\n audio : SampledAudioSink;\n audioarr : Float32Array;\n probe : ProbeAll;\n maxROMSize : number = 0x40000;\n\n abstract getCPUState() : CpuState;\n abstract saveState() : EmuState;\n abstract loadState(state: EmuState);\n\n constructor(prefix: string) {\n this.prefix = prefix;\n var self = this;\n this.cpu = {\n getPC: self.getPC.bind(self),\n getSP: self.getSP.bind(self),\n isStable: self.isStable.bind(self),\n reset: self.reset.bind(self),\n saveState: () => {\n return self.getCPUState();\n },\n loadState: () => {\n console.log(\"loadState not implemented\")\n },\n connectMemoryBus() {\n console.log(\"connectMemoryBus not implemented\")\n },\n }\n }\n getImports(wmod: WebAssembly.Module) {\n return {};\n }\n async fetchWASM() {\n var wasmResponse = await fetch('res/'+this.prefix+'.wasm');\n if (wasmResponse.status == 200 || (wasmResponse as any as Blob).size) {\n var wasmBinary = await wasmResponse.arrayBuffer();\n var wasmCompiled = await WebAssembly.compile(wasmBinary);\n var wasmResult = await WebAssembly.instantiate(wasmCompiled, this.getImports(wasmCompiled));\n this.instance = wasmResult;\n this.exports = wasmResult.exports;\n } else throw new Error('could not load WASM file');\n }\n async fetchBIOS() {\n var biosResponse = await fetch('res/'+this.prefix+'.bios');\n if (biosResponse.status == 200 || (biosResponse as any as Blob).size) {\n var biosBinary = await biosResponse.arrayBuffer();\n this.biosptr = this.exports.malloc(biosBinary.byteLength);\n this.biosarr = new Uint8Array(this.exports.memory.buffer, this.biosptr, biosBinary.byteLength);\n this.loadBIOS(new Uint8Array(biosBinary));\n } else throw new Error('could not load BIOS file');\n }\n async initWASM() {\n // init machine instance\n this.sys = this.exports.machine_init(this.biosptr);\n let statesize = this.exports.machine_get_state_size();\n this.stateptr = this.exports.malloc(statesize);\n let ctrlstatesize = this.exports.machine_get_controls_state_size();\n this.ctrlstateptr = this.exports.malloc(ctrlstatesize);\n let cpustatesize = this.exports.machine_get_cpu_state_size();\n this.cpustateptr = this.exports.malloc(cpustatesize);\n this.romptr = this.exports.malloc(this.maxROMSize);\n // create state buffers\n // must do this after allocating memory (and everytime we grow memory?)\n this.statearr = new Uint8Array(this.exports.memory.buffer, this.stateptr, statesize);\n this.ctrlstatearr = new Uint8Array(this.exports.memory.buffer, this.ctrlstateptr, ctrlstatesize);\n this.cpustatearr = new Uint8Array(this.exports.memory.buffer, this.cpustateptr, cpustatesize);\n // create audio buffer\n let sampbufsize = 4096*4;\n this.audioarr = new Float32Array(this.exports.memory.buffer, this.exports.machine_get_sample_buffer(), sampbufsize);\n // create ROM buffer\n this.romarr = new Uint8Array(this.exports.memory.buffer, this.romptr, this.maxROMSize);\n // enable c64 joystick map to arrow keys (TODO)\n //this.exports.c64_set_joystick_type(this.sys, 1);\n console.log('machine_init', this.sys, statesize, ctrlstatesize, cpustatesize, sampbufsize);\n }\n async loadWASM() {\n await this.fetchWASM();\n this.exports.memory.grow(96); // TODO: need more when probing?\n await this.fetchBIOS();\n await this.initWASM();\n }\n getPC() : number {\n return this.exports.machine_cpu_get_pc(this.sys);\n }\n getSP() : number {\n return this.exports.machine_cpu_get_sp(this.sys);\n }\n isStable() : boolean {\n return this.exports.machine_cpu_is_stable(this.sys);\n }\n loadROM(rom: Uint8Array) {\n if (rom.length > this.maxROMSize) throw new EmuHalt(`Rom size too big: ${rom.length} bytes`);\n this.romarr.set(rom);\n this.romlen = rom.length;\n console.log('load rom', rom.length, 'bytes');\n this.reset(); // TODO?\n }\n // TODO: can't load after machine_init\n loadBIOS(srcArray: Uint8Array) {\n this.biosarr.set(srcArray);\n }\n reset() {\n this.exports.machine_reset(this.sys);\n }\n /* TODO: we don't need this because c64_exec does this?\n pollControls() {\n this.exports.machine_start_frame(this.sys);\n }\n */\n read(address: number) : number {\n return this.exports.machine_mem_read(this.sys, address & 0xffff);\n }\n readConst(address: number) : number {\n return this.exports.machine_mem_read(this.sys, address & 0xffff);\n }\n write(address: number, value: number) : void {\n this.exports.machine_mem_write(this.sys, address & 0xffff, value & 0xff);\n }\n getAudioParams() {\n return {sampleRate:44100, stereo:false};\n }\n videoOffsetBytes = 0;\n connectVideo(pixels:Uint32Array) : void {\n this.pixel_dest = pixels;\n var pixbuf = this.exports.machine_get_pixel_buffer(this.sys); // save video pointer\n console.log('connectVideo', pixbuf, pixels.length);\n this.pixel_src = new Uint32Array(this.exports.memory.buffer, pixbuf+this.videoOffsetBytes, pixels.length);\n }\n syncVideo() {\n if (this.exports.machine_update_video) {\n this.exports.machine_update_video(this.sys);\n }\n if (this.pixel_dest != null) {\n this.pixel_dest.set(this.pixel_src);\n }\n }\n // assume controls buffer is smaller than cpu buffer\n saveControlsState() : any {\n //console.log(1, this.romptr, this.romlen, this.ctrlstateptr, this.romarr.slice(0,4), this.ctrlstatearr.slice(0,4));\n this.exports.machine_save_controls_state(this.sys, this.ctrlstateptr);\n //console.log(2, this.romptr, this.romlen, this.ctrlstateptr, this.romarr.slice(0,4), this.ctrlstatearr.slice(0,4));\n return { controls:this.ctrlstatearr.slice(0) }\n }\n loadControlsState(state) : void {\n this.ctrlstatearr.set(state.controls);\n this.exports.machine_load_controls_state(this.sys, this.ctrlstateptr);\n }\n connectAudio(audio : SampledAudioSink) : void {\n this.audio = audio;\n }\n syncAudio() {\n if (this.audio != null) {\n var n = this.exports.machine_get_sample_count();\n for (var i=0; i>1))&0x80)>>6);};\nvar setV16 = function(a,b,r) {CC |= (((a^b^r^(r>>1))&0x8000)>>14);};\nvar getD = function() {return (rA<<8)+rB;};\nvar setD = function(v) {rA = (v>>8)& 0xff;rB=v&0xff;};\nvar PUSHB = function(b) {\n byteTo(--rS, b & 0xff);\n};\nvar PUSHW = function(b) {\n byteTo(--rS, b & 0xff);\n byteTo(--rS, (b>>8) & 0xff);\n};\n\nvar PUSHBU = function(b) {\n byteTo(--rU, b & 0xff);\n};\nvar PUSHWU = function(b) {\n byteTo(--rU, b & 0xff);\n byteTo(--rU, (b>>8) & 0xff);\n};\nvar PULLB = function() {\n return byteAt(rS++);\n};\nvar PULLW = function() {\n return byteAt(rS++) * 256 + byteAt(rS++);\n};\n\nvar PULLBU = function() {\n return byteAt(rU++);\n};\nvar PULLWU = function() {\n return byteAt(rU++) * 256 + byteAt(rU++);\n};\n\nvar PSHS = function(ucTemp) {\n var i = 0;\n if (ucTemp & 0x80) {PUSHW(PC);i += 2;}\n if (ucTemp & 0x40) {PUSHW(rU);i += 2;}\n if (ucTemp & 0x20){PUSHW(rY);i += 2;}\n if (ucTemp & 0x10){PUSHW(rX);i += 2;}\n if (ucTemp & 0x8){PUSHB(DP); i++;}\n if (ucTemp & 0x4){PUSHB(rB); i++;}\n if (ucTemp & 0x2){PUSHB(rA); i++;}\n if (ucTemp & 0x1){PUSHB(CC); i++;}\n T+=i; //timing\n};\nvar PSHU = function(ucTemp) {\n var i = 0;\n if (ucTemp & 0x80) {PUSHWU(PC);i += 2;}\n if (ucTemp & 0x40) {PUSHWU(rS);i += 2;}\n if (ucTemp & 0x20){PUSHWU(rY);i += 2;}\n if (ucTemp & 0x10){PUSHWU(rX);i += 2;}\n if (ucTemp & 0x8){PUSHBU(DP); i++;}\n if (ucTemp & 0x4){PUSHBU(rB); i++;}\n if (ucTemp & 0x2){PUSHBU(rA); i++;}\n if (ucTemp & 0x1){PUSHBU(CC); i++;}\n T+=i; //timing\n};\nvar PULS = function(ucTemp) {\n var i = 0;\n if (ucTemp & 0x1){CC = PULLB(); i++;}\n if (ucTemp & 0x2){rA = PULLB(); i++;}\n if (ucTemp & 0x4){rB = PULLB(); i++;}\n if (ucTemp & 0x8){DP = PULLB(); i++;}\n if (ucTemp & 0x10){rX = PULLW();i += 2;}\n if (ucTemp & 0x20){rY = PULLW();i += 2;}\n if (ucTemp & 0x40) {rU = PULLW();i += 2;}\n if (ucTemp & 0x80) {PC = PULLW();i += 2;}\n T+=i; //timing\n};\nvar PULU = function(ucTemp) {\n var i = 0;\n if (ucTemp & 0x1){CC = PULLBU(); i++;}\n if (ucTemp & 0x2){rA = PULLBU(); i++;}\n if (ucTemp & 0x4){rB = PULLBU(); i++;}\n if (ucTemp & 0x8){DP = PULLBU(); i++;}\n if (ucTemp & 0x10){rX = PULLWU();i += 2;}\n if (ucTemp & 0x20){rY = PULLWU();i += 2;}\n if (ucTemp & 0x40) {rS = PULLWU();i += 2;}\n if (ucTemp & 0x80) {PC = PULLWU();i += 2;}\n T+=i; //timing\n};\n\n\nvar getPBR = function(ucPostByte) {\n switch(ucPostByte & 0xf) {\n case 0x00: /* D */\n return getD();\n case 0x1: /* X */\n return rX;\n case 0x2: /* Y */\n return rY;\n case 0x3: /* U */\n return rU;\n case 0x4: /* S */\n return rS;\n case 0x5: /* PC */\n return PC;\n case 0x8: /* A */\n return rA;\n case 0x9: /* B */\n return rB;\n case 0xA: /* CC */\n return CC;\n case 0xB: /* DP */\n return DP;\n default: /* illegal */\n return null;\n }\n};\nvar setPBR = function(ucPostByte, v) {\n switch(ucPostByte & 0xf) /* Get destination register */\n {\n case 0x00: /* D */\n setD(v);return;\n case 0x1: /* X */\n rX = v; return;\n case 0x2: /* Y */\n rY = v; return;\n case 0x3: /* U */\n rU = v; return;\n case 0x4: /* S */\n rS = v; return;\n case 0x5: /* PC */\n PC = v; return;\n case 0x8: /* A */\n rA = v; return;\n case 0x9: /* B */\n rB = v; return;\n case 0xA: /* CC */\n CC = v; return;\n case 0xB: /* DP */\n DP = v; return;\n default: /* illegal */\n return;\n }\n};\n\nvar TFREXG = function(ucPostByte, bExchange)\n{\n\n var ucTemp = ucPostByte & 0x88;\n if (ucTemp == 0x80 || ucTemp == 0x08)\n ucTemp = 0; /* PROBLEM! */\n\n if (bExchange)\n {\n ucTemp = getPBR(ucPostByte>>4);\n setPBR(ucPostByte>>4, getPBR(ucPostByte));\n setPBR(ucPostByte, ucTemp);\n }\n else /* Transfer */ {\n setPBR(ucPostByte, getPBR(ucPostByte>>4));\n }\n} ;\n\nvar signed = function(x) {\n return (x>127)?(x-256):x;\n};\nvar signed16 = function(x) {\n return (x>32767)?(x-65536):x;\n};\n\nvar fetch = function() {\n var v = byteAt(PC++);\n PC &= 0xffff;\n return v;\n};\nvar fetch16 = function() {\n var v1 = byteAt(PC++);\n PC &= 0xffff;\n var v2 = byteAt(PC++);\n PC &= 0xffff;\n return v1*256+v2;\n};\n\nvar ReadWord = function(addr) {\n var v1 = byteAt(addr++);\n addr &= 0xffff;\n var v2 = byteAt(addr++);\n addr &= 0xffff;\n return v1*256+v2;\n};\nvar WriteWord = function(addr,v) {\n byteTo(addr++,(v>>8)&0xff);\n addr &= 0xffff;\n byteTo(addr,v&0xff);\n};\n\nvar PostByte = function() {\n var pb = fetch();\n var preg;\n switch (pb & 0x60) {\n case 0:\n preg = rX; break;\n case 0x20:\n preg = rY; break;\n case 0x40:\n preg = rU; break;\n case 0x60:\n preg = rS; break;\n }\n\n var xchg = null;\n var addr = null;\n var sTemp;\n\n if (pb & 0x80) /* Complex stuff */\n {\n switch (pb & 0x0f)\n {\n case 0: /* EA = ,reg+ */\n addr = preg;\n xchg = preg + 1;\n T += 2;\n break;\n case 1: /* EA = ,reg++ */\n addr = preg;\n xchg = preg + 2;\n T += 3;\n break;\n case 2: /* EA = ,-reg */\n xchg = preg - 1;\n addr = xchg;\n T += 2;\n break;\n case 3: /* EA = ,--reg */\n xchg = preg - 2;\n addr = xchg;\n T += 3;\n break;\n case 4: /* EA = ,reg */\n addr = preg;\n break;\n case 5: /* EA = ,reg + B */\n //usAddr = *pReg + (signed short)(signed char)regs->ucRegB;\n addr = preg + signed(rB);\n T += 1;\n break;\n case 6: /* EA = ,reg + A */\n addr = preg + signed(rA);\n T += 1;\n break;\n case 7: /* illegal */\n addr = 0;\n break;\n case 8: /* EA = ,reg + 8-bit offset */\n addr = preg + signed(fetch());\n T += 1;\n break;\n case 9: /* EA = ,reg + 16-bit offset */\n addr = preg + signed16(fetch16());\n T += 4;\n break;\n case 0xA: /* illegal */\n addr = 0;\n break;\n case 0xB: /* EA = ,reg + D */\n T += 4;\n addr = preg + getD();\n break;\n case 0xC: /* EA = PC + 8-bit offset */\n sTemp = signed(fetch());\n addr = PC + sTemp;\n T += 1;\n break;\n case 0xD: /* EA = PC + 16-bit offset */\n sTemp = signed16(fetch16());\n addr = PC + sTemp;\n T += 5;\n break;\n case 0xe: /* Illegal */\n addr = 0;\n break;\n case 0xF: /* EA = [,address] */\n T += 5;\n addr = fetch16();\n break;\n } /* switch */\n\n addr &= 0xffff;\n\n if (pb & 0x10) /* Indirect addressing */\n {\n addr = byteAt(addr)*256+byteAt((addr+1) & 0xffff);\n T += 3;\n }\n }\n else /* Just a 5 bit signed offset + register */\n {\n var sByte = pb & 0x1f;\n if (sByte > 15) /* Two's complement 5-bit value */\n sByte -= 32;\n addr = preg + sByte;\n T += 1;\n }\n\n if (xchg!==null) {\n switch (pb & 0x60) {\n case 0:\n rX = xchg; break;\n case 0x20:\n rY = xchg; break;\n case 0x40:\n rU = xchg; break;\n case 0x60:\n rS = xchg; break;\n }\n\n }\n\n return addr & 0xffff; /* Return the effective address */\n};\n\nvar flagsNZ16 = function(word) {\n CC &= ~(F_ZERO | F_NEGATIVE);\n if (word===0) CC |= F_ZERO;\n if (word & 0x8000) CC |= F_NEGATIVE;\n};\n\n// ============= Operations\n\nvar oINC = function(b) {\n b++;\n b &= 0xff;\n CC &= ~(F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[b];\n if (b === 0 || b == 0x80) CC |= F_OVERFLOW;\n return b;\n};\nvar oDEC = function(b) {\n b--;\n b &= 0xff;\n CC &= ~(F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[b];\n if (b === 0x7f || b == 0xff) CC |= F_OVERFLOW;\n return b;\n};\nvar oSUB = function(b,v) {\n var temp = b-v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n return temp&0xff;\n};\nvar oSUB16 = function(b,v) {\n var temp = b-v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n if ((temp&0xffff)===0) CC|=F_ZERO;\n if (temp&0x8000) CC|=F_NEGATIVE;\n if (temp&0x10000) CC|=F_CARRY;\n setV16(b,v,temp);\n return temp&0xffff;\n};\nvar oADD = function(b,v) {\n var temp = b+v;\n //temp &= 0xff;\n CC &= ~(F_HALFCARRY | F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n if ((temp ^ b ^ v)&0x10) CC |= F_HALFCARRY;\n return temp&0xff;\n};\nvar oADD16 = function(b,v) {\n var temp = b+v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n if ((temp&0xffff)===0) CC|=F_ZERO;\n if (temp&0x8000) CC|=F_NEGATIVE;\n if (temp&0x10000) CC|=F_CARRY;\n setV16(b,v,temp);\n return temp&0xffff;\n};\nvar oADC = function(b,v) {\n var temp = b+v+(CC & F_CARRY);\n //temp &= 0xff;\n CC &= ~(F_HALFCARRY | F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n if ((temp ^ b ^ v)&0x10) CC |= F_HALFCARRY;\n return temp&0xff;\n};\nvar oSBC = function(b,v) {\n var temp = b-v-(CC & F_CARRY);\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n return temp&0xff;\n};\nvar oCMP = function(b,v) {\n var temp = b-v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n CC |= flagsNZ[temp & 0xff];\n if (temp&0x100) CC|=F_CARRY;\n setV8(b,v,temp);\n return;\n};\nvar oCMP16 = function(b,v) {\n var temp = b-v;\n //temp &= 0xff;\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n if ((temp&0xffff)===0) CC|=F_ZERO;\n if (temp&0x8000) CC|=F_NEGATIVE;\n if (temp&0x10000) CC|=F_CARRY;\n setV16(b,v,temp);\n return;\n};\n\nvar oNEG = function(b) {\n CC &= ~(F_CARRY | F_ZERO | F_OVERFLOW | F_NEGATIVE);\n if (b == 0x80)\n CC |= F_OVERFLOW;\n b = ((~b)&0xff) + 1;\n if (b === 0) CC |= F_ZERO;\n if (b & 0x80) CC |= F_NEGATIVE | F_CARRY;\n return b;\n};\n\nvar oLSR = function(b) {\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE);\n if (b & 0x01) CC |= F_CARRY;\n b >>= 1;\n if (b === 0) CC |= F_ZERO;\n return b & 0xff;\n};\nvar oASR = function(b) {\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE);\n if (b & 0x01) CC |= F_CARRY;\n b = (b & 0x80) | (b>>1);\n CC |= flagsNZ[b];\n return b;\n};\nvar oASL = function(b) {\n var temp = b;\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE | F_OVERFLOW);\n if (b & 0x80) CC |= F_CARRY;\n b <<= 1;\n CC |= flagsNZ[b];\n if ((b ^ temp) & 0x80) CC|=F_OVERFLOW;\n return b;\n};\nvar oROL = function(b) {\n var temp = b;\n var oldc = CC&F_CARRY;\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE | F_OVERFLOW);\n if (b & 0x80) CC |= F_CARRY;\n b = b<<1 | oldc;\n CC |= flagsNZ[b];\n if ((b ^ temp) & 0x80) CC|=F_OVERFLOW;\n return b;\n};\nvar oROR = function(b) {\n var oldc = CC&F_CARRY;\n CC &= ~(F_ZERO | F_CARRY | F_NEGATIVE);\n if (b & 0x01) CC |= F_CARRY;\n b = b>>1 | oldc<<7;\n CC |= flagsNZ[b];\n// if ((b ^ temp) & 0x80) CC|=F_OVERFLOW;\n return b;\n};\n\nvar oEOR = function(b,v) {\n CC &= ~(F_ZERO | F_NEGATIVE | F_OVERFLOW);\n b ^= v;\n CC |= flagsNZ[b];\n return b;\n};\nvar oOR = function(b,v) {\n CC &= ~(F_ZERO | F_NEGATIVE | F_OVERFLOW);\n b |= v;\n CC |= flagsNZ[b];\n return b;\n};\nvar oAND = function(b,v) {\n CC &= ~(F_ZERO | F_NEGATIVE | F_OVERFLOW);\n b &= v;\n CC |= flagsNZ[b];\n return b;\n};\nvar oCOM = function(b) {\n CC &= ~(F_ZERO | F_NEGATIVE | F_OVERFLOW);\n b ^= 0xff;\n CC |= flagsNZ[b];\n CC |= F_CARRY;\n return b;\n};\n\n//----common\nvar dpadd = function() {\n //direct page + 8bit index\n return DP*256 + fetch();\n};\n\nvar step = function() {\n var oldT = T;\n\n var addr = null;\n var pb = null;\n\n var oldPC = PC;\n var opcode = fetch();\n T+=cycles[opcode];\n switch (opcode) {\n case 0x00: //NEG DP\n addr = dpadd();\n byteTo(addr, oNEG(byteAt(addr)));\n break;\n case 0x03: //COM DP\n addr = dpadd();\n byteTo(addr, oCOM(byteAt(addr)));\n break;\n case 0x04: //LSR DP\n addr = dpadd();\n byteTo(addr, oLSR(byteAt(addr)));\n break;\n case 0x06: //ROR DP\n addr = dpadd();\n byteTo(addr, oROR(byteAt(addr)));\n break;\n case 0x07: //ASR DP\n addr = dpadd();\n byteTo(addr, oASR(byteAt(addr)));\n break;\n case 0x08: //ASL DP\n addr = dpadd();\n byteTo(addr, oASL(byteAt(addr)));\n break;\n case 0x09: //ROL DP\n addr = dpadd();\n byteTo(addr, oROL(byteAt(addr)));\n break;\n\n case 0x0A: //DEC DP\n addr = dpadd();\n byteTo(addr, oDEC(byteAt(addr)));\n break;\n case 0x0C: //INC DP\n addr = dpadd();\n byteTo(addr, oINC(byteAt(addr)));\n break;\n\n case 0x0D: //TST DP\n addr = dpadd();\n pb = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[pb];\n break;\n\n case 0x0E: //JMP DP\n addr = dpadd();\n PC = addr;\n break;\n case 0x0F: //CLR DP\n addr = dpadd();\n byteTo(addr,0);\n CC&=~(F_CARRY|F_NEGATIVE|F_OVERFLOW);\n CC |= F_ZERO;\n break;\n\n case 0x12: //NOP\n break;\n case 0x13: //SYNC\n break;\n case 0x16: //LBRA relative\n addr = signed16(fetch16());\n PC += addr;\n break;\n case 0x17: //LBSR relative\n addr = signed16(fetch16());\n PUSHW(PC);\n PC += addr;\n break;\n case 0x19: //DAA\n var cf = 0;\n var nhi = rA & 0xf0, nlo = rA & 0x0f;\n if( nlo>0x09 || CC & 0x20 ) cf |= 0x06;\n if( nhi>0x80 && nlo>0x09 ) cf |= 0x60;\n if( nhi>0x90 || CC & 0x01 ) cf |= 0x60;\n addr = cf + rA;\n CC &= ~(F_CARRY | F_NEGATIVE | F_ZERO | F_OVERFLOW);\n if (addr & 0x100)\n CC |= F_CARRY;\n rA = addr & 0xff;\n CC |= flagsNZ[rA];\n break;\n case 0x1A: //ORCC\n CC |= fetch();\n break;\n case 0x1C: //ANDCC\n CC &= fetch();\n break;\n case 0x1D: //SEX\n rA = (rB & 0x80)?0xff:0;\n flagsNZ16(getD());\n CC &= ~F_OVERFLOW;\n break;\n case 0x1E: //EXG\n pb = fetch();\n TFREXG(pb,true);\n break;\n case 0x1F: //EXG\n pb = fetch();\n TFREXG(pb,false);\n break;\n\n case 0x20: //BRA\n addr = signed(fetch());\n PC += addr;\n break;\n case 0x21: //BRN\n addr = signed(fetch());\n break;\n case 0x22: //BHI\n addr = signed(fetch());\n if (!(CC&(F_CARRY | F_ZERO))) PC += addr;\n break;\n case 0x23: //BLS\n addr = signed(fetch());\n if (CC&(F_CARRY | F_ZERO)) PC += addr;\n break;\n case 0x24: //BCC\n addr = signed(fetch());\n if (!(CC&F_CARRY)) PC += addr;\n break;\n case 0x25: //BCS\n addr = signed(fetch());\n if (CC&F_CARRY) PC += addr;\n break;\n case 0x26: //BNE\n addr = signed(fetch());\n if (!(CC&F_ZERO)) PC += addr;\n break;\n case 0x27: //BEQ\n addr = signed(fetch());\n if (CC&F_ZERO) PC += addr;\n break;\n case 0x28: //BVC\n addr = signed(fetch());\n if (!(CC&F_OVERFLOW)) PC += addr;\n break;\n case 0x29: //BVS\n addr = signed(fetch());\n if (CC&F_OVERFLOW) PC += addr;\n break;\n case 0x2A: //BPL\n addr = signed(fetch());\n if (!(CC&F_NEGATIVE)) PC += addr;\n break;\n case 0x2B: //BMI\n addr = signed(fetch());\n if (CC&F_NEGATIVE) PC += addr;\n break;\n case 0x2C: //BGE\n addr = signed(fetch());\n if (!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2))) PC += addr;\n break;\n case 0x2D: //BLT\n addr = signed(fetch());\n if ((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2)) PC += addr;\n break;\n case 0x2E: //BGT\n addr = signed(fetch());\n if (!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO))) PC += addr;\n break;\n case 0x2F: //BLE\n addr = signed(fetch());\n if ((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO)) PC += addr;\n break;\n\n case 0x30: //LEAX\n rX = PostByte();\n if (rX===0) CC|=F_ZERO; else CC&=~F_ZERO;\n break;\n case 0x31: //LEAY\n rY = PostByte();\n if (rY===0) CC|=F_ZERO; else CC&=~F_ZERO;\n break;\n case 0x32: //LEAS\n rS = PostByte();\n break;\n case 0x33: //LEAU\n rU = PostByte();\n break;\n\n case 0x34: //PSHS\n PSHS(fetch());\n break;\n case 0x35: //PULS\n PULS(fetch());\n break;\n case 0x36: //PSHU\n PSHU(fetch());\n break;\n case 0x37: //PULU\n PULU(fetch());\n break;\n case 0x39: //RTS\n PC = PULLW();\n break;\n case 0x3A: //ABX\n rX += rB;\n break;\n case 0x3B: //RTI\n CC = PULLB();\n if (CC & F_ENTIRE) {\n T+=9;\n rA = PULLB();\n rB = PULLB();\n DP = PULLB();\n rX = PULLW();\n rY = PULLW();\n rU = PULLW();\n }\n PC = PULLW();\n break;\n case 0x3C: //CWAI **todo\n CC &= fetch();\n break;\n case 0x3D: //MUL\n addr = rA * rB;\n if (addr===0) CC|=F_ZERO; else CC&=~F_ZERO;\n if (addr&0x80) CC|=F_CARRY; else CC&=~F_CARRY;\n setD(addr);\n break;\n case 0x3F: //SWI\n CC |= F_ENTIRE;\n PUSHW(PC);\n PUSHW(rU);\n PUSHW(rY);\n PUSHW(rX);\n PUSHB(DP);\n PUSHB(rB);\n PUSHB(rA);\n PUSHB(CC);\n CC |= F_IRQMASK | F_FIRQMASK;\n PC = ReadWord(vecSWI);\n break;\n\n case 0x40:\n rA = oNEG(rA);\n break;\n case 0x43:\n rA = oCOM(rA);\n break;\n case 0x44:\n rA = oLSR(rA);\n break;\n case 0x46:\n rA = oROR(rA);\n break;\n case 0x47:\n rA = oASR(rA);\n break;\n case 0x48:\n rA = oASL(rA);\n break;\n case 0x49:\n rA = oROL(rA);\n break;\n case 0x4A:\n rA = oDEC(rA);\n break;\n case 0x4C:\n rA = oINC(rA);\n break;\n case 0x4D:\n CC &= ~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0x4F:\n rA = 0;\n CC &= ~(F_NEGATIVE|F_OVERFLOW|F_CARRY);\n CC |= F_ZERO;\n break;\n\n case 0x50:\n rB = oNEG(rB);\n break;\n case 0x53:\n rB = oCOM(rB);\n break;\n case 0x54:\n rB = oLSR(rB);\n break;\n case 0x56:\n rB = oROR(rB);\n break;\n case 0x57:\n rB = oASR(rB);\n break;\n case 0x58:\n rB = oASL(rB);\n break;\n case 0x59:\n rB = oROL(rB);\n break;\n case 0x5A:\n rB = oDEC(rB);\n break;\n case 0x5C:\n rB = oINC(rB);\n break;\n case 0x5D:\n CC &= ~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0x5F:\n rB = 0;\n CC &= ~(F_NEGATIVE|F_OVERFLOW|F_CARRY);\n CC |= F_ZERO;\n break;\n\n case 0x60: //NEG indexed\n addr = PostByte();\n byteTo(addr, oNEG(byteAt(addr)));\n break;\n case 0x63: //COM indexed\n addr = PostByte();\n byteTo(addr, oCOM(byteAt(addr)));\n break;\n case 0x64: //LSR indexed\n addr = PostByte();\n byteTo(addr, oLSR(byteAt(addr)));\n break;\n case 0x66: //ROR indexed\n addr = PostByte();\n byteTo(addr, oROR(byteAt(addr)));\n break;\n case 0x67: //ASR indexed\n addr = PostByte();\n byteTo(addr, oASR(byteAt(addr)));\n break;\n case 0x68: //ASL indexed\n addr = PostByte();\n byteTo(addr, oASL(byteAt(addr)));\n break;\n case 0x69: //ROL indexed\n addr = PostByte();\n byteTo(addr, oROL(byteAt(addr)));\n break;\n\n case 0x6A: //DEC indexed\n addr = PostByte();\n byteTo(addr, oDEC(byteAt(addr)));\n break;\n case 0x6C: //INC indexed\n addr = PostByte();\n byteTo(addr, oINC(byteAt(addr)));\n break;\n\n case 0x6D: //TST indexed\n addr = PostByte();\n pb = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[pb];\n break;\n\n case 0x6E: //JMP indexed\n addr = PostByte();\n PC = addr;\n break;\n case 0x6F: //CLR indexed\n addr = PostByte();\n byteTo(addr,0);\n CC&=~(F_CARRY|F_NEGATIVE|F_OVERFLOW);\n CC |= F_ZERO;\n break;\n\n\n case 0x70: //NEG extended\n addr = fetch16();\n byteTo(addr, oNEG(byteAt(addr)));\n break;\n case 0x73: //COM extended\n addr = fetch16();\n byteTo(addr, oCOM(byteAt(addr)));\n break;\n case 0x74: //LSR extended\n addr = fetch16();\n byteTo(addr, oLSR(byteAt(addr)));\n break;\n case 0x76: //ROR extended\n addr = fetch16();\n byteTo(addr, oROR(byteAt(addr)));\n break;\n case 0x77: //ASR extended\n addr = fetch16();\n byteTo(addr, oASR(byteAt(addr)));\n break;\n case 0x78: //ASL extended\n addr = fetch16();\n byteTo(addr, oASL(byteAt(addr)));\n break;\n case 0x79: //ROL extended\n addr = fetch16();\n byteTo(addr, oROL(byteAt(addr)));\n break;\n\n case 0x7A: //DEC extended\n addr = fetch16();\n byteTo(addr, oDEC(byteAt(addr)));\n break;\n case 0x7C: //INC extended\n addr = fetch16();\n byteTo(addr, oINC(byteAt(addr)));\n break;\n\n case 0x7D: //TST extended\n addr = fetch16();\n pb = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[pb];\n break;\n\n case 0x7E: //JMP extended\n addr = fetch16();\n PC = addr;\n break;\n case 0x7F: //CLR extended\n addr = fetch16();\n byteTo(addr,0);\n CC&=~(F_CARRY|F_NEGATIVE|F_OVERFLOW);\n CC |= F_ZERO;\n break;\n\n // regs A,X\n\n case 0x80: //SUBA imm\n rA = oSUB(rA, fetch());\n break;\n case 0x81: //CMPA imm\n oCMP(rA, fetch());\n break;\n case 0x82: //SBCA imm\n rA = oSBC(rA, fetch());\n break;\n case 0x83: //SUBD imm\n setD(oSUB16(getD(),fetch16()));\n break;\n case 0x84: //ANDA imm\n rA = oAND(rA, fetch());\n break;\n case 0x85: //BITA imm\n oAND(rA, fetch());\n break;\n case 0x86: //LDA imm\n rA = fetch();\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0x88: //EORA imm\n rA = oEOR(rA, fetch());\n break;\n case 0x89: //ADCA imm\n rA = oADC(rA, fetch());\n break;\n case 0x8A: //ORA imm\n rA = oOR(rA, fetch());\n break;\n case 0x8B: //ADDA imm\n rA = oADD(rA, fetch());\n break;\n case 0x8C: //CMPX imm\n oCMP16(rX, fetch16());\n break;\n\n case 0x8D: //JSR imm\n addr = signed(fetch());\n PUSHW(PC);\n PC+=addr;\n break;\n case 0x8E: //LDX imm\n rX = fetch16();\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n\n\n case 0x90: //SUBA direct\n addr = dpadd();\n rA = oSUB(rA, byteAt(addr));\n break;\n case 0x91: //CMPA direct\n addr = dpadd();\n oCMP(rA, byteAt(addr));\n break;\n case 0x92: //SBCA direct\n addr = dpadd();\n rA = oSBC(rA, byteAt(addr));\n break;\n case 0x93: //SUBD direct\n addr = dpadd();\n setD(oSUB16(getD(),ReadWord(addr)));\n break;\n case 0x94: //ANDA direct\n addr = dpadd();\n rA = oAND(rA, byteAt(addr));\n break;\n case 0x95: //BITA direct\n addr = dpadd();\n oAND(rA, byteAt(addr));\n break;\n case 0x96: //LDA direct\n addr = dpadd();\n rA = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0x97: //STA direct\n addr = dpadd();\n byteTo(addr,rA);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0x98: //EORA direct\n addr = dpadd();\n rA = oEOR(rA, byteAt(addr));\n break;\n case 0x99: //ADCA direct\n addr = dpadd();\n rA = oADC(rA, byteAt(addr));\n break;\n case 0x9A: //ORA direct\n addr = dpadd();\n rA = oOR(rA, byteAt(addr));\n break;\n case 0x9B: //ADDA direct\n addr = dpadd();\n rA = oADD(rA, byteAt(addr));\n break;\n case 0x9C: //CMPX direct\n addr = dpadd();\n oCMP16(rX, ReadWord(addr));\n break;\n\n case 0x9D: //JSR direct\n addr = dpadd();\n PUSHW(PC);\n PC=addr;\n break;\n case 0x9E: //LDX direct\n addr = dpadd();\n rX = ReadWord(addr);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n case 0x9F: //STX direct\n addr = dpadd();\n WriteWord(addr,rX);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n case 0xA0: //SUBA indexed\n addr = PostByte();\n rA = oSUB(rA, byteAt(addr));\n break;\n case 0xA1: //CMPA indexed\n addr = PostByte();\n oCMP(rA, byteAt(addr));\n break;\n case 0xA2: //SBCA indexed\n addr = PostByte();\n rA = oSBC(rA, byteAt(addr));\n break;\n case 0xA3: //SUBD indexed\n addr = PostByte();\n setD(oSUB16(getD(),ReadWord(addr)));\n break;\n case 0xA4: //ANDA indexed\n addr = PostByte();\n rA = oAND(rA, byteAt(addr));\n break;\n case 0xA5: //BITA indexed\n addr = PostByte();\n oAND(rA, byteAt(addr));\n break;\n case 0xA6: //LDA indexed\n addr = PostByte();\n rA = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0xA7: //STA indexed\n addr = PostByte();\n byteTo(addr,rA);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0xA8: //EORA indexed\n addr = PostByte();\n rA = oEOR(rA, byteAt(addr));\n break;\n case 0xA9: //ADCA indexed\n addr = PostByte();\n rA = oADC(rA, byteAt(addr));\n break;\n case 0xAA: //ORA indexed\n addr = PostByte();\n rA = oOR(rA, byteAt(addr));\n break;\n case 0xAB: //ADDA indexed\n addr = PostByte();\n rA = oADD(rA, byteAt(addr));\n break;\n case 0xAC: //CMPX indexed\n addr = PostByte();\n oCMP16(rX, ReadWord(addr));\n break;\n\n case 0xAD: //JSR indexed\n addr = PostByte();\n PUSHW(PC);\n PC=addr;\n break;\n case 0xAE: //LDX indexed\n addr = PostByte();\n rX = ReadWord(addr);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n case 0xAF: //STX indexed\n addr = PostByte();\n WriteWord(addr,rX);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n\n\n case 0xB0: //SUBA extended\n addr = fetch16();\n rA = oSUB(rA, byteAt(addr));\n break;\n case 0xB1: //CMPA extended\n addr = fetch16();\n oCMP(rA, byteAt(addr));\n break;\n case 0xB2: //SBCA extended\n addr = fetch16();\n rA = oSBC(rA, byteAt(addr));\n break;\n case 0xB3: //SUBD extended\n addr = fetch16();\n setD(oSUB16(getD(),ReadWord(addr)));\n break;\n case 0xB4: //ANDA extended\n addr = fetch16();\n rA = oAND(rA, byteAt(addr));\n break;\n case 0xB5: //BITA extended\n addr = fetch16();\n oAND(rA, byteAt(addr));\n break;\n case 0xB6: //LDA extended\n addr = fetch16();\n rA = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0xB7: //STA extended\n addr = fetch16();\n byteTo(addr,rA);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rA];\n break;\n case 0xB8: //EORA extended\n addr = fetch16();\n rA = oEOR(rA, byteAt(addr));\n break;\n case 0xB9: //ADCA extended\n addr = fetch16();\n rA = oADC(rA, byteAt(addr));\n break;\n case 0xBA: //ORA extended\n addr = fetch16();\n rA = oOR(rA, byteAt(addr));\n break;\n case 0xBB: //ADDA extended\n addr = fetch16();\n rA = oADD(rA, byteAt(addr));\n break;\n case 0xBC: //CMPX extended\n addr = fetch16();\n oCMP16(rX, ReadWord(addr));\n break;\n\n case 0xBD: //JSR extended\n addr = fetch16();\n PUSHW(PC);\n PC=addr;\n break;\n case 0xBE: //LDX extended\n addr = fetch16();\n rX = ReadWord(addr);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n case 0xBF: //STX extended\n addr = fetch16();\n WriteWord(addr,rX);\n flagsNZ16(rX);\n CC&=~F_OVERFLOW;\n break;\n\n //Regs B, Y\n\n case 0xC0: //SUBB imm\n rB = oSUB(rB, fetch());\n break;\n case 0xC1: //CMPB imm\n oCMP(rB, fetch());\n break;\n case 0xC2: //SBCB imm\n rB = oSBC(rB, fetch());\n break;\n case 0xC3: //ADDD imm\n setD(oADD16(getD(),fetch16()));\n break;\n case 0xC4: //ANDB imm\n rB = oAND(rB, fetch());\n break;\n case 0xC5: //BITB imm\n oAND(rB, fetch());\n break;\n case 0xC6: //LDB imm\n rB = fetch();\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xC8: //EORB imm\n rB = oEOR(rB, fetch());\n break;\n case 0xC9: //ADCB imm\n rB = oADC(rB, fetch());\n break;\n case 0xCA: //ORB imm\n rB = oOR(rB, fetch());\n break;\n case 0xCB: //ADDB imm\n rB = oADD(rB, fetch());\n break;\n case 0xCC: //LDD imm\n addr = fetch16();\n setD(addr);\n flagsNZ16(addr);\n CC&=~F_OVERFLOW;\n break;\n\n case 0xCE: //LDU imm\n rU = fetch16();\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n\n\n case 0xD0: //SUBB direct\n addr = dpadd();\n rB = oSUB(rB, byteAt(addr));\n break;\n case 0xD1: //CMPB direct\n addr = dpadd();\n oCMP(rB, byteAt(addr));\n break;\n case 0xD2: //SBCB direct\n addr = dpadd();\n rB = oSBC(rB, byteAt(addr));\n break;\n case 0xD3: //ADDD direct\n addr = dpadd();\n setD(oADD16(getD(),ReadWord(addr)));\n break;\n case 0xD4: //ANDB direct\n addr = dpadd();\n rB = oAND(rB, byteAt(addr));\n break;\n case 0xD5: //BITB direct\n addr = dpadd();\n oAND(rB, byteAt(addr));\n break;\n case 0xD6: //LDB direct\n addr = dpadd();\n rB = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xD7: //STB direct\n addr = dpadd();\n byteTo(addr,rB);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xD8: //EORB direct\n addr = dpadd();\n rB = oEOR(rB, byteAt(addr));\n break;\n case 0xD9: //ADCB direct\n addr = dpadd();\n rB = oADC(rB, byteAt(addr));\n break;\n case 0xDA: //ORB direct\n addr = dpadd();\n rB = oOR(rB, byteAt(addr));\n break;\n case 0xDB: //ADDB direct\n addr = dpadd();\n rB = oADD(rB, byteAt(addr));\n break;\n case 0xDC: //LDD direct\n addr = dpadd();\n pb = ReadWord(addr);\n setD(pb);\n flagsNZ16(pb);\n CC&=~F_OVERFLOW;\n break;\n\n case 0xDD: //STD direct\n addr = dpadd();\n WriteWord(addr, getD());\n CC&=~F_OVERFLOW;\n break;\n case 0xDE: //LDU direct\n addr = dpadd();\n rU = ReadWord(addr);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n case 0xDF: //STU direct\n addr = dpadd();\n WriteWord(addr,rU);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n case 0xE0: //SUBB indexed\n addr = PostByte();\n rB = oSUB(rB, byteAt(addr));\n break;\n case 0xE1: //CMPB indexed\n addr = PostByte();\n oCMP(rB, byteAt(addr));\n break;\n case 0xE2: //SBCB indexed\n addr = PostByte();\n rB = oSBC(rB, byteAt(addr));\n break;\n case 0xE3: //ADDD indexed\n addr = PostByte();\n setD(oADD16(getD(),ReadWord(addr)));\n break;\n case 0xE4: //ANDB indexed\n addr = PostByte();\n rB = oAND(rB, byteAt(addr));\n break;\n case 0xE5: //BITB indexed\n addr = PostByte();\n oAND(rB, byteAt(addr));\n break;\n case 0xE6: //LDB indexed\n addr = PostByte();\n rB = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xE7: //STB indexed\n addr = PostByte();\n byteTo(addr,rB);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xE8: //EORB indexed\n addr = PostByte();\n rB = oEOR(rB, byteAt(addr));\n break;\n case 0xE9: //ADCB indexed\n addr = PostByte();\n rB = oADC(rB, byteAt(addr));\n break;\n case 0xEA: //ORB indexed\n addr = PostByte();\n rB = oOR(rB, byteAt(addr));\n break;\n case 0xEB: //ADDB indexed\n addr = PostByte();\n rB = oADD(rB, byteAt(addr));\n break;\n case 0xEC: //LDD indexed\n addr = PostByte();\n pb = ReadWord(addr);\n setD(pb);\n flagsNZ16(pb);\n CC&=~F_OVERFLOW;\n break;\n\n case 0xED: //STD indexed\n addr = PostByte();\n WriteWord(addr, getD());\n CC&=~F_OVERFLOW;\n break;\n case 0xEE: //LDU indexed\n addr = PostByte();\n rU = ReadWord(addr);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n case 0xEF: //STU indexed\n addr = PostByte();\n WriteWord(addr,rU);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n\n\n case 0xF0: //SUBB extended\n addr = fetch16();\n rB = oSUB(rB, byteAt(addr));\n break;\n case 0xF1: //CMPB extended\n addr = fetch16();\n oCMP(rB, byteAt(addr));\n break;\n case 0xF2: //SBCB extended\n addr = fetch16();\n rB = oSBC(rB, byteAt(addr));\n break;\n case 0xF3: //ADDD extended\n addr = fetch16();\n setD(oADD16(getD(),ReadWord(addr)));\n break;\n case 0xF4: //ANDB extended\n addr = fetch16();\n rB = oAND(rB, byteAt(addr));\n break;\n case 0xF5: //BITB extended\n addr = fetch16();\n oAND(rB, byteAt(addr));\n break;\n case 0xF6: //LDB extended\n addr = fetch16();\n rB = byteAt(addr);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xF7: //STB extended\n addr = fetch16();\n byteTo(addr,rB);\n CC&=~(F_ZERO|F_NEGATIVE|F_OVERFLOW);\n CC |= flagsNZ[rB];\n break;\n case 0xF8: //EORB extended\n addr = fetch16();\n rB = oEOR(rB, byteAt(addr));\n break;\n case 0xF9: //ADCB extended\n addr = fetch16();\n rB = oADC(rB, byteAt(addr));\n break;\n case 0xFA: //ORB extended\n addr = fetch16();\n rB = oOR(rB, byteAt(addr));\n break;\n case 0xFB: //ADDB extended\n addr = fetch16();\n rB = oADD(rB, byteAt(addr));\n break;\n case 0xFC: //LDD extended\n addr = fetch16();\n pb = ReadWord(addr);\n setD(pb);\n flagsNZ16(pb);\n CC&=~F_OVERFLOW;\n break;\n\n case 0xFD: //STD extended\n addr = fetch16();\n WriteWord(addr, getD());\n CC&=~F_OVERFLOW;\n break;\n case 0xFE: //LDU extended\n addr = fetch16();\n rU = ReadWord(addr);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n case 0xFF: //STU extended\n addr = fetch16();\n WriteWord(addr,rU);\n flagsNZ16(rU);\n CC&=~F_OVERFLOW;\n break;\n\n // page 1\n case 0x10: //page 1\n {\n opcode = fetch();\n T+=cycles2[opcode];\n switch(opcode) {\n case 0x21: //BRN\n addr = signed16(fetch16());\n break;\n case 0x22: //BHI\n addr = signed16(fetch16());\n if (!(CC&(F_CARRY | F_ZERO))) PC += addr;\n break;\n case 0x23: //BLS\n addr = signed16(fetch16());\n if (CC&(F_CARRY | F_ZERO)) PC += addr;\n break;\n case 0x24: //BCC\n addr = signed16(fetch16());\n if (!(CC&F_CARRY)) PC += addr;\n break;\n case 0x25: //BCS\n addr = signed16(fetch16());\n if (CC&F_CARRY) PC += addr;\n break;\n case 0x26: //BNE\n addr = signed16(fetch16());\n if (!(CC&F_ZERO)) PC += addr;\n break;\n case 0x27: //BEQ\n addr = signed16(fetch16());\n if (CC&F_ZERO) PC += addr;\n break;\n case 0x28: //BVC\n addr = signed16(fetch16());\n if (!(CC&F_OVERFLOW)) PC += addr;\n break;\n case 0x29: //BVS\n addr = signed16(fetch16());\n if (CC&F_OVERFLOW) PC += addr;\n break;\n case 0x2A: //BPL\n addr = signed16(fetch16());\n if (!(CC&F_NEGATIVE)) PC += addr;\n break;\n case 0x2B: //BMI\n addr = signed16(fetch16());\n if (CC&F_NEGATIVE) PC += addr;\n break;\n case 0x2C: //BGE\n addr = signed16(fetch16());\n if (!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2))) PC += addr;\n break;\n case 0x2D: //BLT\n addr = signed16(fetch16());\n if ((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2)) PC += addr;\n break;\n case 0x2E: //BGT\n addr = signed16(fetch16());\n if (!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO))) PC += addr;\n break;\n case 0x2F: //BLE\n addr = signed16(fetch16());\n if ((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO)) PC += addr;\n break;\n case 0x3f: //SWI2\n CC |= F_ENTIRE;\n PUSHW(PC);\n PUSHW(rU);\n PUSHW(rY);\n PUSHW(rX);\n PUSHB(DP);\n PUSHB(rB);\n PUSHB(rA);\n PUSHB(CC);\n CC |= F_IRQMASK | F_FIRQMASK;\n PC = ReadWord(vecSWI2);\n break;\n case 0x83: //CMPD imm\n oCMP16(getD(),fetch16());\n break;\n case 0x8C: //CMPY imm\n oCMP16(rY,fetch16());\n break;\n case 0x8E: //LDY imm\n rY = fetch16();\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0x93: //CMPD direct\n addr = dpadd();\n oCMP16(getD(),ReadWord(addr));\n break;\n case 0x9C: //CMPY direct\n addr = dpadd();\n oCMP16(rY,ReadWord(addr));\n break;\n case 0x9E: //LDY direct\n addr = dpadd();\n rY = ReadWord(addr);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0x9F: //STY direct\n addr = dpadd();\n WriteWord(addr,rY);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xA3: //CMPD indexed\n addr = PostByte();\n oCMP16(getD(),ReadWord(addr));\n break;\n case 0xAC: //CMPY indexed\n addr = PostByte();\n oCMP16(rY,ReadWord(addr));\n break;\n case 0xAE: //LDY indexed\n addr = PostByte();\n rY = ReadWord(addr);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xAF: //STY indexed\n addr = PostByte();\n WriteWord(addr,rY);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xB3: //CMPD extended\n addr = fetch16();\n oCMP16(getD(),ReadWord(addr));\n break;\n case 0xBC: //CMPY extended\n addr = fetch16();\n oCMP16(rY,ReadWord(addr));\n break;\n case 0xBE: //LDY extended\n addr = fetch16();\n rY = ReadWord(addr);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xBF: //STY extended\n addr = fetch16();\n WriteWord(addr,rY);\n flagsNZ16(rY);\n CC&=~F_OVERFLOW;\n break;\n case 0xCE: //LDS imm\n rS = fetch16();\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xDE: //LDS direct\n addr = dpadd();\n rS = ReadWord(addr);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xDF: //STS direct\n addr = dpadd();\n WriteWord(addr,rS);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xEE: //LDS indexed\n addr = PostByte();\n rS = ReadWord(addr);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xEF: //STS indexed\n addr = PostByte();\n WriteWord(addr,rS);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xFE: //LDS extended\n addr = fetch16();\n rS = ReadWord(addr);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n case 0xFF: //STS extended\n addr = fetch16();\n WriteWord(addr,rS);\n flagsNZ16(rS);\n CC&=~F_OVERFLOW;\n break;\n }\n }\n break;\n // page 2\n case 0x11: //page 2\n {\n opcode = fetch();\n T+=cycles2[opcode];\n switch(opcode) {\n case 0x3f: //SWI3\n CC |= F_ENTIRE;\n PUSHW(PC);\n PUSHW(rU);\n PUSHW(rY);\n PUSHW(rX);\n PUSHB(DP);\n PUSHB(rB);\n PUSHB(rA);\n PUSHB(CC);\n CC |= F_IRQMASK | F_FIRQMASK;\n PC = ReadWord(vecSWI3);\n break;\n case 0x83: //CMPU imm\n oCMP16(rU, fetch16());\n break;\n case 0x8C: //CMPS imm\n oCMP16(rS, fetch16());\n break;\n case 0x93: //CMPU imm\n addr = dpadd();\n oCMP16(rU, ReadWord(addr));\n break;\n case 0x9C: //CMPS imm\n addr = dpadd();\n oCMP16(rS, ReadWord(addr));\n break;\n case 0xA3: //CMPU imm\n addr = PostByte();\n oCMP16(rU, ReadWord(addr));\n break;\n case 0xAC: //CMPS imm\n addr = PostByte();\n oCMP16(rS, ReadWord(addr));\n break;\n case 0xB3: //CMPU imm\n addr = fetch16();\n oCMP16(rU, ReadWord(addr));\n break;\n case 0xBC: //CMPS imm\n addr = fetch16();\n oCMP16(rS, ReadWord(addr));\n break;\n\n }\n }\n break;\n\n\n }\n\n rA &= 0xff;\n rB &= 0xff;\n CC &= 0xff;\n DP &= 0xff;\n rX &= 0xffff;\n rY &= 0xffff;\n rU &= 0xffff;\n rS &= 0xffff;\n PC &= 0xffff;\n return T-oldT;\n\n};\n\nvar reset = function(){\n PC = ReadWord(vecRESET);\n DP = 0;\n CC |= F_FIRQMASK | F_IRQMASK;\n T=0;\n rA=rB=DP=rX=rY=rU=rS=0;\n};\n\n//---------- Disassembler\n\n/*\nILLEGAL 0\nDIRECT 1\nINHERENT 2\nBRANCH_REL_16 3\nIMMEDIAT_8 4\nBRANCH_REL_8 5\nINDEXED 6\nEXTENDED 7\nIMMEDIAT_16 8\n\nPSHS 10\nPSHU 11\n\nEXG, TFR 20\n*/\nvar ds = [\n[2, 1,\"NEG\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[2, 1,\"COM\"],\n[2, 1,\"LSR\"],\n[1, 0,\"???\"],\n[2, 1,\"ROR\"],\n[2, 1,\"ASR\"],\n[2, 1,\"LSL\"],\n[2, 1,\"ROL\"],\n[2, 1,\"DEC\"],\n[1, 0,\"???\"],\n[2, 1,\"INC\"],\n[2, 1,\"TST\"],\n[2, 1,\"JMP\"],\n[2, 1,\"CLR\"],\n[1, 0,\"Prefix\"],\n[1, 0,\"Prefix\"],\n[1, 2,\"NOP\"],\n[1, 2,\"SYNC\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[3, 3,\"LBRA\"],\n[3, 3,\"LBSR\"],\n[1, 0,\"???\"],\n[1, 2,\"DAA\"],\n[2, 4,\"ORCC\"],\n[1, 0,\"???\"],\n[2, 4,\"ANDCC\"],\n[1, 2,\"SEX\"],\n[2, 20,\"EXG\"],\n[2, 20,\"TFR\"],\n[2, 5,\"BRA\"],\n[2, 5,\"BRN\"],\n[2, 5,\"BHI\"],\n[2, 5,\"BLS\"],\n[2, 5,\"BCC\"],\n[2, 5,\"BCS\"],\n[2, 5,\"BNE\"],\n[2, 5,\"BEQ\"],\n[2, 5,\"BVC\"],\n[2, 5,\"BVS\"],\n[2, 5,\"BPL\"],\n[2, 5,\"BMI\"],\n[2, 5,\"BGE\"],\n[2, 5,\"BLT\"],\n[2, 5,\"BGT\"],\n[2, 5,\"BLE\"],\n[2, 6,\"LEAX\"],\n[2, 6,\"LEAY\"],\n[2, 6,\"LEAS\"],\n[2, 6,\"LEAU\"],\n[2, 10,\"PSHS\"],\n[2, 10,\"PULS\"],\n[2, 11,\"PSHU\"],\n[2, 11,\"PULU\"],\n[1, 0,\"???\"],\n[1, 2,\"RTS\"],\n[1, 2,\"ABX\"],\n[1, 2,\"RTI\"],\n[2, 2,\"CWAI\"],\n[1, 2,\"MUL\"],\n[1, 2,\"RESET\"],\n[1, 2,\"SWI1\"],\n[1, 2,\"NEGA\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[1, 2,\"COMA\"],\n[1, 2,\"LSRA\"],\n[1, 0,\"???\"],\n[1, 2,\"RORA\"],\n[1, 2,\"ASRA\"],\n[1, 2,\"ASLA\"],\n[1, 2,\"ROLA\"],\n[1, 2,\"DECA\"],\n[1, 0,\"???\"],\n[1, 2,\"INCA\"],\n[1, 2,\"TSTA\"],\n[1, 0,\"???\"],\n[1, 2,\"CLRA\"],\n[1, 2,\"NEGB\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[1, 2,\"COMB\"],\n[1, 2,\"LSRB\"],\n[1, 0,\"???\"],\n[1, 2,\"RORB\"],\n[1, 2,\"ASRB\"],\n[1, 2,\"ASLB\"],\n[1, 2,\"ROLB\"],\n[1, 2,\"DECB\"],\n[1, 0,\"???\"],\n[1, 2,\"INCB\"],\n[1, 2,\"TSTB\"],\n[1, 0,\"???\"],\n[1, 2,\"CLRB\"],\n[2, 6,\"NEG\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[2, 6,\"COM\"],\n[2, 6,\"LSR\"],\n[1, 0,\"???\"],\n[2, 6,\"ROR\"],\n[2, 6,\"ASR\"],\n[2, 6,\"LSL\"],\n[2, 6,\"ROL\"],\n[2, 6,\"DEC\"],\n[1, 0,\"???\"],\n[2, 6,\"INC\"],\n[2, 6,\"TST\"],\n[2, 6,\"JMP\"],\n[2, 6,\"CLR\"],\n[3, 7,\"NEG\"],\n[1, 0,\"???\"],\n[1, 0,\"???\"],\n[3, 7,\"COM\"],\n[3, 7,\"LSR\"],\n[1, 0,\"???\"],\n[3, 7,\"ROR\"],\n[3, 7,\"ASR\"],\n[3, 7,\"LSL\"],\n[3, 7,\"ROL\"],\n[3, 7,\"DEC\"],\n[1, 0,\"???\"],\n[3, 7,\"INC\"],\n[3, 7,\"TST\"],\n[3, 7,\"JMP\"],\n[3, 7,\"CLR\"],\n[2, 4,\"SUBA\"],\n[2, 4,\"CMPA\"],\n[2, 4,\"SBCA\"],\n[3, 8,\"SUBD\"],\n[2, 4,\"ANDA\"],\n[2, 4,\"BITA\"],\n[2, 4,\"LDA\"],\n[1, 0,\"???\"],\n[2, 4,\"EORA\"],\n[2, 4,\"ADCA\"],\n[2, 4,\"ORA\"],\n[2, 4,\"ADDA\"],\n[3, 8,\"CMPX\"],\n[2, 5,\"BSR\"],\n[3, 8,\"LDX\"],\n[1, 0,\"???\"],\n[2, 1,\"SUBA\"],\n[2, 1,\"CMPA\"],\n[2, 1,\"SBCA\"],\n[2, 1,\"SUBd\"],\n[2, 1,\"ANDA\"],\n[2, 1,\"BITA\"],\n[2, 1,\"LDA\"],\n[2, 1,\"STA\"],\n[2, 1,\"EORA\"],\n[2, 1,\"ADCA\"],\n[2, 1,\"ORA\"],\n[2, 1,\"ADDA\"],\n[2, 1,\"CMPX\"],\n[2, 1,\"JSR\"],\n[2, 1,\"LDX\"],\n[2, 1,\"STX\"],\n[2, 6,\"SUBA\"],\n[2, 6,\"CMPA\"],\n[2, 6,\"SBCA\"],\n[2, 6,\"SUBD\"],\n[2, 6,\"ANDA\"],\n[2, 6,\"BITA\"],\n[2, 6,\"LDA\"],\n[2, 6,\"STA\"],\n[2, 6,\"EORA\"],\n[2, 6,\"ADCA\"],\n[2, 6,\"ORA\"],\n[2, 6,\"ADDA\"],\n[2, 6,\"CMPX\"],\n[2, 6,\"JSR\"],\n[2, 6,\"LDX\"],\n[2, 6,\"STX\"],\n[3, 7,\"SUBA\"],\n[3, 7,\"CMPA\"],\n[3, 7,\"SBCA\"],\n[3, 7,\"SUBD\"],\n[3, 7,\"ANDA\"],\n[3, 7,\"BITA\"],\n[3, 7,\"LDA\"],\n[3, 7,\"STA\"],\n[3, 7,\"EORA\"],\n[3, 7,\"ADCA\"],\n[3, 7,\"ORA\"],\n[3, 7,\"ADDA\"],\n[3, 7,\"CMPX\"],\n[3, 7,\"JSR\"],\n[3, 7,\"LDX\"],\n[3, 7,\"STX\"],\n[2, 4,\"SUBB\"],\n[2, 4,\"CMPB\"],\n[2, 4,\"SBCB\"],\n[3, 8,\"ADDD\"],\n[2, 4,\"ANDB\"],\n[2, 4,\"BITB\"],\n[2, 4,\"LDB\"],\n[1, 0,\"???\"],\n[2, 4,\"EORB\"],\n[2, 4,\"ADCB\"],\n[2, 4,\"ORB\"],\n[2, 4,\"ADDB\"],\n[3, 8,\"LDD\"],\n[1, 0,\"???\"],\n[3, 8,\"LDU\"],\n[1, 0,\"???\"],\n[2, 1,\"SUBB\"],\n[2, 1,\"CMPB\"],\n[2, 1,\"SBCB\"],\n[2, 1,\"ADDD\"],\n[2, 1,\"ANDB\"],\n[2, 1,\"BITB\"],\n[2, 1,\"LDB\"],\n[2, 1,\"STB\"],\n[2, 1,\"EORB\"],\n[2, 1,\"ADCB\"],\n[2, 1,\"ORB \"],\n[2, 1,\"ADDB\"],\n[2, 1,\"LDD \"],\n[2, 1,\"STD \"],\n[2, 1,\"LDU \"],\n[2, 1,\"STU \"],\n[2, 6,\"SUBB\"],\n[2, 6,\"CMPB\"],\n[2, 6,\"SBCB\"],\n[2, 6,\"ADDD\"],\n[2, 6,\"ANDB\"],\n[2, 6,\"BITB\"],\n[2, 6,\"LDB\"],\n[2, 6,\"STB\"],\n[2, 6,\"EORB\"],\n[2, 6,\"ADCB\"],\n[2, 6,\"ORB\"],\n[2, 6,\"ADDB\"],\n[2, 6,\"LDD\"],\n[2, 6,\"STD\"],\n[2, 6,\"LDU\"],\n[2, 6,\"STU\"],\n[3, 7,\"SUBB\"],\n[3, 7,\"CMPB\"],\n[3, 7,\"SBCB\"],\n[3, 7,\"ADDD\"],\n[3, 7,\"ANDB\"],\n[3, 7,\"BITB\"],\n[3, 7,\"LDB\"],\n[3, 7,\"STB\"],\n[3, 7,\"EORB\"],\n[3, 7,\"ADCB\"],\n[3, 7,\"ORB\"],\n[3, 7,\"ADDB\"],\n[3, 7,\"LDD\"],\n[3, 7,\"STD\"],\n[3, 7,\"LDU\"],\n[3, 7,\"STU\"]\n];\n\nvar ds11 = {\n0x3F: [2,2,\"SWI3\"],\n0x83: [4,8,\"CMPU\"],\n0x8C: [4,8,\"CMPS\"],\n0x93: [3,1,\"CMPU\"],\n0x9C: [3,1,\"CMPS\"],\n0xA3: [3,6,\"CMPU\"],\n0xAC: [3,6,\"CMPS\"],\n0xB3: [4,7,\"CMPU\"],\n0xBC: [4,7,\"CMPS\"]\n};\n\nvar ds10 = {\n0x21:[5,3,\"LBRN\"],\n0x22:[5,3,\"LBHI\"],\n0x23:[5,3,\"LBLS\"],\n0x24:[5,3,\"LBCC\"],\n0x25:[5,3,\"LBCS\"],\n0x26:[5,3,\"LBNE\"],\n0x27:[5,3,\"LBEQ\"],\n0x28:[5,3,\"LBVC\"],\n0x29:[5,3,\"LBVS\"],\n0x2a:[5,3,\"LBPL\"],\n0x2b:[5,3,\"LBMI\"],\n0x2c:[5,3,\"LBGE\"],\n0x2d:[5,3,\"LBLT\"],\n0x2e:[5,3,\"LBGT\"],\n0x2f:[5,3,\"LBLE\"],\n0x3F:[2,2,\"SWI2\"],\n0x83:[4,8,\"CMPD\"],\n0x8C:[4,8,\"CMPY\"],\n0x8E:[4,8,\"LDY\"],\n0x93:[3,1,\"CMPD\"],\n0x9C:[3,1,\"CMPY\"],\n0x9E:[3,1,\"LDY\"],\n0x9F:[3,1,\"STY\"],\n0xA3:[3,6,\"CMPD\"],\n0xAC:[3,6,\"CMPY\"],\n0xAE:[3,6,\"LDY\"],\n0xAF:[3,6,\"STY\"],\n0xB3:[4,7,\"CMPD\"],\n0xBC:[4,7,\"CMPY\"],\n0xBE:[4,7,\"LDY\"],\n0xBF:[4,7,\"STY\"],\n0xCE:[4,8,\"LDS\"],\n0xDE:[3,1,\"LDS\"],\n0xDF:[3,1,\"STS\"],\n0xEE:[3,6,\"LDS\"],\n0xEF:[3,6,\"STS\"],\n0xFE:[4,7,\"LDS\"],\n0xFF:[4,7,\"STS\"]\n};\n/*\nILLEGAL 0\nDIRECT 1\nINHERENT 2\nBRANCH_REL_16 3\nIMMEDIAT_8 4\nBRANCH_REL_8 5\nINDEXED 6\nEXTENDED 7\nIMMEDIAT_16 8\n*/\n\nvar disasm = function(i,a,b,c,d,pc) {\n var toHexN = function(n,d) {\n var s = n.toString(16);\n while (s.length >5];\n if (!(pb & 0x80)) {\n //direct5\n var disp = pb & 0x1f;\n if (disp>15) disp = disp-32;\n mnemo+=disp+','+ixr;\n break;\n }\n var ind = pb & 0x10;\n var mod = pb & 0x0f;\n var ofs8 = (b>127)?(b-256):b;\n var ofs16 = ((b*256+c)>32767)?((b*256+c)-65536):(b*256+c);\n if (!ind) {\n switch (mod) {\n case 0: mnemo += \",\"+ixr+'+'; break;\n case 1: mnemo += \",\"+ixr+'++'; break;\n case 2: mnemo += \",-\"+ixr; break;\n case 3: mnemo += \",--\"+ixr; break;\n case 4: mnemo += \",\"+ixr; break;\n case 5: mnemo += \"B,\"+ixr; break;\n case 6: mnemo += \"A,\"+ixr; break;\n case 7: mnemo += \"???\"; break;\n case 8: mnemo += ofs8+\",\"+ixr; bytes++; break;\n case 9: mnemo += ofs16+\",\"+ixr; bytes+=2; break;\n case 10: mnemo += \"???\"; break;\n case 11: mnemo += \"D,\"+ixr; break;\n case 12: mnemo += ofs8+\",PC\"; bytes++; break;\n case 13: mnemo += ofs16+\",PC\"; bytes+=2; break;\n case 14: mnemo += \"???\"; break;\n case 15: mnemo += \"$\"+toHex4((b*256+c)); bytes+=2; break;\n }\n } else {\n switch (mod) {\n case 0: mnemo += \"???\"; break;\n case 1: mnemo += \"[,\"+ixr+'++]'; break;\n case 2: mnemo += \"???\"; break;\n case 3: mnemo += \"[,--\"+ixr+']'; break;\n case 4: mnemo += \"[,\"+ixr+']'; break;\n case 5: mnemo += \"[B,\"+ixr+']'; break;\n case 6: mnemo += \"[A,\"+ixr+']'; break;\n case 7: mnemo += \"???\"; break;\n case 8: mnemo += \"[\"+ofs8+\",\"+ixr+']'; bytes++; break;\n case 9: mnemo += \"[\"+ofs16+\",\"+ixr+']'; bytes+=2; break;\n case 10: mnemo += \"???\"; break;\n case 11: mnemo += \"[D,\"+ixr+']'; break;\n case 12: mnemo += \"[\"+ofs8+\",PC]\"; bytes++; break;\n case 13: mnemo += \"[\"+ofs16+\",PC]\"; bytes+=2; break;\n case 14: mnemo += \"???\"; break;\n case 15: mnemo += \"[$\"+toHex4((b*256+c))+']'; bytes+=2; break;\n }\n }\n\n break;\n case 7: //extended\n mnemo+=\"\\t$\"+toHex4(a*256+b); break;\n case 8: //imm16\n mnemo+=\"\\t#$\"+toHex4(a*256+b); break;\n\n case 10: //pshs, puls\n rx = ['PC','U','Y','X','DP','B','A','CC'];\n ro = [];\n for (j=0;j<8;j++) {\n if ((a & 1)!==0) {ro.push(rx[7-j]);}\n a>>=1;\n }\n mnemo += '\\t'+ro.join(',');\n break;\n case 11: //pshs, puls\n rx = ['PC','S','Y','X','DP','B','A','CC'];\n ro = [];\n for (j=0;j<8;j++) {\n if ((a & 1)!==0) {ro.push(rx[7-j]);}\n a>>=1;\n }\n mnemo += '\\t'+ro.join(',');\n break;\n case 20: //TFR etc\n rx = ['D','X','Y','U','S','PC','?','?','A','B','CC','DP','?','?','?','?'];\n mnemo += '\\t'+rx[a>>4]+','+rx[a&0x0f];\n break;\n }\n\n return {line:mnemo,nbytes:bytes};\n };\n\n\n//---------- Exports\n\nreturn {\n steps: function(Ts){\n //T=0;\n while (Ts>0){\n Ts-=step();\n }\n },\n runFrame: function(Tt){\n while (T>i);\n if (n===0) {f+=fx[i].toLowerCase();} else {f+=fx[i];}\n }\n return f;\n },\n disasm: disasm,\n isStable: function() { return true; }\n};\n\n};\n", "\nimport { CPU, Bus, ClockBased, SavesState, Interruptable } from \"../devices\";\n\n// Copyright 2015 by Paulo Augusto Peccin. See license.txt distributed with this file.\n\nexport var _MOS6502 = function() {\n var self = this;\n\n this.powerOn = function() {\n this.reset();\n };\n\n this.powerOff = function() {\n };\n\n this.clockPulse = function() {\n if (!RDY) return; // TODO Should be ignored in the last cycle of the instruction\n T++;\n instruction[T]();\n };\n\n this.connectBus = function(aBus) {\n bus = aBus;\n };\n\n this.setRDY = function(boo) {\n RDY = boo;\n };\n\n this.isRDY = function() {\n return RDY;\n }\n\n this.reset = function() {\n I = 1;\n T = -1;\n instruction = [ fetchOpcodeAndDecodeInstruction ]; // Bootstrap instruction\n PC = bus.read(RESET_VECTOR) | (bus.read(RESET_VECTOR + 1) << 8);\n this.setRDY(true);\n };\n\n // Interfaces\n var bus : Bus;\n var RDY : boolean = false;\n\n // Registers\n var PC : number = 0;\n var SP : number = 0;\n var A : number = 0;\n var X : number = 0;\n var Y : number = 0;\n\n // Status Bits\n var N : number = 0;\n var V : number = 0;\n var D : number = 0;\n var I : number = 0;\n var Z : number = 0;\n var C : number = 0;\n\n // Internal decoding registers\n var T : number = -1;\n var opcode : number = -1;\n var instruction : (() => void)[];\n var data : number = 0;\n var AD : number = 0;\n var BA : number = 0;\n var BALCrossed : boolean = false;\n var IA : number = 0;\n var branchOffset : number = 0;\n var branchOffsetCrossAdjust : number = 0;\n\n // Vectors\n const NMI_VECTOR = 0xfffa;\n const RESET_VECTOR = 0xfffc;\n const IRQ_VECTOR = 0xfffe;\n\n // Index registers names\n const rX = 0;\n const rY = 1;\n\n // Status bits names\n const bN = 7;\n const bV = 6;\n // const bE = 5;\t// Not used\n // const bB = 4;\t// Not used\n // const bD = 3; // Not used\n // const bI = 2; // Not used\n const bZ = 1;\n const bC = 0;\n\n // Auxiliary variables\n // TODO\n //noinspection JSUnusedGlobalSymbols\n this.debug = false;\n //noinspection JSUnusedGlobalSymbols\n this.trace = false;\n\n\n // Internal operations\n\n var fetchOpcodeAndDecodeInstruction = function() {\n opcode = bus.read(PC);\n instruction = instructions[opcode];\n T = 0;\n\n // if (self.trace) self.breakpoint(\"TRACE\");\n // console.log(\"PC: \" + PC + \", op: \" + opcode + \": \" + opcodes[opcode]);\n\n PC++;\n };\n\n var fetchNextOpcode = fetchOpcodeAndDecodeInstruction;\n\n var fetchOpcodeAndDiscard = function() {\n bus.read(PC);\n };\n\n var fetchBranchOffset = function() {\n branchOffset = bus.read(PC);\n PC++;\n };\n\n var fetchADL = function() {\n AD = bus.read(PC);\n PC++;\n };\n\n var fetchADH = function() {\n AD |= bus.read(PC) << 8;\n PC++;\n };\n\n var fetchADLFromBA = function() {\n AD = bus.read(BA);\n };\n\n var fetchADHFromBA = function() {\n AD |= bus.read(BA) << 8;\n };\n\n var fetchBAL = function() {\n BA = bus.read(PC);\n PC++;\n };\n\n var fetchBAH = function() {\n BA |= bus.read(PC) << 8;\n PC++;\n };\n\n var fetchBALFromIA = function() {\n BA = bus.read(IA);\n };\n\n var fetchBAHFromIA = function() {\n BA |= bus.read(IA) << 8;\n };\n\n var addXtoBAL = function() {\n var low = (BA & 255) + X;\n BALCrossed = low > 255;\n BA = (BA & 0xff00) | (low & 255);\n };\n\n var addYtoBAL = function() {\n var low = (BA & 255) + Y;\n BALCrossed = low > 255;\n BA = (BA & 0xff00) | (low & 255);\n };\n\n var add1toBAL = function() {\n var low = (BA & 255) + 1;\n BALCrossed = low > 255;\n BA = (BA & 0xff00) | (low & 255);\n };\n\n var add1toBAHifBALCrossed = function() {\n if (BALCrossed)\n BA = (BA + 0x0100) & 0xffff;\n };\n\n var fetchIAL = function() {\n IA = bus.read(PC);\n PC++;\n };\n\n var fetchIAH = function() {\n IA |= bus.read(PC) << 8;\n PC++;\n };\n\n var add1toIAL = function() {\n var low = (IA & 255) + 1;\n IA = (IA & 0xff00) | (low & 255);\n };\n\n var fetchDataFromImmediate = function() {\n data = bus.read(PC);\n PC++;\n };\n\n var fetchDataFromAD = function() {\n data = bus.read(AD);\n };\n\n var fetchDataFromBA = function() {\n data = bus.read(BA);\n };\n\n var writeDataToAD = function() {\n bus.write(AD, data);\n };\n\n var writeDataToBA = function() {\n bus.write(BA, data);\n };\n\n var addBranchOffsetToPCL = function() {\n var oldLow = (PC & 0x00ff);\n var newLow = (oldLow + branchOffset) & 255;\n // Negative offset?\n if (branchOffset > 127)\n branchOffsetCrossAdjust = (newLow > oldLow) ? -0x0100 : 0;\n else\n branchOffsetCrossAdjust = (newLow < oldLow) ? 0x0100 : 0;\n PC = (PC & 0xff00) | newLow;\n };\n\n var adjustPCHForBranchOffsetCross = function() {\n PC = (PC + branchOffsetCrossAdjust) & 0xffff;\n };\n\n var setZ = function(val) {\n Z = (val === 0) ? 1 : 0;\n };\n\n var setN = function(val) {\n N = (val & 0x080) ? 1 : 0;\n };\n\n var setV = function(boo) {\n V = boo ? 1 : 0;\n };\n\n var setC = function(boo) {\n C = boo ? 1 : 0;\n };\n\n var popFromStack = function() {\n SP = (SP + 1) & 255;\n return bus.read(0x0100 + SP);\n };\n\n var peekFromStack = function() {\n return bus.read(0x0100 + SP);\n };\n\n var pushToStack = function(val) {\n bus.write(0x0100 + SP, val);\n SP = (SP - 1) & 255;\n };\n\n var getStatusBits = function() {\n return N << 7 | V << 6 | 0x30 // Always push with E (bit 5) and B (bit 4) ON\n | D << 3 | I << 2 | Z << 1 | C;\n };\n\n var setStatusBits = function(val) {\n N = val >>> 7; V = val >>> 6 & 1; // E and B flags actually do not exist as real flags, so ignore\n D = val >>> 3 & 1; I = val >>> 2 & 1; Z = val >>> 1 & 1; C = val & 1;\n };\n\n var illegalOpcode = function(op) {\n if (self.debug) self.breakpoint(\"Illegal Opcode: \" + op);\n };\n\n\n // Addressing routines\n\n var implied = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var immediateRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchDataFromImmediate,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var zeroPageRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL, // ADH will be zero\n fetchDataFromAD,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var absoluteRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n fetchADH,\n fetchDataFromAD,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var indirectXRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addXtoBAL();\n fetchADLFromBA();\n },\n function() {\n add1toBAL();\n fetchADHFromBA();\n },\n fetchDataFromAD,\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var absoluteIndexedRead = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL,\n fetchBAH,\n function() {\n addIndex();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n function() {\n if (BALCrossed) {\n fetchDataFromBA();\n } else {\n operation();\n fetchNextOpcode();\n }\n },\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n };\n\n var zeroPageIndexedRead = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addIndex();\n fetchDataFromBA();\n },\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n };\n\n var indirectYRead = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchIAL, // IAH will be zero\n fetchBALFromIA,\n function() {\n add1toIAL();\n fetchBAHFromIA();\n },\n function() {\n addYtoBAL();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n function() {\n if(BALCrossed) {\n fetchDataFromBA();\n } else {\n operation();\n fetchNextOpcode();\n }\n },\n function() {\n operation();\n fetchNextOpcode();\n }\n ];\n };\n\n var zeroPageWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL, // ADH will be zero\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var absoluteWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n fetchADH,\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var indirectXWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addXtoBAL();\n fetchADLFromBA();\n },\n function() {\n add1toBAL();\n fetchADHFromBA();\n },\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var absoluteIndexedWrite = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL,\n fetchBAH,\n function() {\n addIndex();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n function() {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n };\n\n var zeroPageIndexedWrite = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addIndex();\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n };\n\n var indirectYWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchIAL, // IAH will be zero\n fetchBALFromIA,\n function() {\n add1toIAL();\n fetchBAHFromIA();\n },\n function() {\n addYtoBAL();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n function() {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n\n\n var zeroPageReadModifyWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL, // ADH will be zero\n fetchDataFromAD,\n writeDataToAD,\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var absoluteReadModifyWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n fetchADH,\n fetchDataFromAD,\n writeDataToAD,\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var zeroPageIndexedReadModifyWrite = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function () {\n addIndex();\n fetchDataFromBA();\n },\n writeDataToBA,\n function () {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n };\n\n var absoluteIndexedReadModifyWrite = function(index) {\n var addIndex = index === rX ? addXtoBAL : addYtoBAL;\n return function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL,\n fetchBAH,\n function () {\n addIndex();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n fetchDataFromBA,\n writeDataToBA,\n function () {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n };\n\n var indirectXReadModifyWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBAL, // BAH will be zero\n fetchDataFromBA,\n function() {\n addXtoBAL();\n fetchADLFromBA();\n },\n function() {\n add1toBAL();\n fetchADHFromBA();\n },\n fetchDataFromAD,\n writeDataToAD,\n function() {\n operation();\n writeDataToAD();\n },\n fetchNextOpcode\n ];\n };\n\n var indirectYReadModifyWrite = function(operation) {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchIAL, // IAH will be zero\n fetchBALFromIA,\n function() {\n add1toIAL();\n fetchBAHFromIA();\n },\n function() {\n addYtoBAL();\n fetchDataFromBA();\n add1toBAHifBALCrossed();\n },\n fetchDataFromBA,\n writeDataToBA,\n function() {\n operation();\n writeDataToBA();\n },\n fetchNextOpcode\n ];\n };\n\n\n // Instructions ========================================================================================\n\n // Complete instruction set\n var opcodes = new Array(256);\n var instructions = new Array(256);\n\n opcodes[0x00] = \"BRK\"; instructions[0x00] = BRK();\n opcodes[0x01] = \"ORA\"; instructions[0x01] = ORA(indirectXRead);\n opcodes[0x02] = \"uKIL\"; instructions[0x02] = uKIL();\n opcodes[0x03] = \"uSLO\"; instructions[0x03] = uSLO(indirectXReadModifyWrite);\n opcodes[0x04] = \"uNOP\"; instructions[0x04] = uNOP(zeroPageRead);\n opcodes[0x05] = \"ORA\"; instructions[0x05] = ORA(zeroPageRead);\n opcodes[0x06] = \"ASL\"; instructions[0x06] = ASL(zeroPageReadModifyWrite);\n opcodes[0x07] = \"uSLO\"; instructions[0x07] = uSLO(zeroPageReadModifyWrite);\n opcodes[0x08] = \"PHP\"; instructions[0x08] = PHP();\n opcodes[0x09] = \"ORA\"; instructions[0x09] = ORA(immediateRead);\n opcodes[0x0a] = \"ASL\"; instructions[0x0a] = ASL_ACC();\n opcodes[0x0b] = \"uANC\"; instructions[0x0b] = uANC(immediateRead);\n opcodes[0x0c] = \"uNOP\"; instructions[0x0c] = uNOP(absoluteRead);\n opcodes[0x0d] = \"ORA\"; instructions[0x0d] = ORA(absoluteRead);\n opcodes[0x0e] = \"ASL\"; instructions[0x0e] = ASL(absoluteReadModifyWrite);\n opcodes[0x0f] = \"uSLO\"; instructions[0x0f] = uSLO(absoluteReadModifyWrite);\n opcodes[0x10] = \"BPL\"; instructions[0x10] = Bxx(bN, 0); // BPL\n opcodes[0x11] = \"ORA\"; instructions[0x11] = ORA(indirectYRead);\n opcodes[0x12] = \"uKIL\"; instructions[0x12] = uKIL();\n opcodes[0x13] = \"uSLO\"; instructions[0x13] = uSLO(indirectYReadModifyWrite);\n opcodes[0x14] = \"uNOP\"; instructions[0x14] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0x15] = \"ORA\"; instructions[0x15] = ORA(zeroPageIndexedRead(rX));\n opcodes[0x16] = \"ASL\"; instructions[0x16] = ASL(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x17] = \"uSLO\"; instructions[0x17] = uSLO(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x18] = \"CLC\"; instructions[0x18] = CLC();\n opcodes[0x19] = \"ORA\"; instructions[0x19] = ORA(absoluteIndexedRead(rY));\n opcodes[0x1a] = \"uNOP\"; instructions[0x1a] = uNOP(implied);\n opcodes[0x1b] = \"uSLO\"; instructions[0x1b] = uSLO(absoluteIndexedReadModifyWrite(rY));\n opcodes[0x1c] = \"uNOP\"; instructions[0x1c] = uNOP(absoluteIndexedRead(rX));\n opcodes[0x1d] = \"ORA\"; instructions[0x1d] = ORA(absoluteIndexedRead(rX));\n opcodes[0x1e] = \"ASL\"; instructions[0x1e] = ASL(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x1f] = \"uSLO\"; instructions[0x1f] = uSLO(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x20] = \"JSR\"; instructions[0x20] = JSR();\n opcodes[0x21] = \"AND\"; instructions[0x21] = AND(indirectXRead);\n opcodes[0x22] = \"uKIL\"; instructions[0x22] = uKIL();\n opcodes[0x23] = \"uRLA\"; instructions[0x23] = uRLA(indirectXReadModifyWrite);\n opcodes[0x24] = \"BIT\"; instructions[0x24] = BIT(zeroPageRead);\n opcodes[0x25] = \"AND\"; instructions[0x25] = AND(zeroPageRead);\n opcodes[0x26] = \"ROL\"; instructions[0x26] = ROL(zeroPageReadModifyWrite);\n opcodes[0x27] = \"uRLA\"; instructions[0x27] = uRLA(zeroPageReadModifyWrite);\n opcodes[0x28] = \"PLP\"; instructions[0x28] = PLP();\n opcodes[0x29] = \"AND\"; instructions[0x29] = AND(immediateRead);\n opcodes[0x2a] = \"ROL\"; instructions[0x2a] = ROL_ACC();\n opcodes[0x2b] = \"uANC\"; instructions[0x2b] = uANC(immediateRead);\n opcodes[0x2c] = \"BIT\"; instructions[0x2c] = BIT(absoluteRead);\n opcodes[0x2d] = \"AND\"; instructions[0x2d] = AND(absoluteRead);\n opcodes[0x2e] = \"ROL\"; instructions[0x2e] = ROL(absoluteReadModifyWrite);\n opcodes[0x2f] = \"uRLA\"; instructions[0x2f] = uRLA(absoluteReadModifyWrite);\n opcodes[0x30] = \"BMI\"; instructions[0x30] = Bxx(bN, 1); // BMI\n opcodes[0x31] = \"AND\"; instructions[0x31] = AND(indirectYRead);\n opcodes[0x32] = \"uKIL\"; instructions[0x32] = uKIL();\n opcodes[0x33] = \"uRLA\"; instructions[0x33] = uRLA(indirectYReadModifyWrite);\n opcodes[0x34] = \"uNOP\"; instructions[0x34] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0x35] = \"AND\"; instructions[0x35] = AND(zeroPageIndexedRead(rX));\n opcodes[0x36] = \"ROL\"; instructions[0x36] = ROL(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x37] = \"uRLA\"; instructions[0x37] = uRLA(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x38] = \"SEC\"; instructions[0x38] = SEC();\n opcodes[0x39] = \"AND\"; instructions[0x39] = AND(absoluteIndexedRead(rY));\n opcodes[0x3a] = \"uNOP\"; instructions[0x3a] = uNOP(implied);\n opcodes[0x3b] = \"uRLA\"; instructions[0x3b] = uRLA(absoluteIndexedReadModifyWrite(rY));\n opcodes[0x3c] = \"uNOP\"; instructions[0x3c] = uNOP(absoluteIndexedRead(rX));\n opcodes[0x3d] = \"AND\"; instructions[0x3d] = AND(absoluteIndexedRead(rX));\n opcodes[0x3e] = \"ROL\"; instructions[0x3e] = ROL(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x3f] = \"uRLA\"; instructions[0x3f] = uRLA(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x40] = \"RTI\"; instructions[0x40] = RTI();\n opcodes[0x41] = \"EOR\"; instructions[0x41] = EOR(indirectXRead);\n opcodes[0x42] = \"uKIL\"; instructions[0x42] = uKIL();\n opcodes[0x43] = \"uSRE\"; instructions[0x43] = uSRE(indirectXReadModifyWrite);\n opcodes[0x44] = \"uNOP\"; instructions[0x44] = uNOP(zeroPageRead);\n opcodes[0x45] = \"EOR\"; instructions[0x45] = EOR(zeroPageRead);\n opcodes[0x46] = \"LSR\"; instructions[0x46] = LSR(zeroPageReadModifyWrite);\n opcodes[0x47] = \"uSRE\"; instructions[0x47] = uSRE(zeroPageReadModifyWrite);\n opcodes[0x48] = \"PHA\"; instructions[0x48] = PHA();\n opcodes[0x49] = \"EOR\"; instructions[0x49] = EOR(immediateRead);\n opcodes[0x4a] = \"LSR\"; instructions[0x4a] = LSR_ACC();\n opcodes[0x4b] = \"uASR\"; instructions[0x4b] = uASR(immediateRead);\n opcodes[0x4c] = \"JMP\"; instructions[0x4c] = JMP_ABS();\n opcodes[0x4d] = \"EOR\"; instructions[0x4d] = EOR(absoluteRead);\n opcodes[0x4e] = \"LSR\"; instructions[0x4e] = LSR(absoluteReadModifyWrite);\n opcodes[0x4f] = \"uSRE\"; instructions[0x4f] = uSRE(absoluteReadModifyWrite);\n opcodes[0x50] = \"BVC\"; instructions[0x50] = Bxx(bV, 0); // BVC\n opcodes[0x51] = \"EOR\"; instructions[0x51] = EOR(indirectYRead);\n opcodes[0x52] = \"uKIL\"; instructions[0x52] = uKIL();\n opcodes[0x53] = \"uSRE\"; instructions[0x53] = uSRE(indirectYReadModifyWrite);\n opcodes[0x54] = \"uNOP\"; instructions[0x54] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0x55] = \"EOR\"; instructions[0x55] = EOR(zeroPageIndexedRead(rX));\n opcodes[0x56] = \"LSR\"; instructions[0x56] = LSR(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x57] = \"uSRE\"; instructions[0x57] = uSRE(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x58] = \"CLI\"; instructions[0x58] = CLI();\n opcodes[0x59] = \"EOR\"; instructions[0x59] = EOR(absoluteIndexedRead(rY));\n opcodes[0x5a] = \"uNOP\"; instructions[0x5a] = uNOP(implied);\n opcodes[0x5b] = \"uSRE\"; instructions[0x5b] = uSRE(absoluteIndexedReadModifyWrite(rY));\n opcodes[0x5c] = \"uNOP\"; instructions[0x5c] = uNOP(absoluteIndexedRead(rX));\n opcodes[0x5d] = \"EOR\"; instructions[0x5d] = EOR(absoluteIndexedRead(rX));\n opcodes[0x5e] = \"LSR\"; instructions[0x5e] = LSR(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x5f] = \"uSRE\"; instructions[0x5f] = uSRE(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x60] = \"RTS\"; instructions[0x60] = RTS();\n opcodes[0x61] = \"ADC\"; instructions[0x61] = ADC(indirectXRead);\n opcodes[0x62] = \"uKIL\"; instructions[0x62] = uKIL();\n opcodes[0x63] = \"uRRA\"; instructions[0x63] = uRRA(indirectXReadModifyWrite);\n opcodes[0x64] = \"uNOP\"; instructions[0x64] = uNOP(zeroPageRead);\n opcodes[0x65] = \"ADC\"; instructions[0x65] = ADC(zeroPageRead);\n opcodes[0x66] = \"ROR\"; instructions[0x66] = ROR(zeroPageReadModifyWrite);\n opcodes[0x67] = \"uRRA\"; instructions[0x67] = uRRA(zeroPageReadModifyWrite);\n opcodes[0x68] = \"PLA\"; instructions[0x68] = PLA();\n opcodes[0x69] = \"ADC\"; instructions[0x69] = ADC(immediateRead);\n opcodes[0x6a] = \"ROR\"; instructions[0x6a] = ROR_ACC();\n opcodes[0x6b] = \"uARR\"; instructions[0x6b] = uARR(immediateRead);\n opcodes[0x6c] = \"JMP\"; instructions[0x6c] = JMP_IND();\n opcodes[0x6d] = \"ADC\"; instructions[0x6d] = ADC(absoluteRead);\n opcodes[0x6e] = \"ROR\"; instructions[0x6e] = ROR(absoluteReadModifyWrite);\n opcodes[0x6f] = \"uRRA\"; instructions[0x6f] = uRRA(absoluteReadModifyWrite);\n opcodes[0x70] = \"BVS\"; instructions[0x70] = Bxx(bV, 1); // BVS\n opcodes[0x71] = \"ADC\"; instructions[0x71] = ADC(indirectYRead);\n opcodes[0x72] = \"uKIL\"; instructions[0x72] = uKIL();\n opcodes[0x73] = \"uRRA\"; instructions[0x73] = uRRA(indirectYReadModifyWrite);\n opcodes[0x74] = \"uNOP\"; instructions[0x74] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0x75] = \"ADC\"; instructions[0x75] = ADC(zeroPageIndexedRead(rX));\n opcodes[0x76] = \"ROR\"; instructions[0x76] = ROR(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x77] = \"uRRA\"; instructions[0x77] = uRRA(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0x78] = \"SEI\"; instructions[0x78] = SEI();\n opcodes[0x79] = \"ADC\"; instructions[0x79] = ADC(absoluteIndexedRead(rY));\n opcodes[0x7a] = \"uNOP\"; instructions[0x7a] = uNOP(implied);\n opcodes[0x7b] = \"uRRA\"; instructions[0x7b] = uRRA(absoluteIndexedReadModifyWrite(rY));\n opcodes[0x7c] = \"uNOP\"; instructions[0x7c] = uNOP(absoluteIndexedRead(rX));\n opcodes[0x7d] = \"ADC\"; instructions[0x7d] = ADC(absoluteIndexedRead(rX));\n opcodes[0x7e] = \"ROR\"; instructions[0x7e] = ROR(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x7f] = \"uRRA\"; instructions[0x7f] = uRRA(absoluteIndexedReadModifyWrite(rX));\n opcodes[0x80] = \"uNOP\"; instructions[0x80] = uNOP(immediateRead);\n opcodes[0x81] = \"STA\"; instructions[0x81] = STA(indirectXWrite);\n opcodes[0x82] = \"uNOP\"; instructions[0x82] = uNOP(immediateRead);\n opcodes[0x83] = \"uSAX\"; instructions[0x83] = uSAX(indirectXWrite);\n opcodes[0x84] = \"STY\"; instructions[0x84] = STY(zeroPageWrite);\n opcodes[0x85] = \"STA\"; instructions[0x85] = STA(zeroPageWrite);\n opcodes[0x86] = \"STX\"; instructions[0x86] = STX(zeroPageWrite);\n opcodes[0x87] = \"uSAX\"; instructions[0x87] = uSAX(zeroPageWrite);\n opcodes[0x88] = \"DEY\"; instructions[0x88] = DEY();\n opcodes[0x89] = \"uNOP\"; instructions[0x89] = uNOP(immediateRead);\n opcodes[0x8a] = \"TXA\"; instructions[0x8a] = TXA();\n opcodes[0x8b] = \"uANE\"; instructions[0x8b] = uANE(immediateRead);\n opcodes[0x8c] = \"STY\"; instructions[0x8c] = STY(absoluteWrite);\n opcodes[0x8d] = \"STA\"; instructions[0x8d] = STA(absoluteWrite);\n opcodes[0x8e] = \"STX\"; instructions[0x8e] = STX(absoluteWrite);\n opcodes[0x8f] = \"uSAX\"; instructions[0x8f] = uSAX(absoluteWrite);\n opcodes[0x90] = \"BCC\"; instructions[0x90] = Bxx(bC, 0); // BCC\n opcodes[0x91] = \"STA\"; instructions[0x91] = STA(indirectYWrite);\n opcodes[0x92] = \"uKIL\"; instructions[0x92] = uKIL();\n opcodes[0x93] = \"uSHA\"; instructions[0x93] = uSHA(indirectYWrite);\n opcodes[0x94] = \"STY\"; instructions[0x94] = STY(zeroPageIndexedWrite(rX));\n opcodes[0x95] = \"STA\"; instructions[0x95] = STA(zeroPageIndexedWrite(rX));\n opcodes[0x96] = \"STX\"; instructions[0x96] = STX(zeroPageIndexedWrite(rY));\n opcodes[0x97] = \"uSAX\"; instructions[0x97] = uSAX(zeroPageIndexedWrite(rY));\n opcodes[0x98] = \"TYA\"; instructions[0x98] = TYA();\n opcodes[0x99] = \"STA\"; instructions[0x99] = STA(absoluteIndexedWrite(rY));\n opcodes[0x9a] = \"TXS\"; instructions[0x9a] = TXS();\n opcodes[0x9b] = \"uSHS\"; instructions[0x9b] = uSHS(absoluteIndexedWrite(rY));\n opcodes[0x9c] = \"uSHY\"; instructions[0x9c] = uSHY(absoluteIndexedWrite(rX));\n opcodes[0x9d] = \"STA\"; instructions[0x9d] = STA(absoluteIndexedWrite(rX));\n opcodes[0x9e] = \"uSHX\"; instructions[0x9e] = uSHX(absoluteIndexedWrite(rY));\n opcodes[0x9f] = \"uSHA\"; instructions[0x9f] = uSHA(absoluteIndexedWrite(rY));\n opcodes[0xa0] = \"LDY\"; instructions[0xa0] = LDY(immediateRead);\n opcodes[0xa1] = \"LDA\"; instructions[0xa1] = LDA(indirectXRead);\n opcodes[0xa2] = \"LDX\"; instructions[0xa2] = LDX(immediateRead);\n opcodes[0xa3] = \"uLAX\"; instructions[0xa3] = uLAX(indirectXRead);\n opcodes[0xa4] = \"LDY\"; instructions[0xa4] = LDY(zeroPageRead);\n opcodes[0xa5] = \"LDA\"; instructions[0xa5] = LDA(zeroPageRead);\n opcodes[0xa6] = \"LDX\"; instructions[0xa6] = LDX(zeroPageRead);\n opcodes[0xa7] = \"uLAX\"; instructions[0xa7] = uLAX(zeroPageRead);\n opcodes[0xa8] = \"TAY\"; instructions[0xa8] = TAY();\n opcodes[0xa9] = \"LDA\"; instructions[0xa9] = LDA(immediateRead);\n opcodes[0xaa] = \"TAX\"; instructions[0xaa] = TAX();\n opcodes[0xab] = \"uLXA\"; instructions[0xab] = uLXA(immediateRead);\n opcodes[0xac] = \"LDY\"; instructions[0xac] = LDY(absoluteRead);\n opcodes[0xad] = \"LDA\"; instructions[0xad] = LDA(absoluteRead);\n opcodes[0xae] = \"LDX\"; instructions[0xae] = LDX(absoluteRead);\n opcodes[0xaf] = \"uLAX\"; instructions[0xaf] = uLAX(absoluteRead);\n opcodes[0xb0] = \"BCS\"; instructions[0xb0] = Bxx(bC, 1); // BCS\n opcodes[0xb1] = \"LDA\"; instructions[0xb1] = LDA(indirectYRead);\n opcodes[0xb2] = \"uKIL\"; instructions[0xb2] = uKIL();\n opcodes[0xb3] = \"uLAX\"; instructions[0xb3] = uLAX(indirectYRead);\n opcodes[0xb4] = \"LDY\"; instructions[0xb4] = LDY(zeroPageIndexedRead(rX));\n opcodes[0xb5] = \"LDA\"; instructions[0xb5] = LDA(zeroPageIndexedRead(rX));\n opcodes[0xb6] = \"LDX\"; instructions[0xb6] = LDX(zeroPageIndexedRead(rY));\n opcodes[0xb7] = \"uLAX\"; instructions[0xb7] = uLAX(zeroPageIndexedRead(rY));\n opcodes[0xb8] = \"CLV\"; instructions[0xb8] = CLV();\n opcodes[0xb9] = \"LDA\"; instructions[0xb9] = LDA(absoluteIndexedRead(rY));\n opcodes[0xba] = \"TSX\"; instructions[0xba] = TSX();\n opcodes[0xbb] = \"uLAS\"; instructions[0xbb] = uLAS(absoluteIndexedRead(rY));\n opcodes[0xbc] = \"LDY\"; instructions[0xbc] = LDY(absoluteIndexedRead(rX));\n opcodes[0xbd] = \"LDA\"; instructions[0xbd] = LDA(absoluteIndexedRead(rX));\n opcodes[0xbe] = \"LDX\"; instructions[0xbe] = LDX(absoluteIndexedRead(rY));\n opcodes[0xbf] = \"uLAX\"; instructions[0xbf] = uLAX(absoluteIndexedRead(rY));\n opcodes[0xc0] = \"CPY\"; instructions[0xc0] = CPY(immediateRead);\n opcodes[0xc1] = \"CMP\"; instructions[0xc1] = CMP(indirectXRead);\n opcodes[0xc2] = \"uNOP\"; instructions[0xc2] = uNOP(immediateRead);\n opcodes[0xc3] = \"uDCP\"; instructions[0xc3] = uDCP(indirectXReadModifyWrite);\n opcodes[0xc4] = \"CPY\"; instructions[0xc4] = CPY(zeroPageRead);\n opcodes[0xc5] = \"CMP\"; instructions[0xc5] = CMP(zeroPageRead);\n opcodes[0xc6] = \"DEC\"; instructions[0xc6] = DEC(zeroPageReadModifyWrite);\n opcodes[0xc7] = \"uDCP\"; instructions[0xc7] = uDCP(zeroPageReadModifyWrite);\n opcodes[0xc8] = \"INY\"; instructions[0xc8] = INY();\n opcodes[0xc9] = \"CMP\"; instructions[0xc9] = CMP(immediateRead);\n opcodes[0xca] = \"DEX\"; instructions[0xca] = DEX();\n opcodes[0xcb] = \"uSBX\"; instructions[0xcb] = uSBX(immediateRead);\n opcodes[0xcc] = \"CPY\"; instructions[0xcc] = CPY(absoluteRead);\n opcodes[0xcd] = \"CMP\"; instructions[0xcd] = CMP(absoluteRead);\n opcodes[0xce] = \"DEC\"; instructions[0xce] = DEC(absoluteReadModifyWrite);\n opcodes[0xcf] = \"uDCP\"; instructions[0xcf] = uDCP(absoluteReadModifyWrite);\n opcodes[0xd0] = \"BNE\"; instructions[0xd0] = Bxx(bZ, 0); // BNE\n opcodes[0xd1] = \"CMP\"; instructions[0xd1] = CMP(indirectYRead);\n opcodes[0xd2] = \"uKIL\"; instructions[0xd2] = uKIL();\n opcodes[0xd3] = \"uDCP\"; instructions[0xd3] = uDCP(indirectYReadModifyWrite);\n opcodes[0xd4] = \"uNOP\"; instructions[0xd4] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0xd5] = \"CMP\"; instructions[0xd5] = CMP(zeroPageIndexedRead(rX));\n opcodes[0xd6] = \"DEC\"; instructions[0xd6] = DEC(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0xd7] = \"uDCP\"; instructions[0xd7] = uDCP(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0xd8] = \"CLD\"; instructions[0xd8] = CLD();\n opcodes[0xd9] = \"CMP\"; instructions[0xd9] = CMP(absoluteIndexedRead(rY));\n opcodes[0xda] = \"uNOP\"; instructions[0xda] = uNOP(implied);\n opcodes[0xdb] = \"uDCP\"; instructions[0xdb] = uDCP(absoluteIndexedReadModifyWrite(rY));\n opcodes[0xdc] = \"uNOP\"; instructions[0xdc] = uNOP(absoluteIndexedRead(rX));\n opcodes[0xdd] = \"CMP\"; instructions[0xdd] = CMP(absoluteIndexedRead(rX));\n opcodes[0xde] = \"DEC\"; instructions[0xde] = DEC(absoluteIndexedReadModifyWrite(rX));\n opcodes[0xdf] = \"uDCP\"; instructions[0xdf] = uDCP(absoluteIndexedReadModifyWrite(rX));\n opcodes[0xe0] = \"CPX\"; instructions[0xe0] = CPX(immediateRead);\n opcodes[0xe1] = \"SBC\"; instructions[0xe1] = SBC(indirectXRead);\n opcodes[0xe2] = \"uNOP\"; instructions[0xe2] = uNOP(immediateRead);\n opcodes[0xe3] = \"uISB\"; instructions[0xe3] = uISB(indirectXReadModifyWrite);\n opcodes[0xe4] = \"CPX\"; instructions[0xe4] = CPX(zeroPageRead);\n opcodes[0xe5] = \"SBC\"; instructions[0xe5] = SBC(zeroPageRead);\n opcodes[0xe6] = \"INC\"; instructions[0xe6] = INC(zeroPageReadModifyWrite);\n opcodes[0xe7] = \"uISB\"; instructions[0xe7] = uISB(zeroPageReadModifyWrite);\n opcodes[0xe8] = \"INX\"; instructions[0xe8] = INX();\n opcodes[0xe9] = \"SBC\"; instructions[0xe9] = SBC(immediateRead);\n opcodes[0xea] = \"NOP\"; instructions[0xea] = NOP();\n opcodes[0xeb] = \"SBC\"; instructions[0xeb] = SBC(immediateRead);\n opcodes[0xec] = \"CPX\"; instructions[0xec] = CPX(absoluteRead);\n opcodes[0xed] = \"SBC\"; instructions[0xed] = SBC(absoluteRead);\n opcodes[0xee] = \"INC\"; instructions[0xee] = INC(absoluteReadModifyWrite);\n opcodes[0xef] = \"uISB\"; instructions[0xef] = uISB(absoluteReadModifyWrite);\n opcodes[0xf0] = \"BEQ\"; instructions[0xf0] = Bxx(bZ, 1); // BEQ\n opcodes[0xf1] = \"SBC\"; instructions[0xf1] = SBC(indirectYRead);\n opcodes[0xf2] = \"uKIL\"; instructions[0xf2] = uKIL();\n opcodes[0xf3] = \"uISB\"; instructions[0xf3] = uISB(indirectYReadModifyWrite);\n opcodes[0xf4] = \"uNOP\"; instructions[0xf4] = uNOP(zeroPageIndexedRead(rX));\n opcodes[0xf5] = \"SBC\"; instructions[0xf5] = SBC(zeroPageIndexedRead(rX));\n opcodes[0xf6] = \"INC\"; instructions[0xf6] = INC(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0xf7] = \"uISB\"; instructions[0xf7] = uISB(zeroPageIndexedReadModifyWrite(rX));\n opcodes[0xf8] = \"SED\"; instructions[0xf8] = SED();\n opcodes[0xf9] = \"SBC\"; instructions[0xf9] = SBC(absoluteIndexedRead(rY));\n opcodes[0xfa] = \"uNOP\"; instructions[0xfa] = uNOP(implied);\n opcodes[0xfb] = \"uISB\"; instructions[0xfb] = uISB(absoluteIndexedReadModifyWrite(rY));\n opcodes[0xfc] = \"uNOP\"; instructions[0xfc] = uNOP(absoluteIndexedRead(rX));\n opcodes[0xfd] = \"SBC\"; instructions[0xfd] = SBC(absoluteIndexedRead(rX));\n opcodes[0xfe] = \"INC\"; instructions[0xfe] = INC(absoluteIndexedReadModifyWrite(rX));\n opcodes[0xff] = \"uISB\"; instructions[0xff] = uISB(absoluteIndexedReadModifyWrite(rX));\n\n\n // Single Byte instructions\n\n function ASL_ACC() {\n return implied(function() {\n setC(A > 127);\n A = (A << 1) & 255;\n setZ(A);\n setN(A);\n });\n }\n\n function CLC() {\n return implied(function() {\n C = 0;\n });\n }\n\n function CLD() {\n return implied(function() {\n D = 0;\n });\n }\n\n function CLI() {\n return implied(function() {\n I = 0;\n });\n }\n\n function CLV() {\n return implied(function() {\n V = 0;\n });\n }\n\n function DEX() {\n return implied(function() {\n X = (X - 1) & 255;\n setZ(X);\n setN(X);\n });\n }\n\n function DEY() {\n return implied(function() {\n Y = (Y - 1) & 255;\n setZ(Y);\n setN(Y);\n });\n }\n\n function INX() {\n return implied(function() {\n X = (X + 1) & 255;\n setZ(X);\n setN(X);\n });\n }\n\n function INY() {\n return implied(function() {\n Y = (Y + 1) & 255;\n setZ(Y);\n setN(Y);\n });\n }\n\n function LSR_ACC() {\n return implied(function() {\n C = A & 0x01;\n A >>>= 1;\n setZ(A);\n N = 0;\n });\n }\n\n function NOP() {\n return implied(function() {\n // nothing\n });\n }\n\n function ROL_ACC() {\n return implied(function() {\n var newC = A > 127;\n A = ((A << 1) | C) & 255;\n setC(newC);\n setZ(A);\n setN(A);\n });\n }\n\n function ROR_ACC() {\n return implied(function() {\n var newC = A & 0x01;\n A = (A >>> 1) | (C << 7);\n setC(newC);\n setZ(A);\n setN(A);\n });\n }\n\n function SEC() {\n return implied(function() {\n C = 1;\n });\n }\n\n function SED() {\n return implied(function() {\n D = 1;\n });\n }\n\n function SEI() {\n return implied(function() {\n I = 1;\n });\n }\n\n function TAX() {\n return implied(function() {\n X = A;\n setZ(X);\n setN(X);\n });\n }\n\n function TAY() {\n return implied(function() {\n Y = A;\n setZ(Y);\n setN(Y);\n });\n }\n\n function TSX() {\n return implied(function() {\n X = SP;\n setZ(X);\n setN(X);\n });\n }\n\n function TXA() {\n return implied(function() {\n A = X;\n setZ(A);\n setN(A);\n });\n }\n\n function TXS() {\n return implied(function() {\n SP = X;\n });\n }\n\n function TYA() {\n return implied(function() {\n A = Y;\n setZ(A);\n setN(A);\n });\n }\n\n function uKIL() {\n return [\n fetchOpcodeAndDecodeInstruction,\n function() {\n illegalOpcode(\"KIL/HLT/JAM\");\n },\n function() {\n T--; // Causes the processor to be stuck in this instruction forever\n }\n ];\n }\n\n function uNOP(addressing) {\n return addressing(function() {\n illegalOpcode(\"NOP/DOP\");\n // nothing\n });\n }\n\n\n // Internal Execution on Memory Data\n\n function ADC(addressing) {\n return addressing(function() {\n if (D) {\n var operand = data;\n var AL = (A & 15) + (operand & 15) + C;\n if (AL > 9) { AL += 6; }\n var AH = ((A >> 4) + (operand >> 4) + ((AL > 15)?1:0)) << 4;\n setZ((A + operand + C) & 255);\n setN(AH);\n setV(((A ^AH) & ~(A ^ operand)) & 128);\n if (AH > 0x9f) { AH += 0x60; }\n setC(AH > 255);\n A = (AH | (AL & 15)) & 255;\n } else {\n var add = A + data + C;\n setC(add > 255);\n setV(((A ^ add) & (data ^ add)) & 0x80);\n A = add & 255;\n setZ(A);\n setN(A);\n }\n });\n }\n\n function AND(addressing) {\n return addressing(function() {\n A &= data;\n setZ(A);\n setN(A);\n });\n }\n\n function BIT(addressing) {\n return addressing(function() {\n var par = data;\n setZ(A & par);\n setV(par & 0x40);\n setN(par);\n });\n }\n\n function CMP(addressing) {\n return addressing(function() {\n var val = (A - data) & 255;\n setC(A >= data);\n setZ(val);\n setN(val);\n });\n }\n\n function CPX(addressing) {\n return addressing(function() {\n var val = (X - data) & 255;\n setC(X >= data);\n setZ(val);\n setN(val);\n });\n }\n\n function CPY(addressing) {\n return addressing(function() {\n var val = (Y - data) & 255;\n setC(Y >= data);\n setZ(val);\n setN(val);\n });\n }\n\n function EOR(addressing) {\n return addressing(function() {\n A ^= data;\n setZ(A);\n setN(A);\n });\n }\n\n function LDA(addressing) {\n return addressing(function() {\n A = data;\n setZ(A);\n setN(A);\n });\n }\n\n function LDX(addressing) {\n return addressing(function() {\n X = data;\n setZ(X);\n setN(X);\n });\n }\n\n function LDY(addressing) {\n return addressing(function() {\n Y = data;\n setZ(Y);\n setN(Y);\n });\n }\n\n function ORA(addressing) {\n return addressing(function() {\n A |= data;\n setZ(A);\n setN(A);\n });\n }\n\n function SBC(addressing) {\n return addressing(function() {\n if (D) {\n var operand = data;\n var AL = (A & 15) - (operand & 15) - (1-C);\n var AH = (A >> 4) - (operand >> 4) - ((AL < 0)?1:0);\n if (AL < 0) { AL -= 6; }\n if (AH < 0) { AH -= 6; }\n var sub = A - operand - (1-C);\n setC(~sub & 256);\n setV(((A ^ operand) & (A ^ sub)) & 128);\n setZ(sub & 255);\n setN(sub);\n A = ((AH << 4) | (AL & 15)) & 255;\n } else {\n operand = (~data) & 255;\n sub = A + operand + C;\n setC(sub > 255);\n setV(((A ^ sub) & (operand ^ sub) & 0x80));\n A = sub & 255;\n setZ(A);\n setN(A);\n }\n });\n }\n\n function uANC(addressing) {\n return addressing(function() {\n illegalOpcode(\"ANC\");\n A &= data;\n setZ(A);\n N = C = (A & 0x080) ? 1 : 0;\n });\n }\n\n function uANE(addressing) {\n return addressing(function() {\n illegalOpcode(\"ANE\");\n // Exact operation unknown. Do nothing\n });\n }\n\n function uARR(addressing) {\n // Some sources say flags are affected per ROR, others say its more complex. The complex one is chosen\n return addressing(function() {\n illegalOpcode(\"ARR\");\n var val = A & data;\n var oldC = C ? 0x80 : 0;\n val = (val >>> 1) | oldC;\n A = val;\n setZ(val);\n setN(val);\n var comp = A & 0x60;\n if (comp == 0x60) \t\t{ C = 1; V = 0; }\n else if (comp == 0x00) \t{ C = 0; V = 0; }\n else if (comp == 0x20) \t{ C = 0; V = 1; }\n else if (comp == 0x40) \t{ C = 1; V = 1; }\n });\n }\n\n function uASR(addressing) {\n return addressing(function() {\n illegalOpcode(\"ASR\");\n var val = A & data;\n C = (val & 0x01);\t\t// bit 0\n val = val >>> 1;\n A = val;\n setZ(val);\n N = 0;\n });\n }\n\n function uLAS(addressing) {\n return addressing(function() {\n illegalOpcode(\"LAS\");\n var val = SP & data;\n A = val;\n X = val;\n SP = val;\n setZ(val);\n setN(val);\n });\n }\n\n function uLAX(addressing) {\n return addressing(function() {\n illegalOpcode(\"LAX\");\n var val = data;\n A = val;\n X = val;\n setZ(val);\n setN(val);\n });\n }\n\n function uLXA(addressing) {\n return addressing(function() {\n // Some sources say its an OR with $EE then AND with IMM, others exclude the OR,\n // others exclude both the OR and the AND. Excluding just the OR...\n illegalOpcode(\"LXA\");\n var val = A /* | 0xEE) */ & data;\n A = val;\n X = val;\n setZ(val);\n setN(val);\n });\n }\n\n function uSBX(addressing) {\n return addressing(function() {\n illegalOpcode(\"SBX\");\n var par = A & X;\n var val = data;\n var newX = (par - val) & 255;\n X = newX;\n setC(par >= val);\n setZ(newX);\n setN(newX);\n });\n }\n\n\n // Store operations\n\n function STA(addressing) {\n return addressing(function() {\n data = A;\n });\n }\n\n function STX(addressing) {\n return addressing(function() {\n data = X;\n });\n }\n\n function STY(addressing) {\n return addressing(function() {\n data = Y;\n });\n }\n\n function uSAX(addressing) {\n return addressing(function() {\n // Some sources say it would affect N and Z flags, some say it wouldn't. Chose not to affect\n illegalOpcode(\"SAX\");\n data = A & X;\n });\n }\n\n function uSHA(addressing) {\n return addressing(function() {\n illegalOpcode(\"SHA\");\n data = A & X & ((BA >>> 8) + 1) & 255; // A & X & (High byte of effective address + 1) !!!\n // data would also be stored BAH if page boundary is crossed. Unobservable, not needed here\n });\n }\n\n function uSHS(addressing) {\n return addressing(function() {\n illegalOpcode(\"SHS\");\n var val = A & X;\n SP = val;\n data = val & ((BA >>> 8) + 1) & 255; // A & X & (High byte of effective address + 1) !!!\n // data would also be stored BAH if page boundary is crossed. Unobservable, not needed here\n });\n }\n\n function uSHX(addressing) {\n return addressing(function() {\n illegalOpcode(\"SHX\");\n data = X & ((BA >>> 8) + 1) & 255; // X & (High byte of effective address + 1) !!!\n // data would also be stored BAH if page boundary is crossed. Unobservable, not needed here\n });\n }\n\n function uSHY(addressing) {\n return addressing(function() {\n illegalOpcode(\"SHY\");\n data = Y & ((BA >>> 8) + 1) & 255; // Y & (High byte of effective address + 1) !!!\n // data would also be stored BAH if page boundary is crossed. Unobservable, not needed here\n });\n }\n\n\n // Read-Modify-Write operations\n\n function ASL(addressing) {\n return addressing(function() {\n setC(data > 127);\n var par = (data << 1) & 255;\n data = par;\n setZ(par);\n setN(par);\n });\n }\n\n function DEC(addressing) {\n return addressing(function() {\n var par = (data - 1) & 255;\n data = par;\n setZ(par);\n setN(par);\n });\n }\n\n function INC(addressing) {\n return addressing(function() {\n var par = (data + 1) & 255;\n data = par;\n setZ(par);\n setN(par);\n });\n }\n\n function LSR(addressing) {\n return addressing(function() {\n C = data & 0x01;\n data >>>= 1;\n setZ(data);\n N = 0;\n });\n }\n\n function ROL(addressing) {\n return addressing(function() {\n var newC = data > 127;\n var par = ((data << 1) | C) & 255;\n data = par;\n setC(newC);\n setZ(par);\n setN(par);\n });\n }\n\n function ROR(addressing) {\n return addressing(function() {\n var newC = data & 0x01;\n var par = (data >>> 1) | (C << 7);\n data = par;\n setC(newC);\n setZ(par);\n setN(par);\n });\n }\n\n function uDCP(addressing) {\n return addressing(function() {\n illegalOpcode(\"DCP\");\n var par = (data - 1) & 255;\n data = par;\n par = A - par;\n setC(par >= 0);\n setZ(par);\n setN(par);\n });\n }\n\n function uISB(addressing) {\n return addressing(function() {\n illegalOpcode(\"ISB\");\n data = (data + 1) & 255; // ISB is the same as SBC but incs the operand first\n if (D) {\n var operand = data;\n var AL = (A & 15) - (operand & 15) - (1-C);\n var AH = (A >> 4) - (operand >> 4) - ((AL < 0)?1:0);\n if (AL < 0) { AL -= 6; }\n if (AH < 0) { AH -= 6; }\n var sub = A - operand - (1-C);\n setC(~sub & 256);\n setV(((A ^ operand) & (A ^ sub)) & 128);\n setZ(sub & 255);\n setN(sub);\n A = ((AH << 4) | (AL & 15)) & 255;\n } else {\n operand = (~data) & 255;\n sub = A + operand + C;\n setC(sub > 255);\n setV(((A ^ sub) & (operand ^ sub) & 0x80));\n A = sub & 255;\n setZ(A);\n setN(A);\n }\n });\n }\n\n function uRLA(addressing) {\n return addressing(function() {\n illegalOpcode(\"RLA\");\n var val = data;\n var oldC = C;\n setC(val & 0x80);\t\t// bit 7 was set\n val = ((val << 1) | oldC) & 255;\n data = val;\n A &= val;\n setZ(val); // TODO Verify. May be A instead of val in the flags setting\n setN(val);\n });\n }\n\n function uRRA(addressing) {\n return addressing(function() {\n illegalOpcode(\"RRA\");\n var val = data;\n var oldC = C ? 0x80 : 0;\n setC(val & 0x01);\t\t// bit 0 was set\n val = (val >>> 1) | oldC;\n data = val;\n // RRA is the same as ADC from here\n if (D) {\n var operand = data;\n var AL = (A & 15) + (operand & 15) + C;\n if (AL > 9) { AL += 6; }\n var AH = ((A >> 4) + (operand >> 4) + ((AL > 15)?1:0)) << 4;\n setZ((A + operand + C) & 255);\n setN(AH);\n setV(((A ^AH) & ~(A ^ operand)) & 128);\n if (AH > 0x9f) { AH += 0x60; }\n setC(AH > 255);\n A = (AH | (AL & 15)) & 255;\n } else {\n var add = A + data + C;\n setC(add > 255);\n setV(((A ^ add) & (data ^ add)) & 0x80);\n A = add & 255;\n setZ(A);\n setN(A);\n }\n });\n }\n\n function uSLO(addressing) {\n return addressing(function() {\n illegalOpcode(\"SLO\");\n var val = data;\n setC(val & 0x80);\t\t// bit 7 was set\n val = (val << 1) & 255;\n data = val;\n val = A | val;\n A = val;\n setZ(val);\n setN(val);\n });\n }\n\n function uSRE(addressing) {\n return addressing(function() {\n illegalOpcode(\"SRE\");\n var val = data;\n setC(val & 0x01);\t\t// bit 0 was set\n val = val >>> 1;\n data = val;\n val = (A ^ val) & 255;\n A = val;\n setZ(val);\n setN(val);\n });\n }\n\n\n // Miscellaneous operations\n\n function PHA() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n function() { pushToStack(A); },\n fetchNextOpcode\n ];\n }\n\n function PHP() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n function() { pushToStack(getStatusBits()); },\n fetchNextOpcode\n ];\n }\n\n function PLA() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n peekFromStack,\n function() {\n A = popFromStack();\n setZ(A);\n setN(A);\n },\n fetchNextOpcode\n ];\n }\n\n function PLP() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n peekFromStack,\n function() { setStatusBits(popFromStack()); },\n fetchNextOpcode\n ];\n }\n\n function JSR() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n peekFromStack,\n function() { pushToStack((PC >>> 8) & 0xff); },\n function() { pushToStack(PC & 0xff); },\n fetchADH,\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function BRK() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchDataFromImmediate, // For debugging purposes, use operand as an arg for BRK!\n function() {\n if (self.debug) self.breakpoint(\"BRK \" + data);\n pushToStack((PC >>> 8) & 0xff);\n },\n function() { pushToStack(PC & 0xff); },\n function() { pushToStack(getStatusBits()); }, // set B flag\n function() { AD = bus.read(IRQ_VECTOR); },\n function() { AD |= bus.read(IRQ_VECTOR + 1) << 8; },\n function() { PC = AD; I = 1; fetchNextOpcode(); }\n ];\n }\n\n function IRQ() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchDataFromImmediate, // For debugging purposes, use operand as an arg for BRK!\n function() {\n if (self.debug) self.breakpoint(\"IRQ \" + data);\n pushToStack((PC >>> 8) & 0xff);\n },\n function() { pushToStack(PC & 0xff); },\n function() { pushToStack(getStatusBits() & ~0x10); }, // no BRK flag\n function() { AD = bus.read(IRQ_VECTOR); },\n function() { AD |= bus.read(IRQ_VECTOR + 1) << 8; },\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function NMI() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchDataFromImmediate,\n function() {\n if (self.debug) self.breakpoint(\"NMI \" + data);\n pushToStack((PC >>> 8) & 0xff);\n },\n function() { pushToStack(PC & 0xff); },\n function() { pushToStack(getStatusBits() & ~0x10); }, // no BRK flag\n function() { AD = bus.read(NMI_VECTOR); },\n function() { AD |= bus.read(NMI_VECTOR + 1) << 8; },\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function RTI() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n peekFromStack,\n function() { setStatusBits(popFromStack()); },\n function() { AD = popFromStack(); },\n function() { AD |= popFromStack() << 8; },\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function RTS() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchOpcodeAndDiscard,\n peekFromStack,\n function() { AD = popFromStack(); },\n function() { AD |= popFromStack() << 8; },\n function() { PC = AD; fetchDataFromImmediate(); },\n fetchNextOpcode\n ];\n }\n\n function JMP_ABS() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchADL,\n fetchADH,\n function() { PC = AD; fetchNextOpcode(); }\n ];\n }\n\n function JMP_IND() {\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchIAL, // IAH will be zero\n fetchIAH,\n fetchBALFromIA,\n function() {\n add1toIAL();\n fetchBAHFromIA();\n },\n function() { PC = BA; fetchNextOpcode(); }\n ];\n }\n\n function Bxx(reg, cond) {\n var branchTaken;\n if (reg === bZ) branchTaken = function() { return Z === cond; };\n else if (reg === bN) branchTaken = function() { return N === cond; };\n else if (reg === bC) branchTaken = function() { return C === cond; };\n else branchTaken = function() { return V === cond; };\n return [\n fetchOpcodeAndDecodeInstruction,\n fetchBranchOffset,\n function() {\n if (branchTaken()) {\n fetchOpcodeAndDiscard();\n addBranchOffsetToPCL();\n } else {\n fetchNextOpcode();\n }\n },\n function() {\n if(branchOffsetCrossAdjust) {\n fetchOpcodeAndDiscard();\n adjustPCHForBranchOffsetCross();\n } else {\n fetchNextOpcode();\n }\n },\n fetchNextOpcode\n ];\n }\n\n\n // Savestate -------------------------------------------\n\n this.saveState = function():MOS6502State {\n return {\n PC: (PC-1) & 0xffff,\n A: A, X: X, Y: Y, SP: SP,\n N: N, V: V, D: D, I: I, Z: Z, C: C,\n T: T, o: opcode, R: RDY?1:0,\n d: data, AD: AD, BA: BA, BC: BALCrossed?1:0, IA: IA,\n bo: branchOffset, boa: branchOffsetCrossAdjust\n };\n };\n\n this.loadState = function(state:MOS6502State) {\n PC = (state.PC+1) & 0xffff;\n A = state.A; X = state.X; Y = state.Y; SP = state.SP;\n N = state.N; V = state.V; D = state.D; I = state.I; Z = state.Z; C = state.C;\n T = state.T; opcode = state.o; RDY = !!state.R;\n data = state.d; AD = state.AD; BA = state.BA; BALCrossed = !!state.BC; IA = state.IA;\n branchOffset = state.bo; branchOffsetCrossAdjust = state.boa;\n instruction = opcode < 0 ? [ fetchOpcodeAndDecodeInstruction ] : instructions[opcode];\n };\n\n\n // Accessory methods\n\n this.toString = function() {\n return \"CPU \" +\n \" PC: \" + PC.toString(16) + \" op: \" + opcode.toString() + \" T: \" + T + \" data: \" + data + \"\\n\" +\n \" A: \" + A.toString(16) + \" X: \" + X.toString(16) + \" Y: \" + Y.toString(16) + \" SP: \" + SP.toString(16) + \" \" +\n \"N\" + N + \" \" + \"V\" + V + \" \" + \"D\" + D + \" \" + \"I\" + I + \" \" + \"Z\" + Z + \" \" + \"C\" + C + \" \";\n };\n\n this.breakpoint = function(mes) {\n //jt.Util.log(mes);\n if (this.trace) {\n var text = \"CPU Breakpoint! \" + (mes ? \"(\" + mes + \")\" : \"\") + \"\\n\\n\" + this.toString();\n //jt.Util.message(text);\n }\n };\n\n var cycletime = [\n 7, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 6, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 0, 6, 0, 6, 3, 3, 3, 3, 2, 0, 2, 0, 4, 4, 4, 4,\n 2, 6, 0, 0, 4, 4, 4, 4, 2, 5, 2, 0, 0, 5, 0, 0,\n 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 0, 4, 4, 4, 4,\n 2, 5, 0, 5, 4, 4, 4, 4, 2, 4, 2, 0, 4, 4, 4, 4,\n 2, 6, 0, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7,\n 2, 6, 0, 8, 3, 3, 5, 5, 2, 2, 2, 0, 4, 4, 6, 6,\n 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7\n ];\n\n var extracycles = [\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1\n ];\n\n var insnlengths = [\n 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 3, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 0, 2, 0, 2, 2, 2, 2, 2, 1, 0, 1, 0, 3, 3, 3, 3,\n 2, 2, 0, 0, 2, 2, 2, 3, 1, 3, 1, 0, 0, 3, 0, 0,\n 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 0, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 1, 0, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 0, 3, 3, 3, 3,\n 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3\n ];\n\n var validinsns = [\n 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 0, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 3, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 0, 2, 0, 0, 2, 2, 2, 0, 1, 0, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 2, 2, 2, 0, 1, 3, 1, 0, 0, 3, 0, 0,\n 2, 2, 2, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 2, 2, 2, 0, 1, 3, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0,\n 2, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0,\n 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0\n ];\n\n this.getOpcodeMetadata = function(opcode, address) {\n // TODO: more intelligent maximum cycles\n //var i = instructions[opcode];\n return {\n opcode:opcode,\n mnenomic:opcodes[opcode],\n minCycles:cycletime[opcode],\n maxCycles:cycletime[opcode] + extracycles[opcode],\n insnlength:insnlengths[opcode]\n };\n }\n\n // only call when isPCStable() is true\n this.setNMI = function() {\n instruction = NMI();\n T = 1;\n PC = (PC-1) & 0xffff;\n }\n this.setIRQ = function() {\n if (!I) { // only if not disabled\n instruction = IRQ();\n T = 1;\n PC = (PC-1) & 0xffff;\n }\n }\n\n this.getSP = function() { return SP; }\n this.getPC = function() { return (PC-1) & 0xffff; }\n this.getT = function() { return T; }\n this.isHalted = function() { return opcodes[opcode] == \"uKIL\"; }\n \n this.isPCStable = function() {\n return T == 0;\n }\n};\n\nexport interface MOS6502State {\nPC : number;\nSP : number;\nA : number;\nX : number;\nY : number;\nN : number;\nV : number;\nD : number;\nI : number;\nZ : number;\nC : number;\nT : number;\no : number;\nR : number;\nd : number;\nAD : number;\nBA : number;\nBC : number;\nIA : number;\nbo : number;\nboa : number;\n}\n\nexport enum MOS6502Interrupts { None=0, NMI=1, IRQ=2 };\n\nexport class MOS6502 implements CPU, ClockBased, SavesState, Interruptable {\n\n cpu = new _MOS6502();\n interruptType : MOS6502Interrupts = MOS6502Interrupts.None;\n \n connectMemoryBus(bus:Bus) {\n this.cpu.connectBus(bus);\n }\n advanceClock() {\n if (this.interruptType && this.isStable()) {\n switch (this.interruptType) {\n case MOS6502Interrupts.NMI: this.cpu.setNMI(); break;\n case MOS6502Interrupts.IRQ: this.cpu.setIRQ(); break;\n }\n this.interruptType = 0;\n }\n this.cpu.clockPulse();\n }\n advanceInsn() {\n do {\n this.advanceClock();\n } while (!this.isStable());\n }\n reset() {\n this.cpu.reset();\n this.interruptType = 0;\n }\n interrupt(itype:number) {\n if (this.interruptType != MOS6502Interrupts.NMI) {\n this.interruptType = itype;\n }\n }\n NMI() {\n this.interrupt(MOS6502Interrupts.NMI);\n }\n IRQ() {\n this.interrupt(MOS6502Interrupts.IRQ);\n }\n getSP() {\n return this.cpu.getSP();\n }\n getPC() {\n return this.cpu.getPC();\n }\n isHalted() {\n return this.cpu.isHalted();\n }\n saveState() {\n var s = this.cpu.saveState();\n s.it = this.interruptType;\n return s;\n }\n loadState(s) {\n this.cpu.loadState(s);\n this.interruptType = s.it;\n }\n isStable() : boolean {\n return this.cpu.isPCStable();\n }\n getOpcodeMetadata(op: number) {\n return this.cpu.getOpcodeMetadata(op);\n }\n}\n", "\nimport { RasterVideo, dumpRAM, AnimationTimer, ControllerPoller } from \"./emu\";\nimport { hex, printFlags, invertMap, byteToASCII } from \"./util\";\nimport { CodeAnalyzer } from \"./analysis\";\nimport { Segment, FileData } from \"./workertypes\";\nimport { disassemble6502 } from \"./cpu/disasm6502\";\nimport { disassembleZ80 } from \"./cpu/disasmz80\";\nimport { Z80 } from \"./cpu/ZilogZ80\";\n\nimport { Bus, Resettable, FrameBased, VideoSource, SampledAudioSource, AcceptsROM, AcceptsBIOS, AcceptsKeyInput, SavesState, SavesInputState, HasCPU, HasSerialIO, SerialIOInterface, AcceptsJoyInput } from \"./devices\";\nimport { Probeable, RasterFrameBased, AcceptsPaddleInput } from \"./devices\";\nimport { SampledAudio } from \"./audio\";\nimport { ProbeRecorder } from \"./probe\";\nimport { BaseWASMMachine } from \"./wasmplatform\";\nimport { CPU6809 } from \"./cpu/6809\";\nimport { _MOS6502 } from \"./cpu/MOS6502\";\n\n///\n\nexport interface OpcodeMetadata {\n minCycles: number;\n maxCycles: number;\n insnlength: number;\n opcode: number;\n}\n\nexport interface CpuState {\n PC:number;\n EPC?:number; // effective PC (for bankswitching)\n o?:number;/*opcode*/\n SP?:number\n /*\n A:number, X:number, Y:number, SP:number, R:boolean,\n N,V,D,Z,C:boolean*/\n};\nexport interface EmuState {\n c?:CpuState,\t// CPU state\n b?:Uint8Array|number[], \t// RAM (TODO: not for vcs, support Uint8Array)\n ram?:Uint8Array,\n o?:{},\t\t\t\t// verilog\n};\nexport interface EmuControlsState {\n}\nexport type DisasmLine = {\n line:string,\n nbytes:number,\n isaddr:boolean\n};\n\nexport type SymbolMap = {[ident:string]:number};\nexport type AddrSymbolMap = {[address:number]:string};\n\nexport class DebugSymbols {\n symbolmap : SymbolMap;\t// symbol -> address\n addr2symbol : AddrSymbolMap;\t// address -> symbol\n debuginfo : {}; // extra platform-specific debug info\n\n constructor(symbolmap : SymbolMap, debuginfo : {}) {\n this.symbolmap = symbolmap;\n this.debuginfo = debuginfo;\n this.addr2symbol = invertMap(symbolmap);\n //// TODO: shouldn't be necc.\n if (!this.addr2symbol[0x0]) this.addr2symbol[0x0] = '$00'; // needed for ...\n this.addr2symbol[0x10000] = '__END__'; // ... dump memory to work\n }\n}\n\ntype MemoryMapType = \"main\" | \"vram\";\ntype MemoryMap = { [type:string] : Segment[] };\n\nexport function isDebuggable(arg:any): arg is Debuggable {\n return arg && typeof arg.getDebugCategories === 'function';\n}\n\nexport interface Debuggable {\n getDebugCategories?() : string[];\n getDebugInfo?(category:string, state:EmuState) : string;\n}\n\nexport interface Platform {\n start() : void | Promise;\n reset() : void;\n isRunning() : boolean;\n getToolForFilename(s:string) : string;\n getDefaultExtension() : string;\n getPresets?() : Preset[];\n pause() : void;\n resume() : void;\n loadROM(title:string, rom:any); // TODO: Uint8Array\n loadBIOS?(title:string, rom:Uint8Array);\n getROMExtension?(rom:FileData) : string;\n\n loadState?(state : EmuState) : void;\n saveState?() : EmuState;\n loadControlsState?(state : EmuControlsState) : void;\n saveControlsState?() : EmuControlsState;\n\n inspect?(ident:string) : string;\n disassemble?(addr:number, readfn:(addr:number)=>number) : DisasmLine;\n readAddress?(addr:number) : number;\n readVRAMAddress?(addr:number) : number;\n \n setFrameRate?(fps:number) : void;\n getFrameRate?() : number;\n\n setupDebug?(callback : BreakpointCallback) : void;\n clearDebug?() : void;\n step?() : void;\n runToVsync?() : void;\n runToPC?(pc:number) : void;\n runUntilReturn?() : void;\n stepBack?() : void;\n runEval?(evalfunc : DebugEvalCondition) : void;\n runToFrameClock?(clock : number) : void;\n stepOver?() : void;\n restartAtPC?(pc:number) : boolean;\n\n getOpcodeMetadata?(opcode:number, offset:number) : OpcodeMetadata; //TODO\n getSP?() : number;\n getPC?() : number;\n getOriginPC?() : number;\n newCodeAnalyzer?() : CodeAnalyzer;\n \n getPlatformName?() : string;\n getMemoryMap?() : MemoryMap;\n\n setRecorder?(recorder : EmuRecorder) : void;\n advance?(novideo? : boolean) : number;\n advanceFrameClock?(trap:DebugCondition, step:number) : number;\n showHelp?() : string;\n resize?() : void;\n\n getRasterScanline?() : number;\n getRasterLineClock?() : number;\n setBreakpoint?(id : string, cond : DebugCondition);\n clearBreakpoint?(id : string);\n hasBreakpoint?(id : string) : boolean;\n getCPUState?() : CpuState;\n\n debugSymbols? : DebugSymbols;\n getDebugTree?() : {};\n \n startProbing?() : ProbeRecorder;\n stopProbing?() : void;\n\n isBlocked?() : boolean; // is blocked, halted, or waiting for input?\n\n readFile?(path: string) : FileData;\n writeFile?(path: string, data: FileData) : boolean;\n sourceFileFetch?: (path:string) => FileData;\n\n getDownloadFile?() : {extension:string, blob:Blob};\n getDebugSymbolFile?() : {extension:string, blob:Blob};\n}\n\nexport interface Preset {\n id : string;\n name : string;\n chapter? : number;\n title? : string;\n}\n\nexport interface MemoryBus {\n read : (address:number) => number;\n write : (address:number, value:number) => void;\n contend?: (address:number, cycles:number) => number;\n isContended?: (address:number) => boolean;\n}\n\nexport type DebugCondition = () => boolean;\nexport type DebugEvalCondition = (c:CpuState) => boolean;\nexport type BreakpointCallback = (s:EmuState, msg?:string) => void;\n// for composite breakpoints w/ single debug function\nexport class BreakpointList {\n id2bp : {[id:string] : Breakpoint} = {};\n getDebugCondition() : DebugCondition {\n if (Object.keys(this.id2bp).length == 0) {\n return null; // no breakpoints\n } else {\n // evaluate all breakpoints\n return () => {\n var result = false;\n for (var id in this.id2bp)\n if (this.id2bp[id].cond())\n result = true;\n return result;\n };\n }\n }\n}\nexport interface Breakpoint {\n cond: DebugCondition;\n};\n\nexport interface EmuRecorder {\n frameRequested() : boolean;\n recordFrame(state : EmuState);\n}\n\n/////\n\nexport abstract class BasePlatform {\n recorder : EmuRecorder = null;\n debugSymbols : DebugSymbols;\n internalFiles : {[path:string] : FileData} = {};\n\n abstract loadState(state : EmuState) : void;\n abstract saveState() : EmuState;\n abstract pause() : void;\n abstract resume() : void;\n abstract advance(novideo? : boolean) : number;\n\n setRecorder(recorder : EmuRecorder) : void {\n this.recorder = recorder;\n }\n updateRecorder() {\n // are we recording and do we need to save a frame?\n if (this.recorder && (this).isRunning() && this.recorder.frameRequested()) {\n this.recorder.recordFrame(this.saveState());\n }\n }\n inspect(sym: string) : string {\n return inspectSymbol((this as any) as Platform, sym);\n }\n getDebugTree() : {} {\n var o : any = { };\n o.state = this.saveState();\n if (this.debugSymbols?.debuginfo) o.debuginfo = this.debugSymbols.debuginfo;\n return o;\n }\n readFile(path: string) : FileData {\n return this.internalFiles[path];\n }\n writeFile(path: string, data: FileData) : boolean {\n this.internalFiles[path] = data;\n return true;\n }\n}\n\nexport abstract class BaseDebugPlatform extends BasePlatform {\n onBreakpointHit : BreakpointCallback;\n debugCallback : DebugCondition;\n debugSavedState : EmuState = null;\n debugBreakState : EmuState = null;\n debugTargetClock : number = 0;\n debugClock : number = 0;\n breakpoints : BreakpointList = new BreakpointList();\n frameCount : number = 0;\n\n abstract getCPUState() : CpuState;\n\n setBreakpoint(id : string, cond : DebugCondition) {\n if (cond) {\n this.breakpoints.id2bp[id] = {cond:cond};\n this.restartDebugging();\n } else {\n this.clearBreakpoint(id);\n }\n }\n clearBreakpoint(id : string) {\n delete this.breakpoints.id2bp[id];\n }\n hasBreakpoint(id : string) {\n return this.breakpoints.id2bp[id] != null;\n }\n getDebugCallback() : DebugCondition {\n return this.breakpoints.getDebugCondition();\n }\n setupDebug(callback : BreakpointCallback) : void {\n this.onBreakpointHit = callback;\n }\n clearDebug() {\n if (this.debugBreakState != null && this.debugSavedState != null) {\n this.loadState(this.debugSavedState);\n }\n this.debugSavedState = null;\n this.debugBreakState = null;\n this.debugTargetClock = -1;\n this.debugClock = 0;\n this.onBreakpointHit = null;\n this.clearBreakpoint('debug');\n this.frameCount = 0;\n }\n setDebugCondition(debugCond : DebugCondition) {\n this.setBreakpoint('debug', debugCond);\n }\n resetDebugging() {\n if (this.debugSavedState) {\n this.loadState(this.debugSavedState);\n } else {\n this.debugSavedState = this.saveState();\n }\n this.debugClock = 0;\n this.debugCallback = this.getDebugCallback();\n this.debugBreakState = null;\n }\n restartDebugging() {\n this.resetDebugging();\n this.resume();\n }\n preFrame() {\n // save state before frame, to record any inputs that happened pre-frame\n if (this.debugCallback && !this.debugBreakState) {\n // save state every frame and rewind debug clocks\n this.debugSavedState = this.saveState();\n this.debugTargetClock -= this.debugClock;\n this.debugClock = 0;\n }\n }\n postFrame() {\n // reload debug state at end of frame after breakpoint\n if (this.debugCallback && this.debugBreakState) {\n this.loadState(this.debugBreakState);\n }\n this.frameCount++;\n }\n pollControls() {\n }\n nextFrame(novideo : boolean) : number {\n this.pollControls();\n this.updateRecorder();\n this.preFrame();\n var steps = this.advance(novideo);\n this.postFrame();\n return steps;\n }\n // default debugging\n abstract getSP() : number;\n abstract getPC() : number;\n abstract isStable() : boolean;\n\n evalDebugCondition() {\n if (this.debugCallback && !this.debugBreakState) {\n this.debugCallback();\n }\n }\n wasBreakpointHit() : boolean {\n return this.debugBreakState != null;\n }\n breakpointHit(targetClock : number, reason? : string) {\n console.log(this.debugTargetClock, targetClock, this.debugClock, this.isStable());\n this.debugTargetClock = targetClock;\n this.debugBreakState = this.saveState();\n console.log(\"Breakpoint at clk\", this.debugClock, \"PC\", this.debugBreakState.c.PC.toString(16));\n this.pause();\n if (this.onBreakpointHit) {\n this.onBreakpointHit(this.debugBreakState, reason);\n }\n }\n haltAndCatchFire(reason : string) {\n this.breakpointHit(this.debugClock, reason);\n }\n runEval(evalfunc : DebugEvalCondition) {\n this.setDebugCondition( () => {\n if (++this.debugClock >= this.debugTargetClock && this.isStable()) {\n var cpuState = this.getCPUState();\n if (evalfunc(cpuState)) {\n this.breakpointHit(this.debugClock);\n return true;\n } else {\n return false;\n }\n }\n });\n }\n runToPC(pc: number) {\n this.debugTargetClock++;\n this.runEval((c) => {\n return c.PC == pc;\n });\n }\n runUntilReturn() {\n var SP0 = this.getSP();\n this.runEval( (c:CpuState) : boolean => {\n return c.SP > SP0; // TODO: check for RTS/RET opcode\n });\n }\n runToFrameClock(clock : number) : void {\n this.restartDebugging();\n this.debugTargetClock = clock;\n this.runEval(() : boolean => { return true; });\n }\n step() {\n this.runToFrameClock(this.debugClock+1);\n }\n stepBack() {\n var prevState;\n var prevClock;\n var clock0 = this.debugTargetClock;\n this.restartDebugging();\n this.debugTargetClock = clock0 - 25; // TODO: depends on CPU\n this.runEval( (c:CpuState) : boolean => {\n if (this.debugClock < clock0) {\n prevState = this.saveState();\n prevClock = this.debugClock;\n return false;\n } else {\n if (prevState) {\n this.loadState(prevState);\n this.debugClock = prevClock;\n }\n return true;\n }\n });\n }\n runToVsync() {\n this.restartDebugging();\n var frame0 = this.frameCount;\n this.runEval( () : boolean => {\n return this.frameCount > frame0;\n });\n }\n}\n\nexport function inspectSymbol(platform : Platform, sym : string) : string {\n if (!platform.debugSymbols) return;\n var symmap = platform.debugSymbols.symbolmap;\n var addr2sym = platform.debugSymbols.addr2symbol;\n if (!symmap || !platform.readAddress) return null;\n var addr = symmap[\"_\"+sym] || symmap[sym]; // look for C or asm symbol\n if (!(typeof addr == 'number')) return null;\n var b = platform.readAddress(addr);\n // don't show 2 bytes if there's a symbol at the next address\n if (addr2sym && addr2sym[addr+1] != null) {\n return \"$\"+hex(addr,4) + \" = $\"+hex(b,2)+\" (\"+b+\" decimal)\"; // unsigned\n } else {\n let b2 = platform.readAddress(addr+1);\n let w = b | (b2<<8);\n return \"$\"+hex(addr,4) + \" = $\"+hex(b,2)+\" $\"+hex(b2,2)+\" (\"+((w<<16)>>16)+\" decimal)\"; // signed\n }\n}\n\n////// 6502\n\nexport function getToolForFilename_6502(fn:string) : string {\n if (fn.endsWith(\"-llvm.c\")) return \"remote:llvm-mos\";\n if (fn.endsWith(\".c\")) return \"cc65\";\n if (fn.endsWith(\".h\")) return \"cc65\";\n if (fn.endsWith(\".s\")) return \"ca65\";\n if (fn.endsWith(\".ca65\")) return \"ca65\";\n if (fn.endsWith(\".dasm\")) return \"dasm\";\n if (fn.endsWith(\".acme\")) return \"acme\";\n if (fn.endsWith(\".wiz\")) return \"wiz\";\n if (fn.endsWith(\".ecs\")) return \"ecs\";\n return \"dasm\"; // .a\n}\n\n// TODO: can merge w/ Z80?\nexport abstract class Base6502Platform extends BaseDebugPlatform {\n\n // some platforms store their PC one byte before or after the first opcode\n // so we correct when saving and loading from state\n debugPCDelta = -1;\n fixPC(c) { c.PC = (c.PC + this.debugPCDelta) & 0xffff; return c; }\n unfixPC(c) { c.PC = (c.PC - this.debugPCDelta) & 0xffff; return c;}\n getSP() { return this.getCPUState().SP };\n getPC() { return this.getCPUState().PC };\n isStable() { return !this.getCPUState()['T']; }\n abstract readAddress(addr:number) : number;\n\n newCPU(membus : MemoryBus) {\n var cpu = new _MOS6502();\n cpu.connectBus(membus);\n return cpu;\n }\n\n getOpcodeMetadata(opcode, offset) {\n return getOpcodeMetadata_6502(opcode, offset);\n }\n\n getOriginPC() : number {\n return (this.readAddress(0xfffc) | (this.readAddress(0xfffd) << 8)) & 0xffff;\n }\n\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassemble6502(pc, read(pc), read(pc+1), read(pc+2));\n }\n getToolForFilename = getToolForFilename_6502;\n getDefaultExtension() { return \".a\"; };\n\n getDebugCategories() {\n return ['CPU','ZPRAM','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_6502(state.c);\n case 'ZPRAM': return dumpRAM(state.b||state.ram, 0x0, 0x100);\n case 'Stack': return dumpStackToString(this, state.b||state.ram, 0x100, 0x1ff, 0x100+state.c.SP, 0x20);\n }\n }\n}\n\nexport function cpuStateToLongString_6502(c) : string {\n function decodeFlags(c) {\n var s = \"\";\n s += c.N ? \" N\" : \" -\";\n s += c.V ? \" V\" : \" -\";\n s += c.D ? \" D\" : \" -\";\n s += c.Z ? \" Z\" : \" -\";\n s += c.C ? \" C\" : \" -\";\n s += c.I ? \" I\" : \" -\";\n return s;\n }\n return \"PC \" + hex(c.PC,4) + \" \" + decodeFlags(c) + \"\\n\"\n + \" A \" + hex(c.A) + \" \" + (c.R ? \"\" : \"BUSY\") + \"\\n\"\n + \" X \" + hex(c.X) + \"\\n\"\n + \" Y \" + hex(c.Y) + \" \" + \"SP \" + hex(c.SP) + \"\\n\";\n}\n\nvar OPMETA_6502 = {\n cycletime: [\n 7, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 6, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 0, 6, 0, 6, 3, 3, 3, 3, 2, 0, 2, 0, 4, 4, 4, 4, 2, 6, 0, 0, 4, 4, 4, 4, 2, 5, 2, 0, 0, 5, 0, 0, 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 0, 4, 4, 4, 4, 2, 5, 0, 5, 4, 4, 4, 4, 2, 4, 2, 0, 4, 4, 4, 4, 2, 6, 0, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 3, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7, 2, 6, 0, 8, 3, 3, 5, 5, 2, 2, 2, 0, 4, 4, 6, 6, 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 0, 7, 4, 4, 7, 7\n ],\n extracycles: [\n 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1\n ],\n insnlengths: [\n 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 3, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 0, 2, 0, 2, 2, 2, 2, 2, 1, 0, 1, 0, 3, 3, 3, 3, 2, 2, 0, 0, 2, 2, 2, 3, 1, 3, 1, 0, 0, 3, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 0, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 1, 0, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1, 0, 3, 3, 3, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 3, 0, 3, 3, 3, 3, 3\n ],\n validinsns: [\n 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 0, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 3, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 0, 2, 0, 0, 2, 2, 2, 0, 1, 0, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 3, 1, 0, 0, 3, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 3, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 2, 1, 0, 3, 3, 3, 0, 2, 2, 0, 0, 0, 2, 2, 0, 1, 3, 0, 0, 0, 3, 3, 0\n ],\n}\n\nexport function getOpcodeMetadata_6502(opcode, address) {\n // TODO: more intelligent maximum cycles\n // TODO: must always be new object, b/c we might modify it\n return {\n opcode:opcode,\n minCycles:OPMETA_6502.cycletime[opcode],\n maxCycles:OPMETA_6502.cycletime[opcode] + OPMETA_6502.extracycles[opcode],\n insnlength:OPMETA_6502.insnlengths[opcode]\n };\n}\n\n////// Z80\n\nexport function cpuStateToLongString_Z80(c) {\n function decodeFlags(flags) {\n return printFlags(flags, [\"S\",\"Z\",,\"H\",,\"V\",\"N\",\"C\"], true);\n }\n return \"PC \" + hex(c.PC,4) + \" \" + decodeFlags(c.AF) + \" \" + (c.iff1?\"I\":\"-\") + (c.iff2?\"I\":\"-\") + \"\\n\"\n + \"SP \" + hex(c.SP,4) + \" IR \" + hex(c.IR,4) + \"\\n\"\n + \"IX \" + hex(c.IX,4) + \" IY \" + hex(c.IY,4) + \"\\n\"\n + \"AF \" + hex(c.AF,4) + \" BC \" + hex(c.BC,4) + \"\\n\"\n + \"DE \" + hex(c.DE,4) + \" HL \" + hex(c.HL,4) + \"\\n\"\n ;\n}\n\nexport abstract class BaseZ80Platform extends BaseDebugPlatform {\n\n _cpu;\n waitCycles : number = 0;\n\n newCPU(membus : MemoryBus, iobus : MemoryBus) {\n this._cpu = new Z80();\n this._cpu.connectMemoryBus(membus);\n this._cpu.connectIOBus(iobus);\n return this._cpu;\n }\n\n getPC() { return this._cpu.getPC(); }\n getSP() { return this._cpu.getSP(); }\n isStable() { return true; }\n\n // TODO: refactor other parts into here\n runCPU(cpu, cycles:number) : number {\n this._cpu = cpu; // TODO?\n this.waitCycles = 0; // TODO: needs to spill over betwenn calls\n if (this.wasBreakpointHit())\n return 0;\n var debugCond = this.getDebugCallback();\n var n = 0;\n this.waitCycles += cycles;\n while (this.waitCycles > 0) {\n if (debugCond && debugCond()) {\n debugCond = null;\n break;\n }\n var cyc = cpu.advanceInsn();\n n += cyc;\n this.waitCycles -= cyc;\n }\n return n;\n }\n\n getToolForFilename = getToolForFilename_z80;\n getDefaultExtension() { return \".c\"; };\n // TODO: Z80 opcode metadata\n //this.getOpcodeMetadata = function() { }\n\n getDebugCategories() {\n return ['CPU','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_Z80(state.c);\n case 'Stack': {\n var sp = (state.c.SP-1) & 0xffff;\n var start = sp & 0xff00;\n var end = start + 0xff;\n if (sp == 0) sp = 0x10000;\n console.log(sp,start,end);\n return dumpStackToString(this, [], start, end, sp, 0xcd);\n }\n }\n }\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassembleZ80(pc, read(pc), read(pc+1), read(pc+2), read(pc+3));\n }\n}\n\nexport function getToolForFilename_z80(fn:string) : string {\n if (fn.endsWith(\".c\")) return \"sdcc\";\n if (fn.endsWith(\".h\")) return \"sdcc\";\n if (fn.endsWith(\".s\")) return \"sdasz80\";\n if (fn.endsWith(\".ns\")) return \"naken\";\n if (fn.endsWith(\".scc\")) return \"sccz80\";\n if (fn.endsWith(\".z\")) return \"zmac\";\n if (fn.endsWith(\".wiz\")) return \"wiz\";\n return \"zmac\";\n}\n\n////// 6809\n\nexport function cpuStateToLongString_6809(c) {\n function decodeFlags(flags) {\n return printFlags(flags, [\"E\",\"F\",\"H\",\"I\", \"N\",\"Z\",\"V\",\"C\"], true);\n }\n return \"PC \" + hex(c.PC,4) + \" \" + decodeFlags(c.CC) + \"\\n\"\n + \"SP \" + hex(c.SP,4) + \"\\n\"\n + \"DP \" + hex(c.DP,2) + \"\\n\"\n + \" A \" + hex(c.A,2) + \"\\n\"\n + \" B \" + hex(c.B,2) + \"\\n\"\n + \" X \" + hex(c.X,4) + \"\\n\"\n + \" Y \" + hex(c.Y,4) + \"\\n\"\n + \" U \" + hex(c.U,4) + \"\\n\"\n ;\n}\n\nexport function getToolForFilename_6809(fn:string) : string {\n if (fn.endsWith(\".c\")) return \"cmoc\";\n if (fn.endsWith(\".h\")) return \"cmoc\";\n if (fn.endsWith(\".xasm\")) return \"xasm6809\";\n if (fn.endsWith(\".lwasm\")) return \"lwasm\";\n return \"cmoc\";\n}\n\nexport abstract class Base6809Platform extends BaseZ80Platform {\n\n newCPU(membus : MemoryBus) {\n var cpu = Object.create(CPU6809());\n cpu.init(membus.write, membus.read, 0);\n return cpu;\n }\n\n cpuStateToLongString(c:CpuState) {\n return cpuStateToLongString_6809(c);\n }\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n // TODO: don't create new CPU\n return Object.create(CPU6809()).disasm(read(pc), read(pc+1), read(pc+2), read(pc+3), read(pc+4), pc);\n }\n getDefaultExtension() : string { return \".asm\"; };\n //this.getOpcodeMetadata = function() { }\n getToolForFilename = getToolForFilename_6809;\n getDebugCategories() {\n return ['CPU','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_6809(state.c);\n default: return super.getDebugInfo(category, state);\n }\n }\n}\n\n\n//TODO: how to get stack_end?\nexport function dumpStackToString(platform:Platform, mem:Uint8Array|number[], start:number, end:number, sp:number, jsrop:number, bigendian?:boolean) : string {\n var s = \"\";\n var nraw = 0;\n //s = dumpRAM(mem.slice(start,start+end+1), start, end-start+1);\n function read(addr) {\n if (addr < mem.length) return mem[addr];\n else return platform.readAddress(addr);\n }\n while (sp < end) {\n sp++;\n // see if there's a JSR on the stack here\n // TODO: make work with roms and memory maps\n var addr = read(sp) + read(sp+1)*256;\n if (bigendian) { addr = ((addr & 0xff) << 8) | ((addr & 0xff00) >> 8) }\n var jsrofs = jsrop==0x20 ? -2 : -3; // 6502 vs Z80\n var opcode = read(addr + jsrofs); // might be out of bounds\n if (opcode == jsrop) { // JSR\n s += \"\\n$\" + hex(sp) + \": \";\n s += hex(addr,4) + \" \" + lookupSymbol(platform, addr, true);\n sp++;\n nraw = 0;\n } else {\n if (nraw == 0)\n s += \"\\n$\" + hex(sp) + \": \";\n s += hex(read(sp)) + \" \";\n if (++nraw == 8) nraw = 0;\n }\n }\n return s+\"\\n\";\n}\n\n// TODO: slow, funky, uses global\nexport function lookupSymbol(platform:Platform, addr:number, extra:boolean) {\n var start = addr;\n var addr2symbol = platform.debugSymbols && platform.debugSymbols.addr2symbol;\n while (addr2symbol && addr >= 0) {\n var sym = addr2symbol[addr];\n if (sym) { // return first symbol we find\n var sym = addr2symbol[addr];\n return extra ? (sym + \" + $\" + hex(start-addr)) : sym;\n }\n if (!extra) break;\n addr--;\n }\n return \"\";\n}\n\n/// new Machine platform adapters\n\nexport interface Machine extends Bus, Resettable, FrameBased, AcceptsROM, HasCPU, SavesState, SavesInputState {\n}\n\nexport function hasVideo(arg:any): arg is VideoSource {\n return typeof arg.connectVideo === 'function';\n}\nexport function hasAudio(arg:any): arg is SampledAudioSource {\n return typeof arg.connectAudio === 'function';\n}\nexport function hasKeyInput(arg:any): arg is AcceptsKeyInput {\n return typeof arg.setKeyInput === 'function';\n}\nexport function hasJoyInput(arg:any): arg is AcceptsJoyInput {\n return typeof arg.setJoyInput === 'function';\n}\nexport function hasPaddleInput(arg:any): arg is AcceptsPaddleInput {\n return typeof arg.setPaddleInput === 'function';\n}\nexport function isRaster(arg:any): arg is RasterFrameBased {\n return typeof arg.getRasterY === 'function';\n}\nexport function hasProbe(arg:any): arg is Probeable {\n return typeof arg.connectProbe == 'function';\n}\nexport function hasBIOS(arg:any): arg is AcceptsBIOS {\n return typeof arg.loadBIOS == 'function';\n}\nexport function hasSerialIO(arg:any): arg is HasSerialIO {\n return typeof arg.connectSerialIO === 'function';\n}\n\nexport abstract class BaseMachinePlatform extends BaseDebugPlatform implements Platform {\n machine : T;\n mainElement : HTMLElement;\n timer : AnimationTimer;\n video : RasterVideo;\n audio : SampledAudio;\n poller : ControllerPoller;\n serialIOInterface : SerialIOInterface;\n serialVisualizer : SerialIOVisualizer;\n\n probeRecorder : ProbeRecorder;\n startProbing;\n stopProbing;\n\n abstract newMachine() : T;\n abstract getToolForFilename(s:string) : string;\n abstract getDefaultExtension() : string;\n abstract getPresets() : Preset[];\n \n constructor(mainElement : HTMLElement) {\n super();\n this.mainElement = mainElement;\n }\n\n reset() {\n this.machine.reset();\n if (this.serialVisualizer != null) this.serialVisualizer.reset();\n }\n loadState(s) { this.machine.loadState(s); }\n saveState() { return this.machine.saveState(); }\n getSP() { return this.machine.cpu.getSP(); }\n getPC() { return this.machine.cpu.getPC(); }\n isStable() \t { return this.machine.cpu.isStable(); }\n getCPUState() { return this.machine.cpu.saveState(); }\n loadControlsState(s) { this.machine.loadControlsState(s); }\n saveControlsState() { return this.machine.saveControlsState(); }\n \n async start() {\n this.machine = this.newMachine();\n const m = this.machine;\n // block on WASM loading\n if (m instanceof BaseWASMMachine) {\n await m.loadWASM();\n }\n var videoFrequency;\n if (hasVideo(m)) {\n var vp = m.getVideoParams();\n this.video = new RasterVideo(this.mainElement, vp.width, vp.height, \n {overscan: !!vp.overscan,\n rotate: vp.rotate|0,\n aspect: vp.aspect});\n this.video.create();\n m.connectVideo(this.video.getFrameData());\n // TODO: support keyboard w/o video?\n if (hasKeyInput(m)) {\n this.video.setKeyboardEvents(m.setKeyInput.bind(m));\n this.poller = new ControllerPoller(m.setKeyInput.bind(m));\n }\n videoFrequency = vp.videoFrequency;\n }\n this.timer = new AnimationTimer(videoFrequency || 60, this.nextFrame.bind(this));\n if (hasAudio(m)) {\n var ap = m.getAudioParams();\n this.audio = new SampledAudio(ap.sampleRate);\n this.audio.start();\n m.connectAudio(this.audio);\n }\n if (hasPaddleInput(m)) {\n this.video.setupMouseEvents();\n }\n if (hasProbe(m)) {\n this.probeRecorder = new ProbeRecorder(m);\n this.startProbing = () => {\n m.connectProbe(this.probeRecorder);\n return this.probeRecorder;\n };\n this.stopProbing = () => {\n m.connectProbe(null);\n };\n }\n if (hasBIOS(m)) {\n this.loadBIOS = (title, data) => {\n m.loadBIOS(data, title);\n };\n }\n if (hasSerialIO(m)) {\n if (this.serialIOInterface == null) {\n this.serialVisualizer = new SerialIOVisualizer(this.mainElement, m);\n } else {\n m.connectSerialIO(this.serialIOInterface);\n }\n }\n }\n \n loadROM(title, data) {\n this.machine.loadROM(data, title);\n this.reset();\n }\n\n loadBIOS : (title, data) => void; // only set if hasBIOS() is true\n\n pollControls() {\n this.poller && this.poller.poll();\n if (hasPaddleInput(this.machine)) {\n this.machine.setPaddleInput(0, this.video.paddle_x);\n this.machine.setPaddleInput(1, this.video.paddle_y);\n }\n // TODO: put into interface\n if (this.machine['pollControls']) {\n this.machine['pollControls']();\n }\n }\n\n advance(novideo:boolean) {\n let trap = this.getDebugCallback();\n var steps = this.machine.advanceFrame(trap);\n if (!novideo && this.video) this.video.updateFrame();\n if (!novideo && this.serialVisualizer) this.serialVisualizer.refresh();\n return steps;\n }\n\n advanceFrameClock(trap, step) {\n if (!(step > 0)) return;\n if (this.machine instanceof BaseWASMMachine) {\n return this.machine.advanceFrameClock(trap, step);\n } else {\n return this.machine.advanceFrame(() => {\n return --step <= 0;\n });\n }\n }\n\n isRunning() {\n return this.timer && this.timer.isRunning();\n }\n\n resume() {\n this.timer.start();\n this.audio && this.audio.start();\n }\n\n pause() {\n this.timer.stop();\n this.audio && this.audio.stop();\n }\n\n // so probe views stick around TODO: must be a better way?\n runToVsync() {\n this.restartDebugging();\n var flag = false;\n this.runEval( () : boolean => {\n if (this.getRasterScanline() > 0) flag = true;\n else return flag;\n });\n }\n\n // TODO: reset target clock counter\n getRasterScanline() {\n return isRaster(this.machine) && this.machine.getRasterY();\n }\n\n readAddress(addr : number) : number {\n return this.machine.read(addr);\n }\n\n getDebugCategories() {\n if (isDebuggable(this.machine))\n return this.machine.getDebugCategories();\n }\n getDebugInfo(category:string, state:EmuState) : string {\n return isDebuggable(this.machine) && this.machine.getDebugInfo(category, state);\n }\n}\n\n// TODO: move debug info into CPU?\n\nexport abstract class Base6502MachinePlatform extends BaseMachinePlatform {\n\n getOpcodeMetadata = getOpcodeMetadata_6502;\n getToolForFilename = getToolForFilename_6502;\n\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassemble6502(pc, read(pc), read(pc+1), read(pc+2));\n }\n getDebugCategories() {\n if (isDebuggable(this.machine))\n return this.machine.getDebugCategories();\n else\n return ['CPU','ZPRAM','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_6502(state.c);\n case 'ZPRAM': return dumpRAM(state.b||state.ram, 0x0, 0x100);\n case 'Stack': return dumpStackToString(this, state.b||state.ram, 0x100, 0x1ff, 0x100+state.c.SP, 0x20);\n default: return isDebuggable(this.machine) && this.machine.getDebugInfo(category, state);\n }\n }\n}\n\nexport abstract class BaseZ80MachinePlatform extends BaseMachinePlatform {\n\n //getOpcodeMetadata = getOpcodeMetadata_z80;\n getToolForFilename = getToolForFilename_z80;\n\n getDebugCategories() {\n if (isDebuggable(this.machine))\n return this.machine.getDebugCategories();\n else\n return ['CPU','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_Z80(state.c);\n case 'Stack': {\n var sp = (state.c.SP-1) & 0xffff;\n var start = sp & 0xff00;\n var end = start + 0xff;\n if (sp == 0) sp = 0x10000;\n return dumpStackToString(this, [], start, end, sp, 0xcd);\n }\n default: return isDebuggable(this.machine) && this.machine.getDebugInfo(category, state);\n }\n }\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassembleZ80(pc, read(pc), read(pc+1), read(pc+2), read(pc+3));\n }\n\n}\n\nexport abstract class Base6809MachinePlatform extends BaseMachinePlatform {\n\n getToolForFilename = getToolForFilename_6809;\n\n getDebugCategories() {\n if (isDebuggable(this.machine))\n return this.machine.getDebugCategories();\n else\n return ['CPU','Stack'];\n }\n getDebugInfo(category:string, state:EmuState) : string {\n switch (category) {\n case 'CPU': return cpuStateToLongString_6809(state.c);\n case 'Stack': {\n var sp = (state.c.SP-1) & 0xffff;\n var start = sp & 0xff00;\n var end = start + 0xff;\n if (sp == 0) sp = 0x10000;\n return dumpStackToString(this, [], start, end, sp, 0x17, true);\n }\n default: return super.getDebugInfo(category, state);\n }\n }\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n // TODO: don't create new CPU\n return Object.create(CPU6809()).disasm(read(pc), read(pc+1), read(pc+2), read(pc+3), read(pc+4), pc);\n }\n}\n\n///\n\nclass SerialIOVisualizer {\n\n textarea : HTMLTextAreaElement;\n //vlist: VirtualTextScroller;\n device: HasSerialIO;\n lastOutCount = -1;\n lastInCount = -1;\n\n constructor(parentElement: HTMLElement, device: HasSerialIO) {\n this.device = device;\n this.textarea = document.createElement(\"textarea\");\n this.textarea.classList.add('transcript');\n this.textarea.classList.add('transcript-style-2');\n this.textarea.style.display = 'none';\n parentElement.appendChild(this.textarea);\n /*\n this.vlist = new VirtualTextScroller(parentElement);\n this.vlist.create(parentElement, 1024, this.getMemoryLineAt.bind(this));\n this.vlist.maindiv.style.height = '8em';\n this.vlist.maindiv.style.overflow = 'clip';\n */\n }\n reset() {\n this.lastOutCount = 0;\n this.lastInCount = 0;\n this.textarea.style.display = 'none';\n }\n refresh() {\n var lastop = '';\n if (this.device.serialOut.length != this.lastOutCount) {\n var s = '';\n for (var ev of this.device.serialOut) {\n if (lastop != ev.op) {\n if (s != '') s += '\\n';\n if (ev.op === 'read') s += '<< ';\n else if (ev.op === 'write') s += '>> ';\n lastop = ev.op;\n }\n if (ev.value == 10) { s += '\\u21b5'; lastop = ''; }\n else { s += byteToASCII(ev.value); }\n }\n this.textarea.value = s;\n this.lastOutCount = this.device.serialOut.length;\n this.textarea.style.display = 'block';\n }\n }\n}\n"], + "mappings": "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,GAAI,GAAI,GAAI,GAAK,EAAI,EAAI,EAAI,EAC7D,GAAI,GAAI,GAAI,GAAK,EAAI,EAAI,EAAI,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAG5D,EAAkB,CAClB,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,GAG5D,EAAkB,CAClB,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC5D,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,GAAK,EAC7D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,E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,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IACrhC,GAAQ,GAAI,YAAY,CA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C9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAGhC,GAAU,CACR,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAGhC,EAAU,CACR,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EA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,GAAI,CAAC,EACtC,UACK,IACD,EAAK,IACT,UACK,IACD,EAAK,IACT,UAEK,IACD,GAAK,KACT,UACK,IACD,GAAK,KACT,UACK,IACD,GAAK,KACT,UACK,IACD,GAAK,KACT,UACK,IACD,EAAK,KACT,UACK,IACD,GAAM,EACV,UACK,IACD,EAAK,KACD,EAAK,GACL,IAAG,EACH,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MAET,EAAK,KACT,UACK,IACD,GAAM,IACV,UACK,IACD,EAAO,EAAK,EACZ,AAAI,IAAO,EAAG,GAAI,EAAa,GAAI,CAAC,EACpC,AAAI,EAAK,IAAM,GAAI,EAAc,GAAI,CAAC,EACtC,GAAK,GACT,UACK,IACD,GAAM,EACN,EAAM,GACN,EAAM,GACN,EAAM,GACN,EAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,EAAY,EAClB,EAAK,EAAS,GAClB,UAEK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,EAAK,GACd,UACK,IACD,EAAK,EAAK,GACd,UACK,IACD,GAAM,CAAE,GAAO,EAAW,GAC1B,GAAM,EAAQ,GAClB,UACK,IACD,EAAK,EACL,GAAM,CAAE,GAAW,EAAW,GAC9B,GAAM,EACV,UAEK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,GAAK,GACd,UACK,IACD,EAAK,EAAK,GACd,UACK,IACD,EAAK,EAAK,GACd,UACK,IACD,GAAM,CAAE,GAAO,EAAW,GAC1B,GAAM,EAAQ,GAClB,UACK,IACD,EAAK,EACL,GAAM,CAAE,GAAW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,IACvB,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,EAAO,IAAO,EAAS,IAC3B,UACK,KACD,EAAO,IACP,EAAO,EAAG,EAAS,IACvB,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAK,IACL,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,EAAK,EAAS,GACd,GAAU,GACV,GAAI,CAAC,EACT,UACK,KACD,EAAO,IACP,GAAU,EAAK,GACf,GAAU,GACV,GAAI,CAAC,EACT,MAGZ,UAEK,IAIG,OAFA,EAAS,IACT,GAAG,GAAQ,GACJ,OACE,IACD,GAAM,EACN,EAAM,GACN,EAAM,GACN,EAAM,GACN,EAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,EAAY,EAClB,EAAK,EAAS,IAClB,UACK,KACD,EAAO,EAAI,KACf,UACK,KACD,EAAO,EAAI,KACf,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,UACK,KACD,EAAO,IACP,EAAO,EAAI,EAAS,IACxB,MAIZ,MAKJ,UAAM,IACN,GAAM,IACN,GAAM,IACN,GAAM,IACN,GAAM,MACN,GAAM,MACN,GAAM,MACN,GAAM,MACN,GAAM,MACC,EAAE,GAIT,GAAQ,UAAU,CAClB,EAAK,EAAS,GACd,EAAK,EACL,GAAM,EAAa,EACnB,EAAE,EACF,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAqBrB,GAAK,CACT,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,UACP,CAAC,EAAI,EAAE,UACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,SACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,GAAG,OACR,CAAC,EAAI,GAAG,OACR,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,GAAG,QACR,CAAC,EAAI,GAAG,QACR,CAAC,EAAI,GAAG,QACR,CAAC,EAAI,GAAG,QACR,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,SACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,OACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC,EAAI,EAAE,QACP,CAAC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EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAG3C,GAAc,CAChB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAG3C,GAAc,CAChB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAG3C,GAAa,CACf,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG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AG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAE1yB,YAAa,CACb,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAE1yB,YAAa,CACb,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAE1yB,WAAY,CACZ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAM,E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", "names": [] } diff --git a/gen/chunk-YL2YTMD7.js b/gen/chunk-7LTJUW24.js similarity index 92% rename from gen/chunk-YL2YTMD7.js rename to gen/chunk-7LTJUW24.js index e984ef6f..89a59926 100644 --- a/gen/chunk-YL2YTMD7.js +++ b/gen/chunk-7LTJUW24.js @@ -1,6 +1,6 @@ function re(e,t){for(e+="";e.length0?e.substr(0,t):e}function V(e,t){return t||(t=2),t==8?V(e>>16&65535,4)+V(e&65535,4):D(e,t,16)}function ce(e,t){return t||(t=8),D(e,t,2)}function D(e,t,r){try{for(var n=e.toString(r).toUpperCase();n.length=0)for(;i'+c+""),a+=c,i++,s++}for(;s>6)+3,E=(v&63)+8):(K=n[v&31],E=(v>>5)+1),_=0;_=192&&i<224)i=(i&31)<<6|e[n++]&63;else if(i=(i&15)<<12|(e[n]&63)<<6|e[n+1]&63,n+=2,i==65279)continue;t+=String.fromCharCode(i)}return t}function he(e,t){var r=0;if(e){e=e.toUpperCase();let a=[".CHR",".BIN",".DAT",".PAL",".NAM",".RLE",".LZ4",".NSF"];for(var n of a)e.endsWith(n)&&r++}for(var i=0;i<(t?t.length:0);){let a=t[i++];if((a&128)==0){if(a<9||a>=14&&a<26||a==127){r++;break}}else{var s=0;for((a&224)==192?s=1:(a&240)==224?s=2:(a&248)==240?s=3:(a<160||a==255)&&r++;s--;)if(i>=t.length||(t[i++]&192)!=128){r++;break}}}return r>0}function pe(e,t,r){for(var n=r||9,i=t.length,s=e._malloc(i+1),a=0;a0&&(n+=" "),n+=e&s?t[i]:"-"}return n}function ve(e){return(e&255)<<16|e>>16&255|e&65280}function P(e,t,r){return e&255|(t&255)<<8|(r&255)<<16|4278190080}function A(e,t,r){return rt?t:r}function xe(e){return e.length==0?"":(e.match(/^[a-zA-Z_]/)||(e="_"+e),e.replace(/\W+/g,"_"))}function de(e){for(var t=0,r=e[t++],n=[],i=r;t{var n=document.createElement("script");n.onload=t,n.onerror=r,n.src=e,document.getElementsByTagName("head")[0].appendChild(n)})}function Ve(e){e.startsWith("?")&&(e=e.substr(1));var t=e.split("&");if(!t||t.length==0)return{};for(var r={},n=0;n100)for(var m=document.querySelectorAll('[data-rm="1"]'),p=0,x=m.length;pc){var x=Math.floor(p/n)-s;a._renderChunk(a.container,x<0?0:x),o=p}l=Date.now(),m.preventDefault&&m.preventDefault()}this.container.addEventListener("scroll",h)}d.prototype.createRow=function(e){var t;if(this.generatorFn)t=this.generatorFn(e);else if(this.items)if(typeof this.items[e]=="string"){var r=document.createTextNode(this.items[e]);t=document.createElement("div"),t.style.height=this.itemHeight+"px",t.appendChild(r)}else t=this.items[e];return t.classList.add("vrow"),t.setAttribute("data-index",""+e),t.style.position="absolute",t.style.top=e*this.itemHeight+"px",t};d.prototype._renderChunk=function(e,t){var r=t+this.cachedItemsLen;r>this.totalRows&&(r=this.totalRows);for(var n=document.createDocumentFragment(),i=t;i>17,e^=e<<5,(w=e)&255}function Ue(){return w}function Ne(e){w=e}function X(e,t,r,n){var i=e.createElement("canvas");return i.width=r,i.height=n,i.classList.add("emuvideo"),i.tabIndex=-1,t.appendChild(i),i}var u;(function(o){o[o.KeyDown=1]="KeyDown",o[o.Shift=2]="Shift",o[o.Ctrl=4]="Ctrl",o[o.Alt=8]="Alt",o[o.Meta=16]="Meta",o[o.KeyUp=64]="KeyUp",o[o.KeyPress=128]="KeyPress"})(u||(u={}));function W(e,t){e.onkeydown=r=>{let n=R(r);t(r.which,r.keyCode,1|n),n||r.preventDefault()},e.onkeyup=r=>{t(r.which,r.keyCode,64|R(r))}}var U=class{constructor(t,r,n,i){this.paddle_x=255;this.paddle_y=255;this.mainElement=t,this.width=r,this.height=n,this.options=i}setRotate(t){var r=this.canvas;t?(r.style.transform="rotate("+t+"deg)",r.width{var n=j(t,r),i=Math.floor(n.x*255/this.canvas.width),s=Math.floor(n.y*255/this.canvas.height);this.paddle_x=A(0,255,i),this.paddle_y=A(0,255,s)})}},Y=class extends U{constructor(){super(...arguments);this.persistenceAlpha=.5;this.jitter=1;this.gamma=.8;this.COLORS=["#111111","#1111ff","#11ff11","#11ffff","#ff1111","#ff11ff","#ffff11","#ffffff"]}create(){super.create(),this.sx=this.width/1024,this.sy=this.height/1024}clear(){var t=this.ctx;t.globalCompositeOperation="source-over",t.globalAlpha=this.persistenceAlpha,t.fillStyle="#000000",t.fillRect(0,0,this.width,this.height),t.globalAlpha=1,t.globalCompositeOperation="lighter"}drawLine(t,r,n,i,s,a){var o=this.ctx,c=this.sx,l=this.sy;if(s>0){var h=Math.pow(s/255,this.gamma);o.globalAlpha=h,o.lineWidth=3,o.beginPath();var m=this.jitter*(Math.random()-.5),p=this.jitter*(Math.random()-.5);t+=m,n+=m,r+=p,i+=p,o.moveTo(t*c,this.height-r*l),t==n&&r==i?o.lineTo(n*c+1,this.height-i*l):o.lineTo(n*c,this.height-i*l),o.strokeStyle=this.COLORS[a&7],o.stroke()}}},N=class{constructor(t){this.mem=new Uint8Array(new ArrayBuffer(t))}},C=class extends Error{constructor(t,r){super(t);this.$loc=r,Object.setPrototypeOf(this,C.prototype)}},Z=!1,z=class{constructor(t,r){this.running=!1;this.pulsing=!1;this.nextts=0;this.useReqAnimFrame=Z&&typeof window.requestAnimationFrame=="function";this.frameRate=t,this.intervalMsec=1e3/t,this.callback=r}scheduleFrame(t){var r=n=>{try{this.nextFrame(this.useReqAnimFrame?n:Date.now())}catch(i){throw this.running=!1,this.pulsing=!1,i}};this.useReqAnimFrame?window.requestAnimationFrame(r):setTimeout(r,t)}nextFrame(t){t>this.nextts&&(this.running&&this.callback(),this.nframes==0&&(this.startts=t),this.nframes++==300&&console.log("Avg framerate: "+this.nframes*1e3/(t-this.startts)+" fps")),this.nextts+=this.intervalMsec,t-this.nextts>1e3&&(this.nextts=t),this.running?this.scheduleFrame(this.nextts-t):this.pulsing=!1}isRunning(){return this.running}start(){this.running||(this.running=!0,this.nextts=0,this.nframes=0,this.pulsing||(this.scheduleFrame(0),this.pulsing=!0))}stop(){this.running=!1}};function Re(e,t,r){for(var n="",i=e.BYTES_PER_ELEMENT||1,s=Math.ceil(16/i),a=e instanceof Float32Array||e instanceof Float64Array,o=0;o'+c+""),a+=c,i++,s++}for(;s>6)+3,E=(v&63)+8):(K=n[v&31],E=(v>>5)+1),_=0;_=192&&i<224)i=(i&31)<<6|e[n++]&63;else if(i=(i&15)<<12|(e[n]&63)<<6|e[n+1]&63,n+=2,i==65279)continue;t+=String.fromCharCode(i)}return t}function he(e,t){var r=0;if(e){e=e.toUpperCase();let a=[".CHR",".BIN",".DAT",".PAL",".NAM",".RLE",".LZ4",".NSF"];for(var n of a)e.endsWith(n)&&r++}for(var i=0;i<(t?t.length:0);){let a=t[i++];if((a&128)==0){if(a<9||a>=14&&a<26||a==127){r++;break}}else{var s=0;for((a&224)==192?s=1:(a&240)==224?s=2:(a&248)==240?s=3:(a<160||a==255)&&r++;s--;)if(i>=t.length||(t[i++]&192)!=128){r++;break}}}return r>0}function pe(e,t,r){for(var n=r||9,i=t.length,s=e._malloc(i+1),a=0;a0&&(n+=" "),n+=e&s?t[i]:"-"}return n}function ve(e){return(e&255)<<16|e>>16&255|e&65280}function P(e,t,r){return e&255|(t&255)<<8|(r&255)<<16|4278190080}function A(e,t,r){return rt?t:r}function xe(e){return e.length==0?"":(e.match(/^[a-zA-Z_]/)||(e="_"+e),e.replace(/\W+/g,"_"))}function de(e){for(var t=0,r=e[t++],n=[],i=r;t{var n=document.createElement("script");n.onload=t,n.onerror=r,n.src=e,document.getElementsByTagName("head")[0].appendChild(n)})}function Ve(e){e.startsWith("?")&&(e=e.substr(1));var t=e.split("&");if(!t||t.length==0)return{};for(var r={},n=0;n100)for(var m=document.querySelectorAll('[data-rm="1"]'),p=0,x=m.length;pc){var x=Math.floor(p/n)-s;a._renderChunk(a.container,x<0?0:x),o=p}l=Date.now(),m.preventDefault&&m.preventDefault()}this.container.addEventListener("scroll",h)}d.prototype.createRow=function(e){var t;if(this.generatorFn)t=this.generatorFn(e);else if(this.items)if(typeof this.items[e]=="string"){var r=document.createTextNode(this.items[e]);t=document.createElement("div"),t.style.height=this.itemHeight+"px",t.appendChild(r)}else t=this.items[e];return t.classList.add("vrow"),t.setAttribute("data-index",""+e),t.style.position="absolute",t.style.top=e*this.itemHeight+"px",t};d.prototype._renderChunk=function(e,t){var r=t+this.cachedItemsLen;r>this.totalRows&&(r=this.totalRows);for(var n=document.createDocumentFragment(),i=t;i>17,e^=e<<5,(w=e)&255}function Ue(){return w}function Ne(e){w=e}function X(e,t,r,n){var i=e.createElement("canvas");return i.width=r,i.height=n,i.classList.add("emuvideo"),i.tabIndex=-1,t.appendChild(i),i}var u;(function(o){o[o.KeyDown=1]="KeyDown",o[o.Shift=2]="Shift",o[o.Ctrl=4]="Ctrl",o[o.Alt=8]="Alt",o[o.Meta=16]="Meta",o[o.KeyUp=64]="KeyUp",o[o.KeyPress=128]="KeyPress"})(u||(u={}));function W(e,t){e.onkeydown=r=>{let n=R(r);t(r.which,r.keyCode,1|n),n||r.preventDefault()},e.onkeyup=r=>{t(r.which,r.keyCode,64|R(r))}}var U=class{constructor(t,r,n,i){this.paddle_x=255;this.paddle_y=255;this.mainElement=t,this.width=r,this.height=n,this.options=i}setRotate(t){var r=this.canvas;t?(r.style.transform="rotate("+t+"deg)",r.width{var n=j(t,r),i=Math.floor(n.x*255/this.canvas.width),s=Math.floor(n.y*255/this.canvas.height);this.paddle_x=A(0,255,i),this.paddle_y=A(0,255,s)})}},Y=class extends U{constructor(){super(...arguments);this.persistenceAlpha=.5;this.jitter=1;this.gamma=.8;this.COLORS=["#111111","#1111ff","#11ff11","#11ffff","#ff1111","#ff11ff","#ffff11","#ffffff"]}create(){super.create(),this.sx=this.width/1024,this.sy=this.height/1024}clear(){var t=this.ctx;t.globalCompositeOperation="source-over",t.globalAlpha=this.persistenceAlpha,t.fillStyle="#000000",t.fillRect(0,0,this.width,this.height),t.globalAlpha=1,t.globalCompositeOperation="lighter"}drawLine(t,r,n,i,s,a){var o=this.ctx,c=this.sx,l=this.sy;if(s>0){var h=Math.pow(s/255,this.gamma);o.globalAlpha=h,o.lineWidth=3,o.beginPath();var m=this.jitter*(Math.random()-.5),p=this.jitter*(Math.random()-.5);t+=m,n+=m,r+=p,i+=p,o.moveTo(t*c,this.height-r*l),t==n&&r==i?o.lineTo(n*c+1,this.height-i*l):o.lineTo(n*c,this.height-i*l),o.strokeStyle=this.COLORS[a&7],o.stroke()}}},N=class{constructor(t){this.mem=new Uint8Array(new ArrayBuffer(t))}},C=class extends Error{constructor(t,r){super(t);this.squelchError=!0;this.$loc=r,Object.setPrototypeOf(this,C.prototype)}},Z=!1,z=class{constructor(t,r){this.running=!1;this.pulsing=!1;this.nextts=0;this.useReqAnimFrame=Z&&typeof window.requestAnimationFrame=="function";this.frameRate=t,this.intervalMsec=1e3/t,this.callback=r}scheduleFrame(t){var r=n=>{try{this.nextFrame(this.useReqAnimFrame?n:Date.now())}catch(i){throw this.running=!1,this.pulsing=!1,i}};this.useReqAnimFrame?window.requestAnimationFrame(r):setTimeout(r,t)}nextFrame(t){t>this.nextts&&(this.running&&this.callback(),this.nframes==0&&(this.startts=t),this.nframes++==300&&console.log("Avg framerate: "+this.nframes*1e3/(t-this.startts)+" fps")),this.nextts+=this.intervalMsec,t-this.nextts>1e3&&(this.nextts=t),this.running?this.scheduleFrame(this.nextts-t):this.pulsing=!1}isRunning(){return this.running}start(){this.running||(this.running=!0,this.nextts=0,this.nframes=0,this.pulsing||(this.scheduleFrame(0),this.pulsing=!0))}stop(){this.running=!1}};function Re(e,t,r){for(var n="",i=e.BYTES_PER_ELEMENT||1,s=Math.ceil(16/i),a=e instanceof Float32Array||e instanceof Float64Array,o=0;o{if(!t){r(null,i,s,a);return}var o=t[i];if(o||(o=t[0]),r&&(o||n)&&r(o,i,s,a),o){var c=o.mask;c<0&&(c=-c,a&(1|64)&&(a^=1|64)),a&1?e[o.index]|=c:a&64&&(e[o.index]&=~c)}}}function Fe(e,t,r,n,i){var s=q(t,r,n,i);return e.setKeyboardEvents(s),new F(s)}function Oe(e){for(var t=new Map,r=0;r{console.log("Gamepad connected:",r),this.reset()}),window.addEventListener("gamepaddisconnected",r=>{console.log("Gamepad disconnected:",r),this.reset()})}reset(){if(this.active=typeof navigator.getGamepads=="function",this.active){let r=navigator.getGamepads().length;this.state=new Array(r),this.lastState=new Array(r);for(var t=0;tt)throw Error("Data too long, "+e.length+" > "+t);var n=new N(t);return r?n.mem.set(e,t-e.length):n.mem.set(e),n.mem}function J(e,t){var r=this;function n(){var i="";t&&t.gmask&&(i+="a&="+t.gmask+";");for(var s=0;s="+o+" && a<="+c+"){",l&&(i+="a&="+l+";"),i+="return this.__fn"+s+`(a,v)&0xff;} `}return i+="return 0;",new Function("a","v",i)}return n().bind(r)}function He(e,t){return new J(e,t)}function j(e,t){var r=e.getBoundingClientRect(),n=e.width/r.width,i=e.height/r.height;return{x:(t.clientX-r.left)*n,y:(t.clientY-r.top)*i}}function ee(){return $("#booksMenuButton").first().height()}var te=class{constructor(t){var r=document.createElement("div");r.setAttribute("class","memdump"),t.appendChild(r),this.maindiv=r}create(t,r,n){this.getLineAt=n,this.memorylist=new d({w:$(t).width(),h:$(t).height(),itemHeight:ee(),totalRows:r,generatorFn:i=>{var s=n(i),a=document.createElement("div");return a.appendChild(document.createTextNode(s.text)),s.clas!=null&&(a.className=s.clas),a}}),$(this.maindiv).append(this.memorylist.container)}refresh(){this.memorylist&&$(this.maindiv).find("[data-index]").each((t,r)=>{var n=r,i=parseInt(n.getAttribute("data-index")),s=n.innerText,a=this.getLineAt(i),o=a.text;if(s!=o&&(n.innerText=o,a.clas!=null&&!n.classList.contains(a.clas))){var c=Array.from(n.classList);c.forEach(l=>n.classList.remove(l)),n.classList.add("vrow"),n.classList.add(a.clas)}})}};function Be(e){let t=.9,r=1.1,n=60,i=e>>4&15,s=e&15,a=i?n:0;i&&(s+=1);let o=((i-1)*25-25)*(2*Math.PI/360),c=256*r*Math.pow(s/16,t),l=a*Math.cos(o),h=a*Math.sin(o);var m=c+.956*l+.621*h,p=c-.272*l-.647*h,x=c-1.107*l+1.704*h;return P(A(0,255,m),A(0,255,p),A(0,255,x))}export{re as a,ne as b,ie as c,ae as d,se as e,oe as f,V as g,ce as h,le as i,ue as j,fe as k,O as l,I as m,H as n,he as o,pe as p,me as q,ge as r,ve as s,P as t,A as u,xe as v,de as w,ye as x,B as y,be as z,_e as A,Ae as B,Ke as C,Ee as D,Ve as E,Le as F,d as G,De as H,Pe as I,Ue as J,Ne as K,X as L,u as M,U as N,Y as O,N as P,C as Q,z as R,Re as S,f as T,q as U,Fe as V,Oe as W,F as X,Ie as Y,He as Z,j as _,ee as $,te as aa,Be as ba}; -//# sourceMappingURL=chunk-YL2YTMD7.js.map +//# sourceMappingURL=chunk-7LTJUW24.js.map diff --git a/gen/chunk-YL2YTMD7.js.map b/gen/chunk-7LTJUW24.js.map similarity index 61% rename from gen/chunk-YL2YTMD7.js.map rename to gen/chunk-7LTJUW24.js.map index 0dab6fbd..3e6b25d2 100644 --- a/gen/chunk-YL2YTMD7.js.map +++ b/gen/chunk-7LTJUW24.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/common/util.ts", "../src/common/vlist.ts", "../src/common/emu.ts"], - "sourcesContent": ["\nexport function lpad(s:string, n:number):string {\n s += ''; // convert to string\n while (s.length 0) ? s.substr(0, pos) : s;\n}\n\nexport function hex(v:number, nd?:number) {\n if (!nd) nd = 2;\n if (nd == 8) {\n return hex((v>>16)&0xffff,4) + hex(v&0xffff,4);\n } else {\n return toradix(v,nd,16);\n }\n}\n\nexport function tobin(v:number, nd?:number) {\n if (!nd) nd = 8;\n return toradix(v,nd,2);\n}\n\nexport function toradix(v:number, nd:number, radix:number) {\n try {\n var s = v.toString(radix).toUpperCase();\n while (s.length < nd)\n s = \"0\" + s;\n return s;\n } catch (e) {\n return v+\"\";\n }\n}\n\nexport function arrayCompare(a:ArrayLike, b:ArrayLike):boolean {\n if (a == null && b == null) return true;\n if (a == null) return false;\n if (b == null) return false;\n if (a.length != b.length) return false;\n for (var i=0; i= 0) {\n while (i < s1.length && split1[i].indexOf(\"\\n\") < 0)\n i++;\n }\n if (w1 != w2) {\n w2 = '' + w2 + '';\n }\n result += w2;\n i++;\n j++;\n }\n while (j < split2.length) {\n result += split2[j++];\n }\n return result;\n}\n\nexport function lzgmini() {\n\n // Constants\n var LZG_HEADER_SIZE = 16;\n var LZG_METHOD_COPY = 0;\n var LZG_METHOD_LZG1 = 1;\n\n // LUT for decoding the copy length parameter\n var LZG_LENGTH_DECODE_LUT = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,\n 20,21,22,23,24,25,26,27,28,29,35,48,72,128];\n\n // Decoded data (produced by the decode() method)\n var outdata = null;\n\n // Calculate the checksum\n var calcChecksum = function(data) {\n var a = 1;\n var b = 0;\n var i = LZG_HEADER_SIZE;\n while (i < data.length)\n {\n a = (a + (data[i] & 0xff)) & 0xffff;\n b = (b + a) & 0xffff;\n i++;\n }\n return (b << 16) | a;\n }\n\n // Decode LZG coded data. The function returns the size of the decoded data.\n // Use any of the get* methods to retrieve the decoded data.\n this.decode = function(data:number[]):number[] {\n // Start by clearing the decompressed array in this object\n outdata = null;\n\n // Check magic ID\n if ((data.length < LZG_HEADER_SIZE) || (data[0] != 76) ||\n (data[1] != 90) || (data[2] != 71))\n {\n return null;\n }\n \n // what's the length?\n var uncomplen = data[6] | (data[5]<<8) | (data[4]<<16) | (data[3]<<24);\n\n // Calculate & check the checksum\n var checksum = ((data[11] & 0xff) << 24) |\n ((data[12] & 0xff) << 16) |\n ((data[13] & 0xff) << 8) |\n (data[14] & 0xff);\n if (calcChecksum(data) != checksum)\n {\n return null;\n }\n\n var dst = new Array();\n // Check which method to use\n var method = data[15] & 0xff;\n if (method == LZG_METHOD_LZG1)\n {\n // Get marker symbols\n var m1 = data[16] & 0xff;\n var m2 = data[17] & 0xff;\n var m3 = data[18] & 0xff;\n var m4 = data[19] & 0xff;\n\n // Main decompression loop\n var symbol, b, b2, b3, len, offset;\n var dstlen = 0;\n var k = LZG_HEADER_SIZE + 4;\n var datalen = data.length;\n while (k <= datalen)\n {\n symbol = data[k++] & 0xff;\n if ((symbol != m1) && (symbol != m2) && (symbol != m3) && (symbol != m4))\n {\n // Literal copy\n dst[dstlen++] = symbol;\n }\n else\n {\n b = data[k++] & 0xff;\n if (b != 0)\n {\n // Decode offset / length parameters\n if (symbol == m1)\n {\n // marker1 - \"Distant copy\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n b2 = data[k++] & 0xff;\n b3 = data[k++] & 0xff;\n offset = (((b & 0xe0) << 11) | (b2 << 8) | b3) + 2056;\n }\n else if (symbol == m2)\n {\n // marker2 - \"Medium copy\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n b2 = data[k++] & 0xff;\n offset = (((b & 0xe0) << 3) | b2) + 8;\n }\n else if (symbol == m3)\n {\n // marker3 - \"Short copy\"\n len = (b >> 6) + 3;\n offset = (b & 63) + 8;\n }\n else\n {\n // marker4 - \"Near copy (incl. RLE)\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n offset = (b >> 5) + 1;\n }\n\n // Copy the corresponding data from the history window\n for (i = 0; i < len; i++)\n {\n dst[dstlen] = dst[dstlen-offset];\n dstlen++;\n }\n }\n else\n {\n // Literal copy (single occurance of a marker symbol)\n dst[dstlen++] = symbol;\n }\n }\n }\n\n }\n else if (method == LZG_METHOD_COPY)\n {\n // Plain copy\n var dstlen = 0;\n var datalen = data.length;\n for (var i = LZG_HEADER_SIZE; i < datalen; i++)\n {\n dst[dstlen++] = data[i] & 0xff;\n }\n }\n else\n {\n // Unknown method\n return null;\n }\n // Store the decompressed data in the lzgmini object for later retrieval\n if (dst.length < uncomplen) return null; // data too short\n outdata = dst.slice(0, uncomplen);\n return outdata;\n }\n\n // Get the decoded byte array\n this.getByteArray = function():number[]\n {\n return outdata;\n }\n\n // Get the decoded string from a Latin 1 (or ASCII) encoded array\n this.getStringLatin1 = function():string {\n return byteArrayToString(outdata);\n }\n\n // Get the decoded string from an UTF-8 encoded array\n this.getStringUTF8 = function():string {\n return byteArrayToUTF8(outdata);\n }\n}\n\nexport function stringToByteArray(s:string) : Uint8Array {\n var a = new Uint8Array(s.length);\n for (var i=0; i= 192) && (c < 224)) {\n c = ((c & 31) << 6) | (data[i++] & 63);\n } else {\n c = ((c & 15) << 12) | ((data[i] & 63) << 6) | (data[i+1] & 63);\n i += 2;\n if (c == 0xfeff) continue; // ignore BOM\n }\n str += String.fromCharCode(c);\n }\n }\n return str;\n}\n\nexport function removeBOM(s:string) {\n if (s.charCodeAt(0) === 0xFEFF) {\n s = s.substr(1);\n }\n return s;\n}\n\nexport function isProbablyBinary(path:string, data?:number[] | Uint8Array) : boolean {\n var score = 0;\n // check extensions\n if (path) {\n path = path.toUpperCase();\n const BINEXTS = ['.CHR','.BIN','.DAT','.PAL','.NAM','.RLE','.LZ4','.NSF'];\n for (var ext of BINEXTS) {\n if (path.endsWith(ext)) score++;\n }\n }\n // decode as UTF-8\n for (var i = 0; i < (data?data.length:0);) {\n let c = data[i++];\n if ((c & 0x80) == 0) {\n // more likely binary if we see a NUL or obscure control character\n if (c < 9 || (c >= 14 && c < 26) || c == 0x7f) {\n score++;\n break;\n }\n } else {\n // look for invalid unicode sequences\n var nextra = 0;\n if ((c & 0xe0) == 0xc0) nextra = 1;\n else if ((c & 0xf0) == 0xe0) nextra = 2;\n else if ((c & 0xf8) == 0xf0) nextra = 3;\n else if (c < 0xa0) score++;\n else if (c == 0xff) score++;\n while (nextra--) {\n if (i >= data.length || (data[i++] & 0xc0) != 0x80) {\n score++;\n break;\n }\n }\n }\n }\n return score > 0;\n}\n\n// need to load liblzg.js first\nexport function compressLZG(em_module, inBuffer:number[], levelArg?:boolean) : Uint8Array {\n var level = levelArg || 9;\n var inLen = inBuffer.length;\n var inPtr = em_module._malloc(inLen + 1);\n for (var i = 0; i < inLen; i++) {\n em_module.setValue(inPtr + i, inBuffer[i], 'i8');\n }\n var maxEncSize = em_module._LZG_MaxEncodedSize(inLen);\n var outPtr = em_module._malloc(maxEncSize + 1);\n var compLen = em_module.ccall('compress_lzg', 'number', ['number', 'number', 'number', 'number', 'number'], [level, inPtr, inLen, maxEncSize, outPtr]);\n em_module._free(inPtr);\n var outBuffer = new Uint8Array(compLen);\n for (var i = 0; i < compLen; i++) {\n outBuffer[i] = em_module.getValue(outPtr + i, 'i8');\n }\n em_module._free(outPtr);\n return outBuffer;\n}\n\n// only does primitives, 1D arrays and no recursion\nexport function safe_extend(deep, dest, src) {\n // TODO: deep ignored\n for (var key in src) {\n var val = src[key];\n var type = typeof(val);\n if (val === null || type == 'undefined') {\n dest[key] = val;\n } else if (type == 'function') {\n // ignore function\n } else if (type == 'object') {\n if (val['slice']) { // array?\n dest[key] = val.slice();\n } else {\n // ignore object\n }\n } else {\n dest[key] = val;\n }\n }\n return dest;\n}\n\nexport function printFlags(val:number, names:string[], r2l:boolean) {\n var s = '';\n for (var i=0; i 0) s += \" \";\n s += (val & bit) ? names[i] : \"-\";\n }\n }\n return s;\n}\n\nexport function rgb2bgr(x) {\n return ((x&0xff)<<16) | ((x>>16)&0xff) | (x&0x00ff00);\n}\n\nexport function RGBA(r:number,g:number,b:number) {\n return (r&0xff) | ((g&0xff)<<8) | ((b&0xff)<<16) | 0xff000000;\n}\n\nexport function clamp(minv:number, maxv:number, v:number) {\n return (v < minv) ? minv : (v > maxv) ? maxv : v;\n}\n\nexport function safeident(s : string) : string {\n // if starts with non-alpha character, prefix with '_'\n if (s.length == 0) return '';\n if (!s.match(/^[a-zA-Z_]/)) s = '_' + s;\n return s.replace(/\\W+/g, \"_\");\n}\n\nexport function rle_unpack(src : Uint8Array) : Uint8Array {\n var i = 0;\n var tag = src[i++];\n var dest = [];\n var data = tag;\n while (i < src.length) {\n var ch = src[i++];\n if (ch == tag) {\n var count = src[i++];\n for (var j=0; jvoid, datatype:'text'|'arraybuffer') {\n var oReq = new XMLHttpRequest();\n oReq.open(\"GET\", url, true);\n oReq.responseType = datatype;\n oReq.onload = function (oEvent) {\n if (oReq.status == 200) {\n var data = oReq.response;\n if (data instanceof ArrayBuffer) {\n data = new Uint8Array(data);\n }\n success(data);\n } else if (oReq.status == 404) {\n success(null);\n } else {\n throw Error(\"Error \" + oReq.status + \" loading \" + url);\n }\n }\n oReq.onerror = function (oEvent) {\n success(null);\n }\n oReq.ontimeout = function (oEvent) {\n throw Error(\"Timeout loading \" + url);\n }\n oReq.send(null);\n}\n\n// get platform ID without . emulator\nexport function getBasePlatform(platform : string) : string {\n return platform.split('.')[0];\n}\n\n// get platform ID without - specialization\nfunction getRootPlatform(platform : string) : string {\n return platform.split('-')[0];\n}\n\n// get platform ID without emulator or specialization\nexport function getRootBasePlatform(platform : string) : string {\n return getRootPlatform(getBasePlatform(platform));\n}\n\nexport function isArray(obj: any) : obj is ArrayLike {\n return obj != null && (Array.isArray(obj) || isTypedArray(obj));\n}\n\nexport function isTypedArray(obj: any) : obj is ArrayLike {\n return obj != null && obj['BYTES_PER_ELEMENT'];\n}\n\nexport function convertDataToUint8Array(data: string|Uint8Array) : Uint8Array {\n return (typeof data === 'string') ? stringToByteArray(data) : data;\n}\n\nexport function convertDataToString(data: string|Uint8Array) : string {\n return (data instanceof Uint8Array) ? byteArrayToUTF8(data) : data;\n}\n\nexport function byteToASCII(b: number) : string {\n if (b < 32)\n return String.fromCharCode(b + 0x2400);\n else\n return String.fromCharCode(b);\n}\n\nexport function loadScript(scriptfn:string) : Promise {\n return new Promise( (resolve, reject) => {\n var script = document.createElement('script');\n script.onload = resolve;\n script.onerror = reject;\n script.src = scriptfn;\n document.getElementsByTagName('head')[0].appendChild(script);\n });\n}\n\nexport function decodeQueryString(qs : string) : {} {\n if (qs.startsWith('?')) qs = qs.substr(1);\n var a = qs.split('&');\n if (!a || a.length == 0)\n return {};\n var b = {};\n for (var i = 0; i < a.length; ++i) {\n var p = a[i].split('=', 2);\n if (p.length == 1)\n b[p[0]] = \"\";\n else\n b[p[0]] = decodeURIComponent(p[1].replace(/\\+/g, \" \"));\n }\n return b;\n}\n\nexport function parseBool(s : string) : boolean {\n if (!s) return false;\n if (s == 'false' || s == '0') return false;\n if (s == 'true' || s == '1') return true;\n return s ? true : false;\n}\n\n///\n\nexport class XMLParseError extends Error {\n}\n\nexport interface XMLNode {\n type: string;\n text: string | null;\n children: XMLNode[];\n attrs: { [id: string]: string };\n obj: any;\n}\n\nexport type XMLVisitFunction = (node: XMLNode) => any;\n\nfunction escapeXML(s: string): string {\n if (s.indexOf('&') >= 0) {\n return s.replace(/'/g, \"'\")\n .replace(/"/g, '\"')\n .replace(/>/g, '>')\n .replace(/</g, '<')\n .replace(/&/g, '&');\n } else {\n return s;\n }\n}\n\nexport function parseXMLPoorly(s: string, openfn?: XMLVisitFunction, closefn?: XMLVisitFunction): XMLNode {\n const tag_re = /[<]([/]?)([?a-z_-]+)([^>]*)[>]+|(\\s*[^<]+)/gi;\n const attr_re = /\\s*(\\w+)=\"(.*?)\"\\s*/gi;\n var fm: RegExpMatchArray;\n var stack: XMLNode[] = [];\n var top: XMLNode;\n\n function closetop() {\n top = stack.pop();\n if (top == null || top.type != ident) throw new XMLParseError(\"mismatch close tag: \" + ident);\n if (closefn) {\n top.obj = closefn(top);\n }\n if (stack.length == 0) throw new XMLParseError(\"close tag without open: \" + ident);\n stack[stack.length - 1].children.push(top);\n }\n function parseattrs(as: string): { [id: string]: string } {\n var am;\n var attrs = {};\n if (as != null) {\n while (am = attr_re.exec(as)) {\n attrs[am[1]] = escapeXML(am[2]);\n }\n }\n return attrs;\n }\n while (fm = tag_re.exec(s)) {\n var [_m0, close, ident, attrs, content] = fm;\n //console.log(stack.length, close, ident, attrs, content);\n if (close) {\n closetop();\n } else if (ident) {\n var node = { type: ident, text: null, children: [], attrs: parseattrs(attrs), obj: null };\n stack.push(node);\n if (attrs) {\n parseattrs(attrs);\n }\n if (openfn) {\n node.obj = openfn(node);\n }\n if (attrs && attrs.endsWith('/')) closetop();\n } else if (content != null) {\n if (stack.length == 0) throw new XMLParseError(\"content without element\");\n var txt = escapeXML(content as string).trim();\n if (txt.length) stack[stack.length - 1].text = txt;\n }\n }\n if (stack.length != 1) throw new XMLParseError(\"tag not closed\");\n if (stack[0].type != '?xml') throw new XMLParseError(\"?xml needs to be first element\");\n return top;\n}\n\nexport function escapeHTML(s: string): string {\n return s.replace(/[&]/g, '&').replace(/[<]/g, '<').replace(/[>]/g, '>');\n}\n\n// lame factorization for displaying bitmaps\n// returns a > b such that a * b == x (or higher), a >= mina, b >= minb\nexport function findIntegerFactors(x: number, mina: number, minb: number, aspect: number) : {a: number, b: number} {\n let a = x;\n let b = 1;\n if (minb > 1 && minb < a) {\n a = Math.ceil(x / minb);\n b = minb;\n }\n while (a > b) {\n let a2 = a;\n let b2 = b;\n if ((a & 1) == 0) {\n b2 = b * 2;\n a2 = a / 2;\n }\n if ((a % 3) == 0) {\n b2 = b * 3;\n a2 = a / 3;\n }\n if ((a % 5) == 0) {\n b2 = b * 5;\n a2 = a / 5;\n }\n if (a2 < mina) break;\n if (a2 < b2 * aspect) break;\n a = a2;\n b = b2;\n }\n return {a, b};\n}\n\nexport class FileDataCache {\n maxSize : number = 8000000;\n size : number;\n cache : Map;\n constructor() {\n this.reset();\n }\n get(key : string) : string|Uint8Array {\n return this.cache.get(key);\n }\n put(key : string, value : string|Uint8Array) {\n this.cache.set(key, value);\n this.size += value.length;\n if (this.size > this.maxSize) {\n console.log('cache reset', this);\n this.reset();\n }\n }\n reset() {\n this.cache = new Map();\n this.size = 0;\n }\n}\n\nexport function coerceToArray(arrobj: any) : T[] {\n if (Array.isArray(arrobj)) return arrobj;\n else if (arrobj != null && typeof arrobj[Symbol.iterator] === 'function') return Array.from(arrobj);\n else if (typeof arrobj === 'object') return Array.from(Object.values(arrobj))\n else throw new Error(`Expected array or object, got \"${arrobj}\"`);\n}\n", "/**\n * The MIT License (MIT)\n *\n * Copyright (C) 2013 Sergi Mansilla\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Creates a virtually-rendered scrollable list.\n * @param {object} config\n * @constructor\n */\nexport function VirtualList(config) {\n var width = (config && config.w + 'px') || '100%';\n var height = (config && config.h + 'px') || '100%';\n var itemHeight = this.itemHeight = config.itemHeight;\n\n this.items = config.items;\n this.generatorFn = config.generatorFn;\n this.totalRows = config.totalRows || (config.items && config.items.length);\n\n var scroller = VirtualList.createScroller(itemHeight * this.totalRows);\n this.container = VirtualList.createContainer(width, height);\n this.container.appendChild(scroller);\n\n var screenItemsLen = Math.ceil(config.h / itemHeight);\n // Cache 4 times the number of items that fit in the container viewport\n this.cachedItemsLen = screenItemsLen * 3;\n this._renderChunk(this.container, 0);\n\n var self = this;\n var lastRepaintY;\n var maxBuffer = screenItemsLen * itemHeight;\n var lastScrolled = 0;\n\n // As soon as scrolling has stopped, this interval asynchronouslyremoves all\n // the nodes that are not used anymore\n this.rmNodeInterval = setInterval(function() {\n if (Date.now() - lastScrolled > 100) {\n var badNodes = document.querySelectorAll('[data-rm=\"1\"]');\n for (var i = 0, l = badNodes.length; i < l; i++) {\n try {\n self.container.removeChild(badNodes[i]);\n } catch (e) {\n //\n }\n }\n }\n }, 300);\n\n function onScroll(e) {\n var scrollTop = e.target.scrollTop; // Triggers reflow\n if (!lastRepaintY || Math.abs(scrollTop - lastRepaintY) > maxBuffer) {\n var first = Math.floor(scrollTop / itemHeight) - screenItemsLen;\n self._renderChunk(self.container, first < 0 ? 0 : first);\n lastRepaintY = scrollTop;\n }\n\n lastScrolled = Date.now();\n e.preventDefault && e.preventDefault();\n }\n\n this.container.addEventListener('scroll', onScroll);\n}\n\nVirtualList.prototype.createRow = function(i) {\n var item;\n if (this.generatorFn)\n item = this.generatorFn(i);\n else if (this.items) {\n if (typeof this.items[i] === 'string') {\n var itemText = document.createTextNode(this.items[i]);\n item = document.createElement('div');\n item.style.height = this.itemHeight + 'px';\n item.appendChild(itemText);\n } else {\n item = this.items[i];\n }\n }\n\n item.classList.add('vrow');\n item.setAttribute('data-index', ''+i);\n item.style.position = 'absolute';\n item.style.top = (i * this.itemHeight) + 'px';\n return item;\n};\n\n/**\n * Renders a particular, consecutive chunk of the total rows in the list. To\n * keep acceleration while scrolling, we mark the nodes that are candidate for\n * deletion instead of deleting them right away, which would suddenly stop the\n * acceleration. We delete them once scrolling has finished.\n *\n * @param {Node} node Parent node where we want to append the children chunk.\n * @param {Number} from Starting position, i.e. first children index.\n * @return {void}\n */\nVirtualList.prototype._renderChunk = function(node, from) {\n var finalItem = from + this.cachedItemsLen;\n if (finalItem > this.totalRows)\n finalItem = this.totalRows;\n\n // Append all the new rows in a document fragment that we will later append to\n // the parent node\n var fragment = document.createDocumentFragment();\n for (var i = from; i < finalItem; i++) {\n fragment.appendChild(this.createRow(i));\n }\n\n // Hide and mark obsolete nodes for deletion.\n for (var j = 1, l = node.childNodes.length; j < l; j++) {\n node.childNodes[j].style.display = 'none';\n node.childNodes[j].setAttribute('data-rm', '1');\n }\n node.appendChild(fragment);\n};\n\nVirtualList.createContainer = function(w, h) {\n var c = document.createElement('div');\n c.classList.add('vlist');\n c.style.width = w;\n c.style.height = h;\n c.style.overflow = 'auto';\n c.style.position = 'relative';\n c.style.padding = '0';\n c.style.border = '1px solid black';\n return c;\n};\n\nVirtualList.createScroller = function(h) {\n var scroller = document.createElement('div');\n scroller.style.opacity = '0';\n scroller.style.position = 'absolute';\n scroller.style.top = '0';\n scroller.style.left = '0';\n scroller.style.width = '1px';\n scroller.style.height = h + 'px';\n return scroller;\n};\n\nVirtualList.prototype.scrollToItem = function(index) {\n this.container.scrollTop = this.itemHeight * index;\n};\n\n", "\nimport { hex, clamp, lpad, RGBA } from \"./util\";\nimport { SourceLocation } from \"./workertypes\";\nimport { VirtualList } from \"./vlist\"\n\n// Emulator classes\n\nexport var PLATFORMS = {};\n\nvar _random_state = 1;\n\nexport function noise() {\n\tlet x = _random_state;\n\tx ^= x << 13;\n\tx ^= x >> 17;\n\tx ^= x << 5;\n\treturn (_random_state = x) & 0xff;\n}\n\nexport function getNoiseSeed() {\n return _random_state;\n}\n\nexport function setNoiseSeed(x : number) {\n _random_state = x;\n}\n\ntype KeyboardCallback = (which:number, charCode:number, flags:KeyFlags) => void;\n\nexport function __createCanvas(doc:HTMLDocument, mainElement:HTMLElement, width:number, height:number) : HTMLCanvasElement {\n var canvas = doc.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n canvas.classList.add(\"emuvideo\");\n canvas.tabIndex = -1; // Make it focusable\n mainElement.appendChild(canvas);\n return canvas;\n}\n\nexport enum KeyFlags {\n KeyDown = 1,\n Shift = 2,\n Ctrl = 4,\n Alt = 8,\n Meta = 16,\n KeyUp = 64,\n KeyPress = 128,\n}\n\n// TODO: don't use which/keyCode anymore?\n// TODO: let keycode = e.key ? e.key.charCodeAt(0) : e.keyCode;\n// TODO: let charCode = e.key ? e.key.charCodeAt(0) : e.charCode;\nexport function _setKeyboardEvents(canvas:HTMLElement, callback:KeyboardCallback) {\n canvas.onkeydown = (e) => {\n let flags = _metakeyflags(e);\n callback(e.which, e.keyCode, KeyFlags.KeyDown|flags);\n if (!flags) e.preventDefault(); // eat all keys that don't have a modifier\n };\n canvas.onkeyup = (e) => {\n callback(e.which, e.keyCode, KeyFlags.KeyUp|_metakeyflags(e));\n };\n};\n\ntype VideoCanvasOptions = {rotate?:number, overscan?:boolean, aspect?:number};\n\nexport class RasterVideo {\n\n mainElement : HTMLElement;\n width : number;\n height : number;\n options : VideoCanvasOptions;\n\n constructor(mainElement:HTMLElement, width:number, height:number, options?:VideoCanvasOptions) {\n this.mainElement = mainElement;\n this.width = width;\n this.height = height;\n this.options = options;\n }\n \n canvas : HTMLCanvasElement;\n ctx : CanvasRenderingContext2D;\n imageData : ImageData;\n datau32 : Uint32Array;\n vcanvas : JQuery;\n \n paddle_x = 255;\n paddle_y = 255;\n \n setRotate(rotate:number) {\n var canvas = this.canvas;\n if (rotate) {\n // TODO: aspect ratio?\n canvas.style.transform = \"rotate(\"+rotate+\"deg)\";\n if (canvas.width < canvas.height)\n canvas.style.paddingLeft = canvas.style.paddingRight = \"10%\";\n } else {\n canvas.style.transform = null;\n canvas.style.paddingLeft = canvas.style.paddingRight = null;\n }\n }\n\n create(doc?: HTMLDocument) {\n var canvas;\n this.canvas = canvas = __createCanvas(doc || document, this.mainElement, this.width, this.height);\n this.vcanvas = $(canvas);\n if (this.options && this.options.rotate) {\n this.setRotate(this.options.rotate);\n }\n if (this.options && this.options.overscan) {\n this.vcanvas.css('padding','0px');\n }\n if (this.options && this.options.aspect) {\n console.log(this.options);\n this.vcanvas.css('aspect-ratio', this.options.aspect+\"\");\n }\n this.ctx = canvas.getContext('2d');\n this.imageData = this.ctx.createImageData(this.width, this.height);\n this.datau32 = new Uint32Array(this.imageData.data.buffer);\n }\n\n setKeyboardEvents(callback) {\n _setKeyboardEvents(this.canvas, callback);\n }\n\n getFrameData() { return this.datau32; }\n\n getContext() { return this.ctx; }\n\n updateFrame(sx?:number, sy?:number, dx?:number, dy?:number, w?:number, h?:number) {\n if (w && h)\n this.ctx.putImageData(this.imageData, sx, sy, dx, dy, w, h);\n else\n this.ctx.putImageData(this.imageData, 0, 0);\n }\n\n clearRect(dx:number, dy:number, w:number, h:number) {\n var ctx = this.ctx;\n ctx.fillStyle = '#000000';\n ctx.fillRect(dx, dy, w, h);\n }\n\n setupMouseEvents(el? : HTMLCanvasElement) {\n if (!el) el = this.canvas;\n $(el).mousemove( (e) => {\n var pos = getMousePos(el, e);\n var new_x = Math.floor(pos.x * 255 / this.canvas.width);\n var new_y = Math.floor(pos.y * 255 / this.canvas.height);\n this.paddle_x = clamp(0, 255, new_x);\n this.paddle_y = clamp(0, 255, new_y);\n });\n };\n}\n\nexport class VectorVideo extends RasterVideo {\n\n persistenceAlpha = 0.5;\n jitter = 1.0;\n gamma = 0.8;\n sx : number;\n sy : number;\n \n create() {\n super.create();\n this.sx = this.width/1024.0;\n this.sy = this.height/1024.0;\n }\n\n clear() {\n var ctx = this.ctx;\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = this.persistenceAlpha;\n ctx.fillStyle = '#000000';\n ctx.fillRect(0, 0, this.width, this.height);\n ctx.globalAlpha = 1.0;\n ctx.globalCompositeOperation = 'lighter';\n }\n\n COLORS = [\n '#111111',\n '#1111ff',\n '#11ff11',\n '#11ffff',\n '#ff1111',\n '#ff11ff',\n '#ffff11',\n '#ffffff'\n ];\n\n drawLine(x1:number, y1:number, x2:number, y2:number, intensity:number, color:number) {\n var ctx = this.ctx;\n var sx = this.sx;\n var sy = this.sy;\n //console.log(x1,y1,x2,y2,intensity,color);\n if (intensity > 0) {\n // TODO: landscape vs portrait\n var alpha = Math.pow(intensity / 255.0, this.gamma);\n ctx.globalAlpha = alpha;\n ctx.lineWidth = 3;\n ctx.beginPath();\n // TODO: bright dots\n var jx = this.jitter * (Math.random() - 0.5);\n var jy = this.jitter * (Math.random() - 0.5);\n x1 += jx;\n x2 += jx;\n y1 += jy;\n y2 += jy;\n ctx.moveTo(x1*sx, this.height-y1*sy);\n if (x1 == x2 && y1 == y2)\n ctx.lineTo(x2*sx+1, this.height-y2*sy);\n else\n ctx.lineTo(x2*sx, this.height-y2*sy);\n ctx.strokeStyle = this.COLORS[color & 7];\n ctx.stroke();\n }\n }\n}\n\nexport class RAM {\n mem : Uint8Array;\n constructor(size:number) {\n this.mem = new Uint8Array(new ArrayBuffer(size));\n }\n}\n\nexport class EmuHalt extends Error {\n $loc : SourceLocation;\n constructor(msg: string, loc?: SourceLocation) {\n super(msg);\n this.$loc = loc;\n Object.setPrototypeOf(this, EmuHalt.prototype);\n }\n}\n\nexport var useRequestAnimationFrame : boolean = false;\n\nexport class AnimationTimer {\n\n callback; \n running : boolean = false;\n pulsing : boolean = false;\n nextts = 0;\n nframes;\n startts; // for FPS calc\n frameRate;\n intervalMsec;\n useReqAnimFrame = useRequestAnimationFrame && typeof window.requestAnimationFrame === 'function'; // need for unit test\n \n constructor(frequencyHz:number, callback:() => void) {\n this.frameRate = frequencyHz;\n this.intervalMsec = 1000.0 / frequencyHz;\n this.callback = callback;\n }\n\n scheduleFrame(msec:number) {\n var fn = (timestamp) => {\n try {\n this.nextFrame(this.useReqAnimFrame ? timestamp : Date.now());\n } catch (e) {\n this.running = false;\n this.pulsing = false;\n throw e;\n }\n }\n if (this.useReqAnimFrame)\n window.requestAnimationFrame(fn);\n else\n setTimeout(fn, msec);\n }\n \n nextFrame(ts:number) {\n if (ts > this.nextts) {\n if (this.running) {\n this.callback();\n }\n if (this.nframes == 0)\n this.startts = ts;\n if (this.nframes++ == 300) {\n console.log(\"Avg framerate: \" + this.nframes*1000/(ts-this.startts) + \" fps\");\n }\n }\n this.nextts += this.intervalMsec;\n // frames skipped? catch up\n if ((ts - this.nextts) > 1000) {\n //console.log(ts - this.nextts, 'msec skipped');\n this.nextts = ts;\n }\n if (this.running) {\n this.scheduleFrame(this.nextts - ts);\n } else {\n this.pulsing = false;\n }\n }\n isRunning() {\n return this.running;\n }\n start() {\n if (!this.running) {\n this.running = true;\n this.nextts = 0;\n this.nframes = 0;\n if (!this.pulsing) {\n this.scheduleFrame(0);\n this.pulsing = true;\n }\n }\n }\n stop() {\n this.running = false;\n }\n}\n\n// TODO: move to util?\n\nexport function dumpRAM(ram:ArrayLike, ramofs:number, ramlen:number) : string {\n var s = \"\";\n var bpel = ram['BYTES_PER_ELEMENT'] || 1;\n var perline = Math.ceil(16 / bpel);\n var isFloat = ram instanceof Float32Array || ram instanceof Float64Array;\n // TODO: show scrollable RAM for other platforms\n for (var ofs=0; ofs;\n\nexport const Keys = {\n ANYKEY: {c: 0, n: \"?\"},\n // https://w3c.github.io/gamepad/#remapping\n // gamepad and keyboard (player 0)\n UP: {c: 38, n: \"Up\", plyr:0, button:12, yaxis:-1},\n DOWN: {c: 40, n: \"Down\", plyr:0, button:13, yaxis:1},\n LEFT: {c: 37, n: \"Left\", plyr:0, button:14, xaxis:-1},\n RIGHT: {c: 39, n: \"Right\", plyr:0, button:15, xaxis:1},\n A: {c: 32, n: \"Space\", plyr:0, button:0},\n B: {c: 16, n: \"Shift\", plyr:0, button:1},\n GP_A: {c: 88, n: \"X\", plyr:0, button:0},\n GP_B: {c: 90, n: \"Z\", plyr:0, button:1},\n GP_C: {c: 86, n: \"V\", plyr:0, button:2},\n GP_D: {c: 67, n: \"C\", plyr:0, button:3},\n SELECT: {c: 220, n: \"\\\\\", plyr:0, button:8},\n START: {c: 13, n: \"Enter\", plyr:0, button:9},\n OPTION: {c: 8, n: \"Bcksp\", plyr:0, button:10},\n // gamepad and keyboard (player 1)\n P2_UP: {c: 87, n: \"W\", plyr:1, button:12, yaxis:-1},\n P2_DOWN: {c: 83, n: \"S\", plyr:1, button:13, yaxis:1},\n P2_LEFT: {c: 65, n: \"A\", plyr:1, button:14, xaxis:-1},\n P2_RIGHT: {c: 68, n: \"D\", plyr:1, button:15, xaxis:1},\n P2_A: {c: 84, n: \"T\", plyr:1, button:0},\n P2_B: {c: 82, n: \"R\", plyr:1, button:1},\n P2_GP_A: {c: 69, n: \"E\", plyr:1, button:0},\n P2_GP_B: {c: 82, n: \"R\", plyr:1, button:1},\n P2_GP_C: {c: 84, n: \"T\", plyr:1, button:2},\n P2_GP_D: {c: 89, n: \"Y\", plyr:1, button:3},\n P2_SELECT: {c: 70, n: \"F\", plyr:1, button:8},\n P2_START: {c: 71, n: \"G\", plyr:1, button:9},\n // keyboard only\n VK_ESCAPE: {c: 27, n: \"Esc\"},\n VK_F1: {c: 112, n: \"F1\"},\n VK_F2: {c: 113, n: \"F2\"},\n VK_F3: {c: 114, n: \"F3\"},\n VK_F4: {c: 115, n: \"F4\"},\n VK_F5: {c: 116, n: \"F5\"},\n VK_F6: {c: 117, n: \"F6\"},\n VK_F7: {c: 118, n: \"F7\"},\n VK_F8: {c: 119, n: \"F8\"},\n VK_F9: {c: 120, n: \"F9\"},\n VK_F10: {c: 121, n: \"F10\"},\n VK_F11: {c: 122, n: \"F11\"},\n VK_F12: {c: 123, n: \"F12\"},\n VK_SCROLL_LOCK: {c: 145, n: \"ScrLck\"},\n VK_PAUSE: {c: 19, n: \"Pause\"},\n VK_QUOTE: {c: 222, n: \"'\"},\n VK_1: {c: 49, n: \"1\"},\n VK_2: {c: 50, n: \"2\"},\n VK_3: {c: 51, n: \"3\"},\n VK_4: {c: 52, n: \"4\"},\n VK_5: {c: 53, n: \"5\"},\n VK_6: {c: 54, n: \"6\"},\n VK_7: {c: 55, n: \"7\"},\n VK_8: {c: 56, n: \"8\"},\n VK_9: {c: 57, n: \"9\"},\n VK_0: {c: 48, n: \"0\"},\n VK_MINUS: {c: 189, n: \"-\"},\n VK_MINUS2: {c: 173, n: \"-\"},\n VK_EQUALS: {c: 187, n: \"=\"},\n VK_EQUALS2: {c: 61, n: \"=\"},\n VK_BACK_SPACE: {c: 8, n: \"Bkspc\"},\n VK_TAB: {c: 9, n: \"Tab\"},\n VK_Q: {c: 81, n: \"Q\"},\n VK_W: {c: 87, n: \"W\"},\n VK_E: {c: 69, n: \"E\"},\n VK_R: {c: 82, n: \"R\"},\n VK_T: {c: 84, n: \"T\"},\n VK_Y: {c: 89, n: \"Y\"},\n VK_U: {c: 85, n: \"U\"},\n VK_I: {c: 73, n: \"I\"},\n VK_O: {c: 79, n: \"O\"},\n VK_P: {c: 80, n: \"P\"},\n VK_ACUTE: {c: 219, n: \"\u00B4\"},\n VK_OPEN_BRACKET: {c: 219, n: \"[\"},\n VK_CLOSE_BRACKET: {c: 221, n: \"]\"},\n VK_CAPS_LOCK: {c: 20, n: \"CpsLck\"},\n VK_A: {c: 65, n: \"A\"},\n VK_S: {c: 83, n: \"S\"},\n VK_D: {c: 68, n: \"D\"},\n VK_F: {c: 70, n: \"F\"},\n VK_G: {c: 71, n: \"G\"},\n VK_H: {c: 72, n: \"H\"},\n VK_J: {c: 74, n: \"J\"},\n VK_K: {c: 75, n: \"K\"},\n VK_L: {c: 76, n: \"L\"},\n VK_CEDILLA: {c: 186, n: \"\u00C7\"},\n VK_TILDE: {c: 222, n: \"~\"},\n VK_ENTER: {c: 13, n: \"Enter\"},\n VK_SHIFT: {c: 16, n: \"Shift\"},\n VK_BACK_SLASH: {c: 220, n: \"\\\\\"},\n VK_Z: {c: 90, n: \"Z\"},\n VK_X: {c: 88, n: \"X\"},\n VK_C: {c: 67, n: \"C\"},\n VK_V: {c: 86, n: \"V\"},\n VK_B: {c: 66, n: \"B\"},\n VK_N: {c: 78, n: \"N\"},\n VK_M: {c: 77, n: \"M\"},\n VK_COMMA: {c: 188, n: \"] =\"},\n VK_PERIOD: {c: 190, n: \".\"},\n VK_SEMICOLON: {c: 59, n: \";\"},\n VK_SLASH: {c: 191, n: \"/\"},\n VK_CONTROL: {c: 17, n: \"Ctrl\"},\n VK_ALT: {c: 18, n: \"Alt\"},\n VK_COMMAND: {c: 224, n: \"Cmd\"},\n VK_SPACE: {c: 32, n: \"Space\"},\n VK_INSERT: {c: 45, n: \"Ins\"},\n VK_DELETE: {c: 46, n: \"Del\"},\n VK_HOME: {c: 36, n: \"Home\"},\n VK_END: {c: 35, n: \"End\"},\n VK_PAGE_UP: {c: 33, n: \"PgUp\"},\n VK_PAGE_DOWN: {c: 34, n: \"PgDown\"},\n VK_UP: {c: 38, n: \"Up\"},\n VK_DOWN: {c: 40, n: \"Down\"},\n VK_LEFT: {c: 37, n: \"Left\"},\n VK_RIGHT: {c: 39, n: \"Right\"},\n VK_NUM_LOCK: {c: 144, n: \"Num\"},\n VK_DIVIDE: {c: 111, n: \"Num /\"},\n VK_MULTIPLY: {c: 106, n: \"Num *\"},\n VK_SUBTRACT: {c: 109, n: \"Num -\"},\n VK_ADD: {c: 107, n: \"Num +\"},\n VK_DECIMAL: {c: 194, n: \"Num .\"},\n VK_NUMPAD0: {c: 96, n: \"Num 0\"},\n VK_NUMPAD1: {c: 97, n: \"Num 1\"},\n VK_NUMPAD2: {c: 98, n: \"Num 2\"},\n VK_NUMPAD3: {c: 99, n: \"Num 3\"},\n VK_NUMPAD4: {c: 100, n: \"Num 4\"},\n VK_NUMPAD5: {c: 101, n: \"Num 5\"},\n VK_NUMPAD6: {c: 102, n: \"Num 6\"},\n VK_NUMPAD7: {c: 103, n: \"Num 7\"},\n VK_NUMPAD8: {c: 104, n: \"Num 8\"},\n VK_NUMPAD9: {c: 105, n: \"Num 9\"},\n VK_NUMPAD_CENTER: {c: 12, n: \"Num Cntr\"}\n};\n\nfunction _metakeyflags(e) {\n return (e.shiftKey?KeyFlags.Shift:0) |\n (e.ctrlKey?KeyFlags.Ctrl:0) | \n (e.altKey?KeyFlags.Alt:0) | \n (e.metaKey?KeyFlags.Meta:0);\n}\n\ntype KeyMapFunction = (o:KeyMapEntry, key:number, code:number, flags:number) => void;\n\nexport function newKeyboardHandler(switches:number[]|Uint8Array, map:KeyCodeMap, func?:KeyMapFunction, alwaysfunc?:boolean) {\n return (key:number,code:number,flags:number) => {\n if (!map) {\n func(null, key, code, flags);\n return;\n }\n var o : KeyMapEntry = map[key];\n if (!o) o = map[0];\n if (func && (o || alwaysfunc)) {\n func(o, key, code, flags);\n }\n if (o) {\n //console.log(key,code,flags,o);\n var mask = o.mask;\n if (mask < 0) { // negative mask == active low\n mask = -mask;\n if (flags & (KeyFlags.KeyDown | KeyFlags.KeyUp))\n flags ^= KeyFlags.KeyDown | KeyFlags.KeyUp;\n }\n if (flags & KeyFlags.KeyDown) {\n switches[o.index] |= mask;\n } else if (flags & KeyFlags.KeyUp) {\n switches[o.index] &= ~mask;\n }\n }\n };\n}\n\nexport function setKeyboardFromMap(video:RasterVideo, switches:number[]|Uint8Array, map:KeyCodeMap, func?:KeyMapFunction, alwaysfunc?:boolean) {\n var handler = newKeyboardHandler(switches, map, func, alwaysfunc);\n video.setKeyboardEvents(handler);\n return new ControllerPoller(handler);\n}\n\nexport function makeKeycodeMap(table : [KeyDef,number,number][]) : KeyCodeMap {\n var map = new Map();\n for (var i=0; i void) {\n this.handler = handler;\n window.addEventListener(\"gamepadconnected\", (event) => {\n console.log(\"Gamepad connected:\", event);\n this.reset();\n });\n window.addEventListener(\"gamepaddisconnected\", (event) => {\n console.log(\"Gamepad disconnected:\", event);\n this.reset();\n });\n }\n reset() {\n this.active = typeof navigator.getGamepads === 'function';\n if (this.active) {\n let numGamepads = navigator.getGamepads().length;\n this.state = new Array(numGamepads);\n this.lastState = new Array(numGamepads);\n for (var i=0; i len) {\n throw Error(\"Data too long, \" + data.length + \" > \" + len);\n }\n var r = new RAM(len);\n if (padstart)\n r.mem.set(data, len-data.length);\n else\n r.mem.set(data);\n return r.mem;\n}\n\ntype AddressReadWriteFn = ((a:number) => number) | ((a:number,v:number) => void);\ntype AddressDecoderEntry = [number, number, number, AddressReadWriteFn];\ntype AddressDecoderOptions = {gmask?:number};\n\n// TODO: better performance, check values\nexport function AddressDecoder(table : AddressDecoderEntry[], options?:AddressDecoderOptions) {\n var self = this;\n function makeFunction() {\n var s = \"\";\n if (options && options.gmask) {\n s += \"a&=\" + options.gmask + \";\";\n }\n for (var i=0; i=\" + start + \" && a<=\"+end + \"){\";\n if (mask) s += \"a&=\"+mask+\";\";\n s += \"return this.__fn\"+i+\"(a,v)&0xff;}\\n\";\n }\n s += \"return 0;\"; // TODO: noise()?\n return new Function('a', 'v', s);\n }\n return makeFunction().bind(self);\n}\n\nexport function newAddressDecoder(table : AddressDecoderEntry[], options?:AddressDecoderOptions) : (a:number,v?:number) => number {\n return new (AddressDecoder as any)(table, options);\n}\n\n\n// https://stackoverflow.com/questions/17130395/real-mouse-position-in-canvas\nexport function getMousePos(canvas : HTMLCanvasElement, evt) : {x:number,y:number} {\n var rect = canvas.getBoundingClientRect(), // abs. size of element\n scaleX = canvas.width / rect.width, // relationship bitmap vs. element for X\n scaleY = canvas.height / rect.height; // relationship bitmap vs. element for Y\n\n return {\n x: (evt.clientX - rect.left) * scaleX, // scale mouse coordinates after they have\n y: (evt.clientY - rect.top) * scaleY // been adjusted to be relative to element\n }\n}\n\n///\n\n// TODO: https://stackoverflow.com/questions/10463518/converting-em-to-px-in-javascript-and-getting-default-font-size\nexport function getVisibleEditorLineHeight() : number{\n return $(\"#booksMenuButton\").first().height();\n}\n\nexport interface VirtualTextLine {\n text : string;\n clas? : string;\n}\n\nexport class VirtualTextScroller {\n memorylist;\n maindiv : HTMLElement;\n getLineAt : (row:number) => VirtualTextLine;\n\n constructor(parent : HTMLElement) {\n var div = document.createElement('div');\n div.setAttribute(\"class\", \"memdump\");\n parent.appendChild(div);\n this.maindiv = div;\n }\n \n create(workspace : HTMLElement, maxRowCount : number, fn : (row:number) => VirtualTextLine) {\n this.getLineAt = fn;\n this.memorylist = new VirtualList({\n w: $(workspace).width(),\n h: $(workspace).height(),\n itemHeight: getVisibleEditorLineHeight(),\n totalRows: maxRowCount, // TODO?\n generatorFn: (row : number) => {\n var line = fn(row);\n var linediv = document.createElement(\"div\");\n linediv.appendChild(document.createTextNode(line.text));\n if (line.clas != null) linediv.className = line.clas;\n return linediv;\n }\n });\n $(this.maindiv).append(this.memorylist.container);\n }\n\n // TODO: refactor with elsewhere\n refresh() {\n if (this.memorylist) {\n $(this.maindiv).find('[data-index]').each( (i,e) => {\n var div = e;\n var row = parseInt(div.getAttribute('data-index'));\n var oldtext = div.innerText;\n var line = this.getLineAt(row);\n var newtext = line.text;\n if (oldtext != newtext) {\n div.innerText = newtext;\n if (line.clas != null && !div.classList.contains(line.clas)) {\n var oldclasses = Array.from(div.classList);\n oldclasses.forEach((c) => div.classList.remove(c));\n div.classList.add('vrow');\n div.classList.add(line.clas);\n }\n }\n });\n }\n }\n}\n\n// https://forums.atariage.com/topic/107853-need-the-256-colors/page/2/\nexport function gtia_ntsc_to_rgb(val: number) {\n const gamma = 0.9;\n const bright = 1.1;\n const color = 60;\n let cr = (val >> 4) & 15;\n let lm = val & 15;\n let crlv = cr ? color : 0;\n if (cr) lm += 1;\n let phase = ((cr - 1) * 25 - 25) * (2 * Math.PI / 360);\n let y = 256 * bright * Math.pow(lm / 16, gamma);\n let i = crlv * Math.cos(phase);\n let q = crlv * Math.sin(phase);\n var r = y + 0.956 * i + 0.621 * q;\n var g = y - 0.272 * i - 0.647 * q;\n var b = y - 1.107 * i + 1.704 * q;\n return RGBA(clamp(0,255,r), clamp(0,255,g), clamp(0,255,b));\n}\n"], - "mappings": "AACO,YAAc,EAAU,EAAiB,CAE9C,IADA,GAAK,GACE,EAAE,OAAO,GAAG,EAAE,IAAI,EACzB,MAAO,GAGF,YAAc,EAAU,EAAiB,CAE9C,IADA,GAAK,GACE,EAAE,OAAO,GAAG,GAAG,IACtB,MAAO,GAGF,YAAqB,EAAiB,CAC3C,UAAK,IACG,EAAI,IAAQ,EAAI,CAAE,KAAI,GAGzB,YAA4B,EAAiB,CAClD,GAAI,GAAO,EAAE,MAAM,KACnB,MAAO,GAAK,EAAK,OAAO,GAGnB,YAA0B,EAAiB,CAChD,MAAO,GAAE,UAAU,EAAG,EAAE,YAAY,MAG/B,YAA2B,EAAiB,CACjD,GAAI,GAAM,EAAE,YAAY,KACxB,MAAQ,GAAM,EAAK,EAAE,OAAO,EAAG,GAAO,EAGjC,WAAa,EAAU,EAAY,CAExC,MADK,IAAI,GAAK,GACV,GAAM,EACD,EAAK,GAAG,GAAI,MAAO,GAAK,EAAI,EAAE,MAAO,GAErC,EAAQ,EAAE,EAAG,IAIjB,YAAe,EAAU,EAAY,CAC1C,MAAK,IAAI,GAAK,GACP,EAAQ,EAAE,EAAG,GAGf,WAAiB,EAAU,EAAW,EAAc,CACzD,GAAI,CAEF,OADI,GAAI,EAAE,SAAS,GAAO,cACnB,EAAE,OAAS,GAChB,EAAI,IAAM,EACZ,MAAO,SACA,EAAP,CACA,MAAO,GAAE,IAeN,YAAmB,EAAS,CACjC,GAAI,GAAI,GACR,GAAI,EACF,OAAS,KAAK,GAAG,EAAE,EAAE,IAAM,EAE7B,MAAO,GAGF,YAA8B,EAAW,EAAkB,CAMhE,OALI,GAAS,EAAG,MAAM,YAAY,OAAO,SAAS,EAAG,CAAC,MAAO,KACzD,EAAS,EAAG,MAAM,YAAY,OAAO,SAAS,EAAG,CAAC,MAAO,KACzD,EAAI,EACJ,EAAI,EACJ,EAAS,GACN,EAAI,EAAO,QAAU,EAAI,EAAO,QAAQ,CAC7C,GAAI,GAAK,EAAO,GACZ,EAAK,EAAO,GAChB,GAAI,GAAM,EAAG,QAAQ;AAAA,IAAS,EAC5B,KAAO,EAAI,EAAG,QAAU,EAAO,GAAG,QAAQ;AAAA,GAAQ,GAChD,IAEJ,AAAI,GAAM,GACR,GAAK,wBAA0B,EAAK,WAEtC,GAAU,EACV,IACA,IAEF,KAAO,EAAI,EAAO,QACd,GAAU,EAAO,KAErB,MAAO,GAGF,aAAmB,CAGxB,GAAI,GAAkB,GAClB,EAAkB,EAClB,EAAkB,EAGlB,EAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAC3C,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAGhE,EAAU,KAGV,EAAe,SAAS,EAAM,CAIhC,OAHI,GAAI,EACJ,EAAI,EACJ,EAAI,EACD,EAAI,EAAK,QAEd,EAAK,EAAK,GAAK,GAAK,KAAS,MAC7B,EAAK,EAAI,EAAK,MACd,IAEF,MAAQ,IAAK,GAAM,GAKrB,KAAK,OAAS,SAAS,EAAwB,CAK7C,GAHA,EAAU,KAGL,EAAK,OAAS,GAAqB,EAAK,IAAM,IAC7C,EAAK,IAAM,IAAQ,EAAK,IAAM,GAElC,MAAO,MAIT,GAAI,GAAY,EAAK,GAAM,EAAK,IAAI,EAAM,EAAK,IAAI,GAAO,EAAK,IAAI,GAG/D,EAAa,GAAK,IAAM,MAAS,GACpB,GAAK,IAAM,MAAS,GACpB,GAAK,IAAM,MAAS,EACrB,EAAK,IAAM,IAC3B,GAAI,EAAa,IAAS,EAExB,MAAO,MAGT,GAAI,GAAM,GAAI,OAEV,EAAS,EAAK,IAAM,IACxB,GAAI,GAAU,EAaZ,OAVI,GAAK,EAAK,IAAM,IAChB,EAAK,EAAK,IAAM,IAChB,EAAK,EAAK,IAAM,IAChB,EAAK,EAAK,IAAM,IAGhB,EAAQ,EAAG,EAAI,EAAI,EAAK,EACxB,EAAS,EACT,EAAI,EAAkB,EACtB,EAAU,EAAK,OACZ,GAAK,GAGV,GADA,EAAS,EAAK,KAAO,IAChB,GAAU,GAAQ,GAAU,GAAQ,GAAU,GAAQ,GAAU,EAGnE,EAAI,KAAY,UAIhB,EAAI,EAAK,KAAO,IACZ,GAAK,EAgCP,IA7BA,AAAI,GAAU,EAGZ,GAAM,EAAsB,EAAI,IAChC,EAAK,EAAK,KAAO,IACjB,EAAK,EAAK,KAAO,IACjB,EAAY,IAAI,MAAS,GAAO,GAAM,EAAK,GAAM,MAE9C,AAAI,GAAU,EAGjB,GAAM,EAAsB,EAAI,IAChC,EAAK,EAAK,KAAO,IACjB,EAAY,IAAI,MAAS,EAAK,GAAM,GAEjC,AAAI,GAAU,EAGjB,GAAO,IAAK,GAAK,EACjB,EAAU,GAAI,IAAM,GAKpB,GAAM,EAAsB,EAAI,IAChC,EAAU,IAAK,GAAK,GAIjB,EAAI,EAAG,EAAI,EAAK,IAEnB,EAAI,GAAU,EAAI,EAAO,GACzB,QAMF,GAAI,KAAY,UAMf,GAAU,EAKjB,OAFI,GAAS,EACT,EAAU,EAAK,OACV,EAAI,EAAiB,EAAI,EAAS,IAEzC,EAAI,KAAY,EAAK,GAAK,QAM5B,OAAO,MAGT,MAAI,GAAI,OAAS,EAAkB,KACnC,GAAU,EAAI,MAAM,EAAG,GAChB,IAIT,KAAK,aAAe,UACpB,CACE,MAAO,IAIT,KAAK,gBAAkB,UAAkB,CACvC,MAAO,GAAkB,IAI3B,KAAK,cAAgB,UAAkB,CACrC,MAAO,GAAgB,IAIpB,WAA2B,EAAuB,CAEvD,OADI,GAAI,GAAI,YAAW,EAAE,QAChB,EAAE,EAAG,EAAE,EAAE,OAAQ,IACxB,EAAE,GAAK,EAAE,WAAW,GACtB,MAAO,GAGF,WAA2B,EAAuC,CACvE,GAAI,GAAM,GACV,GAAI,GAAQ,KAAM,CAEhB,OADI,GAAU,GAAI,OACT,EAAI,EAAG,EAAI,IAAK,EAAE,EACzB,EAAQ,GAAK,OAAO,aAAa,GAEnC,OADI,GAAM,EAAK,OACN,EAAI,EAAG,EAAI,EAAK,IACvB,GAAO,EAAQ,EAAK,IAExB,MAAO,GAGF,WAAyB,EAAuC,CAGrE,OAFI,GAAM,GACN,EAAU,GAAI,OACT,EAAI,EAAG,EAAI,IAAK,EAAE,EACzB,EAAQ,GAAK,OAAO,aAAa,GAGnC,OAFI,GACA,EAAM,EAAK,OACN,EAAI,EAAG,EAAI,GAElB,GADA,EAAI,EAAK,KACL,EAAI,IACN,GAAO,EAAQ,OACV,CACL,GAAK,GAAK,KAAS,EAAI,IACrB,EAAM,GAAI,KAAO,EAAM,EAAK,KAAO,WAEnC,EAAM,GAAI,KAAO,GAAQ,GAAK,GAAK,KAAO,EAAM,EAAK,EAAE,GAAK,GAC5D,GAAK,EACD,GAAK,MAAQ,SAEnB,GAAO,OAAO,aAAa,GAG/B,MAAO,GAUF,YAA0B,EAAa,EAAuC,CACnF,GAAI,GAAQ,EAEZ,GAAI,EAAM,CACR,EAAO,EAAK,cACZ,GAAM,GAAU,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,QAClE,OAAS,KAAO,GACd,AAAI,EAAK,SAAS,IAAM,IAI5B,OAAS,GAAI,EAAG,EAAK,GAAK,EAAK,OAAO,IAAK,CACzC,GAAI,GAAI,EAAK,KACb,GAAK,GAAI,MAAS,GAEhB,GAAI,EAAI,GAAM,GAAK,IAAM,EAAI,IAAO,GAAK,IAAM,CAC7C,IACA,WAEG,CAEL,GAAI,GAAS,EAMb,IALA,AAAK,GAAI,MAAS,IAAM,EAAS,EAC5B,AAAK,GAAI,MAAS,IAAM,EAAS,EACjC,AAAK,GAAI,MAAS,IAAM,EAAS,EACjC,AAAI,GAAI,KACJ,GAAK,MAAM,IACb,KACL,GAAI,GAAK,EAAK,QAAW,GAAK,KAAO,MAAS,IAAM,CAClD,IACA,QAKR,MAAO,GAAQ,EAIV,YAAqB,EAAW,EAAmB,EAAgC,CAIxF,OAHI,GAAQ,GAAY,EACpB,EAAQ,EAAS,OACjB,EAAQ,EAAU,QAAQ,EAAQ,GAC7B,EAAI,EAAG,EAAI,EAAO,IACvB,EAAU,SAAS,EAAQ,EAAG,EAAS,GAAI,MAE/C,GAAI,GAAa,EAAU,oBAAoB,GAC3C,EAAS,EAAU,QAAQ,EAAa,GACxC,EAAU,EAAU,MAAM,eAAgB,SAAU,CAAC,SAAU,SAAU,SAAU,SAAU,UAAW,CAAC,EAAO,EAAO,EAAO,EAAY,IAC9I,EAAU,MAAM,GAEhB,OADI,GAAY,GAAI,YAAW,GACtB,EAAI,EAAG,EAAI,EAAS,IACzB,EAAU,GAAK,EAAU,SAAS,EAAS,EAAG,MAElD,SAAU,MAAM,GACT,EAIF,YAAqB,EAAM,EAAM,EAAK,CAE3C,OAAS,KAAO,GAAK,CACnB,GAAI,GAAM,EAAI,GACV,EAAO,MAAO,GAClB,AAAI,IAAQ,MAAQ,GAAQ,YAC1B,EAAK,GAAO,EACH,GAAQ,YAEZ,CAAI,GAAQ,SACb,EAAI,OACN,GAAK,GAAO,EAAI,SAKlB,EAAK,GAAO,GAGhB,MAAO,GAGF,YAAoB,EAAY,EAAgB,EAAa,CAElE,OADI,GAAI,GACC,EAAE,EAAG,EAAE,EAAM,OAAQ,IAC5B,GAAI,EAAM,GAAI,CACZ,GAAI,GAAM,GAAM,GAAO,EAAM,OAAO,EAAE,EAAK,GAC3C,AAAI,EAAI,GAAG,IAAK,KAChB,GAAM,EAAM,EAAO,EAAM,GAAK,IAGlC,MAAO,GAGF,YAAiB,EAAG,CACzB,MAAS,GAAE,MAAO,GAAQ,GAAG,GAAI,IAAS,EAAE,MAGvC,WAAc,EAAS,EAAS,EAAU,CAC/C,MAAQ,GAAE,IAAU,GAAE,MAAO,EAAO,GAAE,MAAO,GAAM,WAG9C,WAAe,EAAa,EAAa,EAAU,CACxD,MAAQ,GAAI,EAAQ,EAAQ,EAAI,EAAQ,EAAO,EAG1C,YAAmB,EAAqB,CAE7C,MAAI,GAAE,QAAU,EAAU,GACrB,GAAE,MAAM,eAAe,GAAI,IAAM,GAC/B,EAAE,QAAQ,OAAQ,MAGpB,YAAoB,EAA+B,CAKxD,OAJI,GAAI,EACJ,EAAM,EAAI,KACV,EAAO,GACP,EAAO,EACJ,EAAI,EAAI,QAAQ,CACrB,GAAI,GAAK,EAAI,KACb,GAAI,GAAM,EAAK,CAEb,OADI,GAAQ,EAAI,KACP,EAAE,EAAG,EAAE,EAAO,IACrB,EAAK,KAAK,GACZ,GAAI,GAAS,EACX,UAEF,GAAO,EACP,EAAK,KAAK,GAGd,MAAO,IAAI,YAAW,GAKjB,YAAuB,EAAY,EAAwC,EAA+B,CAC/G,GAAI,GAAO,GAAI,gBACf,EAAK,KAAK,MAAO,EAAK,IACtB,EAAK,aAAe,EACpB,EAAK,OAAS,SAAU,EAAQ,CAC9B,GAAI,EAAK,QAAU,IAAK,CACtB,GAAI,GAAO,EAAK,SAChB,AAAI,YAAgB,cAClB,GAAO,GAAI,YAAW,IAExB,EAAQ,WACC,EAAK,QAAU,IACxB,EAAQ,UAER,MAAM,OAAM,SAAW,EAAK,OAAS,YAAc,IAGvD,EAAK,QAAU,SAAU,EAAQ,CAC/B,EAAQ,OAEV,EAAK,UAAY,SAAU,EAAQ,CACjC,KAAM,OAAM,mBAAqB,IAEnC,EAAK,KAAK,MAIL,WAAyB,EAA4B,CAC1D,MAAO,GAAS,MAAM,KAAK,GAI7B,WAAyB,EAA4B,CACnD,MAAO,GAAS,MAAM,KAAK,GAItB,YAA6B,EAA4B,CAC9D,MAAO,GAAgB,EAAgB,IAGlC,YAAiB,EAAkC,CACxD,MAAO,IAAO,MAAS,OAAM,QAAQ,IAAQ,EAAa,IAGrD,WAAsB,EAAqC,CAChE,MAAO,IAAO,MAAQ,EAAI,kBAGrB,YAAiC,EAAsC,CAC5E,MAAQ,OAAO,IAAS,SAAY,EAAkB,GAAQ,EAOzD,YAAqB,EAAoB,CAC9C,MAAI,GAAI,GACC,OAAO,aAAa,EAAI,MAExB,OAAO,aAAa,GAGxB,YAAoB,EAAkC,CAC3D,MAAO,IAAI,SAAS,CAAC,EAAS,IAAW,CACvC,GAAI,GAAS,SAAS,cAAc,UACpC,EAAO,OAAS,EAChB,EAAO,QAAU,EACjB,EAAO,IAAM,EACb,SAAS,qBAAqB,QAAQ,GAAG,YAAY,KAIlD,YAA2B,EAAkB,CAClD,AAAI,EAAG,WAAW,MAAM,GAAK,EAAG,OAAO,IACvC,GAAI,GAAI,EAAG,MAAM,KACjB,GAAI,CAAC,GAAK,EAAE,QAAU,EAClB,MAAO,GAEX,OADI,GAAI,GACC,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAE,EAAG,CAC/B,GAAI,GAAI,EAAE,GAAG,MAAM,IAAK,GACxB,AAAI,EAAE,QAAU,EACZ,EAAE,EAAE,IAAM,GAEV,EAAE,EAAE,IAAM,mBAAmB,EAAE,GAAG,QAAQ,MAAO,MAEzD,MAAO,GAGF,YAAmB,EAAsB,CAE9C,MADI,CAAC,GACD,GAAK,SAAW,GAAK,IAAY,GACjC,GAAK,QAAU,GAAK,IAAY,GAC7B,ICxgBF,WAAqB,EAAQ,CAClC,GAAI,GAAS,GAAU,EAAO,EAAI,MAAS,OACvC,EAAU,GAAU,EAAO,EAAI,MAAS,OACxC,EAAa,KAAK,WAAa,EAAO,WAE1C,KAAK,MAAQ,EAAO,MACpB,KAAK,YAAc,EAAO,YAC1B,KAAK,UAAY,EAAO,WAAc,EAAO,OAAS,EAAO,MAAM,OAEnE,GAAI,GAAW,EAAY,eAAe,EAAa,KAAK,WAC5D,KAAK,UAAY,EAAY,gBAAgB,EAAO,GACpD,KAAK,UAAU,YAAY,GAE3B,GAAI,GAAiB,KAAK,KAAK,EAAO,EAAI,GAE1C,KAAK,eAAiB,EAAiB,EACvC,KAAK,aAAa,KAAK,UAAW,GAElC,GAAI,GAAO,KACP,EACA,EAAY,EAAiB,EAC7B,EAAe,EAInB,KAAK,eAAiB,YAAY,UAAW,CAC3C,GAAI,KAAK,MAAQ,EAAe,IAE9B,OADI,GAAW,SAAS,iBAAiB,iBAChC,EAAI,EAAG,EAAI,EAAS,OAAQ,EAAI,EAAG,IAC1C,GAAI,CACF,EAAK,UAAU,YAAY,EAAS,UAC7B,EAAP,IAKL,KAEH,WAAkB,EAAG,CACnB,GAAI,GAAY,EAAE,OAAO,UACzB,GAAI,CAAC,GAAgB,KAAK,IAAI,EAAY,GAAgB,EAAW,CACnE,GAAI,GAAQ,KAAK,MAAM,EAAY,GAAc,EACjD,EAAK,aAAa,EAAK,UAAW,EAAQ,EAAI,EAAI,GAClD,EAAe,EAGjB,EAAe,KAAK,MACpB,EAAE,gBAAkB,EAAE,iBAGxB,KAAK,UAAU,iBAAiB,SAAU,GAG5C,EAAY,UAAU,UAAY,SAAS,EAAG,CAC5C,GAAI,GACJ,GAAI,KAAK,YACP,EAAO,KAAK,YAAY,WACjB,KAAK,MACZ,GAAI,MAAO,MAAK,MAAM,IAAO,SAAU,CACrC,GAAI,GAAW,SAAS,eAAe,KAAK,MAAM,IAClD,EAAO,SAAS,cAAc,OAC9B,EAAK,MAAM,OAAS,KAAK,WAAa,KACtC,EAAK,YAAY,OAEjB,GAAO,KAAK,MAAM,GAItB,SAAK,UAAU,IAAI,QACnB,EAAK,aAAa,aAAc,GAAG,GACnC,EAAK,MAAM,SAAW,WACtB,EAAK,MAAM,IAAO,EAAI,KAAK,WAAc,KAClC,GAaT,EAAY,UAAU,aAAe,SAAS,EAAM,EAAM,CACxD,GAAI,GAAY,EAAO,KAAK,eAC5B,AAAI,EAAY,KAAK,WACnB,GAAY,KAAK,WAKnB,OADI,GAAW,SAAS,yBACf,EAAI,EAAM,EAAI,EAAW,IAChC,EAAS,YAAY,KAAK,UAAU,IAItC,OAAS,GAAI,EAAG,EAAI,EAAK,WAAW,OAAQ,EAAI,EAAG,IACjD,EAAK,WAAW,GAAG,MAAM,QAAU,OACnC,EAAK,WAAW,GAAG,aAAa,UAAW,KAE7C,EAAK,YAAY,IAGnB,EAAY,gBAAkB,SAAS,EAAG,EAAG,CAC3C,GAAI,GAAI,SAAS,cAAc,OAC/B,SAAE,UAAU,IAAI,SAChB,EAAE,MAAM,MAAQ,EAChB,EAAE,MAAM,OAAS,EACjB,EAAE,MAAM,SAAW,OACnB,EAAE,MAAM,SAAW,WACnB,EAAE,MAAM,QAAU,IAClB,EAAE,MAAM,OAAS,kBACV,GAGT,EAAY,eAAiB,SAAS,EAAG,CACvC,GAAI,GAAW,SAAS,cAAc,OACtC,SAAS,MAAM,QAAU,IACzB,EAAS,MAAM,SAAW,WAC1B,EAAS,MAAM,IAAM,IACrB,EAAS,MAAM,KAAO,IACtB,EAAS,MAAM,MAAQ,MACvB,EAAS,MAAM,OAAS,EAAI,KACrB,GAGT,EAAY,UAAU,aAAe,SAAS,EAAO,CACnD,KAAK,UAAU,UAAY,KAAK,WAAa,GCvJxC,GAAI,IAAY,GAEnB,EAAgB,EAEb,aAAiB,CACvB,GAAI,GAAI,EACR,UAAK,GAAK,GACV,GAAK,GAAK,GACV,GAAK,GAAK,EACF,GAAgB,GAAK,IAGvB,aAAwB,CAC7B,MAAO,GAGF,YAAsB,EAAY,CACvC,EAAgB,EAKX,WAAwB,EAAkB,EAAyB,EAAc,EAAmC,CACzH,GAAI,GAAS,EAAI,cAAc,UAC/B,SAAO,MAAQ,EACf,EAAO,OAAS,EAChB,EAAO,UAAU,IAAI,YACrB,EAAO,SAAW,GAClB,EAAY,YAAY,GACjB,EAGF,GAAK,GAAL,UAAK,EAAL,CACL,YAAU,GAAV,UACA,UAAQ,GAAR,QACA,SAAO,GAAP,OACA,QAAM,GAAN,MACA,SAAO,IAAP,OACA,UAAQ,IAAR,QACA,aAAW,KAAX,aAPU,WAaL,WAA4B,EAAoB,EAA2B,CAChF,EAAO,UAAY,AAAC,GAAM,CACxB,GAAI,GAAQ,EAAc,GAC1B,EAAS,EAAE,MAAO,EAAE,QAAS,EAAiB,GACzC,GAAO,EAAE,kBAEhB,EAAO,QAAU,AAAC,GAAM,CACtB,EAAS,EAAE,MAAO,EAAE,QAAS,GAAe,EAAc,KAMvD,WAAkB,CAOvB,YAAY,EAAyB,EAAc,EAAe,EAA6B,CAa/F,cAAW,IACX,cAAW,IAbT,KAAK,YAAc,EACnB,KAAK,MAAQ,EACb,KAAK,OAAS,EACd,KAAK,QAAU,EAYjB,UAAU,EAAe,CACvB,GAAI,GAAS,KAAK,OAClB,AAAI,EAEF,GAAO,MAAM,UAAY,UAAU,EAAO,OACtC,EAAO,MAAQ,EAAO,QACxB,GAAO,MAAM,YAAc,EAAO,MAAM,aAAe,QAEzD,GAAO,MAAM,UAAY,KACzB,EAAO,MAAM,YAAc,EAAO,MAAM,aAAe,MAI3D,OAAO,EAAoB,CACzB,GAAI,GACJ,KAAK,OAAS,EAAS,EAAe,GAAO,SAAU,KAAK,YAAa,KAAK,MAAO,KAAK,QAC1F,KAAK,QAAU,EAAE,GACb,KAAK,SAAW,KAAK,QAAQ,QAC/B,KAAK,UAAU,KAAK,QAAQ,QAE1B,KAAK,SAAW,KAAK,QAAQ,UAC/B,KAAK,QAAQ,IAAI,UAAU,OAEzB,KAAK,SAAW,KAAK,QAAQ,QAC/B,SAAQ,IAAI,KAAK,SACjB,KAAK,QAAQ,IAAI,eAAgB,KAAK,QAAQ,OAAO,KAEvD,KAAK,IAAM,EAAO,WAAW,MAC7B,KAAK,UAAY,KAAK,IAAI,gBAAgB,KAAK,MAAO,KAAK,QAC3D,KAAK,QAAU,GAAI,aAAY,KAAK,UAAU,KAAK,QAGrD,kBAAkB,EAAU,CAC1B,EAAmB,KAAK,OAAQ,GAGlC,cAAe,CAAE,MAAO,MAAK,QAE7B,YAAa,CAAE,MAAO,MAAK,IAE3B,YAAY,EAAY,EAAY,EAAY,EAAY,EAAW,EAAW,CAChF,AAAI,GAAK,EACP,KAAK,IAAI,aAAa,KAAK,UAAW,EAAI,EAAI,EAAI,EAAI,EAAG,GAEzD,KAAK,IAAI,aAAa,KAAK,UAAW,EAAG,GAG7C,UAAU,EAAW,EAAW,EAAU,EAAU,CAClD,GAAI,GAAM,KAAK,IACf,EAAI,UAAY,UAChB,EAAI,SAAS,EAAI,EAAI,EAAG,GAG1B,iBAAiB,EAAyB,CACxC,AAAK,GAAI,GAAK,KAAK,QACnB,EAAE,GAAI,UAAW,AAAC,GAAM,CACtB,GAAI,GAAM,EAAY,EAAI,GACtB,EAAQ,KAAK,MAAM,EAAI,EAAI,IAAM,KAAK,OAAO,OAC7C,EAAQ,KAAK,MAAM,EAAI,EAAI,IAAM,KAAK,OAAO,QACjD,KAAK,SAAW,EAAM,EAAG,IAAK,GAC9B,KAAK,SAAW,EAAM,EAAG,IAAK,OAK7B,eAA0B,EAAY,CAAtC,aAzJP,CAyJO,oBAEL,sBAAmB,GACnB,YAAS,EACT,WAAQ,GAoBR,YAAS,CACP,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAxBF,QAAS,CACP,MAAM,SACN,KAAK,GAAK,KAAK,MAAM,KACrB,KAAK,GAAK,KAAK,OAAO,KAGxB,OAAQ,CACN,GAAI,GAAM,KAAK,IACf,EAAI,yBAA2B,cAC/B,EAAI,YAAc,KAAK,iBACvB,EAAI,UAAY,UAChB,EAAI,SAAS,EAAG,EAAG,KAAK,MAAO,KAAK,QACpC,EAAI,YAAc,EAClB,EAAI,yBAA2B,UAcjC,SAAS,EAAW,EAAW,EAAW,EAAW,EAAkB,EAAc,CACnF,GAAI,GAAM,KAAK,IACX,EAAK,KAAK,GACV,EAAK,KAAK,GAEd,GAAI,EAAY,EAAG,CAEjB,GAAI,GAAQ,KAAK,IAAI,EAAY,IAAO,KAAK,OAC7C,EAAI,YAAc,EAClB,EAAI,UAAY,EAChB,EAAI,YAEJ,GAAI,GAAK,KAAK,OAAU,MAAK,SAAW,IACpC,EAAK,KAAK,OAAU,MAAK,SAAW,IACxC,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,EAAI,OAAO,EAAG,EAAI,KAAK,OAAO,EAAG,GACjC,AAAI,GAAM,GAAM,GAAM,EACpB,EAAI,OAAO,EAAG,EAAG,EAAG,KAAK,OAAO,EAAG,GAEnC,EAAI,OAAO,EAAG,EAAI,KAAK,OAAO,EAAG,GACnC,EAAI,YAAc,KAAK,OAAO,EAAQ,GACtC,EAAI,YAKH,OAAU,CAEf,YAAY,EAAa,CACvB,KAAK,IAAM,GAAI,YAAW,GAAI,aAAY,MAIvC,eAAsB,MAAM,CAEjC,YAAY,EAAa,EAAsB,CAC7C,MAAM,GACN,KAAK,KAAO,EACZ,OAAO,eAAe,KAAM,EAAQ,aAI7B,EAAqC,GAEzC,OAAqB,CAY1B,YAAY,EAAoB,EAAqB,CATrD,aAAoB,GACpB,aAAoB,GACpB,YAAS,EAKT,qBAAkB,GAA4B,MAAO,QAAO,uBAA0B,WAGpF,KAAK,UAAY,EACjB,KAAK,aAAe,IAAS,EAC7B,KAAK,SAAW,EAGlB,cAAc,EAAa,CACzB,GAAI,GAAK,AAAC,GAAc,CACtB,GAAI,CACF,KAAK,UAAU,KAAK,gBAAkB,EAAY,KAAK,aAChD,EAAP,CACA,WAAK,QAAU,GACf,KAAK,QAAU,GACT,IAGV,AAAI,KAAK,gBACP,OAAO,sBAAsB,GAE7B,WAAW,EAAI,GAGnB,UAAU,EAAW,CACnB,AAAI,EAAK,KAAK,QACR,MAAK,SACP,KAAK,WAEH,KAAK,SAAW,GAClB,MAAK,QAAU,GACb,KAAK,WAAa,KACpB,QAAQ,IAAI,kBAAoB,KAAK,QAAQ,IAAM,GAAG,KAAK,SAAW,SAG1E,KAAK,QAAU,KAAK,aAEf,EAAK,KAAK,OAAU,KAEvB,MAAK,OAAS,GAEhB,AAAI,KAAK,QACP,KAAK,cAAc,KAAK,OAAS,GAEjC,KAAK,QAAU,GAGnB,WAAY,CACV,MAAO,MAAK,QAEd,OAAQ,CACN,AAAK,KAAK,SACR,MAAK,QAAU,GACf,KAAK,OAAS,EACd,KAAK,QAAU,EACV,KAAK,SACR,MAAK,cAAc,GACnB,KAAK,QAAU,KAIrB,MAAO,CACL,KAAK,QAAU,KAMZ,YAAiB,EAAuB,EAAe,EAAwB,CAMpF,OALI,GAAI,GACJ,EAAO,EAAI,mBAAwB,EACnC,EAAU,KAAK,KAAK,GAAK,GACzB,EAAU,YAAe,eAAgB,YAAe,cAEnD,EAAI,EAAG,EAAI,EAAQ,GAAK,EAAS,CACxC,GAAK,IAAM,EAAI,EAAI,GAAU,IAC7B,OAAS,GAAE,EAAG,EAAE,EAAS,IACvB,AAAI,EAAI,EAAI,EAAI,QACV,IAAK,EAAQ,GAAG,IAAK,KACzB,AAAI,EAAS,GAAK,IAAM,EAAI,EAAI,GAAG,YAAY,EAAK,GAC/C,GAAK,IAAM,EAAI,EAAI,EAAI,GAAI,EAAK,IAGzC,GAAK;AAAA,EAEP,MAAO,GAqBF,GAAM,GAAO,CAChB,OAAU,CAAC,EAAG,EAAK,EAAG,KAGtB,GAAU,CAAC,EAAG,GAAK,EAAG,KAAS,KAAK,EAAG,OAAO,GAAI,MAAM,IACxD,KAAU,CAAC,EAAG,GAAK,EAAG,OAAS,KAAK,EAAG,OAAO,GAAI,MAAM,GACxD,KAAU,CAAC,EAAG,GAAK,EAAG,OAAS,KAAK,EAAG,OAAO,GAAI,MAAM,IACxD,MAAU,CAAC,EAAG,GAAK,EAAG,QAAS,KAAK,EAAG,OAAO,GAAI,MAAM,GACxD,EAAU,CAAC,EAAG,GAAK,EAAG,QAAS,KAAK,EAAG,OAAO,GAC9C,EAAU,CAAC,EAAG,GAAK,EAAG,QAAS,KAAK,EAAG,OAAO,GAC9C,KAAU,CAAC,EAAG,GAAK,EAAG,IAAS,KAAK,EAAG,OAAO,GAC9C,KAAU,CAAC,EAAG,GAAK,EAAG,IAAS,KAAK,EAAG,OAAO,GAC9C,KAAU,CAAC,EAAG,GAAK,EAAG,IAAS,KAAK,EAAG,OAAO,GAC9C,KAAU,CAAC,EAAG,GAAK,EAAG,IAAS,KAAK,EAAG,OAAO,GAC9C,OAAU,CAAC,EAAG,IAAK,EAAG,KAAS,KAAK,EAAG,OAAO,GAC9C,MAAU,CAAC,EAAG,GAAK,EAAG,QAAS,KAAK,EAAG,OAAO,GAC9C,OAAU,CAAC,EAAG,EAAK,EAAG,QAAS,KAAK,EAAG,OAAO,IAE9C,MAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAAI,MAAM,IACvD,QAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAAI,MAAM,GACvD,QAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAAI,MAAM,IACvD,SAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAAI,MAAM,GACvD,KAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAC7C,KAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAC7C,QAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAC7C,QAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAC7C,QAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAC7C,QAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAC7C,UAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAC7C,SAAa,CAAC,EAAG,GAAI,EAAG,IAAM,KAAK,EAAG,OAAO,GAE7C,UAAW,CAAC,EAAG,GAAI,EAAG,OACtB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,MAAO,CAAC,EAAG,IAAK,EAAG,MACnB,OAAQ,CAAC,EAAG,IAAK,EAAG,OACpB,OAAQ,CAAC,EAAG,IAAK,EAAG,OACpB,OAAQ,CAAC,EAAG,IAAK,EAAG,OACpB,eAAgB,CAAC,EAAG,IAAK,EAAG,UAC5B,SAAU,CAAC,EAAG,GAAI,EAAG,SACrB,SAAU,CAAC,EAAG,IAAK,EAAG,KACtB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,SAAU,CAAC,EAAG,IAAK,EAAG,KACtB,UAAW,CAAC,EAAG,IAAK,EAAG,KACvB,UAAW,CAAC,EAAG,IAAK,EAAG,KACvB,WAAY,CAAC,EAAG,GAAI,EAAG,KACvB,cAAe,CAAC,EAAG,EAAG,EAAG,SACzB,OAAQ,CAAC,EAAG,EAAG,EAAG,OAClB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,SAAU,CAAC,EAAG,IAAK,EAAG,QACtB,gBAAiB,CAAC,EAAG,IAAK,EAAG,KAC7B,iBAAkB,CAAC,EAAG,IAAK,EAAG,KAC9B,aAAc,CAAC,EAAG,GAAI,EAAG,UACzB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,WAAY,CAAC,EAAG,IAAK,EAAG,QACxB,SAAU,CAAC,EAAG,IAAK,EAAG,KACtB,SAAU,CAAC,EAAG,GAAI,EAAG,SACrB,SAAU,CAAC,EAAG,GAAI,EAAG,SACrB,cAAe,CAAC,EAAG,IAAK,EAAG,MAC3B,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,KAAM,CAAC,EAAG,GAAI,EAAG,KACjB,SAAU,CAAC,EAAG,IAAK,EAAG,OACtB,UAAW,CAAC,EAAG,IAAK,EAAG,KACvB,aAAc,CAAC,EAAG,GAAI,EAAG,KACzB,SAAU,CAAC,EAAG,IAAK,EAAG,KACtB,WAAY,CAAC,EAAG,GAAI,EAAG,QACvB,OAAQ,CAAC,EAAG,GAAI,EAAG,OACnB,WAAY,CAAC,EAAG,IAAK,EAAG,OACxB,SAAU,CAAC,EAAG,GAAI,EAAG,SACrB,UAAW,CAAC,EAAG,GAAI,EAAG,OACtB,UAAW,CAAC,EAAG,GAAI,EAAG,OACtB,QAAS,CAAC,EAAG,GAAI,EAAG,QACpB,OAAQ,CAAC,EAAG,GAAI,EAAG,OACnB,WAAY,CAAC,EAAG,GAAI,EAAG,QACvB,aAAc,CAAC,EAAG,GAAI,EAAG,UACzB,MAAO,CAAC,EAAG,GAAI,EAAG,MAClB,QAAS,CAAC,EAAG,GAAI,EAAG,QACpB,QAAS,CAAC,EAAG,GAAI,EAAG,QACpB,SAAU,CAAC,EAAG,GAAI,EAAG,SACrB,YAAa,CAAC,EAAG,IAAK,EAAG,OACzB,UAAW,CAAC,EAAG,IAAK,EAAG,SACvB,YAAa,CAAC,EAAG,IAAK,EAAG,SACzB,YAAa,CAAC,EAAG,IAAK,EAAG,SACzB,OAAQ,CAAC,EAAG,IAAK,EAAG,SACpB,WAAY,CAAC,EAAG,IAAK,EAAG,SACxB,WAAY,CAAC,EAAG,GAAI,EAAG,SACvB,WAAY,CAAC,EAAG,GAAI,EAAG,SACvB,WAAY,CAAC,EAAG,GAAI,EAAG,SACvB,WAAY,CAAC,EAAG,GAAI,EAAG,SACvB,WAAY,CAAC,EAAG,IAAK,EAAG,SACxB,WAAY,CAAC,EAAG,IAAK,EAAG,SACxB,WAAY,CAAC,EAAG,IAAK,EAAG,SACxB,WAAY,CAAC,EAAG,IAAK,EAAG,SACxB,WAAY,CAAC,EAAG,IAAK,EAAG,SACxB,WAAY,CAAC,EAAG,IAAK,EAAG,SACxB,iBAAkB,CAAC,EAAG,GAAI,EAAG,aAGjC,WAAuB,EAAG,CACxB,MAAQ,GAAE,SAAS,EAAe,GAC3B,GAAE,QAAQ,EAAc,GACxB,GAAE,OAAO,EAAa,GACtB,GAAE,QAAQ,GAAc,GAK1B,WAA4B,EAA8B,EAAgB,EAAsB,EAAqB,CAC1H,MAAO,CAAC,EAAW,EAAY,IAAiB,CAC9C,GAAI,CAAC,EAAK,CACR,EAAK,KAAM,EAAK,EAAM,GACtB,OAEF,GAAI,GAAkB,EAAI,GAK1B,GAJK,GAAG,GAAI,EAAI,IACZ,GAAS,IAAK,IAChB,EAAK,EAAG,EAAK,EAAM,GAEjB,EAAG,CAEL,GAAI,GAAO,EAAE,KACb,AAAI,EAAO,GACT,GAAO,CAAC,EACJ,EAAS,GAAmB,KAC9B,IAAS,EAAmB,KAEhC,AAAI,EAAQ,EACV,EAAS,EAAE,QAAU,EACZ,EAAQ,IACjB,GAAS,EAAE,QAAU,CAAC,KAMvB,YAA4B,EAAmB,EAA8B,EAAgB,EAAsB,EAAqB,CAC7I,GAAI,GAAU,EAAmB,EAAU,EAAK,EAAM,GACtD,SAAM,kBAAkB,GACjB,GAAI,GAAiB,GAGvB,YAAwB,EAA+C,CAE5E,OADI,GAAM,GAAI,KACL,EAAE,EAAG,EAAE,EAAM,OAAQ,IAAK,CACjC,GAAI,GAAQ,EAAM,GACd,EAAoB,CAAC,MAAM,EAAM,GAAI,KAAK,EAAM,GAAI,IAAI,EAAM,IAClE,EAAI,EAAM,GAAG,GAAK,EAEpB,MAAO,GAGT,GAAM,GAAqC,CACzC,EAAK,GAAI,EAAK,KAAM,EAAK,KAAM,EAAK,MAAO,EAAK,EAAG,EAAK,EAAG,EAAK,OAAQ,EAAK,MAC7E,EAAK,MAAO,EAAK,QAAS,EAAK,QAAS,EAAK,SAAU,EAAK,KAAM,EAAK,KAAM,EAAK,UAAW,EAAK,UAG7F,OAAuB,CAM5B,YAAY,EAAkC,CAL9C,YAAS,GAIT,WAAQ,GAEN,KAAK,QAAU,EACf,OAAO,iBAAiB,mBAAoB,AAAC,GAAU,CACrD,QAAQ,IAAI,qBAAsB,GAClC,KAAK,UAEP,OAAO,iBAAiB,sBAAuB,AAAC,GAAU,CACxD,QAAQ,IAAI,wBAAyB,GACrC,KAAK,UAGT,OAAQ,CAEN,GADA,KAAK,OAAS,MAAO,WAAU,aAAgB,WAC3C,KAAK,OAAQ,CACf,GAAI,GAAc,UAAU,cAAc,OAC1C,KAAK,MAAQ,GAAI,OAAM,GACvB,KAAK,UAAY,GAAI,OAAM,GAC3B,OAAS,GAAE,EAAG,EAAE,EAAa,IAC3B,KAAK,MAAM,GAAK,GAAI,YAAW,IAC/B,KAAK,UAAU,GAAK,GAAI,YAAW,IAErC,QAAQ,IAAI,OAGhB,MAAO,CACL,GAAI,EAAC,KAAK,OAEV,OADI,GAAW,UAAU,cAChB,EAAI,EAAG,EAAI,EAAS,OAAQ,IAAO,CAC1C,GAAI,GAAQ,KAAK,MAAM,GACnB,EAAY,KAAK,UAAU,GAC/B,GAAI,GAAK,EAAS,GAClB,GAAI,EAAI,CACN,OAAS,GAAE,EAAG,EAAE,EAAG,KAAK,OAAQ,IAAK,CACnC,GAAI,GAAI,EAAI,KAAK,MACjB,EAAM,GAAK,KAAK,MAAM,EAAG,KAAK,IAC1B,EAAM,IAAM,EAAU,IACxB,KAAK,kBAAkB,EAAI,GAG/B,OAAS,GAAE,EAAG,EAAE,EAAG,QAAQ,OAAQ,IACjC,EAAM,GAAK,EAAG,QAAQ,GAAG,QAAU,EAAI,EACnC,EAAM,IAAM,EAAU,IACxB,KAAK,kBAAkB,EAAI,GAG/B,EAAU,IAAI,KAIpB,kBAAkB,EAAY,EAAU,CACtC,GAAI,GAAO,EAAI,KAAK,MAEpB,OAAS,KAAO,GAEd,GAAI,GAAO,EAAI,MAAQ,EAAK,CAC1B,GAAI,GAAO,EAAI,EACX,EAAQ,KAAK,MAAM,GAAK,GACxB,EAAY,KAAK,UAAU,GAAK,GAEpC,GAAI,GAAK,EAAI,QAAW,GAAQ,GAAK,EAAI,OAAS,GAAW,GAAQ,GAAK,EAAI,OAAS,EAAQ,CAE7F,AAAI,GAAS,EACX,KAAK,QAAQ,EAAM,EAAG,GAEtB,KAAK,QAAQ,EAAM,EAAG,IAExB,cAGO,GAAS,GAAM,GAAQ,GAAK,EAAI,OAAS,GAAe,GAAQ,GAAK,EAAI,OAAS,EAAY,CACrG,KAAK,QAAQ,EAAM,EAAG,IACtB,UAQH,YAAkB,EAA0B,EAAY,EAAgC,CAC7F,GAAI,EAAK,OAAS,EAChB,KAAM,OAAM,kBAAoB,EAAK,OAAS,MAAQ,GAExD,GAAI,GAAI,GAAI,GAAI,GAChB,MAAI,GACF,EAAE,IAAI,IAAI,EAAM,EAAI,EAAK,QAEzB,EAAE,IAAI,IAAI,GACL,EAAE,IAQJ,WAAwB,EAA+B,EAAgC,CAC5F,GAAI,GAAO,KACX,YAAwB,CACtB,GAAI,GAAI,GACR,AAAI,GAAW,EAAQ,OACrB,IAAK,MAAQ,EAAQ,MAAQ,KAE/B,OAAS,GAAE,EAAG,EAAE,EAAM,OAAQ,IAAK,CACjC,GAAI,GAAQ,EAAM,GACd,EAAQ,EAAM,GAAG,EACjB,EAAM,EAAM,GAAG,EACf,EAAO,EAAM,GAAG,EAChB,EAAO,EAAM,GACjB,EAAK,OAAO,GAAK,EACjB,GAAK,UAAY,EAAQ,UAAU,EAAM,KACrC,GAAM,IAAK,MAAM,EAAK,KAC1B,GAAK,mBAAmB,EAAE;AAAA,EAE5B,UAAK,YACE,GAAI,UAAS,IAAK,IAAK,GAEhC,MAAO,KAAe,KAAK,GAGtB,YAA2B,EAA+B,EAAiE,CAChI,MAAO,IAAK,GAAuB,EAAO,GAKrC,WAAqB,EAA4B,EAA2B,CACjF,GAAI,GAAO,EAAO,wBACd,EAAS,EAAO,MAAQ,EAAK,MAC7B,EAAS,EAAO,OAAS,EAAK,OAElC,MAAO,CACL,EAAI,GAAI,QAAU,EAAK,MAAQ,EAC/B,EAAI,GAAI,QAAU,EAAK,KAAO,GAO3B,aAA8C,CACnD,MAAO,GAAE,oBAAoB,QAAQ,SAQhC,YAA0B,CAK/B,YAAY,EAAsB,CAChC,GAAI,GAAM,SAAS,cAAc,OACjC,EAAI,aAAa,QAAS,WAC1B,EAAO,YAAY,GACnB,KAAK,QAAU,EAGjB,OAAO,EAAyB,EAAsB,EAAsC,CAC1F,KAAK,UAAY,EACjB,KAAK,WAAa,GAAI,GAAY,CAChC,EAAG,EAAE,GAAW,QAChB,EAAG,EAAE,GAAW,SAChB,WAAY,KACZ,UAAW,EACX,YAAa,AAAC,GAAiB,CAC7B,GAAI,GAAO,EAAG,GACV,EAAU,SAAS,cAAc,OACrC,SAAQ,YAAY,SAAS,eAAe,EAAK,OAC7C,EAAK,MAAQ,MAAM,GAAQ,UAAY,EAAK,MACzC,KAGX,EAAE,KAAK,SAAS,OAAO,KAAK,WAAW,WAIzC,SAAU,CACR,AAAI,KAAK,YACP,EAAE,KAAK,SAAS,KAAK,gBAAgB,KAAM,CAAC,EAAE,IAAM,CAClD,GAAI,GAAM,EACN,EAAM,SAAS,EAAI,aAAa,eAChC,EAAU,EAAI,UACd,EAAO,KAAK,UAAU,GACtB,EAAU,EAAK,KACnB,GAAI,GAAW,GACb,GAAI,UAAY,EACZ,EAAK,MAAQ,MAAQ,CAAC,EAAI,UAAU,SAAS,EAAK,OAAO,CAC3D,GAAI,GAAa,MAAM,KAAK,EAAI,WAChC,EAAW,QAAQ,AAAC,GAAM,EAAI,UAAU,OAAO,IAC/C,EAAI,UAAU,IAAI,QAClB,EAAI,UAAU,IAAI,EAAK,WAS5B,YAA0B,EAAa,CAC5C,GAAM,GAAQ,GACR,EAAS,IACT,EAAQ,GACV,EAAM,GAAO,EAAK,GAClB,EAAK,EAAM,GACX,EAAO,EAAK,EAAQ,EACxB,AAAI,GAAI,IAAM,GACd,GAAI,GAAU,IAAK,GAAK,GAAK,IAAO,GAAI,KAAK,GAAK,KAC9C,EAAI,IAAM,EAAS,KAAK,IAAI,EAAK,GAAI,GACrC,EAAI,EAAO,KAAK,IAAI,GACpB,EAAI,EAAO,KAAK,IAAI,GACxB,GAAI,GAAI,EAAI,KAAQ,EAAI,KAAQ,EAC5B,EAAI,EAAI,KAAQ,EAAI,KAAQ,EAC5B,EAAI,EAAI,MAAQ,EAAI,MAAQ,EAChC,MAAO,GAAK,EAAM,EAAE,IAAI,GAAI,EAAM,EAAE,IAAI,GAAI,EAAM,EAAE,IAAI", + "sourcesContent": ["\nexport function lpad(s:string, n:number):string {\n s += ''; // convert to string\n while (s.length 0) ? s.substr(0, pos) : s;\n}\n\nexport function hex(v:number, nd?:number) {\n if (!nd) nd = 2;\n if (nd == 8) {\n return hex((v>>16)&0xffff,4) + hex(v&0xffff,4);\n } else {\n return toradix(v,nd,16);\n }\n}\n\nexport function tobin(v:number, nd?:number) {\n if (!nd) nd = 8;\n return toradix(v,nd,2);\n}\n\nexport function toradix(v:number, nd:number, radix:number) {\n try {\n var s = v.toString(radix).toUpperCase();\n while (s.length < nd)\n s = \"0\" + s;\n return s;\n } catch (e) {\n return v+\"\";\n }\n}\n\nexport function arrayCompare(a:ArrayLike, b:ArrayLike):boolean {\n if (a == null && b == null) return true;\n if (a == null) return false;\n if (b == null) return false;\n if (a.length != b.length) return false;\n for (var i=0; i= 0) {\n while (i < s1.length && split1[i].indexOf(\"\\n\") < 0)\n i++;\n }\n if (w1 != w2) {\n w2 = '' + w2 + '';\n }\n result += w2;\n i++;\n j++;\n }\n while (j < split2.length) {\n result += split2[j++];\n }\n return result;\n}\n\nexport function lzgmini() {\n\n // Constants\n var LZG_HEADER_SIZE = 16;\n var LZG_METHOD_COPY = 0;\n var LZG_METHOD_LZG1 = 1;\n\n // LUT for decoding the copy length parameter\n var LZG_LENGTH_DECODE_LUT = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,\n 20,21,22,23,24,25,26,27,28,29,35,48,72,128];\n\n // Decoded data (produced by the decode() method)\n var outdata = null;\n\n // Calculate the checksum\n var calcChecksum = function(data) {\n var a = 1;\n var b = 0;\n var i = LZG_HEADER_SIZE;\n while (i < data.length)\n {\n a = (a + (data[i] & 0xff)) & 0xffff;\n b = (b + a) & 0xffff;\n i++;\n }\n return (b << 16) | a;\n }\n\n // Decode LZG coded data. The function returns the size of the decoded data.\n // Use any of the get* methods to retrieve the decoded data.\n this.decode = function(data:number[]):number[] {\n // Start by clearing the decompressed array in this object\n outdata = null;\n\n // Check magic ID\n if ((data.length < LZG_HEADER_SIZE) || (data[0] != 76) ||\n (data[1] != 90) || (data[2] != 71))\n {\n return null;\n }\n \n // what's the length?\n var uncomplen = data[6] | (data[5]<<8) | (data[4]<<16) | (data[3]<<24);\n\n // Calculate & check the checksum\n var checksum = ((data[11] & 0xff) << 24) |\n ((data[12] & 0xff) << 16) |\n ((data[13] & 0xff) << 8) |\n (data[14] & 0xff);\n if (calcChecksum(data) != checksum)\n {\n return null;\n }\n\n var dst = new Array();\n // Check which method to use\n var method = data[15] & 0xff;\n if (method == LZG_METHOD_LZG1)\n {\n // Get marker symbols\n var m1 = data[16] & 0xff;\n var m2 = data[17] & 0xff;\n var m3 = data[18] & 0xff;\n var m4 = data[19] & 0xff;\n\n // Main decompression loop\n var symbol, b, b2, b3, len, offset;\n var dstlen = 0;\n var k = LZG_HEADER_SIZE + 4;\n var datalen = data.length;\n while (k <= datalen)\n {\n symbol = data[k++] & 0xff;\n if ((symbol != m1) && (symbol != m2) && (symbol != m3) && (symbol != m4))\n {\n // Literal copy\n dst[dstlen++] = symbol;\n }\n else\n {\n b = data[k++] & 0xff;\n if (b != 0)\n {\n // Decode offset / length parameters\n if (symbol == m1)\n {\n // marker1 - \"Distant copy\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n b2 = data[k++] & 0xff;\n b3 = data[k++] & 0xff;\n offset = (((b & 0xe0) << 11) | (b2 << 8) | b3) + 2056;\n }\n else if (symbol == m2)\n {\n // marker2 - \"Medium copy\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n b2 = data[k++] & 0xff;\n offset = (((b & 0xe0) << 3) | b2) + 8;\n }\n else if (symbol == m3)\n {\n // marker3 - \"Short copy\"\n len = (b >> 6) + 3;\n offset = (b & 63) + 8;\n }\n else\n {\n // marker4 - \"Near copy (incl. RLE)\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n offset = (b >> 5) + 1;\n }\n\n // Copy the corresponding data from the history window\n for (i = 0; i < len; i++)\n {\n dst[dstlen] = dst[dstlen-offset];\n dstlen++;\n }\n }\n else\n {\n // Literal copy (single occurance of a marker symbol)\n dst[dstlen++] = symbol;\n }\n }\n }\n\n }\n else if (method == LZG_METHOD_COPY)\n {\n // Plain copy\n var dstlen = 0;\n var datalen = data.length;\n for (var i = LZG_HEADER_SIZE; i < datalen; i++)\n {\n dst[dstlen++] = data[i] & 0xff;\n }\n }\n else\n {\n // Unknown method\n return null;\n }\n // Store the decompressed data in the lzgmini object for later retrieval\n if (dst.length < uncomplen) return null; // data too short\n outdata = dst.slice(0, uncomplen);\n return outdata;\n }\n\n // Get the decoded byte array\n this.getByteArray = function():number[]\n {\n return outdata;\n }\n\n // Get the decoded string from a Latin 1 (or ASCII) encoded array\n this.getStringLatin1 = function():string {\n return byteArrayToString(outdata);\n }\n\n // Get the decoded string from an UTF-8 encoded array\n this.getStringUTF8 = function():string {\n return byteArrayToUTF8(outdata);\n }\n}\n\nexport function stringToByteArray(s:string) : Uint8Array {\n var a = new Uint8Array(s.length);\n for (var i=0; i= 192) && (c < 224)) {\n c = ((c & 31) << 6) | (data[i++] & 63);\n } else {\n c = ((c & 15) << 12) | ((data[i] & 63) << 6) | (data[i+1] & 63);\n i += 2;\n if (c == 0xfeff) continue; // ignore BOM\n }\n str += String.fromCharCode(c);\n }\n }\n return str;\n}\n\nexport function removeBOM(s:string) {\n if (s.charCodeAt(0) === 0xFEFF) {\n s = s.substr(1);\n }\n return s;\n}\n\nexport function isProbablyBinary(path:string, data?:number[] | Uint8Array) : boolean {\n var score = 0;\n // check extensions\n if (path) {\n path = path.toUpperCase();\n const BINEXTS = ['.CHR','.BIN','.DAT','.PAL','.NAM','.RLE','.LZ4','.NSF'];\n for (var ext of BINEXTS) {\n if (path.endsWith(ext)) score++;\n }\n }\n // decode as UTF-8\n for (var i = 0; i < (data?data.length:0);) {\n let c = data[i++];\n if ((c & 0x80) == 0) {\n // more likely binary if we see a NUL or obscure control character\n if (c < 9 || (c >= 14 && c < 26) || c == 0x7f) {\n score++;\n break;\n }\n } else {\n // look for invalid unicode sequences\n var nextra = 0;\n if ((c & 0xe0) == 0xc0) nextra = 1;\n else if ((c & 0xf0) == 0xe0) nextra = 2;\n else if ((c & 0xf8) == 0xf0) nextra = 3;\n else if (c < 0xa0) score++;\n else if (c == 0xff) score++;\n while (nextra--) {\n if (i >= data.length || (data[i++] & 0xc0) != 0x80) {\n score++;\n break;\n }\n }\n }\n }\n return score > 0;\n}\n\n// need to load liblzg.js first\nexport function compressLZG(em_module, inBuffer:number[], levelArg?:boolean) : Uint8Array {\n var level = levelArg || 9;\n var inLen = inBuffer.length;\n var inPtr = em_module._malloc(inLen + 1);\n for (var i = 0; i < inLen; i++) {\n em_module.setValue(inPtr + i, inBuffer[i], 'i8');\n }\n var maxEncSize = em_module._LZG_MaxEncodedSize(inLen);\n var outPtr = em_module._malloc(maxEncSize + 1);\n var compLen = em_module.ccall('compress_lzg', 'number', ['number', 'number', 'number', 'number', 'number'], [level, inPtr, inLen, maxEncSize, outPtr]);\n em_module._free(inPtr);\n var outBuffer = new Uint8Array(compLen);\n for (var i = 0; i < compLen; i++) {\n outBuffer[i] = em_module.getValue(outPtr + i, 'i8');\n }\n em_module._free(outPtr);\n return outBuffer;\n}\n\n// only does primitives, 1D arrays and no recursion\nexport function safe_extend(deep, dest, src) {\n // TODO: deep ignored\n for (var key in src) {\n var val = src[key];\n var type = typeof(val);\n if (val === null || type == 'undefined') {\n dest[key] = val;\n } else if (type == 'function') {\n // ignore function\n } else if (type == 'object') {\n if (val['slice']) { // array?\n dest[key] = val.slice();\n } else {\n // ignore object\n }\n } else {\n dest[key] = val;\n }\n }\n return dest;\n}\n\nexport function printFlags(val:number, names:string[], r2l:boolean) {\n var s = '';\n for (var i=0; i 0) s += \" \";\n s += (val & bit) ? names[i] : \"-\";\n }\n }\n return s;\n}\n\nexport function rgb2bgr(x) {\n return ((x&0xff)<<16) | ((x>>16)&0xff) | (x&0x00ff00);\n}\n\nexport function RGBA(r:number,g:number,b:number) {\n return (r&0xff) | ((g&0xff)<<8) | ((b&0xff)<<16) | 0xff000000;\n}\n\nexport function clamp(minv:number, maxv:number, v:number) {\n return (v < minv) ? minv : (v > maxv) ? maxv : v;\n}\n\nexport function safeident(s : string) : string {\n // if starts with non-alpha character, prefix with '_'\n if (s.length == 0) return '';\n if (!s.match(/^[a-zA-Z_]/)) s = '_' + s;\n return s.replace(/\\W+/g, \"_\");\n}\n\nexport function rle_unpack(src : Uint8Array) : Uint8Array {\n var i = 0;\n var tag = src[i++];\n var dest = [];\n var data = tag;\n while (i < src.length) {\n var ch = src[i++];\n if (ch == tag) {\n var count = src[i++];\n for (var j=0; jvoid, datatype:'text'|'arraybuffer') {\n var oReq = new XMLHttpRequest();\n oReq.open(\"GET\", url, true);\n oReq.responseType = datatype;\n oReq.onload = function (oEvent) {\n if (oReq.status == 200) {\n var data = oReq.response;\n if (data instanceof ArrayBuffer) {\n data = new Uint8Array(data);\n }\n success(data);\n } else if (oReq.status == 404) {\n success(null);\n } else {\n throw Error(\"Error \" + oReq.status + \" loading \" + url);\n }\n }\n oReq.onerror = function (oEvent) {\n success(null);\n }\n oReq.ontimeout = function (oEvent) {\n throw Error(\"Timeout loading \" + url);\n }\n oReq.send(null);\n}\n\n// get platform ID without . emulator\nexport function getBasePlatform(platform : string) : string {\n return platform.split('.')[0];\n}\n\n// get platform ID without - specialization\nfunction getRootPlatform(platform : string) : string {\n return platform.split('-')[0];\n}\n\n// get platform ID without emulator or specialization\nexport function getRootBasePlatform(platform : string) : string {\n return getRootPlatform(getBasePlatform(platform));\n}\n\nexport function isArray(obj: any) : obj is ArrayLike {\n return obj != null && (Array.isArray(obj) || isTypedArray(obj));\n}\n\nexport function isTypedArray(obj: any) : obj is ArrayLike {\n return obj != null && obj['BYTES_PER_ELEMENT'];\n}\n\nexport function convertDataToUint8Array(data: string|Uint8Array) : Uint8Array {\n return (typeof data === 'string') ? stringToByteArray(data) : data;\n}\n\nexport function convertDataToString(data: string|Uint8Array) : string {\n return (data instanceof Uint8Array) ? byteArrayToUTF8(data) : data;\n}\n\nexport function byteToASCII(b: number) : string {\n if (b < 32)\n return String.fromCharCode(b + 0x2400);\n else\n return String.fromCharCode(b);\n}\n\nexport function loadScript(scriptfn:string) : Promise {\n return new Promise( (resolve, reject) => {\n var script = document.createElement('script');\n script.onload = resolve;\n script.onerror = reject;\n script.src = scriptfn;\n document.getElementsByTagName('head')[0].appendChild(script);\n });\n}\n\nexport function decodeQueryString(qs : string) : {} {\n if (qs.startsWith('?')) qs = qs.substr(1);\n var a = qs.split('&');\n if (!a || a.length == 0)\n return {};\n var b = {};\n for (var i = 0; i < a.length; ++i) {\n var p = a[i].split('=', 2);\n if (p.length == 1)\n b[p[0]] = \"\";\n else\n b[p[0]] = decodeURIComponent(p[1].replace(/\\+/g, \" \"));\n }\n return b;\n}\n\nexport function parseBool(s : string) : boolean {\n if (!s) return false;\n if (s == 'false' || s == '0') return false;\n if (s == 'true' || s == '1') return true;\n return s ? true : false;\n}\n\n///\n\nexport class XMLParseError extends Error {\n}\n\nexport interface XMLNode {\n type: string;\n text: string | null;\n children: XMLNode[];\n attrs: { [id: string]: string };\n obj: any;\n}\n\nexport type XMLVisitFunction = (node: XMLNode) => any;\n\nfunction escapeXML(s: string): string {\n if (s.indexOf('&') >= 0) {\n return s.replace(/'/g, \"'\")\n .replace(/"/g, '\"')\n .replace(/>/g, '>')\n .replace(/</g, '<')\n .replace(/&/g, '&');\n } else {\n return s;\n }\n}\n\nexport function parseXMLPoorly(s: string, openfn?: XMLVisitFunction, closefn?: XMLVisitFunction): XMLNode {\n const tag_re = /[<]([/]?)([?a-z_-]+)([^>]*)[>]+|(\\s*[^<]+)/gi;\n const attr_re = /\\s*(\\w+)=\"(.*?)\"\\s*/gi;\n var fm: RegExpMatchArray;\n var stack: XMLNode[] = [];\n var top: XMLNode;\n\n function closetop() {\n top = stack.pop();\n if (top == null || top.type != ident) throw new XMLParseError(\"mismatch close tag: \" + ident);\n if (closefn) {\n top.obj = closefn(top);\n }\n if (stack.length == 0) throw new XMLParseError(\"close tag without open: \" + ident);\n stack[stack.length - 1].children.push(top);\n }\n function parseattrs(as: string): { [id: string]: string } {\n var am;\n var attrs = {};\n if (as != null) {\n while (am = attr_re.exec(as)) {\n attrs[am[1]] = escapeXML(am[2]);\n }\n }\n return attrs;\n }\n while (fm = tag_re.exec(s)) {\n var [_m0, close, ident, attrs, content] = fm;\n //console.log(stack.length, close, ident, attrs, content);\n if (close) {\n closetop();\n } else if (ident) {\n var node = { type: ident, text: null, children: [], attrs: parseattrs(attrs), obj: null };\n stack.push(node);\n if (attrs) {\n parseattrs(attrs);\n }\n if (openfn) {\n node.obj = openfn(node);\n }\n if (attrs && attrs.endsWith('/')) closetop();\n } else if (content != null) {\n if (stack.length == 0) throw new XMLParseError(\"content without element\");\n var txt = escapeXML(content as string).trim();\n if (txt.length) stack[stack.length - 1].text = txt;\n }\n }\n if (stack.length != 1) throw new XMLParseError(\"tag not closed\");\n if (stack[0].type != '?xml') throw new XMLParseError(\"?xml needs to be first element\");\n return top;\n}\n\nexport function escapeHTML(s: string): string {\n return s.replace(/[&]/g, '&').replace(/[<]/g, '<').replace(/[>]/g, '>');\n}\n\n// lame factorization for displaying bitmaps\n// returns a > b such that a * b == x (or higher), a >= mina, b >= minb\nexport function findIntegerFactors(x: number, mina: number, minb: number, aspect: number) : {a: number, b: number} {\n let a = x;\n let b = 1;\n if (minb > 1 && minb < a) {\n a = Math.ceil(x / minb);\n b = minb;\n }\n while (a > b) {\n let a2 = a;\n let b2 = b;\n if ((a & 1) == 0) {\n b2 = b * 2;\n a2 = a / 2;\n }\n if ((a % 3) == 0) {\n b2 = b * 3;\n a2 = a / 3;\n }\n if ((a % 5) == 0) {\n b2 = b * 5;\n a2 = a / 5;\n }\n if (a2 < mina) break;\n if (a2 < b2 * aspect) break;\n a = a2;\n b = b2;\n }\n return {a, b};\n}\n\nexport class FileDataCache {\n maxSize : number = 8000000;\n size : number;\n cache : Map;\n constructor() {\n this.reset();\n }\n get(key : string) : string|Uint8Array {\n return this.cache.get(key);\n }\n put(key : string, value : string|Uint8Array) {\n this.cache.set(key, value);\n this.size += value.length;\n if (this.size > this.maxSize) {\n console.log('cache reset', this);\n this.reset();\n }\n }\n reset() {\n this.cache = new Map();\n this.size = 0;\n }\n}\n\nexport function coerceToArray(arrobj: any) : T[] {\n if (Array.isArray(arrobj)) return arrobj;\n else if (arrobj != null && typeof arrobj[Symbol.iterator] === 'function') return Array.from(arrobj);\n else if (typeof arrobj === 'object') return Array.from(Object.values(arrobj))\n else throw new Error(`Expected array or object, got \"${arrobj}\"`);\n}\n", "/**\n * The MIT License (MIT)\n *\n * Copyright (C) 2013 Sergi Mansilla\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Creates a virtually-rendered scrollable list.\n * @param {object} config\n * @constructor\n */\nexport function VirtualList(config) {\n var width = (config && config.w + 'px') || '100%';\n var height = (config && config.h + 'px') || '100%';\n var itemHeight = this.itemHeight = config.itemHeight;\n\n this.items = config.items;\n this.generatorFn = config.generatorFn;\n this.totalRows = config.totalRows || (config.items && config.items.length);\n\n var scroller = VirtualList.createScroller(itemHeight * this.totalRows);\n this.container = VirtualList.createContainer(width, height);\n this.container.appendChild(scroller);\n\n var screenItemsLen = Math.ceil(config.h / itemHeight);\n // Cache 4 times the number of items that fit in the container viewport\n this.cachedItemsLen = screenItemsLen * 3;\n this._renderChunk(this.container, 0);\n\n var self = this;\n var lastRepaintY;\n var maxBuffer = screenItemsLen * itemHeight;\n var lastScrolled = 0;\n\n // As soon as scrolling has stopped, this interval asynchronouslyremoves all\n // the nodes that are not used anymore\n this.rmNodeInterval = setInterval(function() {\n if (Date.now() - lastScrolled > 100) {\n var badNodes = document.querySelectorAll('[data-rm=\"1\"]');\n for (var i = 0, l = badNodes.length; i < l; i++) {\n try {\n self.container.removeChild(badNodes[i]);\n } catch (e) {\n //\n }\n }\n }\n }, 300);\n\n function onScroll(e) {\n var scrollTop = e.target.scrollTop; // Triggers reflow\n if (!lastRepaintY || Math.abs(scrollTop - lastRepaintY) > maxBuffer) {\n var first = Math.floor(scrollTop / itemHeight) - screenItemsLen;\n self._renderChunk(self.container, first < 0 ? 0 : first);\n lastRepaintY = scrollTop;\n }\n\n lastScrolled = Date.now();\n e.preventDefault && e.preventDefault();\n }\n\n this.container.addEventListener('scroll', onScroll);\n}\n\nVirtualList.prototype.createRow = function(i) {\n var item;\n if (this.generatorFn)\n item = this.generatorFn(i);\n else if (this.items) {\n if (typeof this.items[i] === 'string') {\n var itemText = document.createTextNode(this.items[i]);\n item = document.createElement('div');\n item.style.height = this.itemHeight + 'px';\n item.appendChild(itemText);\n } else {\n item = this.items[i];\n }\n }\n\n item.classList.add('vrow');\n item.setAttribute('data-index', ''+i);\n item.style.position = 'absolute';\n item.style.top = (i * this.itemHeight) + 'px';\n return item;\n};\n\n/**\n * Renders a particular, consecutive chunk of the total rows in the list. To\n * keep acceleration while scrolling, we mark the nodes that are candidate for\n * deletion instead of deleting them right away, which would suddenly stop the\n * acceleration. We delete them once scrolling has finished.\n *\n * @param {Node} node Parent node where we want to append the children chunk.\n * @param {Number} from Starting position, i.e. first children index.\n * @return {void}\n */\nVirtualList.prototype._renderChunk = function(node, from) {\n var finalItem = from + this.cachedItemsLen;\n if (finalItem > this.totalRows)\n finalItem = this.totalRows;\n\n // Append all the new rows in a document fragment that we will later append to\n // the parent node\n var fragment = document.createDocumentFragment();\n for (var i = from; i < finalItem; i++) {\n fragment.appendChild(this.createRow(i));\n }\n\n // Hide and mark obsolete nodes for deletion.\n for (var j = 1, l = node.childNodes.length; j < l; j++) {\n node.childNodes[j].style.display = 'none';\n node.childNodes[j].setAttribute('data-rm', '1');\n }\n node.appendChild(fragment);\n};\n\nVirtualList.createContainer = function(w, h) {\n var c = document.createElement('div');\n c.classList.add('vlist');\n c.style.width = w;\n c.style.height = h;\n c.style.overflow = 'auto';\n c.style.position = 'relative';\n c.style.padding = '0';\n c.style.border = '1px solid black';\n return c;\n};\n\nVirtualList.createScroller = function(h) {\n var scroller = document.createElement('div');\n scroller.style.opacity = '0';\n scroller.style.position = 'absolute';\n scroller.style.top = '0';\n scroller.style.left = '0';\n scroller.style.width = '1px';\n scroller.style.height = h + 'px';\n return scroller;\n};\n\nVirtualList.prototype.scrollToItem = function(index) {\n this.container.scrollTop = this.itemHeight * index;\n};\n\n", "\nimport { hex, clamp, lpad, RGBA } from \"./util\";\nimport { SourceLocation } from \"./workertypes\";\nimport { VirtualList } from \"./vlist\"\n\n// Emulator classes\n\nexport var PLATFORMS = {};\n\nvar _random_state = 1;\n\nexport function noise() {\n\tlet x = _random_state;\n\tx ^= x << 13;\n\tx ^= x >> 17;\n\tx ^= x << 5;\n\treturn (_random_state = x) & 0xff;\n}\n\nexport function getNoiseSeed() {\n return _random_state;\n}\n\nexport function setNoiseSeed(x : number) {\n _random_state = x;\n}\n\ntype KeyboardCallback = (which:number, charCode:number, flags:KeyFlags) => void;\n\nexport function __createCanvas(doc:HTMLDocument, mainElement:HTMLElement, width:number, height:number) : HTMLCanvasElement {\n var canvas = doc.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n canvas.classList.add(\"emuvideo\");\n canvas.tabIndex = -1; // Make it focusable\n mainElement.appendChild(canvas);\n return canvas;\n}\n\nexport enum KeyFlags {\n KeyDown = 1,\n Shift = 2,\n Ctrl = 4,\n Alt = 8,\n Meta = 16,\n KeyUp = 64,\n KeyPress = 128,\n}\n\n// TODO: don't use which/keyCode anymore?\n// TODO: let keycode = e.key ? e.key.charCodeAt(0) : e.keyCode;\n// TODO: let charCode = e.key ? e.key.charCodeAt(0) : e.charCode;\nexport function _setKeyboardEvents(canvas:HTMLElement, callback:KeyboardCallback) {\n canvas.onkeydown = (e) => {\n let flags = _metakeyflags(e);\n callback(e.which, e.keyCode, KeyFlags.KeyDown|flags);\n if (!flags) e.preventDefault(); // eat all keys that don't have a modifier\n };\n canvas.onkeyup = (e) => {\n callback(e.which, e.keyCode, KeyFlags.KeyUp|_metakeyflags(e));\n };\n};\n\ntype VideoCanvasOptions = {rotate?:number, overscan?:boolean, aspect?:number};\n\nexport class RasterVideo {\n\n mainElement : HTMLElement;\n width : number;\n height : number;\n options : VideoCanvasOptions;\n\n constructor(mainElement:HTMLElement, width:number, height:number, options?:VideoCanvasOptions) {\n this.mainElement = mainElement;\n this.width = width;\n this.height = height;\n this.options = options;\n }\n \n canvas : HTMLCanvasElement;\n ctx : CanvasRenderingContext2D;\n imageData : ImageData;\n datau32 : Uint32Array;\n vcanvas : JQuery;\n \n paddle_x = 255;\n paddle_y = 255;\n \n setRotate(rotate:number) {\n var canvas = this.canvas;\n if (rotate) {\n // TODO: aspect ratio?\n canvas.style.transform = \"rotate(\"+rotate+\"deg)\";\n if (canvas.width < canvas.height)\n canvas.style.paddingLeft = canvas.style.paddingRight = \"10%\";\n } else {\n canvas.style.transform = null;\n canvas.style.paddingLeft = canvas.style.paddingRight = null;\n }\n }\n\n create(doc?: HTMLDocument) {\n var canvas;\n this.canvas = canvas = __createCanvas(doc || document, this.mainElement, this.width, this.height);\n this.vcanvas = $(canvas);\n if (this.options && this.options.rotate) {\n this.setRotate(this.options.rotate);\n }\n if (this.options && this.options.overscan) {\n this.vcanvas.css('padding','0px');\n }\n if (this.options && this.options.aspect) {\n console.log(this.options);\n this.vcanvas.css('aspect-ratio', this.options.aspect+\"\");\n }\n this.ctx = canvas.getContext('2d');\n this.imageData = this.ctx.createImageData(this.width, this.height);\n this.datau32 = new Uint32Array(this.imageData.data.buffer);\n }\n\n setKeyboardEvents(callback) {\n _setKeyboardEvents(this.canvas, callback);\n }\n\n getFrameData() { return this.datau32; }\n\n getContext() { return this.ctx; }\n\n updateFrame(sx?:number, sy?:number, dx?:number, dy?:number, w?:number, h?:number) {\n if (w && h)\n this.ctx.putImageData(this.imageData, sx, sy, dx, dy, w, h);\n else\n this.ctx.putImageData(this.imageData, 0, 0);\n }\n\n clearRect(dx:number, dy:number, w:number, h:number) {\n var ctx = this.ctx;\n ctx.fillStyle = '#000000';\n ctx.fillRect(dx, dy, w, h);\n }\n\n setupMouseEvents(el? : HTMLCanvasElement) {\n if (!el) el = this.canvas;\n $(el).mousemove( (e) => {\n var pos = getMousePos(el, e);\n var new_x = Math.floor(pos.x * 255 / this.canvas.width);\n var new_y = Math.floor(pos.y * 255 / this.canvas.height);\n this.paddle_x = clamp(0, 255, new_x);\n this.paddle_y = clamp(0, 255, new_y);\n });\n };\n}\n\nexport class VectorVideo extends RasterVideo {\n\n persistenceAlpha = 0.5;\n jitter = 1.0;\n gamma = 0.8;\n sx : number;\n sy : number;\n \n create() {\n super.create();\n this.sx = this.width/1024.0;\n this.sy = this.height/1024.0;\n }\n\n clear() {\n var ctx = this.ctx;\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = this.persistenceAlpha;\n ctx.fillStyle = '#000000';\n ctx.fillRect(0, 0, this.width, this.height);\n ctx.globalAlpha = 1.0;\n ctx.globalCompositeOperation = 'lighter';\n }\n\n COLORS = [\n '#111111',\n '#1111ff',\n '#11ff11',\n '#11ffff',\n '#ff1111',\n '#ff11ff',\n '#ffff11',\n '#ffffff'\n ];\n\n drawLine(x1:number, y1:number, x2:number, y2:number, intensity:number, color:number) {\n var ctx = this.ctx;\n var sx = this.sx;\n var sy = this.sy;\n //console.log(x1,y1,x2,y2,intensity,color);\n if (intensity > 0) {\n // TODO: landscape vs portrait\n var alpha = Math.pow(intensity / 255.0, this.gamma);\n ctx.globalAlpha = alpha;\n ctx.lineWidth = 3;\n ctx.beginPath();\n // TODO: bright dots\n var jx = this.jitter * (Math.random() - 0.5);\n var jy = this.jitter * (Math.random() - 0.5);\n x1 += jx;\n x2 += jx;\n y1 += jy;\n y2 += jy;\n ctx.moveTo(x1*sx, this.height-y1*sy);\n if (x1 == x2 && y1 == y2)\n ctx.lineTo(x2*sx+1, this.height-y2*sy);\n else\n ctx.lineTo(x2*sx, this.height-y2*sy);\n ctx.strokeStyle = this.COLORS[color & 7];\n ctx.stroke();\n }\n }\n}\n\nexport class RAM {\n mem : Uint8Array;\n constructor(size:number) {\n this.mem = new Uint8Array(new ArrayBuffer(size));\n }\n}\n\nexport class EmuHalt extends Error {\n $loc : SourceLocation;\n squelchError = true;\n constructor(msg: string, loc?: SourceLocation) {\n super(msg);\n this.$loc = loc;\n Object.setPrototypeOf(this, EmuHalt.prototype);\n }\n}\n\nexport var useRequestAnimationFrame : boolean = false;\n\nexport class AnimationTimer {\n\n callback; \n running : boolean = false;\n pulsing : boolean = false;\n nextts = 0;\n nframes;\n startts; // for FPS calc\n frameRate;\n intervalMsec;\n useReqAnimFrame = useRequestAnimationFrame && typeof window.requestAnimationFrame === 'function'; // need for unit test\n \n constructor(frequencyHz:number, callback:() => void) {\n this.frameRate = frequencyHz;\n this.intervalMsec = 1000.0 / frequencyHz;\n this.callback = callback;\n }\n\n scheduleFrame(msec:number) {\n var fn = (timestamp) => {\n try {\n this.nextFrame(this.useReqAnimFrame ? timestamp : Date.now());\n } catch (e) {\n this.running = false;\n this.pulsing = false;\n throw e;\n }\n }\n if (this.useReqAnimFrame)\n window.requestAnimationFrame(fn);\n else\n setTimeout(fn, msec);\n }\n \n nextFrame(ts:number) {\n if (ts > this.nextts) {\n if (this.running) {\n this.callback();\n }\n if (this.nframes == 0)\n this.startts = ts;\n if (this.nframes++ == 300) {\n console.log(\"Avg framerate: \" + this.nframes*1000/(ts-this.startts) + \" fps\");\n }\n }\n this.nextts += this.intervalMsec;\n // frames skipped? catch up\n if ((ts - this.nextts) > 1000) {\n //console.log(ts - this.nextts, 'msec skipped');\n this.nextts = ts;\n }\n if (this.running) {\n this.scheduleFrame(this.nextts - ts);\n } else {\n this.pulsing = false;\n }\n }\n isRunning() {\n return this.running;\n }\n start() {\n if (!this.running) {\n this.running = true;\n this.nextts = 0;\n this.nframes = 0;\n if (!this.pulsing) {\n this.scheduleFrame(0);\n this.pulsing = true;\n }\n }\n }\n stop() {\n this.running = false;\n }\n}\n\n// TODO: move to util?\n\nexport function dumpRAM(ram:ArrayLike, ramofs:number, ramlen:number) : string {\n var s = \"\";\n var bpel = ram['BYTES_PER_ELEMENT'] || 1;\n var perline = Math.ceil(16 / bpel);\n var isFloat = ram instanceof Float32Array || ram instanceof Float64Array;\n // TODO: show scrollable RAM for other platforms\n for (var ofs=0; ofs;\n\nexport const Keys = {\n ANYKEY: {c: 0, n: \"?\"},\n // https://w3c.github.io/gamepad/#remapping\n // gamepad and keyboard (player 0)\n UP: {c: 38, n: \"Up\", plyr:0, button:12, yaxis:-1},\n DOWN: {c: 40, n: \"Down\", plyr:0, button:13, yaxis:1},\n LEFT: {c: 37, n: \"Left\", plyr:0, button:14, xaxis:-1},\n RIGHT: {c: 39, n: \"Right\", plyr:0, button:15, xaxis:1},\n A: {c: 32, n: \"Space\", plyr:0, button:0},\n B: {c: 16, n: \"Shift\", plyr:0, button:1},\n GP_A: {c: 88, n: \"X\", plyr:0, button:0},\n GP_B: {c: 90, n: \"Z\", plyr:0, button:1},\n GP_C: {c: 86, n: \"V\", plyr:0, button:2},\n GP_D: {c: 67, n: \"C\", plyr:0, button:3},\n SELECT: {c: 220, n: \"\\\\\", plyr:0, button:8},\n START: {c: 13, n: \"Enter\", plyr:0, button:9},\n OPTION: {c: 8, n: \"Bcksp\", plyr:0, button:10},\n // gamepad and keyboard (player 1)\n P2_UP: {c: 87, n: \"W\", plyr:1, button:12, yaxis:-1},\n P2_DOWN: {c: 83, n: \"S\", plyr:1, button:13, yaxis:1},\n P2_LEFT: {c: 65, n: \"A\", plyr:1, button:14, xaxis:-1},\n P2_RIGHT: {c: 68, n: \"D\", plyr:1, button:15, xaxis:1},\n P2_A: {c: 84, n: \"T\", plyr:1, button:0},\n P2_B: {c: 82, n: \"R\", plyr:1, button:1},\n P2_GP_A: {c: 69, n: \"E\", plyr:1, button:0},\n P2_GP_B: {c: 82, n: \"R\", plyr:1, button:1},\n P2_GP_C: {c: 84, n: \"T\", plyr:1, button:2},\n P2_GP_D: {c: 89, n: \"Y\", plyr:1, button:3},\n P2_SELECT: {c: 70, n: \"F\", plyr:1, button:8},\n P2_START: {c: 71, n: \"G\", plyr:1, button:9},\n // keyboard only\n VK_ESCAPE: {c: 27, n: \"Esc\"},\n VK_F1: {c: 112, n: \"F1\"},\n VK_F2: {c: 113, n: \"F2\"},\n VK_F3: {c: 114, n: \"F3\"},\n VK_F4: {c: 115, n: \"F4\"},\n VK_F5: {c: 116, n: \"F5\"},\n VK_F6: {c: 117, n: \"F6\"},\n VK_F7: {c: 118, n: \"F7\"},\n VK_F8: {c: 119, n: \"F8\"},\n VK_F9: {c: 120, n: \"F9\"},\n VK_F10: {c: 121, n: \"F10\"},\n VK_F11: {c: 122, n: \"F11\"},\n VK_F12: {c: 123, n: \"F12\"},\n VK_SCROLL_LOCK: {c: 145, n: \"ScrLck\"},\n VK_PAUSE: {c: 19, n: \"Pause\"},\n VK_QUOTE: {c: 222, n: \"'\"},\n VK_1: {c: 49, n: \"1\"},\n VK_2: {c: 50, n: \"2\"},\n VK_3: {c: 51, n: \"3\"},\n VK_4: {c: 52, n: \"4\"},\n VK_5: {c: 53, n: \"5\"},\n VK_6: {c: 54, n: \"6\"},\n VK_7: {c: 55, n: \"7\"},\n VK_8: {c: 56, n: \"8\"},\n VK_9: {c: 57, n: \"9\"},\n VK_0: {c: 48, n: \"0\"},\n VK_MINUS: {c: 189, n: \"-\"},\n VK_MINUS2: {c: 173, n: \"-\"},\n VK_EQUALS: {c: 187, n: \"=\"},\n VK_EQUALS2: {c: 61, n: \"=\"},\n VK_BACK_SPACE: {c: 8, n: \"Bkspc\"},\n VK_TAB: {c: 9, n: \"Tab\"},\n VK_Q: {c: 81, n: \"Q\"},\n VK_W: {c: 87, n: \"W\"},\n VK_E: {c: 69, n: \"E\"},\n VK_R: {c: 82, n: \"R\"},\n VK_T: {c: 84, n: \"T\"},\n VK_Y: {c: 89, n: \"Y\"},\n VK_U: {c: 85, n: \"U\"},\n VK_I: {c: 73, n: \"I\"},\n VK_O: {c: 79, n: \"O\"},\n VK_P: {c: 80, n: \"P\"},\n VK_ACUTE: {c: 219, n: \"\u00B4\"},\n VK_OPEN_BRACKET: {c: 219, n: \"[\"},\n VK_CLOSE_BRACKET: {c: 221, n: \"]\"},\n VK_CAPS_LOCK: {c: 20, n: \"CpsLck\"},\n VK_A: {c: 65, n: \"A\"},\n VK_S: {c: 83, n: \"S\"},\n VK_D: {c: 68, n: \"D\"},\n VK_F: {c: 70, n: \"F\"},\n VK_G: {c: 71, n: \"G\"},\n VK_H: {c: 72, n: \"H\"},\n VK_J: {c: 74, n: \"J\"},\n VK_K: {c: 75, n: \"K\"},\n VK_L: {c: 76, n: \"L\"},\n VK_CEDILLA: {c: 186, n: \"\u00C7\"},\n VK_TILDE: {c: 222, n: \"~\"},\n VK_ENTER: {c: 13, n: \"Enter\"},\n VK_SHIFT: {c: 16, n: \"Shift\"},\n VK_BACK_SLASH: {c: 220, n: \"\\\\\"},\n VK_Z: {c: 90, n: \"Z\"},\n VK_X: {c: 88, n: \"X\"},\n VK_C: {c: 67, n: \"C\"},\n VK_V: {c: 86, n: \"V\"},\n VK_B: {c: 66, n: \"B\"},\n VK_N: {c: 78, n: \"N\"},\n VK_M: {c: 77, n: \"M\"},\n VK_COMMA: {c: 188, n: \"] =\"},\n VK_PERIOD: {c: 190, n: \".\"},\n VK_SEMICOLON: {c: 59, n: \";\"},\n VK_SLASH: {c: 191, n: \"/\"},\n VK_CONTROL: {c: 17, n: \"Ctrl\"},\n VK_ALT: {c: 18, n: \"Alt\"},\n VK_COMMAND: {c: 224, n: \"Cmd\"},\n VK_SPACE: {c: 32, n: \"Space\"},\n VK_INSERT: {c: 45, n: \"Ins\"},\n VK_DELETE: {c: 46, n: \"Del\"},\n VK_HOME: {c: 36, n: \"Home\"},\n VK_END: {c: 35, n: \"End\"},\n VK_PAGE_UP: {c: 33, n: \"PgUp\"},\n VK_PAGE_DOWN: {c: 34, n: \"PgDown\"},\n VK_UP: {c: 38, n: \"Up\"},\n VK_DOWN: {c: 40, n: \"Down\"},\n VK_LEFT: {c: 37, n: \"Left\"},\n VK_RIGHT: {c: 39, n: \"Right\"},\n VK_NUM_LOCK: {c: 144, n: \"Num\"},\n VK_DIVIDE: {c: 111, n: \"Num /\"},\n VK_MULTIPLY: {c: 106, n: \"Num *\"},\n VK_SUBTRACT: {c: 109, n: \"Num -\"},\n VK_ADD: {c: 107, n: \"Num +\"},\n VK_DECIMAL: {c: 194, n: \"Num .\"},\n VK_NUMPAD0: {c: 96, n: \"Num 0\"},\n VK_NUMPAD1: {c: 97, n: \"Num 1\"},\n VK_NUMPAD2: {c: 98, n: \"Num 2\"},\n VK_NUMPAD3: {c: 99, n: \"Num 3\"},\n VK_NUMPAD4: {c: 100, n: \"Num 4\"},\n VK_NUMPAD5: {c: 101, n: \"Num 5\"},\n VK_NUMPAD6: {c: 102, n: \"Num 6\"},\n VK_NUMPAD7: {c: 103, n: \"Num 7\"},\n VK_NUMPAD8: {c: 104, n: \"Num 8\"},\n VK_NUMPAD9: {c: 105, n: \"Num 9\"},\n VK_NUMPAD_CENTER: {c: 12, n: \"Num Cntr\"}\n};\n\nfunction _metakeyflags(e) {\n return (e.shiftKey?KeyFlags.Shift:0) |\n (e.ctrlKey?KeyFlags.Ctrl:0) | \n (e.altKey?KeyFlags.Alt:0) | \n (e.metaKey?KeyFlags.Meta:0);\n}\n\ntype KeyMapFunction = (o:KeyMapEntry, key:number, code:number, flags:number) => void;\n\nexport function newKeyboardHandler(switches:number[]|Uint8Array, map:KeyCodeMap, func?:KeyMapFunction, alwaysfunc?:boolean) {\n return (key:number,code:number,flags:number) => {\n if (!map) {\n func(null, key, code, flags);\n return;\n }\n var o : KeyMapEntry = map[key];\n if (!o) o = map[0];\n if (func && (o || alwaysfunc)) {\n func(o, key, code, flags);\n }\n if (o) {\n //console.log(key,code,flags,o);\n var mask = o.mask;\n if (mask < 0) { // negative mask == active low\n mask = -mask;\n if (flags & (KeyFlags.KeyDown | KeyFlags.KeyUp))\n flags ^= KeyFlags.KeyDown | KeyFlags.KeyUp;\n }\n if (flags & KeyFlags.KeyDown) {\n switches[o.index] |= mask;\n } else if (flags & KeyFlags.KeyUp) {\n switches[o.index] &= ~mask;\n }\n }\n };\n}\n\nexport function setKeyboardFromMap(video:RasterVideo, switches:number[]|Uint8Array, map:KeyCodeMap, func?:KeyMapFunction, alwaysfunc?:boolean) {\n var handler = newKeyboardHandler(switches, map, func, alwaysfunc);\n video.setKeyboardEvents(handler);\n return new ControllerPoller(handler);\n}\n\nexport function makeKeycodeMap(table : [KeyDef,number,number][]) : KeyCodeMap {\n var map = new Map();\n for (var i=0; i void) {\n this.handler = handler;\n window.addEventListener(\"gamepadconnected\", (event) => {\n console.log(\"Gamepad connected:\", event);\n this.reset();\n });\n window.addEventListener(\"gamepaddisconnected\", (event) => {\n console.log(\"Gamepad disconnected:\", event);\n this.reset();\n });\n }\n reset() {\n this.active = typeof navigator.getGamepads === 'function';\n if (this.active) {\n let numGamepads = navigator.getGamepads().length;\n this.state = new Array(numGamepads);\n this.lastState = new Array(numGamepads);\n for (var i=0; i len) {\n throw Error(\"Data too long, \" + data.length + \" > \" + len);\n }\n var r = new RAM(len);\n if (padstart)\n r.mem.set(data, len-data.length);\n else\n r.mem.set(data);\n return r.mem;\n}\n\ntype AddressReadWriteFn = ((a:number) => number) | ((a:number,v:number) => void);\ntype AddressDecoderEntry = [number, number, number, AddressReadWriteFn];\ntype AddressDecoderOptions = {gmask?:number};\n\n// TODO: better performance, check values\nexport function AddressDecoder(table : AddressDecoderEntry[], options?:AddressDecoderOptions) {\n var self = this;\n function makeFunction() {\n var s = \"\";\n if (options && options.gmask) {\n s += \"a&=\" + options.gmask + \";\";\n }\n for (var i=0; i=\" + start + \" && a<=\"+end + \"){\";\n if (mask) s += \"a&=\"+mask+\";\";\n s += \"return this.__fn\"+i+\"(a,v)&0xff;}\\n\";\n }\n s += \"return 0;\"; // TODO: noise()?\n return new Function('a', 'v', s);\n }\n return makeFunction().bind(self);\n}\n\nexport function newAddressDecoder(table : AddressDecoderEntry[], options?:AddressDecoderOptions) : (a:number,v?:number) => number {\n return new (AddressDecoder as any)(table, options);\n}\n\n\n// https://stackoverflow.com/questions/17130395/real-mouse-position-in-canvas\nexport function getMousePos(canvas : HTMLCanvasElement, evt) : {x:number,y:number} {\n var rect = canvas.getBoundingClientRect(), // abs. size of element\n scaleX = canvas.width / rect.width, // relationship bitmap vs. element for X\n scaleY = canvas.height / rect.height; // relationship bitmap vs. element for Y\n\n return {\n x: (evt.clientX - rect.left) * scaleX, // scale mouse coordinates after they have\n y: (evt.clientY - rect.top) * scaleY // been adjusted to be relative to element\n }\n}\n\n///\n\n// TODO: https://stackoverflow.com/questions/10463518/converting-em-to-px-in-javascript-and-getting-default-font-size\nexport function getVisibleEditorLineHeight() : number{\n return $(\"#booksMenuButton\").first().height();\n}\n\nexport interface VirtualTextLine {\n text : string;\n clas? : string;\n}\n\nexport class VirtualTextScroller {\n memorylist;\n maindiv : HTMLElement;\n getLineAt : (row:number) => VirtualTextLine;\n\n constructor(parent : HTMLElement) {\n var div = document.createElement('div');\n div.setAttribute(\"class\", \"memdump\");\n parent.appendChild(div);\n this.maindiv = div;\n }\n \n create(workspace : HTMLElement, maxRowCount : number, fn : (row:number) => VirtualTextLine) {\n this.getLineAt = fn;\n this.memorylist = new VirtualList({\n w: $(workspace).width(),\n h: $(workspace).height(),\n itemHeight: getVisibleEditorLineHeight(),\n totalRows: maxRowCount, // TODO?\n generatorFn: (row : number) => {\n var line = fn(row);\n var linediv = document.createElement(\"div\");\n linediv.appendChild(document.createTextNode(line.text));\n if (line.clas != null) linediv.className = line.clas;\n return linediv;\n }\n });\n $(this.maindiv).append(this.memorylist.container);\n }\n\n // TODO: refactor with elsewhere\n refresh() {\n if (this.memorylist) {\n $(this.maindiv).find('[data-index]').each( (i,e) => {\n var div = e;\n var row = parseInt(div.getAttribute('data-index'));\n var oldtext = div.innerText;\n var line = this.getLineAt(row);\n var newtext = line.text;\n if (oldtext != newtext) {\n div.innerText = newtext;\n if (line.clas != null && !div.classList.contains(line.clas)) {\n var oldclasses = Array.from(div.classList);\n oldclasses.forEach((c) => div.classList.remove(c));\n div.classList.add('vrow');\n div.classList.add(line.clas);\n }\n }\n });\n }\n }\n}\n\n// https://forums.atariage.com/topic/107853-need-the-256-colors/page/2/\nexport function gtia_ntsc_to_rgb(val: number) {\n const gamma = 0.9;\n const bright = 1.1;\n const color = 60;\n let cr = (val >> 4) & 15;\n let lm = val & 15;\n let crlv = cr ? color : 0;\n if (cr) lm += 1;\n let phase = ((cr - 1) * 25 - 25) * (2 * Math.PI / 360);\n let y = 256 * bright * Math.pow(lm / 16, gamma);\n let i = crlv * Math.cos(phase);\n let q = crlv * Math.sin(phase);\n var r = y + 0.956 * i + 0.621 * q;\n var g = y - 0.272 * i - 0.647 * q;\n var b = y - 1.107 * i + 1.704 * q;\n return RGBA(clamp(0,255,r), clamp(0,255,g), clamp(0,255,b));\n}\n"], + "mappings": "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", "names": [] } diff --git a/gen/chunk-LBWPHUUP.js b/gen/chunk-B7KJX6SS.js similarity index 75% rename from gen/chunk-LBWPHUUP.js rename to gen/chunk-B7KJX6SS.js index 99a0f71f..09723819 100644 --- a/gen/chunk-LBWPHUUP.js +++ b/gen/chunk-B7KJX6SS.js @@ -1,2 +1,2 @@ -import{J as b,K as w}from"./chunk-YL2YTMD7.js";import{b as C}from"./chunk-RQFURXHW.js";var y=C((d,v)=>{(function(l,e){typeof define=="function"&&define.amd?define([],e):typeof d!="undefined"?e():(e(),l.FileSaver={})})(d,function(){"use strict";function l(t,r){return typeof r=="undefined"?r={autoBom:!1}:typeof r!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),r={autoBom:!r}),r.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)?new Blob(["\uFEFF",t],{type:t.type}):t}function e(t,r,c){var a=new XMLHttpRequest;a.open("GET",t),a.responseType="blob",a.onload=function(){u(a.response,r,c)},a.onerror=function(){console.error("could not download file")},a.send()}function n(t){var r=new XMLHttpRequest;r.open("HEAD",t,!1);try{r.send()}catch(c){}return 200<=r.status&&299>=r.status}function i(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(c){var r=document.createEvent("MouseEvents");r.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(r)}}var o=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof global=="object"&&global.global===global?global:void 0,m=o.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),u=o.saveAs||(typeof window!="object"||window!==o?function(){}:"download"in HTMLAnchorElement.prototype&&!m?function(t,r,c){var a=o.URL||o.webkitURL,s=document.createElement("a");r=r||t.name||"download",s.download=r,s.rel="noopener",typeof t=="string"?(s.href=t,s.origin===location.origin?i(s):n(s.href)?e(t,r,c):i(s,s.target="_blank")):(s.href=a.createObjectURL(t),setTimeout(function(){a.revokeObjectURL(s.href)},4e4),setTimeout(function(){i(s)},0))}:"msSaveOrOpenBlob"in navigator?function(t,r,c){if(r=r||t.name||"download",typeof t!="string")navigator.msSaveOrOpenBlob(l(t,c),r);else if(n(t))e(t,r,c);else{var a=document.createElement("a");a.href=t,a.target="_blank",setTimeout(function(){i(a)})}}:function(t,r,c,a){if(a=a||open("","_blank"),a&&(a.document.title=a.document.body.innerText="downloading..."),typeof t=="string")return e(t,r,c);var s=t.type==="application/octet-stream",g=/constructor/i.test(o.HTMLElement)||o.safari,S=/CriOS\/[\d]+/.test(navigator.userAgent);if((S||s&&g||m)&&typeof FileReader!="undefined"){var f=new FileReader;f.onloadend=function(){var p=f.result;p=S?p:p.replace(/^data:[^;]*;/,"data:attachment/file;"),a?a.location.href=p:location=p,a=null},f.readAsDataURL(t)}else{var k=o.URL||o.webkitURL,h=k.createObjectURL(t);a?a.location=h:location.href=h,a=null,setTimeout(function(){k.revokeObjectURL(h)},4e4)}});o.saveAs=u.saveAs=u,typeof v!="undefined"&&(v.exports=u)})});var E=class{constructor(e){this.checkpointInterval=10;this.maxCheckpoints=300;this.reset(),this.platform=e}reset(){this.checkpoints=[],this.framerecs=[],this.frameCount=0,this.lastSeekFrame=0,this.lastSeekStep=0,this.lastStepCount=0,this.callbackStateChanged&&this.callbackStateChanged()}frameRequested(){var e={controls:this.platform.saveControlsState(),seed:b()},n=!1;return this.lastSeekFramethis.maxCheckpoints&&(this.checkpoints.shift(),this.framerecs=this.framerecs.slice(this.checkpointInterval),this.lastSeekFrame-=this.checkpointInterval,this.frameCount-=this.checkpointInterval,this.callbackStateChanged&&this.callbackStateChanged())}getStateAtOrBefore(e){if(e<=0&&this.checkpoints.length>0)return{frame:0,state:this.checkpoints[0]};var n=Math.floor(e/this.checkpointInterval),i=n0&&this.platform.advanceFrameClock&&(n=this.platform.advanceFrameClock(null,n)),this.lastSeekFrame=e,this.lastSeekStep=n,this.lastStepCount=m,e}else return-1}loadControls(e){this.platform.loadControlsState&&this.platform.loadControlsState(this.framerecs[e].controls),w(this.framerecs[e].seed)}getLastCheckpoint(){return this.checkpoints.length&&this.checkpoints[this.checkpoints.length-1]}};function R(l){switch(l){case"apple2":return import("./apple2-YBSXME7B.js");case"arm32":return import("./arm32-TREQBG5P.js");case"astrocade":return import("./astrocade-HTRRXIK3.js");case"atari7800":return import("./atari7800-TFVORQV6.js");case"atari8":return import("./atari8-YJPSBKKM.js");case"basic":return import("./basic-35NRKUG4.js");case"c64":return import("./c64-BMMLIOW3.js");case"coleco":return import("./coleco-UYR442DB.js");case"cpc":return import("./cpc-HUFG6J63.js");case"devel":return import("./devel-UKB7TGVA.js");case"galaxian":return import("./galaxian-FCF3DRM7.js");case"kim1":return import("./kim1-EPKUB26X.js");case"markdown":return import("./markdown-27KGUVXA.js");case"msx":return import("./msx-5N5BLDFV.js");case"mw8080bw":return import("./mw8080bw-W2SMVMRK.js");case"nes":return import("./nes-6NOIMK6Q.js");case"pce":return import("./pce-Z3J65ZWJ.js");case"sms":return import("./sms-5STOQI37.js");case"sound_konami":return import("./sound_konami-CQ4LTCUO.js");case"sound_williams":return import("./sound_williams-6QV2GA6Z.js");case"vcs":return import("./vcs-YW2QIB2C.js");case"vector":return import("./vector-IGLTS555.js");case"vectrex":return import("./vectrex-JJII7IWB.js");case"verilog":return import("./verilog-JSCFDLAX.js");case"vic20":return import("./vic20-EAD2ZP6L.js");case"vicdual":return import("./vicdual-OH44ND2U.js");case"williams":return import("./williams-QZ76FE77.js");case"x86":return import("./x86-7OPY5QGY.js");case"zmachine":return import("./zmachine-AHTXFQQ6.js");case"zx":return import("./zx-3WTSFWBG.js");default:throw new Error(`Platform not recognized: '${l}'`)}}export{E as a,R as b,y as c}; -//# sourceMappingURL=chunk-LBWPHUUP.js.map +import{J as b,K as w}from"./chunk-7LTJUW24.js";import{b as C}from"./chunk-RQFURXHW.js";var y=C((d,v)=>{(function(l,e){typeof define=="function"&&define.amd?define([],e):typeof d!="undefined"?e():(e(),l.FileSaver={})})(d,function(){"use strict";function l(t,r){return typeof r=="undefined"?r={autoBom:!1}:typeof r!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),r={autoBom:!r}),r.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)?new Blob(["\uFEFF",t],{type:t.type}):t}function e(t,r,c){var a=new XMLHttpRequest;a.open("GET",t),a.responseType="blob",a.onload=function(){u(a.response,r,c)},a.onerror=function(){console.error("could not download file")},a.send()}function n(t){var r=new XMLHttpRequest;r.open("HEAD",t,!1);try{r.send()}catch(c){}return 200<=r.status&&299>=r.status}function i(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(c){var r=document.createEvent("MouseEvents");r.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(r)}}var o=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof global=="object"&&global.global===global?global:void 0,m=o.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),u=o.saveAs||(typeof window!="object"||window!==o?function(){}:"download"in HTMLAnchorElement.prototype&&!m?function(t,r,c){var a=o.URL||o.webkitURL,s=document.createElement("a");r=r||t.name||"download",s.download=r,s.rel="noopener",typeof t=="string"?(s.href=t,s.origin===location.origin?i(s):n(s.href)?e(t,r,c):i(s,s.target="_blank")):(s.href=a.createObjectURL(t),setTimeout(function(){a.revokeObjectURL(s.href)},4e4),setTimeout(function(){i(s)},0))}:"msSaveOrOpenBlob"in navigator?function(t,r,c){if(r=r||t.name||"download",typeof t!="string")navigator.msSaveOrOpenBlob(l(t,c),r);else if(n(t))e(t,r,c);else{var a=document.createElement("a");a.href=t,a.target="_blank",setTimeout(function(){i(a)})}}:function(t,r,c,a){if(a=a||open("","_blank"),a&&(a.document.title=a.document.body.innerText="downloading..."),typeof t=="string")return e(t,r,c);var s=t.type==="application/octet-stream",g=/constructor/i.test(o.HTMLElement)||o.safari,S=/CriOS\/[\d]+/.test(navigator.userAgent);if((S||s&&g||m)&&typeof FileReader!="undefined"){var f=new FileReader;f.onloadend=function(){var p=f.result;p=S?p:p.replace(/^data:[^;]*;/,"data:attachment/file;"),a?a.location.href=p:location=p,a=null},f.readAsDataURL(t)}else{var k=o.URL||o.webkitURL,h=k.createObjectURL(t);a?a.location=h:location.href=h,a=null,setTimeout(function(){k.revokeObjectURL(h)},4e4)}});o.saveAs=u.saveAs=u,typeof v!="undefined"&&(v.exports=u)})});var E=class{constructor(e){this.checkpointInterval=10;this.maxCheckpoints=300;this.reset(),this.platform=e}reset(){this.checkpoints=[],this.framerecs=[],this.frameCount=0,this.lastSeekFrame=0,this.lastSeekStep=0,this.lastStepCount=0,this.callbackStateChanged&&this.callbackStateChanged()}frameRequested(){var e={controls:this.platform.saveControlsState(),seed:b()},n=!1;return this.lastSeekFramethis.maxCheckpoints&&(this.checkpoints.shift(),this.framerecs=this.framerecs.slice(this.checkpointInterval),this.lastSeekFrame-=this.checkpointInterval,this.frameCount-=this.checkpointInterval,this.callbackStateChanged&&this.callbackStateChanged())}getStateAtOrBefore(e){if(e<=0&&this.checkpoints.length>0)return{frame:0,state:this.checkpoints[0]};var n=Math.floor(e/this.checkpointInterval),i=n0&&this.platform.advanceFrameClock&&(n=this.platform.advanceFrameClock(null,n)),this.lastSeekFrame=e,this.lastSeekStep=n,this.lastStepCount=m,e}else return-1}loadControls(e){this.platform.loadControlsState&&this.platform.loadControlsState(this.framerecs[e].controls),w(this.framerecs[e].seed)}getLastCheckpoint(){return this.checkpoints.length&&this.checkpoints[this.checkpoints.length-1]}};function R(l){switch(l){case"apple2":return import("./apple2-4HPKEG3T.js");case"arm32":return import("./arm32-MYWZWAMY.js");case"astrocade":return import("./astrocade-7HVAI6PI.js");case"atari7800":return import("./atari7800-ZVTVBKVB.js");case"atari8":return import("./atari8-N6OQBLEH.js");case"basic":return import("./basic-EQ2C5OAK.js");case"c64":return import("./c64-XMVYPCBN.js");case"coleco":return import("./coleco-CROZWJ5F.js");case"cpc":return import("./cpc-VZB2HO2D.js");case"devel":return import("./devel-VTCHQ4MQ.js");case"galaxian":return import("./galaxian-EYLJL3HP.js");case"kim1":return import("./kim1-ZBZSQHCU.js");case"markdown":return import("./markdown-FZXTHYHU.js");case"msx":return import("./msx-G6BB3MVB.js");case"mw8080bw":return import("./mw8080bw-ATQLVPC6.js");case"nes":return import("./nes-VS4RBX22.js");case"pce":return import("./pce-ZVBEX7JS.js");case"sms":return import("./sms-LFK5BR4F.js");case"sound_konami":return import("./sound_konami-HJFN7EXV.js");case"sound_williams":return import("./sound_williams-JLDL6GDY.js");case"vcs":return import("./vcs-T4SCSR7L.js");case"vector":return import("./vector-UX2ALG4N.js");case"vectrex":return import("./vectrex-NLW2ZKXJ.js");case"verilog":return import("./verilog-5G37OFNR.js");case"vic20":return import("./vic20-EVH4SB7N.js");case"vicdual":return import("./vicdual-JEJ4ASX4.js");case"williams":return import("./williams-VBNO4XTV.js");case"x86":return import("./x86-H5YB2LFW.js");case"zmachine":return import("./zmachine-QT2YTAFV.js");case"zx":return import("./zx-EHYYSW76.js");default:throw new Error(`Platform not recognized: '${l}'`)}}export{E as a,R as b,y as c}; +//# sourceMappingURL=chunk-B7KJX6SS.js.map diff --git a/gen/chunk-LBWPHUUP.js.map b/gen/chunk-B7KJX6SS.js.map similarity index 100% rename from gen/chunk-LBWPHUUP.js.map rename to gen/chunk-B7KJX6SS.js.map diff --git a/gen/chunk-FULWX6T7.js b/gen/chunk-WCTN4OWB.js similarity index 98% rename from gen/chunk-FULWX6T7.js rename to gen/chunk-WCTN4OWB.js index 4364e11d..af2231b0 100644 --- a/gen/chunk-FULWX6T7.js +++ b/gen/chunk-WCTN4OWB.js @@ -1,11 +1,11 @@ -import{a as ln,b as nl,c as al}from"./chunk-SDBJC2RS.js";import{a as Is}from"./chunk-XMPGMPQ4.js";import{a as Ms,b as Ns,c as sl}from"./chunk-LBWPHUUP.js";import{D as da,J as ha,l as te,u as Fs,v as Rs}from"./chunk-GKVIY6GD.js";import{$ as Ls,D as Rt,E as ua,F as Fr,G as As,H as ca,Q as fa,S as Ds,_ as on,a as Ft,aa as ci,b as ui,d as _t,e as la,f as ft,g as Le,j as Ts,l as tn,m as rn,n as nn,o as vr,p as Cs,s as an,v as ks,w as Ps,x as sn,y as vt,z as Lr}from"./chunk-YL2YTMD7.js";import{a as li,b as _s,c as oa}from"./chunk-RQFURXHW.js";var ma=_s((Os,pa)=>{(function(l){if(typeof Os=="object"&&typeof pa!="undefined")pa.exports=l();else if(typeof define=="function"&&define.amd)define([],l);else{var t;typeof window!="undefined"?t=window:typeof global!="undefined"?t=global:typeof self!="undefined"?t=self:t=this,t.localforage=l()}})(function(){var l,t,r;return function a(u,d,m){function b(W,fe){if(!d[W]){if(!u[W]){var z=typeof li=="function"&&li;if(!fe&&z)return z(W,!0);if(y)return y(W,!0);var H=new Error("Cannot find module '"+W+"'");throw H.code="MODULE_NOT_FOUND",H}var V=d[W]={exports:{}};u[W][0].call(V.exports,function(de){var K=u[W][1][de];return b(K||de)},V,V.exports,a,u,d,m)}return d[W].exports}for(var y=typeof li=="function"&&li,L=0;L=43)}}).catch(function(){return!1})}function _e(p){return typeof Ce=="boolean"?z.resolve(Ce):oe(p).then(function(S){return Ce=S,Ce})}function ze(p){var S=be[p.name],v={};v.promise=new z(function(C,k){v.resolve=C,v.reject=k}),S.deferredOperations.push(v),S.dbReady?S.dbReady=S.dbReady.then(function(){return v.promise}):S.dbReady=v.promise}function Me(p){var S=be[p.name],v=S.deferredOperations.pop();if(v)return v.resolve(),v.promise}function nt(p,S){var v=be[p.name],C=v.deferredOperations.pop();if(C)return C.reject(S),C.promise}function Ke(p,S){return new z(function(v,C){if(be[p.name]=be[p.name]||ar(),p.db)if(S)ze(p),p.db.close();else return v(p.db);var k=[p.name];S&&k.push(p.version);var _=L.open.apply(L,k);S&&(_.onupgradeneeded=function(N){var B=_.result;try{B.createObjectStore(p.storeName),N.oldVersion<=1&&B.createObjectStore(xe)}catch(q){if(q.name==="ConstraintError")console.warn('The database "'+p.name+'" has been upgraded from version '+N.oldVersion+" to version "+N.newVersion+', but the storage "'+p.storeName+'" already exists.');else throw q}}),_.onerror=function(N){N.preventDefault(),C(_.error)},_.onsuccess=function(){var N=_.result;N.onversionchange=function(B){B.target.close()},v(N),Me(p)}})}function bt(p){return Ke(p,!1)}function nr(p){return Ke(p,!0)}function Sr(p,S){if(!p.db)return!0;var v=!p.db.objectStoreNames.contains(p.storeName),C=p.versionp.db.version;if(C&&(p.version!==S&&console.warn('The database "'+p.name+`" can't be downgraded from version `+p.db.version+" to version "+p.version+"."),p.version=p.db.version),k||v){if(v){var _=p.db.version+1;_>p.version&&(p.version=_)}return!0}return!1}function Nr(p){return new z(function(S,v){var C=new FileReader;C.onerror=v,C.onloadend=function(k){var _=btoa(k.target.result||"");S({__local_forage_encoded_blob:!0,data:_,type:p.type})},C.readAsBinaryString(p)})}function Qt(p){var S=ae(atob(p.data));return fe([S],{type:p.type})}function Or(p){return p&&p.__local_forage_encoded_blob}function yt(p){var S=this,v=S._initReady().then(function(){var C=be[S._dbInfo.name];if(C&&C.dbReady)return C.dbReady});return V(v,p,p),v}function Ln(p){ze(p);for(var S=be[p.name],v=S.forages,C=0;C0&&(!p.db||_.name==="InvalidStateError"||_.name==="NotFoundError"))return z.resolve().then(function(){if(!p.db||_.name==="NotFoundError"&&!p.db.objectStoreNames.contains(p.storeName)&&p.version<=p.db.version)return p.db&&(p.version=p.db.version+1),nr(p)}).then(function(){return Ln(p).then(function(){Ze(p,S,v,C-1)})}).catch(v);v(_)}}function ar(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function Di(p){var S=this,v={db:null};if(p)for(var C in p)v[C]=p[C];var k=be[v.name];k||(k=ar(),be[v.name]=k),k.forages.push(S),S._initReady||(S._initReady=S.ready,S.ready=yt);var _=[];function N(){return z.resolve()}for(var B=0;B>4,Y[k++]=(N&15)<<4|B>>2,Y[k++]=(B&3)<<6|q&63;return G}function et(p){var S=new Uint8Array(p),v="",C;for(C=0;C>2],v+=$e[(S[C]&3)<<4|S[C+1]>>4],v+=$e[(S[C+1]&15)<<2|S[C+2]>>6],v+=$e[S[C+2]&63];return S.length%3==2?v=v.substring(0,v.length-1)+"=":S.length%3==1&&(v=v.substring(0,v.length-2)+"=="),v}function tt(p,S){var v="";if(p&&(v=Ur.call(p)),p&&(v==="[object ArrayBuffer]"||p.buffer&&Ur.call(p.buffer)==="[object ArrayBuffer]")){var C,k=Tr;p instanceof ArrayBuffer?(C=p,k+=kr):(C=p.buffer,v==="[object Int8Array]"?k+=wt:v==="[object Uint8Array]"?k+=Lt:v==="[object Uint8ClampedArray]"?k+=Wt:v==="[object Int16Array]"?k+=Fi:v==="[object Uint16Array]"?k+=Wr:v==="[object Int32Array]"?k+=lr:v==="[object Uint32Array]"?k+=Br:v==="[object Float32Array]"?k+=Ri:v==="[object Float64Array]"?k+=Bt:S(new Error("Failed to get type for BinaryArray"))),S(k+et(C))}else if(v==="[object Blob]"){var _=new FileReader;_.onload=function(){var N=Nn+p.type+"~"+et(this.result);S(Tr+$t+N)},_.readAsArrayBuffer(p)}else try{S(JSON.stringify(p))}catch(N){console.error("Couldn't convert value into a JSON string: ",p),S(null,N)}}function Hr(p){if(p.substring(0,Cr)!==Tr)return JSON.parse(p);var S=p.substring(Jt),v=p.substring(Cr,Jt),C;if(v===$t&&Li.test(S)){var k=S.match(Li);C=k[1],S=S.substring(k[0].length)}var _=jr(S);switch(v){case kr:return _;case $t:return fe([_],{type:C});case wt:return new Int8Array(_);case Lt:return new Uint8Array(_);case Wt:return new Uint8ClampedArray(_);case Fi:return new Int16Array(_);case Wr:return new Uint16Array(_);case lr:return new Int32Array(_);case Br:return new Uint32Array(_);case Ri:return new Float32Array(_);case Bt:return new Float64Array(_);default:throw new Error("Unkown type: "+v)}}var zr={serialize:tt,deserialize:Hr,stringToBuffer:jr,bufferToString:et};function Vr(p,S,v,C){p.executeSql("CREATE TABLE IF NOT EXISTS "+S.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],v,C)}function Ii(p){var S=this,v={db:null};if(p)for(var C in p)v[C]=typeof p[C]!="string"?p[C].toString():p[C];var k=new z(function(_,N){try{v.db=openDatabase(v.name,String(v.version),v.description,v.size)}catch(B){return N(B)}v.db.transaction(function(B){Vr(B,v,function(){S._dbInfo=v,_()},function(q,G){N(G)})},N)});return v.serializer=zr,k}function at(p,S,v,C,k,_){p.executeSql(v,C,k,function(N,B){B.code===B.SYNTAX_ERR?N.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[S.storeName],function(q,G){G.rows.length?_(q,B):Vr(q,S,function(){q.executeSql(v,C,k,_)},_)},_):_(N,B)},_)}function Kt(p,S){var v=this;p=de(p);var C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(B){at(B,N,"SELECT * FROM "+N.storeName+" WHERE key = ? LIMIT 1",[p],function(q,G){var Y=G.rows.length?G.rows.item(0).value:null;Y&&(Y=N.serializer.deserialize(Y)),k(Y)},function(q,G){_(G)})})}).catch(_)});return H(C,S),C}function On(p,S){var v=this,C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(B){at(B,N,"SELECT * FROM "+N.storeName,[],function(q,G){for(var Y=G.rows,Z=Y.length,ye=0;ye0){N(Mi.apply(k,[p,q,v,C-1]));return}B(ye)}})})}).catch(B)});return H(_,v),_}function qr(p,S,v){return Mi.apply(this,[p,S,v,1])}function Pr(p,S){var v=this;p=de(p);var C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(B){at(B,N,"DELETE FROM "+N.storeName+" WHERE key = ?",[p],function(){k()},function(q,G){_(G)})})}).catch(_)});return H(C,S),C}function $n(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){at(N,_,"DELETE FROM "+_.storeName,[],function(){C()},function(B,q){k(q)})})}).catch(k)});return H(v,p),v}function Wn(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){at(N,_,"SELECT COUNT(key) as c FROM "+_.storeName,[],function(B,q){var G=q.rows.item(0).c;C(G)},function(B,q){k(q)})})}).catch(k)});return H(v,p),v}function Bn(p,S){var v=this,C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(B){at(B,N,"SELECT key FROM "+N.storeName+" WHERE id = ? LIMIT 1",[p+1],function(q,G){var Y=G.rows.length?G.rows.item(0).key:null;k(Y)},function(q,G){_(G)})})}).catch(_)});return H(C,S),C}function Ni(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){at(N,_,"SELECT key FROM "+_.storeName,[],function(B,q){for(var G=[],Y=0;Y '__WebKitDatabaseInfoTable__'",[],function(k,_){for(var N=[],B=0;B<_.rows.length;B++)N.push(_.rows.item(B).name);S({db:p,storeNames:N})},function(k,_){v(_)})},function(C){v(C)})})}function jn(p,S){S=K.apply(this,arguments);var v=this.config();p=typeof p!="function"&&p||{},p.name||(p.name=p.name||v.name,p.storeName=p.storeName||v.storeName);var C=this,k;return p.name?k=new z(function(_){var N;p.name===v.name?N=C._dbInfo.db:N=openDatabase(p.name,"","",0),p.storeName?_({db:N,storeNames:[p.storeName]}):_(Un(N))}).then(function(_){return new z(function(N,B){_.db.transaction(function(q){function G(ke){return new z(function(Pe,We){q.executeSql("DROP TABLE IF EXISTS "+ke,[],function(){Pe()},function(Fe,st){We(st)})})}for(var Y=[],Z=0,ye=_.storeNames.length;Z0}function Yr(p){var S=this,v={};if(p)for(var C in p)v[C]=p[C];return v.keyPrefix=Ut(p,S._defaultConfig),Gr()?(S._dbInfo=v,v.serializer=zr,z.resolve()):z.reject()}function Ar(p){var S=this,v=S.ready().then(function(){for(var C=S._dbInfo.keyPrefix,k=localStorage.length-1;k>=0;k--){var _=localStorage.key(k);_.indexOf(C)===0&&localStorage.removeItem(_)}});return H(v,p),v}function Wi(p,S){var v=this;p=de(p);var C=v.ready().then(function(){var k=v._dbInfo,_=localStorage.getItem(k.keyPrefix+p);return _&&(_=k.serializer.deserialize(_)),_});return H(C,S),C}function zn(p,S){var v=this,C=v.ready().then(function(){for(var k=v._dbInfo,_=k.keyPrefix,N=_.length,B=localStorage.length,q=1,G=0;G=0;N--){var B=localStorage.key(N);B.indexOf(_)===0&&localStorage.removeItem(B)}}):k=z.reject("Invalid arguments"),H(k,S),k}var zi={_driver:"localStorageWrapper",_initStorage:Yr,_support:Hn(),iterate:zn,getItem:Wi,setItem:ji,removeItem:Ui,clear:Ar,length:ur,key:Bi,keys:Vn,dropInstance:Hi},qn=function(S,v){return S===v||typeof S=="number"&&typeof v=="number"&&isNaN(S)&&isNaN(v)},Xr=function(S,v){for(var C=S.length,k=0;k{(function(l,t){"use strict";typeof cn=="object"&&typeof cn.exports=="object"?cn.exports=l.document?t(l,!0):function(r){if(!r.document)throw new Error("jQuery requires a window with a document");return t(r)}:t(l)})(typeof window!="undefined"?window:Us,function(l,t){"use strict";var r=[],a=Object.getPrototypeOf,u=r.slice,d=r.flat?function(e){return r.flat.call(e)}:function(e){return r.concat.apply([],e)},m=r.push,b=r.indexOf,y={},L=y.toString,W=y.hasOwnProperty,fe=W.toString,z=fe.call(Object),H={},V=function(i){return typeof i=="function"&&typeof i.nodeType!="number"&&typeof i.item!="function"},de=function(i){return i!=null&&i===i.window},K=l.document,xe={type:!0,src:!0,nonce:!0,noModule:!0};function Ce(e,i,n){n=n||K;var s,c,f=n.createElement("script");if(f.text=e,i)for(s in xe)c=i[s]||i.getAttribute&&i.getAttribute(s),c&&f.setAttribute(s,c);n.head.appendChild(f).parentNode.removeChild(f)}function be(e){return e==null?e+"":typeof e=="object"||typeof e=="function"?y[L.call(e)]||"object":typeof e}var Se="3.6.3",o=function(e,i){return new o.fn.init(e,i)};o.fn=o.prototype={jquery:Se,constructor:o,length:0,toArray:function(){return u.call(this)},get:function(e){return e==null?u.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var i=o.merge(this.constructor(),e);return i.prevObject=this,i},each:function(e){return o.each(this,e)},map:function(e){return this.pushStack(o.map(this,function(i,n){return e.call(i,n,i)}))},slice:function(){return this.pushStack(u.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(o.grep(this,function(e,i){return(i+1)%2}))},odd:function(){return this.pushStack(o.grep(this,function(e,i){return i%2}))},eq:function(e){var i=this.length,n=+e+(e<0?i:0);return this.pushStack(n>=0&&n0&&i-1 in e}var ae=function(e){var i,n,s,c,f,h,E,x,D,R,U,F,I,ie,ve,re,qe,Ve,ht,De="sizzle"+1*new Date,me=e.document,ut=0,Te=0,Be=Ji(),ni=Ji(),Yi=Ji(),pt=Ji(),dr=function(g,w){return g===w&&(U=!0),0},hr={}.hasOwnProperty,ct=[],er=ct.pop,Et=ct.push,tr=ct.push,gs=ct.slice,pr=function(g,w){for(var T=0,M=g.length;T+~]|"+Ae+")"+Ae+"*"),qo=new RegExp(Ae+"|>"),Go=new RegExp(ea),Yo=new RegExp("^"+gr+"$"),Qi={ID:new RegExp("^#("+gr+")"),CLASS:new RegExp("^\\.("+gr+")"),TAG:new RegExp("^("+gr+"|[*])"),ATTR:new RegExp("^"+ms),PSEUDO:new RegExp("^"+ea),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+Ae+"*(even|odd|(([+-]|)(\\d*)n|)"+Ae+"*(?:([+-]|)"+Ae+"*(\\d+)|))"+Ae+"*\\)|)","i"),bool:new RegExp("^(?:"+Zn+")$","i"),needsContext:new RegExp("^"+Ae+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+Ae+"*((?:-\\d)?\\d*)"+Ae+"*\\)|)(?=[^-]|$)","i")},Xo=/HTML$/i,Qo=/^(?:input|select|textarea|button)$/i,Jo=/^h\d$/i,ai=/^[^{]+\{\s*\[native \w/,Ko=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ta=/[+~]/,zt=new RegExp("\\\\[\\da-fA-F]{1,6}"+Ae+"?|\\\\([^\\r\\n\\f])","g"),Vt=function(g,w){var T="0x"+g.slice(1)-65536;return w||(T<0?String.fromCharCode(T+65536):String.fromCharCode(T>>10|55296,T&1023|56320))},bs=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ys=function(g,w){return w?g==="\0"?"\uFFFD":g.slice(0,-1)+"\\"+g.charCodeAt(g.length-1).toString(16)+" ":"\\"+g},xs=function(){F()},Zo=Zi(function(g){return g.disabled===!0&&g.nodeName.toLowerCase()==="fieldset"},{dir:"parentNode",next:"legend"});try{tr.apply(ct=gs.call(me.childNodes),me.childNodes),ct[me.childNodes.length].nodeType}catch(g){tr={apply:ct.length?function(w,T){Et.apply(w,gs.call(T))}:function(w,T){for(var M=w.length,P=0;w[M++]=T[P++];);w.length=M-1}}}function Re(g,w,T,M){var P,O,j,Q,J,ue,se,he=w&&w.ownerDocument,we=w?w.nodeType:9;if(T=T||[],typeof g!="string"||!g||we!==1&&we!==9&&we!==11)return T;if(!M&&(F(w),w=w||I,ve)){if(we!==11&&(J=Ko.exec(g)))if(P=J[1]){if(we===9)if(j=w.getElementById(P)){if(j.id===P)return T.push(j),T}else return T;else if(he&&(j=he.getElementById(P))&&ht(w,j)&&j.id===P)return T.push(j),T}else{if(J[2])return tr.apply(T,w.getElementsByTagName(g)),T;if((P=J[3])&&n.getElementsByClassName&&w.getElementsByClassName)return tr.apply(T,w.getElementsByClassName(P)),T}if(n.qsa&&!pt[g+" "]&&(!re||!re.test(g))&&(we!==1||w.nodeName.toLowerCase()!=="object")){if(se=g,he=w,we===1&&(qo.test(g)||vs.test(g))){for(he=ta.test(g)&&ia(w.parentNode)||w,(he!==w||!n.scope)&&((Q=w.getAttribute("id"))?Q=Q.replace(bs,ys):w.setAttribute("id",Q=De)),ue=h(g),O=ue.length;O--;)ue[O]=(Q?"#"+Q:":scope")+" "+Ki(ue[O]);se=ue.join(",")}try{if(n.cssSupportsSelector&&!CSS.supports("selector(:is("+se+"))"))throw new Error;return tr.apply(T,he.querySelectorAll(se)),T}catch(Ie){pt(g,!0)}finally{Q===De&&w.removeAttribute("id")}}}return x(g.replace(Xi,"$1"),w,T,M)}function Ji(){var g=[];function w(T,M){return g.push(T+" ")>s.cacheLength&&delete w[g.shift()],w[T+" "]=M}return w}function kt(g){return g[De]=!0,g}function St(g){var w=I.createElement("fieldset");try{return!!g(w)}catch(T){return!1}finally{w.parentNode&&w.parentNode.removeChild(w),w=null}}function ra(g,w){for(var T=g.split("|"),M=T.length;M--;)s.attrHandle[T[M]]=w}function ws(g,w){var T=w&&g,M=T&&g.nodeType===1&&w.nodeType===1&&g.sourceIndex-w.sourceIndex;if(M)return M;if(T){for(;T=T.nextSibling;)if(T===w)return-1}return g?1:-1}function el(g){return function(w){var T=w.nodeName.toLowerCase();return T==="input"&&w.type===g}}function tl(g){return function(w){var T=w.nodeName.toLowerCase();return(T==="input"||T==="button")&&w.type===g}}function Es(g){return function(w){return"form"in w?w.parentNode&&w.disabled===!1?"label"in w?"label"in w.parentNode?w.parentNode.disabled===g:w.disabled===g:w.isDisabled===g||w.isDisabled!==!g&&Zo(w)===g:w.disabled===g:"label"in w?w.disabled===g:!1}}function mr(g){return kt(function(w){return w=+w,kt(function(T,M){for(var P,O=g([],T.length,w),j=O.length;j--;)T[P=O[j]]&&(T[P]=!(M[P]=T[P]))})})}function ia(g){return g&&typeof g.getElementsByTagName!="undefined"&&g}n=Re.support={},f=Re.isXML=function(g){var w=g&&g.namespaceURI,T=g&&(g.ownerDocument||g).documentElement;return!Xo.test(w||T&&T.nodeName||"HTML")},F=Re.setDocument=function(g){var w,T,M=g?g.ownerDocument||g:me;return M==I||M.nodeType!==9||!M.documentElement||(I=M,ie=I.documentElement,ve=!f(I),me!=I&&(T=I.defaultView)&&T.top!==T&&(T.addEventListener?T.addEventListener("unload",xs,!1):T.attachEvent&&T.attachEvent("onunload",xs)),n.scope=St(function(P){return ie.appendChild(P).appendChild(I.createElement("div")),typeof P.querySelectorAll!="undefined"&&!P.querySelectorAll(":scope fieldset div").length}),n.cssSupportsSelector=St(function(){return CSS.supports("selector(*)")&&I.querySelectorAll(":is(:jqfake)")&&!CSS.supports("selector(:is(*,:jqfake))")}),n.attributes=St(function(P){return P.className="i",!P.getAttribute("className")}),n.getElementsByTagName=St(function(P){return P.appendChild(I.createComment("")),!P.getElementsByTagName("*").length}),n.getElementsByClassName=ai.test(I.getElementsByClassName),n.getById=St(function(P){return ie.appendChild(P).id=De,!I.getElementsByName||!I.getElementsByName(De).length}),n.getById?(s.filter.ID=function(P){var O=P.replace(zt,Vt);return function(j){return j.getAttribute("id")===O}},s.find.ID=function(P,O){if(typeof O.getElementById!="undefined"&&ve){var j=O.getElementById(P);return j?[j]:[]}}):(s.filter.ID=function(P){var O=P.replace(zt,Vt);return function(j){var Q=typeof j.getAttributeNode!="undefined"&&j.getAttributeNode("id");return Q&&Q.value===O}},s.find.ID=function(P,O){if(typeof O.getElementById!="undefined"&&ve){var j,Q,J,ue=O.getElementById(P);if(ue){if(j=ue.getAttributeNode("id"),j&&j.value===P)return[ue];for(J=O.getElementsByName(P),Q=0;ue=J[Q++];)if(j=ue.getAttributeNode("id"),j&&j.value===P)return[ue]}return[]}}),s.find.TAG=n.getElementsByTagName?function(P,O){if(typeof O.getElementsByTagName!="undefined")return O.getElementsByTagName(P);if(n.qsa)return O.querySelectorAll(P)}:function(P,O){var j,Q=[],J=0,ue=O.getElementsByTagName(P);if(P==="*"){for(;j=ue[J++];)j.nodeType===1&&Q.push(j);return Q}return ue},s.find.CLASS=n.getElementsByClassName&&function(P,O){if(typeof O.getElementsByClassName!="undefined"&&ve)return O.getElementsByClassName(P)},qe=[],re=[],(n.qsa=ai.test(I.querySelectorAll))&&(St(function(P){var O;ie.appendChild(P).innerHTML="",P.querySelectorAll("[msallowcapture^='']").length&&re.push("[*^$]="+Ae+`*(?:''|"")`),P.querySelectorAll("[selected]").length||re.push("\\["+Ae+"*(?:value|"+Zn+")"),P.querySelectorAll("[id~="+De+"-]").length||re.push("~="),O=I.createElement("input"),O.setAttribute("name",""),P.appendChild(O),P.querySelectorAll("[name='']").length||re.push("\\["+Ae+"*name"+Ae+"*="+Ae+`*(?:''|"")`),P.querySelectorAll(":checked").length||re.push(":checked"),P.querySelectorAll("a#"+De+"+*").length||re.push(".#.+[+~]"),P.querySelectorAll("\\\f"),re.push("[\\r\\n\\f]")}),St(function(P){P.innerHTML="";var O=I.createElement("input");O.setAttribute("type","hidden"),P.appendChild(O).setAttribute("name","D"),P.querySelectorAll("[name=d]").length&&re.push("name"+Ae+"*[*^$|!~]?="),P.querySelectorAll(":enabled").length!==2&&re.push(":enabled",":disabled"),ie.appendChild(P).disabled=!0,P.querySelectorAll(":disabled").length!==2&&re.push(":enabled",":disabled"),P.querySelectorAll("*,:x"),re.push(",.*:")})),(n.matchesSelector=ai.test(Ve=ie.matches||ie.webkitMatchesSelector||ie.mozMatchesSelector||ie.oMatchesSelector||ie.msMatchesSelector))&&St(function(P){n.disconnectedMatch=Ve.call(P,"*"),Ve.call(P,"[s!='']:x"),qe.push("!=",ea)}),n.cssSupportsSelector||re.push(":has"),re=re.length&&new RegExp(re.join("|")),qe=qe.length&&new RegExp(qe.join("|")),w=ai.test(ie.compareDocumentPosition),ht=w||ai.test(ie.contains)?function(P,O){var j=P.nodeType===9&&P.documentElement||P,Q=O&&O.parentNode;return P===Q||!!(Q&&Q.nodeType===1&&(j.contains?j.contains(Q):P.compareDocumentPosition&&P.compareDocumentPosition(Q)&16))}:function(P,O){if(O){for(;O=O.parentNode;)if(O===P)return!0}return!1},dr=w?function(P,O){if(P===O)return U=!0,0;var j=!P.compareDocumentPosition-!O.compareDocumentPosition;return j||(j=(P.ownerDocument||P)==(O.ownerDocument||O)?P.compareDocumentPosition(O):1,j&1||!n.sortDetached&&O.compareDocumentPosition(P)===j?P==I||P.ownerDocument==me&&ht(me,P)?-1:O==I||O.ownerDocument==me&&ht(me,O)?1:R?pr(R,P)-pr(R,O):0:j&4?-1:1)}:function(P,O){if(P===O)return U=!0,0;var j,Q=0,J=P.parentNode,ue=O.parentNode,se=[P],he=[O];if(!J||!ue)return P==I?-1:O==I?1:J?-1:ue?1:R?pr(R,P)-pr(R,O):0;if(J===ue)return ws(P,O);for(j=P;j=j.parentNode;)se.unshift(j);for(j=O;j=j.parentNode;)he.unshift(j);for(;se[Q]===he[Q];)Q++;return Q?ws(se[Q],he[Q]):se[Q]==me?-1:he[Q]==me?1:0}),I},Re.matches=function(g,w){return Re(g,null,null,w)},Re.matchesSelector=function(g,w){if(F(g),n.matchesSelector&&ve&&!pt[w+" "]&&(!qe||!qe.test(w))&&(!re||!re.test(w)))try{var T=Ve.call(g,w);if(T||n.disconnectedMatch||g.document&&g.document.nodeType!==11)return T}catch(M){pt(w,!0)}return Re(w,I,null,[g]).length>0},Re.contains=function(g,w){return(g.ownerDocument||g)!=I&&F(g),ht(g,w)},Re.attr=function(g,w){(g.ownerDocument||g)!=I&&F(g);var T=s.attrHandle[w.toLowerCase()],M=T&&hr.call(s.attrHandle,w.toLowerCase())?T(g,w,!ve):void 0;return M!==void 0?M:n.attributes||!ve?g.getAttribute(w):(M=g.getAttributeNode(w))&&M.specified?M.value:null},Re.escape=function(g){return(g+"").replace(bs,ys)},Re.error=function(g){throw new Error("Syntax error, unrecognized expression: "+g)},Re.uniqueSort=function(g){var w,T=[],M=0,P=0;if(U=!n.detectDuplicates,R=!n.sortStable&&g.slice(0),g.sort(dr),U){for(;w=g[P++];)w===g[P]&&(M=T.push(P));for(;M--;)g.splice(T[M],1)}return R=null,g},c=Re.getText=function(g){var w,T="",M=0,P=g.nodeType;if(P){if(P===1||P===9||P===11){if(typeof g.textContent=="string")return g.textContent;for(g=g.firstChild;g;g=g.nextSibling)T+=c(g)}else if(P===3||P===4)return g.nodeValue}else for(;w=g[M++];)T+=c(w);return T},s=Re.selectors={cacheLength:50,createPseudo:kt,match:Qi,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(g){return g[1]=g[1].replace(zt,Vt),g[3]=(g[3]||g[4]||g[5]||"").replace(zt,Vt),g[2]==="~="&&(g[3]=" "+g[3]+" "),g.slice(0,4)},CHILD:function(g){return g[1]=g[1].toLowerCase(),g[1].slice(0,3)==="nth"?(g[3]||Re.error(g[0]),g[4]=+(g[4]?g[5]+(g[6]||1):2*(g[3]==="even"||g[3]==="odd")),g[5]=+(g[7]+g[8]||g[3]==="odd")):g[3]&&Re.error(g[0]),g},PSEUDO:function(g){var w,T=!g[6]&&g[2];return Qi.CHILD.test(g[0])?null:(g[3]?g[2]=g[4]||g[5]||"":T&&Go.test(T)&&(w=h(T,!0))&&(w=T.indexOf(")",T.length-w)-T.length)&&(g[0]=g[0].slice(0,w),g[2]=T.slice(0,w)),g.slice(0,3))}},filter:{TAG:function(g){var w=g.replace(zt,Vt).toLowerCase();return g==="*"?function(){return!0}:function(T){return T.nodeName&&T.nodeName.toLowerCase()===w}},CLASS:function(g){var w=Be[g+" "];return w||(w=new RegExp("(^|"+Ae+")"+g+"("+Ae+"|$)"))&&Be(g,function(T){return w.test(typeof T.className=="string"&&T.className||typeof T.getAttribute!="undefined"&&T.getAttribute("class")||"")})},ATTR:function(g,w,T){return function(M){var P=Re.attr(M,g);return P==null?w==="!=":w?(P+="",w==="="?P===T:w==="!="?P!==T:w==="^="?T&&P.indexOf(T)===0:w==="*="?T&&P.indexOf(T)>-1:w==="$="?T&&P.slice(-T.length)===T:w==="~="?(" "+P.replace(zo," ")+" ").indexOf(T)>-1:w==="|="?P===T||P.slice(0,T.length+1)===T+"-":!1):!0}},CHILD:function(g,w,T,M,P){var O=g.slice(0,3)!=="nth",j=g.slice(-4)!=="last",Q=w==="of-type";return M===1&&P===0?function(J){return!!J.parentNode}:function(J,ue,se){var he,we,Ie,ce,Ge,rt,gt=O!==j?"nextSibling":"previousSibling",Ne=J.parentNode,si=Q&&J.nodeName.toLowerCase(),oi=!se&&!Q,mt=!1;if(Ne){if(O){for(;gt;){for(ce=J;ce=ce[gt];)if(Q?ce.nodeName.toLowerCase()===si:ce.nodeType===1)return!1;rt=gt=g==="only"&&!rt&&"nextSibling"}return!0}if(rt=[j?Ne.firstChild:Ne.lastChild],j&&oi){for(ce=Ne,Ie=ce[De]||(ce[De]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),he=we[g]||[],Ge=he[0]===ut&&he[1],mt=Ge&&he[2],ce=Ge&&Ne.childNodes[Ge];ce=++Ge&&ce&&ce[gt]||(mt=Ge=0)||rt.pop();)if(ce.nodeType===1&&++mt&&ce===J){we[g]=[ut,Ge,mt];break}}else if(oi&&(ce=J,Ie=ce[De]||(ce[De]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),he=we[g]||[],Ge=he[0]===ut&&he[1],mt=Ge),mt===!1)for(;(ce=++Ge&&ce&&ce[gt]||(mt=Ge=0)||rt.pop())&&!((Q?ce.nodeName.toLowerCase()===si:ce.nodeType===1)&&++mt&&(oi&&(Ie=ce[De]||(ce[De]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),we[g]=[ut,mt]),ce===J)););return mt-=P,mt===M||mt%M==0&&mt/M>=0}}},PSEUDO:function(g,w){var T,M=s.pseudos[g]||s.setFilters[g.toLowerCase()]||Re.error("unsupported pseudo: "+g);return M[De]?M(w):M.length>1?(T=[g,g,"",w],s.setFilters.hasOwnProperty(g.toLowerCase())?kt(function(P,O){for(var j,Q=M(P,w),J=Q.length;J--;)j=pr(P,Q[J]),P[j]=!(O[j]=Q[J])}):function(P){return M(P,0,T)}):M}},pseudos:{not:kt(function(g){var w=[],T=[],M=E(g.replace(Xi,"$1"));return M[De]?kt(function(P,O,j,Q){for(var J,ue=M(P,null,Q,[]),se=P.length;se--;)(J=ue[se])&&(P[se]=!(O[se]=J))}):function(P,O,j){return w[0]=P,M(w,null,j,T),w[0]=null,!T.pop()}}),has:kt(function(g){return function(w){return Re(g,w).length>0}}),contains:kt(function(g){return g=g.replace(zt,Vt),function(w){return(w.textContent||c(w)).indexOf(g)>-1}}),lang:kt(function(g){return Yo.test(g||"")||Re.error("unsupported lang: "+g),g=g.replace(zt,Vt).toLowerCase(),function(w){var T;do if(T=ve?w.lang:w.getAttribute("xml:lang")||w.getAttribute("lang"))return T=T.toLowerCase(),T===g||T.indexOf(g+"-")===0;while((w=w.parentNode)&&w.nodeType===1);return!1}}),target:function(g){var w=e.location&&e.location.hash;return w&&w.slice(1)===g.id},root:function(g){return g===ie},focus:function(g){return g===I.activeElement&&(!I.hasFocus||I.hasFocus())&&!!(g.type||g.href||~g.tabIndex)},enabled:Es(!1),disabled:Es(!0),checked:function(g){var w=g.nodeName.toLowerCase();return w==="input"&&!!g.checked||w==="option"&&!!g.selected},selected:function(g){return g.parentNode&&g.parentNode.selectedIndex,g.selected===!0},empty:function(g){for(g=g.firstChild;g;g=g.nextSibling)if(g.nodeType<6)return!1;return!0},parent:function(g){return!s.pseudos.empty(g)},header:function(g){return Jo.test(g.nodeName)},input:function(g){return Qo.test(g.nodeName)},button:function(g){var w=g.nodeName.toLowerCase();return w==="input"&&g.type==="button"||w==="button"},text:function(g){var w;return g.nodeName.toLowerCase()==="input"&&g.type==="text"&&((w=g.getAttribute("type"))==null||w.toLowerCase()==="text")},first:mr(function(){return[0]}),last:mr(function(g,w){return[w-1]}),eq:mr(function(g,w,T){return[T<0?T+w:T]}),even:mr(function(g,w){for(var T=0;Tw?w:T;--M>=0;)g.push(M);return g}),gt:mr(function(g,w,T){for(var M=T<0?T+w:T;++M1?function(w,T,M){for(var P=g.length;P--;)if(!g[P](w,T,M))return!1;return!0}:g[0]}function rl(g,w,T){for(var M=0,P=w.length;M-1&&(j[se]=!(Q[se]=we))}}else Ne=en(Ne===Q?Ne.splice(Ge,Ne.length):Ne),P?P(null,Q,Ne,ue):tr.apply(Q,Ne)})}function sa(g){for(var w,T,M,P=g.length,O=s.relative[g[0].type],j=O||s.relative[" "],Q=O?1:0,J=Zi(function(he){return he===w},j,!0),ue=Zi(function(he){return pr(w,he)>-1},j,!0),se=[function(he,we,Ie){var ce=!O&&(Ie||we!==D)||((w=we).nodeType?J(he,we,Ie):ue(he,we,Ie));return w=null,ce}];Q1&&na(se),Q>1&&Ki(g.slice(0,Q-1).concat({value:g[Q-2].type===" "?"*":""})).replace(Xi,"$1"),T,Q0,M=g.length>0,P=function(O,j,Q,J,ue){var se,he,we,Ie=0,ce="0",Ge=O&&[],rt=[],gt=D,Ne=O||M&&s.find.TAG("*",ue),si=ut+=gt==null?1:Math.random()||.1,oi=Ne.length;for(ue&&(D=j==I||j||ue);ce!==oi&&(se=Ne[ce])!=null;ce++){if(M&&se){for(he=0,!j&&se.ownerDocument!=I&&(F(se),Q=!ve);we=g[he++];)if(we(se,j||I,Q)){J.push(se);break}ue&&(ut=si)}T&&((se=!we&&se)&&Ie--,O&&Ge.push(se))}if(Ie+=ce,T&&ce!==Ie){for(he=0;we=w[he++];)we(Ge,rt,j,Q);if(O){if(Ie>0)for(;ce--;)Ge[ce]||rt[ce]||(rt[ce]=er.call(J));rt=en(rt)}tr.apply(J,rt),ue&&!O&&rt.length>0&&Ie+w.length>1&&Re.uniqueSort(J)}return ue&&(ut=si,D=gt),Ge};return T?kt(P):P}return E=Re.compile=function(g,w){var T,M=[],P=[],O=Yi[g+" "];if(!O){for(w||(w=h(g)),T=w.length;T--;)O=sa(w[T]),O[De]?M.push(O):P.push(O);O=Yi(g,il(P,M)),O.selector=g}return O},x=Re.select=function(g,w,T,M){var P,O,j,Q,J,ue=typeof g=="function"&&g,se=!M&&h(g=ue.selector||g);if(T=T||[],se.length===1){if(O=se[0]=se[0].slice(0),O.length>2&&(j=O[0]).type==="ID"&&w.nodeType===9&&ve&&s.relative[O[1].type]){if(w=(s.find.ID(j.matches[0].replace(zt,Vt),w)||[])[0],w)ue&&(w=w.parentNode);else return T;g=g.slice(O.shift().value.length)}for(P=Qi.needsContext.test(g)?0:O.length;P--&&(j=O[P],!s.relative[Q=j.type]);)if((J=s.find[Q])&&(M=J(j.matches[0].replace(zt,Vt),ta.test(O[0].type)&&ia(w.parentNode)||w))){if(O.splice(P,1),g=M.length&&Ki(O),!g)return tr.apply(T,M),T;break}}return(ue||E(g,se))(M,w,!ve,T,!w||ta.test(g)&&ia(w.parentNode)||w),T},n.sortStable=De.split("").sort(dr).join("")===De,n.detectDuplicates=!!U,F(),n.sortDetached=St(function(g){return g.compareDocumentPosition(I.createElement("fieldset"))&1}),St(function(g){return g.innerHTML="",g.firstChild.getAttribute("href")==="#"})||ra("type|href|height|width",function(g,w,T){if(!T)return g.getAttribute(w,w.toLowerCase()==="type"?1:2)}),(!n.attributes||!St(function(g){return g.innerHTML="",g.firstChild.setAttribute("value",""),g.firstChild.getAttribute("value")===""}))&&ra("value",function(g,w,T){if(!T&&g.nodeName.toLowerCase()==="input")return g.defaultValue}),St(function(g){return g.getAttribute("disabled")==null})||ra(Zn,function(g,w,T){var M;if(!T)return g[w]===!0?w.toLowerCase():(M=g.getAttributeNode(w))&&M.specified?M.value:null}),Re}(l);o.find=ae,o.expr=ae.selectors,o.expr[":"]=o.expr.pseudos,o.uniqueSort=o.unique=ae.uniqueSort,o.text=ae.getText,o.isXMLDoc=ae.isXML,o.contains=ae.contains,o.escapeSelector=ae.escape;var oe=function(e,i,n){for(var s=[],c=n!==void 0;(e=e[i])&&e.nodeType!==9;)if(e.nodeType===1){if(c&&o(e).is(n))break;s.push(e)}return s},_e=function(e,i){for(var n=[];e;e=e.nextSibling)e.nodeType===1&&e!==i&&n.push(e);return n},ze=o.expr.match.needsContext;function Me(e,i){return e.nodeName&&e.nodeName.toLowerCase()===i.toLowerCase()}var nt=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ke(e,i,n){return V(i)?o.grep(e,function(s,c){return!!i.call(s,c,s)!==n}):i.nodeType?o.grep(e,function(s){return s===i!==n}):typeof i!="string"?o.grep(e,function(s){return b.call(i,s)>-1!==n}):o.filter(i,e,n)}o.filter=function(e,i,n){var s=i[0];return n&&(e=":not("+e+")"),i.length===1&&s.nodeType===1?o.find.matchesSelector(s,e)?[s]:[]:o.find.matches(e,o.grep(i,function(c){return c.nodeType===1}))},o.fn.extend({find:function(e){var i,n,s=this.length,c=this;if(typeof e!="string")return this.pushStack(o(e).filter(function(){for(i=0;i1?o.uniqueSort(n):n},filter:function(e){return this.pushStack(Ke(this,e||[],!1))},not:function(e){return this.pushStack(Ke(this,e||[],!0))},is:function(e){return!!Ke(this,typeof e=="string"&&ze.test(e)?o(e):e||[],!1).length}});var bt,nr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Sr=o.fn.init=function(e,i,n){var s,c;if(!e)return this;if(n=n||bt,typeof e=="string")if(e[0]==="<"&&e[e.length-1]===">"&&e.length>=3?s=[null,e,null]:s=nr.exec(e),s&&(s[1]||!i))if(s[1]){if(i=i instanceof o?i[0]:i,o.merge(this,o.parseHTML(s[1],i&&i.nodeType?i.ownerDocument||i:K,!0)),nt.test(s[1])&&o.isPlainObject(i))for(s in i)V(this[s])?this[s](i[s]):this.attr(s,i[s]);return this}else return c=K.getElementById(s[2]),c&&(this[0]=c,this.length=1),this;else return!i||i.jquery?(i||n).find(e):this.constructor(i).find(e);else{if(e.nodeType)return this[0]=e,this.length=1,this;if(V(e))return n.ready!==void 0?n.ready(e):e(o)}return o.makeArray(e,this)};Sr.prototype=o.fn,bt=o(K);var Nr=/^(?:parents|prev(?:Until|All))/,Qt={children:!0,contents:!0,next:!0,prev:!0};o.fn.extend({has:function(e){var i=o(e,this),n=i.length;return this.filter(function(){for(var s=0;s-1:n.nodeType===1&&o.find.matchesSelector(n,e))){f.push(n);break}}return this.pushStack(f.length>1?o.uniqueSort(f):f)},index:function(e){return e?typeof e=="string"?b.call(o(e),this[0]):b.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,i){return this.pushStack(o.uniqueSort(o.merge(this.get(),o(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function Or(e,i){for(;(e=e[i])&&e.nodeType!==1;);return e}o.each({parent:function(e){var i=e.parentNode;return i&&i.nodeType!==11?i:null},parents:function(e){return oe(e,"parentNode")},parentsUntil:function(e,i,n){return oe(e,"parentNode",n)},next:function(e){return Or(e,"nextSibling")},prev:function(e){return Or(e,"previousSibling")},nextAll:function(e){return oe(e,"nextSibling")},prevAll:function(e){return oe(e,"previousSibling")},nextUntil:function(e,i,n){return oe(e,"nextSibling",n)},prevUntil:function(e,i,n){return oe(e,"previousSibling",n)},siblings:function(e){return _e((e.parentNode||{}).firstChild,e)},children:function(e){return _e(e.firstChild)},contents:function(e){return e.contentDocument!=null&&a(e.contentDocument)?e.contentDocument:(Me(e,"template")&&(e=e.content||e),o.merge([],e.childNodes))}},function(e,i){o.fn[e]=function(n,s){var c=o.map(this,i,n);return e.slice(-5)!=="Until"&&(s=n),s&&typeof s=="string"&&(c=o.filter(s,c)),this.length>1&&(Qt[e]||o.uniqueSort(c),Nr.test(e)&&c.reverse()),this.pushStack(c)}});var yt=/[^\x20\t\r\n\f]+/g;function Ln(e){var i={};return o.each(e.match(yt)||[],function(n,s){i[s]=!0}),i}o.Callbacks=function(e){e=typeof e=="string"?Ln(e):o.extend({},e);var i,n,s,c,f=[],h=[],E=-1,x=function(){for(c=c||e.once,s=i=!0;h.length;E=-1)for(n=h.shift();++E-1;)f.splice(F,1),F<=E&&E--}),this},has:function(R){return R?o.inArray(R,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return c=h=[],f=n="",this},disabled:function(){return!f},lock:function(){return c=h=[],!n&&!i&&(f=n=""),this},locked:function(){return!!c},fireWith:function(R,U){return c||(U=U||[],U=[R,U.slice?U.slice():U],h.push(U),i||x()),this},fire:function(){return D.fireWith(this,arguments),this},fired:function(){return!!s}};return D};function Ze(e){return e}function ar(e){throw e}function Di(e,i,n,s){var c;try{e&&V(c=e.promise)?c.call(e).done(i).fail(n):e&&V(c=e.then)?c.call(e,i,n):i.apply(void 0,[e].slice(s))}catch(f){n.apply(void 0,[f])}}o.extend({Deferred:function(e){var i=[["notify","progress",o.Callbacks("memory"),o.Callbacks("memory"),2],["resolve","done",o.Callbacks("once memory"),o.Callbacks("once memory"),0,"resolved"],["reject","fail",o.Callbacks("once memory"),o.Callbacks("once memory"),1,"rejected"]],n="pending",s={state:function(){return n},always:function(){return c.done(arguments).fail(arguments),this},catch:function(f){return s.then(null,f)},pipe:function(){var f=arguments;return o.Deferred(function(h){o.each(i,function(E,x){var D=V(f[x[4]])&&f[x[4]];c[x[1]](function(){var R=D&&D.apply(this,arguments);R&&V(R.promise)?R.promise().progress(h.notify).done(h.resolve).fail(h.reject):h[x[0]+"With"](this,D?[R]:arguments)})}),f=null}).promise()},then:function(f,h,E){var x=0;function D(R,U,F,I){return function(){var ie=this,ve=arguments,re=function(){var Ve,ht;if(!(R=x&&(F!==ar&&(ie=void 0,ve=[Ve]),U.rejectWith(ie,ve))}};R?qe():(o.Deferred.getStackHook&&(qe.stackTrace=o.Deferred.getStackHook()),l.setTimeout(qe))}}return o.Deferred(function(R){i[0][3].add(D(0,R,V(E)?E:Ze,R.notifyWith)),i[1][3].add(D(0,R,V(f)?f:Ze)),i[2][3].add(D(0,R,V(h)?h:ar))}).promise()},promise:function(f){return f!=null?o.extend(f,s):s}},c={};return o.each(i,function(f,h){var E=h[2],x=h[5];s[h[1]]=E.add,x&&E.add(function(){n=x},i[3-f][2].disable,i[3-f][3].disable,i[0][2].lock,i[0][3].lock),E.add(h[3].fire),c[h[0]]=function(){return c[h[0]+"With"](this===c?void 0:this,arguments),this},c[h[0]+"With"]=E.fireWith}),s.promise(c),e&&e.call(c,c),c},when:function(e){var i=arguments.length,n=i,s=Array(n),c=u.call(arguments),f=o.Deferred(),h=function(E){return function(x){s[E]=this,c[E]=arguments.length>1?u.call(arguments):x,--i||f.resolveWith(s,c)}};if(i<=1&&(Di(e,f.done(h(n)).resolve,f.reject,!i),f.state()==="pending"||V(c[n]&&c[n].then)))return f.then();for(;n--;)Di(c[n],h(n),f.reject);return f.promise()}});var Fn=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;o.Deferred.exceptionHook=function(e,i){l.console&&l.console.warn&&e&&Fn.test(e.name)&&l.console.warn("jQuery.Deferred exception: "+e.message,e.stack,i)},o.readyException=function(e){l.setTimeout(function(){throw e})};var $r=o.Deferred();o.fn.ready=function(e){return $r.then(e).catch(function(i){o.readyException(i)}),this},o.extend({isReady:!1,readyWait:1,ready:function(e){(e===!0?--o.readyWait:o.isReady)||(o.isReady=!0,!(e!==!0&&--o.readyWait>0)&&$r.resolveWith(K,[o]))}}),o.ready.then=$r.then;function _r(){K.removeEventListener("DOMContentLoaded",_r),l.removeEventListener("load",_r),o.ready()}K.readyState==="complete"||K.readyState!=="loading"&&!K.documentElement.doScroll?l.setTimeout(o.ready):(K.addEventListener("DOMContentLoaded",_r),l.addEventListener("load",_r));var Ct=function(e,i,n,s,c,f,h){var E=0,x=e.length,D=n==null;if(be(n)==="object"){c=!0;for(E in n)Ct(e,i,E,n[E],!0,f,h)}else if(s!==void 0&&(c=!0,V(s)||(h=!0),D&&(h?(i.call(e,s),i=null):(D=i,i=function(R,U,F){return D.call(o(R),F)})),i))for(;E1,null,!0)},removeData:function(e){return this.each(function(){$e.remove(this,e)})}}),o.extend({queue:function(e,i,n){var s;if(e)return i=(i||"fx")+"queue",s=le.get(e,i),n&&(!s||Array.isArray(n)?s=le.access(e,i,o.makeArray(n)):s.push(n)),s||[]},dequeue:function(e,i){i=i||"fx";var n=o.queue(e,i),s=n.length,c=n.shift(),f=o._queueHooks(e,i),h=function(){o.dequeue(e,i)};c==="inprogress"&&(c=n.shift(),s--),c&&(i==="fx"&&n.unshift("inprogress"),delete f.stop,c.call(e,h,f)),!s&&f&&f.empty.fire()},_queueHooks:function(e,i){var n=i+"queueHooks";return le.get(e,n)||le.access(e,n,{empty:o.Callbacks("once memory").add(function(){le.remove(e,[i+"queue",n])})})}}),o.fn.extend({queue:function(e,i){var n=2;return typeof e!="string"&&(i=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,jr=/^$|^module$|\/(?:java|ecma)script/i;(function(){var e=K.createDocumentFragment(),i=e.appendChild(K.createElement("div")),n=K.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),i.appendChild(n),H.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,i.innerHTML="",H.noCloneChecked=!!i.cloneNode(!0).lastChild.defaultValue,i.innerHTML="",H.option=!!i.lastChild})();var et={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};et.tbody=et.tfoot=et.colgroup=et.caption=et.thead,et.th=et.td,H.option||(et.optgroup=et.option=[1,""]);function tt(e,i){var n;return typeof e.getElementsByTagName!="undefined"?n=e.getElementsByTagName(i||"*"):typeof e.querySelectorAll!="undefined"?n=e.querySelectorAll(i||"*"):n=[],i===void 0||i&&Me(e,i)?o.merge([e],n):n}function Hr(e,i){for(var n=0,s=e.length;n-1){c&&c.push(f);continue}if(D=Wt(f),h=tt(U.appendChild(f),"script"),D&&Hr(h),n)for(R=0;f=h[R++];)jr.test(f.type||"")&&n.push(f)}return U}var Ii=/^([^.]*)(?:\.(.+)|)/;function at(){return!0}function Kt(){return!1}function On(e,i){return e===Mi()==(i==="focus")}function Mi(){try{return K.activeElement}catch(e){}}function qr(e,i,n,s,c,f){var h,E;if(typeof i=="object"){typeof n!="string"&&(s=s||n,n=void 0);for(E in i)qr(e,E,n,s,i[E],f);return e}if(s==null&&c==null?(c=n,s=n=void 0):c==null&&(typeof n=="string"?(c=s,s=void 0):(c=s,s=n,n=void 0)),c===!1)c=Kt;else if(!c)return e;return f===1&&(h=c,c=function(x){return o().off(x),h.apply(this,arguments)},c.guid=h.guid||(h.guid=o.guid++)),e.each(function(){o.event.add(this,i,c,s,n)})}o.event={global:{},add:function(e,i,n,s,c){var f,h,E,x,D,R,U,F,I,ie,ve,re=le.get(e);if(!!sr(e))for(n.handler&&(f=n,n=f.handler,c=f.selector),c&&o.find.matchesSelector(Lt,c),n.guid||(n.guid=o.guid++),(x=re.events)||(x=re.events=Object.create(null)),(h=re.handle)||(h=re.handle=function(qe){return typeof o!="undefined"&&o.event.triggered!==qe.type?o.event.dispatch.apply(e,arguments):void 0}),i=(i||"").match(yt)||[""],D=i.length;D--;)E=Ii.exec(i[D])||[],I=ve=E[1],ie=(E[2]||"").split(".").sort(),!!I&&(U=o.event.special[I]||{},I=(c?U.delegateType:U.bindType)||I,U=o.event.special[I]||{},R=o.extend({type:I,origType:ve,data:s,handler:n,guid:n.guid,selector:c,needsContext:c&&o.expr.match.needsContext.test(c),namespace:ie.join(".")},f),(F=x[I])||(F=x[I]=[],F.delegateCount=0,(!U.setup||U.setup.call(e,s,ie,h)===!1)&&e.addEventListener&&e.addEventListener(I,h)),U.add&&(U.add.call(e,R),R.handler.guid||(R.handler.guid=n.guid)),c?F.splice(F.delegateCount++,0,R):F.push(R),o.event.global[I]=!0)},remove:function(e,i,n,s,c){var f,h,E,x,D,R,U,F,I,ie,ve,re=le.hasData(e)&&le.get(e);if(!(!re||!(x=re.events))){for(i=(i||"").match(yt)||[""],D=i.length;D--;){if(E=Ii.exec(i[D])||[],I=ve=E[1],ie=(E[2]||"").split(".").sort(),!I){for(I in x)o.event.remove(e,I+i[D],n,s,!0);continue}for(U=o.event.special[I]||{},I=(s?U.delegateType:U.bindType)||I,F=x[I]||[],E=E[2]&&new RegExp("(^|\\.)"+ie.join("\\.(?:.*\\.|)")+"(\\.|$)"),h=f=F.length;f--;)R=F[f],(c||ve===R.origType)&&(!n||n.guid===R.guid)&&(!E||E.test(R.namespace))&&(!s||s===R.selector||s==="**"&&R.selector)&&(F.splice(f,1),R.selector&&F.delegateCount--,U.remove&&U.remove.call(e,R));h&&!F.length&&((!U.teardown||U.teardown.call(e,ie,re.handle)===!1)&&o.removeEvent(e,I,re.handle),delete x[I])}o.isEmptyObject(x)&&le.remove(e,"handle events")}},dispatch:function(e){var i,n,s,c,f,h,E=new Array(arguments.length),x=o.event.fix(e),D=(le.get(this,"events")||Object.create(null))[x.type]||[],R=o.event.special[x.type]||{};for(E[0]=x,i=1;i=1)){for(;D!==this;D=D.parentNode||this)if(D.nodeType===1&&!(e.type==="click"&&D.disabled===!0)){for(f=[],h={},n=0;n-1:o.find(c,this,null,[D]).length),h[c]&&f.push(s);f.length&&E.push({elem:D,handlers:f})}}return D=this,x\s*$/g;function Ni(e,i){return Me(e,"table")&&Me(i.nodeType!==11?i:i.firstChild,"tr")&&o(e).children("tbody")[0]||e}function Un(e){return e.type=(e.getAttribute("type")!==null)+"/"+e.type,e}function jn(e){return(e.type||"").slice(0,5)==="true/"?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oi(e,i){var n,s,c,f,h,E,x;if(i.nodeType===1){if(le.hasData(e)&&(f=le.get(e),x=f.events,x)){le.remove(i,"handle events");for(c in x)for(n=0,s=x[c].length;n1&&typeof I=="string"&&!H.checkClone&&Wn.test(I))return e.each(function(ve){var re=e.eq(ve);ie&&(i[0]=I.call(this,ve,re.html())),Ut(re,i,n,s)});if(U&&(c=Vr(i,e[0].ownerDocument,!1,e,s),f=c.firstChild,c.childNodes.length===1&&(c=f),f||s)){for(h=o.map(tt(c,"script"),Un),E=h.length;R0&&Hr(h,!x&&tt(e,"script")),E},cleanData:function(e){for(var i,n,s,c=o.event.special,f=0;(n=e[f])!==void 0;f++)if(sr(n)){if(i=n[le.expando]){if(i.events)for(s in i.events)c[s]?o.event.remove(n,s):o.removeEvent(n,s,i.handle);n[le.expando]=void 0}n[$e.expando]&&(n[$e.expando]=void 0)}}}),o.fn.extend({detach:function(e){return $i(this,e,!0)},remove:function(e){return $i(this,e)},text:function(e){return Ct(this,function(i){return i===void 0?o.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=i)})},null,e,arguments.length)},append:function(){return Ut(this,arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=Ni(this,e);i.appendChild(e)}})},prepend:function(){return Ut(this,arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=Ni(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return Ut(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ut(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,i=0;(e=this[i])!=null;i++)e.nodeType===1&&(o.cleanData(tt(e,!1)),e.textContent="");return this},clone:function(e,i){return e=e==null?!1:e,i=i==null?e:i,this.map(function(){return o.clone(this,e,i)})},html:function(e){return Ct(this,function(i){var n=this[0]||{},s=0,c=this.length;if(i===void 0&&n.nodeType===1)return n.innerHTML;if(typeof i=="string"&&!$n.test(i)&&!et[(Ur.exec(i)||["",""])[1].toLowerCase()]){i=o.htmlPrefilter(i);try{for(;s=0&&(x+=Math.max(0,Math.ceil(e["offset"+i[0].toUpperCase()+i.slice(1)]-f-x-E-.5))||0),x}function fr(e,i,n){var s=Ar(e),c=!H.boxSizingReliable()||n,f=c&&o.css(e,"boxSizing",!1,s)==="border-box",h=f,E=ur(e,i,s),x="offset"+i[0].toUpperCase()+i.slice(1);if(Gr.test(E)){if(!n)return E;E="auto"}return(!H.boxSizingReliable()&&f||!H.reliableTrDimensions()&&Me(e,"tr")||E==="auto"||!parseFloat(E)&&o.css(e,"display",!1,s)==="inline")&&e.getClientRects().length&&(f=o.css(e,"boxSizing",!1,s)==="border-box",h=x in e,h&&(E=e[x])),E=parseFloat(E)||0,E+Jr(e,i,n||(f?"border":"content"),h,s,E)+"px"}o.extend({cssHooks:{opacity:{get:function(e,i){if(i){var n=ur(e,"opacity");return n===""?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,i,n,s){if(!(!e||e.nodeType===3||e.nodeType===8||!e.style)){var c,f,h,E=xt(i),x=Yr.test(i),D=e.style;if(x||(i=Xr(E)),h=o.cssHooks[i]||o.cssHooks[E],n!==void 0){if(f=typeof n,f==="string"&&(c=$t.exec(n))&&c[1]&&(n=Wr(e,i,c),f="number"),n==null||n!==n)return;f==="number"&&!x&&(n+=c&&c[3]||(o.cssNumber[E]?"":"px")),!H.clearCloneStyle&&n===""&&i.indexOf("background")===0&&(D[i]="inherit"),(!h||!("set"in h)||(n=h.set(e,n,s))!==void 0)&&(x?D.setProperty(i,n):D[i]=n)}else return h&&"get"in h&&(c=h.get(e,!1,s))!==void 0?c:D[i]}},css:function(e,i,n,s){var c,f,h,E=xt(i),x=Yr.test(i);return x||(i=Xr(E)),h=o.cssHooks[i]||o.cssHooks[E],h&&"get"in h&&(c=h.get(e,!0,n)),c===void 0&&(c=ur(e,i,s)),c==="normal"&&i in Qr&&(c=Qr[i]),n===""||n?(f=parseFloat(c),n===!0||isFinite(f)?f||0:c):c}}),o.each(["height","width"],function(e,i){o.cssHooks[i]={get:function(n,s,c){if(s)return Vi.test(o.css(n,"display"))&&(!n.getClientRects().length||!n.getBoundingClientRect().width)?Wi(n,cr,function(){return fr(n,i,c)}):fr(n,i,c)},set:function(n,s,c){var f,h=Ar(n),E=!H.scrollboxSize()&&h.position==="absolute",x=E||c,D=x&&o.css(n,"boxSizing",!1,h)==="border-box",R=c?Jr(n,i,c,D,h):0;return D&&E&&(R-=Math.ceil(n["offset"+i[0].toUpperCase()+i.slice(1)]-parseFloat(h[i])-Jr(n,i,"border",!1,h)-.5)),R&&(f=$t.exec(s))&&(f[3]||"px")!=="px"&&(n.style[i]=s,s=o.css(n,i)),jt(n,s,R)}}}),o.cssHooks.marginLeft=Ui(H.reliableMarginLeft,function(e,i){if(i)return(parseFloat(ur(e,"marginLeft"))||e.getBoundingClientRect().left-Wi(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),o.each({margin:"",padding:"",border:"Width"},function(e,i){o.cssHooks[e+i]={expand:function(n){for(var s=0,c={},f=typeof n=="string"?n.split(" "):[n];s<4;s++)c[e+wt[s]+i]=f[s]||f[s-2]||f[0];return c}},e!=="margin"&&(o.cssHooks[e+i].set=jt)}),o.fn.extend({css:function(e,i){return Ct(this,function(n,s,c){var f,h,E={},x=0;if(Array.isArray(s)){for(f=Ar(n),h=s.length;x1)}});function Qe(e,i,n,s,c){return new Qe.prototype.init(e,i,n,s,c)}o.Tween=Qe,Qe.prototype={constructor:Qe,init:function(e,i,n,s,c,f){this.elem=e,this.prop=n,this.easing=c||o.easing._default,this.options=i,this.start=this.now=this.cur(),this.end=s,this.unit=f||(o.cssNumber[n]?"":"px")},cur:function(){var e=Qe.propHooks[this.prop];return e&&e.get?e.get(this):Qe.propHooks._default.get(this)},run:function(e){var i,n=Qe.propHooks[this.prop];return this.options.duration?this.pos=i=o.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=i=e,this.now=(this.end-this.start)*i+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Qe.propHooks._default.set(this),this}},Qe.prototype.init.prototype=Qe.prototype,Qe.propHooks={_default:{get:function(e){var i;return e.elem.nodeType!==1||e.elem[e.prop]!=null&&e.elem.style[e.prop]==null?e.elem[e.prop]:(i=o.css(e.elem,e.prop,""),!i||i==="auto"?0:i)},set:function(e){o.fx.step[e.prop]?o.fx.step[e.prop](e):e.elem.nodeType===1&&(o.cssHooks[e.prop]||e.elem.style[Xr(e.prop)]!=null)?o.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Qe.propHooks.scrollTop=Qe.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},o.easing={linear:function(e){return e},swing:function(e){return .5-Math.cos(e*Math.PI)/2},_default:"swing"},o.fx=Qe.prototype.init,o.fx.step={};var Zt,Dr,Kr=/^(?:toggle|show|hide)$/,Gn=/queueHooks$/;function Zr(){Dr&&(K.hidden===!1&&l.requestAnimationFrame?l.requestAnimationFrame(Zr):l.setTimeout(Zr,o.fx.interval),o.fx.tick())}function p(){return l.setTimeout(function(){Zt=void 0}),Zt=Date.now()}function S(e,i){var n,s=0,c={height:e};for(i=i?1:0;s<4;s+=2-i)n=wt[s],c["margin"+n]=c["padding"+n]=e;return i&&(c.opacity=c.width=e),c}function v(e,i,n){for(var s,c=(_.tweeners[i]||[]).concat(_.tweeners["*"]),f=0,h=c.length;f1)},removeAttr:function(e){return this.each(function(){o.removeAttr(this,e)})}}),o.extend({attr:function(e,i,n){var s,c,f=e.nodeType;if(!(f===3||f===8||f===2)){if(typeof e.getAttribute=="undefined")return o.prop(e,i,n);if((f!==1||!o.isXMLDoc(e))&&(c=o.attrHooks[i.toLowerCase()]||(o.expr.match.bool.test(i)?N:void 0)),n!==void 0){if(n===null){o.removeAttr(e,i);return}return c&&"set"in c&&(s=c.set(e,n,i))!==void 0?s:(e.setAttribute(i,n+""),n)}return c&&"get"in c&&(s=c.get(e,i))!==null?s:(s=o.find.attr(e,i),s==null?void 0:s)}},attrHooks:{type:{set:function(e,i){if(!H.radioValue&&i==="radio"&&Me(e,"input")){var n=e.value;return e.setAttribute("type",i),n&&(e.value=n),i}}}},removeAttr:function(e,i){var n,s=0,c=i&&i.match(yt);if(c&&e.nodeType===1)for(;n=c[s++];)e.removeAttribute(n)}}),N={set:function(e,i,n){return i===!1?o.removeAttr(e,n):e.setAttribute(n,n),n}},o.each(o.expr.match.bool.source.match(/\w+/g),function(e,i){var n=B[i]||o.find.attr;B[i]=function(s,c,f){var h,E,x=c.toLowerCase();return f||(E=B[x],B[x]=h,h=n(s,c,f)!=null?x:null,B[x]=E),h}});var q=/^(?:input|select|textarea|button)$/i,G=/^(?:a|area)$/i;o.fn.extend({prop:function(e,i){return Ct(this,o.prop,e,i,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[o.propFix[e]||e]})}}),o.extend({prop:function(e,i,n){var s,c,f=e.nodeType;if(!(f===3||f===8||f===2))return(f!==1||!o.isXMLDoc(e))&&(i=o.propFix[i]||i,c=o.propHooks[i]),n!==void 0?c&&"set"in c&&(s=c.set(e,n,i))!==void 0?s:e[i]=n:c&&"get"in c&&(s=c.get(e,i))!==null?s:e[i]},propHooks:{tabIndex:{get:function(e){var i=o.find.attr(e,"tabindex");return i?parseInt(i,10):q.test(e.nodeName)||G.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),H.optSelected||(o.propHooks.selected={get:function(e){var i=e.parentNode;return i&&i.parentNode&&i.parentNode.selectedIndex,null},set:function(e){var i=e.parentNode;i&&(i.selectedIndex,i.parentNode&&i.parentNode.selectedIndex)}}),o.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){o.propFix[this.toLowerCase()]=this});function Y(e){var i=e.match(yt)||[];return i.join(" ")}function Z(e){return e.getAttribute&&e.getAttribute("class")||""}function ye(e){return Array.isArray(e)?e:typeof e=="string"?e.match(yt)||[]:[]}o.fn.extend({addClass:function(e){var i,n,s,c,f,h;return V(e)?this.each(function(E){o(this).addClass(e.call(this,E,Z(this)))}):(i=ye(e),i.length?this.each(function(){if(s=Z(this),n=this.nodeType===1&&" "+Y(s)+" ",n){for(f=0;f-1;)n=n.replace(" "+c+" "," ");h=Y(n),s!==h&&this.setAttribute("class",h)}}):this):this.attr("class","")},toggleClass:function(e,i){var n,s,c,f,h=typeof e,E=h==="string"||Array.isArray(e);return V(e)?this.each(function(x){o(this).toggleClass(e.call(this,x,Z(this),i),i)}):typeof i=="boolean"&&E?i?this.addClass(e):this.removeClass(e):(n=ye(e),this.each(function(){if(E)for(f=o(this),c=0;c-1)return!0;return!1}});var ke=/\r/g;o.fn.extend({val:function(e){var i,n,s,c=this[0];return arguments.length?(s=V(e),this.each(function(f){var h;this.nodeType===1&&(s?h=e.call(this,f,o(this).val()):h=e,h==null?h="":typeof h=="number"?h+="":Array.isArray(h)&&(h=o.map(h,function(E){return E==null?"":E+""})),i=o.valHooks[this.type]||o.valHooks[this.nodeName.toLowerCase()],(!i||!("set"in i)||i.set(this,h,"value")===void 0)&&(this.value=h))})):c?(i=o.valHooks[c.type]||o.valHooks[c.nodeName.toLowerCase()],i&&"get"in i&&(n=i.get(c,"value"))!==void 0?n:(n=c.value,typeof n=="string"?n.replace(ke,""):n==null?"":n)):void 0}}),o.extend({valHooks:{option:{get:function(e){var i=o.find.attr(e,"value");return i!=null?i:Y(o.text(e))}},select:{get:function(e){var i,n,s,c=e.options,f=e.selectedIndex,h=e.type==="select-one",E=h?null:[],x=h?f+1:c.length;for(f<0?s=x:s=h?f:0;s-1)&&(n=!0);return n||(e.selectedIndex=-1),f}}}}),o.each(["radio","checkbox"],function(){o.valHooks[this]={set:function(e,i){if(Array.isArray(i))return e.checked=o.inArray(o(e).val(),i)>-1}},H.checkOn||(o.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value})}),H.focusin="onfocusin"in l;var Pe=/^(?:focusinfocus|focusoutblur)$/,We=function(e){e.stopPropagation()};o.extend(o.event,{trigger:function(e,i,n,s){var c,f,h,E,x,D,R,U,F=[n||K],I=W.call(e,"type")?e.type:e,ie=W.call(e,"namespace")?e.namespace.split("."):[];if(f=U=h=n=n||K,!(n.nodeType===3||n.nodeType===8)&&!Pe.test(I+o.event.triggered)&&(I.indexOf(".")>-1&&(ie=I.split("."),I=ie.shift(),ie.sort()),x=I.indexOf(":")<0&&"on"+I,e=e[o.expando]?e:new o.Event(I,typeof e=="object"&&e),e.isTrigger=s?2:3,e.namespace=ie.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+ie.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),i=i==null?[e]:o.makeArray(i,[e]),R=o.event.special[I]||{},!(!s&&R.trigger&&R.trigger.apply(n,i)===!1))){if(!s&&!R.noBubble&&!de(n)){for(E=R.delegateType||I,Pe.test(E+I)||(f=f.parentNode);f;f=f.parentNode)F.push(f),h=f;h===(n.ownerDocument||K)&&F.push(h.defaultView||h.parentWindow||l)}for(c=0;(f=F[c++])&&!e.isPropagationStopped();)U=f,e.type=c>1?E:R.bindType||I,D=(le.get(f,"events")||Object.create(null))[e.type]&&le.get(f,"handle"),D&&D.apply(f,i),D=x&&f[x],D&&D.apply&&sr(f)&&(e.result=D.apply(f,i),e.result===!1&&e.preventDefault());return e.type=I,!s&&!e.isDefaultPrevented()&&(!R._default||R._default.apply(F.pop(),i)===!1)&&sr(n)&&x&&V(n[I])&&!de(n)&&(h=n[x],h&&(n[x]=null),o.event.triggered=I,e.isPropagationStopped()&&U.addEventListener(I,We),n[I](),e.isPropagationStopped()&&U.removeEventListener(I,We),o.event.triggered=void 0,h&&(n[x]=h)),e.result}},simulate:function(e,i,n){var s=o.extend(new o.Event,n,{type:e,isSimulated:!0});o.event.trigger(s,null,i)}}),o.fn.extend({trigger:function(e,i){return this.each(function(){o.event.trigger(e,i,this)})},triggerHandler:function(e,i){var n=this[0];if(n)return o.event.trigger(e,i,n,!0)}}),H.focusin||o.each({focus:"focusin",blur:"focusout"},function(e,i){var n=function(s){o.event.simulate(i,s.target,o.event.fix(s))};o.event.special[i]={setup:function(){var s=this.ownerDocument||this.document||this,c=le.access(s,i);c||s.addEventListener(e,n,!0),le.access(s,i,(c||0)+1)},teardown:function(){var s=this.ownerDocument||this.document||this,c=le.access(s,i)-1;c?le.access(s,i,c):(s.removeEventListener(e,n,!0),le.remove(s,i))}}});var Fe=l.location,st={guid:Date.now()},Ht=/\?/;o.parseXML=function(e){var i,n;if(!e||typeof e!="string")return null;try{i=new l.DOMParser().parseFromString(e,"text/xml")}catch(s){}return n=i&&i.getElementsByTagName("parsererror")[0],(!i||n)&&o.error("Invalid XML: "+(n?o.map(n.childNodes,function(s){return s.textContent}).join(` +import{a as ln,b as nl,c as al}from"./chunk-SDBJC2RS.js";import{a as Is}from"./chunk-XMPGMPQ4.js";import{a as Ms,b as Ns,c as sl}from"./chunk-B7KJX6SS.js";import{D as da,J as ha,l as te,u as Fs,v as Rs}from"./chunk-6UU4KLMR.js";import{$ as Ls,D as Rt,E as ua,F as Fr,G as As,H as ca,Q as fa,S as Ds,_ as on,a as Ft,aa as ci,b as ui,d as _t,e as la,f as ft,g as Le,j as Ts,l as tn,m as rn,n as nn,o as vr,p as Cs,s as an,v as ks,w as Ps,x as sn,y as vt,z as Lr}from"./chunk-7LTJUW24.js";import{a as li,b as _s,c as oa}from"./chunk-RQFURXHW.js";var ma=_s((Os,pa)=>{(function(l){if(typeof Os=="object"&&typeof pa!="undefined")pa.exports=l();else if(typeof define=="function"&&define.amd)define([],l);else{var t;typeof window!="undefined"?t=window:typeof global!="undefined"?t=global:typeof self!="undefined"?t=self:t=this,t.localforage=l()}})(function(){var l,t,r;return function a(u,d,m){function b(W,fe){if(!d[W]){if(!u[W]){var z=typeof li=="function"&&li;if(!fe&&z)return z(W,!0);if(y)return y(W,!0);var H=new Error("Cannot find module '"+W+"'");throw H.code="MODULE_NOT_FOUND",H}var V=d[W]={exports:{}};u[W][0].call(V.exports,function(de){var K=u[W][1][de];return b(K||de)},V,V.exports,a,u,d,m)}return d[W].exports}for(var y=typeof li=="function"&&li,L=0;L=43)}}).catch(function(){return!1})}function _e(p){return typeof Ce=="boolean"?z.resolve(Ce):oe(p).then(function(S){return Ce=S,Ce})}function ze(p){var S=be[p.name],v={};v.promise=new z(function(C,k){v.resolve=C,v.reject=k}),S.deferredOperations.push(v),S.dbReady?S.dbReady=S.dbReady.then(function(){return v.promise}):S.dbReady=v.promise}function Me(p){var S=be[p.name],v=S.deferredOperations.pop();if(v)return v.resolve(),v.promise}function nt(p,S){var v=be[p.name],C=v.deferredOperations.pop();if(C)return C.reject(S),C.promise}function Ke(p,S){return new z(function(v,C){if(be[p.name]=be[p.name]||ar(),p.db)if(S)ze(p),p.db.close();else return v(p.db);var k=[p.name];S&&k.push(p.version);var _=L.open.apply(L,k);S&&(_.onupgradeneeded=function(N){var B=_.result;try{B.createObjectStore(p.storeName),N.oldVersion<=1&&B.createObjectStore(xe)}catch(q){if(q.name==="ConstraintError")console.warn('The database "'+p.name+'" has been upgraded from version '+N.oldVersion+" to version "+N.newVersion+', but the storage "'+p.storeName+'" already exists.');else throw q}}),_.onerror=function(N){N.preventDefault(),C(_.error)},_.onsuccess=function(){var N=_.result;N.onversionchange=function(B){B.target.close()},v(N),Me(p)}})}function bt(p){return Ke(p,!1)}function nr(p){return Ke(p,!0)}function Sr(p,S){if(!p.db)return!0;var v=!p.db.objectStoreNames.contains(p.storeName),C=p.versionp.db.version;if(C&&(p.version!==S&&console.warn('The database "'+p.name+`" can't be downgraded from version `+p.db.version+" to version "+p.version+"."),p.version=p.db.version),k||v){if(v){var _=p.db.version+1;_>p.version&&(p.version=_)}return!0}return!1}function Nr(p){return new z(function(S,v){var C=new FileReader;C.onerror=v,C.onloadend=function(k){var _=btoa(k.target.result||"");S({__local_forage_encoded_blob:!0,data:_,type:p.type})},C.readAsBinaryString(p)})}function Qt(p){var S=ae(atob(p.data));return fe([S],{type:p.type})}function Or(p){return p&&p.__local_forage_encoded_blob}function yt(p){var S=this,v=S._initReady().then(function(){var C=be[S._dbInfo.name];if(C&&C.dbReady)return C.dbReady});return V(v,p,p),v}function Ln(p){ze(p);for(var S=be[p.name],v=S.forages,C=0;C0&&(!p.db||_.name==="InvalidStateError"||_.name==="NotFoundError"))return z.resolve().then(function(){if(!p.db||_.name==="NotFoundError"&&!p.db.objectStoreNames.contains(p.storeName)&&p.version<=p.db.version)return p.db&&(p.version=p.db.version+1),nr(p)}).then(function(){return Ln(p).then(function(){Ze(p,S,v,C-1)})}).catch(v);v(_)}}function ar(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function Di(p){var S=this,v={db:null};if(p)for(var C in p)v[C]=p[C];var k=be[v.name];k||(k=ar(),be[v.name]=k),k.forages.push(S),S._initReady||(S._initReady=S.ready,S.ready=yt);var _=[];function N(){return z.resolve()}for(var B=0;B>4,Y[k++]=(N&15)<<4|B>>2,Y[k++]=(B&3)<<6|q&63;return G}function et(p){var S=new Uint8Array(p),v="",C;for(C=0;C>2],v+=$e[(S[C]&3)<<4|S[C+1]>>4],v+=$e[(S[C+1]&15)<<2|S[C+2]>>6],v+=$e[S[C+2]&63];return S.length%3==2?v=v.substring(0,v.length-1)+"=":S.length%3==1&&(v=v.substring(0,v.length-2)+"=="),v}function tt(p,S){var v="";if(p&&(v=Ur.call(p)),p&&(v==="[object ArrayBuffer]"||p.buffer&&Ur.call(p.buffer)==="[object ArrayBuffer]")){var C,k=Tr;p instanceof ArrayBuffer?(C=p,k+=kr):(C=p.buffer,v==="[object Int8Array]"?k+=wt:v==="[object Uint8Array]"?k+=Lt:v==="[object Uint8ClampedArray]"?k+=Wt:v==="[object Int16Array]"?k+=Fi:v==="[object Uint16Array]"?k+=Wr:v==="[object Int32Array]"?k+=lr:v==="[object Uint32Array]"?k+=Br:v==="[object Float32Array]"?k+=Ri:v==="[object Float64Array]"?k+=Bt:S(new Error("Failed to get type for BinaryArray"))),S(k+et(C))}else if(v==="[object Blob]"){var _=new FileReader;_.onload=function(){var N=Nn+p.type+"~"+et(this.result);S(Tr+$t+N)},_.readAsArrayBuffer(p)}else try{S(JSON.stringify(p))}catch(N){console.error("Couldn't convert value into a JSON string: ",p),S(null,N)}}function Hr(p){if(p.substring(0,Cr)!==Tr)return JSON.parse(p);var S=p.substring(Jt),v=p.substring(Cr,Jt),C;if(v===$t&&Li.test(S)){var k=S.match(Li);C=k[1],S=S.substring(k[0].length)}var _=jr(S);switch(v){case kr:return _;case $t:return fe([_],{type:C});case wt:return new Int8Array(_);case Lt:return new Uint8Array(_);case Wt:return new Uint8ClampedArray(_);case Fi:return new Int16Array(_);case Wr:return new Uint16Array(_);case lr:return new Int32Array(_);case Br:return new Uint32Array(_);case Ri:return new Float32Array(_);case Bt:return new Float64Array(_);default:throw new Error("Unkown type: "+v)}}var zr={serialize:tt,deserialize:Hr,stringToBuffer:jr,bufferToString:et};function Vr(p,S,v,C){p.executeSql("CREATE TABLE IF NOT EXISTS "+S.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],v,C)}function Ii(p){var S=this,v={db:null};if(p)for(var C in p)v[C]=typeof p[C]!="string"?p[C].toString():p[C];var k=new z(function(_,N){try{v.db=openDatabase(v.name,String(v.version),v.description,v.size)}catch(B){return N(B)}v.db.transaction(function(B){Vr(B,v,function(){S._dbInfo=v,_()},function(q,G){N(G)})},N)});return v.serializer=zr,k}function at(p,S,v,C,k,_){p.executeSql(v,C,k,function(N,B){B.code===B.SYNTAX_ERR?N.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[S.storeName],function(q,G){G.rows.length?_(q,B):Vr(q,S,function(){q.executeSql(v,C,k,_)},_)},_):_(N,B)},_)}function Kt(p,S){var v=this;p=de(p);var C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(B){at(B,N,"SELECT * FROM "+N.storeName+" WHERE key = ? LIMIT 1",[p],function(q,G){var Y=G.rows.length?G.rows.item(0).value:null;Y&&(Y=N.serializer.deserialize(Y)),k(Y)},function(q,G){_(G)})})}).catch(_)});return H(C,S),C}function On(p,S){var v=this,C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(B){at(B,N,"SELECT * FROM "+N.storeName,[],function(q,G){for(var Y=G.rows,Z=Y.length,ye=0;ye0){N(Mi.apply(k,[p,q,v,C-1]));return}B(ye)}})})}).catch(B)});return H(_,v),_}function qr(p,S,v){return Mi.apply(this,[p,S,v,1])}function Pr(p,S){var v=this;p=de(p);var C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(B){at(B,N,"DELETE FROM "+N.storeName+" WHERE key = ?",[p],function(){k()},function(q,G){_(G)})})}).catch(_)});return H(C,S),C}function $n(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){at(N,_,"DELETE FROM "+_.storeName,[],function(){C()},function(B,q){k(q)})})}).catch(k)});return H(v,p),v}function Wn(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){at(N,_,"SELECT COUNT(key) as c FROM "+_.storeName,[],function(B,q){var G=q.rows.item(0).c;C(G)},function(B,q){k(q)})})}).catch(k)});return H(v,p),v}function Bn(p,S){var v=this,C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(B){at(B,N,"SELECT key FROM "+N.storeName+" WHERE id = ? LIMIT 1",[p+1],function(q,G){var Y=G.rows.length?G.rows.item(0).key:null;k(Y)},function(q,G){_(G)})})}).catch(_)});return H(C,S),C}function Ni(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){at(N,_,"SELECT key FROM "+_.storeName,[],function(B,q){for(var G=[],Y=0;Y '__WebKitDatabaseInfoTable__'",[],function(k,_){for(var N=[],B=0;B<_.rows.length;B++)N.push(_.rows.item(B).name);S({db:p,storeNames:N})},function(k,_){v(_)})},function(C){v(C)})})}function jn(p,S){S=K.apply(this,arguments);var v=this.config();p=typeof p!="function"&&p||{},p.name||(p.name=p.name||v.name,p.storeName=p.storeName||v.storeName);var C=this,k;return p.name?k=new z(function(_){var N;p.name===v.name?N=C._dbInfo.db:N=openDatabase(p.name,"","",0),p.storeName?_({db:N,storeNames:[p.storeName]}):_(Un(N))}).then(function(_){return new z(function(N,B){_.db.transaction(function(q){function G(ke){return new z(function(Pe,We){q.executeSql("DROP TABLE IF EXISTS "+ke,[],function(){Pe()},function(Fe,st){We(st)})})}for(var Y=[],Z=0,ye=_.storeNames.length;Z0}function Yr(p){var S=this,v={};if(p)for(var C in p)v[C]=p[C];return v.keyPrefix=Ut(p,S._defaultConfig),Gr()?(S._dbInfo=v,v.serializer=zr,z.resolve()):z.reject()}function Ar(p){var S=this,v=S.ready().then(function(){for(var C=S._dbInfo.keyPrefix,k=localStorage.length-1;k>=0;k--){var _=localStorage.key(k);_.indexOf(C)===0&&localStorage.removeItem(_)}});return H(v,p),v}function Wi(p,S){var v=this;p=de(p);var C=v.ready().then(function(){var k=v._dbInfo,_=localStorage.getItem(k.keyPrefix+p);return _&&(_=k.serializer.deserialize(_)),_});return H(C,S),C}function zn(p,S){var v=this,C=v.ready().then(function(){for(var k=v._dbInfo,_=k.keyPrefix,N=_.length,B=localStorage.length,q=1,G=0;G=0;N--){var B=localStorage.key(N);B.indexOf(_)===0&&localStorage.removeItem(B)}}):k=z.reject("Invalid arguments"),H(k,S),k}var zi={_driver:"localStorageWrapper",_initStorage:Yr,_support:Hn(),iterate:zn,getItem:Wi,setItem:ji,removeItem:Ui,clear:Ar,length:ur,key:Bi,keys:Vn,dropInstance:Hi},qn=function(S,v){return S===v||typeof S=="number"&&typeof v=="number"&&isNaN(S)&&isNaN(v)},Xr=function(S,v){for(var C=S.length,k=0;k{(function(l,t){"use strict";typeof cn=="object"&&typeof cn.exports=="object"?cn.exports=l.document?t(l,!0):function(r){if(!r.document)throw new Error("jQuery requires a window with a document");return t(r)}:t(l)})(typeof window!="undefined"?window:Us,function(l,t){"use strict";var r=[],a=Object.getPrototypeOf,u=r.slice,d=r.flat?function(e){return r.flat.call(e)}:function(e){return r.concat.apply([],e)},m=r.push,b=r.indexOf,y={},L=y.toString,W=y.hasOwnProperty,fe=W.toString,z=fe.call(Object),H={},V=function(i){return typeof i=="function"&&typeof i.nodeType!="number"&&typeof i.item!="function"},de=function(i){return i!=null&&i===i.window},K=l.document,xe={type:!0,src:!0,nonce:!0,noModule:!0};function Ce(e,i,n){n=n||K;var s,c,f=n.createElement("script");if(f.text=e,i)for(s in xe)c=i[s]||i.getAttribute&&i.getAttribute(s),c&&f.setAttribute(s,c);n.head.appendChild(f).parentNode.removeChild(f)}function be(e){return e==null?e+"":typeof e=="object"||typeof e=="function"?y[L.call(e)]||"object":typeof e}var Se="3.6.3",o=function(e,i){return new o.fn.init(e,i)};o.fn=o.prototype={jquery:Se,constructor:o,length:0,toArray:function(){return u.call(this)},get:function(e){return e==null?u.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var i=o.merge(this.constructor(),e);return i.prevObject=this,i},each:function(e){return o.each(this,e)},map:function(e){return this.pushStack(o.map(this,function(i,n){return e.call(i,n,i)}))},slice:function(){return this.pushStack(u.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(o.grep(this,function(e,i){return(i+1)%2}))},odd:function(){return this.pushStack(o.grep(this,function(e,i){return i%2}))},eq:function(e){var i=this.length,n=+e+(e<0?i:0);return this.pushStack(n>=0&&n0&&i-1 in e}var ae=function(e){var i,n,s,c,f,h,E,x,D,R,U,F,I,ie,ve,re,qe,Ve,ht,De="sizzle"+1*new Date,me=e.document,ut=0,Te=0,Be=Ji(),ni=Ji(),Yi=Ji(),pt=Ji(),dr=function(g,w){return g===w&&(U=!0),0},hr={}.hasOwnProperty,ct=[],er=ct.pop,Et=ct.push,tr=ct.push,gs=ct.slice,pr=function(g,w){for(var T=0,M=g.length;T+~]|"+Ae+")"+Ae+"*"),qo=new RegExp(Ae+"|>"),Go=new RegExp(ea),Yo=new RegExp("^"+gr+"$"),Qi={ID:new RegExp("^#("+gr+")"),CLASS:new RegExp("^\\.("+gr+")"),TAG:new RegExp("^("+gr+"|[*])"),ATTR:new RegExp("^"+ms),PSEUDO:new RegExp("^"+ea),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+Ae+"*(even|odd|(([+-]|)(\\d*)n|)"+Ae+"*(?:([+-]|)"+Ae+"*(\\d+)|))"+Ae+"*\\)|)","i"),bool:new RegExp("^(?:"+Zn+")$","i"),needsContext:new RegExp("^"+Ae+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+Ae+"*((?:-\\d)?\\d*)"+Ae+"*\\)|)(?=[^-]|$)","i")},Xo=/HTML$/i,Qo=/^(?:input|select|textarea|button)$/i,Jo=/^h\d$/i,ai=/^[^{]+\{\s*\[native \w/,Ko=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ta=/[+~]/,zt=new RegExp("\\\\[\\da-fA-F]{1,6}"+Ae+"?|\\\\([^\\r\\n\\f])","g"),Vt=function(g,w){var T="0x"+g.slice(1)-65536;return w||(T<0?String.fromCharCode(T+65536):String.fromCharCode(T>>10|55296,T&1023|56320))},bs=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ys=function(g,w){return w?g==="\0"?"\uFFFD":g.slice(0,-1)+"\\"+g.charCodeAt(g.length-1).toString(16)+" ":"\\"+g},xs=function(){F()},Zo=Zi(function(g){return g.disabled===!0&&g.nodeName.toLowerCase()==="fieldset"},{dir:"parentNode",next:"legend"});try{tr.apply(ct=gs.call(me.childNodes),me.childNodes),ct[me.childNodes.length].nodeType}catch(g){tr={apply:ct.length?function(w,T){Et.apply(w,gs.call(T))}:function(w,T){for(var M=w.length,P=0;w[M++]=T[P++];);w.length=M-1}}}function Re(g,w,T,M){var P,O,j,Q,J,ue,se,he=w&&w.ownerDocument,we=w?w.nodeType:9;if(T=T||[],typeof g!="string"||!g||we!==1&&we!==9&&we!==11)return T;if(!M&&(F(w),w=w||I,ve)){if(we!==11&&(J=Ko.exec(g)))if(P=J[1]){if(we===9)if(j=w.getElementById(P)){if(j.id===P)return T.push(j),T}else return T;else if(he&&(j=he.getElementById(P))&&ht(w,j)&&j.id===P)return T.push(j),T}else{if(J[2])return tr.apply(T,w.getElementsByTagName(g)),T;if((P=J[3])&&n.getElementsByClassName&&w.getElementsByClassName)return tr.apply(T,w.getElementsByClassName(P)),T}if(n.qsa&&!pt[g+" "]&&(!re||!re.test(g))&&(we!==1||w.nodeName.toLowerCase()!=="object")){if(se=g,he=w,we===1&&(qo.test(g)||vs.test(g))){for(he=ta.test(g)&&ia(w.parentNode)||w,(he!==w||!n.scope)&&((Q=w.getAttribute("id"))?Q=Q.replace(bs,ys):w.setAttribute("id",Q=De)),ue=h(g),O=ue.length;O--;)ue[O]=(Q?"#"+Q:":scope")+" "+Ki(ue[O]);se=ue.join(",")}try{if(n.cssSupportsSelector&&!CSS.supports("selector(:is("+se+"))"))throw new Error;return tr.apply(T,he.querySelectorAll(se)),T}catch(Ie){pt(g,!0)}finally{Q===De&&w.removeAttribute("id")}}}return x(g.replace(Xi,"$1"),w,T,M)}function Ji(){var g=[];function w(T,M){return g.push(T+" ")>s.cacheLength&&delete w[g.shift()],w[T+" "]=M}return w}function kt(g){return g[De]=!0,g}function St(g){var w=I.createElement("fieldset");try{return!!g(w)}catch(T){return!1}finally{w.parentNode&&w.parentNode.removeChild(w),w=null}}function ra(g,w){for(var T=g.split("|"),M=T.length;M--;)s.attrHandle[T[M]]=w}function ws(g,w){var T=w&&g,M=T&&g.nodeType===1&&w.nodeType===1&&g.sourceIndex-w.sourceIndex;if(M)return M;if(T){for(;T=T.nextSibling;)if(T===w)return-1}return g?1:-1}function el(g){return function(w){var T=w.nodeName.toLowerCase();return T==="input"&&w.type===g}}function tl(g){return function(w){var T=w.nodeName.toLowerCase();return(T==="input"||T==="button")&&w.type===g}}function Es(g){return function(w){return"form"in w?w.parentNode&&w.disabled===!1?"label"in w?"label"in w.parentNode?w.parentNode.disabled===g:w.disabled===g:w.isDisabled===g||w.isDisabled!==!g&&Zo(w)===g:w.disabled===g:"label"in w?w.disabled===g:!1}}function mr(g){return kt(function(w){return w=+w,kt(function(T,M){for(var P,O=g([],T.length,w),j=O.length;j--;)T[P=O[j]]&&(T[P]=!(M[P]=T[P]))})})}function ia(g){return g&&typeof g.getElementsByTagName!="undefined"&&g}n=Re.support={},f=Re.isXML=function(g){var w=g&&g.namespaceURI,T=g&&(g.ownerDocument||g).documentElement;return!Xo.test(w||T&&T.nodeName||"HTML")},F=Re.setDocument=function(g){var w,T,M=g?g.ownerDocument||g:me;return M==I||M.nodeType!==9||!M.documentElement||(I=M,ie=I.documentElement,ve=!f(I),me!=I&&(T=I.defaultView)&&T.top!==T&&(T.addEventListener?T.addEventListener("unload",xs,!1):T.attachEvent&&T.attachEvent("onunload",xs)),n.scope=St(function(P){return ie.appendChild(P).appendChild(I.createElement("div")),typeof P.querySelectorAll!="undefined"&&!P.querySelectorAll(":scope fieldset div").length}),n.cssSupportsSelector=St(function(){return CSS.supports("selector(*)")&&I.querySelectorAll(":is(:jqfake)")&&!CSS.supports("selector(:is(*,:jqfake))")}),n.attributes=St(function(P){return P.className="i",!P.getAttribute("className")}),n.getElementsByTagName=St(function(P){return P.appendChild(I.createComment("")),!P.getElementsByTagName("*").length}),n.getElementsByClassName=ai.test(I.getElementsByClassName),n.getById=St(function(P){return ie.appendChild(P).id=De,!I.getElementsByName||!I.getElementsByName(De).length}),n.getById?(s.filter.ID=function(P){var O=P.replace(zt,Vt);return function(j){return j.getAttribute("id")===O}},s.find.ID=function(P,O){if(typeof O.getElementById!="undefined"&&ve){var j=O.getElementById(P);return j?[j]:[]}}):(s.filter.ID=function(P){var O=P.replace(zt,Vt);return function(j){var Q=typeof j.getAttributeNode!="undefined"&&j.getAttributeNode("id");return Q&&Q.value===O}},s.find.ID=function(P,O){if(typeof O.getElementById!="undefined"&&ve){var j,Q,J,ue=O.getElementById(P);if(ue){if(j=ue.getAttributeNode("id"),j&&j.value===P)return[ue];for(J=O.getElementsByName(P),Q=0;ue=J[Q++];)if(j=ue.getAttributeNode("id"),j&&j.value===P)return[ue]}return[]}}),s.find.TAG=n.getElementsByTagName?function(P,O){if(typeof O.getElementsByTagName!="undefined")return O.getElementsByTagName(P);if(n.qsa)return O.querySelectorAll(P)}:function(P,O){var j,Q=[],J=0,ue=O.getElementsByTagName(P);if(P==="*"){for(;j=ue[J++];)j.nodeType===1&&Q.push(j);return Q}return ue},s.find.CLASS=n.getElementsByClassName&&function(P,O){if(typeof O.getElementsByClassName!="undefined"&&ve)return O.getElementsByClassName(P)},qe=[],re=[],(n.qsa=ai.test(I.querySelectorAll))&&(St(function(P){var O;ie.appendChild(P).innerHTML="",P.querySelectorAll("[msallowcapture^='']").length&&re.push("[*^$]="+Ae+`*(?:''|"")`),P.querySelectorAll("[selected]").length||re.push("\\["+Ae+"*(?:value|"+Zn+")"),P.querySelectorAll("[id~="+De+"-]").length||re.push("~="),O=I.createElement("input"),O.setAttribute("name",""),P.appendChild(O),P.querySelectorAll("[name='']").length||re.push("\\["+Ae+"*name"+Ae+"*="+Ae+`*(?:''|"")`),P.querySelectorAll(":checked").length||re.push(":checked"),P.querySelectorAll("a#"+De+"+*").length||re.push(".#.+[+~]"),P.querySelectorAll("\\\f"),re.push("[\\r\\n\\f]")}),St(function(P){P.innerHTML="";var O=I.createElement("input");O.setAttribute("type","hidden"),P.appendChild(O).setAttribute("name","D"),P.querySelectorAll("[name=d]").length&&re.push("name"+Ae+"*[*^$|!~]?="),P.querySelectorAll(":enabled").length!==2&&re.push(":enabled",":disabled"),ie.appendChild(P).disabled=!0,P.querySelectorAll(":disabled").length!==2&&re.push(":enabled",":disabled"),P.querySelectorAll("*,:x"),re.push(",.*:")})),(n.matchesSelector=ai.test(Ve=ie.matches||ie.webkitMatchesSelector||ie.mozMatchesSelector||ie.oMatchesSelector||ie.msMatchesSelector))&&St(function(P){n.disconnectedMatch=Ve.call(P,"*"),Ve.call(P,"[s!='']:x"),qe.push("!=",ea)}),n.cssSupportsSelector||re.push(":has"),re=re.length&&new RegExp(re.join("|")),qe=qe.length&&new RegExp(qe.join("|")),w=ai.test(ie.compareDocumentPosition),ht=w||ai.test(ie.contains)?function(P,O){var j=P.nodeType===9&&P.documentElement||P,Q=O&&O.parentNode;return P===Q||!!(Q&&Q.nodeType===1&&(j.contains?j.contains(Q):P.compareDocumentPosition&&P.compareDocumentPosition(Q)&16))}:function(P,O){if(O){for(;O=O.parentNode;)if(O===P)return!0}return!1},dr=w?function(P,O){if(P===O)return U=!0,0;var j=!P.compareDocumentPosition-!O.compareDocumentPosition;return j||(j=(P.ownerDocument||P)==(O.ownerDocument||O)?P.compareDocumentPosition(O):1,j&1||!n.sortDetached&&O.compareDocumentPosition(P)===j?P==I||P.ownerDocument==me&&ht(me,P)?-1:O==I||O.ownerDocument==me&&ht(me,O)?1:R?pr(R,P)-pr(R,O):0:j&4?-1:1)}:function(P,O){if(P===O)return U=!0,0;var j,Q=0,J=P.parentNode,ue=O.parentNode,se=[P],he=[O];if(!J||!ue)return P==I?-1:O==I?1:J?-1:ue?1:R?pr(R,P)-pr(R,O):0;if(J===ue)return ws(P,O);for(j=P;j=j.parentNode;)se.unshift(j);for(j=O;j=j.parentNode;)he.unshift(j);for(;se[Q]===he[Q];)Q++;return Q?ws(se[Q],he[Q]):se[Q]==me?-1:he[Q]==me?1:0}),I},Re.matches=function(g,w){return Re(g,null,null,w)},Re.matchesSelector=function(g,w){if(F(g),n.matchesSelector&&ve&&!pt[w+" "]&&(!qe||!qe.test(w))&&(!re||!re.test(w)))try{var T=Ve.call(g,w);if(T||n.disconnectedMatch||g.document&&g.document.nodeType!==11)return T}catch(M){pt(w,!0)}return Re(w,I,null,[g]).length>0},Re.contains=function(g,w){return(g.ownerDocument||g)!=I&&F(g),ht(g,w)},Re.attr=function(g,w){(g.ownerDocument||g)!=I&&F(g);var T=s.attrHandle[w.toLowerCase()],M=T&&hr.call(s.attrHandle,w.toLowerCase())?T(g,w,!ve):void 0;return M!==void 0?M:n.attributes||!ve?g.getAttribute(w):(M=g.getAttributeNode(w))&&M.specified?M.value:null},Re.escape=function(g){return(g+"").replace(bs,ys)},Re.error=function(g){throw new Error("Syntax error, unrecognized expression: "+g)},Re.uniqueSort=function(g){var w,T=[],M=0,P=0;if(U=!n.detectDuplicates,R=!n.sortStable&&g.slice(0),g.sort(dr),U){for(;w=g[P++];)w===g[P]&&(M=T.push(P));for(;M--;)g.splice(T[M],1)}return R=null,g},c=Re.getText=function(g){var w,T="",M=0,P=g.nodeType;if(P){if(P===1||P===9||P===11){if(typeof g.textContent=="string")return g.textContent;for(g=g.firstChild;g;g=g.nextSibling)T+=c(g)}else if(P===3||P===4)return g.nodeValue}else for(;w=g[M++];)T+=c(w);return T},s=Re.selectors={cacheLength:50,createPseudo:kt,match:Qi,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(g){return g[1]=g[1].replace(zt,Vt),g[3]=(g[3]||g[4]||g[5]||"").replace(zt,Vt),g[2]==="~="&&(g[3]=" "+g[3]+" "),g.slice(0,4)},CHILD:function(g){return g[1]=g[1].toLowerCase(),g[1].slice(0,3)==="nth"?(g[3]||Re.error(g[0]),g[4]=+(g[4]?g[5]+(g[6]||1):2*(g[3]==="even"||g[3]==="odd")),g[5]=+(g[7]+g[8]||g[3]==="odd")):g[3]&&Re.error(g[0]),g},PSEUDO:function(g){var w,T=!g[6]&&g[2];return Qi.CHILD.test(g[0])?null:(g[3]?g[2]=g[4]||g[5]||"":T&&Go.test(T)&&(w=h(T,!0))&&(w=T.indexOf(")",T.length-w)-T.length)&&(g[0]=g[0].slice(0,w),g[2]=T.slice(0,w)),g.slice(0,3))}},filter:{TAG:function(g){var w=g.replace(zt,Vt).toLowerCase();return g==="*"?function(){return!0}:function(T){return T.nodeName&&T.nodeName.toLowerCase()===w}},CLASS:function(g){var w=Be[g+" "];return w||(w=new RegExp("(^|"+Ae+")"+g+"("+Ae+"|$)"))&&Be(g,function(T){return w.test(typeof T.className=="string"&&T.className||typeof T.getAttribute!="undefined"&&T.getAttribute("class")||"")})},ATTR:function(g,w,T){return function(M){var P=Re.attr(M,g);return P==null?w==="!=":w?(P+="",w==="="?P===T:w==="!="?P!==T:w==="^="?T&&P.indexOf(T)===0:w==="*="?T&&P.indexOf(T)>-1:w==="$="?T&&P.slice(-T.length)===T:w==="~="?(" "+P.replace(zo," ")+" ").indexOf(T)>-1:w==="|="?P===T||P.slice(0,T.length+1)===T+"-":!1):!0}},CHILD:function(g,w,T,M,P){var O=g.slice(0,3)!=="nth",j=g.slice(-4)!=="last",Q=w==="of-type";return M===1&&P===0?function(J){return!!J.parentNode}:function(J,ue,se){var he,we,Ie,ce,Ge,rt,gt=O!==j?"nextSibling":"previousSibling",Ne=J.parentNode,si=Q&&J.nodeName.toLowerCase(),oi=!se&&!Q,mt=!1;if(Ne){if(O){for(;gt;){for(ce=J;ce=ce[gt];)if(Q?ce.nodeName.toLowerCase()===si:ce.nodeType===1)return!1;rt=gt=g==="only"&&!rt&&"nextSibling"}return!0}if(rt=[j?Ne.firstChild:Ne.lastChild],j&&oi){for(ce=Ne,Ie=ce[De]||(ce[De]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),he=we[g]||[],Ge=he[0]===ut&&he[1],mt=Ge&&he[2],ce=Ge&&Ne.childNodes[Ge];ce=++Ge&&ce&&ce[gt]||(mt=Ge=0)||rt.pop();)if(ce.nodeType===1&&++mt&&ce===J){we[g]=[ut,Ge,mt];break}}else if(oi&&(ce=J,Ie=ce[De]||(ce[De]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),he=we[g]||[],Ge=he[0]===ut&&he[1],mt=Ge),mt===!1)for(;(ce=++Ge&&ce&&ce[gt]||(mt=Ge=0)||rt.pop())&&!((Q?ce.nodeName.toLowerCase()===si:ce.nodeType===1)&&++mt&&(oi&&(Ie=ce[De]||(ce[De]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),we[g]=[ut,mt]),ce===J)););return mt-=P,mt===M||mt%M==0&&mt/M>=0}}},PSEUDO:function(g,w){var T,M=s.pseudos[g]||s.setFilters[g.toLowerCase()]||Re.error("unsupported pseudo: "+g);return M[De]?M(w):M.length>1?(T=[g,g,"",w],s.setFilters.hasOwnProperty(g.toLowerCase())?kt(function(P,O){for(var j,Q=M(P,w),J=Q.length;J--;)j=pr(P,Q[J]),P[j]=!(O[j]=Q[J])}):function(P){return M(P,0,T)}):M}},pseudos:{not:kt(function(g){var w=[],T=[],M=E(g.replace(Xi,"$1"));return M[De]?kt(function(P,O,j,Q){for(var J,ue=M(P,null,Q,[]),se=P.length;se--;)(J=ue[se])&&(P[se]=!(O[se]=J))}):function(P,O,j){return w[0]=P,M(w,null,j,T),w[0]=null,!T.pop()}}),has:kt(function(g){return function(w){return Re(g,w).length>0}}),contains:kt(function(g){return g=g.replace(zt,Vt),function(w){return(w.textContent||c(w)).indexOf(g)>-1}}),lang:kt(function(g){return Yo.test(g||"")||Re.error("unsupported lang: "+g),g=g.replace(zt,Vt).toLowerCase(),function(w){var T;do if(T=ve?w.lang:w.getAttribute("xml:lang")||w.getAttribute("lang"))return T=T.toLowerCase(),T===g||T.indexOf(g+"-")===0;while((w=w.parentNode)&&w.nodeType===1);return!1}}),target:function(g){var w=e.location&&e.location.hash;return w&&w.slice(1)===g.id},root:function(g){return g===ie},focus:function(g){return g===I.activeElement&&(!I.hasFocus||I.hasFocus())&&!!(g.type||g.href||~g.tabIndex)},enabled:Es(!1),disabled:Es(!0),checked:function(g){var w=g.nodeName.toLowerCase();return w==="input"&&!!g.checked||w==="option"&&!!g.selected},selected:function(g){return g.parentNode&&g.parentNode.selectedIndex,g.selected===!0},empty:function(g){for(g=g.firstChild;g;g=g.nextSibling)if(g.nodeType<6)return!1;return!0},parent:function(g){return!s.pseudos.empty(g)},header:function(g){return Jo.test(g.nodeName)},input:function(g){return Qo.test(g.nodeName)},button:function(g){var w=g.nodeName.toLowerCase();return w==="input"&&g.type==="button"||w==="button"},text:function(g){var w;return g.nodeName.toLowerCase()==="input"&&g.type==="text"&&((w=g.getAttribute("type"))==null||w.toLowerCase()==="text")},first:mr(function(){return[0]}),last:mr(function(g,w){return[w-1]}),eq:mr(function(g,w,T){return[T<0?T+w:T]}),even:mr(function(g,w){for(var T=0;Tw?w:T;--M>=0;)g.push(M);return g}),gt:mr(function(g,w,T){for(var M=T<0?T+w:T;++M1?function(w,T,M){for(var P=g.length;P--;)if(!g[P](w,T,M))return!1;return!0}:g[0]}function rl(g,w,T){for(var M=0,P=w.length;M-1&&(j[se]=!(Q[se]=we))}}else Ne=en(Ne===Q?Ne.splice(Ge,Ne.length):Ne),P?P(null,Q,Ne,ue):tr.apply(Q,Ne)})}function sa(g){for(var w,T,M,P=g.length,O=s.relative[g[0].type],j=O||s.relative[" "],Q=O?1:0,J=Zi(function(he){return he===w},j,!0),ue=Zi(function(he){return pr(w,he)>-1},j,!0),se=[function(he,we,Ie){var ce=!O&&(Ie||we!==D)||((w=we).nodeType?J(he,we,Ie):ue(he,we,Ie));return w=null,ce}];Q1&&na(se),Q>1&&Ki(g.slice(0,Q-1).concat({value:g[Q-2].type===" "?"*":""})).replace(Xi,"$1"),T,Q0,M=g.length>0,P=function(O,j,Q,J,ue){var se,he,we,Ie=0,ce="0",Ge=O&&[],rt=[],gt=D,Ne=O||M&&s.find.TAG("*",ue),si=ut+=gt==null?1:Math.random()||.1,oi=Ne.length;for(ue&&(D=j==I||j||ue);ce!==oi&&(se=Ne[ce])!=null;ce++){if(M&&se){for(he=0,!j&&se.ownerDocument!=I&&(F(se),Q=!ve);we=g[he++];)if(we(se,j||I,Q)){J.push(se);break}ue&&(ut=si)}T&&((se=!we&&se)&&Ie--,O&&Ge.push(se))}if(Ie+=ce,T&&ce!==Ie){for(he=0;we=w[he++];)we(Ge,rt,j,Q);if(O){if(Ie>0)for(;ce--;)Ge[ce]||rt[ce]||(rt[ce]=er.call(J));rt=en(rt)}tr.apply(J,rt),ue&&!O&&rt.length>0&&Ie+w.length>1&&Re.uniqueSort(J)}return ue&&(ut=si,D=gt),Ge};return T?kt(P):P}return E=Re.compile=function(g,w){var T,M=[],P=[],O=Yi[g+" "];if(!O){for(w||(w=h(g)),T=w.length;T--;)O=sa(w[T]),O[De]?M.push(O):P.push(O);O=Yi(g,il(P,M)),O.selector=g}return O},x=Re.select=function(g,w,T,M){var P,O,j,Q,J,ue=typeof g=="function"&&g,se=!M&&h(g=ue.selector||g);if(T=T||[],se.length===1){if(O=se[0]=se[0].slice(0),O.length>2&&(j=O[0]).type==="ID"&&w.nodeType===9&&ve&&s.relative[O[1].type]){if(w=(s.find.ID(j.matches[0].replace(zt,Vt),w)||[])[0],w)ue&&(w=w.parentNode);else return T;g=g.slice(O.shift().value.length)}for(P=Qi.needsContext.test(g)?0:O.length;P--&&(j=O[P],!s.relative[Q=j.type]);)if((J=s.find[Q])&&(M=J(j.matches[0].replace(zt,Vt),ta.test(O[0].type)&&ia(w.parentNode)||w))){if(O.splice(P,1),g=M.length&&Ki(O),!g)return tr.apply(T,M),T;break}}return(ue||E(g,se))(M,w,!ve,T,!w||ta.test(g)&&ia(w.parentNode)||w),T},n.sortStable=De.split("").sort(dr).join("")===De,n.detectDuplicates=!!U,F(),n.sortDetached=St(function(g){return g.compareDocumentPosition(I.createElement("fieldset"))&1}),St(function(g){return g.innerHTML="",g.firstChild.getAttribute("href")==="#"})||ra("type|href|height|width",function(g,w,T){if(!T)return g.getAttribute(w,w.toLowerCase()==="type"?1:2)}),(!n.attributes||!St(function(g){return g.innerHTML="",g.firstChild.setAttribute("value",""),g.firstChild.getAttribute("value")===""}))&&ra("value",function(g,w,T){if(!T&&g.nodeName.toLowerCase()==="input")return g.defaultValue}),St(function(g){return g.getAttribute("disabled")==null})||ra(Zn,function(g,w,T){var M;if(!T)return g[w]===!0?w.toLowerCase():(M=g.getAttributeNode(w))&&M.specified?M.value:null}),Re}(l);o.find=ae,o.expr=ae.selectors,o.expr[":"]=o.expr.pseudos,o.uniqueSort=o.unique=ae.uniqueSort,o.text=ae.getText,o.isXMLDoc=ae.isXML,o.contains=ae.contains,o.escapeSelector=ae.escape;var oe=function(e,i,n){for(var s=[],c=n!==void 0;(e=e[i])&&e.nodeType!==9;)if(e.nodeType===1){if(c&&o(e).is(n))break;s.push(e)}return s},_e=function(e,i){for(var n=[];e;e=e.nextSibling)e.nodeType===1&&e!==i&&n.push(e);return n},ze=o.expr.match.needsContext;function Me(e,i){return e.nodeName&&e.nodeName.toLowerCase()===i.toLowerCase()}var nt=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ke(e,i,n){return V(i)?o.grep(e,function(s,c){return!!i.call(s,c,s)!==n}):i.nodeType?o.grep(e,function(s){return s===i!==n}):typeof i!="string"?o.grep(e,function(s){return b.call(i,s)>-1!==n}):o.filter(i,e,n)}o.filter=function(e,i,n){var s=i[0];return n&&(e=":not("+e+")"),i.length===1&&s.nodeType===1?o.find.matchesSelector(s,e)?[s]:[]:o.find.matches(e,o.grep(i,function(c){return c.nodeType===1}))},o.fn.extend({find:function(e){var i,n,s=this.length,c=this;if(typeof e!="string")return this.pushStack(o(e).filter(function(){for(i=0;i1?o.uniqueSort(n):n},filter:function(e){return this.pushStack(Ke(this,e||[],!1))},not:function(e){return this.pushStack(Ke(this,e||[],!0))},is:function(e){return!!Ke(this,typeof e=="string"&&ze.test(e)?o(e):e||[],!1).length}});var bt,nr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Sr=o.fn.init=function(e,i,n){var s,c;if(!e)return this;if(n=n||bt,typeof e=="string")if(e[0]==="<"&&e[e.length-1]===">"&&e.length>=3?s=[null,e,null]:s=nr.exec(e),s&&(s[1]||!i))if(s[1]){if(i=i instanceof o?i[0]:i,o.merge(this,o.parseHTML(s[1],i&&i.nodeType?i.ownerDocument||i:K,!0)),nt.test(s[1])&&o.isPlainObject(i))for(s in i)V(this[s])?this[s](i[s]):this.attr(s,i[s]);return this}else return c=K.getElementById(s[2]),c&&(this[0]=c,this.length=1),this;else return!i||i.jquery?(i||n).find(e):this.constructor(i).find(e);else{if(e.nodeType)return this[0]=e,this.length=1,this;if(V(e))return n.ready!==void 0?n.ready(e):e(o)}return o.makeArray(e,this)};Sr.prototype=o.fn,bt=o(K);var Nr=/^(?:parents|prev(?:Until|All))/,Qt={children:!0,contents:!0,next:!0,prev:!0};o.fn.extend({has:function(e){var i=o(e,this),n=i.length;return this.filter(function(){for(var s=0;s-1:n.nodeType===1&&o.find.matchesSelector(n,e))){f.push(n);break}}return this.pushStack(f.length>1?o.uniqueSort(f):f)},index:function(e){return e?typeof e=="string"?b.call(o(e),this[0]):b.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,i){return this.pushStack(o.uniqueSort(o.merge(this.get(),o(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function Or(e,i){for(;(e=e[i])&&e.nodeType!==1;);return e}o.each({parent:function(e){var i=e.parentNode;return i&&i.nodeType!==11?i:null},parents:function(e){return oe(e,"parentNode")},parentsUntil:function(e,i,n){return oe(e,"parentNode",n)},next:function(e){return Or(e,"nextSibling")},prev:function(e){return Or(e,"previousSibling")},nextAll:function(e){return oe(e,"nextSibling")},prevAll:function(e){return oe(e,"previousSibling")},nextUntil:function(e,i,n){return oe(e,"nextSibling",n)},prevUntil:function(e,i,n){return oe(e,"previousSibling",n)},siblings:function(e){return _e((e.parentNode||{}).firstChild,e)},children:function(e){return _e(e.firstChild)},contents:function(e){return e.contentDocument!=null&&a(e.contentDocument)?e.contentDocument:(Me(e,"template")&&(e=e.content||e),o.merge([],e.childNodes))}},function(e,i){o.fn[e]=function(n,s){var c=o.map(this,i,n);return e.slice(-5)!=="Until"&&(s=n),s&&typeof s=="string"&&(c=o.filter(s,c)),this.length>1&&(Qt[e]||o.uniqueSort(c),Nr.test(e)&&c.reverse()),this.pushStack(c)}});var yt=/[^\x20\t\r\n\f]+/g;function Ln(e){var i={};return o.each(e.match(yt)||[],function(n,s){i[s]=!0}),i}o.Callbacks=function(e){e=typeof e=="string"?Ln(e):o.extend({},e);var i,n,s,c,f=[],h=[],E=-1,x=function(){for(c=c||e.once,s=i=!0;h.length;E=-1)for(n=h.shift();++E-1;)f.splice(F,1),F<=E&&E--}),this},has:function(R){return R?o.inArray(R,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return c=h=[],f=n="",this},disabled:function(){return!f},lock:function(){return c=h=[],!n&&!i&&(f=n=""),this},locked:function(){return!!c},fireWith:function(R,U){return c||(U=U||[],U=[R,U.slice?U.slice():U],h.push(U),i||x()),this},fire:function(){return D.fireWith(this,arguments),this},fired:function(){return!!s}};return D};function Ze(e){return e}function ar(e){throw e}function Di(e,i,n,s){var c;try{e&&V(c=e.promise)?c.call(e).done(i).fail(n):e&&V(c=e.then)?c.call(e,i,n):i.apply(void 0,[e].slice(s))}catch(f){n.apply(void 0,[f])}}o.extend({Deferred:function(e){var i=[["notify","progress",o.Callbacks("memory"),o.Callbacks("memory"),2],["resolve","done",o.Callbacks("once memory"),o.Callbacks("once memory"),0,"resolved"],["reject","fail",o.Callbacks("once memory"),o.Callbacks("once memory"),1,"rejected"]],n="pending",s={state:function(){return n},always:function(){return c.done(arguments).fail(arguments),this},catch:function(f){return s.then(null,f)},pipe:function(){var f=arguments;return o.Deferred(function(h){o.each(i,function(E,x){var D=V(f[x[4]])&&f[x[4]];c[x[1]](function(){var R=D&&D.apply(this,arguments);R&&V(R.promise)?R.promise().progress(h.notify).done(h.resolve).fail(h.reject):h[x[0]+"With"](this,D?[R]:arguments)})}),f=null}).promise()},then:function(f,h,E){var x=0;function D(R,U,F,I){return function(){var ie=this,ve=arguments,re=function(){var Ve,ht;if(!(R=x&&(F!==ar&&(ie=void 0,ve=[Ve]),U.rejectWith(ie,ve))}};R?qe():(o.Deferred.getStackHook&&(qe.stackTrace=o.Deferred.getStackHook()),l.setTimeout(qe))}}return o.Deferred(function(R){i[0][3].add(D(0,R,V(E)?E:Ze,R.notifyWith)),i[1][3].add(D(0,R,V(f)?f:Ze)),i[2][3].add(D(0,R,V(h)?h:ar))}).promise()},promise:function(f){return f!=null?o.extend(f,s):s}},c={};return o.each(i,function(f,h){var E=h[2],x=h[5];s[h[1]]=E.add,x&&E.add(function(){n=x},i[3-f][2].disable,i[3-f][3].disable,i[0][2].lock,i[0][3].lock),E.add(h[3].fire),c[h[0]]=function(){return c[h[0]+"With"](this===c?void 0:this,arguments),this},c[h[0]+"With"]=E.fireWith}),s.promise(c),e&&e.call(c,c),c},when:function(e){var i=arguments.length,n=i,s=Array(n),c=u.call(arguments),f=o.Deferred(),h=function(E){return function(x){s[E]=this,c[E]=arguments.length>1?u.call(arguments):x,--i||f.resolveWith(s,c)}};if(i<=1&&(Di(e,f.done(h(n)).resolve,f.reject,!i),f.state()==="pending"||V(c[n]&&c[n].then)))return f.then();for(;n--;)Di(c[n],h(n),f.reject);return f.promise()}});var Fn=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;o.Deferred.exceptionHook=function(e,i){l.console&&l.console.warn&&e&&Fn.test(e.name)&&l.console.warn("jQuery.Deferred exception: "+e.message,e.stack,i)},o.readyException=function(e){l.setTimeout(function(){throw e})};var $r=o.Deferred();o.fn.ready=function(e){return $r.then(e).catch(function(i){o.readyException(i)}),this},o.extend({isReady:!1,readyWait:1,ready:function(e){(e===!0?--o.readyWait:o.isReady)||(o.isReady=!0,!(e!==!0&&--o.readyWait>0)&&$r.resolveWith(K,[o]))}}),o.ready.then=$r.then;function _r(){K.removeEventListener("DOMContentLoaded",_r),l.removeEventListener("load",_r),o.ready()}K.readyState==="complete"||K.readyState!=="loading"&&!K.documentElement.doScroll?l.setTimeout(o.ready):(K.addEventListener("DOMContentLoaded",_r),l.addEventListener("load",_r));var Ct=function(e,i,n,s,c,f,h){var E=0,x=e.length,D=n==null;if(be(n)==="object"){c=!0;for(E in n)Ct(e,i,E,n[E],!0,f,h)}else if(s!==void 0&&(c=!0,V(s)||(h=!0),D&&(h?(i.call(e,s),i=null):(D=i,i=function(R,U,F){return D.call(o(R),F)})),i))for(;E1,null,!0)},removeData:function(e){return this.each(function(){$e.remove(this,e)})}}),o.extend({queue:function(e,i,n){var s;if(e)return i=(i||"fx")+"queue",s=le.get(e,i),n&&(!s||Array.isArray(n)?s=le.access(e,i,o.makeArray(n)):s.push(n)),s||[]},dequeue:function(e,i){i=i||"fx";var n=o.queue(e,i),s=n.length,c=n.shift(),f=o._queueHooks(e,i),h=function(){o.dequeue(e,i)};c==="inprogress"&&(c=n.shift(),s--),c&&(i==="fx"&&n.unshift("inprogress"),delete f.stop,c.call(e,h,f)),!s&&f&&f.empty.fire()},_queueHooks:function(e,i){var n=i+"queueHooks";return le.get(e,n)||le.access(e,n,{empty:o.Callbacks("once memory").add(function(){le.remove(e,[i+"queue",n])})})}}),o.fn.extend({queue:function(e,i){var n=2;return typeof e!="string"&&(i=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,jr=/^$|^module$|\/(?:java|ecma)script/i;(function(){var e=K.createDocumentFragment(),i=e.appendChild(K.createElement("div")),n=K.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),i.appendChild(n),H.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,i.innerHTML="",H.noCloneChecked=!!i.cloneNode(!0).lastChild.defaultValue,i.innerHTML="",H.option=!!i.lastChild})();var et={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};et.tbody=et.tfoot=et.colgroup=et.caption=et.thead,et.th=et.td,H.option||(et.optgroup=et.option=[1,""]);function tt(e,i){var n;return typeof e.getElementsByTagName!="undefined"?n=e.getElementsByTagName(i||"*"):typeof e.querySelectorAll!="undefined"?n=e.querySelectorAll(i||"*"):n=[],i===void 0||i&&Me(e,i)?o.merge([e],n):n}function Hr(e,i){for(var n=0,s=e.length;n-1){c&&c.push(f);continue}if(D=Wt(f),h=tt(U.appendChild(f),"script"),D&&Hr(h),n)for(R=0;f=h[R++];)jr.test(f.type||"")&&n.push(f)}return U}var Ii=/^([^.]*)(?:\.(.+)|)/;function at(){return!0}function Kt(){return!1}function On(e,i){return e===Mi()==(i==="focus")}function Mi(){try{return K.activeElement}catch(e){}}function qr(e,i,n,s,c,f){var h,E;if(typeof i=="object"){typeof n!="string"&&(s=s||n,n=void 0);for(E in i)qr(e,E,n,s,i[E],f);return e}if(s==null&&c==null?(c=n,s=n=void 0):c==null&&(typeof n=="string"?(c=s,s=void 0):(c=s,s=n,n=void 0)),c===!1)c=Kt;else if(!c)return e;return f===1&&(h=c,c=function(x){return o().off(x),h.apply(this,arguments)},c.guid=h.guid||(h.guid=o.guid++)),e.each(function(){o.event.add(this,i,c,s,n)})}o.event={global:{},add:function(e,i,n,s,c){var f,h,E,x,D,R,U,F,I,ie,ve,re=le.get(e);if(!!sr(e))for(n.handler&&(f=n,n=f.handler,c=f.selector),c&&o.find.matchesSelector(Lt,c),n.guid||(n.guid=o.guid++),(x=re.events)||(x=re.events=Object.create(null)),(h=re.handle)||(h=re.handle=function(qe){return typeof o!="undefined"&&o.event.triggered!==qe.type?o.event.dispatch.apply(e,arguments):void 0}),i=(i||"").match(yt)||[""],D=i.length;D--;)E=Ii.exec(i[D])||[],I=ve=E[1],ie=(E[2]||"").split(".").sort(),!!I&&(U=o.event.special[I]||{},I=(c?U.delegateType:U.bindType)||I,U=o.event.special[I]||{},R=o.extend({type:I,origType:ve,data:s,handler:n,guid:n.guid,selector:c,needsContext:c&&o.expr.match.needsContext.test(c),namespace:ie.join(".")},f),(F=x[I])||(F=x[I]=[],F.delegateCount=0,(!U.setup||U.setup.call(e,s,ie,h)===!1)&&e.addEventListener&&e.addEventListener(I,h)),U.add&&(U.add.call(e,R),R.handler.guid||(R.handler.guid=n.guid)),c?F.splice(F.delegateCount++,0,R):F.push(R),o.event.global[I]=!0)},remove:function(e,i,n,s,c){var f,h,E,x,D,R,U,F,I,ie,ve,re=le.hasData(e)&&le.get(e);if(!(!re||!(x=re.events))){for(i=(i||"").match(yt)||[""],D=i.length;D--;){if(E=Ii.exec(i[D])||[],I=ve=E[1],ie=(E[2]||"").split(".").sort(),!I){for(I in x)o.event.remove(e,I+i[D],n,s,!0);continue}for(U=o.event.special[I]||{},I=(s?U.delegateType:U.bindType)||I,F=x[I]||[],E=E[2]&&new RegExp("(^|\\.)"+ie.join("\\.(?:.*\\.|)")+"(\\.|$)"),h=f=F.length;f--;)R=F[f],(c||ve===R.origType)&&(!n||n.guid===R.guid)&&(!E||E.test(R.namespace))&&(!s||s===R.selector||s==="**"&&R.selector)&&(F.splice(f,1),R.selector&&F.delegateCount--,U.remove&&U.remove.call(e,R));h&&!F.length&&((!U.teardown||U.teardown.call(e,ie,re.handle)===!1)&&o.removeEvent(e,I,re.handle),delete x[I])}o.isEmptyObject(x)&&le.remove(e,"handle events")}},dispatch:function(e){var i,n,s,c,f,h,E=new Array(arguments.length),x=o.event.fix(e),D=(le.get(this,"events")||Object.create(null))[x.type]||[],R=o.event.special[x.type]||{};for(E[0]=x,i=1;i=1)){for(;D!==this;D=D.parentNode||this)if(D.nodeType===1&&!(e.type==="click"&&D.disabled===!0)){for(f=[],h={},n=0;n-1:o.find(c,this,null,[D]).length),h[c]&&f.push(s);f.length&&E.push({elem:D,handlers:f})}}return D=this,x\s*$/g;function Ni(e,i){return Me(e,"table")&&Me(i.nodeType!==11?i:i.firstChild,"tr")&&o(e).children("tbody")[0]||e}function Un(e){return e.type=(e.getAttribute("type")!==null)+"/"+e.type,e}function jn(e){return(e.type||"").slice(0,5)==="true/"?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oi(e,i){var n,s,c,f,h,E,x;if(i.nodeType===1){if(le.hasData(e)&&(f=le.get(e),x=f.events,x)){le.remove(i,"handle events");for(c in x)for(n=0,s=x[c].length;n1&&typeof I=="string"&&!H.checkClone&&Wn.test(I))return e.each(function(ve){var re=e.eq(ve);ie&&(i[0]=I.call(this,ve,re.html())),Ut(re,i,n,s)});if(U&&(c=Vr(i,e[0].ownerDocument,!1,e,s),f=c.firstChild,c.childNodes.length===1&&(c=f),f||s)){for(h=o.map(tt(c,"script"),Un),E=h.length;R0&&Hr(h,!x&&tt(e,"script")),E},cleanData:function(e){for(var i,n,s,c=o.event.special,f=0;(n=e[f])!==void 0;f++)if(sr(n)){if(i=n[le.expando]){if(i.events)for(s in i.events)c[s]?o.event.remove(n,s):o.removeEvent(n,s,i.handle);n[le.expando]=void 0}n[$e.expando]&&(n[$e.expando]=void 0)}}}),o.fn.extend({detach:function(e){return $i(this,e,!0)},remove:function(e){return $i(this,e)},text:function(e){return Ct(this,function(i){return i===void 0?o.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=i)})},null,e,arguments.length)},append:function(){return Ut(this,arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=Ni(this,e);i.appendChild(e)}})},prepend:function(){return Ut(this,arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=Ni(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return Ut(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ut(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,i=0;(e=this[i])!=null;i++)e.nodeType===1&&(o.cleanData(tt(e,!1)),e.textContent="");return this},clone:function(e,i){return e=e==null?!1:e,i=i==null?e:i,this.map(function(){return o.clone(this,e,i)})},html:function(e){return Ct(this,function(i){var n=this[0]||{},s=0,c=this.length;if(i===void 0&&n.nodeType===1)return n.innerHTML;if(typeof i=="string"&&!$n.test(i)&&!et[(Ur.exec(i)||["",""])[1].toLowerCase()]){i=o.htmlPrefilter(i);try{for(;s=0&&(x+=Math.max(0,Math.ceil(e["offset"+i[0].toUpperCase()+i.slice(1)]-f-x-E-.5))||0),x}function fr(e,i,n){var s=Ar(e),c=!H.boxSizingReliable()||n,f=c&&o.css(e,"boxSizing",!1,s)==="border-box",h=f,E=ur(e,i,s),x="offset"+i[0].toUpperCase()+i.slice(1);if(Gr.test(E)){if(!n)return E;E="auto"}return(!H.boxSizingReliable()&&f||!H.reliableTrDimensions()&&Me(e,"tr")||E==="auto"||!parseFloat(E)&&o.css(e,"display",!1,s)==="inline")&&e.getClientRects().length&&(f=o.css(e,"boxSizing",!1,s)==="border-box",h=x in e,h&&(E=e[x])),E=parseFloat(E)||0,E+Jr(e,i,n||(f?"border":"content"),h,s,E)+"px"}o.extend({cssHooks:{opacity:{get:function(e,i){if(i){var n=ur(e,"opacity");return n===""?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,i,n,s){if(!(!e||e.nodeType===3||e.nodeType===8||!e.style)){var c,f,h,E=xt(i),x=Yr.test(i),D=e.style;if(x||(i=Xr(E)),h=o.cssHooks[i]||o.cssHooks[E],n!==void 0){if(f=typeof n,f==="string"&&(c=$t.exec(n))&&c[1]&&(n=Wr(e,i,c),f="number"),n==null||n!==n)return;f==="number"&&!x&&(n+=c&&c[3]||(o.cssNumber[E]?"":"px")),!H.clearCloneStyle&&n===""&&i.indexOf("background")===0&&(D[i]="inherit"),(!h||!("set"in h)||(n=h.set(e,n,s))!==void 0)&&(x?D.setProperty(i,n):D[i]=n)}else return h&&"get"in h&&(c=h.get(e,!1,s))!==void 0?c:D[i]}},css:function(e,i,n,s){var c,f,h,E=xt(i),x=Yr.test(i);return x||(i=Xr(E)),h=o.cssHooks[i]||o.cssHooks[E],h&&"get"in h&&(c=h.get(e,!0,n)),c===void 0&&(c=ur(e,i,s)),c==="normal"&&i in Qr&&(c=Qr[i]),n===""||n?(f=parseFloat(c),n===!0||isFinite(f)?f||0:c):c}}),o.each(["height","width"],function(e,i){o.cssHooks[i]={get:function(n,s,c){if(s)return Vi.test(o.css(n,"display"))&&(!n.getClientRects().length||!n.getBoundingClientRect().width)?Wi(n,cr,function(){return fr(n,i,c)}):fr(n,i,c)},set:function(n,s,c){var f,h=Ar(n),E=!H.scrollboxSize()&&h.position==="absolute",x=E||c,D=x&&o.css(n,"boxSizing",!1,h)==="border-box",R=c?Jr(n,i,c,D,h):0;return D&&E&&(R-=Math.ceil(n["offset"+i[0].toUpperCase()+i.slice(1)]-parseFloat(h[i])-Jr(n,i,"border",!1,h)-.5)),R&&(f=$t.exec(s))&&(f[3]||"px")!=="px"&&(n.style[i]=s,s=o.css(n,i)),jt(n,s,R)}}}),o.cssHooks.marginLeft=Ui(H.reliableMarginLeft,function(e,i){if(i)return(parseFloat(ur(e,"marginLeft"))||e.getBoundingClientRect().left-Wi(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),o.each({margin:"",padding:"",border:"Width"},function(e,i){o.cssHooks[e+i]={expand:function(n){for(var s=0,c={},f=typeof n=="string"?n.split(" "):[n];s<4;s++)c[e+wt[s]+i]=f[s]||f[s-2]||f[0];return c}},e!=="margin"&&(o.cssHooks[e+i].set=jt)}),o.fn.extend({css:function(e,i){return Ct(this,function(n,s,c){var f,h,E={},x=0;if(Array.isArray(s)){for(f=Ar(n),h=s.length;x1)}});function Qe(e,i,n,s,c){return new Qe.prototype.init(e,i,n,s,c)}o.Tween=Qe,Qe.prototype={constructor:Qe,init:function(e,i,n,s,c,f){this.elem=e,this.prop=n,this.easing=c||o.easing._default,this.options=i,this.start=this.now=this.cur(),this.end=s,this.unit=f||(o.cssNumber[n]?"":"px")},cur:function(){var e=Qe.propHooks[this.prop];return e&&e.get?e.get(this):Qe.propHooks._default.get(this)},run:function(e){var i,n=Qe.propHooks[this.prop];return this.options.duration?this.pos=i=o.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=i=e,this.now=(this.end-this.start)*i+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Qe.propHooks._default.set(this),this}},Qe.prototype.init.prototype=Qe.prototype,Qe.propHooks={_default:{get:function(e){var i;return e.elem.nodeType!==1||e.elem[e.prop]!=null&&e.elem.style[e.prop]==null?e.elem[e.prop]:(i=o.css(e.elem,e.prop,""),!i||i==="auto"?0:i)},set:function(e){o.fx.step[e.prop]?o.fx.step[e.prop](e):e.elem.nodeType===1&&(o.cssHooks[e.prop]||e.elem.style[Xr(e.prop)]!=null)?o.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Qe.propHooks.scrollTop=Qe.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},o.easing={linear:function(e){return e},swing:function(e){return .5-Math.cos(e*Math.PI)/2},_default:"swing"},o.fx=Qe.prototype.init,o.fx.step={};var Zt,Dr,Kr=/^(?:toggle|show|hide)$/,Gn=/queueHooks$/;function Zr(){Dr&&(K.hidden===!1&&l.requestAnimationFrame?l.requestAnimationFrame(Zr):l.setTimeout(Zr,o.fx.interval),o.fx.tick())}function p(){return l.setTimeout(function(){Zt=void 0}),Zt=Date.now()}function S(e,i){var n,s=0,c={height:e};for(i=i?1:0;s<4;s+=2-i)n=wt[s],c["margin"+n]=c["padding"+n]=e;return i&&(c.opacity=c.width=e),c}function v(e,i,n){for(var s,c=(_.tweeners[i]||[]).concat(_.tweeners["*"]),f=0,h=c.length;f1)},removeAttr:function(e){return this.each(function(){o.removeAttr(this,e)})}}),o.extend({attr:function(e,i,n){var s,c,f=e.nodeType;if(!(f===3||f===8||f===2)){if(typeof e.getAttribute=="undefined")return o.prop(e,i,n);if((f!==1||!o.isXMLDoc(e))&&(c=o.attrHooks[i.toLowerCase()]||(o.expr.match.bool.test(i)?N:void 0)),n!==void 0){if(n===null){o.removeAttr(e,i);return}return c&&"set"in c&&(s=c.set(e,n,i))!==void 0?s:(e.setAttribute(i,n+""),n)}return c&&"get"in c&&(s=c.get(e,i))!==null?s:(s=o.find.attr(e,i),s==null?void 0:s)}},attrHooks:{type:{set:function(e,i){if(!H.radioValue&&i==="radio"&&Me(e,"input")){var n=e.value;return e.setAttribute("type",i),n&&(e.value=n),i}}}},removeAttr:function(e,i){var n,s=0,c=i&&i.match(yt);if(c&&e.nodeType===1)for(;n=c[s++];)e.removeAttribute(n)}}),N={set:function(e,i,n){return i===!1?o.removeAttr(e,n):e.setAttribute(n,n),n}},o.each(o.expr.match.bool.source.match(/\w+/g),function(e,i){var n=B[i]||o.find.attr;B[i]=function(s,c,f){var h,E,x=c.toLowerCase();return f||(E=B[x],B[x]=h,h=n(s,c,f)!=null?x:null,B[x]=E),h}});var q=/^(?:input|select|textarea|button)$/i,G=/^(?:a|area)$/i;o.fn.extend({prop:function(e,i){return Ct(this,o.prop,e,i,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[o.propFix[e]||e]})}}),o.extend({prop:function(e,i,n){var s,c,f=e.nodeType;if(!(f===3||f===8||f===2))return(f!==1||!o.isXMLDoc(e))&&(i=o.propFix[i]||i,c=o.propHooks[i]),n!==void 0?c&&"set"in c&&(s=c.set(e,n,i))!==void 0?s:e[i]=n:c&&"get"in c&&(s=c.get(e,i))!==null?s:e[i]},propHooks:{tabIndex:{get:function(e){var i=o.find.attr(e,"tabindex");return i?parseInt(i,10):q.test(e.nodeName)||G.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),H.optSelected||(o.propHooks.selected={get:function(e){var i=e.parentNode;return i&&i.parentNode&&i.parentNode.selectedIndex,null},set:function(e){var i=e.parentNode;i&&(i.selectedIndex,i.parentNode&&i.parentNode.selectedIndex)}}),o.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){o.propFix[this.toLowerCase()]=this});function Y(e){var i=e.match(yt)||[];return i.join(" ")}function Z(e){return e.getAttribute&&e.getAttribute("class")||""}function ye(e){return Array.isArray(e)?e:typeof e=="string"?e.match(yt)||[]:[]}o.fn.extend({addClass:function(e){var i,n,s,c,f,h;return V(e)?this.each(function(E){o(this).addClass(e.call(this,E,Z(this)))}):(i=ye(e),i.length?this.each(function(){if(s=Z(this),n=this.nodeType===1&&" "+Y(s)+" ",n){for(f=0;f-1;)n=n.replace(" "+c+" "," ");h=Y(n),s!==h&&this.setAttribute("class",h)}}):this):this.attr("class","")},toggleClass:function(e,i){var n,s,c,f,h=typeof e,E=h==="string"||Array.isArray(e);return V(e)?this.each(function(x){o(this).toggleClass(e.call(this,x,Z(this),i),i)}):typeof i=="boolean"&&E?i?this.addClass(e):this.removeClass(e):(n=ye(e),this.each(function(){if(E)for(f=o(this),c=0;c-1)return!0;return!1}});var ke=/\r/g;o.fn.extend({val:function(e){var i,n,s,c=this[0];return arguments.length?(s=V(e),this.each(function(f){var h;this.nodeType===1&&(s?h=e.call(this,f,o(this).val()):h=e,h==null?h="":typeof h=="number"?h+="":Array.isArray(h)&&(h=o.map(h,function(E){return E==null?"":E+""})),i=o.valHooks[this.type]||o.valHooks[this.nodeName.toLowerCase()],(!i||!("set"in i)||i.set(this,h,"value")===void 0)&&(this.value=h))})):c?(i=o.valHooks[c.type]||o.valHooks[c.nodeName.toLowerCase()],i&&"get"in i&&(n=i.get(c,"value"))!==void 0?n:(n=c.value,typeof n=="string"?n.replace(ke,""):n==null?"":n)):void 0}}),o.extend({valHooks:{option:{get:function(e){var i=o.find.attr(e,"value");return i!=null?i:Y(o.text(e))}},select:{get:function(e){var i,n,s,c=e.options,f=e.selectedIndex,h=e.type==="select-one",E=h?null:[],x=h?f+1:c.length;for(f<0?s=x:s=h?f:0;s-1)&&(n=!0);return n||(e.selectedIndex=-1),f}}}}),o.each(["radio","checkbox"],function(){o.valHooks[this]={set:function(e,i){if(Array.isArray(i))return e.checked=o.inArray(o(e).val(),i)>-1}},H.checkOn||(o.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value})}),H.focusin="onfocusin"in l;var Pe=/^(?:focusinfocus|focusoutblur)$/,We=function(e){e.stopPropagation()};o.extend(o.event,{trigger:function(e,i,n,s){var c,f,h,E,x,D,R,U,F=[n||K],I=W.call(e,"type")?e.type:e,ie=W.call(e,"namespace")?e.namespace.split("."):[];if(f=U=h=n=n||K,!(n.nodeType===3||n.nodeType===8)&&!Pe.test(I+o.event.triggered)&&(I.indexOf(".")>-1&&(ie=I.split("."),I=ie.shift(),ie.sort()),x=I.indexOf(":")<0&&"on"+I,e=e[o.expando]?e:new o.Event(I,typeof e=="object"&&e),e.isTrigger=s?2:3,e.namespace=ie.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+ie.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),i=i==null?[e]:o.makeArray(i,[e]),R=o.event.special[I]||{},!(!s&&R.trigger&&R.trigger.apply(n,i)===!1))){if(!s&&!R.noBubble&&!de(n)){for(E=R.delegateType||I,Pe.test(E+I)||(f=f.parentNode);f;f=f.parentNode)F.push(f),h=f;h===(n.ownerDocument||K)&&F.push(h.defaultView||h.parentWindow||l)}for(c=0;(f=F[c++])&&!e.isPropagationStopped();)U=f,e.type=c>1?E:R.bindType||I,D=(le.get(f,"events")||Object.create(null))[e.type]&&le.get(f,"handle"),D&&D.apply(f,i),D=x&&f[x],D&&D.apply&&sr(f)&&(e.result=D.apply(f,i),e.result===!1&&e.preventDefault());return e.type=I,!s&&!e.isDefaultPrevented()&&(!R._default||R._default.apply(F.pop(),i)===!1)&&sr(n)&&x&&V(n[I])&&!de(n)&&(h=n[x],h&&(n[x]=null),o.event.triggered=I,e.isPropagationStopped()&&U.addEventListener(I,We),n[I](),e.isPropagationStopped()&&U.removeEventListener(I,We),o.event.triggered=void 0,h&&(n[x]=h)),e.result}},simulate:function(e,i,n){var s=o.extend(new o.Event,n,{type:e,isSimulated:!0});o.event.trigger(s,null,i)}}),o.fn.extend({trigger:function(e,i){return this.each(function(){o.event.trigger(e,i,this)})},triggerHandler:function(e,i){var n=this[0];if(n)return o.event.trigger(e,i,n,!0)}}),H.focusin||o.each({focus:"focusin",blur:"focusout"},function(e,i){var n=function(s){o.event.simulate(i,s.target,o.event.fix(s))};o.event.special[i]={setup:function(){var s=this.ownerDocument||this.document||this,c=le.access(s,i);c||s.addEventListener(e,n,!0),le.access(s,i,(c||0)+1)},teardown:function(){var s=this.ownerDocument||this.document||this,c=le.access(s,i)-1;c?le.access(s,i,c):(s.removeEventListener(e,n,!0),le.remove(s,i))}}});var Fe=l.location,st={guid:Date.now()},Ht=/\?/;o.parseXML=function(e){var i,n;if(!e||typeof e!="string")return null;try{i=new l.DOMParser().parseFromString(e,"text/xml")}catch(s){}return n=i&&i.getElementsByTagName("parsererror")[0],(!i||n)&&o.error("Invalid XML: "+(n?o.map(n.childNodes,function(s){return s.textContent}).join(` `):e)),i};var ei=/\[\]$/,qi=/\r?\n/g,ti=/^(?:submit|button|image|reset|file)$/i,us=/^(?:input|select|textarea|keygen)/i;function ri(e,i,n,s){var c;if(Array.isArray(i))o.each(i,function(f,h){n||ei.test(e)?s(e,h):ri(e+"["+(typeof h=="object"&&h!=null?f:"")+"]",h,n,s)});else if(!n&&be(i)==="object")for(c in i)ri(e+"["+c+"]",i[c],n,s);else s(e,i)}o.param=function(e,i){var n,s=[],c=function(f,h){var E=V(h)?h():h;s[s.length]=encodeURIComponent(f)+"="+encodeURIComponent(E==null?"":E)};if(e==null)return"";if(Array.isArray(e)||e.jquery&&!o.isPlainObject(e))o.each(e,function(){c(this.name,this.value)});else for(n in e)ri(n,e[n],i,c);return s.join("&")},o.fn.extend({serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=o.prop(this,"elements");return e?o.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!o(this).is(":disabled")&&us.test(this.nodeName)&&!ti.test(e)&&(this.checked||!Jt.test(e))}).map(function(e,i){var n=o(this).val();return n==null?null:Array.isArray(n)?o.map(n,function(s){return{name:i.name,value:s.replace(qi,`\r `)}}):{name:i.name,value:n.replace(qi,`\r `)}}).get()}});var Yn=/%20/g,Gi=/#.*$/,Ro=/([?&])_=[^&]*/,Io=/^(.*?):[ \t]*([^\r\n]*)$/mg,Mo=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,No=/^(?:GET|HEAD)$/,Oo=/^\/\//,cs={},Xn={},fs="*/".concat("*"),Qn=K.createElement("a");Qn.href=Fe.href;function ds(e){return function(i,n){typeof i!="string"&&(n=i,i="*");var s,c=0,f=i.toLowerCase().match(yt)||[];if(V(n))for(;s=f[c++];)s[0]==="+"?(s=s.slice(1)||"*",(e[s]=e[s]||[]).unshift(n)):(e[s]=e[s]||[]).push(n)}}function hs(e,i,n,s){var c={},f=e===Xn;function h(E){var x;return c[E]=!0,o.each(e[E]||[],function(D,R){var U=R(i,n,s);if(typeof U=="string"&&!f&&!c[U])return i.dataTypes.unshift(U),h(U),!1;if(f)return!(x=U)}),x}return h(i.dataTypes[0])||!c["*"]&&h("*")}function Jn(e,i){var n,s,c=o.ajaxSettings.flatOptions||{};for(n in i)i[n]!==void 0&&((c[n]?e:s||(s={}))[n]=i[n]);return s&&o.extend(!0,e,s),e}function $o(e,i,n){for(var s,c,f,h,E=e.contents,x=e.dataTypes;x[0]==="*";)x.shift(),s===void 0&&(s=e.mimeType||i.getResponseHeader("Content-Type"));if(s){for(c in E)if(E[c]&&E[c].test(s)){x.unshift(c);break}}if(x[0]in n)f=x[0];else{for(c in n){if(!x[0]||e.converters[c+" "+x[0]]){f=c;break}h||(h=c)}f=f||h}if(f)return f!==x[0]&&x.unshift(f),n[f]}function Wo(e,i,n,s){var c,f,h,E,x,D={},R=e.dataTypes.slice();if(R[1])for(h in e.converters)D[h.toLowerCase()]=e.converters[h];for(f=R.shift();f;)if(e.responseFields[f]&&(n[e.responseFields[f]]=i),!x&&s&&e.dataFilter&&(i=e.dataFilter(i,e.dataType)),x=f,f=R.shift(),f){if(f==="*")f=x;else if(x!=="*"&&x!==f){if(h=D[x+" "+f]||D["* "+f],!h){for(c in D)if(E=c.split(" "),E[1]===f&&(h=D[x+" "+E[0]]||D["* "+E[0]],h)){h===!0?h=D[c]:D[c]!==!0&&(f=E[0],R.unshift(E[1]));break}}if(h!==!0)if(h&&e.throws)i=h(i);else try{i=h(i)}catch(U){return{state:"parsererror",error:h?U:"No conversion from "+x+" to "+f}}}}return{state:"success",data:i}}o.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Fe.href,type:"GET",isLocal:Mo.test(Fe.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":fs,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":o.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,i){return i?Jn(Jn(e,o.ajaxSettings),i):Jn(o.ajaxSettings,e)},ajaxPrefilter:ds(cs),ajaxTransport:ds(Xn),ajax:function(e,i){typeof e=="object"&&(i=e,e=void 0),i=i||{};var n,s,c,f,h,E,x,D,R,U,F=o.ajaxSetup({},i),I=F.context||F,ie=F.context&&(I.nodeType||I.jquery)?o(I):o.event,ve=o.Deferred(),re=o.Callbacks("once memory"),qe=F.statusCode||{},Ve={},ht={},De="canceled",me={readyState:0,getResponseHeader:function(Te){var Be;if(x){if(!f)for(f={};Be=Io.exec(c);)f[Be[1].toLowerCase()+" "]=(f[Be[1].toLowerCase()+" "]||[]).concat(Be[2]);Be=f[Te.toLowerCase()+" "]}return Be==null?null:Be.join(", ")},getAllResponseHeaders:function(){return x?c:null},setRequestHeader:function(Te,Be){return x==null&&(Te=ht[Te.toLowerCase()]=ht[Te.toLowerCase()]||Te,Ve[Te]=Be),this},overrideMimeType:function(Te){return x==null&&(F.mimeType=Te),this},statusCode:function(Te){var Be;if(Te)if(x)me.always(Te[me.status]);else for(Be in Te)qe[Be]=[qe[Be],Te[Be]];return this},abort:function(Te){var Be=Te||De;return n&&n.abort(Be),ut(0,Be),this}};if(ve.promise(me),F.url=((e||F.url||Fe.href)+"").replace(Oo,Fe.protocol+"//"),F.type=i.method||i.type||F.method||F.type,F.dataTypes=(F.dataType||"*").toLowerCase().match(yt)||[""],F.crossDomain==null){E=K.createElement("a");try{E.href=F.url,E.href=E.href,F.crossDomain=Qn.protocol+"//"+Qn.host!=E.protocol+"//"+E.host}catch(Te){F.crossDomain=!0}}if(F.data&&F.processData&&typeof F.data!="string"&&(F.data=o.param(F.data,F.traditional)),hs(cs,F,i,me),x)return me;D=o.event&&F.global,D&&o.active++==0&&o.event.trigger("ajaxStart"),F.type=F.type.toUpperCase(),F.hasContent=!No.test(F.type),s=F.url.replace(Gi,""),F.hasContent?F.data&&F.processData&&(F.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&(F.data=F.data.replace(Yn,"+")):(U=F.url.slice(s.length),F.data&&(F.processData||typeof F.data=="string")&&(s+=(Ht.test(s)?"&":"?")+F.data,delete F.data),F.cache===!1&&(s=s.replace(Ro,"$1"),U=(Ht.test(s)?"&":"?")+"_="+st.guid+++U),F.url=s+U),F.ifModified&&(o.lastModified[s]&&me.setRequestHeader("If-Modified-Since",o.lastModified[s]),o.etag[s]&&me.setRequestHeader("If-None-Match",o.etag[s])),(F.data&&F.hasContent&&F.contentType!==!1||i.contentType)&&me.setRequestHeader("Content-Type",F.contentType),me.setRequestHeader("Accept",F.dataTypes[0]&&F.accepts[F.dataTypes[0]]?F.accepts[F.dataTypes[0]]+(F.dataTypes[0]!=="*"?", "+fs+"; q=0.01":""):F.accepts["*"]);for(R in F.headers)me.setRequestHeader(R,F.headers[R]);if(F.beforeSend&&(F.beforeSend.call(I,me,F)===!1||x))return me.abort();if(De="abort",re.add(F.complete),me.done(F.success),me.fail(F.error),n=hs(Xn,F,i,me),!n)ut(-1,"No Transport");else{if(me.readyState=1,D&&ie.trigger("ajaxSend",[me,F]),x)return me;F.async&&F.timeout>0&&(h=l.setTimeout(function(){me.abort("timeout")},F.timeout));try{x=!1,n.send(Ve,ut)}catch(Te){if(x)throw Te;ut(-1,Te)}}function ut(Te,Be,ni,Yi){var pt,dr,hr,ct,er,Et=Be;x||(x=!0,h&&l.clearTimeout(h),n=void 0,c=Yi||"",me.readyState=Te>0?4:0,pt=Te>=200&&Te<300||Te===304,ni&&(ct=$o(F,me,ni)),!pt&&o.inArray("script",F.dataTypes)>-1&&o.inArray("json",F.dataTypes)<0&&(F.converters["text script"]=function(){}),ct=Wo(F,ct,me,pt),pt?(F.ifModified&&(er=me.getResponseHeader("Last-Modified"),er&&(o.lastModified[s]=er),er=me.getResponseHeader("etag"),er&&(o.etag[s]=er)),Te===204||F.type==="HEAD"?Et="nocontent":Te===304?Et="notmodified":(Et=ct.state,dr=ct.data,hr=ct.error,pt=!hr)):(hr=Et,(Te||!Et)&&(Et="error",Te<0&&(Te=0))),me.status=Te,me.statusText=(Be||Et)+"",pt?ve.resolveWith(I,[dr,Et,me]):ve.rejectWith(I,[me,Et,hr]),me.statusCode(qe),qe=void 0,D&&ie.trigger(pt?"ajaxSuccess":"ajaxError",[me,F,pt?dr:hr]),re.fireWith(I,[me,Et]),D&&(ie.trigger("ajaxComplete",[me,F]),--o.active||o.event.trigger("ajaxStop")))}return me},getJSON:function(e,i,n){return o.get(e,i,n,"json")},getScript:function(e,i){return o.get(e,void 0,i,"script")}}),o.each(["get","post"],function(e,i){o[i]=function(n,s,c,f){return V(s)&&(f=f||c,c=s,s=void 0),o.ajax(o.extend({url:n,type:i,dataType:f,data:s,success:c},o.isPlainObject(n)&&n))}}),o.ajaxPrefilter(function(e){var i;for(i in e.headers)i.toLowerCase()==="content-type"&&(e.contentType=e.headers[i]||"")}),o._evalUrl=function(e,i,n){return o.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(s){o.globalEval(s,i,n)}})},o.fn.extend({wrapAll:function(e){var i;return this[0]&&(V(e)&&(e=e.call(this[0])),i=o(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&i.insertBefore(this[0]),i.map(function(){for(var n=this;n.firstElementChild;)n=n.firstElementChild;return n}).append(this)),this},wrapInner:function(e){return V(e)?this.each(function(i){o(this).wrapInner(e.call(this,i))}):this.each(function(){var i=o(this),n=i.contents();n.length?n.wrapAll(e):i.append(e)})},wrap:function(e){var i=V(e);return this.each(function(n){o(this).wrapAll(i?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){o(this).replaceWith(this.childNodes)}),this}}),o.expr.pseudos.hidden=function(e){return!o.expr.pseudos.visible(e)},o.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},o.ajaxSettings.xhr=function(){try{return new l.XMLHttpRequest}catch(e){}};var Bo={0:200,1223:204},ii=o.ajaxSettings.xhr();H.cors=!!ii&&"withCredentials"in ii,H.ajax=ii=!!ii,o.ajaxTransport(function(e){var i,n;if(H.cors||ii&&!e.crossDomain)return{send:function(s,c){var f,h=e.xhr();if(h.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(f in e.xhrFields)h[f]=e.xhrFields[f];e.mimeType&&h.overrideMimeType&&h.overrideMimeType(e.mimeType),!e.crossDomain&&!s["X-Requested-With"]&&(s["X-Requested-With"]="XMLHttpRequest");for(f in s)h.setRequestHeader(f,s[f]);i=function(E){return function(){i&&(i=n=h.onload=h.onerror=h.onabort=h.ontimeout=h.onreadystatechange=null,E==="abort"?h.abort():E==="error"?typeof h.status!="number"?c(0,"error"):c(h.status,h.statusText):c(Bo[h.status]||h.status,h.statusText,(h.responseType||"text")!=="text"||typeof h.responseText!="string"?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=i(),n=h.onerror=h.ontimeout=i("error"),h.onabort!==void 0?h.onabort=n:h.onreadystatechange=function(){h.readyState===4&&l.setTimeout(function(){i&&n()})},i=i("abort");try{h.send(e.hasContent&&e.data||null)}catch(E){if(i)throw E}},abort:function(){i&&i()}}}),o.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),o.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return o.globalEval(e),e}}}),o.ajaxPrefilter("script",function(e){e.cache===void 0&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),o.ajaxTransport("script",function(e){if(e.crossDomain||e.scriptAttrs){var i,n;return{send:function(s,c){i=o("