diff --git a/gen/atari7800-5KKGRW7B.js b/gen/atari7800-5KKGRW7B.js new file mode 100644 index 00000000..63b89e6e --- /dev/null +++ b/gen/atari7800-5KKGRW7B.js @@ -0,0 +1,7 @@ +import{I as z,h as W,k as N,p as F,t as H}from"./chunk-HB3LWF25.js";import{$ as I,J as B,U as M,V as f,W as O,Y as U,_ as E,da as _,g}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.js";var d=0,L=2,P=8,X=U([[f.A,P+0,128],[f.B,P+1,128],[f.SELECT,L,-2],[f.START,L,-1],[f.UP,d,-16],[f.DOWN,d,-32],[f.LEFT,d,-64],[f.RIGHT,d,-128],[f.P2_A,P+2,128],[f.P2_B,P+3,128],[f.P2_UP,d,-1],[f.P2_DOWN,d,-2],[f.P2_LEFT,d,-4],[f.P2_RIGHT,d,-8]]);var D=263,K=258-16,b=451,j=28,q=16,J=24,Y=2,$=D*60*Y,T=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+=M(t.regs,0,32),e}},k=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.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}}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}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){if(this.bus=t,this.cycles=0,this.pixels.fill(this.regs[0]),this.isDMAEnabled()){this.cycles+=this.offset==0?J:q,this.offset<0&&this.readDLLEntry(t);let i=this.dlstart&65280,h=this.dlstart&255;do{let n=t.read(i+(h+0&511)),c=t.read(i+(h+1&511));if(c==0||i>=16384)break;let A=t.read(i+(h+2&511)),m=t.read(i+(h+3&511)),x=!1;if((c&31)==0){var e=m>>5,a=32-(m&31),r=t.read(i+(h+4&511)),s=c&128;x=(c&32)!=0,h+=5,this.cycles+=10}else{var r=m,e=c>>5,a=32-(c&31),s=0;h+=4,this.cycles+=8}this.indirect=x;let v=n+((A+(x?0:this.offset)&255)<<8);r*=2;let C=(this.regs[28]&3)+(s?4:0),y=x&&(this.regs[28]&16)!=0;y&&(a*=2);for(var o=0;o>1):v+o);if(x){let u=(this.regs[20]+this.offset<<8)+p;y&&o&1&&(u++,this.cycles-=3),p=this.readDMA(u)}switch(C){case 0:for(let u=0;u<4;u++){var l=p>>6&3;l>0&&(this.pixels[r]=this.pixels[r+1]=this.regs[(e<<2)+l]),p<<=2,r=r+2&511}break;case 2:case 3:for(let u=0;u<8;u++){var l=p&128?1:0;l>0&&(this.pixels[r]=this.regs[(e<<2)+l]),p<<=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=I([[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=O(this.inputs,X),this.pokey1=new W,this.audioadapter=new N(this.pokey1,Y,$)}readConst(t){let e=this.probe;this.probe=null;let a=this.read(t);return this.probe=e,a}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,a=0,r,s=0,o=0,l=0;this.probe.logNewFrame();for(var i=0;i>2),s+=c,e)for(var n=0;n<320;n++)e[a++]=V[this.maria.pixels[n]]}for((h||i==D-1)&&this.maria.doInterrupt()&&(this.probe.logInterrupt(0),this.cpu.NMI());s>2),s=b;break}if(t&&t()){t=null,i=999;break}s+=this.advanceCPU()<<2,l++}this.audio&&this.audioadapter.generate(this.audio),s-=b,o+=s,this.probe.logNewScanline()}return this.lastFrameCycles=o,l}getRasterX(){return this.lastFrameCycles%b}getRasterY(){return this.scanline}loadROM(t){t.length==49280&&(t=t.slice(128)),this.rom=E(t,this.defaultROMSize,!0)}reset(){super.reset(),this.tia.reset(),this.maria.reset(),this.inputs.fill(0),this.inputs[d]=255,this.inputs[L]=1+2+8}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 T.stateToLongString(e.tia);case"MARIA":return k.stateToLongString(e.maria)+` +Scanline: `+this.scanline}}getDebugDisplayLists(){let t={},e=this.maria.getDLLStart(),a=0;for(;a<240;){let r=this.readConst(e),s=r&15,o=(r&64)!=0,l=(r&32)!=0,i=(this.readConst(e+1)<<8)+this.readConst(e+2);e=e+3&65535;let h=(this.readConst(e)&128)!=0,n="DL $"+g(i,4)+" "+a+"-"+(a+s);o&&(n+=" H16"),l&&(n+=" H8"),h&&(n+=" DLI"),t[n]={$$:this._readDebugDisplayList(i)},a+=s+1}return t}_readDebugDisplayList(t){return()=>this.readDebugDisplayList(t)}readDebugDisplayList(t){let e=[],a=t&65280,r=t&255;do{let h=this.readConst(a+(r+0&511)),n=this.readConst(a+(r+1&511));if(n==0)break;let c=this.readConst(a+(r+2&511)),A=this.readConst(a+(r+3&511)),m=!1,x="";if((n&31)==0){var s=A>>5,o=32-(A&31),l=this.readConst(a+(r+4&511)),i=n&128;m=(n&32)!=0,r+=5,x+="X="+l+" W="+o+" P="+s+" "+(i?"WRITE":"")}else{var l=A,s=n>>5,o=32-(n&31),i=0;r+=4,x+="X="+l+" W="+o+" P="+s}let v=h+((c+(m?0:this.maria.offset)&255)<<8),C=(this.maria.regs[28]&3)+(i?4:0),y=m&&(this.maria.regs[28]&16)!=0;C&&(x+=" READMODE="+C),y&&(x+=" DBL"),m&&(x+=" CHR=$"+g(this.maria.regs[20]+this.maria.offset&255)+"xx"),x=" $"+g(v,4)+" "+x,e.push(x)}while(r<512);return e}},V=new Uint32Array(256);for(S=0;S<256;S++)V[S]=_(S);var S;var Q=[{id:"sprites.dasm",name:"Sprites (ASM)"},{id:"wsync.c",name:"WSYNC"},{id:"sprites.c",name:"Double Buffering"},{id:"scroll.c",name:"Scrolling"}],G=class extends z{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 R}getPresets(){return Q}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}};B.atari7800=G; +//# sourceMappingURL=atari7800-5KKGRW7B.js.map diff --git a/gen/atari7800-5KKGRW7B.js.map b/gen/atari7800-5KKGRW7B.js.map new file mode 100644 index 00000000..ff7961d4 --- /dev/null +++ b/gen/atari7800-5KKGRW7B.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/machine/atari7800.ts", "../src/platform/atari7800.ts"], + "sourcesContent": ["\nimport { MOS6502, MOS6502State } from \"../common/cpu/MOS6502\";\nimport { BasicMachine, RasterFrameBased, Bus, ProbeAll } from \"../common/devices\";\nimport { KeyFlags, newAddressDecoder, padBytes, Keys, makeKeycodeMap, newKeyboardHandler, EmuHalt, dumpRAM, gtia_ntsc_to_rgb } from \"../common/emu\";\nimport { TssChannelAdapter, MasterAudio, POKEYDeviceChannel } from \"../common/audio\";\nimport { hex, rgb2bgr } from \"../common/util\";\n\n// https://atarihq.com/danb/a7800.shtml\n// https://atarihq.com/danb/files/maria_r1.txt\n// https://sites.google.com/site/atari7800wiki/\n\ninterface Atari7800StateBase {\n ram : Uint8Array;\n regs6532 : Uint8Array;\n}\n\ninterface Atari7800ControlsState {\n inputs : Uint8Array;\n}\n\ninterface Atari7800State extends Atari7800StateBase, Atari7800ControlsState {\n c : MOS6502State;\n tia : {\n regs : Uint8Array,\n };\n maria : {\n regs : Uint8Array,\n offset,dll,dlstart : number;\n dli,h16,h8 : boolean;\n };\n pia : {\n timer: number;\n interval: number;\n }\n}\n\nconst SWCHA = 0;\nconst SWCHB = 2;\nconst INPT0 = 8;\n\nconst Atari7800_KEYCODE_MAP = makeKeycodeMap([\n [Keys.A, INPT0+0, 0x80],\n [Keys.B, INPT0+1, 0x80],\n [Keys.SELECT, SWCHB, -0x02],\n [Keys.START, SWCHB, -0x01],\n [Keys.UP, SWCHA, -0x10],\n [Keys.DOWN, SWCHA, -0x20],\n [Keys.LEFT, SWCHA, -0x40],\n [Keys.RIGHT, SWCHA, -0x80],\n \n [Keys.P2_A, INPT0+2, 0x80],\n [Keys.P2_B, INPT0+3, 0x80],\n //[Keys.P2_SELECT, 1, 2],\n //[Keys.P2_START, 1, 3],\n [Keys.P2_UP, SWCHA, -0x01],\n [Keys.P2_DOWN, SWCHA, -0x02],\n [Keys.P2_LEFT, SWCHA, -0x04],\n [Keys.P2_RIGHT, SWCHA, -0x08],\n]);\n\n// http://www.ataripreservation.org/websites/freddy.offenga/megazine/ISSUE5-PALNTSC.html\n// http://7800.8bitdev.org/index.php/7800_Software_Guide#APPENDIX_4:_FRAME_TIMING\n// https://forums.atariage.com/topic/224025-7800-hardware-facts/\nconst CLK = 3579545;\nconst linesPerFrame = 263;\nconst numVisibleLines = 258-16;\nconst colorClocksPerLine = 451; // 451? 452? 456?\nconst colorClocksPreDMA = 28;\nconst colorClocksShutdownOther = 16;\nconst colorClocksShutdownLast = 24;\nconst audioOversample = 2;\nconst audioSampleRate = linesPerFrame*60*audioOversample;\n\n// TIA chip\n\nclass TIA {\n regs = new Uint8Array(0x20);\n \n reset() {\n this.regs.fill(0);\n }\n read(a : number) : number {\n return this.regs[a] | 0;\n }\n write(a : number, v : number) {\n this.regs[a] = v;\n }\n saveState() {\n return {\n regs: this.regs.slice(0)\n };\n }\n loadState(s) {\n for (let i=0; i<32; i++)\n this.write(i, s.regs[i]);\n }\n static stateToLongString(state) : string {\n let s = \"\";\n s += dumpRAM(state.regs, 0, 32);\n return s;\n }\n}\n\n// MARIA chip\n\nclass MARIA {\n bus : Bus;\n cycles : number = 0;\n regs = new Uint8Array(0x20);\n offset : number = -1;\n dll : number = 0;\n dlstart : number = 0;\n dli : boolean = false;\n h16 : boolean = false;\n h8 : boolean = false;\n indirect : boolean = false;\n pixels = new Uint8Array(320);\n WSYNC : number = 0;\n\n reset() {\n this.regs.fill(0);\n // TODO?\n }\n read(a : number) : number {\n return this.regs[a] | 0;\n }\n write(a : number, v : number) {\n this.regs[a] = v;\n if (a == 0x04) this.WSYNC++;\n //console.log(hex(a), '=', hex(v));\n }\n saveState() {\n return {\n regs: this.regs.slice(0),\n offset: this.offset,\n dll: this.dll,\n dlstart: this.dlstart,\n dli: this.dli,\n h16: this.h16,\n h8: this.h8,\n indirect: this.indirect,\n };\n }\n loadState(s) {\n for (let i=0; i<32; i++)\n this.write(i, s.regs[i]|0);\n this.offset = s.offset|0;\n this.dll = s.dll|0;\n this.dlstart = s.dlstart|0;\n this.dli = !!s.dli;\n this.h16 = !!s.h16;\n this.h8 = !!s.h8;\n this.indirect = !!s.indirect;\n }\n isDMAEnabled() {\n return (this.regs[0x1c] & 0x60) == 0x40;\n }\n getDLLStart() {\n return (this.regs[0x0c] << 8) + this.regs[0x10];\n }\n getCharBaseAddress() {\n return (this.regs[0x14] << 8) + this.offset;\n }\n setVBLANK(b : boolean) {\n if (b) {\n this.regs[0x08] |= 0x80;\n this.offset = -1;\n this.dll = this.getDLLStart();\n this.dli = this.bus && (this.bus.read(this.dll) & 0x80) != 0; // if DLI on first zone\n } else {\n this.regs[0x08] &= ~0x80;\n }\n }\n readDLLEntry(bus) {\n // display lists must be in RAM (TODO: probe?)\n if (this.dll >= 0x4000) { return; }\n let x = bus.read(this.dll);\n this.offset = (x & 0xf);\n this.h16 = (x & 0x40) != 0;\n this.h8 = (x & 0x20) != 0;\n this.dlstart = (bus.read(this.dll+1)<<8) + bus.read(this.dll+2);\n //console.log(hex(this.dll,4), this.offset, hex(this.dlstart,4));\n this.dll = (this.dll + 3) & 0xffff; // TODO: can also only cross 1 page?\n this.dli = (bus.read(this.dll) & 0x80) != 0; // DLI flag is from next DLL entry\n }\n isHoley(a : number) : boolean {\n if (this.indirect) return false;\n if (a & 0x8000) {\n if (this.h16 && (a & 0x1000)) return true;\n if (this.h8 && (a & 0x800)) return true;\n }\n return false;\n }\n readDMA(a : number) : number {\n if (this.isHoley(a)) {\n return 0;\n } else {\n this.cycles += 3;\n return this.bus.read(a);\n }\n }\n doDMA(bus : Bus) {\n this.bus = bus;\n this.cycles = 0;\n this.pixels.fill(this.regs[0x0]);\n if (this.isDMAEnabled()) {\n // last line in zone gets additional 8 cycles\n this.cycles += this.offset == 0 ? colorClocksShutdownLast : colorClocksShutdownOther;\n // time for a new DLL entry?\n if (this.offset < 0) {\n this.readDLLEntry(bus);\n }\n // read the DL (only can span two pages)\n let dlhi = this.dlstart & 0xff00;\n let dlofs = this.dlstart & 0xff;\n do {\n // read DL entry\n let b0 = bus.read(dlhi + ((dlofs+0) & 0x1ff));\n let b1 = bus.read(dlhi + ((dlofs+1) & 0x1ff));\n if (b1 == 0) break; // end of DL\n // display lists must be in RAM (TODO: probe?)\n if (dlhi >= 0x4000) { break; }\n let b2 = bus.read(dlhi + ((dlofs+2) & 0x1ff));\n let b3 = bus.read(dlhi + ((dlofs+3) & 0x1ff));\n let indirect = false;\n // extended header?\n if ((b1 & 31) == 0) {\n var pal = b3 >> 5;\n var width = 32 - (b3 & 31);\n var xpos = bus.read(dlhi + ((dlofs+4) & 0x1ff));\n var writemode = b1 & 0x80;\n indirect = (b1 & 0x20) != 0;\n dlofs += 5;\n this.cycles += 10;\n } else {\n // direct mode\n var xpos = b3;\n var pal = b1 >> 5;\n var width = 32 - (b1 & 31);\n var writemode = 0;\n dlofs += 4;\n this.cycles += 8;\n }\n this.indirect = indirect;\n let gfxadr = b0 + (((b2 + (indirect?0:this.offset)) & 0xff) << 8);\n xpos *= 2;\n // copy graphics data (direct)\n let readmode = (this.regs[0x1c] & 0x3) + (writemode?4:0);\n // double bytes?\n let dbl = indirect && (this.regs[0x1c] & 0x10) != 0;\n if (dbl) { width *= 2; }\n //if (this.offset == 0) console.log(hex(dla,4), hex(gfxadr,4), xpos, width, pal, readmode);\n for (var i=0; i>1)) : (gfxadr+i) );\n if (indirect) {\n let indadr = ((this.regs[0x14] + this.offset) << 8) + data;\n if (dbl && (i&1)) {\n indadr++;\n this.cycles -= 3; // indirect read has 6/9 cycles\n }\n data = this.readDMA(indadr);\n }\n // TODO: more modes (https://github.com/gstanton/ProSystem1_3/blob/master/Core/Maria.cpp)\n switch (readmode) {\n case 0:\t// 160 A/B\n for (let j=0; j<4; j++) {\n var col = (data >> 6) & 3;\n if (col > 0) {\n this.pixels[xpos] = this.pixels[xpos+1] = this.regs[(pal<<2) + col];\n }\n data <<= 2;\n xpos = (xpos + 2) & 0x1ff;\n }\n break;\n case 2:\t// 320 B/D (TODO?)\n case 3:\t// 320 A/C\n for (let j=0; j<8; j++) {\n var col = (data & 128) ? 1 : 0;\n if (col > 0) {\n this.pixels[xpos] = this.regs[(pal<<2) + col];\n }\n data <<= 1;\n xpos = (xpos + 1) & 0x1ff;\n }\n break;\n }\n }\n } while (this.cycles < colorClocksPerLine); // TODO?\n // decrement offset\n this.offset -= 1;\n }\n return this.cycles;\n }\n doInterrupt() : boolean {\n if (this.dli && this.offset < 0) {\n this.dli = false;\n return true;\n } else\n return false;\n //return this.dli;// && this.offset == 1;\n }\n static stateToLongString(state) : string {\n let s = \"\";\n s += dumpRAM(state.regs, 0, 32);\n s += \"\\n DLL: $\" + hex((state.regs[0x0c] << 8) + state.regs[0x10],4) + \" @ $\" + hex(state.dll,4);\n s += \"\\n DL: $\" + hex(state.dlstart,4);\n s += \"\\nOffset: \" + state.offset;\n s += \"\\n DLI? \" + state.dli;\n return s;\n }\n}\n\n// Atari 7800\n\nexport class Atari7800 extends BasicMachine implements RasterFrameBased {\n\n cpuFrequency = 1789772;\n canvasWidth = 320;\n numTotalScanlines = linesPerFrame;\n numVisibleScanlines = numVisibleLines;\n defaultROMSize = 0xc000;\n cpuCyclesPerLine = 113.5;\n sampleRate = audioSampleRate;\n\n cpu : MOS6502;\n ram : Uint8Array = new Uint8Array(0x1000);\n regs6532 = new Uint8Array(4);\n piatimer : number = 0;\n timerinterval : number = 1;\n tia : TIA = new TIA();\n maria : MARIA = new MARIA();\n pokey1; //TODO: type\n audioadapter;\n \n lastFrameCycles = 0;\n xtracyc = 0;\n \n read : (a:number) => number;\n write : (a:number, v:number) => void;\n \n dmaBus : Bus; // to pass to MARIA\n\n constructor() {\n super();\n this.cpu = new MOS6502();\n this.read = newAddressDecoder([\n [0x0008, 0x000d, 0x0f, (a) => { this.xtracyc++; return this.readInput(a); }],\n [0x0000, 0x001f, 0x1f, (a) => { this.xtracyc++; return this.tia.read(a); }],\n [0x0020, 0x003f, 0x1f, (a) => { return this.maria.read(a); }],\n [0x0040, 0x00ff, 0xff, (a) => { return this.ram[a + 0x800]; }],\n [0x0100, 0x013f, 0xff, (a) => { return this.read(a); }], // shadow\n [0x0140, 0x01ff, 0x1ff, (a) => { return this.ram[a + 0x800]; }],\n [0x0280, 0x02ff, 0x7f, (a) => { this.xtracyc++; return this.readPIA(a); }],\n [0x1800, 0x27ff, 0xffff, (a) => { return this.ram[a - 0x1800]; }],\n [0x2800, 0x3fff, 0x7ff, (a) => { return this.read(a | 0x2000); }], // shadow\n [0x4000, 0xffff, 0xffff, (a) => { return this.rom ? this.rom[a - 0x4000] : 0; }],\n [0x0000, 0xffff, 0xffff, (a) => { return this.probe && this.probe.logIllegal(a); }],\n ]);\n this.write = newAddressDecoder([\n [0x0015, 0x001A, 0x1f, (a,v) => { this.xtracyc++; this.pokey1.setTIARegister(a, v); }],\n [0x0000, 0x001f, 0x1f, (a,v) => { this.xtracyc++; this.tia.write(a,v); }],\n [0x0020, 0x003f, 0x1f, (a,v) => { this.maria.write(a,v); }],\n [0x0040, 0x00ff, 0xff, (a,v) => { this.ram[a + 0x800] = v; }],\n [0x0100, 0x013f, 0xff, (a,v) => { this.write(a,v); }], // shadow\n [0x0140, 0x01ff, 0x1ff, (a,v) => { this.ram[a + 0x800] = v; }],\n [0x0280, 0x02ff, 0x7f, (a,v) => { this.xtracyc++; this.writePIA(a,v) }],\n [0x1800, 0x27ff, 0xffff, (a,v) => { this.ram[a - 0x1800] = v; }],\n [0x2800, 0x3fff, 0x7ff, (a,v) => { this.write(a | 0x2000, v); }], // shadow\n [0xbfff, 0xbfff, 0xffff, (a,v) => { }], // TODO: bank switching?\n [0x0000, 0xffff, 0xffff, (a,v) => { this.probe && this.probe.logIllegal(a); }],\n ]);\n this.connectCPUMemoryBus(this);\n this.dmaBus = this.probeDMABus(this);\n this.handler = newKeyboardHandler(this.inputs, Atari7800_KEYCODE_MAP);\n this.pokey1 = new POKEYDeviceChannel();\n this.audioadapter = new TssChannelAdapter(this.pokey1, audioOversample, audioSampleRate);\n }\n \n readConst(a) {\n // make sure we don't log during this\n let oldprobe = this.probe;\n this.probe = null;\n let v = this.read(a);\n this.probe = oldprobe;\n return v;\n }\n\n readInput(a:number) : number {\n switch (a) {\n case 0xc: return ~this.inputs[0x8] & 0x80; //INPT4\n case 0xd: return ~this.inputs[0x9] & 0x80; //INPT5\n default: return this.inputs[a]|0;\n }\n }\n\n readPIA(a:number) : number {\n switch (a) {\n case 0x0:\n case 0x2:\n return this.inputs[a]; // SWCHA, SWCHB\n case 0x1:\n case 0x3:\n return this.regs6532[a]; // CTLSWA, CTLSWB\n case 0x4:\n return this.getPIATimerValue(); // INTIM\n default:\n return 0;\n }\n }\n\n writePIA(a:number, v:number) : void {\n switch (a) {\n case 0x0:\n case 0x1:\n case 0x2:\n case 0x3:\n this.regs6532[a] = v;\n return;\n case 0x14: this.setPIATimer(v, 0); return; // TIM1T\n case 0x15: this.setPIATimer(v, 3); return; // TIM8T\n case 0x16: this.setPIATimer(v, 6); return; // TIM64T\n case 0x17: this.setPIATimer(v, 10); return; // T1024T\n case 0x18: this.setPIATimer(v, 6); return; // TIM64TI (TODO)\n }\n }\n\n setPIATimer(v:number, shift:number) : void {\n this.piatimer = (v + 1) << shift;\n this.timerinterval = shift;\n }\n\n getPIATimerValue() : number {\n let t = this.piatimer;\n if (t > 0) {\n return t >> this.timerinterval;\n } else {\n return t & 0xff;\n }\n }\n\n advanceCPU() : number {\n var clk = super.advanceCPU();\n this.tickPIATimer(clk); // TODO?\n if (this.xtracyc) {\n clk += this.xtracyc;\n this.tickClocks(this.xtracyc);\n this.xtracyc = 0;\n }\n return clk;\n }\n\n tickClocks(clocks:number) {\n this.probe.logClocks(clocks);\n this.tickPIATimer(clocks);\n }\n tickPIATimer(clocks:number) {\n this.piatimer = Math.max(-256, this.piatimer - clocks);\n }\n\n advanceFrame(trap) : number {\n var idata = this.pixels;\n var iofs = 0;\n var rgb;\n var mc = 0;\n var fc = 0;\n var steps = 0;\n this.probe.logNewFrame();\n //console.log(hex(this.cpu.getPC()), hex(this.maria.dll));\n // visible lines\n for (var sl=0; sl> 2); // TODO: logDMA\n mc += dmaClocks;\n // copy line to frame buffer\n if (idata) {\n for (var i=0; i<320; i++) {\n idata[iofs++] = COLORS_RGBA[this.maria.pixels[i]];\n }\n }\n }\n // do interrupt? (if visible or before 1st scanline)\n if ((visible || sl == linesPerFrame-1) && this.maria.doInterrupt()) {\n this.probe.logInterrupt(0);\n this.cpu.NMI();\n }\n // post-DMA clocks\n while (mc < colorClocksPerLine) {\n if (this.maria.WSYNC) {\n this.probe.logWait(0);\n this.tickClocks((colorClocksPerLine - mc) >> 2);\n mc = colorClocksPerLine;\n break;\n }\n if (trap && trap()) {\n trap = null;\n sl = 999;\n break;\n }\n mc += this.advanceCPU() << 2;\n steps++;\n }\n // audio\n this.audio && this.audioadapter.generate(this.audio);\n // update clocks, scanline\n mc -= colorClocksPerLine;\n fc += mc;\n this.probe.logNewScanline();\n }\n /*\n // TODO let bkcol = this.maria.regs[0x0];\n // TODO $(this.video.canvas).css('background-color', COLORS_WEB[bkcol]);\n */\n this.lastFrameCycles = fc;\n return steps;\n }\n\n getRasterX() { return this.lastFrameCycles % colorClocksPerLine; }\n getRasterY() { return this.scanline; }\n\n loadROM(data) {\n if (data.length == 0xc080) data = data.slice(0x80); // strip header\n this.rom = padBytes(data, this.defaultROMSize, true);\n }\n\n reset() {\n super.reset();\n this.tia.reset();\n this.maria.reset();\n this.inputs.fill(0x0);\n this.inputs[SWCHA] = 0xff;\n this.inputs[SWCHB] = 1+2+8;\n //this.cpu.advanceClock(); // needed for test to pass?\n }\n\n readAddress(addr : number) {\n return this.read(addr) | 0;\n }\n\n loadState(state : Atari7800State) {\n this.cpu.loadState(state.c);\n this.ram.set(state.ram);\n this.tia.loadState(state.tia);\n this.maria.loadState(state.maria);\n this.regs6532.set(state.regs6532);\n this.piatimer = state.pia.timer;\n this.timerinterval = state.pia.interval;\n this.loadControlsState(state);\n }\n saveState() : Atari7800State {\n return {\n c:this.cpu.saveState(),\n ram:this.ram.slice(0),\n tia:this.tia.saveState(),\n maria:this.maria.saveState(),\n regs6532:this.regs6532.slice(0),\n inputs:this.inputs.slice(0),\n pia:{timer:this.piatimer, interval: this.timerinterval}\n };\n }\n loadControlsState(state:Atari7800ControlsState) : void {\n this.inputs.set(state.inputs);\n }\n saveControlsState() : Atari7800ControlsState {\n return {\n inputs:this.inputs.slice(0)\n };\n }\n\n getDebugCategories() {\n return ['CPU','Stack','TIA','MARIA'];\n }\n getDebugInfo(category, state) {\n switch (category) {\n case 'TIA': return TIA.stateToLongString(state.tia);\n case 'MARIA': return MARIA.stateToLongString(state.maria) + \"\\nScanline: \" + this.scanline;\n //default: return super.getDebugInfo(category, state);\n }\n }\n getDebugDisplayLists() {\n // return display list in human-readable JSON object\n let display_lists = {};\n let dll_ofs = this.maria.getDLLStart();\n // read the address of each DLL entry\n let y = 0;\n while (y < 240) {\n let x = this.readConst(dll_ofs);\n let offset = (x & 0xf);\n let h16 = (x & 0x40) != 0;\n let h8 = (x & 0x20) != 0;\n let dlstart = (this.readConst(dll_ofs+1)<<8) + this.readConst(dll_ofs+2);\n dll_ofs = (dll_ofs + 3) & 0xffff; // TODO: can also only cross 1 page?\n let dli = (this.readConst(dll_ofs) & 0x80) != 0; // DLI flag is from next DLL entry\n let title = \"DL $\" + hex(dlstart,4) + \" \" + y + \"-\" + (y+offset);\n if (h16) title += \" H16\";\n if (h8) title += \" H8\";\n if (dli) title += \" DLI\";\n display_lists[title] = { \"$$\": this._readDebugDisplayList(dlstart) };\n y += offset + 1;\n }\n return display_lists;\n }\n _readDebugDisplayList(dlstart: number) {\n return () => this.readDebugDisplayList(dlstart);\n }\n readDebugDisplayList(dlstart: number) {\n let display_list = [];\n let dlhi = dlstart & 0xff00;\n let dlofs = dlstart & 0xff;\n do {\n // read DL entry\n let b0 = this.readConst(dlhi + ((dlofs+0) & 0x1ff));\n let b1 = this.readConst(dlhi + ((dlofs+1) & 0x1ff));\n if (b1 == 0) break; // end of DL\n // display lists must be in RAM (TODO: probe?)\n let b2 = this.readConst(dlhi + ((dlofs+2) & 0x1ff));\n let b3 = this.readConst(dlhi + ((dlofs+3) & 0x1ff));\n // extended header?\n let indirect = false;\n let description = \"\";\n if ((b1 & 31) == 0) {\n var pal = b3 >> 5;\n var width = 32 - (b3 & 31);\n var xpos = this.readConst(dlhi + ((dlofs+4) & 0x1ff));\n var writemode = b1 & 0x80;\n indirect = (b1 & 0x20) != 0;\n dlofs += 5;\n description += \"X=\" + xpos + \" W=\" + width + \" P=\" + pal + \" \" + (writemode?\"WRITE\":\"\");\n } else {\n // direct mode\n var xpos = b3;\n var pal = b1 >> 5;\n var width = 32 - (b1 & 31);\n var writemode = 0;\n dlofs += 4;\n description += \"X=\" + xpos + \" W=\" + width + \" P=\" + pal;\n }\n let gfxadr = b0 + (((b2 + (indirect?0:this.maria.offset)) & 0xff) << 8);\n let readmode = (this.maria.regs[0x1c] & 0x3) + (writemode?4:0);\n let dbl = indirect && (this.maria.regs[0x1c] & 0x10) != 0;\n if (readmode) description += \" READMODE=\" + readmode;\n if (dbl) description += \" DBL\";\n if (indirect) description += \" CHR=$\" + hex((this.maria.regs[0x14] + this.maria.offset) & 0xff) + \"xx\";\n description = \" $\" + hex(gfxadr,4) + \" \" + description;\n display_list.push(description);\n } while (dlofs < 0x200);\n return display_list;\n }\n}\n\n///\n\nvar COLORS_RGBA = new Uint32Array(256);\nfor (var i=0; i<256; i++) {\n COLORS_RGBA[i] = gtia_ntsc_to_rgb(i);\n}\n\n", "\nimport { Atari7800 } from \"../machine/atari7800\";\nimport { Platform, Base6502MachinePlatform } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\n\nvar Atari7800_PRESETS = [\n {id:'sprites.dasm', name:'Sprites (ASM)'},\n {id:'wsync.c', name:'WSYNC'},\n {id:'sprites.c', name:'Double Buffering'},\n {id:'scroll.c', name:'Scrolling'},\n];\n\nclass Atari7800Platform extends Base6502MachinePlatform implements Platform {\n\n newMachine() { return new Atari7800(); }\n getPresets() { return Atari7800_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n readAddress(a) { return this.machine.readConst(a); }\n // TODO loadBIOS(bios)\t{ this.machine.loadBIOS(a); }\n getMemoryMap = function() { return { main:[\n {name:'TIA',start:0x00,size:0x20,type:'io'},\n {name:'MARIA',start:0x20,size:0x20,type:'io'},\n {name:'RAM (6166 Block 0)',start:0x40,size:0xc0,type:'ram'},\n {name:'RAM (6166 Block 1)',start:0x140,size:0xc0,type:'ram'},\n {name:'PIA',start:0x280,size:0x18,type:'io'},\n {name:'RAM',start:0x1800,size:0x1000,type:'ram'}, // TODO: shadow ram\n {name:'Cartridge ROM',start:0x4000,size:0xc000,type:'rom'},\n ] } };\n getROMExtension() { return \".a78\"; }\n getDebugTree() {\n let tree = super.getDebugTree();\n tree['display_list'] = this.machine.getDebugDisplayLists();\n return tree;\n }\n}\n\n///\n\nPLATFORMS['atari7800'] = Atari7800Platform;\n"], + "mappings": "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", + "names": [] +} diff --git a/gen/atari7800-CBAOXRGJ.js b/gen/atari7800-CBAOXRGJ.js deleted file mode 100644 index 7dadf35d..00000000 --- a/gen/atari7800-CBAOXRGJ.js +++ /dev/null @@ -1,7 +0,0 @@ -import{I as W,h as E,k as N,p as F,t as _}from"./chunk-HB3LWF25.js";import{$ as w,J as k,U as M,V as r,W as I,Y as T,_ as U,da as O,g as b}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.js";var h=0,P=2,A=8,j=T([[r.A,A+0,128],[r.B,A+1,128],[r.SELECT,P,-2],[r.START,P,-1],[r.UP,h,-16],[r.DOWN,h,-32],[r.LEFT,h,-64],[r.RIGHT,h,-128],[r.P2_A,A+2,128],[r.P2_B,A+3,128],[r.P2_UP,h,-1],[r.P2_DOWN,h,-2],[r.P2_LEFT,h,-4],[r.P2_RIGHT,h,-8]]);var S=262,z=258-16,u=454,q=28,K=2,Y=S*60*K,L=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+=M(t.regs,0,32),e}},R=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.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}}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}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!!(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){if(this.bus=t,this.cycles=0,this.pixels.fill(this.regs[0]),this.isDMAEnabled()){this.cycles+=16,this.offset<0&&this.readDLLEntry(t);let s=this.dlstart&65280,a=this.dlstart&255;do{let m=t.read(s+(a+0&511)),f=t.read(s+(a+1&511));if(f==0||s>=16384)break;let G=t.read(s+(a+2&511)),v=t.read(s+(a+3&511)),p=!1;if((f&31)==0){var e=v>>5,c=32-(v&31),n=t.read(s+(a+4&511)),i=f&128;p=(f&32)!=0,a+=5,this.cycles+=10}else{var n=v,e=f>>5,c=32-(f&31),i=0;a+=4,this.cycles+=8}let D=m+((G+(p?0:this.offset)&255)<<8);n*=2;let $=(this.regs[28]&3)+(i?4:0),C=p&&(this.regs[28]&16)!=0;C&&(c*=2);for(var o=0;o>1):D+o);if(p){let x=(this.regs[20]+this.offset<<8)+d;C&&o&1&&(x++,this.cycles-=3),d=this.readDMA(x)}switch($){case 0:for(let x=0;x<4;x++){var l=d>>6&3;l>0&&(this.pixels[n]=this.pixels[n+1]=this.regs[(e<<2)+l]),d<<=2,n=n+2&511}break;case 2:case 3:for(let x=0;x<8;x++){var l=d&128?1:0;l>0&&(this.pixels[n]=this.regs[(e<<2)+l]),d<<=1,n=n+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,3,t=>(this.xtracyc++,this.inputs[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=w([[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,3,(t,e)=>{this.xtracyc++,this.regs6532[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=I(this.inputs,j),this.pokey1=new E,this.audioadapter=new N(this.pokey1,K,Y)}readConst(t){let e=this.probe;this.probe=null;let c=this.read(t);return this.probe=e,c}readInput(t){switch(t){case 12:return~this.inputs[8]&128;case 13:return~this.inputs[9]&128;default:return this.inputs[t]|0}}advanceCPU(){var t=super.advanceCPU();return this.xtracyc&&(t+=this.xtracyc,this.probe.logClocks(this.xtracyc),this.xtracyc=0),t}advanceFrame(t){var e=this.pixels,c=0,n,i=0,o=0,l=0;this.probe.logNewFrame();for(var s=0;s>2),i+=f,e)for(var m=0;m<320;m++)e[c++]=H[this.maria.pixels[m]]}for((a||s==S-1)&&this.maria.doInterrupt()&&(this.probe.logInterrupt(0),this.cpu.NMI());i>2),i=u;break}if(t&&t()){t=null,s=999;break}i+=this.advanceCPU()<<2,l++}this.audio&&this.audioadapter.generate(this.audio),i-=u,o+=i,this.probe.logNewScanline()}return this.lastFrameCycles=o,l}getRasterX(){return this.lastFrameCycles%u}getRasterY(){return this.scanline}loadROM(t){t.length==49280&&(t=t.slice(128)),this.rom=U(t,this.defaultROMSize,!0)}reset(){super.reset(),this.tia.reset(),this.maria.reset(),this.inputs.fill(0),this.inputs[h]=255,this.inputs[P]=1+2+8}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.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)}}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 L.stateToLongString(e.tia);case"MARIA":return R.stateToLongString(e.maria)+` -Scanline: `+this.scanline}}},H=new Uint32Array(256);for(g=0;g<256;g++)H[g]=O(g);var g;var X=[{id:"sprites.dasm",name:"Sprites (ASM)"},{id:"wsync.c",name:"WSYNC"},{id:"sprites.c",name:"Double Buffering"},{id:"scroll.c",name:"Scrolling"}],V=class extends W{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 B}getPresets(){return X}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getROMExtension(){return".a78"}};k.atari7800=V; -//# sourceMappingURL=atari7800-CBAOXRGJ.js.map diff --git a/gen/atari7800-CBAOXRGJ.js.map b/gen/atari7800-CBAOXRGJ.js.map deleted file mode 100644 index 7f07c884..00000000 --- a/gen/atari7800-CBAOXRGJ.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/machine/atari7800.ts", "../src/platform/atari7800.ts"], - "sourcesContent": ["\nimport { MOS6502, MOS6502State } from \"../common/cpu/MOS6502\";\nimport { BasicMachine, RasterFrameBased, Bus, ProbeAll } from \"../common/devices\";\nimport { KeyFlags, newAddressDecoder, padBytes, Keys, makeKeycodeMap, newKeyboardHandler, EmuHalt, dumpRAM, gtia_ntsc_to_rgb } from \"../common/emu\";\nimport { TssChannelAdapter, MasterAudio, POKEYDeviceChannel } from \"../common/audio\";\nimport { hex, rgb2bgr } from \"../common/util\";\n\n// https://atarihq.com/danb/a7800.shtml\n// https://atarihq.com/danb/files/maria_r1.txt\n// https://sites.google.com/site/atari7800wiki/\n\ninterface Atari7800StateBase {\n ram : Uint8Array;\n regs6532 : Uint8Array;\n}\n\ninterface Atari7800ControlsState {\n inputs : Uint8Array;\n}\n\ninterface Atari7800State extends Atari7800StateBase, Atari7800ControlsState {\n c : MOS6502State;\n tia : {\n regs : Uint8Array,\n };\n maria : {\n regs : Uint8Array,\n offset,dll,dlstart : number;\n dli,h16,h8 : boolean;\n };\n}\n\nconst SWCHA = 0;\nconst SWCHB = 2;\nconst INPT0 = 8;\n\nconst Atari7800_KEYCODE_MAP = makeKeycodeMap([\n [Keys.A, INPT0+0, 0x80],\n [Keys.B, INPT0+1, 0x80],\n [Keys.SELECT, SWCHB, -0x02],\n [Keys.START, SWCHB, -0x01],\n [Keys.UP, SWCHA, -0x10],\n [Keys.DOWN, SWCHA, -0x20],\n [Keys.LEFT, SWCHA, -0x40],\n [Keys.RIGHT, SWCHA, -0x80],\n \n [Keys.P2_A, INPT0+2, 0x80],\n [Keys.P2_B, INPT0+3, 0x80],\n //[Keys.P2_SELECT, 1, 2],\n //[Keys.P2_START, 1, 3],\n [Keys.P2_UP, SWCHA, -0x01],\n [Keys.P2_DOWN, SWCHA, -0x02],\n [Keys.P2_LEFT, SWCHA, -0x04],\n [Keys.P2_RIGHT, SWCHA, -0x08],\n]);\n\n// http://www.ataripreservation.org/websites/freddy.offenga/megazine/ISSUE5-PALNTSC.html\n// http://7800.8bitdev.org/index.php/7800_Software_Guide#APPENDIX_4:_FRAME_TIMING\nconst CLK = 3579545;\nconst linesPerFrame = 262;\nconst numVisibleLines = 258-16;\nconst colorClocksPerLine = 454; // 456?\nconst colorClocksPreDMA = 28;\nconst audioOversample = 2;\nconst audioSampleRate = linesPerFrame*60*audioOversample;\n\n// TIA chip\n\nclass TIA {\n regs = new Uint8Array(0x20);\n \n reset() {\n this.regs.fill(0);\n }\n read(a : number) : number {\n return this.regs[a] | 0;\n }\n write(a : number, v : number) {\n this.regs[a] = v;\n }\n saveState() {\n return {\n regs: this.regs.slice(0)\n };\n }\n loadState(s) {\n for (let i=0; i<32; i++)\n this.write(i, s.regs[i]);\n }\n static stateToLongString(state) : string {\n let s = \"\";\n s += dumpRAM(state.regs, 0, 32);\n return s;\n }\n}\n\n// MARIA chip\n\nclass MARIA {\n bus : Bus;\n cycles : number = 0;\n regs = new Uint8Array(0x20);\n offset : number = -1;\n dll : number = 0;\n dlstart : number = 0;\n dli : boolean = false;\n h16 : boolean = false;\n h8 : boolean = false;\n pixels = new Uint8Array(320);\n WSYNC : number = 0;\n\n reset() {\n this.regs.fill(0);\n // TODO?\n }\n read(a : number) : number {\n return this.regs[a] | 0;\n }\n write(a : number, v : number) {\n this.regs[a] = v;\n if (a == 0x04) this.WSYNC++;\n //console.log(hex(a), '=', hex(v));\n }\n saveState() {\n return {\n regs: this.regs.slice(0),\n offset: this.offset,\n dll: this.dll,\n dlstart: this.dlstart,\n dli: this.dli,\n h16: this.h16,\n h8: this.h8,\n };\n }\n loadState(s) {\n for (let i=0; i<32; i++)\n this.write(i, s.regs[i]|0);\n this.offset = s.offset|0;\n this.dll = s.dll|0;\n this.dlstart = s.dlstart|0;\n this.dli = !!s.dli;\n this.h16 = !!s.h16;\n this.h8 = !!s.h8;\n }\n isDMAEnabled() {\n return (this.regs[0x1c] & 0x60) == 0x40;\n }\n getDLLStart() {\n return (this.regs[0x0c] << 8) + this.regs[0x10];\n }\n getCharBaseAddress() {\n return (this.regs[0x14] << 8) + this.offset;\n }\n setVBLANK(b : boolean) {\n if (b) {\n this.regs[0x08] |= 0x80;\n this.offset = -1;\n this.dll = this.getDLLStart();\n this.dli = this.bus && (this.bus.read(this.dll) & 0x80) != 0; // if DLI on first zone\n } else {\n this.regs[0x08] &= ~0x80;\n }\n }\n readDLLEntry(bus) {\n // display lists must be in RAM (TODO: probe?)\n if (this.dll >= 0x4000) { return; }\n let x = bus.read(this.dll);\n this.offset = (x & 0xf);\n this.h16 = (x & 0x40) != 0;\n this.h8 = (x & 0x20) != 0;\n this.dlstart = (bus.read(this.dll+1)<<8) + bus.read(this.dll+2);\n //console.log(hex(this.dll,4), this.offset, hex(this.dlstart,4));\n this.dll = (this.dll + 3) & 0xffff; // TODO: can also only cross 1 page?\n this.dli = (bus.read(this.dll) & 0x80) != 0; // DLI flag is from next DLL entry\n }\n isHoley(a : number) : boolean {\n if (a & 0x8000) {\n if (this.h16 && (a & 0x1000)) return true;\n if (this.h8 && (a & 0x800)) return true;\n }\n return false;\n }\n readDMA(a : number) : number {\n if (this.isHoley(a))\n return 0;\n else {\n this.cycles += 3;\n return this.bus.read(a);\n }\n }\n doDMA(bus : Bus) {\n this.bus = bus;\n this.cycles = 0;\n this.pixels.fill(this.regs[0x0]);\n if (this.isDMAEnabled()) {\n this.cycles += 16; // TODO: last line in zone gets additional 8 cycles\n // time for a new DLL entry?\n if (this.offset < 0) {\n this.readDLLEntry(bus);\n }\n // read the DL (only can span two pages)\n let dlhi = this.dlstart & 0xff00;\n let dlofs = this.dlstart & 0xff;\n do {\n // read DL entry\n let b0 = bus.read(dlhi + ((dlofs+0) & 0x1ff));\n let b1 = bus.read(dlhi + ((dlofs+1) & 0x1ff));\n if (b1 == 0) break; // end of DL\n // display lists must be in RAM (TODO: probe?)\n if (dlhi >= 0x4000) { break; }\n let b2 = bus.read(dlhi + ((dlofs+2) & 0x1ff));\n let b3 = bus.read(dlhi + ((dlofs+3) & 0x1ff));\n let indirect = false;\n // extended header?\n if ((b1 & 31) == 0) {\n var pal = b3 >> 5;\n var width = 32 - (b3 & 31);\n var xpos = bus.read(dlhi + ((dlofs+4) & 0x1ff));\n var writemode = b1 & 0x80;\n indirect = (b1 & 0x20) != 0;\n dlofs += 5;\n this.cycles += 10;\n } else {\n // direct mode\n var xpos = b3;\n var pal = b1 >> 5;\n var width = 32 - (b1 & 31);\n var writemode = 0;\n dlofs += 4;\n this.cycles += 8;\n }\n let gfxadr = b0 + (((b2 + (indirect?0:this.offset)) & 0xff) << 8);\n xpos *= 2;\n // copy graphics data (direct)\n let readmode = (this.regs[0x1c] & 0x3) + (writemode?4:0);\n // double bytes?\n let dbl = indirect && (this.regs[0x1c] & 0x10) != 0;\n if (dbl) { width *= 2; }\n //if (this.offset == 0) console.log(hex(dla,4), hex(gfxadr,4), xpos, width, pal, readmode);\n for (var i=0; i>1)) : (gfxadr+i) );\n if (indirect) {\n let indadr = ((this.regs[0x14] + this.offset) << 8) + data;\n if (dbl && (i&1)) {\n indadr++;\n this.cycles -= 3; // indirect read has 6/9 cycles\n }\n data = this.readDMA(indadr);\n }\n // TODO: more modes (https://github.com/gstanton/ProSystem1_3/blob/master/Core/Maria.cpp)\n switch (readmode) {\n case 0:\t// 160 A/B\n for (let j=0; j<4; j++) {\n var col = (data >> 6) & 3;\n if (col > 0) {\n this.pixels[xpos] = this.pixels[xpos+1] = this.regs[(pal<<2) + col];\n }\n data <<= 2;\n xpos = (xpos + 2) & 0x1ff;\n }\n break;\n case 2:\t// 320 B/D (TODO?)\n case 3:\t// 320 A/C\n for (let j=0; j<8; j++) {\n var col = (data & 128) ? 1 : 0;\n if (col > 0) {\n this.pixels[xpos] = this.regs[(pal<<2) + col];\n }\n data <<= 1;\n xpos = (xpos + 1) & 0x1ff;\n }\n break;\n }\n }\n } while (this.cycles < colorClocksPerLine); // TODO?\n // decrement offset\n this.offset -= 1;\n }\n return this.cycles;\n }\n doInterrupt() : boolean {\n if (this.dli && this.offset < 0) {\n this.dli = false;\n return true;\n } else\n return false;\n //return this.dli;// && this.offset == 1;\n }\n static stateToLongString(state) : string {\n let s = \"\";\n s += dumpRAM(state.regs, 0, 32);\n s += \"\\n DLL: $\" + hex((state.regs[0x0c] << 8) + state.regs[0x10],4) + \" @ $\" + hex(state.dll,4);\n s += \"\\n DL: $\" + hex(state.dlstart,4);\n s += \"\\nOffset: \" + state.offset;\n s += \"\\n DLI? \" + state.dli;\n return s;\n }\n}\n\n// Atari 7800\n\nexport class Atari7800 extends BasicMachine implements RasterFrameBased {\n\n cpuFrequency = 1789772;\n canvasWidth = 320;\n numTotalScanlines = linesPerFrame;\n numVisibleScanlines = numVisibleLines;\n defaultROMSize = 0xc000;\n cpuCyclesPerLine = 113.5;\n sampleRate = audioSampleRate;\n\n cpu : MOS6502;\n ram : Uint8Array = new Uint8Array(0x1000);\n regs6532 = new Uint8Array(4);\n tia : TIA = new TIA();\n maria : MARIA = new MARIA();\n pokey1; //TODO: type\n audioadapter;\n \n lastFrameCycles = 0;\n xtracyc = 0;\n \n read : (a:number) => number;\n write : (a:number, v:number) => void;\n \n dmaBus : Bus; // to pass to MARIA\n\n constructor() {\n super();\n this.cpu = new MOS6502();\n this.read = newAddressDecoder([\n [0x0008, 0x000d, 0x0f, (a) => { this.xtracyc++; return this.readInput(a); }],\n [0x0000, 0x001f, 0x1f, (a) => { this.xtracyc++; return this.tia.read(a); }],\n [0x0020, 0x003f, 0x1f, (a) => { return this.maria.read(a); }],\n [0x0040, 0x00ff, 0xff, (a) => { return this.ram[a + 0x800]; }],\n [0x0100, 0x013f, 0xff, (a) => { return this.read(a); }], // shadow\n [0x0140, 0x01ff, 0x1ff, (a) => { return this.ram[a + 0x800]; }],\n [0x0280, 0x02ff, 0x3, (a) => { this.xtracyc++; return this.inputs[a]; }],\n [0x1800, 0x27ff, 0xffff, (a) => { return this.ram[a - 0x1800]; }],\n [0x2800, 0x3fff, 0x7ff, (a) => { return this.read(a | 0x2000); }], // shadow\n [0x4000, 0xffff, 0xffff, (a) => { return this.rom ? this.rom[a - 0x4000] : 0; }],\n [0x0000, 0xffff, 0xffff, (a) => { return this.probe && this.probe.logIllegal(a); }],\n ]);\n this.write = newAddressDecoder([\n [0x0015, 0x001A, 0x1f, (a,v) => { this.xtracyc++; this.pokey1.setTIARegister(a, v); }],\n [0x0000, 0x001f, 0x1f, (a,v) => { this.xtracyc++; this.tia.write(a,v); }],\n [0x0020, 0x003f, 0x1f, (a,v) => { this.maria.write(a,v); }],\n [0x0040, 0x00ff, 0xff, (a,v) => { this.ram[a + 0x800] = v; }],\n [0x0100, 0x013f, 0xff, (a,v) => { this.write(a,v); }], // shadow\n [0x0140, 0x01ff, 0x1ff, (a,v) => { this.ram[a + 0x800] = v; }],\n [0x0280, 0x02ff, 0x3, (a,v) => { this.xtracyc++; this.regs6532[a] = v; /*TODO*/ }],\n [0x1800, 0x27ff, 0xffff, (a,v) => { this.ram[a - 0x1800] = v; }],\n [0x2800, 0x3fff, 0x7ff, (a,v) => { this.write(a | 0x2000, v); }], // shadow\n [0xbfff, 0xbfff, 0xffff, (a,v) => { }], // TODO: bank switching?\n [0x0000, 0xffff, 0xffff, (a,v) => { this.probe && this.probe.logIllegal(a); }],\n ]);\n this.connectCPUMemoryBus(this);\n this.dmaBus = this.probeDMABus(this);\n this.handler = newKeyboardHandler(this.inputs, Atari7800_KEYCODE_MAP);\n this.pokey1 = new POKEYDeviceChannel();\n this.audioadapter = new TssChannelAdapter(this.pokey1, audioOversample, audioSampleRate);\n }\n \n readConst(a) {\n // make sure we don't log during this\n let oldprobe = this.probe;\n this.probe = null;\n let v = this.read(a);\n this.probe = oldprobe;\n return v;\n }\n\n readInput(a:number) : number {\n switch (a) {\n case 0xc: return ~this.inputs[0x8] & 0x80; //INPT4\n case 0xd: return ~this.inputs[0x9] & 0x80; //INPT5\n default: return this.inputs[a]|0;\n }\n }\n\n advanceCPU() : number {\n var clk = super.advanceCPU();\n if (this.xtracyc) {\n clk += this.xtracyc;\n this.probe.logClocks(this.xtracyc);\n this.xtracyc = 0;\n }\n return clk;\n }\n\n advanceFrame(trap) : number {\n var idata = this.pixels;\n var iofs = 0;\n var rgb;\n var mc = 0;\n var fc = 0;\n var steps = 0;\n this.probe.logNewFrame();\n //console.log(hex(this.cpu.getPC()), hex(this.maria.dll));\n // visible lines\n for (var sl=0; sl> 2); // TODO: logDMA\n mc += dmaClocks;\n // copy line to frame buffer\n if (idata) {\n for (var i=0; i<320; i++) {\n idata[iofs++] = COLORS_RGBA[this.maria.pixels[i]];\n }\n }\n }\n // do interrupt? (if visible or before 1st scanline)\n if ((visible || sl == linesPerFrame-1) && this.maria.doInterrupt()) {\n this.probe.logInterrupt(0);\n this.cpu.NMI();\n }\n // post-DMA clocks\n while (mc < colorClocksPerLine) {\n if (this.maria.WSYNC) {\n this.probe.logWait(0);\n this.probe.logClocks((colorClocksPerLine - mc) >> 2);\n mc = colorClocksPerLine;\n break;\n }\n if (trap && trap()) {\n trap = null;\n sl = 999;\n break;\n }\n mc += this.advanceCPU() << 2;\n steps++;\n }\n // audio\n this.audio && this.audioadapter.generate(this.audio);\n // update clocks, scanline\n mc -= colorClocksPerLine;\n fc += mc;\n this.probe.logNewScanline();\n }\n /*\n // TODO let bkcol = this.maria.regs[0x0];\n // TODO $(this.video.canvas).css('background-color', COLORS_WEB[bkcol]);\n */\n this.lastFrameCycles = fc;\n return steps;\n }\n\n getRasterX() { return this.lastFrameCycles % colorClocksPerLine; }\n getRasterY() { return this.scanline; }\n\n loadROM(data) {\n if (data.length == 0xc080) data = data.slice(0x80); // strip header\n this.rom = padBytes(data, this.defaultROMSize, true);\n }\n\n reset() {\n super.reset();\n this.tia.reset();\n this.maria.reset();\n this.inputs.fill(0x0);\n this.inputs[SWCHA] = 0xff;\n this.inputs[SWCHB] = 1+2+8;\n //this.cpu.advanceClock(); // needed for test to pass?\n }\n\n readAddress(addr : number) {\n return this.read(addr) | 0;\n }\n\n loadState(state : Atari7800State) {\n this.cpu.loadState(state.c);\n this.ram.set(state.ram);\n this.tia.loadState(state.tia);\n this.maria.loadState(state.maria);\n this.regs6532.set(state.regs6532);\n this.loadControlsState(state);\n }\n saveState() : Atari7800State {\n return {\n c:this.cpu.saveState(),\n ram:this.ram.slice(0),\n tia:this.tia.saveState(),\n maria:this.maria.saveState(),\n regs6532:this.regs6532.slice(0),\n inputs:this.inputs.slice(0)\n };\n }\n loadControlsState(state:Atari7800ControlsState) : void {\n this.inputs.set(state.inputs);\n }\n saveControlsState() : Atari7800ControlsState {\n return {\n inputs:this.inputs.slice(0)\n };\n }\n\n getDebugCategories() {\n return ['CPU','Stack','TIA','MARIA'];\n }\n getDebugInfo(category, state) {\n switch (category) {\n case 'TIA': return TIA.stateToLongString(state.tia);\n case 'MARIA': return MARIA.stateToLongString(state.maria) + \"\\nScanline: \" + this.scanline;\n //default: return super.getDebugInfo(category, state);\n }\n }\n}\n\n///\n\nvar COLORS_RGBA = new Uint32Array(256);\nfor (var i=0; i<256; i++) {\n COLORS_RGBA[i] = gtia_ntsc_to_rgb(i);\n}\n\n", "\nimport { Atari7800 } from \"../machine/atari7800\";\nimport { Platform, Base6502MachinePlatform } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\n\nvar Atari7800_PRESETS = [\n {id:'sprites.dasm', name:'Sprites (ASM)'},\n {id:'wsync.c', name:'WSYNC'},\n {id:'sprites.c', name:'Double Buffering'},\n {id:'scroll.c', name:'Scrolling'},\n];\n\nclass Atari7800Platform extends Base6502MachinePlatform implements Platform {\n\n newMachine() { return new Atari7800(); }\n getPresets() { return Atari7800_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n readAddress(a) { return this.machine.readConst(a); }\n // TODO loadBIOS(bios)\t{ this.machine.loadBIOS(a); }\n getMemoryMap = function() { return { main:[\n {name:'TIA',start:0x00,size:0x20,type:'io'},\n {name:'MARIA',start:0x20,size:0x20,type:'io'},\n {name:'RAM (6166 Block 0)',start:0x40,size:0xc0,type:'ram'},\n {name:'RAM (6166 Block 1)',start:0x140,size:0xc0,type:'ram'},\n {name:'PIA',start:0x280,size:0x18,type:'io'},\n {name:'RAM',start:0x1800,size:0x1000,type:'ram'}, // TODO: shadow ram\n {name:'Cartridge ROM',start:0x4000,size:0xc000,type:'rom'},\n ] } };\n getROMExtension() { return \".a78\"; }\n}\n\n///\n\nPLATFORMS['atari7800'] = Atari7800Platform;\n"], - "mappings": "iMAgCA,GAAM,GAAQ,EACR,EAAQ,EACR,EAAQ,EAER,EAAwB,EAAe,CAC3C,CAAC,EAAK,EAAU,EAAM,EAAG,KACzB,CAAC,EAAK,EAAU,EAAM,EAAG,KACzB,CAAC,EAAK,OAAU,EAAO,IACvB,CAAC,EAAK,MAAU,EAAO,IACvB,CAAC,EAAK,GAAU,EAAO,KACvB,CAAC,EAAK,KAAU,EAAO,KACvB,CAAC,EAAK,KAAU,EAAO,KACvB,CAAC,EAAK,MAAU,EAAO,MAEvB,CAAC,EAAK,KAAU,EAAM,EAAG,KACzB,CAAC,EAAK,KAAU,EAAM,EAAG,KAGzB,CAAC,EAAK,MAAW,EAAO,IACxB,CAAC,EAAK,QAAW,EAAO,IACxB,CAAC,EAAK,QAAW,EAAO,IACxB,CAAC,EAAK,SAAW,EAAO,MAM1B,GAAM,GAAgB,IAChB,EAAkB,IAAI,GACtB,EAAqB,IACrB,EAAoB,GACpB,EAAkB,EAClB,EAAkB,EAAc,GAAG,EAIzC,OAAU,CAAV,aApEA,CAqEE,UAAO,GAAI,YAAW,IAEtB,OAAQ,CACN,KAAK,KAAK,KAAK,GAEjB,KAAK,EAAqB,CACxB,MAAO,MAAK,KAAK,GAAK,EAExB,MAAM,EAAY,EAAY,CAC5B,KAAK,KAAK,GAAK,EAEjB,WAAY,CACV,MAAO,CACL,KAAM,KAAK,KAAK,MAAM,IAG1B,UAAU,EAAG,CACX,OAAS,GAAE,EAAG,EAAE,GAAI,IAClB,KAAK,MAAM,EAAG,EAAE,KAAK,UAElB,mBAAkB,EAAgB,CACvC,GAAI,GAAI,GACR,UAAK,EAAQ,EAAM,KAAM,EAAG,IACrB,IAMX,OAAY,CAAZ,aAlGA,CAoGE,YAAkB,EAClB,UAAO,GAAI,YAAW,IACtB,YAAkB,GAClB,SAAe,EACf,aAAmB,EACnB,SAAgB,GAChB,SAAgB,GAChB,QAAe,GACf,YAAS,GAAI,YAAW,KACxB,WAAiB,EAEjB,OAAQ,CACN,KAAK,KAAK,KAAK,GAGjB,KAAK,EAAqB,CACxB,MAAO,MAAK,KAAK,GAAK,EAExB,MAAM,EAAY,EAAY,CAC5B,KAAK,KAAK,GAAK,EACX,GAAK,GAAM,KAAK,QAGtB,WAAY,CACV,MAAO,CACL,KAAM,KAAK,KAAK,MAAM,GACtB,OAAQ,KAAK,OACb,IAAK,KAAK,IACV,QAAS,KAAK,QACd,IAAK,KAAK,IACV,IAAK,KAAK,IACV,GAAI,KAAK,IAGb,UAAU,EAAG,CACX,OAAS,GAAE,EAAG,EAAE,GAAI,IAClB,KAAK,MAAM,EAAG,EAAE,KAAK,GAAG,GAC1B,KAAK,OAAS,EAAE,OAAO,EACvB,KAAK,IAAM,EAAE,IAAI,EACjB,KAAK,QAAU,EAAE,QAAQ,EACzB,KAAK,IAAM,CAAC,CAAC,EAAE,IACf,KAAK,IAAM,CAAC,CAAC,EAAE,IACf,KAAK,GAAK,CAAC,CAAC,EAAE,GAEhB,cAAe,CACb,MAAQ,MAAK,KAAK,IAAQ,KAAS,GAErC,aAAc,CACZ,MAAQ,MAAK,KAAK,KAAS,GAAK,KAAK,KAAK,IAE5C,oBAAqB,CACnB,MAAQ,MAAK,KAAK,KAAS,GAAK,KAAK,OAEvC,UAAU,EAAa,CACrB,AAAI,EACF,MAAK,KAAK,IAAS,IACnB,KAAK,OAAS,GACd,KAAK,IAAM,KAAK,cAChB,KAAK,IAAM,KAAK,KAAQ,MAAK,IAAI,KAAK,KAAK,KAAO,MAAS,GAE3D,KAAK,KAAK,IAAS,CAAC,IAGxB,aAAa,EAAK,CAEhB,GAAI,KAAK,KAAO,MAAU,OAC1B,GAAI,GAAI,EAAI,KAAK,KAAK,KACtB,KAAK,OAAU,EAAI,GACnB,KAAK,IAAO,GAAI,KAAS,EACzB,KAAK,GAAO,GAAI,KAAS,EACzB,KAAK,QAAW,GAAI,KAAK,KAAK,IAAI,IAAI,GAAK,EAAI,KAAK,KAAK,IAAI,GAE7D,KAAK,IAAO,KAAK,IAAM,EAAK,MAC5B,KAAK,IAAO,GAAI,KAAK,KAAK,KAAO,MAAS,EAE5C,QAAQ,EAAsB,CAC5B,MAAI,KAAI,OACF,MAAK,KAAQ,EAAI,MACjB,KAAK,IAAQ,EAAI,OAIzB,QAAQ,EAAqB,CAC3B,MAAI,MAAK,QAAQ,GACR,EAEP,MAAK,QAAU,EACR,KAAK,IAAI,KAAK,IAGzB,MAAM,EAAW,CAIf,GAHA,KAAK,IAAM,EACX,KAAK,OAAS,EACd,KAAK,OAAO,KAAK,KAAK,KAAK,IACvB,KAAK,eAAgB,CACvB,KAAK,QAAU,GAEX,KAAK,OAAS,GAChB,KAAK,aAAa,GAGpB,GAAI,GAAO,KAAK,QAAU,MACtB,EAAQ,KAAK,QAAU,IAC3B,EAAG,CAED,GAAI,GAAK,EAAI,KAAK,EAAS,GAAM,EAAK,MAClC,EAAK,EAAI,KAAK,EAAS,GAAM,EAAK,MAGtC,GAFI,GAAM,GAEN,GAAQ,MAAU,MACtB,GAAI,GAAK,EAAI,KAAK,EAAS,GAAM,EAAK,MAClC,EAAK,EAAI,KAAK,EAAS,GAAM,EAAK,MAClC,EAAW,GAEf,GAAK,GAAK,KAAO,EAAG,CAClB,GAAI,GAAM,GAAM,EACZ,EAAQ,GAAM,GAAK,IACnB,EAAO,EAAI,KAAK,EAAS,GAAM,EAAK,MACpC,EAAY,EAAK,IACrB,EAAY,GAAK,KAAS,EAC1B,GAAS,EACT,KAAK,QAAU,OACV,CAEL,GAAI,GAAO,EACP,EAAM,GAAM,EACZ,EAAQ,GAAM,GAAK,IACnB,EAAY,EAChB,GAAS,EACT,KAAK,QAAU,EAEjB,GAAI,GAAS,EAAQ,IAAM,GAAS,EAAE,KAAK,QAAW,MAAS,GAC/D,GAAQ,EAER,GAAI,GAAY,MAAK,KAAK,IAAQ,GAAQ,GAAU,EAAE,GAElD,EAAM,GAAa,MAAK,KAAK,IAAQ,KAAS,EAClD,AAAI,GAAO,IAAS,GAEpB,OAAS,GAAE,EAAG,EAAE,EAAO,IAAK,CAC1B,GAAI,GAAO,KAAK,QAAS,EAAO,EAAQ,IAAG,GAAO,EAAO,GACzD,GAAI,EAAU,CACZ,GAAI,GAAW,MAAK,KAAK,IAAQ,KAAK,QAAW,GAAK,EACtD,AAAI,GAAQ,EAAE,GACZ,KACA,KAAK,QAAU,GAEjB,EAAO,KAAK,QAAQ,GAGtB,OAAQ,OACD,GACH,OAAS,GAAE,EAAG,EAAE,EAAG,IAAK,CACtB,GAAI,GAAO,GAAQ,EAAK,EACxB,AAAI,EAAM,GACR,MAAK,OAAO,GAAQ,KAAK,OAAO,EAAK,GAAK,KAAK,KAAM,IAAK,GAAK,IAEjE,IAAS,EACT,EAAQ,EAAO,EAAK,IAEtB,UACG,OACA,GACH,OAAS,GAAE,EAAG,EAAE,EAAG,IAAK,CACtB,GAAI,GAAO,EAAO,IAAO,EAAI,EAC7B,AAAI,EAAM,GACR,MAAK,OAAO,GAAQ,KAAK,KAAM,IAAK,GAAK,IAE3C,IAAS,EACT,EAAQ,EAAO,EAAK,IAEtB,cAGC,KAAK,OAAS,GAEvB,KAAK,QAAU,EAEjB,MAAO,MAAK,OAEd,aAAwB,CACtB,MAAI,MAAK,KAAO,KAAK,OAAS,EAC5B,MAAK,IAAM,GACJ,IAEA,SAGJ,mBAAkB,EAAgB,CACvC,GAAI,GAAI,GACR,UAAK,EAAQ,EAAM,KAAM,EAAG,IAC5B,GAAK;AAAA,WAAgB,EAAK,GAAM,KAAK,KAAS,GAAK,EAAM,KAAK,IAAM,GAAK,OAAS,EAAI,EAAM,IAAI,GAChG,GAAK;AAAA,WAAgB,EAAI,EAAM,QAAQ,GACvC,GAAK;AAAA,WAAgB,EAAM,OAC3B,GAAK;AAAA,WAAgB,EAAM,IACpB,IAMJ,eAAwB,EAAyC,CA0BtE,aAAc,CACZ,QAzBF,kBAAe,QACf,iBAAc,IACd,uBAAoB,EACpB,yBAAsB,EACtB,oBAAiB,MACjB,sBAAmB,MACnB,gBAAa,EAGb,SAAmB,GAAI,YAAW,MAClC,cAAW,GAAI,YAAW,GAC1B,SAAY,GAAI,GAChB,WAAgB,GAAI,GAIpB,qBAAkB,EAClB,aAAU,EASR,KAAK,IAAM,GAAI,GACf,KAAK,KAAO,EAAkB,CAC1B,CAAC,EAAQ,GAAU,GAAM,AAAC,GAAQ,MAAK,UAAkB,KAAK,UAAU,KACxE,CAAC,EAAQ,GAAU,GAAM,AAAC,GAAQ,MAAK,UAAkB,KAAK,IAAI,KAAK,KACvE,CAAC,GAAQ,GAAU,GAAM,AAAC,GAAe,KAAK,MAAM,KAAK,IACzD,CAAC,GAAQ,IAAU,IAAM,AAAC,GAAe,KAAK,IAAI,EAAI,OACtD,CAAC,IAAQ,IAAU,IAAM,AAAC,GAAe,KAAK,KAAK,IACnD,CAAC,IAAQ,IAAS,IAAO,AAAC,GAAe,KAAK,IAAI,EAAI,OACtD,CAAC,IAAQ,IAAW,EAAK,AAAC,GAAQ,MAAK,UAAkB,KAAK,OAAO,KACrE,CAAC,KAAQ,MAAQ,MAAQ,AAAC,GAAe,KAAK,IAAI,EAAI,OACtD,CAAC,MAAQ,MAAS,KAAO,AAAC,GAAe,KAAK,KAAK,EAAI,OACvD,CAAC,MAAQ,MAAQ,MAAQ,AAAC,GAAe,KAAK,IAAM,KAAK,IAAI,EAAI,OAAU,GAC3E,CAAC,EAAQ,MAAQ,MAAQ,AAAC,GAAe,KAAK,OAAS,KAAK,MAAM,WAAW,MAEjF,KAAK,MAAQ,EAAkB,CAC3B,CAAC,GAAQ,GAAU,GAAM,CAAC,EAAE,IAAM,CAAE,KAAK,UAAW,KAAK,OAAO,eAAe,EAAG,KAClF,CAAC,EAAQ,GAAU,GAAM,CAAC,EAAE,IAAM,CAAE,KAAK,UAAW,KAAK,IAAI,MAAM,EAAE,KACrE,CAAC,GAAQ,GAAU,GAAM,CAAC,EAAE,IAAM,CAAE,KAAK,MAAM,MAAM,EAAE,KACvD,CAAC,GAAQ,IAAU,IAAM,CAAC,EAAE,IAAM,CAAE,KAAK,IAAI,EAAI,MAAS,IAC1D,CAAC,IAAQ,IAAU,IAAM,CAAC,EAAE,IAAM,CAAE,KAAK,MAAM,EAAE,KACjD,CAAC,IAAQ,IAAS,IAAO,CAAC,EAAE,IAAM,CAAE,KAAK,IAAI,EAAI,MAAS,IAC1D,CAAC,IAAQ,IAAW,EAAK,CAAC,EAAE,IAAM,CAAE,KAAK,UAAW,KAAK,SAAS,GAAK,IACvE,CAAC,KAAQ,MAAQ,MAAQ,CAAC,EAAE,IAAM,CAAE,KAAK,IAAI,EAAI,MAAU,IAC3D,CAAC,MAAQ,MAAS,KAAO,CAAC,EAAE,IAAM,CAAE,KAAK,MAAM,EAAI,KAAQ,KAC3D,CAAC,MAAQ,MAAQ,MAAQ,CAAC,EAAE,IAAM,IAClC,CAAC,EAAQ,MAAQ,MAAQ,CAAC,EAAE,IAAM,CAAE,KAAK,OAAS,KAAK,MAAM,WAAW,OAE5E,KAAK,oBAAoB,MACzB,KAAK,OAAS,KAAK,YAAY,MAC/B,KAAK,QAAU,EAAmB,KAAK,OAAQ,GAC/C,KAAK,OAAS,GAAI,GAClB,KAAK,aAAe,GAAI,GAAkB,KAAK,OAAQ,EAAiB,GAG1E,UAAU,EAAG,CAEX,GAAI,GAAW,KAAK,MACpB,KAAK,MAAQ,KACb,GAAI,GAAI,KAAK,KAAK,GAClB,YAAK,MAAQ,EACN,EAGT,UAAU,EAAmB,CAC3B,OAAQ,OACD,IAAK,MAAO,CAAC,KAAK,OAAO,GAAO,QAChC,IAAK,MAAO,CAAC,KAAK,OAAO,GAAO,YAC5B,MAAO,MAAK,OAAO,GAAG,GAInC,YAAsB,CACpB,GAAI,GAAM,MAAM,aAChB,MAAI,MAAK,SACP,IAAO,KAAK,QACZ,KAAK,MAAM,UAAU,KAAK,SAC1B,KAAK,QAAU,GAEV,EAGT,aAAa,EAAe,CAC1B,GAAI,GAAQ,KAAK,OACb,EAAO,EACP,EACA,EAAK,EACL,EAAK,EACL,EAAQ,EACZ,KAAK,MAAM,cAGX,OAAS,GAAG,EAAG,EAAG,EAAe,IAAM,CACrC,KAAK,SAAW,EAChB,GAAI,GAAU,EAAK,EAInB,IAHA,KAAK,MAAM,UAAU,CAAC,GACtB,KAAK,MAAM,MAAQ,EAEZ,EAAK,GACN,MAAK,MAAM,OADc,CAE7B,GAAI,GAAQ,IAAQ,CAClB,EAAO,KACP,EAAK,IACL,MAEF,GAAM,KAAK,cAAgB,EAC3B,IAGF,GAAI,EAAS,CAEX,GAAI,GAAY,KAAK,MAAM,MAAM,KAAK,QAItC,GAHA,KAAK,MAAM,UAAU,GAAa,GAClC,GAAM,EAEF,EACF,OAAS,GAAE,EAAG,EAAE,IAAK,IACnB,EAAM,KAAU,EAAY,KAAK,MAAM,OAAO,IAUpD,IALK,IAAW,GAAM,EAAc,IAAM,KAAK,MAAM,eACnD,MAAK,MAAM,aAAa,GACxB,KAAK,IAAI,OAGJ,EAAK,GAAoB,CAC9B,GAAI,KAAK,MAAM,MAAO,CACpB,KAAK,MAAM,QAAQ,GACnB,KAAK,MAAM,UAAW,EAAqB,GAAO,GAClD,EAAK,EACL,MAEF,GAAI,GAAQ,IAAQ,CAClB,EAAO,KACP,EAAK,IACL,MAEF,GAAM,KAAK,cAAgB,EAC3B,IAGF,KAAK,OAAS,KAAK,aAAa,SAAS,KAAK,OAE9C,GAAM,EACN,GAAM,EACN,KAAK,MAAM,iBAMb,YAAK,gBAAkB,EAChB,EAGT,YAAa,CAAE,MAAO,MAAK,gBAAkB,EAC7C,YAAa,CAAE,MAAO,MAAK,SAE3B,QAAQ,EAAM,CACZ,AAAI,EAAK,QAAU,OAAQ,GAAO,EAAK,MAAM,MAC7C,KAAK,IAAM,EAAS,EAAM,KAAK,eAAgB,IAGjD,OAAQ,CACN,MAAM,QACN,KAAK,IAAI,QACT,KAAK,MAAM,QACX,KAAK,OAAO,KAAK,GACjB,KAAK,OAAO,GAAS,IACrB,KAAK,OAAO,GAAS,EAAE,EAAE,EAI3B,YAAY,EAAe,CACzB,MAAO,MAAK,KAAK,GAAQ,EAG3B,UAAU,EAAwB,CAChC,KAAK,IAAI,UAAU,EAAM,GACzB,KAAK,IAAI,IAAI,EAAM,KACnB,KAAK,IAAI,UAAU,EAAM,KACzB,KAAK,MAAM,UAAU,EAAM,OAC3B,KAAK,SAAS,IAAI,EAAM,UACxB,KAAK,kBAAkB,GAEzB,WAA6B,CAC3B,MAAO,CACL,EAAE,KAAK,IAAI,YACX,IAAI,KAAK,IAAI,MAAM,GACnB,IAAI,KAAK,IAAI,YACb,MAAM,KAAK,MAAM,YACjB,SAAS,KAAK,SAAS,MAAM,GAC7B,OAAO,KAAK,OAAO,MAAM,IAG7B,kBAAkB,EAAqC,CACrD,KAAK,OAAO,IAAI,EAAM,QAExB,mBAA6C,CAC3C,MAAO,CACL,OAAO,KAAK,OAAO,MAAM,IAI7B,oBAAqB,CACnB,MAAO,CAAC,MAAM,QAAQ,MAAM,SAE9B,aAAa,EAAU,EAAO,CAC5B,OAAQ,OACD,MAAO,MAAO,GAAI,kBAAkB,EAAM,SAC1C,QAAS,MAAO,GAAM,kBAAkB,EAAM,OAAS;AAAA,YAAiB,KAAK,YAQpF,EAAc,GAAI,aAAY,KAClC,IAAS,EAAE,EAAG,EAAE,IAAK,IACnB,EAAY,GAAK,EAAiB,GAD3B,MC5gBT,GAAI,GAAoB,CACtB,CAAC,GAAG,eAAgB,KAAK,iBACzB,CAAC,GAAG,UAAW,KAAK,SACpB,CAAC,GAAG,YAAa,KAAK,oBACtB,CAAC,GAAG,WAAY,KAAK,cAGvB,eAAgC,EAAuD,CAAvF,aAZA,CAYA,oBAOE,kBAAe,UAAW,CAAE,MAAO,CAAE,KAAK,CACtC,CAAC,KAAK,MAAM,MAAM,EAAK,KAAK,GAAK,KAAK,MACtC,CAAC,KAAK,QAAQ,MAAM,GAAK,KAAK,GAAK,KAAK,MACxC,CAAC,KAAK,qBAAqB,MAAM,GAAK,KAAK,IAAK,KAAK,OACrD,CAAC,KAAK,qBAAqB,MAAM,IAAM,KAAK,IAAK,KAAK,OACtD,CAAC,KAAK,MAAM,MAAM,IAAM,KAAK,GAAK,KAAK,MACvC,CAAC,KAAK,MAAM,MAAM,KAAO,KAAK,KAAO,KAAK,OAC1C,CAAC,KAAK,gBAAgB,MAAM,MAAO,KAAK,MAAO,KAAK,UAZxD,YAAsB,CAAE,MAAO,IAAI,GACnC,YAAsB,CAAE,MAAO,GAC/B,qBAAsB,CAAE,MAAO,KAC/B,YAAY,EAAU,CAAE,MAAO,MAAK,QAAQ,UAAU,GAWtD,iBAAkB,CAAE,MAAO,SAK7B,EAAU,UAAe", - "names": [] -} diff --git a/gen/atari8-KH4TNW3W.js b/gen/atari8-KH4TNW3W.js deleted file mode 100644 index 0cb1fecd..00000000 --- a/gen/atari8-KH4TNW3W.js +++ /dev/null @@ -1,10 +0,0 @@ -import{a as ct}from"./chunk-PQDZBFBB.js";import{B as ht,I as ot,g as st,k as it,q as rt,t as at,y as nt}from"./chunk-HB3LWF25.js";import{$ as M,J as R,O as I,U as A,V as i,W as J,Y as tt,a as P,da as et,g as x,q as b}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.js";var Lt=[0,25,17,9],Kt=[0,25+64,17+80,9+96],y=0,wt=1,H=2,Q=3,Vt=4,Nt=5,Ft=7,Ut=9,C=10,Yt=11,Bt=12,Ht=13,lt=14,Qt=15,k=15;var jt=17-4,zt=110-4,Gt=105,Xt=[0,0,8,10,8,16,8,16,8,4,4,2,1,2,1,1],qt=[0,0,2,2,2,2,4,4,8,4,4,4,4,2,2,2],Wt=[0,0,0,0,0,1,0,1,0,0,2,1,0,0,0,0],ft=[0,0,1,1,2,2,2,2,8,4,4,2,2,2,2,1],D=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[lt]=0,this.regs[k]=127,this.regs[Bt]=0,this.regs[Ht]=255,this.setReg(y,0),this.h=this.v=0,this.startaddr=this.scanaddr=0,this.dmaclock=0}saveState(){return b(0,{},this)}loadState(t){b(0,this,t),this.setReg(y,t.regs[y])}static stateToLongString(t){let e="";return e+="H: "+P(t.h,3)+" V: "+P(t.v,3)+` -`,e+="DLIOp: "+x(t.dliop,2)+" Lines: "+t.yofs+"/"+t.linesleft,e+=" DMA "+(t.dma_enabled?"ON ":"off"),t.dma_enabled&&(e+=" idx "+t.dmaidx+" clk "+x(t.dmaclock)),e+=` -`,e+="Addr: "+x(t.scanaddr,4)+` -`,e+=A(t.regs,0,16).replace("$00","Regs"),e}setReg(t,e){switch(t){case C:this.regs[C]=255;return;case Qt:this.regs[k]=31;return}this.regs[t]=e}readReg(t){switch(t){case k:return this.regs[t];case Yt: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=Xt[this.mode],this.period=qt[this.mode],this.jmp?(this.regs[H]=this.dlarg_lo,this.regs[Q]=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[y]&3,e=this.dliop&16?(this.regs[Vt]&15)>>1:0;this.dliop&16&&t<3&&t++,this.left=Lt[t]+e,this.right=Kt[t]+e;let s=this.regs[Nt]&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[lt]&t&&this.nmi()}nextInsn(){let t=this.regs[H]+(this.regs[Q]<<8),e=this.read(t);return t=t+1&1023|t&~1023,this.regs[H]=t&255,this.regs[Q]=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[y]&32}isVisibleScanline(){return this.v>=8&&this.v<248}isPlayfieldDMAEnabled(){return this.dma_enabled&&!this.linesleft}isPlayerDMAEnabled(){return this.regs[y]&8}isMissileDMAEnabled(){return this.regs[y]&12}isWSYNC(){return this.regs[C]!=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<=Gt;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.hzt)&&(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[C]=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[y]&16,s=this.regs[Ft]<<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>>Wt[this.mode],a=s&7,h=this.regs[Ut];(t&14)==6?(e&=63,h&=254):(e&=127,h&=252);let n=(e<<3)+(h<<8);if((t&14)==2){let p=this.regs[wt],d=t==3&&(e&96)==96;p&4?this.pfbyte=this.read(n+(a^7)):this.pfbyte=this.read(n+a),d&&s<2&&(this.pfbyte=0),!d&&s>7&&(this.pfbyte=0),this.ch&128&&(p&1&&(this.pfbyte=0),p&2&&(this.pfbyte^=255))}else this.pfbyte=this.read(n+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 Zt=0;var $t=8,Jt=12,dt=13,xt=17,_=18,u=22,te=23,ee=24,se=25,E=26,L=27,ie=28,ut=29,re=30,ae=31,ne=0,he=4,oe=8,K=12,mt=16,j=31,gt=-9,w=[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],ce=[_+0,_+1,_+2,_+3,u+0,u+1,u+2,u+3,E,E,E,E,u+0,u+1,u+2,u+3],V=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=gt;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 b(0,{},this)}loadState(t){b(0,this,t)}setReg(t,e){switch(t){case _:case _+1:case _+2:case _+3:case u:case u+1:case u+2:case u+3:case E:e&=254;break;case re:this.readregs.fill(0,0,16);return}this.regs[t]=e}readReg(t){switch(t){case j:return this.readregs[t]&~this.regs[ae]}return this.readregs[t]}sync(){this.count=0}setBias(t){this.hbias=gt+t}updateGfx(t,e,s){switch(t){case 0:this.regs[ut]&1&&(this.regs[xt]=s);break;case 2:case 3:case 4:case 5:this.regs[ut]&2&&(!(e&1)||!(this.regs[ie]&1<>6){case 0:switch(this.an){case 0:return E;case 4:case 5:case 6:case 7:return u+this.an-4;case 8:return this.regs[ee]&240|this.regs[te]&15|256}break;case 1:return this.regs[E]&240|this.gtiacol&15|256;case 2:return ce[this.gtiacol];case 3:return this.regs[E]&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[L]&15)<<4,e=w[(this.an&7)+8+t],s=this.an-4,a=-1,h=0;for(let n=0;n<4;n++)if(this.shiftObject(n)){s>=0&&(this.readregs[he+n]|=1<=0&&(this.readregs[ne+n]|=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[L]&16&&t>=4?this.regs[se]:this.regs[_+(t&3)]}evalTrigger(t){this.regs[Zt+t]+this.hbias==this.count&&this.triggerObject(t)}triggerObject(t){let e,s;if(!!(this.pmDebugMask&1<>a&3,s=(this.regs[xt]>>a&3)<<6}e&1?s=pt(s):s<<=8,e==3?s=pt(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=bt[t],this.gtiacol2=this.gtiacol2<<1|this.an>>3}clockPulse4(){this.gtiacol=this.gtiacol2&15}static stateToLongString(t){let e="";return e+=`X: ${P(t.count,3)} ANTIC: ${x(t.an,1)} PM: ${x(t.pmcol,3)} -`,e+=`Write Registers: -`,e+=A(t.regs,0,32),e+=`Read Registers: -`,e+=A(t.readregs,0,32),e}};function pt(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 bt=new Uint32Array(256);for(v=0;v<256;v++)bt[v]=et(v);var v;var o=0;var le=2;var _t=4;var At=6;var m=8,fe=9,de=10,xe=11,ue=13,z=14,O=15;var me=8,ge=9,pe=10,be=13,T=14,N=15;var yt=128,Et=64,_e=32,St=16,Ot=8;var Ae=1,Rt=28,ye=114;var It=511,Tt=131071,l=0,f=1,g=2,c=3,S=114,Ee=15;var Se=8;var G,F;function Oe(){G=new Uint8Array(511),F=new Uint8Array(16385);let r=511;for(let t=0;t<511;t++)r=(((r>>5^r)&1)<<8)+(r>>1),G[t]=r;r=131071;for(let t=0;t<16385;t++)r=(((r>>5^r)&255)<<9)+(r>>8),F[t]=r>>1}var U=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 b(0,{},this)}loadState(t){b(0,this,t)}init(){this.readregs.fill(255),this.readregs[N]=239,this.basemult=Rt,this.pot_inputs.fill(128),Oe()}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=(F[a]>>s)+(F[a+1]<<8-s)}}break}return e&255}write(t,e){switch(t&=15,this.regs[t]=e,t){case m:e&Ae?this.basemult=ye:this.basemult=Rt,this.update_counter(1<=3?(this.readregs[T]|=8,this.DELAYED_XMTDONE_IRQ=2*this.DELAYED_SEROUT_IRQ-2):(this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0));break;case fe:this.divnirq[l]=this.divnmax[l],this.divnirq[f]=this.divnmax[f],this.divnirq[g]=this.divnmax[g],this.divnirq[c]=this.divnmax[c];break;case O: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[be]=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(l,1),this.advanceIRQTimer(f,2),this.advanceIRQTimer(c,4))}advanceIRQTimer(t,e){(this.divnirq[t]-=S)<0&&(this.divnirq[t]+=this.divnmax[t],this.generateIRQ(e))}generateIRQ(t){this.regs[z]&t&&(this.irq(),this.readregs[T]&=~t)}static stateToLongString(t){let e="";return e+=`Write Registers: -`,e+=A(t.regs,0,16),e+=`Read Registers: -`,e+=A(t.readregs,0,16),e}CASSETTE_IOLineStatus(){return 0}siocheck(){return((this.regs[o+g]==40||this.regs[o+g]==16||this.regs[o+g]==8||this.regs[o+g]==10)&&this.regs[o+c]==0||(this.regs[O]&120)==40)&&(this.regs[m]&40)==40}SIO_PutByte(t){console.log("SIO put byte",t)}SIO_GetByte(){return 0}};var Re=[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],Ie=tt([[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]]),Y=class extends rt{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 at,this.ram=new Uint8Array(65536),this.bios=new Uint8Array(10240),this.bus=this.newBus(),this.connectCPUMemoryBus(this.bus),this.antic=new D(this.readDMA.bind(this),this.antic_nmi.bind(this)),this.gtia=new V,this.irq_pokey=new U(this.pokey_irq.bind(this),()=>this.antic.h),this.audio_pokey=st(1),this.audioadapter=new it(this.audio_pokey.pokey1,this.audioOversample,this.sampleRate),this.handler=J(this.inputs,Ie,this.getKeyboardFunction(),!0)}newBus(){return{read:M([[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:M([[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[mt+t]=~this.inputs[2]>>t&1;this.gtia.readregs[j]=~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=ft[this.antic.mode],h=this.antic.h&1;return(a<8||h)&&(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 D.stateToLongString(e.antic);case"GTIA":return V.stateToLongString(e.gtia);case"POKEY":return U.stateToLongString(e.pokey)}}getKeyboardFunction(){return(t,e,s,a)=>{if(!this.keyboard_active)return!1;if(a&(I.KeyDown|I.KeyUp)){var h=Re;if(e==i.VK_F9.c)return this.irq_pokey.generateIRQ(128),!0;for(var n=0;n>8}if(e>t.length)throw new Error("Bad .XEX file format")}h>=0&&(s[a++]=169,s[a++]=160,s[a++]=141,s[a++]=255,s[a++]=213,s[a++]=76,s[a++]=h&255,s[a++]=h>>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}},X=class extends Y{newBus(){return{read:M([[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:M([[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 q=[{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)"}],Pt=q.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)"}]),Mt={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 vt(r){return r.endsWith(".bas")||r.endsWith(".fb")||r.endsWith(".fbi")?"fastbasic":nt(r)}var W=class extends ot{constructor(){super(...arguments);this.getToolForFilename=vt;this.showHelp=Dt;this.getROMExtension=Te;this.biosPath="res/altirra/kernel.rom"}newMachine(){return new Y}getPresets(){return Pt}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getMemoryMap(){return Mt}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")}},Ct=class extends W{constructor(){super(...arguments);this.biosPath="res/altirra/superkernel.rom"}getPresets(){return q}newMachine(){return new X}},Z=class extends ct{constructor(){super(...arguments);this.getToolForFilename=vt;this.getOpcodeMetadata=ht;this.showHelp=Dt}getPresets(){return q}getDefaultExtension(){return".asm"}},$=class extends Z{constructor(){super(...arguments);this.getMemoryMap=function(){return Mt}}getPresets(){return Pt}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(){}},kt=class extends Z{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 Te(r){return r==null?".bin":r[0]==255&&r[1]==255?".xex":".rom"}function Dt(){return"https://8bitworkshop.com/docs/platforms/atari8/"}R["atari8-800.xlmame"]=$;R["atari8-800xl.mame"]=$;R["atari8-5200.mame"]=kt;R["atari8-800"]=W;R["atari8-5200"]=Ct; -//# sourceMappingURL=atari8-KH4TNW3W.js.map diff --git a/gen/atari8-KH4TNW3W.js.map b/gen/atari8-KH4TNW3W.js.map deleted file mode 100644 index 8d22c7e3..00000000 --- a/gen/atari8-KH4TNW3W.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/machine/chips/antic.ts", "../src/machine/chips/gtia.ts", "../src/machine/chips/pokey.ts", "../src/machine/atari8.ts", "../src/platform/atari8.ts"], - "sourcesContent": ["import { dumpRAM } from \"../../common/emu\";\nimport { hex, lpad, safe_extend } from \"../../common/util\";\n\n// ANTIC\n// https://www.atarimax.com/jindroush.atari.org/atanttim.html\n// http://www.virtualdub.org/blog/pivot/entry.php?id=243\n// http://www.beipmu.com/Antic_Timings.txt\n// https://user.xmission.com/~trevin/atari/antic_regs.html\n// https://user.xmission.com/~trevin/atari/antic_insns.html\n// http://www.atarimuseum.com/videogames/consoles/5200/conv_to_5200.html\n// https://www.virtualdub.org/downloads/Altirra%20Hardware%20Reference%20Manual.pdf\n\nconst PF_LEFT = [0, 25, 17, 9];\nconst PF_RIGHT = [0, 25 + 64, 17 + 80, 9 + 96];\n\nconst DMACTL = 0;\nconst CHACTL = 1;\nconst DLISTL = 2;\nconst DLISTH = 3;\nconst HSCROL = 4;\nconst VSCROL = 5;\nconst PMBASE = 7;\nconst CHBASE = 9;\nconst WSYNC = 10;\nconst VCOUNT = 11;\nconst PENH = 12;\nconst PENV = 13;\nconst NMIEN = 14;\nconst NMIRES = 15;\nconst NMIST = 15;\n\nconst PFNONE = 0;\nconst PFNARROW = 1;\nconst PFNORMAL = 2;\nconst PFWIDE = 3;\n\nconst NMIST_CYCLE = 12;\nconst NMI_CYCLE = 24;\nconst WSYNC_CYCLE = 212;\n\nconst ANTIC_LEFT = 17 - 4; // gtia 34, 4 cycle delay\nconst ANTIC_RIGHT = 110 - 4; // gtia 221, 4 cycle delay\nconst LAST_DMA_H = 105; // last DMA cycle\n\nconst MODE_LINES = [0, 0, 8, 10, 8, 16, 8, 16, 8, 4, 4, 2, 1, 2, 1, 1];\n// how many bits before DMA clock repeats?\nconst MODE_PERIOD = [0, 0, 2, 2, 2, 2, 4, 4, 8, 4, 4, 4, 4, 2, 2, 2];\nconst MODE_YPERIOD = [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0];\n//const MODE_BPP = [0, 0, 1, 1, 2, 2, 1, 1, 2, 1, 2, 1, 1, 2, 2, 1];\n// how many color clocks / pixel * 2\nexport const MODE_SHIFT = [0, 0, 1, 1, 2, 2, 2, 2, 8, 4, 4, 2, 2, 2, 2, 1];\n\nexport class ANTIC {\n read: (address: number) => number;\t// bus read function\n nmi: () => void; // generate NMI\n\n regs = new Uint8Array(0x10);\t\t\t\t// registers\n\n left: number;\n right: number;\t\t\t\t\t// left/right clocks for mode\n\n dma_enabled: boolean = false;\n dliop: number = 0; // dli operation\n mode: number = 0;\t\t\t// current mode\n jmp = false; // TODO\n lms = false; // TODO\n dlarg_lo: number = 0;\n dlarg_hi: number = 0;\n period: number = 0;\t\t// current mode period bitmask\n scanaddr: number = 0; // Scan Address (via LMS)\n startaddr: number = 0;\t// Start of line Address\n pfbyte: number = 0;\t\t// playfield byte fetched\n ch: number = 0;\t\t\t\t// char read\n linesleft: number = 0; // # of lines left in mode\n yofs: number = 0;\t\t\t// yofs fine\n isfirstline: boolean = false;\n v: number = 0;\t\t\t\t\t// vertical scanline #\n h: number = 0;\t\t\t\t\t// horizontal color clock\n\n linebuf = new Uint8Array(48);\n dmaclock: number = 0;\n dmaidx: number = 0;\n output: number = 0;\n dramrefresh = false;\n in_vscroll = 0;\n\n constructor(readfn, nmifn) {\n this.read = readfn; // bus read function\n this.nmi = nmifn; // NMI function\n }\n reset() {\n this.regs.fill(0);\n this.regs[NMIEN] = 0x00;\n this.regs[NMIST] = 0x7f;\n this.regs[PENH] = 0x00;\n this.regs[PENV] = 0xff;\n this.setReg(DMACTL, 0x0);\n this.h = this.v = 0;\n this.startaddr = this.scanaddr = 0;\n this.dmaclock = 0;\n }\n saveState() {\n return safe_extend(0, {}, this);\n }\n loadState(s) {\n safe_extend(0, this, s);\n this.setReg(DMACTL, s.regs[DMACTL]);\n }\n static stateToLongString(state): string {\n let s = \"\";\n s += \"H: \" + lpad(state.h, 3) + \" V: \" + lpad(state.v, 3) + \"\\n\";\n s += \"DLIOp: \" + hex(state.dliop, 2) + \" Lines: \" + state.yofs + \"/\" + state.linesleft;\n s += \" DMA \" + (state.dma_enabled ? \"ON \" : \"off\")\n if (state.dma_enabled) s += \" idx \" + state.dmaidx + \" clk \" + hex(state.dmaclock) \n s += \"\\n\"\n s += \"Addr: \" + hex(state.scanaddr, 4) + \"\\n\";\n s += dumpRAM(state.regs, 0, 16).replace('$00', 'Regs');\n return s;\n }\n setReg(a: number, v: number) {\n switch (a) {\n case WSYNC:\n this.regs[WSYNC] = 0xff;\n return; // this is readonly (we reset it)\n case NMIRES:\n this.regs[NMIST] = 0x1f;\n return; // this is readonly, don't mess with it\n }\n this.regs[a] = v;\n }\n readReg(a: number) {\n switch (a) {\n case NMIST:\n return this.regs[a];\n case VCOUNT:\n return this.v >> 1;\n default:\n return 0xff;\n }\n }\n processDLIEntry() {\n if (this.mode == 0) { // N Blank Lines\n this.linesleft = ((this.dliop >> 4) & 7) + 1;\n this.dmaclock = 0;\n } else {\n this.linesleft = MODE_LINES[this.mode];\n this.period = MODE_PERIOD[this.mode];\n if (this.jmp) {\n this.regs[DLISTL] = this.dlarg_lo;\n this.regs[DLISTH] = this.dlarg_hi;\n this.mode = this.period = 0;\n // JVB (Jump and wait for Vertical Blank)\n if (this.dliop & 0x40) {\n this.linesleft = 1; //(248 - this.v) & 0xff; // TODO?\n this.dma_enabled = false;\n }\n this.dmaclock = 0;\n } else if (this.lms) {\n this.scanaddr = this.dlarg_lo + (this.dlarg_hi << 8);\n //console.log('scanaddr', hex(this.scanaddr));\n }\n this.startaddr = this.scanaddr;\n // horiz scroll\n let effwidth = this.regs[DMACTL] & 3;\n let hscroll = (this.dliop & 0x10) ? (this.regs[HSCROL] & 15) >> 1 : 0;\n if ((this.dliop & 0x10) && effwidth < 3) effwidth++;\n this.left = PF_LEFT[effwidth] + hscroll;\n this.right = PF_RIGHT[effwidth] + hscroll;\n // vertical scroll\n let vscrol = this.regs[VSCROL] & 0xf;\n if ((this.dliop & 0x20) ^ this.in_vscroll) {\n if (this.in_vscroll) {\n this.linesleft = vscrol+1; // exiting\n } else {\n this.linesleft -= vscrol; // entering\n this.yofs += vscrol;\n }\n this.linesleft &= 0xf;\n this.in_vscroll ^= 0x20;\n }\n }\n }\n\n nextLine() {\n if (this.linesleft > 0) {\n this.linesleft--;\n this.yofs++;\n this.isfirstline = false;\n if (this.mode >= 8 && this.linesleft) {\n this.scanaddr = this.startaddr; // reset line addr\n }\n }\n }\n\n triggerNMI(mask: number) {\n this.regs[NMIST] = mask | 0x1f;\n if (this.regs[NMIEN] & mask) {\n this.nmi();\n }\n }\n\n nextInsn(): number {\n let pc = this.regs[DLISTL] + (this.regs[DLISTH] << 8);\n let b = this.read(pc);\n //console.log('nextInsn', hex(pc), hex(b), this.v);\n pc = ((pc + 1) & 0x3ff) | (pc & ~0x3ff);\n this.regs[DLISTL] = pc & 0xff;\n this.regs[DLISTH] = pc >> 8;\n return b;\n }\n\n nextScreen(): number {\n let b = this.read(this.scanaddr);\n this.incScanAddr();\n return b;\n }\n incScanAddr() {\n this.scanaddr = ((this.scanaddr + 1) & 0xfff) | (this.scanaddr & ~0xfff);\n }\n\n dlDMAEnabled() { return this.regs[DMACTL] & 0b100000; }\n\n isVisibleScanline() {\n return this.v >= 8 && this.v < 248;\n }\n isPlayfieldDMAEnabled() {\n return this.dma_enabled && !this.linesleft;\n }\n isPlayerDMAEnabled() {\n return this.regs[DMACTL] & 0b1000;\n }\n isMissileDMAEnabled() {\n return this.regs[DMACTL] & 0b1100;\n }\n isWSYNC() {\n return this.regs[WSYNC] != 0;\n }\n\n clockPulse(): boolean {\n let did_dma = this.isWSYNC();\n if (!this.isVisibleScanline()) {\n this.doVBlank();\n } else {\n switch (this.h) {\n case 0:\n if (this.isMissileDMAEnabled()) {\n this.doPlayerMissileDMA(3);\n did_dma = true;\n }\n break;\n case 1:\n if (this.isPlayfieldDMAEnabled()) {\n let op = this.nextInsn(); // get mode\n // TODO: too many booleans\n this.jmp = (op & ~0x40) == 0x01; // JMP insn?\n this.lms = (op & 0x40) != 0 && (op & 0xf) != 0; // LMS insn?\n this.mode = op & 0xf;\n this.dliop = op;\n this.yofs = 0;\n this.isfirstline = true;\n did_dma = true;\n }\n break;\n case 2: case 3: case 4: case 5:\n if (this.isPlayerDMAEnabled()) {\n this.doPlayerMissileDMA(this.h + 2);\n did_dma = true;\n }\n break;\n case 6:\n case 7:\n if (this.isPlayfieldDMAEnabled() && this.isfirstline && (this.jmp || this.lms)) {\n if (this.h == 6) this.dlarg_lo = this.nextInsn();\n if (this.h == 7) this.dlarg_hi = this.nextInsn();\n did_dma = true;\n }\n break;\n case 8:\n // TODO? is this at cycle 8?\n if (this.isfirstline) {\n this.processDLIEntry();\n }\n if (this.dliop & 0x80) { // TODO: what if DLI disabled?\n if (this.linesleft == 1) {\n this.triggerNMI(0x80); // DLI interrupt\n }\n }\n break;\n case 9:\n break;\n case 111:\n if (this.dma_enabled) this.nextLine();\n ++this.v;\n break;\n }\n this.output = 0; // background color (TODO: only for blank lines)\n if (this.mode >= 2 && this.period) {\n let candma = this.h <= LAST_DMA_H;\n this.dmaclock = (this.dmaclock << 1) & 0x1ff;\n if (this.dmaclock & (1 << this.period)) {\n this.dmaclock |= 1;\n }\n if (this.h == this.left) { this.dmaclock |= 1; this.dmaidx = 0; }\n if (this.h == this.right) { this.dmaclock &= ~1; this.dmaidx++; }\n if (this.dmaclock & 1) {\n if (this.mode < 8 && this.isfirstline) { // only read chars on 1st line\n if (candma) {\n this.linebuf[this.dmaidx] = this.nextScreen(); // read char name\n } else {\n this.incScanAddr();\n }\n did_dma = candma;\n }\n this.dmaidx++;\n } else if (this.dmaclock & 8) {\n this.ch = this.linebuf[this.dmaidx - 4 / this.period]; // latch char\n if (candma) {\n this.readBitmapData(); // read bitmap\n } else {\n if (this.mode >= 8) this.incScanAddr();\n }\n did_dma = candma;\n }\n this.output = this.h >= this.left + 3 && this.h <= this.right + 2 ? 4 : 0;\n }\n }\n if (this.h < ANTIC_LEFT || this.h > ANTIC_RIGHT) this.output = 2;\n this.incHorizCounter();\n if (!did_dma && this.dramrefresh) {\n this.read(0); // to log a VRAM_READ event\n this.dramrefresh = false;\n did_dma = true;\n }\n return did_dma;\n }\n incHorizCounter() {\n switch (this.h) {\n case 25: case 25 + 4 * 1: case 25 + 4 * 2: case 25 + 4 * 3: case 25 + 4 * 4:\n case 25 + 4 * 5: case 25 + 4 * 6: case 25 + 4 * 7: case 25 + 4 * 8:\n this.dramrefresh = true;\n break;\n case 102:\n this.regs[WSYNC] = 0; // TODO: dram refresh delay to 106?\n break;\n case 113:\n this.h = 0;\n return\n }\n ++this.h;\n }\n doVBlank() {\n this.linesleft = this.mode = this.period = 0;\n if (this.h == 111) { this.v++; }\n if (this.v == 248 && this.h == 0) { this.triggerNMI(0x40); } // VBI\n if (this.v == 262 && this.h == 112) { this.v = 0; }\n if (this.v == 7 && this.h == 113) { \n this.dma_enabled = this.dlDMAEnabled() != 0;\n }\n this.output = 2; // blank\n this.dmaclock = 0;\n }\n\n doPlayerMissileDMA(section: number) {\n let oneline = this.regs[DMACTL] & 0x10;\n let pmaddr = this.regs[PMBASE] << 8;\n if (oneline) {\n pmaddr &= 0xf800;\n pmaddr |= section << 8;\n pmaddr |= this.v & 0xff;\n } else {\n pmaddr &= 0xfc00;\n pmaddr |= section << 7;\n pmaddr |= this.v >> 1;\n }\n this.read(pmaddr);\n }\n\n readBitmapData() {\n const mode = this.mode;\n if (mode < 8) {\t// character mode\n let ch = this.ch;\n let y = this.yofs >> MODE_YPERIOD[this.mode];\n let addrofs = y & 7;\n let chbase = this.regs[CHBASE];\n // modes 6 & 7\n if ((mode & 0xe) == 6) { // or 7\n ch &= 0x3f;\n chbase &= 0xfe;\n } else {\n ch &= 0x7f;\n chbase &= 0xfc;\n }\n let addr = (ch << 3) + (chbase << 8);\n // modes 2 & 3\n if ((mode & 0xe) == 2) { // or 3\n let chactl = this.regs[CHACTL];\n let mode3lc = mode == 3 && (ch & 0x60) == 0x60;\n if (chactl & 4)\n this.pfbyte = this.read(addr + (addrofs ^ 7)); // mirror\n else\n this.pfbyte = this.read(addr + addrofs);\n if (mode3lc && y < 2) { this.pfbyte = 0; }\n if (!mode3lc && y > 7) { this.pfbyte = 0; }\n if (this.ch & 0x80) {\n if (chactl & 1)\n this.pfbyte = 0x0; // blank\n if (chactl & 2)\n this.pfbyte ^= 0xff; // invert\n }\n } else {\n this.pfbyte = this.read(addr + addrofs);\n }\n } else {\t// map mode\n this.pfbyte = this.nextScreen();\n }\n }\n\n shiftout() {\n if (this.output == 4) { // visible pixel?\n switch (this.mode) {\n case 2: case 3:\n case 15:\n {\n let v = (this.pfbyte >> 7) & 1;\n this.pfbyte <<= 1;\n return v ? 8 : 6;\n }\n case 6: case 7:\n {\n let v = (this.pfbyte >> 7) & 1;\n this.pfbyte <<= 1;\n return v ? (this.ch >> 6) + 4 : 0;\n }\n case 9: case 11: case 12:\n {\n let v = (this.pfbyte >> 7) & 1;\n this.pfbyte <<= 1;\n return v ? 4 : 0;\n }\n case 4: case 5:\n {\n let v = (this.pfbyte >> 6) & 3;\n this.pfbyte <<= 2;\n if (this.ch & 0x80)\n return [0, 4, 5, 7][v];\n else\n return [0, 4, 5, 6][v];\n }\n case 8: case 10:\n case 13: case 14:\n {\n let v = (this.pfbyte >> 6) & 3;\n this.pfbyte <<= 2;\n return [0, 4, 5, 6][v];\n }\n }\n }\n return this.output;\n }\n\n}\n", "\n// GTIA\n// https://user.xmission.com/~trevin/atari/gtia_regs.html\n// https://user.xmission.com/~trevin/atari/gtia_pinout.html\n\nimport { dumpRAM, gtia_ntsc_to_rgb } from \"../../common/emu\";\nimport { hex, lpad, safe_extend } from \"../../common/util\";\n\n\n// write regs\nconst HPOSP0 = 0x0;\nconst HPOSM0 = 0x4;\nconst SIZEP0 = 0x8;\nconst SIZEM = 0x0c;\nconst GRAFP0 = 0x0d;\nconst GRAFM = 0x11;\nconst COLPM0 = 0x12;\nconst COLPF0 = 0x16;\nconst COLPF1 = 0x17;\nconst COLPF2 = 0x18;\nconst COLPF3 = 0x19;\nconst COLBK = 0x1a;\nconst PRIOR = 0x1b;\nconst VDELAY = 0x1c; // TODO\nconst GRACTL = 0x1d;\nconst HITCLR = 0x1e;\nconst CONSPK = 0x1f;\n// read regs\nconst M0PF = 0x0;\nconst P0PF = 0x4;\nconst M0PL = 0x8;\nconst P0PL = 0xc;\nexport const TRIG0 = 0x10;\nexport const CONSOL = 0x1f;\n\nconst HOFFSET = -9; // bias to account for antic->gtia delay\n\nconst PRIOR_TABLE : number[] = [\n 0,1,2,3, 7,7,7,7, 8,8,8,8, 4,5,6,7, // 0001 - 0\n 0,1,2,3, 7,7,7,7, 8,8,8,8, 4,5,6,7, // 0001\n 0,1,6,7, 5,5,5,5, 8,8,8,8, 2,3,4,5, // 0010 - 2\n 0,1,6,7, 5,5,5,5, 8,8,8,8, 2,3,4,5, // 0010\n 4,5,6,7, 3,3,3,3, 8,8,8,8, 0,1,2,3, // 0100 - 4\n 4,5,6,7, 3,3,3,3, 8,8,8,8, 0,1,2,3, // 0100\n 4,5,6,7, 3,3,3,3, 8,8,8,8, 0,1,2,3, // 0100\n 4,5,6,7, 3,3,3,3, 8,8,8,8, 0,1,2,3, // 0100\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000 - 8\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n];\n\nconst MODE_9_LOOKUP = [\n COLPM0+0, COLPM0+1, COLPM0+2, COLPM0+3,\n COLPF0+0, COLPF0+1, COLPF0+2, COLPF0+3,\n COLBK, COLBK, COLBK, COLBK,\n COLPF0+0, COLPF0+1, COLPF0+2, COLPF0+3,\n]\n\nexport class GTIA {\n regs = new Uint8Array(0x20);\n readregs = new Uint8Array(0x20);\n shiftregs = new Uint32Array(8);\n\n count = 0;\n an = 0;\n rgb = 0;\n pmcol = 0;\n gtiacol = 0;\n gtiacol2 = 0;\n hbias = HOFFSET;\n pmDebugMask = -1;\n\n reset() {\n this.regs.fill(0);\n this.readregs.fill(0); // TODO?\n this.readregs[0x14] = 0xf; // NTSC\n this.readregs.fill(0xf, 0x15); // default value for write-only regs\n this.count = 0;\n }\n saveState() {\n return safe_extend(0, {}, this);\n }\n loadState(s) {\n safe_extend(0, this, s);\n }\n setReg(a: number, v: number) {\n switch (a) {\n case COLPM0: case COLPM0+1: case COLPM0+2: case COLPM0+3:\n case COLPF0: case COLPF0+1: case COLPF0+2: case COLPF0+3:\n case COLBK:\n v &= 0xfe; // bit 0 unused in color regs\n break;\n case HITCLR:\n this.readregs.fill(0, 0, 16);\n return;\n }\n this.regs[a] = v;\n }\n readReg(a: number) {\n switch (a) {\n case CONSOL:\n return this.readregs[a] & ~this.regs[CONSPK];\n }\n return this.readregs[a];\n }\n sync() {\n this.count = 0;\n }\n setBias(b: number) {\n this.hbias = HOFFSET + b;\n }\n updateGfx(h: number, v: number, data: number) {\n switch (h) {\n case 0:\n if (this.regs[GRACTL] & 1) {\n // TODO: VDELAY\n this.regs[GRAFM] = data;\n }\n break;\n case 2: case 3: case 4: case 5:\n if (this.regs[GRACTL] & 2) {\n if (!(v&1) || !(this.regs[VDELAY] & (1<<(h+2))))\n this.regs[GRAFP0 - 2 + h] = data;\n }\n break;\n }\n }\n getPlayfieldColor(): number {\n // which GTIA mode?\n switch (this.regs[PRIOR] >> 6) {\n // normal mode\n case 0:\n switch (this.an) {\n case 0:\n return COLBK;\n case 4: case 5: case 6: case 7:\n return COLPF0 + this.an - 4;\n case 8:\n // combine PF2 hue and PF1 luminance\n return (this.regs[COLPF2] & 0xf0) | (this.regs[COLPF1] & 0x0f) | 0x100;\n }\n break;\n // mode 9 -- 16 luminances\n case 1:\n return (this.regs[COLBK] & 0xf0) | (this.gtiacol & 0xf) | 0x100;\n // mode 10 -- 9 colors from registers\n case 2:\n return MODE_9_LOOKUP[this.gtiacol];\n // mode 11 -- 16 hues\n case 3:\n return (this.regs[COLBK] & 0xf) | (this.gtiacol << 4) | 0x100;\n }\n return 0x100; // black\n }\n anySpriteActive() {\n return this.shiftregs[0] || this.shiftregs[1] || this.shiftregs[2]\n || this.shiftregs[3] || this.shiftregs[4] || this.shiftregs[5]\n || this.shiftregs[6] || this.shiftregs[7];\n }\n processPlayerMissile() {\n // no p/m gfx, just evaluate horiz. triggers\n if (!this.anySpriteActive()) {\n this.evalTrigger(0);\n this.evalTrigger(1);\n this.evalTrigger(2);\n this.evalTrigger(3);\n this.evalTrigger(4);\n this.evalTrigger(5);\n this.evalTrigger(6);\n this.evalTrigger(7);\n this.pmcol = -1;\n return;\n }\n // no collisions in blank area, but shift and trigger anyway\n if (this.an == 2) {\n this.shiftObject(0);\n this.shiftObject(1);\n this.shiftObject(2);\n this.shiftObject(3);\n this.shiftObject(4);\n this.shiftObject(5);\n this.shiftObject(6);\n this.shiftObject(7);\n this.pmcol = -1;\n return;\n }\n // TODO: gtia, hi-res mode collisions\n // compute gfx and collisions for players/missiles\n let priobias = (this.regs[PRIOR] & 15) << 4; // TODO\n let topprio = PRIOR_TABLE[(this.an & 7) + 8 + priobias];\n let pfset = this.an - 4; // TODO?\n let topobj = -1;\n let ppmask = 0;\n // players\n for (let i = 0; i < 4; i++) {\n let bit = this.shiftObject(i);\n if (bit) {\n if (pfset >= 0) { // TODO: hires and GTIA modes\n this.readregs[P0PF + i] |= 1 << pfset;\n }\n ppmask |= 1 << i;\n let prio = PRIOR_TABLE[i + priobias];\n if (prio < topprio) {\n topobj = i;\n topprio = prio;\n }\n }\n }\n // missiles\n for (let i = 0; i < 4; i++) {\n let bit = this.shiftObject(i + 4);\n if (bit) {\n if (pfset >= 0) {\n this.readregs[M0PF + i] |= 1 << pfset;\n }\n this.readregs[M0PL + i] |= ppmask;\n let prio = (this.regs[PRIOR] & 0x10) \n ? PRIOR_TABLE[priobias + 15]\n : PRIOR_TABLE[i + priobias];\n if (prio < topprio) {\n topobj = i + 4;\n topprio = prio;\n }\n }\n }\n // set player-player collision flags\n // TODO: either as a player or a GTIA mode 2 color\n if (ppmask & 1) this.readregs[P0PL + 0] |= ppmask & ~1;\n if (ppmask & 2) this.readregs[P0PL + 1] |= ppmask & ~2;\n if (ppmask & 4) this.readregs[P0PL + 2] |= ppmask & ~4;\n if (ppmask & 8) this.readregs[P0PL + 3] |= ppmask & ~8;\n this.pmcol = topobj >= 0 ? this.getObjectColor(topobj) : -1;\n }\n shiftObject(i: number) {\n let bit = (this.shiftregs[i] & 0x80000000) != 0;\n this.shiftregs[i] <<= 1;\n this.evalTrigger(i);\n return bit;\n }\n getObjectColor(i: number) {\n if ((this.regs[PRIOR] & 0x10) && i >= 4) {\n return this.regs[COLPF3];\n } else {\n return this.regs[COLPM0 + (i & 3)];\n }\n }\n evalTrigger(i: number) {\n if (this.regs[HPOSP0 + i] + this.hbias == this.count) {\n this.triggerObject(i);\n }\n }\n triggerObject(i: number) {\n let size, data;\n if (!(this.pmDebugMask & (1<> s) & 3;\n data = ((this.regs[GRAFM] >> s) & 3) << 6;\n }\n if (size & 1) data = expandBits(data); else data <<= 8;\n if (size == 3) data = expandBits(data); else data <<= 16;\n this.shiftregs[i] |= data;\n }\n\n clockPulse1(): void {\n this.processPlayerMissile();\n this.clockPulse2();\n this.count++;\n }\n\n clockPulse2(): void {\n var col: number;\n if (this.pmcol >= 0) {\n col = this.pmcol;\n } else {\n let pf = this.getPlayfieldColor();\n col = pf & 0x100 ? pf & 0xff : this.regs[pf];\n }\n this.rgb = COLORS_RGBA[col];\n // TODO: hires modes return 8, so other modes wont work\n this.gtiacol2 = (this.gtiacol2 << 1) | (this.an >> 3);\n }\n\n clockPulse4() {\n // latch GTIA buffer\n this.gtiacol = this.gtiacol2 & 15;\n }\n\n static stateToLongString(state): string {\n let s = ''\n s += `X: ${lpad(state.count, 3)} ANTIC: ${hex(state.an, 1)} PM: ${hex(state.pmcol, 3)}\\n`;\n s += \"Write Registers:\\n\";\n s += dumpRAM(state.regs, 0, 32);\n s += \"Read Registers:\\n\";\n s += dumpRAM(state.readregs, 0, 32);\n return s;\n }\n}\n\nfunction expandBits(x: number): number {\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n return x | (x << 1);\n}\n\nvar COLORS_RGBA = new Uint32Array(256);\nfor (var i = 0; i < 256; i++) {\n COLORS_RGBA[i] = gtia_ntsc_to_rgb(i);\n}\n\n", "/*\n * pokey.c - POKEY sound chip emulation\n *\n * Copyright (C) 1995-1998 David Firth\n * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS)\n *\n * This file is part of the Atari800 emulator project which emulates\n * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers.\n *\n * Atari800 is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version.\n *\n * Atari800 is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Atari800; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n*/\n\nimport { dumpRAM } from \"../../common/emu\"\nimport { hex, lpad, safe_extend } from \"../../common/util\"\n\nconst AUDF1 = 0x00\nconst AUDC1 = 0x01\nconst AUDF2 = 0x02\nconst AUDC2 = 0x03\nconst AUDF3 = 0x04\nconst AUDC3 = 0x05\nconst AUDF4 = 0x06\nconst AUDC4 = 0x07\nconst AUDCTL = 0x08\nconst STIMER = 0x09\nconst SKRES = 0x0a\nconst POTGO = 0x0b\nconst SEROUT = 0x0d\nconst IRQEN = 0x0e\nconst SKCTL = 0x0f\n\nconst POT0 = 0x00\nconst POT1 = 0x01\nconst POT2 = 0x02\nconst POT3 = 0x03\nconst POT4 = 0x04\nconst POT5 = 0x05\nconst POT6 = 0x06\nconst POT7 = 0x07\nconst ALLPOT = 0x08\nconst KBCODE = 0x09\nconst RANDOM = 0x0a\nconst SERIN = 0x0d\nconst IRQST = 0x0e\nconst SKSTAT = 0x0f\n\n/* definitions for AUDCx (D201, D203, D205, D207) */\nconst NOTPOLY5 = 0x80 /* selects POLY5 or direct CLOCK */\nconst POLY4 = 0x40 /* selects POLY4 or POLY17 */\nconst PURETONE = 0x20 /* selects POLY4/17 or PURE tone */\nconst VOL_ONLY = 0x10 /* selects VOLUME OUTPUT ONLY */\nconst VOLUME_MASK = 0x0f /* volume mask */\n\n/* definitions for AUDCTL (D208) */\nconst POLY9 = 0x80 /* selects POLY9 or POLY17 */\nconst CH1_179 = 0x40 /* selects 1.78979 MHz for Ch 1 */\nconst CH3_179 = 0x20 /* selects 1.78979 MHz for Ch 3 */\nconst CH1_CH2 = 0x10 /* clocks channel 1 w/channel 2 */\nconst CH3_CH4 = 0x08 /* clocks channel 3 w/channel 4 */\nconst CH1_FILTER = 0x04 /* selects channel 1 high pass filter */\nconst CH2_FILTER = 0x02 /* selects channel 2 high pass filter */\nconst CLOCK_15 = 0x01 /* selects 15.6999kHz or 63.9210kHz */\n\n/* for accuracy, the 64kHz and 15kHz clocks are exact divisions of\n the 1.79MHz clock */\nconst DIV_64 = 28 /* divisor for 1.79MHz clock to 64 kHz */\nconst DIV_15 = 114 /* divisor for 1.79MHz clock to 15 kHz */\n\n/* the size (in entries) of the 4 polynomial tables */\nconst POLY4_SIZE = 0x000f\nconst POLY5_SIZE = 0x001f\nconst POLY9_SIZE = 0x01ff\nconst POLY17_SIZE = 0x0001ffff\n\nconst CHAN1 = 0\nconst CHAN2 = 1\nconst CHAN3 = 2\nconst CHAN4 = 3\n\nconst ANTIC_LINE_C = 114\n\n/* Some defines about the serial I/O timing. Currently fixed! */\nconst SIO_XMTDONE_INTERVAL = 15\nconst SIO_SERIN_INTERVAL = 8\nconst SIO_SEROUT_INTERVAL = 8\nconst SIO_ACK_INTERVAL = 36\n\nvar poly9: Uint8Array;\nvar poly17: Uint8Array;\n\nfunction initPolyTables() {\n poly9 = new Uint8Array(511);\n poly17 = new Uint8Array(16385);\n /* initialise poly9_lookup */\n let reg = 0x1ff;\n for (let i = 0; i < 511; i++) {\n reg = ((((reg >> 5) ^ reg) & 1) << 8) + (reg >> 1);\n poly9[i] = reg;\n }\n /* initialise poly17_lookup */\n reg = 0x1ffff;\n for (let i = 0; i < 16385; i++) {\n reg = ((((reg >> 5) ^ reg) & 0xff) << 9) + (reg >> 8);\n poly17[i] = (reg >> 1);\n }\n}\n\nexport class POKEY {\n regs = new Uint8Array(16);\n readregs = new Uint8Array(16);\n divnirq = new Uint32Array(4);\n divnmax = new Uint32Array(4);\n pot_inputs = new Uint8Array(8);\n basemult = 0;\n pot_scanline = 0;\n random_scanline_counter = 0;\n kbcode = 0;\n DELAYED_SERIN_IRQ = 0;\n DELAYED_SEROUT_IRQ = 0;\n DELAYED_XMTDONE_IRQ = 0;\n\n constructor(\n public irq: () => void,\n public antic_xpos: () => number,\n ) {\n this.init();\n }\n\n saveState() {\n return safe_extend(0, {}, this);\n }\n loadState(s) {\n safe_extend(0, this, s);\n }\n\n init() {\n /* Initialise Serial Port Interrupts */\n //DELAYED_SERIN_IRQ = 0;\n //DELAYED_SEROUT_IRQ = 0;\n //DELAYED_XMTDONE_IRQ = 0;\n this.readregs.fill(0xff);\n this.readregs[SKSTAT] = 0xef;\n //SERIN = 0x00;\t/* or 0xff ? */\n //IRQEN = 0x00;\n //SKCTL = 0x00;\n this.basemult = DIV_64;\n this.pot_inputs.fill(128);\n initPolyTables();\n }\n\n\n read(addr: number): number {\n let byte = this.readregs[addr];\n addr &= 0xf;\n switch (addr) {\n case 0: case 1: case 2: case 3:\n case 4: case 5: case 6: case 7:\n byte = this.pot_inputs[addr];\n return (byte < this.pot_scanline) ? byte : this.pot_scanline;\n case ALLPOT:\n for (let i = 0; i < 8; i++) {\n if (this.pot_inputs[i] <= this.pot_scanline)\n byte &= ~(1 << i);\t\t// reset bit if pot value known\n }\n break;\n case KBCODE:\n return this.kbcode;\n case SKSTAT:\n byte = SKSTAT + (this.CASSETTE_IOLineStatus() << 4);\n break;\n case RANDOM:\n if ((this.regs[SKCTL] & 0x03) != 0) {\n let i = this.random_scanline_counter + this.antic_xpos();\n if (this.regs[AUDCTL] & POLY9)\n byte = poly9[i % POLY9_SIZE];\n else {\n i %= POLY17_SIZE;\n let ptr = i >> 3;\n i &= 7;\n byte = (poly17[ptr] >> i) + (poly17[ptr + 1] << (8 - i));\n }\n }\n break;\n }\n return byte & 0xff;\n }\n\n write(addr: number, byte: number): void {\n addr &= 0x0f;\n this.regs[addr] = byte;\n switch (addr) {\n case AUDCTL:\n /* determine the base multiplier for the 'div by n' calculations */\n if (byte & CLOCK_15)\n this.basemult = DIV_15;\n else\n this.basemult = DIV_64;\n this.update_counter((1 << CHAN1) | (1 << CHAN2) | (1 << CHAN3) | (1 << CHAN4));\n break;\n case AUDF1:\n this.update_counter((this.regs[AUDCTL] & CH1_CH2) ? ((1 << CHAN2) | (1 << CHAN1)) : (1 << CHAN1));\n break;\n case AUDF2:\n this.update_counter(1 << CHAN2);\n break;\n case AUDF3:\n this.update_counter((this.regs[AUDCTL] & CH3_CH4) ? ((1 << CHAN4) | (1 << CHAN3)) : (1 << CHAN3));\n break;\n case AUDF4:\n this.update_counter(1 << CHAN4);\n break;\n case IRQEN:\n this.readregs[IRQST] |= ~byte & 0xf7;\t/* Reset disabled IRQs except XMTDONE */\n let mask = ~this.readregs[IRQST] & this.regs[IRQEN];\n if (mask) {\n this.generateIRQ(this.readregs[IRQST]);\n }\n break;\n case SKRES:\n this.readregs[SKSTAT] |= 0xe0;\n break;\n case POTGO:\n if (!(this.regs[SKCTL] & 4))\n this.pot_scanline = 0;\t/* slow pot mode */\n break;\n case SEROUT:\n if ((this.regs[SKCTL] & 0x70) == 0x20 && this.siocheck()) {\n this.SIO_PutByte(byte);\n }\n // check if cassette 2-tone mode has been enabled \n if ((this.regs[SKCTL] & 0x08) == 0x00) {\n // intelligent device\n this.DELAYED_SEROUT_IRQ = SIO_SEROUT_INTERVAL;\n this.readregs[IRQST] |= 0x08;\n this.DELAYED_XMTDONE_IRQ = SIO_XMTDONE_INTERVAL;\n }\n else {\n // cassette \n // some savers patch the cassette baud rate, so we evaluate it here \n // scanlines per second*10 bit*audiofrequency/(1.79 MHz/2) \n this.DELAYED_SEROUT_IRQ = 312 * 50 * 10 * (this.regs[AUDF3] + this.regs[AUDF4] * 0x100) / 895000;\n // safety check \n if (this.DELAYED_SEROUT_IRQ >= 3) {\n this.readregs[IRQST] |= 0x08;\n this.DELAYED_XMTDONE_IRQ = 2 * this.DELAYED_SEROUT_IRQ - 2;\n }\n else {\n this.DELAYED_SEROUT_IRQ = 0;\n this.DELAYED_XMTDONE_IRQ = 0;\n }\n };\n break;\n case STIMER:\n this.divnirq[CHAN1] = this.divnmax[CHAN1];\n this.divnirq[CHAN2] = this.divnmax[CHAN2];\n this.divnirq[CHAN3] = this.divnmax[CHAN3];\n this.divnirq[CHAN4] = this.divnmax[CHAN4];\n //POKEYSND_Update(STIMER, byte, 0, SOUND_GAIN);\n break;\n case SKCTL:\n //VOICEBOX_SKCTLPutByte(byte);\n //POKEYSND_Update(SKCTL, byte, 0, SOUND_GAIN);\n if (byte & 4)\n this.pot_scanline = 228;\t/* fast pot mode - return results immediately */\n if ((byte & 0x03) == 0) {\n /* POKEY reset. */\n /* Stop serial IO. */\n this.DELAYED_SERIN_IRQ = 0;\n this.DELAYED_SEROUT_IRQ = 0;\n this.DELAYED_XMTDONE_IRQ = 0;\n // TODO: CASSETTE_ResetPOKEY();\n /* TODO other registers should also be reset. */\n }\n break;\n }\n this.snd_update(addr);\n //POKEYSND_Update(AUDC1, byte, 0, SOUND_GAIN);\n }\n\n /*****************************************************************************/\n /* Module: Update_Counter() */\n /* Purpose: To process the latest control values stored in the AUDF, AUDC, */\n /* and AUDCTL registers. It pre-calculates as much information as */\n /* possible for better performance. This routine has been added */\n /* here again as I need the precise frequency for the pokey timers */\n /* again. The pokey emulation is therefore somewhat sub-optimal */\n /* since the actual pokey emulation should grab the frequency values */\n /* directly from here instead of calculating them again. */\n /* */\n /* Author: Ron Fries,Thomas Richter */\n /* Date: March 27, 1998 */\n /* */\n /* Inputs: chan_mask: Channel mask, one bit per channel. */\n /* The channels that need to be updated */\n /* */\n /* Outputs: Adjusts local globals - no return value */\n /* */\n /*****************************************************************************/\n\n update_counter(chan_mask: number): void {\n\n /************************************************************/\n /* As defined in the manual, the exact Div_n_cnt values are */\n /* different depending on the frequency and resolution: */\n /* 64 kHz or 15 kHz - AUDF + 1 */\n /* 1 MHz, 8-bit - AUDF + 4 */\n /* 1 MHz, 16-bit - AUDF[CHAN1]+256*AUDF[CHAN2] + 7 */\n /************************************************************/\n\n /* only reset the channels that have changed */\n\n if (chan_mask & (1 << CHAN1)) {\n /* process channel 1 frequency */\n if (this.regs[AUDCTL] & CH1_179)\n this.divnmax[CHAN1] = this.regs[AUDF1 + CHAN1] + 4;\n else\n this.divnmax[CHAN1] = (this.regs[AUDF1 + CHAN1] + 1) * this.basemult;\n if (this.divnmax[CHAN1] < ANTIC_LINE_C)\n this.divnmax[CHAN1] = ANTIC_LINE_C;\n }\n\n if (chan_mask & (1 << CHAN2)) {\n /* process channel 2 frequency */\n if (this.regs[AUDCTL] & CH1_CH2) {\n if (this.regs[AUDCTL] & CH1_179)\n this.divnmax[CHAN2] = this.regs[AUDF1 + CHAN2] * 256 + this.regs[AUDF1 + CHAN1] + 7;\n else\n this.divnmax[CHAN2] = (this.regs[AUDF1 + CHAN2] * 256 + this.regs[AUDF1 + CHAN1] + 1) * this.basemult;\n }\n else\n this.divnmax[CHAN2] = (this.regs[AUDF1 + CHAN2] + 1) * this.basemult;\n if (this.divnmax[CHAN2] < ANTIC_LINE_C)\n this.divnmax[CHAN2] = ANTIC_LINE_C;\n }\n\n if (chan_mask & (1 << CHAN4)) {\n /* process channel 4 frequency */\n if (this.regs[AUDCTL] & CH3_CH4) {\n if (this.regs[AUDCTL] & CH3_179)\n this.divnmax[CHAN4] = this.regs[AUDF1 + CHAN4] * 256 + this.regs[AUDF1 + CHAN3] + 7;\n else\n this.divnmax[CHAN4] = (this.regs[AUDF1 + CHAN4] * 256 + this.regs[AUDF1 + CHAN3] + 1) * this.basemult;\n }\n else\n this.divnmax[CHAN4] = (this.regs[AUDF1 + CHAN4] + 1) * this.basemult;\n if (this.divnmax[CHAN4] < ANTIC_LINE_C)\n this.divnmax[CHAN4] = ANTIC_LINE_C;\n }\n\n //console.log(chan_mask, this.divnmax);\n }\n\n snd_update(addr: number) {\n\n }\n\n advanceScanline() {\n /***************************************************************************\n ** Generate POKEY Timer IRQs if required **\n ** called on a per-scanline basis, not very precise, but good enough **\n ** for most applications **\n ***************************************************************************/\n\n\n /* on nonpatched i/o-operation, enable the cassette timing */\n /*\n if (!ESC_enable_sio_patch) {\n if (CASSETTE_AddScanLine())\n DELAYED_SERIN_IRQ = 1;\n }\n */\n\n if ((this.regs[SKCTL] & 0x03) == 0)\n /* Don't process timers when POKEY is in reset mode. */\n return;\n\n if (this.pot_scanline < 228)\n this.pot_scanline++;\n\n this.random_scanline_counter += ANTIC_LINE_C;\n this.random_scanline_counter %= (this.regs[AUDCTL] & POLY9) ? POLY9_SIZE : POLY17_SIZE;\n\n if (this.DELAYED_SERIN_IRQ > 0) {\n if (--this.DELAYED_SERIN_IRQ == 0) {\n // Load a byte to SERIN - even when the IRQ is disabled. \n this.readregs[SERIN] = this.SIO_GetByte();\n this.generateIRQ(0x20);\n }\n }\n\n if (this.DELAYED_SEROUT_IRQ > 0) {\n if (--this.DELAYED_SEROUT_IRQ == 0) {\n this.generateIRQ(0x10);\n }\n }\n\n if (this.DELAYED_XMTDONE_IRQ > 0)\n if (--this.DELAYED_XMTDONE_IRQ == 0) {\n this.generateIRQ(0x08);\n }\n\n this.advanceIRQTimer(CHAN1, 0x1);\n this.advanceIRQTimer(CHAN2, 0x2);\n this.advanceIRQTimer(CHAN4, 0x4);\n }\n\n advanceIRQTimer(chan: number, mask: number) {\n if ((this.divnirq[chan] -= ANTIC_LINE_C) < 0) {\n this.divnirq[chan] += this.divnmax[chan];\n this.generateIRQ(mask);\n //console.log('irq', chan, this.divnirq[chan], this.divnmax[chan])\n }\n }\n\n generateIRQ(mask: number) {\n if (this.regs[IRQEN] & mask) {\n this.irq();\n this.readregs[IRQST] &= ~mask;\n }\n }\n\n static stateToLongString(state): string {\n let s = ''\n s += \"Write Registers:\\n\";\n s += dumpRAM(state.regs, 0, 16);\n s += \"Read Registers:\\n\";\n s += dumpRAM(state.readregs, 0, 16);\n return s;\n }\n\n CASSETTE_IOLineStatus() {\n return 0;\n }\n\n siocheck() {\n return (((this.regs[AUDF1 + CHAN3] == 0x28 || this.regs[AUDF1 + CHAN3] == 0x10\n || this.regs[AUDF1 + CHAN3] == 0x08 || this.regs[AUDF1 + CHAN3] == 0x0a)\n && this.regs[AUDF1 + CHAN4] == 0x00) // intelligent peripherals speeds\n || (this.regs[SKCTL] & 0x78) == 0x28) // cassette save mode\n && (this.regs[AUDCTL] & 0x28) == 0x28;\n }\n SIO_PutByte(byte: number) {\n // TODO\n console.log(\"SIO put byte\", byte);\n }\n SIO_GetByte() {\n return 0; // TODO\n }\n\n}\n\n\n//const SOUND_GAIN 4\n/*\nvoid Frame(void)\n{\n random_scanline_counter %= (this.regs[AUDCTL] & POLY9) ? POLY9_SIZE : POLY17_SIZE;\n}\n*/\n\n\n\n", "import { newPOKEYAudio, TssChannelAdapter } from \"../common/audio\";\nimport { Machine } from \"../common/baseplatform\";\nimport { MOS6502 } from \"../common/cpu/MOS6502\";\nimport { AcceptsKeyInput, AcceptsPaddleInput, AcceptsROM, BasicScanlineMachine, FrameBased, Probeable, TrapCondition, VideoSource } from \"../common/devices\";\nimport { KeyFlags, Keys, makeKeycodeMap, newAddressDecoder, newKeyboardHandler } from \"../common/emu\";\nimport { hex } from \"../common/util\";\nimport { BaseWASIMachine } from \"../common/wasmplatform\";\nimport { ANTIC, MODE_SHIFT } from \"./chips/antic\";\nimport { CONSOL, GTIA, TRIG0 } from \"./chips/gtia\";\nimport { POKEY } from \"./chips/pokey\";\n\nconst ATARI8_KEYMATRIX_INTL_NOSHIFT = [\n Keys.VK_L, Keys.VK_J, Keys.VK_SEMICOLON, Keys.VK_F4, Keys.VK_F5, Keys.VK_K, Keys.VK_BACK_SLASH, Keys.VK_TILDE,\n Keys.VK_O, null, Keys.VK_P, Keys.VK_U, Keys.VK_ENTER, Keys.VK_I, Keys.VK_MINUS2, Keys.VK_EQUALS2,\n Keys.VK_V, Keys.VK_F7, Keys.VK_C, Keys.VK_F6, Keys.VK_F4, Keys.VK_B, Keys.VK_X, Keys.VK_Z,\n Keys.VK_4, null, Keys.VK_3, Keys.VK_6, Keys.VK_ESCAPE, Keys.VK_5, Keys.VK_2, Keys.VK_1,\n Keys.VK_COMMA, Keys.VK_SPACE, Keys.VK_PERIOD, Keys.VK_N, null, Keys.VK_M, Keys.VK_SLASH, null/*invert*/,\n Keys.VK_R, null, Keys.VK_E, Keys.VK_Y, Keys.VK_TAB, Keys.VK_T, Keys.VK_W, Keys.VK_Q,\n Keys.VK_9, null, Keys.VK_0, Keys.VK_7, Keys.VK_BACK_SPACE, Keys.VK_8, null, null,\n Keys.VK_F, Keys.VK_H, Keys.VK_D, null, Keys.VK_CAPS_LOCK, Keys.VK_G, Keys.VK_S, Keys.VK_A,\n];\n\n//TODO\nvar ATARI8_KEYCODE_MAP = makeKeycodeMap([\n [Keys.UP, 0, 0x1],\n [Keys.DOWN, 0, 0x2],\n [Keys.LEFT, 0, 0x4],\n [Keys.RIGHT, 0, 0x8],\n [{ c: 16, n: \"Shift\", plyr: 0, button: 0 }, 2, 0x1],\n /*\n [Keys.P2_UP, 0, 0x10],\n [Keys.P2_DOWN, 0, 0x20],\n [Keys.P2_LEFT, 0, 0x40],\n [Keys.P2_RIGHT, 0, 0x80],\n [Keys.P2_A, 3, 0x1],\n */\n [Keys.VK_F1, 3, 0x1], // START\n [Keys.VK_F2, 3, 0x2], // SELECT\n [Keys.VK_F3, 3, 0x4], // OPTION\n]);\n\n\nexport class Atari800 extends BasicScanlineMachine implements AcceptsPaddleInput {\n\n // http://www.ataripreservation.org/websites/freddy.offenga/megazine/ISSUE5-PALNTSC.html\n cpuFrequency = 1789773;\n numTotalScanlines = 262;\n cpuCyclesPerLine = 114;\n canvasWidth = 336;\n numVisibleScanlines = 224;\n aspectRatio = this.canvasWidth / this.numVisibleScanlines * 0.857;\n firstVisibleScanline = 16;\n firstVisibleClock = (44 - 6) * 2; // ... to 215 * 2\n defaultROMSize = 0x8000;\n overscan = true;\n audioOversample = 2;\n sampleRate = this.numTotalScanlines * 60 * this.audioOversample;\n run_address = -1;\n\n cpu: MOS6502;\n ram: Uint8Array;\n bios: Uint8Array;\n bus;\n audio_pokey;\n audioadapter;\n antic: ANTIC;\n gtia: GTIA;\n irq_pokey: POKEY;\n inputs = new Uint8Array(4);\n linergb = new Uint32Array(this.canvasWidth);\n lastdmabyte = 0;\n keycode = 0;\n cart_80 = false;\n cart_a0 = false;\n xexdata = null;\n keyboard_active = true;\n d500 = new Uint8Array(0x100);\n // TODO: save/load vars\n\n constructor() {\n super();\n this.cpu = new MOS6502();\n this.ram = new Uint8Array(0x10000);\n this.bios = new Uint8Array(0x2800);\n this.bus = this.newBus();\n this.connectCPUMemoryBus(this.bus);\n // create support chips\n this.antic = new ANTIC(this.readDMA.bind(this), this.antic_nmi.bind(this));\n this.gtia = new GTIA();\n this.irq_pokey = new POKEY(this.pokey_irq.bind(this), () => this.antic.h);\n this.audio_pokey = newPOKEYAudio(1);\n this.audioadapter = new TssChannelAdapter(this.audio_pokey.pokey1, this.audioOversample, this.sampleRate);\n this.handler = newKeyboardHandler(\n this.inputs, ATARI8_KEYCODE_MAP, this.getKeyboardFunction(), true);\n }\n newBus() {\n return {\n read: newAddressDecoder([\n [0x0000, 0x7fff, 0xffff, (a) => { return this.ram[a]; }],\n [0x8000, 0x9fff, 0xffff, (a) => { return this.cart_80 ? this.rom[a - 0x8000] : this.ram[a]; }],\n [0xa000, 0xbfff, 0xffff, (a) => { return this.cart_a0 ? this.rom[a - 0x8000] : this.ram[a]; }],\n [0xd000, 0xd0ff, 0x1f, (a) => { return this.gtia.readReg(a); }],\n [0xd200, 0xd2ff, 0xf, (a) => { return this.readPokey(a); }],\n [0xd300, 0xd3ff, 0xf, (a) => { return this.readPIA(a); }],\n [0xd400, 0xd4ff, 0xf, (a) => { return this.antic.readReg(a); }],\n [0xd500, 0xd5ff, 0xff, (a) => { return this.d500[a]; }],\n [0xd800, 0xffff, 0xffff, (a) => { return this.bios[a - 0xd800]; }],\n ]),\n write: newAddressDecoder([\n [0x0000, 0xbffa, 0xffff, (a, v) => { this.ram[a] = v; }],\n [0xbffb, 0xbfff, 0xffff, (a, v) => { this.ram[a] = v; this.initCartA(); }],\n [0xd000, 0xd0ff, 0x1f, (a, v) => { this.gtia.setReg(a, v); }],\n [0xd200, 0xd2ff, 0xf, (a, v) => { this.writePokey(a, v); }],\n [0xd400, 0xd4ff, 0xf, (a, v) => { this.antic.setReg(a, v); }],\n [0xd500, 0xd5ff, 0xff, (a, v) => { this.writeMapper(a, v); }],\n ]),\n };\n }\n\n loadBIOS(bios: Uint8Array) {\n this.bios.set(bios);\n }\n\n reset() {\n super.reset();\n this.antic.reset();\n this.gtia.reset();\n this.keycode = 0;\n //if (this.xexdata) this.cart_a0 = true; // TODO\n }\n\n read(a) {\n // TODO: lastdmabyte?\n return this.bus.read(a);\n }\n // used by ANTIC\n readDMA(a) {\n let v = this.bus.read(a);\n this.probe.logDMARead(a, v);\n this.lastdmabyte = v;\n return v;\n }\n readConst(a) {\n return a < 0xd000 || a >= 0xd500 ? this.bus.read(a) : 0xff;\n }\n write(a, v) {\n this.bus.write(a, v);\n }\n readPokey(a: number) {\n switch (a & 0xf) {\n case 9: // KBCODE\n return this.keycode & 0xff;\n case 15: // SKSTAT\n return ((~this.keycode >> 6) & 0x4) | ((~this.keycode >> 3) & 0x8) | 0x12;\n default:\n return this.irq_pokey.read(a);\n }\n }\n readPIA(a: number) {\n if (a == 0 || a == 1) { return ~this.inputs[a]; }\n }\n writePokey(a, v) {\n this.audio_pokey.pokey1.setRegister(a, v);\n this.irq_pokey.write(a, v);\n }\n\n startScanline() {\n // TODO: if (this.antic.h != 0) throw new Error(this.antic.h+\"\");\n //if (this.cpu.isHalted()) throw new EmuHalt(\"CPU HALTED\");\n // set GTIA switch inputs\n this.gtia.sync();\n // TODO: trigger latching mode\n for (let i = 0; i < 4; i++)\n this.gtia.readregs[TRIG0 + i] = (~this.inputs[2] >> i) & 1;\n // console switches\n this.gtia.readregs[CONSOL] = ~this.inputs[3] & 0x7;\n // advance POKEY audio\n this.audio && this.audioadapter.generate(this.audio);\n // advance POKEY IRQ timers\n this.irq_pokey.advanceScanline();\n }\n\n drawScanline() {\n // TODO\n let y = this.antic.v - this.firstVisibleScanline;\n if (y >= 0 && y < this.numVisibleScanlines) {\n this.pixels.set(this.linergb, y * this.canvasWidth);\n }\n }\n\n advanceCPU(): number {\n // update ANTIC\n if (this.antic.clockPulse()) {\n // ANTIC DMA cycle, update GTIA\n if (this.antic.h < 8)\n this.gtia.updateGfx(this.antic.h - 1, this.antic.v, this.lastdmabyte); // HALT pin\n if (this.antic.isWSYNC())\n this.probe.logWait(0);\n this.probe.logClocks(1);\n } else {\n super.advanceCPU();\n }\n // update GTIA\n // get X coordinate within scanline\n let xofs = this.antic.h * 4 - this.firstVisibleClock;\n // GTIA tick functions\n let gtiatick1 = () => {\n this.gtia.clockPulse1();\n this.linergb[xofs++] = this.gtia.rgb;\n }\n let gtiatick2 = () => {\n this.gtia.clockPulse2();\n this.linergb[xofs++] = this.gtia.rgb;\n }\n // tick 4 GTIA clocks for each CPU/ANTIC cycle\n this.gtia.clockPulse4();\n // correct for HSCROL -- bias antic +2, bias gtia -1\n if ((this.antic.dliop & 0x10) && (this.antic.regs[4] & 1)) {\n xofs += 2;\n this.gtia.setBias(-1);\n } else {\n this.gtia.setBias(0);\n }\n let bp = MODE_SHIFT[this.antic.mode];\n let odd = this.antic.h & 1;\n if (bp < 8 || odd) { this.gtia.an = this.antic.shiftout(); }\n gtiatick1();\n if (bp == 1) { this.gtia.an = this.antic.shiftout(); }\n gtiatick2();\n if (bp <= 2) { this.gtia.an = this.antic.shiftout(); }\n gtiatick1();\n if (bp == 1) { this.gtia.an = this.antic.shiftout(); }\n gtiatick2();\n return 1;\n }\n\n loadState(state: any) {\n this.loadControlsState(state);\n this.cpu.loadState(state.c);\n this.ram.set(state.ram);\n this.antic.loadState(state.antic);\n this.gtia.loadState(state.gtia);\n this.irq_pokey.loadState(state.pokey);\n this.lastdmabyte = state.lastdmabyte;\n this.cart_80 = state.cart_80;\n this.cart_a0 = state.cart_a0;\n }\n saveState() {\n return {\n c: this.cpu.saveState(),\n ram: this.ram.slice(0),\n antic: this.antic.saveState(),\n gtia: this.gtia.saveState(),\n pokey: this.irq_pokey.saveState(),\n inputs: this.inputs.slice(0),\n lastdmabyte: this.lastdmabyte,\n keycode: this.keycode,\n cart_80: this.cart_80,\n cart_a0: this.cart_a0,\n };\n }\n loadControlsState(state) {\n this.inputs.set(state.inputs);\n this.keycode = state.keycode;\n }\n saveControlsState() {\n return {\n inputs: this.inputs.slice(0),\n keycode: this.keycode,\n };\n }\n getRasterScanline() {\n return this.antic.v;\n }\n getRasterLineClock() {\n return this.antic.h;\n }\n getDebugCategories() {\n return ['CPU', 'Stack', 'ANTIC', 'GTIA', 'POKEY'];\n }\n getDebugInfo(category, state) {\n switch (category) {\n case 'ANTIC': return ANTIC.stateToLongString(state.antic);\n case 'GTIA': return GTIA.stateToLongString(state.gtia);\n case 'POKEY': return POKEY.stateToLongString(state.pokey);\n }\n }\n getKeyboardFunction() {\n return (o, key, code, flags) => {\n if (!this.keyboard_active) return false;\n if (flags & (KeyFlags.KeyDown | KeyFlags.KeyUp)) {\n //console.log(o, key, code, flags, hex(this.keycode));\n var keymap = ATARI8_KEYMATRIX_INTL_NOSHIFT;\n if (key == Keys.VK_F9.c) {\n this.irq_pokey.generateIRQ(0x80); // break IRQ\n return true;\n }\n for (var i = 0; i < keymap.length; i++) {\n if (keymap[i] && keymap[i].c == key) {\n this.keycode = i;\n if (flags & KeyFlags.Shift) { this.keycode |= 0x40; }\n if (flags & KeyFlags.Ctrl) { this.keycode |= 0x80; }\n if (flags & KeyFlags.KeyDown) {\n this.keycode |= 0x100;\n this.irq_pokey.generateIRQ(0x40); // key pressed IRQ\n return true;\n }\n }\n }\n };\n }\n }\n pokey_irq() {\n this.cpu.IRQ();\n this.probe.logInterrupt(2);\n }\n antic_nmi() {\n this.cpu.NMI();\n this.probe.logInterrupt(1);\n }\n\n loadROM(rom: Uint8Array, title: string) {\n if ((rom[0] == 0xff && rom[1] == 0xff) && !title?.endsWith('.rom')) {\n // XEX file, chill out and wait for BIOS hook\n this.xexdata = rom;\n } else {\n this.loadCartridge(rom);\n }\n }\n\n loadCartridge(rom: Uint8Array) {\n // TODO: https://github.com/dmlloyd/atari800/blob/master/DOC/cart.txt\n // strip off header\n if (rom[0] == 0x43 && rom[1] == 0x41 && rom[2] == 0x52 && rom[3] == 0x54) {\n rom = rom.slice(16);\n }\n if (rom.length != 0x1000 && rom.length != 0x2000 && rom.length != 0x4000 && rom.length != 0x8000)\n throw new Error(\"Sorry, this platform can only load 4/8/16/32 KB cartridges at the moment.\");\n // TODO: support other than 8 KB carts\n // support 4/8/16/32 KB carts\n let rom2 = new Uint8Array(0x8000);\n for (let i = 0; i <= rom2.length - rom.length; i += rom.length) {\n rom2.set(rom, i);\n }\n this.run_address = rom2[0x7ffe] + rom2[0x7fff]*256;\n this.cart_a0 = true; // TODO\n this.cart_80 = rom.length == 0x4000;\n super.loadROM(rom2);\n }\n\n writeMapper(addr: number, value: number) {\n // TODO\n if (addr == 0xff) {\n if (value == 0x80) this.cart_80 = false;\n if (value == 0xa0) this.cart_a0 = false;\n }\n }\n\n loadXEX(rom: Uint8Array) {\n let ofs = 2;\n let stub = this.d500;\n let stubofs = 0; // stub routine \n var runaddr = -1;\n // load segments into RAM\n while (ofs < rom.length) {\n let start = rom[ofs + 0] + rom[ofs + 1] * 256;\n let end = rom[ofs + 2] + rom[ofs + 3] * 256;\n console.log('XEX', hex(ofs), hex(start), hex(end));\n ofs += 4;\n for (let i = start; i <= end; i++) {\n this.ram[i] = rom[ofs++];\n }\n if (start == 0x2e0 && end == 0x2e1) {\n runaddr = this.ram[0x2e0] + this.ram[0x2e1] * 256;\n console.log('XEX run', hex(runaddr));\n }\n if (start == 0x2e2 && end == 0x2e3) {\n var initaddr = this.ram[0x2e2] + this.ram[0x2e3] * 256;\n console.log('XEX init', hex(initaddr));\n stub[stubofs++] = 0x20;\n stub[stubofs++] = initaddr & 0xff;\n stub[stubofs++] = initaddr >> 8;\n }\n if (ofs > rom.length) throw new Error(\"Bad .XEX file format\");\n }\n if (runaddr >= 0) {\n // build stub routine at 0xd500\n stub[stubofs++] = 0xa9; // lda #$a0\n stub[stubofs++] = 0xa0;\n stub[stubofs++] = 0x8d; // sta $d5ff (disable cart)\n stub[stubofs++] = 0xff;\n stub[stubofs++] = 0xd5;\n stub[stubofs++] = 0x4c; // jmp runaddr\n stub[stubofs++] = runaddr & 0xff;\n stub[stubofs++] = runaddr >> 8;\n // set DOSVEC to 0xd500\n this.ram[0xa] = 0x00;\n this.ram[0xb] = 0xd5;\n this.run_address = 0xd500;\n }\n }\n\n initCartA() {\n if (this.cpu.getPC() == 0xf17f && this.xexdata) {\n this.loadXEX(this.xexdata);\n }\n }\n\n setPaddleInput(controller: number, value: number): void {\n this.irq_pokey.pot_inputs[controller] = 255 - value;\n }\n\n}\n\nexport class Atari5200 extends Atari800 {\n newBus() {\n return {\n read: newAddressDecoder([\n [0x0000, 0x3fff, 0xffff, (a) => { return this.ram[a]; }],\n [0x4000, 0xbfff, 0xffff, (a) => { return this.rom ? this.rom[a - 0x4000] : 0; }],\n [0xc000, 0xcfff, 0x1f, (a) => { return this.gtia.readReg(a); }],\n [0xd400, 0xd4ff, 0xf, (a) => { return this.antic.readReg(a); }],\n [0xe800, 0xefff, 0xf, (a) => { return this.readPokey(a); }],\n [0xf800, 0xffff, 0x7ff, (a) => { return this.bios[a]; }],\n ]),\n write: newAddressDecoder([\n [0x0000, 0x3fff, 0xffff, (a, v) => { this.ram[a] = v; }],\n [0xc000, 0xcfff, 0x1f, (a, v) => { this.gtia.setReg(a, v); }],\n [0xd400, 0xd4ff, 0xf, (a, v) => { this.antic.setReg(a, v); }],\n [0xe800, 0xefff, 0xf, (a, v) => { this.writePokey(a, v); }],\n ]),\n };\n }\n}\n\n", "\nimport { Platform, getOpcodeMetadata_6502, getToolForFilename_6502, Base6502MachinePlatform } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\nimport { BaseMAME6502Platform } from \"../common/mameplatform\";\nimport { Atari5200, Atari800 } from \"../machine/atari8\";\n\ndeclare var jt; // for 6502\n\nvar Atari8_PRESETS = [\n {id:'hello.dasm', name:'Hello World (ASM)'},\n {id:'hellopm.dasm', name:'Hello Sprites (ASM)'},\n {id:'helloconio.c', name:'Text Mode (C)'},\n {id:'siegegame.c', name:'Siege Game (C)'},\n {id:'hellodlist.c', name:'Display List (C)'},\n];\n\nvar Atari800_PRESETS = Atari8_PRESETS.concat([\n {id:'testmusic.c', name:'POKEY Music (C)'},\n {id:'sieve.bas', name:'Benchmark (FastBasic)'},\n {id:'pmtest.bas', name:'Sprites Test (FastBasic)'},\n {id:'dli.bas', name:'DLI Test (FastBasic)'},\n {id:'joyas.bas', name:'Match-3 Game (FastBasic)'},\n]);\n\nconst Atari800_MemoryMap = { main:[\n {name:'RAM',start:0x0,size:0xc000,type:'ram'},\n {name:'Left Cartridge ROM',start:0xa000,size:0x2000,type:'rom'},\n {name:'GTIA',start:0xd000,size:0x20,type:'io'},\n {name:'POKEY',start:0xd200,size:0x10,type:'io'},\n {name:'PIA',start:0xd300,size:0x04,type:'io'},\n {name:'ANTIC',start:0xd400,size:0x10,type:'io'},\n {name:'Cartridge Control Line',start:0xd600,size:0x100,type:'io'},\n {name:'ROM',start:0xd800,size:0x800,type:'rom'},\n {name:'Character Set',start:0xe000,size:0x400,type:'rom'},\n {name:'ROM',start:0xe400,size:0x1c00,type:'rom'},\n] }\n\nfunction getToolForFilename_Atari8(fn:string) {\n if (fn.endsWith(\".bas\") || fn.endsWith(\".fb\") || fn.endsWith(\".fbi\")) return \"fastbasic\";\n else return getToolForFilename_6502(fn);\n}\n\nclass Atari800Platform extends Base6502MachinePlatform {\n newMachine() { return new Atari800(); }\n getPresets() { return Atari800_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n getToolForFilename = getToolForFilename_Atari8;\n readAddress(a) { return this.machine.readConst(a); }\n getMemoryMap() { return Atari800_MemoryMap; }\n showHelp = atari8_showHelp;\n getROMExtension = atari8_getROMExtension;\n \n async start() {\n let bios = await this.loadKernel();\n await super.start();\n this.machine.loadBIOS(bios);\n }\n biosPath = 'res/altirra/kernel.rom';\n async loadKernel() {\n var biosResponse = await fetch(this.biosPath);\n if (biosResponse.status == 200 || (biosResponse as any as Blob).size) {\n var biosBinary = await biosResponse.arrayBuffer();\n return new Uint8Array(biosBinary);\n } else throw new Error('could not load BIOS file');\n }\n}\n\nclass Atari5200Platform extends Atari800Platform {\n getPresets() { return Atari8_PRESETS; }\n newMachine() { return new Atari5200(); }\n biosPath = 'res/altirra/superkernel.rom';\n}\n\n\n/// MAME support\n\nabstract class Atari8MAMEPlatform extends BaseMAME6502Platform {\n getPresets() { return Atari8_PRESETS; }\n getToolForFilename = getToolForFilename_Atari8;\n getOpcodeMetadata = getOpcodeMetadata_6502;\n getDefaultExtension() { return \".asm\"; };\n showHelp = atari8_showHelp;\n}\n\nclass Atari800MAMEPlatform extends Atari8MAMEPlatform implements Platform {\n getPresets() { return Atari800_PRESETS; }\n loadROM(title, data) {\n if (!this.started) {\n this.startModule(this.mainElement, {\n jsfile:'mame8bitws.js',\n biosfile:'a800xl.zip',\n cfgfile:'a800xl.cfg',\n driver:'a800xl',\n width:336*2,\n height:225*2,\n romfn:'/emulator/cart.rom',\n romdata:new Uint8Array(data),\n romsize:0x2000,\n preInit:function(_self) {\n },\n });\n } else {\n this.loadROMFile(data);\n this.loadRegion(\":cartleft:cart:rom\", data);\n }\n }\n start() {\n }\n getMemoryMap = function() { return Atari800_MemoryMap };\n}\n\nclass Atari5200MAMEPlatform extends Atari8MAMEPlatform implements Platform {\n loadROM(title, data) {\n if (!this.started) {\n this.startModule(this.mainElement, {\n jsfile:'mame8bitws.js',\n biosfile:'a5200/5200.rom',\n cfgfile:'a5200.cfg',\n driver:'a5200',\n width:336*2,\n height:225*2,\n romfn:'/emulator/cart.rom',\n romdata:new Uint8Array(data),\n romsize:0x8000,\n preInit:function(_self) {\n },\n });\n } else {\n this.loadROMFile(data);\n this.loadRegion(\":cartleft:cart:rom\", data);\n }\n }\n start() {\n }\n getMemoryMap = function() { return { main:[\n {name:'RAM',start:0x0,size:0x4000,type:'ram'},\n {name:'Cartridge ROM',start:0x4000,size:0x8000,type:'rom'},\n {name:'GTIA',start:0xc000,size:0x20,type:'io'},\n {name:'ANTIC',start:0xd400,size:0x10,type:'io'},\n {name:'POKEY',start:0xe800,size:0x10,type:'io'},\n {name:'ATARI Character Set',start:0xf800,size:0x400,type:'rom'},\n {name:'ROM',start:0xfc00,size:0x400,type:'rom'},\n ] } };\n}\n\nfunction atari8_getROMExtension(rom: Uint8Array) {\n if (rom == null) return \".bin\";\n if (rom[0] == 0xff && rom[1] == 0xff) return \".xex\";\n else return \".rom\";\n}\n\nfunction atari8_showHelp() {\n return \"https://8bitworkshop.com/docs/platforms/atari8/\";\n}\n\n///\n\nPLATFORMS['atari8-800.xlmame'] = Atari800MAMEPlatform\nPLATFORMS['atari8-800xl.mame'] = Atari800MAMEPlatform // for dithertron\nPLATFORMS['atari8-5200.mame'] = Atari5200MAMEPlatform\nPLATFORMS['atari8-800'] = Atari800Platform\nPLATFORMS['atari8-5200'] = Atari5200Platform\n"], - "mappings": "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", - "names": [] -} diff --git a/gen/atari8-P6UBBVZK.js b/gen/atari8-P6UBBVZK.js new file mode 100644 index 00000000..64bd34df --- /dev/null +++ b/gen/atari8-P6UBBVZK.js @@ -0,0 +1,10 @@ +import{a as xt}from"./chunk-PQDZBFBB.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-HB3LWF25.js";import{$ as C,J as I,O as T,U as y,V as i,W as it,Y as rt,a as v,da as at,g as f,q as _}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.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)} +`,e+=`Write Registers: +`,e+=y(t.regs,0,32),e+=`Read Registers: +`,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,M=14,Y=15;var Rt=128,It=64,Oe=32,Tt=16,Mt=8;var Re=1,Pt=28,Ie=114;var Dt=511,vt=131071,x=0,u=1,b=2,d=3,O=114,Te=15;var Me=8;var W,B;function Pe(){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=Pt,this.pot_inputs.fill(128),Pe()}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=Pt,this.update_counter(1<=3?(this.readregs[M]|=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[x]=this.divnmax[x],this.divnirq[u]=this.divnmax[u],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(x,1),this.advanceIRQTimer(u,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[M]&=~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 De=[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=De;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,m="",P=!1,D;if(l==0)D=(o>>4&7)+1,m+=" blank="+D;else{D=G[l],m+=" mode="+f(l),m+=" lines="+D,P=(o&~64)==1;let st=(o&64)!=0&&(o&15)!=0;if(P&&o&64?m+=" JVB":P?m+=" JMP":st&&(m+=" LMS"),this.antic.isPlayfieldDMAEnabled()&&(P||st)){let Nt=e(),Ft=e();m+=" $"+f(Ft)+""+f(Nt)}o&16&&(m+=" HSCROL"),o&32&&(m+=" VSCROL")}if(s["$"+f(h)+" y="+a]=m,P)break;a+=D}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-P6UBBVZK.js.map diff --git a/gen/atari8-P6UBBVZK.js.map b/gen/atari8-P6UBBVZK.js.map new file mode 100644 index 00000000..5df79e2b --- /dev/null +++ b/gen/atari8-P6UBBVZK.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/machine/chips/antic.ts", "../src/machine/chips/gtia.ts", "../src/machine/chips/pokey.ts", "../src/machine/atari8.ts", "../src/platform/atari8.ts"], + "sourcesContent": ["import { dumpRAM } from \"../../common/emu\";\nimport { hex, lpad, safe_extend } from \"../../common/util\";\n\n// ANTIC\n// https://www.atarimax.com/jindroush.atari.org/atanttim.html\n// http://www.virtualdub.org/blog/pivot/entry.php?id=243\n// http://www.beipmu.com/Antic_Timings.txt\n// https://user.xmission.com/~trevin/atari/antic_regs.html\n// https://user.xmission.com/~trevin/atari/antic_insns.html\n// http://www.atarimuseum.com/videogames/consoles/5200/conv_to_5200.html\n// https://www.virtualdub.org/downloads/Altirra%20Hardware%20Reference%20Manual.pdf\n\nconst PF_LEFT = [0, 25, 17, 9];\nconst PF_RIGHT = [0, 25 + 64, 17 + 80, 9 + 96];\n\nconst DMACTL = 0;\nconst CHACTL = 1;\nconst DLISTL = 2;\nconst DLISTH = 3;\nconst HSCROL = 4;\nconst VSCROL = 5;\nconst PMBASE = 7;\nconst CHBASE = 9;\nconst WSYNC = 10;\nconst VCOUNT = 11;\nconst PENH = 12;\nconst PENV = 13;\nconst NMIEN = 14;\nconst NMIRES = 15;\nconst NMIST = 15;\n\nconst PFNONE = 0;\nconst PFNARROW = 1;\nconst PFNORMAL = 2;\nconst PFWIDE = 3;\n\nconst NMIST_CYCLE = 12;\nconst NMI_CYCLE = 24;\nconst WSYNC_CYCLE = 212;\n\nconst ANTIC_LEFT = 17 - 4; // gtia 34, 4 cycle delay\nconst ANTIC_RIGHT = 110 - 4; // gtia 221, 4 cycle delay\nconst LAST_DMA_H = 105; // last DMA cycle\n\nexport const MODE_LINES = [0, 0, 8, 10, 8, 16, 8, 16, 8, 4, 4, 2, 1, 2, 1, 1];\n// how many bits before DMA clock repeats?\nconst MODE_PERIOD = [0, 0, 2, 2, 2, 2, 4, 4, 8, 4, 4, 4, 4, 2, 2, 2];\nconst MODE_YPERIOD = [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0];\n//const MODE_BPP = [0, 0, 1, 1, 2, 2, 1, 1, 2, 1, 2, 1, 1, 2, 2, 1];\n// how many color clocks / pixel * 2\nexport const MODE_SHIFT = [0, 0, 1, 1, 2, 2, 2, 2, 8, 4, 4, 2, 2, 2, 2, 1];\n\nexport class ANTIC {\n read: (address: number) => number;\t// bus read function\n nmi: () => void; // generate NMI\n\n regs = new Uint8Array(0x10);\t\t\t\t// registers\n\n left: number;\n right: number;\t\t\t\t\t// left/right clocks for mode\n\n dma_enabled: boolean = false;\n dliop: number = 0; // dli operation\n mode: number = 0;\t\t\t// current mode\n jmp = false; // TODO\n lms = false; // TODO\n dlarg_lo: number = 0;\n dlarg_hi: number = 0;\n period: number = 0;\t\t// current mode period bitmask\n scanaddr: number = 0; // Scan Address (via LMS)\n startaddr: number = 0;\t// Start of line Address\n pfbyte: number = 0;\t\t// playfield byte fetched\n ch: number = 0;\t\t\t\t// char read\n linesleft: number = 0; // # of lines left in mode\n yofs: number = 0;\t\t\t// yofs fine\n isfirstline: boolean = false;\n v: number = 0;\t\t\t\t\t// vertical scanline #\n h: number = 0;\t\t\t\t\t// horizontal color clock\n\n linebuf = new Uint8Array(48);\n dmaclock: number = 0;\n dmaidx: number = 0;\n output: number = 0;\n dramrefresh = false;\n in_vscroll = 0;\n\n constructor(readfn, nmifn) {\n this.read = readfn; // bus read function\n this.nmi = nmifn; // NMI function\n }\n reset() {\n this.regs.fill(0);\n this.regs[NMIEN] = 0x00;\n this.regs[NMIST] = 0x7f;\n this.regs[PENH] = 0x00;\n this.regs[PENV] = 0xff;\n this.setReg(DMACTL, 0x0);\n this.h = this.v = 0;\n this.startaddr = this.scanaddr = 0;\n this.dmaclock = 0;\n }\n saveState() {\n return safe_extend(0, {}, this);\n }\n loadState(s) {\n safe_extend(0, this, s);\n this.setReg(DMACTL, s.regs[DMACTL]);\n }\n static stateToLongString(state): string {\n let s = \"\";\n s += \"H: \" + lpad(state.h, 3) + \" V: \" + lpad(state.v, 3) + \"\\n\";\n s += \"DLIOp: \" + hex(state.dliop, 2) + \" Lines: \" + state.yofs + \"/\" + state.linesleft;\n s += \" DMA \" + (state.dma_enabled ? \"ON \" : \"off\")\n if (state.dma_enabled) s += \" idx \" + state.dmaidx + \" clk \" + hex(state.dmaclock) \n s += \"\\n\"\n s += \"Addr: \" + hex(state.scanaddr, 4) + \"\\n\";\n s += dumpRAM(state.regs, 0, 16).replace('$00', 'Regs');\n return s;\n }\n setReg(a: number, v: number) {\n switch (a) {\n case WSYNC:\n this.regs[WSYNC] = 0xff;\n return; // this is readonly (we reset it)\n case NMIRES:\n this.regs[NMIST] = 0x1f;\n return; // this is readonly, don't mess with it\n }\n this.regs[a] = v;\n }\n readReg(a: number) {\n switch (a) {\n case NMIST:\n return this.regs[a];\n case VCOUNT:\n return this.v >> 1;\n default:\n return 0xff;\n }\n }\n processDLIEntry() {\n if (this.mode == 0) { // N Blank Lines\n this.linesleft = ((this.dliop >> 4) & 7) + 1;\n this.dmaclock = 0;\n } else {\n this.linesleft = MODE_LINES[this.mode];\n this.period = MODE_PERIOD[this.mode];\n if (this.jmp) {\n this.regs[DLISTL] = this.dlarg_lo;\n this.regs[DLISTH] = this.dlarg_hi;\n this.mode = this.period = 0;\n // JVB (Jump and wait for Vertical Blank)\n if (this.dliop & 0x40) {\n this.linesleft = 1; //(248 - this.v) & 0xff; // TODO?\n this.dma_enabled = false;\n }\n this.dmaclock = 0;\n } else if (this.lms) {\n this.scanaddr = this.dlarg_lo + (this.dlarg_hi << 8);\n //console.log('scanaddr', hex(this.scanaddr));\n }\n this.startaddr = this.scanaddr;\n // horiz scroll\n let effwidth = this.regs[DMACTL] & 3;\n let hscroll = (this.dliop & 0x10) ? (this.regs[HSCROL] & 15) >> 1 : 0;\n if ((this.dliop & 0x10) && effwidth < 3) effwidth++;\n this.left = PF_LEFT[effwidth] + hscroll;\n this.right = PF_RIGHT[effwidth] + hscroll;\n // vertical scroll\n let vscrol = this.regs[VSCROL] & 0xf;\n if ((this.dliop & 0x20) ^ this.in_vscroll) {\n if (this.in_vscroll) {\n this.linesleft = vscrol+1; // exiting\n } else {\n this.linesleft -= vscrol; // entering\n this.yofs += vscrol;\n }\n this.linesleft &= 0xf;\n this.in_vscroll ^= 0x20;\n }\n }\n }\n\n nextLine() {\n if (this.linesleft > 0) {\n this.linesleft--;\n this.yofs++;\n this.isfirstline = false;\n if (this.mode >= 8 && this.linesleft) {\n this.scanaddr = this.startaddr; // reset line addr\n }\n }\n }\n\n triggerNMI(mask: number) {\n this.regs[NMIST] = mask | 0x1f;\n if (this.regs[NMIEN] & mask) {\n this.nmi();\n }\n }\n\n getDlistAddr() {\n return this.regs[DLISTL] + (this.regs[DLISTH] << 8);\n }\n\n nextInsn(): number {\n let pc = this.getDlistAddr();\n let b = this.read(pc);\n //console.log('nextInsn', hex(pc), hex(b), this.v);\n pc = ((pc + 1) & 0x3ff) | (pc & ~0x3ff);\n this.regs[DLISTL] = pc & 0xff;\n this.regs[DLISTH] = pc >> 8;\n return b;\n }\n\n nextScreen(): number {\n let b = this.read(this.scanaddr);\n this.incScanAddr();\n return b;\n }\n incScanAddr() {\n this.scanaddr = ((this.scanaddr + 1) & 0xfff) | (this.scanaddr & ~0xfff);\n }\n\n dlDMAEnabled() { return this.regs[DMACTL] & 0b100000; }\n\n isVisibleScanline() {\n return this.v >= 8 && this.v < 248;\n }\n isPlayfieldDMAEnabled() {\n return this.dma_enabled && !this.linesleft;\n }\n isPlayerDMAEnabled() {\n return this.regs[DMACTL] & 0b1000;\n }\n isMissileDMAEnabled() {\n return this.regs[DMACTL] & 0b1100;\n }\n isWSYNC() {\n return this.regs[WSYNC] != 0;\n }\n\n clockPulse(): boolean {\n let did_dma = this.isWSYNC();\n if (!this.isVisibleScanline()) {\n this.doVBlank();\n } else {\n switch (this.h) {\n case 0:\n if (this.isMissileDMAEnabled()) {\n this.doPlayerMissileDMA(3);\n did_dma = true;\n }\n break;\n case 1:\n if (this.isPlayfieldDMAEnabled()) {\n let op = this.nextInsn(); // get mode\n // TODO: too many booleans\n this.jmp = (op & ~0x40) == 0x01; // JMP insn?\n this.lms = (op & 0x40) != 0 && (op & 0xf) != 0; // LMS insn?\n this.mode = op & 0xf;\n this.dliop = op;\n this.yofs = 0;\n this.isfirstline = true;\n did_dma = true;\n }\n break;\n case 2: case 3: case 4: case 5:\n if (this.isPlayerDMAEnabled()) {\n this.doPlayerMissileDMA(this.h + 2);\n did_dma = true;\n }\n break;\n case 6:\n case 7:\n if (this.isPlayfieldDMAEnabled() && this.isfirstline && (this.jmp || this.lms)) {\n if (this.h == 6) this.dlarg_lo = this.nextInsn();\n if (this.h == 7) this.dlarg_hi = this.nextInsn();\n did_dma = true;\n }\n break;\n case 8:\n // TODO? is this at cycle 8?\n if (this.isfirstline) {\n this.processDLIEntry();\n }\n if (this.dliop & 0x80) { // TODO: what if DLI disabled?\n if (this.linesleft == 1) {\n this.triggerNMI(0x80); // DLI interrupt\n }\n }\n break;\n case 9:\n break;\n case 111:\n if (this.dma_enabled) this.nextLine();\n ++this.v;\n break;\n }\n this.output = 0; // background color (TODO: only for blank lines)\n if (this.mode >= 2 && this.period) {\n let candma = this.h <= LAST_DMA_H;\n this.dmaclock = (this.dmaclock << 1) & 0x1ff;\n if (this.dmaclock & (1 << this.period)) {\n this.dmaclock |= 1;\n }\n if (this.h == this.left) { this.dmaclock |= 1; this.dmaidx = 0; }\n if (this.h == this.right) { this.dmaclock &= ~1; this.dmaidx++; }\n if (this.dmaclock & 1) {\n if (this.mode < 8 && this.isfirstline) { // only read chars on 1st line\n if (candma) {\n this.linebuf[this.dmaidx] = this.nextScreen(); // read char name\n } else {\n this.incScanAddr();\n }\n did_dma = candma;\n }\n this.dmaidx++;\n } else if (this.dmaclock & 8) {\n this.ch = this.linebuf[this.dmaidx - 4 / this.period]; // latch char\n if (candma) {\n this.readBitmapData(); // read bitmap\n } else {\n if (this.mode >= 8) this.incScanAddr();\n }\n did_dma = candma;\n }\n this.output = this.h >= this.left + 3 && this.h <= this.right + 2 ? 4 : 0;\n }\n }\n if (this.h < ANTIC_LEFT || this.h > ANTIC_RIGHT) this.output = 2;\n this.incHorizCounter();\n if (!did_dma && this.dramrefresh) {\n this.read(0); // to log a VRAM_READ event\n this.dramrefresh = false;\n did_dma = true;\n }\n return did_dma;\n }\n incHorizCounter() {\n switch (this.h) {\n case 25: case 25 + 4 * 1: case 25 + 4 * 2: case 25 + 4 * 3: case 25 + 4 * 4:\n case 25 + 4 * 5: case 25 + 4 * 6: case 25 + 4 * 7: case 25 + 4 * 8:\n this.dramrefresh = true;\n break;\n case 102:\n this.regs[WSYNC] = 0; // TODO: dram refresh delay to 106?\n break;\n case 113:\n this.h = 0;\n return\n }\n ++this.h;\n }\n doVBlank() {\n this.linesleft = this.mode = this.period = 0;\n if (this.h == 111) { this.v++; }\n if (this.v == 248 && this.h == 0) { this.triggerNMI(0x40); } // VBI\n if (this.v == 262 && this.h == 112) { this.v = 0; }\n if (this.v == 7 && this.h == 113) { \n this.dma_enabled = this.dlDMAEnabled() != 0;\n }\n this.output = 2; // blank\n this.dmaclock = 0;\n }\n\n doPlayerMissileDMA(section: number) {\n let oneline = this.regs[DMACTL] & 0x10;\n let pmaddr = this.regs[PMBASE] << 8;\n if (oneline) {\n pmaddr &= 0xf800;\n pmaddr |= section << 8;\n pmaddr |= this.v & 0xff;\n } else {\n pmaddr &= 0xfc00;\n pmaddr |= section << 7;\n pmaddr |= this.v >> 1;\n }\n this.read(pmaddr);\n }\n\n readBitmapData() {\n const mode = this.mode;\n if (mode < 8) {\t// character mode\n let ch = this.ch;\n let y = this.yofs >> MODE_YPERIOD[this.mode];\n let addrofs = y & 7;\n let chbase = this.regs[CHBASE];\n // modes 6 & 7\n if ((mode & 0xe) == 6) { // or 7\n ch &= 0x3f;\n chbase &= 0xfe;\n } else {\n ch &= 0x7f;\n chbase &= 0xfc;\n }\n let addr = (ch << 3) + (chbase << 8);\n // modes 2 & 3\n if ((mode & 0xe) == 2) { // or 3\n let chactl = this.regs[CHACTL];\n let mode3lc = mode == 3 && (ch & 0x60) == 0x60;\n if (chactl & 4)\n this.pfbyte = this.read(addr + (addrofs ^ 7)); // mirror\n else\n this.pfbyte = this.read(addr + addrofs);\n if (mode3lc && y < 2) { this.pfbyte = 0; }\n if (!mode3lc && y > 7) { this.pfbyte = 0; }\n if (this.ch & 0x80) {\n if (chactl & 1)\n this.pfbyte = 0x0; // blank\n if (chactl & 2)\n this.pfbyte ^= 0xff; // invert\n }\n } else {\n this.pfbyte = this.read(addr + addrofs);\n }\n } else {\t// map mode\n this.pfbyte = this.nextScreen();\n }\n }\n\n shiftout() {\n if (this.output == 4) { // visible pixel?\n switch (this.mode) {\n case 2: case 3:\n case 15:\n {\n let v = (this.pfbyte >> 7) & 1;\n this.pfbyte <<= 1;\n return v ? 8 : 6;\n }\n case 6: case 7:\n {\n let v = (this.pfbyte >> 7) & 1;\n this.pfbyte <<= 1;\n return v ? (this.ch >> 6) + 4 : 0;\n }\n case 9: case 11: case 12:\n {\n let v = (this.pfbyte >> 7) & 1;\n this.pfbyte <<= 1;\n return v ? 4 : 0;\n }\n case 4: case 5:\n {\n let v = (this.pfbyte >> 6) & 3;\n this.pfbyte <<= 2;\n if (this.ch & 0x80)\n return [0, 4, 5, 7][v];\n else\n return [0, 4, 5, 6][v];\n }\n case 8: case 10:\n case 13: case 14:\n {\n let v = (this.pfbyte >> 6) & 3;\n this.pfbyte <<= 2;\n return [0, 4, 5, 6][v];\n }\n }\n }\n return this.output;\n }\n\n}\n", "\n// GTIA\n// https://user.xmission.com/~trevin/atari/gtia_regs.html\n// https://user.xmission.com/~trevin/atari/gtia_pinout.html\n\nimport { dumpRAM, gtia_ntsc_to_rgb } from \"../../common/emu\";\nimport { hex, lpad, safe_extend } from \"../../common/util\";\n\n\n// write regs\nconst HPOSP0 = 0x0;\nconst HPOSM0 = 0x4;\nconst SIZEP0 = 0x8;\nconst SIZEM = 0x0c;\nconst GRAFP0 = 0x0d;\nconst GRAFM = 0x11;\nconst COLPM0 = 0x12;\nconst COLPF0 = 0x16;\nconst COLPF1 = 0x17;\nconst COLPF2 = 0x18;\nconst COLPF3 = 0x19;\nconst COLBK = 0x1a;\nconst PRIOR = 0x1b;\nconst VDELAY = 0x1c; // TODO\nconst GRACTL = 0x1d;\nconst HITCLR = 0x1e;\nconst CONSPK = 0x1f;\n// read regs\nconst M0PF = 0x0;\nconst P0PF = 0x4;\nconst M0PL = 0x8;\nconst P0PL = 0xc;\nexport const TRIG0 = 0x10;\nexport const CONSOL = 0x1f;\n\nconst HOFFSET = -9; // bias to account for antic->gtia delay\n\nconst PRIOR_TABLE : number[] = [\n 0,1,2,3, 7,7,7,7, 8,8,8,8, 4,5,6,7, // 0001 - 0\n 0,1,2,3, 7,7,7,7, 8,8,8,8, 4,5,6,7, // 0001\n 0,1,6,7, 5,5,5,5, 8,8,8,8, 2,3,4,5, // 0010 - 2\n 0,1,6,7, 5,5,5,5, 8,8,8,8, 2,3,4,5, // 0010\n 4,5,6,7, 3,3,3,3, 8,8,8,8, 0,1,2,3, // 0100 - 4\n 4,5,6,7, 3,3,3,3, 8,8,8,8, 0,1,2,3, // 0100\n 4,5,6,7, 3,3,3,3, 8,8,8,8, 0,1,2,3, // 0100\n 4,5,6,7, 3,3,3,3, 8,8,8,8, 0,1,2,3, // 0100\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000 - 8\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n 2,3,4,5, 7,7,7,7, 8,8,8,8, 0,1,6,7, // 1000\n];\n\nconst MODE_9_LOOKUP = [\n COLPM0+0, COLPM0+1, COLPM0+2, COLPM0+3,\n COLPF0+0, COLPF0+1, COLPF0+2, COLPF0+3,\n COLBK, COLBK, COLBK, COLBK,\n COLPF0+0, COLPF0+1, COLPF0+2, COLPF0+3,\n]\n\nexport class GTIA {\n regs = new Uint8Array(0x20);\n readregs = new Uint8Array(0x20);\n shiftregs = new Uint32Array(8);\n\n count = 0;\n an = 0;\n rgb = 0;\n pmcol = 0;\n gtiacol = 0;\n gtiacol2 = 0;\n hbias = HOFFSET;\n pmDebugMask = -1;\n\n reset() {\n this.regs.fill(0);\n this.readregs.fill(0); // TODO?\n this.readregs[0x14] = 0xf; // NTSC\n this.readregs.fill(0xf, 0x15); // default value for write-only regs\n this.count = 0;\n }\n saveState() {\n return safe_extend(0, {}, this);\n }\n loadState(s) {\n safe_extend(0, this, s);\n }\n setReg(a: number, v: number) {\n switch (a) {\n case COLPM0: case COLPM0+1: case COLPM0+2: case COLPM0+3:\n case COLPF0: case COLPF0+1: case COLPF0+2: case COLPF0+3:\n case COLBK:\n v &= 0xfe; // bit 0 unused in color regs\n break;\n case HITCLR:\n this.readregs.fill(0, 0, 16);\n return;\n }\n this.regs[a] = v;\n }\n readReg(a: number) {\n switch (a) {\n case CONSOL:\n return this.readregs[a] & ~this.regs[CONSPK];\n }\n return this.readregs[a];\n }\n sync() {\n this.count = 0;\n }\n setBias(b: number) {\n this.hbias = HOFFSET + b;\n }\n updateGfx(h: number, v: number, data: number) {\n switch (h) {\n case 0:\n if (this.regs[GRACTL] & 1) {\n // TODO: VDELAY\n this.regs[GRAFM] = data;\n }\n break;\n case 2: case 3: case 4: case 5:\n if (this.regs[GRACTL] & 2) {\n if (!(v&1) || !(this.regs[VDELAY] & (1<<(h+2))))\n this.regs[GRAFP0 - 2 + h] = data;\n }\n break;\n }\n }\n getPlayfieldColor(): number {\n // which GTIA mode?\n switch (this.regs[PRIOR] >> 6) {\n // normal mode\n case 0:\n switch (this.an) {\n case 0:\n return COLBK;\n case 4: case 5: case 6: case 7:\n return COLPF0 + this.an - 4;\n case 8:\n // combine PF2 hue and PF1 luminance\n return (this.regs[COLPF2] & 0xf0) | (this.regs[COLPF1] & 0x0f) | 0x100;\n }\n break;\n // mode 9 -- 16 luminances\n case 1:\n return (this.regs[COLBK] & 0xf0) | (this.gtiacol & 0xf) | 0x100;\n // mode 10 -- 9 colors from registers\n case 2:\n return MODE_9_LOOKUP[this.gtiacol];\n // mode 11 -- 16 hues\n case 3:\n return (this.regs[COLBK] & 0xf) | (this.gtiacol << 4) | 0x100;\n }\n return 0x100; // black\n }\n anySpriteActive() {\n return this.shiftregs[0] || this.shiftregs[1] || this.shiftregs[2]\n || this.shiftregs[3] || this.shiftregs[4] || this.shiftregs[5]\n || this.shiftregs[6] || this.shiftregs[7];\n }\n processPlayerMissile() {\n // no p/m gfx, just evaluate horiz. triggers\n if (!this.anySpriteActive()) {\n this.evalTrigger(0);\n this.evalTrigger(1);\n this.evalTrigger(2);\n this.evalTrigger(3);\n this.evalTrigger(4);\n this.evalTrigger(5);\n this.evalTrigger(6);\n this.evalTrigger(7);\n this.pmcol = -1;\n return;\n }\n // no collisions in blank area, but shift and trigger anyway\n if (this.an == 2) {\n this.shiftObject(0);\n this.shiftObject(1);\n this.shiftObject(2);\n this.shiftObject(3);\n this.shiftObject(4);\n this.shiftObject(5);\n this.shiftObject(6);\n this.shiftObject(7);\n this.pmcol = -1;\n return;\n }\n // TODO: gtia, hi-res mode collisions\n // compute gfx and collisions for players/missiles\n let priobias = (this.regs[PRIOR] & 15) << 4; // TODO\n let topprio = PRIOR_TABLE[(this.an & 7) + 8 + priobias];\n let pfset = this.an - 4; // TODO?\n let topobj = -1;\n let ppmask = 0;\n // players\n for (let i = 0; i < 4; i++) {\n let bit = this.shiftObject(i);\n if (bit) {\n if (pfset >= 0) { // TODO: hires and GTIA modes\n this.readregs[P0PF + i] |= 1 << pfset;\n }\n ppmask |= 1 << i;\n let prio = PRIOR_TABLE[i + priobias];\n if (prio < topprio) {\n topobj = i;\n topprio = prio;\n }\n }\n }\n // missiles\n for (let i = 0; i < 4; i++) {\n let bit = this.shiftObject(i + 4);\n if (bit) {\n if (pfset >= 0) {\n this.readregs[M0PF + i] |= 1 << pfset;\n }\n this.readregs[M0PL + i] |= ppmask;\n let prio = (this.regs[PRIOR] & 0x10) \n ? PRIOR_TABLE[priobias + 15]\n : PRIOR_TABLE[i + priobias];\n if (prio < topprio) {\n topobj = i + 4;\n topprio = prio;\n }\n }\n }\n // set player-player collision flags\n // TODO: either as a player or a GTIA mode 2 color\n if (ppmask & 1) this.readregs[P0PL + 0] |= ppmask & ~1;\n if (ppmask & 2) this.readregs[P0PL + 1] |= ppmask & ~2;\n if (ppmask & 4) this.readregs[P0PL + 2] |= ppmask & ~4;\n if (ppmask & 8) this.readregs[P0PL + 3] |= ppmask & ~8;\n this.pmcol = topobj >= 0 ? this.getObjectColor(topobj) : -1;\n }\n shiftObject(i: number) {\n let bit = (this.shiftregs[i] & 0x80000000) != 0;\n this.shiftregs[i] <<= 1;\n this.evalTrigger(i);\n return bit;\n }\n getObjectColor(i: number) {\n if ((this.regs[PRIOR] & 0x10) && i >= 4) {\n return this.regs[COLPF3];\n } else {\n return this.regs[COLPM0 + (i & 3)];\n }\n }\n evalTrigger(i: number) {\n if (this.regs[HPOSP0 + i] + this.hbias == this.count) {\n this.triggerObject(i);\n }\n }\n triggerObject(i: number) {\n let size, data;\n if (!(this.pmDebugMask & (1<> s) & 3;\n data = ((this.regs[GRAFM] >> s) & 3) << 6;\n }\n if (size & 1) data = expandBits(data); else data <<= 8;\n if (size == 3) data = expandBits(data); else data <<= 16;\n this.shiftregs[i] |= data;\n }\n\n clockPulse1(): void {\n this.processPlayerMissile();\n this.clockPulse2();\n this.count++;\n }\n\n clockPulse2(): void {\n var col: number;\n if (this.pmcol >= 0) {\n col = this.pmcol;\n } else {\n let pf = this.getPlayfieldColor();\n col = pf & 0x100 ? pf & 0xff : this.regs[pf];\n }\n this.rgb = COLORS_RGBA[col];\n // TODO: hires modes return 8, so other modes wont work\n this.gtiacol2 = (this.gtiacol2 << 1) | (this.an >> 3);\n }\n\n clockPulse4() {\n // latch GTIA buffer\n this.gtiacol = this.gtiacol2 & 15;\n }\n\n static stateToLongString(state): string {\n let s = ''\n s += `X: ${lpad(state.count, 3)} ANTIC: ${hex(state.an, 1)} PM: ${hex(state.pmcol, 3)}\\n`;\n s += \"Write Registers:\\n\";\n s += dumpRAM(state.regs, 0, 32);\n s += \"Read Registers:\\n\";\n s += dumpRAM(state.readregs, 0, 32);\n return s;\n }\n}\n\nfunction expandBits(x: number): number {\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n return x | (x << 1);\n}\n\nvar COLORS_RGBA = new Uint32Array(256);\nfor (var i = 0; i < 256; i++) {\n COLORS_RGBA[i] = gtia_ntsc_to_rgb(i);\n}\n\n", "/*\n * pokey.c - POKEY sound chip emulation\n *\n * Copyright (C) 1995-1998 David Firth\n * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS)\n *\n * This file is part of the Atari800 emulator project which emulates\n * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers.\n *\n * Atari800 is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version.\n *\n * Atari800 is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Atari800; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n*/\n\nimport { dumpRAM } from \"../../common/emu\"\nimport { hex, lpad, safe_extend } from \"../../common/util\"\n\nconst AUDF1 = 0x00\nconst AUDC1 = 0x01\nconst AUDF2 = 0x02\nconst AUDC2 = 0x03\nconst AUDF3 = 0x04\nconst AUDC3 = 0x05\nconst AUDF4 = 0x06\nconst AUDC4 = 0x07\nconst AUDCTL = 0x08\nconst STIMER = 0x09\nconst SKRES = 0x0a\nconst POTGO = 0x0b\nconst SEROUT = 0x0d\nconst IRQEN = 0x0e\nconst SKCTL = 0x0f\n\nconst POT0 = 0x00\nconst POT1 = 0x01\nconst POT2 = 0x02\nconst POT3 = 0x03\nconst POT4 = 0x04\nconst POT5 = 0x05\nconst POT6 = 0x06\nconst POT7 = 0x07\nconst ALLPOT = 0x08\nconst KBCODE = 0x09\nconst RANDOM = 0x0a\nconst SERIN = 0x0d\nconst IRQST = 0x0e\nconst SKSTAT = 0x0f\n\n/* definitions for AUDCx (D201, D203, D205, D207) */\nconst NOTPOLY5 = 0x80 /* selects POLY5 or direct CLOCK */\nconst POLY4 = 0x40 /* selects POLY4 or POLY17 */\nconst PURETONE = 0x20 /* selects POLY4/17 or PURE tone */\nconst VOL_ONLY = 0x10 /* selects VOLUME OUTPUT ONLY */\nconst VOLUME_MASK = 0x0f /* volume mask */\n\n/* definitions for AUDCTL (D208) */\nconst POLY9 = 0x80 /* selects POLY9 or POLY17 */\nconst CH1_179 = 0x40 /* selects 1.78979 MHz for Ch 1 */\nconst CH3_179 = 0x20 /* selects 1.78979 MHz for Ch 3 */\nconst CH1_CH2 = 0x10 /* clocks channel 1 w/channel 2 */\nconst CH3_CH4 = 0x08 /* clocks channel 3 w/channel 4 */\nconst CH1_FILTER = 0x04 /* selects channel 1 high pass filter */\nconst CH2_FILTER = 0x02 /* selects channel 2 high pass filter */\nconst CLOCK_15 = 0x01 /* selects 15.6999kHz or 63.9210kHz */\n\n/* for accuracy, the 64kHz and 15kHz clocks are exact divisions of\n the 1.79MHz clock */\nconst DIV_64 = 28 /* divisor for 1.79MHz clock to 64 kHz */\nconst DIV_15 = 114 /* divisor for 1.79MHz clock to 15 kHz */\n\n/* the size (in entries) of the 4 polynomial tables */\nconst POLY4_SIZE = 0x000f\nconst POLY5_SIZE = 0x001f\nconst POLY9_SIZE = 0x01ff\nconst POLY17_SIZE = 0x0001ffff\n\nconst CHAN1 = 0\nconst CHAN2 = 1\nconst CHAN3 = 2\nconst CHAN4 = 3\n\nconst ANTIC_LINE_C = 114\n\n/* Some defines about the serial I/O timing. Currently fixed! */\nconst SIO_XMTDONE_INTERVAL = 15\nconst SIO_SERIN_INTERVAL = 8\nconst SIO_SEROUT_INTERVAL = 8\nconst SIO_ACK_INTERVAL = 36\n\nvar poly9: Uint8Array;\nvar poly17: Uint8Array;\n\nfunction initPolyTables() {\n poly9 = new Uint8Array(511);\n poly17 = new Uint8Array(16385);\n /* initialise poly9_lookup */\n let reg = 0x1ff;\n for (let i = 0; i < 511; i++) {\n reg = ((((reg >> 5) ^ reg) & 1) << 8) + (reg >> 1);\n poly9[i] = reg;\n }\n /* initialise poly17_lookup */\n reg = 0x1ffff;\n for (let i = 0; i < 16385; i++) {\n reg = ((((reg >> 5) ^ reg) & 0xff) << 9) + (reg >> 8);\n poly17[i] = (reg >> 1);\n }\n}\n\nexport class POKEY {\n regs = new Uint8Array(16);\n readregs = new Uint8Array(16);\n divnirq = new Uint32Array(4);\n divnmax = new Uint32Array(4);\n pot_inputs = new Uint8Array(8);\n basemult = 0;\n pot_scanline = 0;\n random_scanline_counter = 0;\n kbcode = 0;\n DELAYED_SERIN_IRQ = 0;\n DELAYED_SEROUT_IRQ = 0;\n DELAYED_XMTDONE_IRQ = 0;\n\n constructor(\n public irq: () => void,\n public antic_xpos: () => number,\n ) {\n this.init();\n }\n\n saveState() {\n return safe_extend(0, {}, this);\n }\n loadState(s) {\n safe_extend(0, this, s);\n }\n\n init() {\n /* Initialise Serial Port Interrupts */\n //DELAYED_SERIN_IRQ = 0;\n //DELAYED_SEROUT_IRQ = 0;\n //DELAYED_XMTDONE_IRQ = 0;\n this.readregs.fill(0xff);\n this.readregs[SKSTAT] = 0xef;\n //SERIN = 0x00;\t/* or 0xff ? */\n //IRQEN = 0x00;\n //SKCTL = 0x00;\n this.basemult = DIV_64;\n this.pot_inputs.fill(128);\n initPolyTables();\n }\n\n\n read(addr: number): number {\n let byte = this.readregs[addr];\n addr &= 0xf;\n switch (addr) {\n case 0: case 1: case 2: case 3:\n case 4: case 5: case 6: case 7:\n byte = this.pot_inputs[addr];\n return (byte < this.pot_scanline) ? byte : this.pot_scanline;\n case ALLPOT:\n for (let i = 0; i < 8; i++) {\n if (this.pot_inputs[i] <= this.pot_scanline)\n byte &= ~(1 << i);\t\t// reset bit if pot value known\n }\n break;\n case KBCODE:\n return this.kbcode;\n case SKSTAT:\n byte = SKSTAT + (this.CASSETTE_IOLineStatus() << 4);\n break;\n case RANDOM:\n if ((this.regs[SKCTL] & 0x03) != 0) {\n let i = this.random_scanline_counter + this.antic_xpos();\n if (this.regs[AUDCTL] & POLY9)\n byte = poly9[i % POLY9_SIZE];\n else {\n i %= POLY17_SIZE;\n let ptr = i >> 3;\n i &= 7;\n byte = (poly17[ptr] >> i) + (poly17[ptr + 1] << (8 - i));\n }\n }\n break;\n }\n return byte & 0xff;\n }\n\n write(addr: number, byte: number): void {\n addr &= 0x0f;\n this.regs[addr] = byte;\n switch (addr) {\n case AUDCTL:\n /* determine the base multiplier for the 'div by n' calculations */\n if (byte & CLOCK_15)\n this.basemult = DIV_15;\n else\n this.basemult = DIV_64;\n this.update_counter((1 << CHAN1) | (1 << CHAN2) | (1 << CHAN3) | (1 << CHAN4));\n break;\n case AUDF1:\n this.update_counter((this.regs[AUDCTL] & CH1_CH2) ? ((1 << CHAN2) | (1 << CHAN1)) : (1 << CHAN1));\n break;\n case AUDF2:\n this.update_counter(1 << CHAN2);\n break;\n case AUDF3:\n this.update_counter((this.regs[AUDCTL] & CH3_CH4) ? ((1 << CHAN4) | (1 << CHAN3)) : (1 << CHAN3));\n break;\n case AUDF4:\n this.update_counter(1 << CHAN4);\n break;\n case IRQEN:\n this.readregs[IRQST] |= ~byte & 0xf7;\t/* Reset disabled IRQs except XMTDONE */\n let mask = ~this.readregs[IRQST] & this.regs[IRQEN];\n if (mask) {\n this.generateIRQ(this.readregs[IRQST]);\n }\n break;\n case SKRES:\n this.readregs[SKSTAT] |= 0xe0;\n break;\n case POTGO:\n if (!(this.regs[SKCTL] & 4))\n this.pot_scanline = 0;\t/* slow pot mode */\n break;\n case SEROUT:\n if ((this.regs[SKCTL] & 0x70) == 0x20 && this.siocheck()) {\n this.SIO_PutByte(byte);\n }\n // check if cassette 2-tone mode has been enabled \n if ((this.regs[SKCTL] & 0x08) == 0x00) {\n // intelligent device\n this.DELAYED_SEROUT_IRQ = SIO_SEROUT_INTERVAL;\n this.readregs[IRQST] |= 0x08;\n this.DELAYED_XMTDONE_IRQ = SIO_XMTDONE_INTERVAL;\n }\n else {\n // cassette \n // some savers patch the cassette baud rate, so we evaluate it here \n // scanlines per second*10 bit*audiofrequency/(1.79 MHz/2) \n this.DELAYED_SEROUT_IRQ = 312 * 50 * 10 * (this.regs[AUDF3] + this.regs[AUDF4] * 0x100) / 895000;\n // safety check \n if (this.DELAYED_SEROUT_IRQ >= 3) {\n this.readregs[IRQST] |= 0x08;\n this.DELAYED_XMTDONE_IRQ = 2 * this.DELAYED_SEROUT_IRQ - 2;\n }\n else {\n this.DELAYED_SEROUT_IRQ = 0;\n this.DELAYED_XMTDONE_IRQ = 0;\n }\n };\n break;\n case STIMER:\n this.divnirq[CHAN1] = this.divnmax[CHAN1];\n this.divnirq[CHAN2] = this.divnmax[CHAN2];\n this.divnirq[CHAN3] = this.divnmax[CHAN3];\n this.divnirq[CHAN4] = this.divnmax[CHAN4];\n //POKEYSND_Update(STIMER, byte, 0, SOUND_GAIN);\n break;\n case SKCTL:\n //VOICEBOX_SKCTLPutByte(byte);\n //POKEYSND_Update(SKCTL, byte, 0, SOUND_GAIN);\n if (byte & 4)\n this.pot_scanline = 228;\t/* fast pot mode - return results immediately */\n if ((byte & 0x03) == 0) {\n /* POKEY reset. */\n /* Stop serial IO. */\n this.DELAYED_SERIN_IRQ = 0;\n this.DELAYED_SEROUT_IRQ = 0;\n this.DELAYED_XMTDONE_IRQ = 0;\n // TODO: CASSETTE_ResetPOKEY();\n /* TODO other registers should also be reset. */\n }\n break;\n }\n this.snd_update(addr);\n //POKEYSND_Update(AUDC1, byte, 0, SOUND_GAIN);\n }\n\n /*****************************************************************************/\n /* Module: Update_Counter() */\n /* Purpose: To process the latest control values stored in the AUDF, AUDC, */\n /* and AUDCTL registers. It pre-calculates as much information as */\n /* possible for better performance. This routine has been added */\n /* here again as I need the precise frequency for the pokey timers */\n /* again. The pokey emulation is therefore somewhat sub-optimal */\n /* since the actual pokey emulation should grab the frequency values */\n /* directly from here instead of calculating them again. */\n /* */\n /* Author: Ron Fries,Thomas Richter */\n /* Date: March 27, 1998 */\n /* */\n /* Inputs: chan_mask: Channel mask, one bit per channel. */\n /* The channels that need to be updated */\n /* */\n /* Outputs: Adjusts local globals - no return value */\n /* */\n /*****************************************************************************/\n\n update_counter(chan_mask: number): void {\n\n /************************************************************/\n /* As defined in the manual, the exact Div_n_cnt values are */\n /* different depending on the frequency and resolution: */\n /* 64 kHz or 15 kHz - AUDF + 1 */\n /* 1 MHz, 8-bit - AUDF + 4 */\n /* 1 MHz, 16-bit - AUDF[CHAN1]+256*AUDF[CHAN2] + 7 */\n /************************************************************/\n\n /* only reset the channels that have changed */\n\n if (chan_mask & (1 << CHAN1)) {\n /* process channel 1 frequency */\n if (this.regs[AUDCTL] & CH1_179)\n this.divnmax[CHAN1] = this.regs[AUDF1 + CHAN1] + 4;\n else\n this.divnmax[CHAN1] = (this.regs[AUDF1 + CHAN1] + 1) * this.basemult;\n if (this.divnmax[CHAN1] < ANTIC_LINE_C)\n this.divnmax[CHAN1] = ANTIC_LINE_C;\n }\n\n if (chan_mask & (1 << CHAN2)) {\n /* process channel 2 frequency */\n if (this.regs[AUDCTL] & CH1_CH2) {\n if (this.regs[AUDCTL] & CH1_179)\n this.divnmax[CHAN2] = this.regs[AUDF1 + CHAN2] * 256 + this.regs[AUDF1 + CHAN1] + 7;\n else\n this.divnmax[CHAN2] = (this.regs[AUDF1 + CHAN2] * 256 + this.regs[AUDF1 + CHAN1] + 1) * this.basemult;\n }\n else\n this.divnmax[CHAN2] = (this.regs[AUDF1 + CHAN2] + 1) * this.basemult;\n if (this.divnmax[CHAN2] < ANTIC_LINE_C)\n this.divnmax[CHAN2] = ANTIC_LINE_C;\n }\n\n if (chan_mask & (1 << CHAN4)) {\n /* process channel 4 frequency */\n if (this.regs[AUDCTL] & CH3_CH4) {\n if (this.regs[AUDCTL] & CH3_179)\n this.divnmax[CHAN4] = this.regs[AUDF1 + CHAN4] * 256 + this.regs[AUDF1 + CHAN3] + 7;\n else\n this.divnmax[CHAN4] = (this.regs[AUDF1 + CHAN4] * 256 + this.regs[AUDF1 + CHAN3] + 1) * this.basemult;\n }\n else\n this.divnmax[CHAN4] = (this.regs[AUDF1 + CHAN4] + 1) * this.basemult;\n if (this.divnmax[CHAN4] < ANTIC_LINE_C)\n this.divnmax[CHAN4] = ANTIC_LINE_C;\n }\n\n //console.log(chan_mask, this.divnmax);\n }\n\n snd_update(addr: number) {\n\n }\n\n advanceScanline() {\n /***************************************************************************\n ** Generate POKEY Timer IRQs if required **\n ** called on a per-scanline basis, not very precise, but good enough **\n ** for most applications **\n ***************************************************************************/\n\n\n /* on nonpatched i/o-operation, enable the cassette timing */\n /*\n if (!ESC_enable_sio_patch) {\n if (CASSETTE_AddScanLine())\n DELAYED_SERIN_IRQ = 1;\n }\n */\n\n if ((this.regs[SKCTL] & 0x03) == 0)\n /* Don't process timers when POKEY is in reset mode. */\n return;\n\n if (this.pot_scanline < 228)\n this.pot_scanline++;\n\n this.random_scanline_counter += ANTIC_LINE_C;\n this.random_scanline_counter %= (this.regs[AUDCTL] & POLY9) ? POLY9_SIZE : POLY17_SIZE;\n\n if (this.DELAYED_SERIN_IRQ > 0) {\n if (--this.DELAYED_SERIN_IRQ == 0) {\n // Load a byte to SERIN - even when the IRQ is disabled. \n this.readregs[SERIN] = this.SIO_GetByte();\n this.generateIRQ(0x20);\n }\n }\n\n if (this.DELAYED_SEROUT_IRQ > 0) {\n if (--this.DELAYED_SEROUT_IRQ == 0) {\n this.generateIRQ(0x10);\n }\n }\n\n if (this.DELAYED_XMTDONE_IRQ > 0)\n if (--this.DELAYED_XMTDONE_IRQ == 0) {\n this.generateIRQ(0x08);\n }\n\n this.advanceIRQTimer(CHAN1, 0x1);\n this.advanceIRQTimer(CHAN2, 0x2);\n this.advanceIRQTimer(CHAN4, 0x4);\n }\n\n advanceIRQTimer(chan: number, mask: number) {\n if ((this.divnirq[chan] -= ANTIC_LINE_C) < 0) {\n this.divnirq[chan] += this.divnmax[chan];\n this.generateIRQ(mask);\n //console.log('irq', chan, this.divnirq[chan], this.divnmax[chan])\n }\n }\n\n generateIRQ(mask: number) {\n if (this.regs[IRQEN] & mask) {\n this.irq();\n this.readregs[IRQST] &= ~mask;\n }\n }\n\n static stateToLongString(state): string {\n let s = ''\n s += \"Write Registers:\\n\";\n s += dumpRAM(state.regs, 0, 16);\n s += \"Read Registers:\\n\";\n s += dumpRAM(state.readregs, 0, 16);\n return s;\n }\n\n CASSETTE_IOLineStatus() {\n return 0;\n }\n\n siocheck() {\n return (((this.regs[AUDF1 + CHAN3] == 0x28 || this.regs[AUDF1 + CHAN3] == 0x10\n || this.regs[AUDF1 + CHAN3] == 0x08 || this.regs[AUDF1 + CHAN3] == 0x0a)\n && this.regs[AUDF1 + CHAN4] == 0x00) // intelligent peripherals speeds\n || (this.regs[SKCTL] & 0x78) == 0x28) // cassette save mode\n && (this.regs[AUDCTL] & 0x28) == 0x28;\n }\n SIO_PutByte(byte: number) {\n // TODO\n console.log(\"SIO put byte\", byte);\n }\n SIO_GetByte() {\n return 0; // TODO\n }\n\n}\n\n\n//const SOUND_GAIN 4\n/*\nvoid Frame(void)\n{\n random_scanline_counter %= (this.regs[AUDCTL] & POLY9) ? POLY9_SIZE : POLY17_SIZE;\n}\n*/\n\n\n\n", "import { newPOKEYAudio, TssChannelAdapter } from \"../common/audio\";\nimport { Machine } from \"../common/baseplatform\";\nimport { MOS6502 } from \"../common/cpu/MOS6502\";\nimport { AcceptsKeyInput, AcceptsPaddleInput, AcceptsROM, BasicScanlineMachine, FrameBased, Probeable, TrapCondition, VideoSource } from \"../common/devices\";\nimport { KeyFlags, Keys, makeKeycodeMap, newAddressDecoder, newKeyboardHandler } from \"../common/emu\";\nimport { hex } from \"../common/util\";\nimport { BaseWASIMachine } from \"../common/wasmplatform\";\nimport { ANTIC, MODE_LINES, MODE_SHIFT } from \"./chips/antic\";\nimport { CONSOL, GTIA, TRIG0 } from \"./chips/gtia\";\nimport { POKEY } from \"./chips/pokey\";\n\nconst ATARI8_KEYMATRIX_INTL_NOSHIFT = [\n Keys.VK_L, Keys.VK_J, Keys.VK_SEMICOLON, Keys.VK_F4, Keys.VK_F5, Keys.VK_K, Keys.VK_BACK_SLASH, Keys.VK_TILDE,\n Keys.VK_O, null, Keys.VK_P, Keys.VK_U, Keys.VK_ENTER, Keys.VK_I, Keys.VK_MINUS2, Keys.VK_EQUALS2,\n Keys.VK_V, Keys.VK_F7, Keys.VK_C, Keys.VK_F6, Keys.VK_F4, Keys.VK_B, Keys.VK_X, Keys.VK_Z,\n Keys.VK_4, null, Keys.VK_3, Keys.VK_6, Keys.VK_ESCAPE, Keys.VK_5, Keys.VK_2, Keys.VK_1,\n Keys.VK_COMMA, Keys.VK_SPACE, Keys.VK_PERIOD, Keys.VK_N, null, Keys.VK_M, Keys.VK_SLASH, null/*invert*/,\n Keys.VK_R, null, Keys.VK_E, Keys.VK_Y, Keys.VK_TAB, Keys.VK_T, Keys.VK_W, Keys.VK_Q,\n Keys.VK_9, null, Keys.VK_0, Keys.VK_7, Keys.VK_BACK_SPACE, Keys.VK_8, null, null,\n Keys.VK_F, Keys.VK_H, Keys.VK_D, null, Keys.VK_CAPS_LOCK, Keys.VK_G, Keys.VK_S, Keys.VK_A,\n];\n\n//TODO\nvar ATARI8_KEYCODE_MAP = makeKeycodeMap([\n [Keys.UP, 0, 0x1],\n [Keys.DOWN, 0, 0x2],\n [Keys.LEFT, 0, 0x4],\n [Keys.RIGHT, 0, 0x8],\n [{ c: 16, n: \"Shift\", plyr: 0, button: 0 }, 2, 0x1],\n /*\n [Keys.P2_UP, 0, 0x10],\n [Keys.P2_DOWN, 0, 0x20],\n [Keys.P2_LEFT, 0, 0x40],\n [Keys.P2_RIGHT, 0, 0x80],\n [Keys.P2_A, 3, 0x1],\n */\n [Keys.VK_F1, 3, 0x1], // START\n [Keys.VK_F2, 3, 0x2], // SELECT\n [Keys.VK_F3, 3, 0x4], // OPTION\n]);\n\n\nexport class Atari800 extends BasicScanlineMachine implements AcceptsPaddleInput {\n\n // http://www.ataripreservation.org/websites/freddy.offenga/megazine/ISSUE5-PALNTSC.html\n cpuFrequency = 1789773;\n numTotalScanlines = 262;\n cpuCyclesPerLine = 114;\n canvasWidth = 336;\n numVisibleScanlines = 224;\n aspectRatio = this.canvasWidth / this.numVisibleScanlines * 0.857;\n firstVisibleScanline = 16;\n firstVisibleClock = (44 - 6) * 2; // ... to 215 * 2\n defaultROMSize = 0x8000;\n overscan = true;\n audioOversample = 2;\n sampleRate = this.numTotalScanlines * 60 * this.audioOversample;\n run_address = -1;\n\n cpu: MOS6502;\n ram: Uint8Array;\n bios: Uint8Array;\n bus;\n audio_pokey;\n audioadapter;\n antic: ANTIC;\n gtia: GTIA;\n irq_pokey: POKEY;\n inputs = new Uint8Array(4);\n linergb = new Uint32Array(this.canvasWidth);\n lastdmabyte = 0;\n keycode = 0;\n cart_80 = false;\n cart_a0 = false;\n xexdata = null;\n keyboard_active = true;\n d500 = new Uint8Array(0x100);\n // TODO: save/load vars\n\n constructor() {\n super();\n this.cpu = new MOS6502();\n this.ram = new Uint8Array(0x10000);\n this.bios = new Uint8Array(0x2800);\n this.bus = this.newBus();\n this.connectCPUMemoryBus(this.bus);\n // create support chips\n this.antic = new ANTIC(this.readDMA.bind(this), this.antic_nmi.bind(this));\n this.gtia = new GTIA();\n this.irq_pokey = new POKEY(this.pokey_irq.bind(this), () => this.antic.h);\n this.audio_pokey = newPOKEYAudio(1);\n this.audioadapter = new TssChannelAdapter(this.audio_pokey.pokey1, this.audioOversample, this.sampleRate);\n this.handler = newKeyboardHandler(\n this.inputs, ATARI8_KEYCODE_MAP, this.getKeyboardFunction(), true);\n }\n newBus() {\n return {\n read: newAddressDecoder([\n [0x0000, 0x7fff, 0xffff, (a) => { return this.ram[a]; }],\n [0x8000, 0x9fff, 0xffff, (a) => { return this.cart_80 ? this.rom[a - 0x8000] : this.ram[a]; }],\n [0xa000, 0xbfff, 0xffff, (a) => { return this.cart_a0 ? this.rom[a - 0x8000] : this.ram[a]; }],\n [0xd000, 0xd0ff, 0x1f, (a) => { return this.gtia.readReg(a); }],\n [0xd200, 0xd2ff, 0xf, (a) => { return this.readPokey(a); }],\n [0xd300, 0xd3ff, 0xf, (a) => { return this.readPIA(a); }],\n [0xd400, 0xd4ff, 0xf, (a) => { return this.antic.readReg(a); }],\n [0xd500, 0xd5ff, 0xff, (a) => { return this.d500[a]; }],\n [0xd800, 0xffff, 0xffff, (a) => { return this.bios[a - 0xd800]; }],\n ]),\n write: newAddressDecoder([\n [0x0000, 0xbffa, 0xffff, (a, v) => { this.ram[a] = v; }],\n [0xbffb, 0xbfff, 0xffff, (a, v) => { this.ram[a] = v; this.initCartA(); }],\n [0xd000, 0xd0ff, 0x1f, (a, v) => { this.gtia.setReg(a, v); }],\n [0xd200, 0xd2ff, 0xf, (a, v) => { this.writePokey(a, v); }],\n [0xd400, 0xd4ff, 0xf, (a, v) => { this.antic.setReg(a, v); }],\n [0xd500, 0xd5ff, 0xff, (a, v) => { this.writeMapper(a, v); }],\n ]),\n };\n }\n\n loadBIOS(bios: Uint8Array) {\n this.bios.set(bios);\n }\n\n reset() {\n super.reset();\n this.antic.reset();\n this.gtia.reset();\n this.keycode = 0;\n //if (this.xexdata) this.cart_a0 = true; // TODO\n }\n\n read(a) {\n // TODO: lastdmabyte?\n return this.bus.read(a);\n }\n // used by ANTIC\n readDMA(a) {\n let v = this.bus.read(a);\n this.probe.logDMARead(a, v);\n this.lastdmabyte = v;\n return v;\n }\n readConst(a) {\n return a < 0xd000 || a >= 0xd500 ? this.bus.read(a) : 0xff;\n }\n write(a, v) {\n this.bus.write(a, v);\n }\n readPokey(a: number) {\n switch (a & 0xf) {\n case 9: // KBCODE\n return this.keycode & 0xff;\n case 15: // SKSTAT\n return ((~this.keycode >> 6) & 0x4) | ((~this.keycode >> 3) & 0x8) | 0x12;\n default:\n return this.irq_pokey.read(a);\n }\n }\n readPIA(a: number) {\n if (a == 0 || a == 1) { return ~this.inputs[a]; }\n }\n writePokey(a, v) {\n this.audio_pokey.pokey1.setRegister(a, v);\n this.irq_pokey.write(a, v);\n }\n\n startScanline() {\n // TODO: if (this.antic.h != 0) throw new Error(this.antic.h+\"\");\n //if (this.cpu.isHalted()) throw new EmuHalt(\"CPU HALTED\");\n // set GTIA switch inputs\n this.gtia.sync();\n // TODO: trigger latching mode\n for (let i = 0; i < 4; i++)\n this.gtia.readregs[TRIG0 + i] = (~this.inputs[2] >> i) & 1;\n // console switches\n this.gtia.readregs[CONSOL] = ~this.inputs[3] & 0x7;\n // advance POKEY audio\n this.audio && this.audioadapter.generate(this.audio);\n // advance POKEY IRQ timers\n this.irq_pokey.advanceScanline();\n }\n\n drawScanline() {\n // TODO\n let y = this.antic.v - this.firstVisibleScanline;\n if (y >= 0 && y < this.numVisibleScanlines) {\n this.pixels.set(this.linergb, y * this.canvasWidth);\n }\n }\n\n advanceCPU(): number {\n // update ANTIC\n if (this.antic.clockPulse()) {\n // ANTIC DMA cycle, update GTIA\n if (this.antic.h < 8)\n this.gtia.updateGfx(this.antic.h - 1, this.antic.v, this.lastdmabyte); // HALT pin\n if (this.antic.isWSYNC())\n this.probe.logWait(0);\n this.probe.logClocks(1);\n } else {\n super.advanceCPU();\n }\n // update GTIA\n // get X coordinate within scanline\n let xofs = this.antic.h * 4 - this.firstVisibleClock;\n // GTIA tick functions\n let gtiatick1 = () => {\n this.gtia.clockPulse1();\n this.linergb[xofs++] = this.gtia.rgb;\n }\n let gtiatick2 = () => {\n this.gtia.clockPulse2();\n this.linergb[xofs++] = this.gtia.rgb;\n }\n // tick 4 GTIA clocks for each CPU/ANTIC cycle\n this.gtia.clockPulse4();\n // correct for HSCROL -- bias antic +2, bias gtia -1\n if ((this.antic.dliop & 0x10) && (this.antic.regs[4] & 1)) {\n xofs += 2;\n this.gtia.setBias(-1);\n } else {\n this.gtia.setBias(0);\n }\n let bp = MODE_SHIFT[this.antic.mode];\n let odd = this.antic.h & 1;\n if (bp < 8 || odd) { this.gtia.an = this.antic.shiftout(); }\n gtiatick1();\n if (bp == 1) { this.gtia.an = this.antic.shiftout(); }\n gtiatick2();\n if (bp <= 2) { this.gtia.an = this.antic.shiftout(); }\n gtiatick1();\n if (bp == 1) { this.gtia.an = this.antic.shiftout(); }\n gtiatick2();\n return 1;\n }\n\n loadState(state: any) {\n this.loadControlsState(state);\n this.cpu.loadState(state.c);\n this.ram.set(state.ram);\n this.antic.loadState(state.antic);\n this.gtia.loadState(state.gtia);\n this.irq_pokey.loadState(state.pokey);\n this.lastdmabyte = state.lastdmabyte;\n this.cart_80 = state.cart_80;\n this.cart_a0 = state.cart_a0;\n }\n saveState() {\n return {\n c: this.cpu.saveState(),\n ram: this.ram.slice(0),\n antic: this.antic.saveState(),\n gtia: this.gtia.saveState(),\n pokey: this.irq_pokey.saveState(),\n inputs: this.inputs.slice(0),\n lastdmabyte: this.lastdmabyte,\n keycode: this.keycode,\n cart_80: this.cart_80,\n cart_a0: this.cart_a0,\n };\n }\n loadControlsState(state) {\n this.inputs.set(state.inputs);\n this.keycode = state.keycode;\n }\n saveControlsState() {\n return {\n inputs: this.inputs.slice(0),\n keycode: this.keycode,\n };\n }\n getRasterScanline() {\n return this.antic.v;\n }\n getRasterLineClock() {\n return this.antic.h;\n }\n getDebugCategories() {\n return ['CPU', 'Stack', 'ANTIC', 'GTIA', 'POKEY'];\n }\n getDebugInfo(category, state) {\n switch (category) {\n case 'ANTIC': return ANTIC.stateToLongString(state.antic);\n case 'GTIA': return GTIA.stateToLongString(state.gtia);\n case 'POKEY': return POKEY.stateToLongString(state.pokey);\n }\n }\n getKeyboardFunction() {\n return (o, key, code, flags) => {\n if (!this.keyboard_active) return false;\n if (flags & (KeyFlags.KeyDown | KeyFlags.KeyUp)) {\n //console.log(o, key, code, flags, hex(this.keycode));\n var keymap = ATARI8_KEYMATRIX_INTL_NOSHIFT;\n if (key == Keys.VK_F9.c) {\n this.irq_pokey.generateIRQ(0x80); // break IRQ\n return true;\n }\n for (var i = 0; i < keymap.length; i++) {\n if (keymap[i] && keymap[i].c == key) {\n this.keycode = i;\n if (flags & KeyFlags.Shift) { this.keycode |= 0x40; }\n if (flags & KeyFlags.Ctrl) { this.keycode |= 0x80; }\n if (flags & KeyFlags.KeyDown) {\n this.keycode |= 0x100;\n this.irq_pokey.generateIRQ(0x40); // key pressed IRQ\n return true;\n }\n }\n }\n };\n }\n }\n pokey_irq() {\n this.cpu.IRQ();\n this.probe.logInterrupt(2);\n }\n antic_nmi() {\n this.cpu.NMI();\n this.probe.logInterrupt(1);\n }\n\n loadROM(rom: Uint8Array, title: string) {\n if ((rom[0] == 0xff && rom[1] == 0xff) && !title?.endsWith('.rom')) {\n // XEX file, chill out and wait for BIOS hook\n this.xexdata = rom;\n } else {\n this.loadCartridge(rom);\n }\n }\n\n loadCartridge(rom: Uint8Array) {\n // TODO: https://github.com/dmlloyd/atari800/blob/master/DOC/cart.txt\n // strip off header\n if (rom[0] == 0x43 && rom[1] == 0x41 && rom[2] == 0x52 && rom[3] == 0x54) {\n rom = rom.slice(16);\n }\n if (rom.length != 0x1000 && rom.length != 0x2000 && rom.length != 0x4000 && rom.length != 0x8000)\n throw new Error(\"Sorry, this platform can only load 4/8/16/32 KB cartridges at the moment.\");\n // TODO: support other than 8 KB carts\n // support 4/8/16/32 KB carts\n let rom2 = new Uint8Array(0x8000);\n for (let i = 0; i <= rom2.length - rom.length; i += rom.length) {\n rom2.set(rom, i);\n }\n this.run_address = rom2[0x7ffe] + rom2[0x7fff]*256;\n this.cart_a0 = true; // TODO\n this.cart_80 = rom.length == 0x4000;\n super.loadROM(rom2);\n }\n\n writeMapper(addr: number, value: number) {\n // TODO\n if (addr == 0xff) {\n if (value == 0x80) this.cart_80 = false;\n if (value == 0xa0) this.cart_a0 = false;\n }\n }\n\n loadXEX(rom: Uint8Array) {\n let ofs = 2;\n let stub = this.d500;\n let stubofs = 0; // stub routine \n var runaddr = -1;\n // load segments into RAM\n while (ofs < rom.length) {\n let start = rom[ofs + 0] + rom[ofs + 1] * 256;\n let end = rom[ofs + 2] + rom[ofs + 3] * 256;\n console.log('XEX', hex(ofs), hex(start), hex(end));\n ofs += 4;\n for (let i = start; i <= end; i++) {\n this.ram[i] = rom[ofs++];\n }\n if (start == 0x2e0 && end == 0x2e1) {\n runaddr = this.ram[0x2e0] + this.ram[0x2e1] * 256;\n console.log('XEX run', hex(runaddr));\n }\n if (start == 0x2e2 && end == 0x2e3) {\n var initaddr = this.ram[0x2e2] + this.ram[0x2e3] * 256;\n console.log('XEX init', hex(initaddr));\n stub[stubofs++] = 0x20;\n stub[stubofs++] = initaddr & 0xff;\n stub[stubofs++] = initaddr >> 8;\n }\n if (ofs > rom.length) throw new Error(\"Bad .XEX file format\");\n }\n if (runaddr >= 0) {\n // build stub routine at 0xd500\n stub[stubofs++] = 0xa9; // lda #$a0\n stub[stubofs++] = 0xa0;\n stub[stubofs++] = 0x8d; // sta $d5ff (disable cart)\n stub[stubofs++] = 0xff;\n stub[stubofs++] = 0xd5;\n stub[stubofs++] = 0x4c; // jmp runaddr\n stub[stubofs++] = runaddr & 0xff;\n stub[stubofs++] = runaddr >> 8;\n // set DOSVEC to 0xd500\n this.ram[0xa] = 0x00;\n this.ram[0xb] = 0xd5;\n this.run_address = 0xd500;\n }\n }\n\n initCartA() {\n if (this.cpu.getPC() == 0xf17f && this.xexdata) {\n this.loadXEX(this.xexdata);\n }\n }\n\n setPaddleInput(controller: number, value: number): void {\n this.irq_pokey.pot_inputs[controller] = 255 - value;\n }\n\n getDebugDisplayList() {\n let pc = this.antic.getDlistAddr();\n const nextInsn = () => {\n let b = this.read(pc);\n pc = ((pc + 1) & 0x3ff) | (pc & ~0x3ff);\n return b;\n }\n let dlist = {};\n let y = 0;\n for (let i=0; i<256 && y<240; i++) {\n let pc0 = pc;\n let op = nextInsn(); // get mode\n let mode = op & 0xf;\n let debugmsg = \"\"; // op=\" + hex(op);\n let jmp = false;\n let lines;\n if (mode == 0) {\n lines = (((op >> 4) & 7) + 1);\n debugmsg += \" blank=\" + lines;\n } else {\n lines = MODE_LINES[mode];\n debugmsg += \" mode=\" + hex(mode);\n debugmsg += \" lines=\" + lines;\n jmp = (op & ~0x40) == 0x01; // JMP insn?\n let lms = (op & 0x40) != 0 && (op & 0xf) != 0; // LMS insn?\n if (jmp && (op & 0x40)) { debugmsg += \" JVB\"; }\n else if (jmp) debugmsg += \" JMP\";\n else if (lms) debugmsg += \" LMS\";\n if (this.antic.isPlayfieldDMAEnabled() && (jmp || lms)) {\n let dlarg_lo = nextInsn();\n let dlarg_hi = nextInsn();\n debugmsg += \" $\" + hex(dlarg_hi) + \"\" + hex(dlarg_lo);\n }\n if (op & 0x10) { debugmsg += \" HSCROL\"; }\n if (op & 0x20) { debugmsg += \" VSCROL\"; }\n }\n dlist[\"$\"+hex(pc0) + \" y=\" + y] = debugmsg;\n if (jmp) break;\n y += lines;\n }\n return dlist;\n }\n\n}\n\nexport class Atari5200 extends Atari800 {\n newBus() {\n return {\n read: newAddressDecoder([\n [0x0000, 0x3fff, 0xffff, (a) => { return this.ram[a]; }],\n [0x4000, 0xbfff, 0xffff, (a) => { return this.rom ? this.rom[a - 0x4000] : 0; }],\n [0xc000, 0xcfff, 0x1f, (a) => { return this.gtia.readReg(a); }],\n [0xd400, 0xd4ff, 0xf, (a) => { return this.antic.readReg(a); }],\n [0xe800, 0xefff, 0xf, (a) => { return this.readPokey(a); }],\n [0xf800, 0xffff, 0x7ff, (a) => { return this.bios[a]; }],\n ]),\n write: newAddressDecoder([\n [0x0000, 0x3fff, 0xffff, (a, v) => { this.ram[a] = v; }],\n [0xc000, 0xcfff, 0x1f, (a, v) => { this.gtia.setReg(a, v); }],\n [0xd400, 0xd4ff, 0xf, (a, v) => { this.antic.setReg(a, v); }],\n [0xe800, 0xefff, 0xf, (a, v) => { this.writePokey(a, v); }],\n ]),\n };\n }\n}\n\n", "\nimport { Platform, getOpcodeMetadata_6502, getToolForFilename_6502, Base6502MachinePlatform } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\nimport { BaseMAME6502Platform } from \"../common/mameplatform\";\nimport { Atari5200, Atari800 } from \"../machine/atari8\";\n\ndeclare var jt; // for 6502\n\nvar Atari8_PRESETS = [\n {id:'hello.dasm', name:'Hello World (ASM)'},\n {id:'hellopm.dasm', name:'Hello Sprites (ASM)'},\n {id:'helloconio.c', name:'Text Mode (C)'},\n {id:'siegegame.c', name:'Siege Game (C)'},\n {id:'hellodlist.c', name:'Display List (C)'},\n];\n\nvar Atari800_PRESETS = Atari8_PRESETS.concat([\n {id:'testmusic.c', name:'POKEY Music (C)'},\n {id:'sieve.bas', name:'Benchmark (FastBasic)'},\n {id:'pmtest.bas', name:'Sprites Test (FastBasic)'},\n {id:'dli.bas', name:'DLI Test (FastBasic)'},\n {id:'joyas.bas', name:'Match-3 Game (FastBasic)'},\n]);\n\nconst Atari800_MemoryMap = { main:[\n {name:'RAM',start:0x0,size:0xc000,type:'ram'},\n {name:'Left Cartridge ROM',start:0xa000,size:0x2000,type:'rom'},\n {name:'GTIA',start:0xd000,size:0x20,type:'io'},\n {name:'POKEY',start:0xd200,size:0x10,type:'io'},\n {name:'PIA',start:0xd300,size:0x04,type:'io'},\n {name:'ANTIC',start:0xd400,size:0x10,type:'io'},\n {name:'Cartridge Control Line',start:0xd600,size:0x100,type:'io'},\n {name:'ROM',start:0xd800,size:0x800,type:'rom'},\n {name:'Character Set',start:0xe000,size:0x400,type:'rom'},\n {name:'ROM',start:0xe400,size:0x1c00,type:'rom'},\n] }\n\nfunction getToolForFilename_Atari8(fn:string) {\n if (fn.endsWith(\".bas\") || fn.endsWith(\".fb\") || fn.endsWith(\".fbi\")) return \"fastbasic\";\n else return getToolForFilename_6502(fn);\n}\n\nclass Atari800Platform extends Base6502MachinePlatform {\n newMachine() { return new Atari800(); }\n getPresets() { return Atari800_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n getToolForFilename = getToolForFilename_Atari8;\n readAddress(a) { return this.machine.readConst(a); }\n getMemoryMap() { return Atari800_MemoryMap; }\n showHelp = atari8_showHelp;\n getROMExtension = atari8_getROMExtension;\n \n async start() {\n let bios = await this.loadKernel();\n await super.start();\n this.machine.loadBIOS(bios);\n }\n biosPath = 'res/altirra/kernel.rom';\n async loadKernel() {\n var biosResponse = await fetch(this.biosPath);\n if (biosResponse.status == 200 || (biosResponse as any as Blob).size) {\n var biosBinary = await biosResponse.arrayBuffer();\n return new Uint8Array(biosBinary);\n } else throw new Error('could not load BIOS file');\n }\n getDebugTree() {\n let tree = super.getDebugTree();\n tree['display_list'] = this.machine.getDebugDisplayList();\n return tree;\n }\n}\n\nclass Atari5200Platform extends Atari800Platform {\n getPresets() { return Atari8_PRESETS; }\n newMachine() { return new Atari5200(); }\n biosPath = 'res/altirra/superkernel.rom';\n}\n\n\n/// MAME support\n\nabstract class Atari8MAMEPlatform extends BaseMAME6502Platform {\n getPresets() { return Atari8_PRESETS; }\n getToolForFilename = getToolForFilename_Atari8;\n getOpcodeMetadata = getOpcodeMetadata_6502;\n getDefaultExtension() { return \".asm\"; };\n showHelp = atari8_showHelp;\n}\n\nclass Atari800MAMEPlatform extends Atari8MAMEPlatform implements Platform {\n getPresets() { return Atari800_PRESETS; }\n loadROM(title, data) {\n if (!this.started) {\n this.startModule(this.mainElement, {\n jsfile:'mame8bitws.js',\n biosfile:'a800xl.zip',\n cfgfile:'a800xl.cfg',\n driver:'a800xl',\n width:336*2,\n height:225*2,\n romfn:'/emulator/cart.rom',\n romdata:new Uint8Array(data),\n romsize:0x2000,\n preInit:function(_self) {\n },\n });\n } else {\n this.loadROMFile(data);\n this.loadRegion(\":cartleft:cart:rom\", data);\n }\n }\n start() {\n }\n getMemoryMap = function() { return Atari800_MemoryMap };\n}\n\nclass Atari5200MAMEPlatform extends Atari8MAMEPlatform implements Platform {\n loadROM(title, data) {\n if (!this.started) {\n this.startModule(this.mainElement, {\n jsfile:'mame8bitws.js',\n biosfile:'a5200/5200.rom',\n cfgfile:'a5200.cfg',\n driver:'a5200',\n width:336*2,\n height:225*2,\n romfn:'/emulator/cart.rom',\n romdata:new Uint8Array(data),\n romsize:0x8000,\n preInit:function(_self) {\n },\n });\n } else {\n this.loadROMFile(data);\n this.loadRegion(\":cartleft:cart:rom\", data);\n }\n }\n start() {\n }\n getMemoryMap = function() { return { main:[\n {name:'RAM',start:0x0,size:0x4000,type:'ram'},\n {name:'Cartridge ROM',start:0x4000,size:0x8000,type:'rom'},\n {name:'GTIA',start:0xc000,size:0x20,type:'io'},\n {name:'ANTIC',start:0xd400,size:0x10,type:'io'},\n {name:'POKEY',start:0xe800,size:0x10,type:'io'},\n {name:'ATARI Character Set',start:0xf800,size:0x400,type:'rom'},\n {name:'ROM',start:0xfc00,size:0x400,type:'rom'},\n ] } };\n}\n\nfunction atari8_getROMExtension(rom: Uint8Array) {\n if (rom == null) return \".bin\";\n if (rom[0] == 0xff && rom[1] == 0xff) return \".xex\";\n else return \".rom\";\n}\n\nfunction atari8_showHelp() {\n return \"https://8bitworkshop.com/docs/platforms/atari8/\";\n}\n\n///\n\nPLATFORMS['atari8-800.xlmame'] = Atari800MAMEPlatform\nPLATFORMS['atari8-800xl.mame'] = Atari800MAMEPlatform // for dithertron\nPLATFORMS['atari8-5200.mame'] = Atari5200MAMEPlatform\nPLATFORMS['atari8-800'] = Atari800Platform\nPLATFORMS['atari8-5200'] = Atari5200Platform\n"], + "mappings": "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", + "names": [] +} diff --git a/gen/basic-PEJWFOJ6.js b/gen/basic-JTDXGKIP.js similarity index 99% rename from gen/basic-PEJWFOJ6.js rename to gen/basic-JTDXGKIP.js index efae4308..a608952d 100644 --- a/gen/basic-PEJWFOJ6.js +++ b/gen/basic-JTDXGKIP.js @@ -1,4 +1,4 @@ -import{b as v}from"./chunk-3XE5YOCV.js";import{a as d,o as S}from"./chunk-R63KYPGV.js";import"./chunk-SXEVG2WS.js";import"./chunk-5SHCNQ2O.js";import"./chunk-Z2IKIN54.js";import"./chunk-HB3LWF25.js";import{A as c,J as b,S as g,T as f,a as p}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.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-MMLUO3PV.js";import"./chunk-SXEVG2WS.js";import"./chunk-5SHCNQ2O.js";import"./chunk-OCFU6ZP7.js";import"./chunk-HB3LWF25.js";import{A as c,J as b,S as g,T as f,a as p}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.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-R63KYP `),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{(function(l){if(typeof Is=="object"&&typeof da!="undefined")da.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,i;return function a(u,d,m){function y(W,fe){if(!d[W]){if(!u[W]){var z=typeof si=="function"&&si;if(!fe&&z)return z(W,!0);if(b)return b(W,!0);var U=new Error("Cannot find module '"+W+"'");throw U.code="MODULE_NOT_FOUND",U}var q=d[W]={exports:{}};u[W][0].call(q.exports,function(de){var K=u[W][1][de];return y(K||de)},q,q.exports,a,u,d,m)}return d[W].exports}for(var b=typeof si=="function"&&si,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 He(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 tt(p,S){var v=be[p.name],C=v.deferredOperations.pop();if(C)return C.reject(S),C.promise}function Qe(p,S){return new z(function(v,C){if(be[p.name]=be[p.name]||ir(),p.db)if(S)He(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 j=_.result;try{j.createObjectStore(p.storeName),N.oldVersion<=1&&j.createObjectStore(xe)}catch(V){if(V.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 V}}),_.onerror=function(N){N.preventDefault(),C(_.error)},_.onsuccess=function(){var N=_.result;N.onversionchange=function(j){j.target.close()},v(N),Me(p)}})}function mt(p){return Qe(p,!1)}function rr(p){return Qe(p,!0)}function wr(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 Ir(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 Yt(p){var S=ae(atob(p.data));return fe([S],{type:p.type})}function Mr(p){return p&&p.__local_forage_encoded_blob}function vt(p){var S=this,v=S._initReady().then(function(){var C=be[S._dbInfo.name];if(C&&C.dbReady)return C.dbReady});return q(v,p,p),v}function An(p){He(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),rr(p)}).then(function(){return An(p).then(function(){Je(p,S,v,C-1)})}).catch(v);v(_)}}function ir(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function Pi(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=ir(),be[v.name]=k),k.forages.push(S),S._initReady||(S._initReady=S.ready,S.ready=vt);var _=[];function N(){return z.resolve()}for(var j=0;j>4,Y[k++]=(N&15)<<4|j>>2,Y[k++]=(j&3)<<6|V&63;return G}function Ke(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 Ze(p,S){var v="";if(p&&(v=Wr.call(p)),p&&(v==="[object ArrayBuffer]"||p.buffer&&Wr.call(p.buffer)==="[object ArrayBuffer]")){var C,k=Sr;p instanceof ArrayBuffer?(C=p,k+=Tr):(C=p.buffer,v==="[object Int8Array]"?k+=yt:v==="[object Uint8Array]"?k+=At:v==="[object Uint8ClampedArray]"?k+=Nt:v==="[object Int16Array]"?k+=Fi:v==="[object Uint16Array]"?k+=Or:v==="[object Int32Array]"?k+=sr:v==="[object Uint32Array]"?k+=$r:v==="[object Float32Array]"?k+=Di:v==="[object Float64Array]"?k+=Ot:S(new Error("Failed to get type for BinaryArray"))),S(k+Ke(C))}else if(v==="[object Blob]"){var _=new FileReader;_.onload=function(){var N=In+p.type+"~"+Ke(this.result);S(Sr+Mt+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 Br(p){if(p.substring(0,_r)!==Sr)return JSON.parse(p);var S=p.substring(Xt),v=p.substring(_r,Xt),C;if(v===Mt&&Ai.test(S)){var k=S.match(Ai);C=k[1],S=S.substring(k[0].length)}var _=jr(S);switch(v){case Tr:return _;case Mt:return fe([_],{type:C});case yt:return new Int8Array(_);case At:return new Uint8Array(_);case Nt:return new Uint8ClampedArray(_);case Fi:return new Int16Array(_);case Or:return new Uint16Array(_);case sr:return new Int32Array(_);case $r:return new Uint32Array(_);case Di:return new Float32Array(_);case Ot:return new Float64Array(_);default:throw new Error("Unkown type: "+v)}}var Hr={serialize:Ze,deserialize:Br,stringToBuffer:jr,bufferToString:Ke};function Ur(p,S,v,C){p.executeSql("CREATE TABLE IF NOT EXISTS "+S.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],v,C)}function Li(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(j){return N(j)}v.db.transaction(function(j){Ur(j,v,function(){S._dbInfo=v,_()},function(V,G){N(G)})},N)});return v.serializer=Hr,k}function rt(p,S,v,C,k,_){p.executeSql(v,C,k,function(N,j){j.code===j.SYNTAX_ERR?N.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[S.storeName],function(V,G){G.rows.length?_(V,j):Ur(V,S,function(){V.executeSql(v,C,k,_)},_)},_):_(N,j)},_)}function Qt(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(j){rt(j,N,"SELECT * FROM "+N.storeName+" WHERE key = ? LIMIT 1",[p],function(V,G){var Y=G.rows.length?G.rows.item(0).value:null;Y&&(Y=N.serializer.deserialize(Y)),k(Y)},function(V,G){_(G)})})}).catch(_)});return U(C,S),C}function Mn(p,S){var v=this,C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(j){rt(j,N,"SELECT * FROM "+N.storeName,[],function(V,G){for(var Y=G.rows,Z=Y.length,ye=0;ye0){N(Ri.apply(k,[p,V,v,C-1]));return}j(ye)}})})}).catch(j)});return U(_,v),_}function zr(p,S,v){return Ri.apply(this,[p,S,v,1])}function Cr(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(j){rt(j,N,"DELETE FROM "+N.storeName+" WHERE key = ?",[p],function(){k()},function(V,G){_(G)})})}).catch(_)});return U(C,S),C}function Nn(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){rt(N,_,"DELETE FROM "+_.storeName,[],function(){C()},function(j,V){k(V)})})}).catch(k)});return U(v,p),v}function On(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){rt(N,_,"SELECT COUNT(key) as c FROM "+_.storeName,[],function(j,V){var G=V.rows.item(0).c;C(G)},function(j,V){k(V)})})}).catch(k)});return U(v,p),v}function $n(p,S){var v=this,C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(j){rt(j,N,"SELECT key FROM "+N.storeName+" WHERE id = ? LIMIT 1",[p+1],function(V,G){var Y=G.rows.length?G.rows.item(0).key:null;k(Y)},function(V,G){_(G)})})}).catch(_)});return U(C,S),C}function Ii(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){rt(N,_,"SELECT key FROM "+_.storeName,[],function(j,V){for(var G=[],Y=0;Y '__WebKitDatabaseInfoTable__'",[],function(k,_){for(var N=[],j=0;j<_.rows.length;j++)N.push(_.rows.item(j).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]}):_(Wn(N))}).then(function(_){return new z(function(N,j){_.db.transaction(function(V){function G(ke){return new z(function(Pe,We){V.executeSql("DROP TABLE IF EXISTS "+ke,[],function(){Pe()},function(Le,it){We(it)})})}for(var Y=[],Z=0,ye=_.storeNames.length;Z0}function Vr(p){var S=this,v={};if(p)for(var C in p)v[C]=p[C];return v.keyPrefix=$t(p,S._defaultConfig),qr()?(S._dbInfo=v,v.serializer=Hr,z.resolve()):z.reject()}function kr(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 U(v,p),v}function Oi(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 U(C,S),C}function Hn(p,S){var v=this,C=v.ready().then(function(){for(var k=v._dbInfo,_=k.keyPrefix,N=_.length,j=localStorage.length,V=1,G=0;G=0;N--){var j=localStorage.key(N);j.indexOf(_)===0&&localStorage.removeItem(j)}}):k=z.reject("Invalid arguments"),U(k,S),k}var Hi={_driver:"localStorageWrapper",_initStorage:Vr,_support:Bn(),iterate:Hn,getItem:Oi,setItem:ji,removeItem:Wi,clear:kr,length:or,key:$i,keys:Un,dropInstance:Bi},zn=function(S,v){return S===v||typeof S=="number"&&typeof v=="number"&&isNaN(S)&&isNaN(v)},Gr=function(S,v){for(var C=S.length,k=0;k{(function(l,t){"use strict";typeof ln=="object"&&typeof ln.exports=="object"?ln.exports=l.document?t(l,!0):function(i){if(!i.document)throw new Error("jQuery requires a window with a document");return t(i)}:t(l)})(typeof window!="undefined"?window:$s,function(l,t){"use strict";var i=[],a=Object.getPrototypeOf,u=i.slice,d=i.flat?function(e){return i.flat.call(e)}:function(e){return i.concat.apply([],e)},m=i.push,y=i.indexOf,b={},L=b.toString,W=b.hasOwnProperty,fe=W.toString,z=fe.call(Object),U={},q=function(r){return typeof r=="function"&&typeof r.nodeType!="number"&&typeof r.item!="function"},de=function(r){return r!=null&&r===r.window},K=l.document,xe={type:!0,src:!0,nonce:!0,noModule:!0};function Ce(e,r,n){n=n||K;var s,c,f=n.createElement("script");if(f.text=e,r)for(s in xe)c=r[s]||r.getAttribute&&r.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"?b[L.call(e)]||"object":typeof e}var Se="3.6.3",o=function(e,r){return new o.fn.init(e,r)};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 r=o.merge(this.constructor(),e);return r.prevObject=this,r},each:function(e){return o.each(this,e)},map:function(e){return this.pushStack(o.map(this,function(r,n){return e.call(r,n,r)}))},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,r){return(r+1)%2}))},odd:function(){return this.pushStack(o.grep(this,function(e,r){return r%2}))},eq:function(e){var r=this.length,n=+e+(e<0?r:0);return this.pushStack(n>=0&&n0&&r-1 in e}var ae=function(e){var r,n,s,c,f,h,E,x,F,R,B,D,I,ne,ve,re,ze,Ue,ct,Fe="sizzle"+1*new Date,me=e.document,st=0,Te=0,je=Xi(),ri=Xi(),Vi=Xi(),ft=Xi(),cr=function(g,w){return g===w&&(B=!0),0},fr={}.hasOwnProperty,ot=[],Kt=ot.pop,xt=ot.push,Zt=ot.push,ds=ot.slice,dr=function(g,w){for(var T=0,M=g.length;T+~]|"+Ae+")"+Ae+"*"),Ho=new RegExp(Ae+"|>"),Uo=new RegExp(Kn),zo=new RegExp("^"+hr+"$"),Yi={ID:new RegExp("^#("+hr+")"),CLASS:new RegExp("^\\.("+hr+")"),TAG:new RegExp("^("+hr+"|[*])"),ATTR:new RegExp("^"+hs),PSEUDO:new RegExp("^"+Kn),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("^(?:"+Jn+")$","i"),needsContext:new RegExp("^"+Ae+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+Ae+"*((?:-\\d)?\\d*)"+Ae+"*\\)|)(?=[^-]|$)","i")},qo=/HTML$/i,Vo=/^(?:input|select|textarea|button)$/i,Go=/^h\d$/i,ii=/^[^{]+\{\s*\[native \w/,Yo=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Zn=/[+~]/,Bt=new RegExp("\\\\[\\da-fA-F]{1,6}"+Ae+"?|\\\\([^\\r\\n\\f])","g"),Ht=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))},gs=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ms=function(g,w){return w?g==="\0"?"\uFFFD":g.slice(0,-1)+"\\"+g.charCodeAt(g.length-1).toString(16)+" ":"\\"+g},vs=function(){D()},Xo=Ji(function(g){return g.disabled===!0&&g.nodeName.toLowerCase()==="fieldset"},{dir:"parentNode",next:"legend"});try{Zt.apply(ot=ds.call(me.childNodes),me.childNodes),ot[me.childNodes.length].nodeType}catch(g){Zt={apply:ot.length?function(w,T){xt.apply(w,ds.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,H,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&&(D(w),w=w||I,ve)){if(we!==11&&(J=Yo.exec(g)))if(P=J[1]){if(we===9)if(H=w.getElementById(P)){if(H.id===P)return T.push(H),T}else return T;else if(he&&(H=he.getElementById(P))&&ct(w,H)&&H.id===P)return T.push(H),T}else{if(J[2])return Zt.apply(T,w.getElementsByTagName(g)),T;if((P=J[3])&&n.getElementsByClassName&&w.getElementsByClassName)return Zt.apply(T,w.getElementsByClassName(P)),T}if(n.qsa&&!ft[g+" "]&&(!re||!re.test(g))&&(we!==1||w.nodeName.toLowerCase()!=="object")){if(se=g,he=w,we===1&&(Ho.test(g)||ps.test(g))){for(he=Zn.test(g)&&ta(w.parentNode)||w,(he!==w||!n.scope)&&((Q=w.getAttribute("id"))?Q=Q.replace(gs,ms):w.setAttribute("id",Q=Fe)),ue=h(g),O=ue.length;O--;)ue[O]=(Q?"#"+Q:":scope")+" "+Qi(ue[O]);se=ue.join(",")}try{if(n.cssSupportsSelector&&!CSS.supports("selector(:is("+se+"))"))throw new Error;return Zt.apply(T,he.querySelectorAll(se)),T}catch(Ie){ft(g,!0)}finally{Q===Fe&&w.removeAttribute("id")}}}return x(g.replace(Gi,"$1"),w,T,M)}function Xi(){var g=[];function w(T,M){return g.push(T+" ")>s.cacheLength&&delete w[g.shift()],w[T+" "]=M}return w}function Tt(g){return g[Fe]=!0,g}function wt(g){var w=I.createElement("fieldset");try{return!!g(w)}catch(T){return!1}finally{w.parentNode&&w.parentNode.removeChild(w),w=null}}function ea(g,w){for(var T=g.split("|"),M=T.length;M--;)s.attrHandle[T[M]]=w}function bs(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 Qo(g){return function(w){var T=w.nodeName.toLowerCase();return T==="input"&&w.type===g}}function Jo(g){return function(w){var T=w.nodeName.toLowerCase();return(T==="input"||T==="button")&&w.type===g}}function ys(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&&Xo(w)===g:w.disabled===g:"label"in w?w.disabled===g:!1}}function pr(g){return Tt(function(w){return w=+w,Tt(function(T,M){for(var P,O=g([],T.length,w),H=O.length;H--;)T[P=O[H]]&&(T[P]=!(M[P]=T[P]))})})}function ta(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!qo.test(w||T&&T.nodeName||"HTML")},D=Re.setDocument=function(g){var w,T,M=g?g.ownerDocument||g:me;return M==I||M.nodeType!==9||!M.documentElement||(I=M,ne=I.documentElement,ve=!f(I),me!=I&&(T=I.defaultView)&&T.top!==T&&(T.addEventListener?T.addEventListener("unload",vs,!1):T.attachEvent&&T.attachEvent("onunload",vs)),n.scope=wt(function(P){return ne.appendChild(P).appendChild(I.createElement("div")),typeof P.querySelectorAll!="undefined"&&!P.querySelectorAll(":scope fieldset div").length}),n.cssSupportsSelector=wt(function(){return CSS.supports("selector(*)")&&I.querySelectorAll(":is(:jqfake)")&&!CSS.supports("selector(:is(*,:jqfake))")}),n.attributes=wt(function(P){return P.className="i",!P.getAttribute("className")}),n.getElementsByTagName=wt(function(P){return P.appendChild(I.createComment("")),!P.getElementsByTagName("*").length}),n.getElementsByClassName=ii.test(I.getElementsByClassName),n.getById=wt(function(P){return ne.appendChild(P).id=Fe,!I.getElementsByName||!I.getElementsByName(Fe).length}),n.getById?(s.filter.ID=function(P){var O=P.replace(Bt,Ht);return function(H){return H.getAttribute("id")===O}},s.find.ID=function(P,O){if(typeof O.getElementById!="undefined"&&ve){var H=O.getElementById(P);return H?[H]:[]}}):(s.filter.ID=function(P){var O=P.replace(Bt,Ht);return function(H){var Q=typeof H.getAttributeNode!="undefined"&&H.getAttributeNode("id");return Q&&Q.value===O}},s.find.ID=function(P,O){if(typeof O.getElementById!="undefined"&&ve){var H,Q,J,ue=O.getElementById(P);if(ue){if(H=ue.getAttributeNode("id"),H&&H.value===P)return[ue];for(J=O.getElementsByName(P),Q=0;ue=J[Q++];)if(H=ue.getAttributeNode("id"),H&&H.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 H,Q=[],J=0,ue=O.getElementsByTagName(P);if(P==="*"){for(;H=ue[J++];)H.nodeType===1&&Q.push(H);return Q}return ue},s.find.CLASS=n.getElementsByClassName&&function(P,O){if(typeof O.getElementsByClassName!="undefined"&&ve)return O.getElementsByClassName(P)},ze=[],re=[],(n.qsa=ii.test(I.querySelectorAll))&&(wt(function(P){var O;ne.appendChild(P).innerHTML="",P.querySelectorAll("[msallowcapture^='']").length&&re.push("[*^$]="+Ae+`*(?:''|"")`),P.querySelectorAll("[selected]").length||re.push("\\["+Ae+"*(?:value|"+Jn+")"),P.querySelectorAll("[id~="+Fe+"-]").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#"+Fe+"+*").length||re.push(".#.+[+~]"),P.querySelectorAll("\\\f"),re.push("[\\r\\n\\f]")}),wt(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"),ne.appendChild(P).disabled=!0,P.querySelectorAll(":disabled").length!==2&&re.push(":enabled",":disabled"),P.querySelectorAll("*,:x"),re.push(",.*:")})),(n.matchesSelector=ii.test(Ue=ne.matches||ne.webkitMatchesSelector||ne.mozMatchesSelector||ne.oMatchesSelector||ne.msMatchesSelector))&&wt(function(P){n.disconnectedMatch=Ue.call(P,"*"),Ue.call(P,"[s!='']:x"),ze.push("!=",Kn)}),n.cssSupportsSelector||re.push(":has"),re=re.length&&new RegExp(re.join("|")),ze=ze.length&&new RegExp(ze.join("|")),w=ii.test(ne.compareDocumentPosition),ct=w||ii.test(ne.contains)?function(P,O){var H=P.nodeType===9&&P.documentElement||P,Q=O&&O.parentNode;return P===Q||!!(Q&&Q.nodeType===1&&(H.contains?H.contains(Q):P.compareDocumentPosition&&P.compareDocumentPosition(Q)&16))}:function(P,O){if(O){for(;O=O.parentNode;)if(O===P)return!0}return!1},cr=w?function(P,O){if(P===O)return B=!0,0;var H=!P.compareDocumentPosition-!O.compareDocumentPosition;return H||(H=(P.ownerDocument||P)==(O.ownerDocument||O)?P.compareDocumentPosition(O):1,H&1||!n.sortDetached&&O.compareDocumentPosition(P)===H?P==I||P.ownerDocument==me&&ct(me,P)?-1:O==I||O.ownerDocument==me&&ct(me,O)?1:R?dr(R,P)-dr(R,O):0:H&4?-1:1)}:function(P,O){if(P===O)return B=!0,0;var H,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?dr(R,P)-dr(R,O):0;if(J===ue)return bs(P,O);for(H=P;H=H.parentNode;)se.unshift(H);for(H=O;H=H.parentNode;)he.unshift(H);for(;se[Q]===he[Q];)Q++;return Q?bs(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(D(g),n.matchesSelector&&ve&&!ft[w+" "]&&(!ze||!ze.test(w))&&(!re||!re.test(w)))try{var T=Ue.call(g,w);if(T||n.disconnectedMatch||g.document&&g.document.nodeType!==11)return T}catch(M){ft(w,!0)}return Re(w,I,null,[g]).length>0},Re.contains=function(g,w){return(g.ownerDocument||g)!=I&&D(g),ct(g,w)},Re.attr=function(g,w){(g.ownerDocument||g)!=I&&D(g);var T=s.attrHandle[w.toLowerCase()],M=T&&fr.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(gs,ms)},Re.error=function(g){throw new Error("Syntax error, unrecognized expression: "+g)},Re.uniqueSort=function(g){var w,T=[],M=0,P=0;if(B=!n.detectDuplicates,R=!n.sortStable&&g.slice(0),g.sort(cr),B){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:Tt,match:Yi,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(Bt,Ht),g[3]=(g[3]||g[4]||g[5]||"").replace(Bt,Ht),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 Yi.CHILD.test(g[0])?null:(g[3]?g[2]=g[4]||g[5]||"":T&&Uo.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(Bt,Ht).toLowerCase();return g==="*"?function(){return!0}:function(T){return T.nodeName&&T.nodeName.toLowerCase()===w}},CLASS:function(g){var w=je[g+" "];return w||(w=new RegExp("(^|"+Ae+")"+g+"("+Ae+"|$)"))&&je(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(jo," ")+" ").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",H=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,qe,et,dt=O!==H?"nextSibling":"previousSibling",Ne=J.parentNode,ni=Q&&J.nodeName.toLowerCase(),ai=!se&&!Q,ht=!1;if(Ne){if(O){for(;dt;){for(ce=J;ce=ce[dt];)if(Q?ce.nodeName.toLowerCase()===ni:ce.nodeType===1)return!1;et=dt=g==="only"&&!et&&"nextSibling"}return!0}if(et=[H?Ne.firstChild:Ne.lastChild],H&&ai){for(ce=Ne,Ie=ce[Fe]||(ce[Fe]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),he=we[g]||[],qe=he[0]===st&&he[1],ht=qe&&he[2],ce=qe&&Ne.childNodes[qe];ce=++qe&&ce&&ce[dt]||(ht=qe=0)||et.pop();)if(ce.nodeType===1&&++ht&&ce===J){we[g]=[st,qe,ht];break}}else if(ai&&(ce=J,Ie=ce[Fe]||(ce[Fe]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),he=we[g]||[],qe=he[0]===st&&he[1],ht=qe),ht===!1)for(;(ce=++qe&&ce&&ce[dt]||(ht=qe=0)||et.pop())&&!((Q?ce.nodeName.toLowerCase()===ni:ce.nodeType===1)&&++ht&&(ai&&(Ie=ce[Fe]||(ce[Fe]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),we[g]=[st,ht]),ce===J)););return ht-=P,ht===M||ht%M==0&&ht/M>=0}}},PSEUDO:function(g,w){var T,M=s.pseudos[g]||s.setFilters[g.toLowerCase()]||Re.error("unsupported pseudo: "+g);return M[Fe]?M(w):M.length>1?(T=[g,g,"",w],s.setFilters.hasOwnProperty(g.toLowerCase())?Tt(function(P,O){for(var H,Q=M(P,w),J=Q.length;J--;)H=dr(P,Q[J]),P[H]=!(O[H]=Q[J])}):function(P){return M(P,0,T)}):M}},pseudos:{not:Tt(function(g){var w=[],T=[],M=E(g.replace(Gi,"$1"));return M[Fe]?Tt(function(P,O,H,Q){for(var J,ue=M(P,null,Q,[]),se=P.length;se--;)(J=ue[se])&&(P[se]=!(O[se]=J))}):function(P,O,H){return w[0]=P,M(w,null,H,T),w[0]=null,!T.pop()}}),has:Tt(function(g){return function(w){return Re(g,w).length>0}}),contains:Tt(function(g){return g=g.replace(Bt,Ht),function(w){return(w.textContent||c(w)).indexOf(g)>-1}}),lang:Tt(function(g){return zo.test(g||"")||Re.error("unsupported lang: "+g),g=g.replace(Bt,Ht).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===ne},focus:function(g){return g===I.activeElement&&(!I.hasFocus||I.hasFocus())&&!!(g.type||g.href||~g.tabIndex)},enabled:ys(!1),disabled:ys(!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 Go.test(g.nodeName)},input:function(g){return Vo.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:pr(function(){return[0]}),last:pr(function(g,w){return[w-1]}),eq:pr(function(g,w,T){return[T<0?T+w:T]}),even:pr(function(g,w){for(var T=0;Tw?w:T;--M>=0;)g.push(M);return g}),gt:pr(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 Ko(g,w,T){for(var M=0,P=w.length;M-1&&(H[se]=!(Q[se]=we))}}else Ne=Ki(Ne===Q?Ne.splice(qe,Ne.length):Ne),P?P(null,Q,Ne,ue):Zt.apply(Q,Ne)})}function na(g){for(var w,T,M,P=g.length,O=s.relative[g[0].type],H=O||s.relative[" "],Q=O?1:0,J=Ji(function(he){return he===w},H,!0),ue=Ji(function(he){return dr(w,he)>-1},H,!0),se=[function(he,we,Ie){var ce=!O&&(Ie||we!==F)||((w=we).nodeType?J(he,we,Ie):ue(he,we,Ie));return w=null,ce}];Q1&&ra(se),Q>1&&Qi(g.slice(0,Q-1).concat({value:g[Q-2].type===" "?"*":""})).replace(Gi,"$1"),T,Q0,M=g.length>0,P=function(O,H,Q,J,ue){var se,he,we,Ie=0,ce="0",qe=O&&[],et=[],dt=F,Ne=O||M&&s.find.TAG("*",ue),ni=st+=dt==null?1:Math.random()||.1,ai=Ne.length;for(ue&&(F=H==I||H||ue);ce!==ai&&(se=Ne[ce])!=null;ce++){if(M&&se){for(he=0,!H&&se.ownerDocument!=I&&(D(se),Q=!ve);we=g[he++];)if(we(se,H||I,Q)){J.push(se);break}ue&&(st=ni)}T&&((se=!we&&se)&&Ie--,O&&qe.push(se))}if(Ie+=ce,T&&ce!==Ie){for(he=0;we=w[he++];)we(qe,et,H,Q);if(O){if(Ie>0)for(;ce--;)qe[ce]||et[ce]||(et[ce]=Kt.call(J));et=Ki(et)}Zt.apply(J,et),ue&&!O&&et.length>0&&Ie+w.length>1&&Re.uniqueSort(J)}return ue&&(st=ni,F=dt),qe};return T?Tt(P):P}return E=Re.compile=function(g,w){var T,M=[],P=[],O=Vi[g+" "];if(!O){for(w||(w=h(g)),T=w.length;T--;)O=na(w[T]),O[Fe]?M.push(O):P.push(O);O=Vi(g,Zo(P,M)),O.selector=g}return O},x=Re.select=function(g,w,T,M){var P,O,H,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&&(H=O[0]).type==="ID"&&w.nodeType===9&&ve&&s.relative[O[1].type]){if(w=(s.find.ID(H.matches[0].replace(Bt,Ht),w)||[])[0],w)ue&&(w=w.parentNode);else return T;g=g.slice(O.shift().value.length)}for(P=Yi.needsContext.test(g)?0:O.length;P--&&(H=O[P],!s.relative[Q=H.type]);)if((J=s.find[Q])&&(M=J(H.matches[0].replace(Bt,Ht),Zn.test(O[0].type)&&ta(w.parentNode)||w))){if(O.splice(P,1),g=M.length&&Qi(O),!g)return Zt.apply(T,M),T;break}}return(ue||E(g,se))(M,w,!ve,T,!w||Zn.test(g)&&ta(w.parentNode)||w),T},n.sortStable=Fe.split("").sort(cr).join("")===Fe,n.detectDuplicates=!!B,D(),n.sortDetached=wt(function(g){return g.compareDocumentPosition(I.createElement("fieldset"))&1}),wt(function(g){return g.innerHTML="",g.firstChild.getAttribute("href")==="#"})||ea("type|href|height|width",function(g,w,T){if(!T)return g.getAttribute(w,w.toLowerCase()==="type"?1:2)}),(!n.attributes||!wt(function(g){return g.innerHTML="",g.firstChild.setAttribute("value",""),g.firstChild.getAttribute("value")===""}))&&ea("value",function(g,w,T){if(!T&&g.nodeName.toLowerCase()==="input")return g.defaultValue}),wt(function(g){return g.getAttribute("disabled")==null})||ea(Jn,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,r,n){for(var s=[],c=n!==void 0;(e=e[r])&&e.nodeType!==9;)if(e.nodeType===1){if(c&&o(e).is(n))break;s.push(e)}return s},_e=function(e,r){for(var n=[];e;e=e.nextSibling)e.nodeType===1&&e!==r&&n.push(e);return n},He=o.expr.match.needsContext;function Me(e,r){return e.nodeName&&e.nodeName.toLowerCase()===r.toLowerCase()}var tt=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Qe(e,r,n){return q(r)?o.grep(e,function(s,c){return!!r.call(s,c,s)!==n}):r.nodeType?o.grep(e,function(s){return s===r!==n}):typeof r!="string"?o.grep(e,function(s){return y.call(r,s)>-1!==n}):o.filter(r,e,n)}o.filter=function(e,r,n){var s=r[0];return n&&(e=":not("+e+")"),r.length===1&&s.nodeType===1?o.find.matchesSelector(s,e)?[s]:[]:o.find.matches(e,o.grep(r,function(c){return c.nodeType===1}))},o.fn.extend({find:function(e){var r,n,s=this.length,c=this;if(typeof e!="string")return this.pushStack(o(e).filter(function(){for(r=0;r1?o.uniqueSort(n):n},filter:function(e){return this.pushStack(Qe(this,e||[],!1))},not:function(e){return this.pushStack(Qe(this,e||[],!0))},is:function(e){return!!Qe(this,typeof e=="string"&&He.test(e)?o(e):e||[],!1).length}});var mt,rr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,wr=o.fn.init=function(e,r,n){var s,c;if(!e)return this;if(n=n||mt,typeof e=="string")if(e[0]==="<"&&e[e.length-1]===">"&&e.length>=3?s=[null,e,null]:s=rr.exec(e),s&&(s[1]||!r))if(s[1]){if(r=r instanceof o?r[0]:r,o.merge(this,o.parseHTML(s[1],r&&r.nodeType?r.ownerDocument||r:K,!0)),tt.test(s[1])&&o.isPlainObject(r))for(s in r)q(this[s])?this[s](r[s]):this.attr(s,r[s]);return this}else return c=K.getElementById(s[2]),c&&(this[0]=c,this.length=1),this;else return!r||r.jquery?(r||n).find(e):this.constructor(r).find(e);else{if(e.nodeType)return this[0]=e,this.length=1,this;if(q(e))return n.ready!==void 0?n.ready(e):e(o)}return o.makeArray(e,this)};wr.prototype=o.fn,mt=o(K);var Ir=/^(?:parents|prev(?:Until|All))/,Yt={children:!0,contents:!0,next:!0,prev:!0};o.fn.extend({has:function(e){var r=o(e,this),n=r.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"?y.call(o(e),this[0]):y.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,r){return this.pushStack(o.uniqueSort(o.merge(this.get(),o(e,r))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function Mr(e,r){for(;(e=e[r])&&e.nodeType!==1;);return e}o.each({parent:function(e){var r=e.parentNode;return r&&r.nodeType!==11?r:null},parents:function(e){return oe(e,"parentNode")},parentsUntil:function(e,r,n){return oe(e,"parentNode",n)},next:function(e){return Mr(e,"nextSibling")},prev:function(e){return Mr(e,"previousSibling")},nextAll:function(e){return oe(e,"nextSibling")},prevAll:function(e){return oe(e,"previousSibling")},nextUntil:function(e,r,n){return oe(e,"nextSibling",n)},prevUntil:function(e,r,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,r){o.fn[e]=function(n,s){var c=o.map(this,r,n);return e.slice(-5)!=="Until"&&(s=n),s&&typeof s=="string"&&(c=o.filter(s,c)),this.length>1&&(Yt[e]||o.uniqueSort(c),Ir.test(e)&&c.reverse()),this.pushStack(c)}});var vt=/[^\x20\t\r\n\f]+/g;function An(e){var r={};return o.each(e.match(vt)||[],function(n,s){r[s]=!0}),r}o.Callbacks=function(e){e=typeof e=="string"?An(e):o.extend({},e);var r,n,s,c,f=[],h=[],E=-1,x=function(){for(c=c||e.once,s=r=!0;h.length;E=-1)for(n=h.shift();++E-1;)f.splice(D,1),D<=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&&!r&&(f=n=""),this},locked:function(){return!!c},fireWith:function(R,B){return c||(B=B||[],B=[R,B.slice?B.slice():B],h.push(B),r||x()),this},fire:function(){return F.fireWith(this,arguments),this},fired:function(){return!!s}};return F};function Je(e){return e}function ir(e){throw e}function Pi(e,r,n,s){var c;try{e&&q(c=e.promise)?c.call(e).done(r).fail(n):e&&q(c=e.then)?c.call(e,r,n):r.apply(void 0,[e].slice(s))}catch(f){n.apply(void 0,[f])}}o.extend({Deferred:function(e){var r=[["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(r,function(E,x){var F=q(f[x[4]])&&f[x[4]];c[x[1]](function(){var R=F&&F.apply(this,arguments);R&&q(R.promise)?R.promise().progress(h.notify).done(h.resolve).fail(h.reject):h[x[0]+"With"](this,F?[R]:arguments)})}),f=null}).promise()},then:function(f,h,E){var x=0;function F(R,B,D,I){return function(){var ne=this,ve=arguments,re=function(){var Ue,ct;if(!(R=x&&(D!==ir&&(ne=void 0,ve=[Ue]),B.rejectWith(ne,ve))}};R?ze():(o.Deferred.getStackHook&&(ze.stackTrace=o.Deferred.getStackHook()),l.setTimeout(ze))}}return o.Deferred(function(R){r[0][3].add(F(0,R,q(E)?E:Je,R.notifyWith)),r[1][3].add(F(0,R,q(f)?f:Je)),r[2][3].add(F(0,R,q(h)?h:ir))}).promise()},promise:function(f){return f!=null?o.extend(f,s):s}},c={};return o.each(r,function(f,h){var E=h[2],x=h[5];s[h[1]]=E.add,x&&E.add(function(){n=x},r[3-f][2].disable,r[3-f][3].disable,r[0][2].lock,r[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 r=arguments.length,n=r,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,--r||f.resolveWith(s,c)}};if(r<=1&&(Pi(e,f.done(h(n)).resolve,f.reject,!r),f.state()==="pending"||q(c[n]&&c[n].then)))return f.then();for(;n--;)Pi(c[n],h(n),f.reject);return f.promise()}});var Fn=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;o.Deferred.exceptionHook=function(e,r){l.console&&l.console.warn&&e&&Fn.test(e.name)&&l.console.warn("jQuery.Deferred exception: "+e.message,e.stack,r)},o.readyException=function(e){l.setTimeout(function(){throw e})};var Nr=o.Deferred();o.fn.ready=function(e){return Nr.then(e).catch(function(r){o.readyException(r)}),this},o.extend({isReady:!1,readyWait:1,ready:function(e){(e===!0?--o.readyWait:o.isReady)||(o.isReady=!0,!(e!==!0&&--o.readyWait>0)&&Nr.resolveWith(K,[o]))}}),o.ready.then=Nr.then;function Er(){K.removeEventListener("DOMContentLoaded",Er),l.removeEventListener("load",Er),o.ready()}K.readyState==="complete"||K.readyState!=="loading"&&!K.documentElement.doScroll?l.setTimeout(o.ready):(K.addEventListener("DOMContentLoaded",Er),l.addEventListener("load",Er));var _t=function(e,r,n,s,c,f,h){var E=0,x=e.length,F=n==null;if(be(n)==="object"){c=!0;for(E in n)_t(e,r,E,n[E],!0,f,h)}else if(s!==void 0&&(c=!0,q(s)||(h=!0),F&&(h?(r.call(e,s),r=null):(F=r,r=function(R,B,D){return F.call(o(R),D)})),r))for(;E1,null,!0)},removeData:function(e){return this.each(function(){$e.remove(this,e)})}}),o.extend({queue:function(e,r,n){var s;if(e)return r=(r||"fx")+"queue",s=le.get(e,r),n&&(!s||Array.isArray(n)?s=le.access(e,r,o.makeArray(n)):s.push(n)),s||[]},dequeue:function(e,r){r=r||"fx";var n=o.queue(e,r),s=n.length,c=n.shift(),f=o._queueHooks(e,r),h=function(){o.dequeue(e,r)};c==="inprogress"&&(c=n.shift(),s--),c&&(r==="fx"&&n.unshift("inprogress"),delete f.stop,c.call(e,h,f)),!s&&f&&f.empty.fire()},_queueHooks:function(e,r){var n=r+"queueHooks";return le.get(e,n)||le.access(e,n,{empty:o.Callbacks("once memory").add(function(){le.remove(e,[r+"queue",n])})})}}),o.fn.extend({queue:function(e,r){var n=2;return typeof e!="string"&&(r=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,jr=/^$|^module$|\/(?:java|ecma)script/i;(function(){var e=K.createDocumentFragment(),r=e.appendChild(K.createElement("div")),n=K.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),r.appendChild(n),U.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,r.innerHTML="",U.noCloneChecked=!!r.cloneNode(!0).lastChild.defaultValue,r.innerHTML="",U.option=!!r.lastChild})();var Ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ke.tbody=Ke.tfoot=Ke.colgroup=Ke.caption=Ke.thead,Ke.th=Ke.td,U.option||(Ke.optgroup=Ke.option=[1,""]);function Ze(e,r){var n;return typeof e.getElementsByTagName!="undefined"?n=e.getElementsByTagName(r||"*"):typeof e.querySelectorAll!="undefined"?n=e.querySelectorAll(r||"*"):n=[],r===void 0||r&&Me(e,r)?o.merge([e],n):n}function Br(e,r){for(var n=0,s=e.length;n-1){c&&c.push(f);continue}if(F=Nt(f),h=Ze(B.appendChild(f),"script"),F&&Br(h),n)for(R=0;f=h[R++];)jr.test(f.type||"")&&n.push(f)}return B}var Li=/^([^.]*)(?:\.(.+)|)/;function rt(){return!0}function Qt(){return!1}function Mn(e,r){return e===Ri()==(r==="focus")}function Ri(){try{return K.activeElement}catch(e){}}function zr(e,r,n,s,c,f){var h,E;if(typeof r=="object"){typeof n!="string"&&(s=s||n,n=void 0);for(E in r)zr(e,E,n,s,r[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=Qt;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,r,c,s,n)})}o.event={global:{},add:function(e,r,n,s,c){var f,h,E,x,F,R,B,D,I,ne,ve,re=le.get(e);if(!!nr(e))for(n.handler&&(f=n,n=f.handler,c=f.selector),c&&o.find.matchesSelector(At,c),n.guid||(n.guid=o.guid++),(x=re.events)||(x=re.events=Object.create(null)),(h=re.handle)||(h=re.handle=function(ze){return typeof o!="undefined"&&o.event.triggered!==ze.type?o.event.dispatch.apply(e,arguments):void 0}),r=(r||"").match(vt)||[""],F=r.length;F--;)E=Li.exec(r[F])||[],I=ve=E[1],ne=(E[2]||"").split(".").sort(),!!I&&(B=o.event.special[I]||{},I=(c?B.delegateType:B.bindType)||I,B=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:ne.join(".")},f),(D=x[I])||(D=x[I]=[],D.delegateCount=0,(!B.setup||B.setup.call(e,s,ne,h)===!1)&&e.addEventListener&&e.addEventListener(I,h)),B.add&&(B.add.call(e,R),R.handler.guid||(R.handler.guid=n.guid)),c?D.splice(D.delegateCount++,0,R):D.push(R),o.event.global[I]=!0)},remove:function(e,r,n,s,c){var f,h,E,x,F,R,B,D,I,ne,ve,re=le.hasData(e)&&le.get(e);if(!(!re||!(x=re.events))){for(r=(r||"").match(vt)||[""],F=r.length;F--;){if(E=Li.exec(r[F])||[],I=ve=E[1],ne=(E[2]||"").split(".").sort(),!I){for(I in x)o.event.remove(e,I+r[F],n,s,!0);continue}for(B=o.event.special[I]||{},I=(s?B.delegateType:B.bindType)||I,D=x[I]||[],E=E[2]&&new RegExp("(^|\\.)"+ne.join("\\.(?:.*\\.|)")+"(\\.|$)"),h=f=D.length;f--;)R=D[f],(c||ve===R.origType)&&(!n||n.guid===R.guid)&&(!E||E.test(R.namespace))&&(!s||s===R.selector||s==="**"&&R.selector)&&(D.splice(f,1),R.selector&&D.delegateCount--,B.remove&&B.remove.call(e,R));h&&!D.length&&((!B.teardown||B.teardown.call(e,ne,re.handle)===!1)&&o.removeEvent(e,I,re.handle),delete x[I])}o.isEmptyObject(x)&&le.remove(e,"handle events")}},dispatch:function(e){var r,n,s,c,f,h,E=new Array(arguments.length),x=o.event.fix(e),F=(le.get(this,"events")||Object.create(null))[x.type]||[],R=o.event.special[x.type]||{};for(E[0]=x,r=1;r=1)){for(;F!==this;F=F.parentNode||this)if(F.nodeType===1&&!(e.type==="click"&&F.disabled===!0)){for(f=[],h={},n=0;n-1:o.find(c,this,null,[F]).length),h[c]&&f.push(s);f.length&&E.push({elem:F,handlers:f})}}return F=this,x\s*$/g;function Ii(e,r){return Me(e,"table")&&Me(r.nodeType!==11?r:r.firstChild,"tr")&&o(e).children("tbody")[0]||e}function Wn(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 Mi(e,r){var n,s,c,f,h,E,x;if(r.nodeType===1){if(le.hasData(e)&&(f=le.get(e),x=f.events,x)){le.remove(r,"handle events");for(c in x)for(n=0,s=x[c].length;n1&&typeof I=="string"&&!U.checkClone&&On.test(I))return e.each(function(ve){var re=e.eq(ve);ne&&(r[0]=I.call(this,ve,re.html())),$t(re,r,n,s)});if(B&&(c=Ur(r,e[0].ownerDocument,!1,e,s),f=c.firstChild,c.childNodes.length===1&&(c=f),f||s)){for(h=o.map(Ze(c,"script"),Wn),E=h.length;R0&&Br(h,!x&&Ze(e,"script")),E},cleanData:function(e){for(var r,n,s,c=o.event.special,f=0;(n=e[f])!==void 0;f++)if(nr(n)){if(r=n[le.expando]){if(r.events)for(s in r.events)c[s]?o.event.remove(n,s):o.removeEvent(n,s,r.handle);n[le.expando]=void 0}n[$e.expando]&&(n[$e.expando]=void 0)}}}),o.fn.extend({detach:function(e){return Ni(this,e,!0)},remove:function(e){return Ni(this,e)},text:function(e){return _t(this,function(r){return r===void 0?o.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=r)})},null,e,arguments.length)},append:function(){return $t(this,arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var r=Ii(this,e);r.appendChild(e)}})},prepend:function(){return $t(this,arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var r=Ii(this,e);r.insertBefore(e,r.firstChild)}})},before:function(){return $t(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $t(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,r=0;(e=this[r])!=null;r++)e.nodeType===1&&(o.cleanData(Ze(e,!1)),e.textContent="");return this},clone:function(e,r){return e=e==null?!1:e,r=r==null?e:r,this.map(function(){return o.clone(this,e,r)})},html:function(e){return _t(this,function(r){var n=this[0]||{},s=0,c=this.length;if(r===void 0&&n.nodeType===1)return n.innerHTML;if(typeof r=="string"&&!Nn.test(r)&&!Ke[(Wr.exec(r)||["",""])[1].toLowerCase()]){r=o.htmlPrefilter(r);try{for(;s=0&&(x+=Math.max(0,Math.ceil(e["offset"+r[0].toUpperCase()+r.slice(1)]-f-x-E-.5))||0),x}function ur(e,r,n){var s=kr(e),c=!U.boxSizingReliable()||n,f=c&&o.css(e,"boxSizing",!1,s)==="border-box",h=f,E=or(e,r,s),x="offset"+r[0].toUpperCase()+r.slice(1);if(qr.test(E)){if(!n)return E;E="auto"}return(!U.boxSizingReliable()&&f||!U.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+Xr(e,r,n||(f?"border":"content"),h,s,E)+"px"}o.extend({cssHooks:{opacity:{get:function(e,r){if(r){var n=or(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,r,n,s){if(!(!e||e.nodeType===3||e.nodeType===8||!e.style)){var c,f,h,E=bt(r),x=Vr.test(r),F=e.style;if(x||(r=Gr(E)),h=o.cssHooks[r]||o.cssHooks[E],n!==void 0){if(f=typeof n,f==="string"&&(c=Mt.exec(n))&&c[1]&&(n=Or(e,r,c),f="number"),n==null||n!==n)return;f==="number"&&!x&&(n+=c&&c[3]||(o.cssNumber[E]?"":"px")),!U.clearCloneStyle&&n===""&&r.indexOf("background")===0&&(F[r]="inherit"),(!h||!("set"in h)||(n=h.set(e,n,s))!==void 0)&&(x?F.setProperty(r,n):F[r]=n)}else return h&&"get"in h&&(c=h.get(e,!1,s))!==void 0?c:F[r]}},css:function(e,r,n,s){var c,f,h,E=bt(r),x=Vr.test(r);return x||(r=Gr(E)),h=o.cssHooks[r]||o.cssHooks[E],h&&"get"in h&&(c=h.get(e,!0,n)),c===void 0&&(c=or(e,r,s)),c==="normal"&&r in Yr&&(c=Yr[r]),n===""||n?(f=parseFloat(c),n===!0||isFinite(f)?f||0:c):c}}),o.each(["height","width"],function(e,r){o.cssHooks[r]={get:function(n,s,c){if(s)return Ui.test(o.css(n,"display"))&&(!n.getClientRects().length||!n.getBoundingClientRect().width)?Oi(n,lr,function(){return ur(n,r,c)}):ur(n,r,c)},set:function(n,s,c){var f,h=kr(n),E=!U.scrollboxSize()&&h.position==="absolute",x=E||c,F=x&&o.css(n,"boxSizing",!1,h)==="border-box",R=c?Xr(n,r,c,F,h):0;return F&&E&&(R-=Math.ceil(n["offset"+r[0].toUpperCase()+r.slice(1)]-parseFloat(h[r])-Xr(n,r,"border",!1,h)-.5)),R&&(f=Mt.exec(s))&&(f[3]||"px")!=="px"&&(n.style[r]=s,s=o.css(n,r)),Wt(n,s,R)}}}),o.cssHooks.marginLeft=Wi(U.reliableMarginLeft,function(e,r){if(r)return(parseFloat(or(e,"marginLeft"))||e.getBoundingClientRect().left-Oi(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),o.each({margin:"",padding:"",border:"Width"},function(e,r){o.cssHooks[e+r]={expand:function(n){for(var s=0,c={},f=typeof n=="string"?n.split(" "):[n];s<4;s++)c[e+yt[s]+r]=f[s]||f[s-2]||f[0];return c}},e!=="margin"&&(o.cssHooks[e+r].set=Wt)}),o.fn.extend({css:function(e,r){return _t(this,function(n,s,c){var f,h,E={},x=0;if(Array.isArray(s)){for(f=kr(n),h=s.length;x1)}});function Ge(e,r,n,s,c){return new Ge.prototype.init(e,r,n,s,c)}o.Tween=Ge,Ge.prototype={constructor:Ge,init:function(e,r,n,s,c,f){this.elem=e,this.prop=n,this.easing=c||o.easing._default,this.options=r,this.start=this.now=this.cur(),this.end=s,this.unit=f||(o.cssNumber[n]?"":"px")},cur:function(){var e=Ge.propHooks[this.prop];return e&&e.get?e.get(this):Ge.propHooks._default.get(this)},run:function(e){var r,n=Ge.propHooks[this.prop];return this.options.duration?this.pos=r=o.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=r=e,this.now=(this.end-this.start)*r+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ge.propHooks._default.set(this),this}},Ge.prototype.init.prototype=Ge.prototype,Ge.propHooks={_default:{get:function(e){var r;return e.elem.nodeType!==1||e.elem[e.prop]!=null&&e.elem.style[e.prop]==null?e.elem[e.prop]:(r=o.css(e.elem,e.prop,""),!r||r==="auto"?0:r)},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[Gr(e.prop)]!=null)?o.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ge.propHooks.scrollTop=Ge.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=Ge.prototype.init,o.fx.step={};var Jt,Pr,Qr=/^(?:toggle|show|hide)$/,qn=/queueHooks$/;function Jr(){Pr&&(K.hidden===!1&&l.requestAnimationFrame?l.requestAnimationFrame(Jr):l.setTimeout(Jr,o.fx.interval),o.fx.tick())}function p(){return l.setTimeout(function(){Jt=void 0}),Jt=Date.now()}function S(e,r){var n,s=0,c={height:e};for(r=r?1:0;s<4;s+=2-r)n=yt[s],c["margin"+n]=c["padding"+n]=e;return r&&(c.opacity=c.width=e),c}function v(e,r,n){for(var s,c=(_.tweeners[r]||[]).concat(_.tweeners["*"]),f=0,h=c.length;f1)},removeAttr:function(e){return this.each(function(){o.removeAttr(this,e)})}}),o.extend({attr:function(e,r,n){var s,c,f=e.nodeType;if(!(f===3||f===8||f===2)){if(typeof e.getAttribute=="undefined")return o.prop(e,r,n);if((f!==1||!o.isXMLDoc(e))&&(c=o.attrHooks[r.toLowerCase()]||(o.expr.match.bool.test(r)?N:void 0)),n!==void 0){if(n===null){o.removeAttr(e,r);return}return c&&"set"in c&&(s=c.set(e,n,r))!==void 0?s:(e.setAttribute(r,n+""),n)}return c&&"get"in c&&(s=c.get(e,r))!==null?s:(s=o.find.attr(e,r),s==null?void 0:s)}},attrHooks:{type:{set:function(e,r){if(!U.radioValue&&r==="radio"&&Me(e,"input")){var n=e.value;return e.setAttribute("type",r),n&&(e.value=n),r}}}},removeAttr:function(e,r){var n,s=0,c=r&&r.match(vt);if(c&&e.nodeType===1)for(;n=c[s++];)e.removeAttribute(n)}}),N={set:function(e,r,n){return r===!1?o.removeAttr(e,n):e.setAttribute(n,n),n}},o.each(o.expr.match.bool.source.match(/\w+/g),function(e,r){var n=j[r]||o.find.attr;j[r]=function(s,c,f){var h,E,x=c.toLowerCase();return f||(E=j[x],j[x]=h,h=n(s,c,f)!=null?x:null,j[x]=E),h}});var V=/^(?:input|select|textarea|button)$/i,G=/^(?:a|area)$/i;o.fn.extend({prop:function(e,r){return _t(this,o.prop,e,r,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[o.propFix[e]||e]})}}),o.extend({prop:function(e,r,n){var s,c,f=e.nodeType;if(!(f===3||f===8||f===2))return(f!==1||!o.isXMLDoc(e))&&(r=o.propFix[r]||r,c=o.propHooks[r]),n!==void 0?c&&"set"in c&&(s=c.set(e,n,r))!==void 0?s:e[r]=n:c&&"get"in c&&(s=c.get(e,r))!==null?s:e[r]},propHooks:{tabIndex:{get:function(e){var r=o.find.attr(e,"tabindex");return r?parseInt(r,10):V.test(e.nodeName)||G.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),U.optSelected||(o.propHooks.selected={get:function(e){var r=e.parentNode;return r&&r.parentNode&&r.parentNode.selectedIndex,null},set:function(e){var r=e.parentNode;r&&(r.selectedIndex,r.parentNode&&r.parentNode.selectedIndex)}}),o.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){o.propFix[this.toLowerCase()]=this});function Y(e){var r=e.match(vt)||[];return r.join(" ")}function Z(e){return e.getAttribute&&e.getAttribute("class")||""}function ye(e){return Array.isArray(e)?e:typeof e=="string"?e.match(vt)||[]:[]}o.fn.extend({addClass:function(e){var r,n,s,c,f,h;return q(e)?this.each(function(E){o(this).addClass(e.call(this,E,Z(this)))}):(r=ye(e),r.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,r){var n,s,c,f,h=typeof e,E=h==="string"||Array.isArray(e);return q(e)?this.each(function(x){o(this).toggleClass(e.call(this,x,Z(this),r),r)}):typeof r=="boolean"&&E?r?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 r,n,s,c=this[0];return arguments.length?(s=q(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+""})),r=o.valHooks[this.type]||o.valHooks[this.nodeName.toLowerCase()],(!r||!("set"in r)||r.set(this,h,"value")===void 0)&&(this.value=h))})):c?(r=o.valHooks[c.type]||o.valHooks[c.nodeName.toLowerCase()],r&&"get"in r&&(n=r.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 r=o.find.attr(e,"value");return r!=null?r:Y(o.text(e))}},select:{get:function(e){var r,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,r){if(Array.isArray(r))return e.checked=o.inArray(o(e).val(),r)>-1}},U.checkOn||(o.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value})}),U.focusin="onfocusin"in l;var Pe=/^(?:focusinfocus|focusoutblur)$/,We=function(e){e.stopPropagation()};o.extend(o.event,{trigger:function(e,r,n,s){var c,f,h,E,x,F,R,B,D=[n||K],I=W.call(e,"type")?e.type:e,ne=W.call(e,"namespace")?e.namespace.split("."):[];if(f=B=h=n=n||K,!(n.nodeType===3||n.nodeType===8)&&!Pe.test(I+o.event.triggered)&&(I.indexOf(".")>-1&&(ne=I.split("."),I=ne.shift(),ne.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=ne.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+ne.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),r=r==null?[e]:o.makeArray(r,[e]),R=o.event.special[I]||{},!(!s&&R.trigger&&R.trigger.apply(n,r)===!1))){if(!s&&!R.noBubble&&!de(n)){for(E=R.delegateType||I,Pe.test(E+I)||(f=f.parentNode);f;f=f.parentNode)D.push(f),h=f;h===(n.ownerDocument||K)&&D.push(h.defaultView||h.parentWindow||l)}for(c=0;(f=D[c++])&&!e.isPropagationStopped();)B=f,e.type=c>1?E:R.bindType||I,F=(le.get(f,"events")||Object.create(null))[e.type]&&le.get(f,"handle"),F&&F.apply(f,r),F=x&&f[x],F&&F.apply&&nr(f)&&(e.result=F.apply(f,r),e.result===!1&&e.preventDefault());return e.type=I,!s&&!e.isDefaultPrevented()&&(!R._default||R._default.apply(D.pop(),r)===!1)&&nr(n)&&x&&q(n[I])&&!de(n)&&(h=n[x],h&&(n[x]=null),o.event.triggered=I,e.isPropagationStopped()&&B.addEventListener(I,We),n[I](),e.isPropagationStopped()&&B.removeEventListener(I,We),o.event.triggered=void 0,h&&(n[x]=h)),e.result}},simulate:function(e,r,n){var s=o.extend(new o.Event,n,{type:e,isSimulated:!0});o.event.trigger(s,null,r)}}),o.fn.extend({trigger:function(e,r){return this.each(function(){o.event.trigger(e,r,this)})},triggerHandler:function(e,r){var n=this[0];if(n)return o.event.trigger(e,r,n,!0)}}),U.focusin||o.each({focus:"focusin",blur:"focusout"},function(e,r){var n=function(s){o.event.simulate(r,s.target,o.event.fix(s))};o.event.special[r]={setup:function(){var s=this.ownerDocument||this.document||this,c=le.access(s,r);c||s.addEventListener(e,n,!0),le.access(s,r,(c||0)+1)},teardown:function(){var s=this.ownerDocument||this.document||this,c=le.access(s,r)-1;c?le.access(s,r,c):(s.removeEventListener(e,n,!0),le.remove(s,r))}}});var Le=l.location,it={guid:Date.now()},jt=/\?/;o.parseXML=function(e){var r,n;if(!e||typeof e!="string")return null;try{r=new l.DOMParser().parseFromString(e,"text/xml")}catch(s){}return n=r&&r.getElementsByTagName("parsererror")[0],(!r||n)&&o.error("Invalid XML: "+(n?o.map(n.childNodes,function(s){return s.textContent}).join(` +import{a as sn,b as el,c as tl}from"./chunk-SXEVG2WS.js";import{a as Ds}from"./chunk-5SHCNQ2O.js";import{a as Ls,b as Rs,c as rl}from"./chunk-OCFU6ZP7.js";import{D as ca,J as fa,l as te,u as As,v as Fs}from"./chunk-HB3LWF25.js";import{D as Dt,E as oa,F as Fr,I as Cs,J as la,S as ua,U as ks,a as Ft,aa as an,b as oi,ba as Ps,ca as li,d as Et,e as sa,f as pt,g as De,j as Es,l as Zi,m as en,n as tn,o as gr,p as Ss,s as rn,v as _s,w as Ts,x as nn,y as gt,z as Ar}from"./chunk-ATS7PSQG.js";import{b as si,c as ws,e as aa}from"./chunk-5XVCUSSZ.js";var ha=ws((Is,da)=>{(function(l){if(typeof Is=="object"&&typeof da!="undefined")da.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,i;return function a(u,d,m){function y(W,fe){if(!d[W]){if(!u[W]){var z=typeof si=="function"&&si;if(!fe&&z)return z(W,!0);if(b)return b(W,!0);var U=new Error("Cannot find module '"+W+"'");throw U.code="MODULE_NOT_FOUND",U}var q=d[W]={exports:{}};u[W][0].call(q.exports,function(de){var K=u[W][1][de];return y(K||de)},q,q.exports,a,u,d,m)}return d[W].exports}for(var b=typeof si=="function"&&si,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 He(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 tt(p,S){var v=be[p.name],C=v.deferredOperations.pop();if(C)return C.reject(S),C.promise}function Qe(p,S){return new z(function(v,C){if(be[p.name]=be[p.name]||ir(),p.db)if(S)He(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 j=_.result;try{j.createObjectStore(p.storeName),N.oldVersion<=1&&j.createObjectStore(xe)}catch(V){if(V.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 V}}),_.onerror=function(N){N.preventDefault(),C(_.error)},_.onsuccess=function(){var N=_.result;N.onversionchange=function(j){j.target.close()},v(N),Me(p)}})}function mt(p){return Qe(p,!1)}function rr(p){return Qe(p,!0)}function wr(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 Ir(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 Yt(p){var S=ae(atob(p.data));return fe([S],{type:p.type})}function Mr(p){return p&&p.__local_forage_encoded_blob}function vt(p){var S=this,v=S._initReady().then(function(){var C=be[S._dbInfo.name];if(C&&C.dbReady)return C.dbReady});return q(v,p,p),v}function An(p){He(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),rr(p)}).then(function(){return An(p).then(function(){Je(p,S,v,C-1)})}).catch(v);v(_)}}function ir(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function Pi(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=ir(),be[v.name]=k),k.forages.push(S),S._initReady||(S._initReady=S.ready,S.ready=vt);var _=[];function N(){return z.resolve()}for(var j=0;j>4,Y[k++]=(N&15)<<4|j>>2,Y[k++]=(j&3)<<6|V&63;return G}function Ke(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 Ze(p,S){var v="";if(p&&(v=Wr.call(p)),p&&(v==="[object ArrayBuffer]"||p.buffer&&Wr.call(p.buffer)==="[object ArrayBuffer]")){var C,k=Sr;p instanceof ArrayBuffer?(C=p,k+=Tr):(C=p.buffer,v==="[object Int8Array]"?k+=yt:v==="[object Uint8Array]"?k+=At:v==="[object Uint8ClampedArray]"?k+=Nt:v==="[object Int16Array]"?k+=Fi:v==="[object Uint16Array]"?k+=Or:v==="[object Int32Array]"?k+=sr:v==="[object Uint32Array]"?k+=$r:v==="[object Float32Array]"?k+=Di:v==="[object Float64Array]"?k+=Ot:S(new Error("Failed to get type for BinaryArray"))),S(k+Ke(C))}else if(v==="[object Blob]"){var _=new FileReader;_.onload=function(){var N=In+p.type+"~"+Ke(this.result);S(Sr+Mt+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 Br(p){if(p.substring(0,_r)!==Sr)return JSON.parse(p);var S=p.substring(Xt),v=p.substring(_r,Xt),C;if(v===Mt&&Ai.test(S)){var k=S.match(Ai);C=k[1],S=S.substring(k[0].length)}var _=jr(S);switch(v){case Tr:return _;case Mt:return fe([_],{type:C});case yt:return new Int8Array(_);case At:return new Uint8Array(_);case Nt:return new Uint8ClampedArray(_);case Fi:return new Int16Array(_);case Or:return new Uint16Array(_);case sr:return new Int32Array(_);case $r:return new Uint32Array(_);case Di:return new Float32Array(_);case Ot:return new Float64Array(_);default:throw new Error("Unkown type: "+v)}}var Hr={serialize:Ze,deserialize:Br,stringToBuffer:jr,bufferToString:Ke};function Ur(p,S,v,C){p.executeSql("CREATE TABLE IF NOT EXISTS "+S.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],v,C)}function Li(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(j){return N(j)}v.db.transaction(function(j){Ur(j,v,function(){S._dbInfo=v,_()},function(V,G){N(G)})},N)});return v.serializer=Hr,k}function rt(p,S,v,C,k,_){p.executeSql(v,C,k,function(N,j){j.code===j.SYNTAX_ERR?N.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[S.storeName],function(V,G){G.rows.length?_(V,j):Ur(V,S,function(){V.executeSql(v,C,k,_)},_)},_):_(N,j)},_)}function Qt(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(j){rt(j,N,"SELECT * FROM "+N.storeName+" WHERE key = ? LIMIT 1",[p],function(V,G){var Y=G.rows.length?G.rows.item(0).value:null;Y&&(Y=N.serializer.deserialize(Y)),k(Y)},function(V,G){_(G)})})}).catch(_)});return U(C,S),C}function Mn(p,S){var v=this,C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(j){rt(j,N,"SELECT * FROM "+N.storeName,[],function(V,G){for(var Y=G.rows,Z=Y.length,ye=0;ye0){N(Ri.apply(k,[p,V,v,C-1]));return}j(ye)}})})}).catch(j)});return U(_,v),_}function zr(p,S,v){return Ri.apply(this,[p,S,v,1])}function Cr(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(j){rt(j,N,"DELETE FROM "+N.storeName+" WHERE key = ?",[p],function(){k()},function(V,G){_(G)})})}).catch(_)});return U(C,S),C}function Nn(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){rt(N,_,"DELETE FROM "+_.storeName,[],function(){C()},function(j,V){k(V)})})}).catch(k)});return U(v,p),v}function On(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){rt(N,_,"SELECT COUNT(key) as c FROM "+_.storeName,[],function(j,V){var G=V.rows.item(0).c;C(G)},function(j,V){k(V)})})}).catch(k)});return U(v,p),v}function $n(p,S){var v=this,C=new z(function(k,_){v.ready().then(function(){var N=v._dbInfo;N.db.transaction(function(j){rt(j,N,"SELECT key FROM "+N.storeName+" WHERE id = ? LIMIT 1",[p+1],function(V,G){var Y=G.rows.length?G.rows.item(0).key:null;k(Y)},function(V,G){_(G)})})}).catch(_)});return U(C,S),C}function Ii(p){var S=this,v=new z(function(C,k){S.ready().then(function(){var _=S._dbInfo;_.db.transaction(function(N){rt(N,_,"SELECT key FROM "+_.storeName,[],function(j,V){for(var G=[],Y=0;Y '__WebKitDatabaseInfoTable__'",[],function(k,_){for(var N=[],j=0;j<_.rows.length;j++)N.push(_.rows.item(j).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]}):_(Wn(N))}).then(function(_){return new z(function(N,j){_.db.transaction(function(V){function G(ke){return new z(function(Pe,We){V.executeSql("DROP TABLE IF EXISTS "+ke,[],function(){Pe()},function(Le,it){We(it)})})}for(var Y=[],Z=0,ye=_.storeNames.length;Z0}function Vr(p){var S=this,v={};if(p)for(var C in p)v[C]=p[C];return v.keyPrefix=$t(p,S._defaultConfig),qr()?(S._dbInfo=v,v.serializer=Hr,z.resolve()):z.reject()}function kr(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 U(v,p),v}function Oi(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 U(C,S),C}function Hn(p,S){var v=this,C=v.ready().then(function(){for(var k=v._dbInfo,_=k.keyPrefix,N=_.length,j=localStorage.length,V=1,G=0;G=0;N--){var j=localStorage.key(N);j.indexOf(_)===0&&localStorage.removeItem(j)}}):k=z.reject("Invalid arguments"),U(k,S),k}var Hi={_driver:"localStorageWrapper",_initStorage:Vr,_support:Bn(),iterate:Hn,getItem:Oi,setItem:ji,removeItem:Wi,clear:kr,length:or,key:$i,keys:Un,dropInstance:Bi},zn=function(S,v){return S===v||typeof S=="number"&&typeof v=="number"&&isNaN(S)&&isNaN(v)},Gr=function(S,v){for(var C=S.length,k=0;k{(function(l,t){"use strict";typeof ln=="object"&&typeof ln.exports=="object"?ln.exports=l.document?t(l,!0):function(i){if(!i.document)throw new Error("jQuery requires a window with a document");return t(i)}:t(l)})(typeof window!="undefined"?window:$s,function(l,t){"use strict";var i=[],a=Object.getPrototypeOf,u=i.slice,d=i.flat?function(e){return i.flat.call(e)}:function(e){return i.concat.apply([],e)},m=i.push,y=i.indexOf,b={},L=b.toString,W=b.hasOwnProperty,fe=W.toString,z=fe.call(Object),U={},q=function(r){return typeof r=="function"&&typeof r.nodeType!="number"&&typeof r.item!="function"},de=function(r){return r!=null&&r===r.window},K=l.document,xe={type:!0,src:!0,nonce:!0,noModule:!0};function Ce(e,r,n){n=n||K;var s,c,f=n.createElement("script");if(f.text=e,r)for(s in xe)c=r[s]||r.getAttribute&&r.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"?b[L.call(e)]||"object":typeof e}var Se="3.6.3",o=function(e,r){return new o.fn.init(e,r)};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 r=o.merge(this.constructor(),e);return r.prevObject=this,r},each:function(e){return o.each(this,e)},map:function(e){return this.pushStack(o.map(this,function(r,n){return e.call(r,n,r)}))},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,r){return(r+1)%2}))},odd:function(){return this.pushStack(o.grep(this,function(e,r){return r%2}))},eq:function(e){var r=this.length,n=+e+(e<0?r:0);return this.pushStack(n>=0&&n0&&r-1 in e}var ae=function(e){var r,n,s,c,f,h,E,x,F,R,B,D,I,ne,ve,re,ze,Ue,ct,Fe="sizzle"+1*new Date,me=e.document,st=0,Te=0,je=Xi(),ri=Xi(),Vi=Xi(),ft=Xi(),cr=function(g,w){return g===w&&(B=!0),0},fr={}.hasOwnProperty,ot=[],Kt=ot.pop,xt=ot.push,Zt=ot.push,ds=ot.slice,dr=function(g,w){for(var T=0,M=g.length;T+~]|"+Ae+")"+Ae+"*"),Ho=new RegExp(Ae+"|>"),Uo=new RegExp(Kn),zo=new RegExp("^"+hr+"$"),Yi={ID:new RegExp("^#("+hr+")"),CLASS:new RegExp("^\\.("+hr+")"),TAG:new RegExp("^("+hr+"|[*])"),ATTR:new RegExp("^"+hs),PSEUDO:new RegExp("^"+Kn),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("^(?:"+Jn+")$","i"),needsContext:new RegExp("^"+Ae+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+Ae+"*((?:-\\d)?\\d*)"+Ae+"*\\)|)(?=[^-]|$)","i")},qo=/HTML$/i,Vo=/^(?:input|select|textarea|button)$/i,Go=/^h\d$/i,ii=/^[^{]+\{\s*\[native \w/,Yo=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Zn=/[+~]/,Bt=new RegExp("\\\\[\\da-fA-F]{1,6}"+Ae+"?|\\\\([^\\r\\n\\f])","g"),Ht=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))},gs=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ms=function(g,w){return w?g==="\0"?"\uFFFD":g.slice(0,-1)+"\\"+g.charCodeAt(g.length-1).toString(16)+" ":"\\"+g},vs=function(){D()},Xo=Ji(function(g){return g.disabled===!0&&g.nodeName.toLowerCase()==="fieldset"},{dir:"parentNode",next:"legend"});try{Zt.apply(ot=ds.call(me.childNodes),me.childNodes),ot[me.childNodes.length].nodeType}catch(g){Zt={apply:ot.length?function(w,T){xt.apply(w,ds.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,H,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&&(D(w),w=w||I,ve)){if(we!==11&&(J=Yo.exec(g)))if(P=J[1]){if(we===9)if(H=w.getElementById(P)){if(H.id===P)return T.push(H),T}else return T;else if(he&&(H=he.getElementById(P))&&ct(w,H)&&H.id===P)return T.push(H),T}else{if(J[2])return Zt.apply(T,w.getElementsByTagName(g)),T;if((P=J[3])&&n.getElementsByClassName&&w.getElementsByClassName)return Zt.apply(T,w.getElementsByClassName(P)),T}if(n.qsa&&!ft[g+" "]&&(!re||!re.test(g))&&(we!==1||w.nodeName.toLowerCase()!=="object")){if(se=g,he=w,we===1&&(Ho.test(g)||ps.test(g))){for(he=Zn.test(g)&&ta(w.parentNode)||w,(he!==w||!n.scope)&&((Q=w.getAttribute("id"))?Q=Q.replace(gs,ms):w.setAttribute("id",Q=Fe)),ue=h(g),O=ue.length;O--;)ue[O]=(Q?"#"+Q:":scope")+" "+Qi(ue[O]);se=ue.join(",")}try{if(n.cssSupportsSelector&&!CSS.supports("selector(:is("+se+"))"))throw new Error;return Zt.apply(T,he.querySelectorAll(se)),T}catch(Ie){ft(g,!0)}finally{Q===Fe&&w.removeAttribute("id")}}}return x(g.replace(Gi,"$1"),w,T,M)}function Xi(){var g=[];function w(T,M){return g.push(T+" ")>s.cacheLength&&delete w[g.shift()],w[T+" "]=M}return w}function Tt(g){return g[Fe]=!0,g}function wt(g){var w=I.createElement("fieldset");try{return!!g(w)}catch(T){return!1}finally{w.parentNode&&w.parentNode.removeChild(w),w=null}}function ea(g,w){for(var T=g.split("|"),M=T.length;M--;)s.attrHandle[T[M]]=w}function bs(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 Qo(g){return function(w){var T=w.nodeName.toLowerCase();return T==="input"&&w.type===g}}function Jo(g){return function(w){var T=w.nodeName.toLowerCase();return(T==="input"||T==="button")&&w.type===g}}function ys(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&&Xo(w)===g:w.disabled===g:"label"in w?w.disabled===g:!1}}function pr(g){return Tt(function(w){return w=+w,Tt(function(T,M){for(var P,O=g([],T.length,w),H=O.length;H--;)T[P=O[H]]&&(T[P]=!(M[P]=T[P]))})})}function ta(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!qo.test(w||T&&T.nodeName||"HTML")},D=Re.setDocument=function(g){var w,T,M=g?g.ownerDocument||g:me;return M==I||M.nodeType!==9||!M.documentElement||(I=M,ne=I.documentElement,ve=!f(I),me!=I&&(T=I.defaultView)&&T.top!==T&&(T.addEventListener?T.addEventListener("unload",vs,!1):T.attachEvent&&T.attachEvent("onunload",vs)),n.scope=wt(function(P){return ne.appendChild(P).appendChild(I.createElement("div")),typeof P.querySelectorAll!="undefined"&&!P.querySelectorAll(":scope fieldset div").length}),n.cssSupportsSelector=wt(function(){return CSS.supports("selector(*)")&&I.querySelectorAll(":is(:jqfake)")&&!CSS.supports("selector(:is(*,:jqfake))")}),n.attributes=wt(function(P){return P.className="i",!P.getAttribute("className")}),n.getElementsByTagName=wt(function(P){return P.appendChild(I.createComment("")),!P.getElementsByTagName("*").length}),n.getElementsByClassName=ii.test(I.getElementsByClassName),n.getById=wt(function(P){return ne.appendChild(P).id=Fe,!I.getElementsByName||!I.getElementsByName(Fe).length}),n.getById?(s.filter.ID=function(P){var O=P.replace(Bt,Ht);return function(H){return H.getAttribute("id")===O}},s.find.ID=function(P,O){if(typeof O.getElementById!="undefined"&&ve){var H=O.getElementById(P);return H?[H]:[]}}):(s.filter.ID=function(P){var O=P.replace(Bt,Ht);return function(H){var Q=typeof H.getAttributeNode!="undefined"&&H.getAttributeNode("id");return Q&&Q.value===O}},s.find.ID=function(P,O){if(typeof O.getElementById!="undefined"&&ve){var H,Q,J,ue=O.getElementById(P);if(ue){if(H=ue.getAttributeNode("id"),H&&H.value===P)return[ue];for(J=O.getElementsByName(P),Q=0;ue=J[Q++];)if(H=ue.getAttributeNode("id"),H&&H.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 H,Q=[],J=0,ue=O.getElementsByTagName(P);if(P==="*"){for(;H=ue[J++];)H.nodeType===1&&Q.push(H);return Q}return ue},s.find.CLASS=n.getElementsByClassName&&function(P,O){if(typeof O.getElementsByClassName!="undefined"&&ve)return O.getElementsByClassName(P)},ze=[],re=[],(n.qsa=ii.test(I.querySelectorAll))&&(wt(function(P){var O;ne.appendChild(P).innerHTML="",P.querySelectorAll("[msallowcapture^='']").length&&re.push("[*^$]="+Ae+`*(?:''|"")`),P.querySelectorAll("[selected]").length||re.push("\\["+Ae+"*(?:value|"+Jn+")"),P.querySelectorAll("[id~="+Fe+"-]").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#"+Fe+"+*").length||re.push(".#.+[+~]"),P.querySelectorAll("\\\f"),re.push("[\\r\\n\\f]")}),wt(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"),ne.appendChild(P).disabled=!0,P.querySelectorAll(":disabled").length!==2&&re.push(":enabled",":disabled"),P.querySelectorAll("*,:x"),re.push(",.*:")})),(n.matchesSelector=ii.test(Ue=ne.matches||ne.webkitMatchesSelector||ne.mozMatchesSelector||ne.oMatchesSelector||ne.msMatchesSelector))&&wt(function(P){n.disconnectedMatch=Ue.call(P,"*"),Ue.call(P,"[s!='']:x"),ze.push("!=",Kn)}),n.cssSupportsSelector||re.push(":has"),re=re.length&&new RegExp(re.join("|")),ze=ze.length&&new RegExp(ze.join("|")),w=ii.test(ne.compareDocumentPosition),ct=w||ii.test(ne.contains)?function(P,O){var H=P.nodeType===9&&P.documentElement||P,Q=O&&O.parentNode;return P===Q||!!(Q&&Q.nodeType===1&&(H.contains?H.contains(Q):P.compareDocumentPosition&&P.compareDocumentPosition(Q)&16))}:function(P,O){if(O){for(;O=O.parentNode;)if(O===P)return!0}return!1},cr=w?function(P,O){if(P===O)return B=!0,0;var H=!P.compareDocumentPosition-!O.compareDocumentPosition;return H||(H=(P.ownerDocument||P)==(O.ownerDocument||O)?P.compareDocumentPosition(O):1,H&1||!n.sortDetached&&O.compareDocumentPosition(P)===H?P==I||P.ownerDocument==me&&ct(me,P)?-1:O==I||O.ownerDocument==me&&ct(me,O)?1:R?dr(R,P)-dr(R,O):0:H&4?-1:1)}:function(P,O){if(P===O)return B=!0,0;var H,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?dr(R,P)-dr(R,O):0;if(J===ue)return bs(P,O);for(H=P;H=H.parentNode;)se.unshift(H);for(H=O;H=H.parentNode;)he.unshift(H);for(;se[Q]===he[Q];)Q++;return Q?bs(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(D(g),n.matchesSelector&&ve&&!ft[w+" "]&&(!ze||!ze.test(w))&&(!re||!re.test(w)))try{var T=Ue.call(g,w);if(T||n.disconnectedMatch||g.document&&g.document.nodeType!==11)return T}catch(M){ft(w,!0)}return Re(w,I,null,[g]).length>0},Re.contains=function(g,w){return(g.ownerDocument||g)!=I&&D(g),ct(g,w)},Re.attr=function(g,w){(g.ownerDocument||g)!=I&&D(g);var T=s.attrHandle[w.toLowerCase()],M=T&&fr.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(gs,ms)},Re.error=function(g){throw new Error("Syntax error, unrecognized expression: "+g)},Re.uniqueSort=function(g){var w,T=[],M=0,P=0;if(B=!n.detectDuplicates,R=!n.sortStable&&g.slice(0),g.sort(cr),B){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:Tt,match:Yi,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(Bt,Ht),g[3]=(g[3]||g[4]||g[5]||"").replace(Bt,Ht),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 Yi.CHILD.test(g[0])?null:(g[3]?g[2]=g[4]||g[5]||"":T&&Uo.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(Bt,Ht).toLowerCase();return g==="*"?function(){return!0}:function(T){return T.nodeName&&T.nodeName.toLowerCase()===w}},CLASS:function(g){var w=je[g+" "];return w||(w=new RegExp("(^|"+Ae+")"+g+"("+Ae+"|$)"))&&je(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(jo," ")+" ").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",H=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,qe,et,dt=O!==H?"nextSibling":"previousSibling",Ne=J.parentNode,ni=Q&&J.nodeName.toLowerCase(),ai=!se&&!Q,ht=!1;if(Ne){if(O){for(;dt;){for(ce=J;ce=ce[dt];)if(Q?ce.nodeName.toLowerCase()===ni:ce.nodeType===1)return!1;et=dt=g==="only"&&!et&&"nextSibling"}return!0}if(et=[H?Ne.firstChild:Ne.lastChild],H&&ai){for(ce=Ne,Ie=ce[Fe]||(ce[Fe]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),he=we[g]||[],qe=he[0]===st&&he[1],ht=qe&&he[2],ce=qe&&Ne.childNodes[qe];ce=++qe&&ce&&ce[dt]||(ht=qe=0)||et.pop();)if(ce.nodeType===1&&++ht&&ce===J){we[g]=[st,qe,ht];break}}else if(ai&&(ce=J,Ie=ce[Fe]||(ce[Fe]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),he=we[g]||[],qe=he[0]===st&&he[1],ht=qe),ht===!1)for(;(ce=++qe&&ce&&ce[dt]||(ht=qe=0)||et.pop())&&!((Q?ce.nodeName.toLowerCase()===ni:ce.nodeType===1)&&++ht&&(ai&&(Ie=ce[Fe]||(ce[Fe]={}),we=Ie[ce.uniqueID]||(Ie[ce.uniqueID]={}),we[g]=[st,ht]),ce===J)););return ht-=P,ht===M||ht%M==0&&ht/M>=0}}},PSEUDO:function(g,w){var T,M=s.pseudos[g]||s.setFilters[g.toLowerCase()]||Re.error("unsupported pseudo: "+g);return M[Fe]?M(w):M.length>1?(T=[g,g,"",w],s.setFilters.hasOwnProperty(g.toLowerCase())?Tt(function(P,O){for(var H,Q=M(P,w),J=Q.length;J--;)H=dr(P,Q[J]),P[H]=!(O[H]=Q[J])}):function(P){return M(P,0,T)}):M}},pseudos:{not:Tt(function(g){var w=[],T=[],M=E(g.replace(Gi,"$1"));return M[Fe]?Tt(function(P,O,H,Q){for(var J,ue=M(P,null,Q,[]),se=P.length;se--;)(J=ue[se])&&(P[se]=!(O[se]=J))}):function(P,O,H){return w[0]=P,M(w,null,H,T),w[0]=null,!T.pop()}}),has:Tt(function(g){return function(w){return Re(g,w).length>0}}),contains:Tt(function(g){return g=g.replace(Bt,Ht),function(w){return(w.textContent||c(w)).indexOf(g)>-1}}),lang:Tt(function(g){return zo.test(g||"")||Re.error("unsupported lang: "+g),g=g.replace(Bt,Ht).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===ne},focus:function(g){return g===I.activeElement&&(!I.hasFocus||I.hasFocus())&&!!(g.type||g.href||~g.tabIndex)},enabled:ys(!1),disabled:ys(!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 Go.test(g.nodeName)},input:function(g){return Vo.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:pr(function(){return[0]}),last:pr(function(g,w){return[w-1]}),eq:pr(function(g,w,T){return[T<0?T+w:T]}),even:pr(function(g,w){for(var T=0;Tw?w:T;--M>=0;)g.push(M);return g}),gt:pr(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 Ko(g,w,T){for(var M=0,P=w.length;M-1&&(H[se]=!(Q[se]=we))}}else Ne=Ki(Ne===Q?Ne.splice(qe,Ne.length):Ne),P?P(null,Q,Ne,ue):Zt.apply(Q,Ne)})}function na(g){for(var w,T,M,P=g.length,O=s.relative[g[0].type],H=O||s.relative[" "],Q=O?1:0,J=Ji(function(he){return he===w},H,!0),ue=Ji(function(he){return dr(w,he)>-1},H,!0),se=[function(he,we,Ie){var ce=!O&&(Ie||we!==F)||((w=we).nodeType?J(he,we,Ie):ue(he,we,Ie));return w=null,ce}];Q1&&ra(se),Q>1&&Qi(g.slice(0,Q-1).concat({value:g[Q-2].type===" "?"*":""})).replace(Gi,"$1"),T,Q0,M=g.length>0,P=function(O,H,Q,J,ue){var se,he,we,Ie=0,ce="0",qe=O&&[],et=[],dt=F,Ne=O||M&&s.find.TAG("*",ue),ni=st+=dt==null?1:Math.random()||.1,ai=Ne.length;for(ue&&(F=H==I||H||ue);ce!==ai&&(se=Ne[ce])!=null;ce++){if(M&&se){for(he=0,!H&&se.ownerDocument!=I&&(D(se),Q=!ve);we=g[he++];)if(we(se,H||I,Q)){J.push(se);break}ue&&(st=ni)}T&&((se=!we&&se)&&Ie--,O&&qe.push(se))}if(Ie+=ce,T&&ce!==Ie){for(he=0;we=w[he++];)we(qe,et,H,Q);if(O){if(Ie>0)for(;ce--;)qe[ce]||et[ce]||(et[ce]=Kt.call(J));et=Ki(et)}Zt.apply(J,et),ue&&!O&&et.length>0&&Ie+w.length>1&&Re.uniqueSort(J)}return ue&&(st=ni,F=dt),qe};return T?Tt(P):P}return E=Re.compile=function(g,w){var T,M=[],P=[],O=Vi[g+" "];if(!O){for(w||(w=h(g)),T=w.length;T--;)O=na(w[T]),O[Fe]?M.push(O):P.push(O);O=Vi(g,Zo(P,M)),O.selector=g}return O},x=Re.select=function(g,w,T,M){var P,O,H,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&&(H=O[0]).type==="ID"&&w.nodeType===9&&ve&&s.relative[O[1].type]){if(w=(s.find.ID(H.matches[0].replace(Bt,Ht),w)||[])[0],w)ue&&(w=w.parentNode);else return T;g=g.slice(O.shift().value.length)}for(P=Yi.needsContext.test(g)?0:O.length;P--&&(H=O[P],!s.relative[Q=H.type]);)if((J=s.find[Q])&&(M=J(H.matches[0].replace(Bt,Ht),Zn.test(O[0].type)&&ta(w.parentNode)||w))){if(O.splice(P,1),g=M.length&&Qi(O),!g)return Zt.apply(T,M),T;break}}return(ue||E(g,se))(M,w,!ve,T,!w||Zn.test(g)&&ta(w.parentNode)||w),T},n.sortStable=Fe.split("").sort(cr).join("")===Fe,n.detectDuplicates=!!B,D(),n.sortDetached=wt(function(g){return g.compareDocumentPosition(I.createElement("fieldset"))&1}),wt(function(g){return g.innerHTML="",g.firstChild.getAttribute("href")==="#"})||ea("type|href|height|width",function(g,w,T){if(!T)return g.getAttribute(w,w.toLowerCase()==="type"?1:2)}),(!n.attributes||!wt(function(g){return g.innerHTML="",g.firstChild.setAttribute("value",""),g.firstChild.getAttribute("value")===""}))&&ea("value",function(g,w,T){if(!T&&g.nodeName.toLowerCase()==="input")return g.defaultValue}),wt(function(g){return g.getAttribute("disabled")==null})||ea(Jn,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,r,n){for(var s=[],c=n!==void 0;(e=e[r])&&e.nodeType!==9;)if(e.nodeType===1){if(c&&o(e).is(n))break;s.push(e)}return s},_e=function(e,r){for(var n=[];e;e=e.nextSibling)e.nodeType===1&&e!==r&&n.push(e);return n},He=o.expr.match.needsContext;function Me(e,r){return e.nodeName&&e.nodeName.toLowerCase()===r.toLowerCase()}var tt=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Qe(e,r,n){return q(r)?o.grep(e,function(s,c){return!!r.call(s,c,s)!==n}):r.nodeType?o.grep(e,function(s){return s===r!==n}):typeof r!="string"?o.grep(e,function(s){return y.call(r,s)>-1!==n}):o.filter(r,e,n)}o.filter=function(e,r,n){var s=r[0];return n&&(e=":not("+e+")"),r.length===1&&s.nodeType===1?o.find.matchesSelector(s,e)?[s]:[]:o.find.matches(e,o.grep(r,function(c){return c.nodeType===1}))},o.fn.extend({find:function(e){var r,n,s=this.length,c=this;if(typeof e!="string")return this.pushStack(o(e).filter(function(){for(r=0;r1?o.uniqueSort(n):n},filter:function(e){return this.pushStack(Qe(this,e||[],!1))},not:function(e){return this.pushStack(Qe(this,e||[],!0))},is:function(e){return!!Qe(this,typeof e=="string"&&He.test(e)?o(e):e||[],!1).length}});var mt,rr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,wr=o.fn.init=function(e,r,n){var s,c;if(!e)return this;if(n=n||mt,typeof e=="string")if(e[0]==="<"&&e[e.length-1]===">"&&e.length>=3?s=[null,e,null]:s=rr.exec(e),s&&(s[1]||!r))if(s[1]){if(r=r instanceof o?r[0]:r,o.merge(this,o.parseHTML(s[1],r&&r.nodeType?r.ownerDocument||r:K,!0)),tt.test(s[1])&&o.isPlainObject(r))for(s in r)q(this[s])?this[s](r[s]):this.attr(s,r[s]);return this}else return c=K.getElementById(s[2]),c&&(this[0]=c,this.length=1),this;else return!r||r.jquery?(r||n).find(e):this.constructor(r).find(e);else{if(e.nodeType)return this[0]=e,this.length=1,this;if(q(e))return n.ready!==void 0?n.ready(e):e(o)}return o.makeArray(e,this)};wr.prototype=o.fn,mt=o(K);var Ir=/^(?:parents|prev(?:Until|All))/,Yt={children:!0,contents:!0,next:!0,prev:!0};o.fn.extend({has:function(e){var r=o(e,this),n=r.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"?y.call(o(e),this[0]):y.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,r){return this.pushStack(o.uniqueSort(o.merge(this.get(),o(e,r))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function Mr(e,r){for(;(e=e[r])&&e.nodeType!==1;);return e}o.each({parent:function(e){var r=e.parentNode;return r&&r.nodeType!==11?r:null},parents:function(e){return oe(e,"parentNode")},parentsUntil:function(e,r,n){return oe(e,"parentNode",n)},next:function(e){return Mr(e,"nextSibling")},prev:function(e){return Mr(e,"previousSibling")},nextAll:function(e){return oe(e,"nextSibling")},prevAll:function(e){return oe(e,"previousSibling")},nextUntil:function(e,r,n){return oe(e,"nextSibling",n)},prevUntil:function(e,r,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,r){o.fn[e]=function(n,s){var c=o.map(this,r,n);return e.slice(-5)!=="Until"&&(s=n),s&&typeof s=="string"&&(c=o.filter(s,c)),this.length>1&&(Yt[e]||o.uniqueSort(c),Ir.test(e)&&c.reverse()),this.pushStack(c)}});var vt=/[^\x20\t\r\n\f]+/g;function An(e){var r={};return o.each(e.match(vt)||[],function(n,s){r[s]=!0}),r}o.Callbacks=function(e){e=typeof e=="string"?An(e):o.extend({},e);var r,n,s,c,f=[],h=[],E=-1,x=function(){for(c=c||e.once,s=r=!0;h.length;E=-1)for(n=h.shift();++E-1;)f.splice(D,1),D<=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&&!r&&(f=n=""),this},locked:function(){return!!c},fireWith:function(R,B){return c||(B=B||[],B=[R,B.slice?B.slice():B],h.push(B),r||x()),this},fire:function(){return F.fireWith(this,arguments),this},fired:function(){return!!s}};return F};function Je(e){return e}function ir(e){throw e}function Pi(e,r,n,s){var c;try{e&&q(c=e.promise)?c.call(e).done(r).fail(n):e&&q(c=e.then)?c.call(e,r,n):r.apply(void 0,[e].slice(s))}catch(f){n.apply(void 0,[f])}}o.extend({Deferred:function(e){var r=[["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(r,function(E,x){var F=q(f[x[4]])&&f[x[4]];c[x[1]](function(){var R=F&&F.apply(this,arguments);R&&q(R.promise)?R.promise().progress(h.notify).done(h.resolve).fail(h.reject):h[x[0]+"With"](this,F?[R]:arguments)})}),f=null}).promise()},then:function(f,h,E){var x=0;function F(R,B,D,I){return function(){var ne=this,ve=arguments,re=function(){var Ue,ct;if(!(R=x&&(D!==ir&&(ne=void 0,ve=[Ue]),B.rejectWith(ne,ve))}};R?ze():(o.Deferred.getStackHook&&(ze.stackTrace=o.Deferred.getStackHook()),l.setTimeout(ze))}}return o.Deferred(function(R){r[0][3].add(F(0,R,q(E)?E:Je,R.notifyWith)),r[1][3].add(F(0,R,q(f)?f:Je)),r[2][3].add(F(0,R,q(h)?h:ir))}).promise()},promise:function(f){return f!=null?o.extend(f,s):s}},c={};return o.each(r,function(f,h){var E=h[2],x=h[5];s[h[1]]=E.add,x&&E.add(function(){n=x},r[3-f][2].disable,r[3-f][3].disable,r[0][2].lock,r[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 r=arguments.length,n=r,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,--r||f.resolveWith(s,c)}};if(r<=1&&(Pi(e,f.done(h(n)).resolve,f.reject,!r),f.state()==="pending"||q(c[n]&&c[n].then)))return f.then();for(;n--;)Pi(c[n],h(n),f.reject);return f.promise()}});var Fn=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;o.Deferred.exceptionHook=function(e,r){l.console&&l.console.warn&&e&&Fn.test(e.name)&&l.console.warn("jQuery.Deferred exception: "+e.message,e.stack,r)},o.readyException=function(e){l.setTimeout(function(){throw e})};var Nr=o.Deferred();o.fn.ready=function(e){return Nr.then(e).catch(function(r){o.readyException(r)}),this},o.extend({isReady:!1,readyWait:1,ready:function(e){(e===!0?--o.readyWait:o.isReady)||(o.isReady=!0,!(e!==!0&&--o.readyWait>0)&&Nr.resolveWith(K,[o]))}}),o.ready.then=Nr.then;function Er(){K.removeEventListener("DOMContentLoaded",Er),l.removeEventListener("load",Er),o.ready()}K.readyState==="complete"||K.readyState!=="loading"&&!K.documentElement.doScroll?l.setTimeout(o.ready):(K.addEventListener("DOMContentLoaded",Er),l.addEventListener("load",Er));var _t=function(e,r,n,s,c,f,h){var E=0,x=e.length,F=n==null;if(be(n)==="object"){c=!0;for(E in n)_t(e,r,E,n[E],!0,f,h)}else if(s!==void 0&&(c=!0,q(s)||(h=!0),F&&(h?(r.call(e,s),r=null):(F=r,r=function(R,B,D){return F.call(o(R),D)})),r))for(;E1,null,!0)},removeData:function(e){return this.each(function(){$e.remove(this,e)})}}),o.extend({queue:function(e,r,n){var s;if(e)return r=(r||"fx")+"queue",s=le.get(e,r),n&&(!s||Array.isArray(n)?s=le.access(e,r,o.makeArray(n)):s.push(n)),s||[]},dequeue:function(e,r){r=r||"fx";var n=o.queue(e,r),s=n.length,c=n.shift(),f=o._queueHooks(e,r),h=function(){o.dequeue(e,r)};c==="inprogress"&&(c=n.shift(),s--),c&&(r==="fx"&&n.unshift("inprogress"),delete f.stop,c.call(e,h,f)),!s&&f&&f.empty.fire()},_queueHooks:function(e,r){var n=r+"queueHooks";return le.get(e,n)||le.access(e,n,{empty:o.Callbacks("once memory").add(function(){le.remove(e,[r+"queue",n])})})}}),o.fn.extend({queue:function(e,r){var n=2;return typeof e!="string"&&(r=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,jr=/^$|^module$|\/(?:java|ecma)script/i;(function(){var e=K.createDocumentFragment(),r=e.appendChild(K.createElement("div")),n=K.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),r.appendChild(n),U.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,r.innerHTML="",U.noCloneChecked=!!r.cloneNode(!0).lastChild.defaultValue,r.innerHTML="",U.option=!!r.lastChild})();var Ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ke.tbody=Ke.tfoot=Ke.colgroup=Ke.caption=Ke.thead,Ke.th=Ke.td,U.option||(Ke.optgroup=Ke.option=[1,""]);function Ze(e,r){var n;return typeof e.getElementsByTagName!="undefined"?n=e.getElementsByTagName(r||"*"):typeof e.querySelectorAll!="undefined"?n=e.querySelectorAll(r||"*"):n=[],r===void 0||r&&Me(e,r)?o.merge([e],n):n}function Br(e,r){for(var n=0,s=e.length;n-1){c&&c.push(f);continue}if(F=Nt(f),h=Ze(B.appendChild(f),"script"),F&&Br(h),n)for(R=0;f=h[R++];)jr.test(f.type||"")&&n.push(f)}return B}var Li=/^([^.]*)(?:\.(.+)|)/;function rt(){return!0}function Qt(){return!1}function Mn(e,r){return e===Ri()==(r==="focus")}function Ri(){try{return K.activeElement}catch(e){}}function zr(e,r,n,s,c,f){var h,E;if(typeof r=="object"){typeof n!="string"&&(s=s||n,n=void 0);for(E in r)zr(e,E,n,s,r[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=Qt;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,r,c,s,n)})}o.event={global:{},add:function(e,r,n,s,c){var f,h,E,x,F,R,B,D,I,ne,ve,re=le.get(e);if(!!nr(e))for(n.handler&&(f=n,n=f.handler,c=f.selector),c&&o.find.matchesSelector(At,c),n.guid||(n.guid=o.guid++),(x=re.events)||(x=re.events=Object.create(null)),(h=re.handle)||(h=re.handle=function(ze){return typeof o!="undefined"&&o.event.triggered!==ze.type?o.event.dispatch.apply(e,arguments):void 0}),r=(r||"").match(vt)||[""],F=r.length;F--;)E=Li.exec(r[F])||[],I=ve=E[1],ne=(E[2]||"").split(".").sort(),!!I&&(B=o.event.special[I]||{},I=(c?B.delegateType:B.bindType)||I,B=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:ne.join(".")},f),(D=x[I])||(D=x[I]=[],D.delegateCount=0,(!B.setup||B.setup.call(e,s,ne,h)===!1)&&e.addEventListener&&e.addEventListener(I,h)),B.add&&(B.add.call(e,R),R.handler.guid||(R.handler.guid=n.guid)),c?D.splice(D.delegateCount++,0,R):D.push(R),o.event.global[I]=!0)},remove:function(e,r,n,s,c){var f,h,E,x,F,R,B,D,I,ne,ve,re=le.hasData(e)&&le.get(e);if(!(!re||!(x=re.events))){for(r=(r||"").match(vt)||[""],F=r.length;F--;){if(E=Li.exec(r[F])||[],I=ve=E[1],ne=(E[2]||"").split(".").sort(),!I){for(I in x)o.event.remove(e,I+r[F],n,s,!0);continue}for(B=o.event.special[I]||{},I=(s?B.delegateType:B.bindType)||I,D=x[I]||[],E=E[2]&&new RegExp("(^|\\.)"+ne.join("\\.(?:.*\\.|)")+"(\\.|$)"),h=f=D.length;f--;)R=D[f],(c||ve===R.origType)&&(!n||n.guid===R.guid)&&(!E||E.test(R.namespace))&&(!s||s===R.selector||s==="**"&&R.selector)&&(D.splice(f,1),R.selector&&D.delegateCount--,B.remove&&B.remove.call(e,R));h&&!D.length&&((!B.teardown||B.teardown.call(e,ne,re.handle)===!1)&&o.removeEvent(e,I,re.handle),delete x[I])}o.isEmptyObject(x)&&le.remove(e,"handle events")}},dispatch:function(e){var r,n,s,c,f,h,E=new Array(arguments.length),x=o.event.fix(e),F=(le.get(this,"events")||Object.create(null))[x.type]||[],R=o.event.special[x.type]||{};for(E[0]=x,r=1;r=1)){for(;F!==this;F=F.parentNode||this)if(F.nodeType===1&&!(e.type==="click"&&F.disabled===!0)){for(f=[],h={},n=0;n-1:o.find(c,this,null,[F]).length),h[c]&&f.push(s);f.length&&E.push({elem:F,handlers:f})}}return F=this,x\s*$/g;function Ii(e,r){return Me(e,"table")&&Me(r.nodeType!==11?r:r.firstChild,"tr")&&o(e).children("tbody")[0]||e}function Wn(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 Mi(e,r){var n,s,c,f,h,E,x;if(r.nodeType===1){if(le.hasData(e)&&(f=le.get(e),x=f.events,x)){le.remove(r,"handle events");for(c in x)for(n=0,s=x[c].length;n1&&typeof I=="string"&&!U.checkClone&&On.test(I))return e.each(function(ve){var re=e.eq(ve);ne&&(r[0]=I.call(this,ve,re.html())),$t(re,r,n,s)});if(B&&(c=Ur(r,e[0].ownerDocument,!1,e,s),f=c.firstChild,c.childNodes.length===1&&(c=f),f||s)){for(h=o.map(Ze(c,"script"),Wn),E=h.length;R0&&Br(h,!x&&Ze(e,"script")),E},cleanData:function(e){for(var r,n,s,c=o.event.special,f=0;(n=e[f])!==void 0;f++)if(nr(n)){if(r=n[le.expando]){if(r.events)for(s in r.events)c[s]?o.event.remove(n,s):o.removeEvent(n,s,r.handle);n[le.expando]=void 0}n[$e.expando]&&(n[$e.expando]=void 0)}}}),o.fn.extend({detach:function(e){return Ni(this,e,!0)},remove:function(e){return Ni(this,e)},text:function(e){return _t(this,function(r){return r===void 0?o.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=r)})},null,e,arguments.length)},append:function(){return $t(this,arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var r=Ii(this,e);r.appendChild(e)}})},prepend:function(){return $t(this,arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var r=Ii(this,e);r.insertBefore(e,r.firstChild)}})},before:function(){return $t(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $t(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,r=0;(e=this[r])!=null;r++)e.nodeType===1&&(o.cleanData(Ze(e,!1)),e.textContent="");return this},clone:function(e,r){return e=e==null?!1:e,r=r==null?e:r,this.map(function(){return o.clone(this,e,r)})},html:function(e){return _t(this,function(r){var n=this[0]||{},s=0,c=this.length;if(r===void 0&&n.nodeType===1)return n.innerHTML;if(typeof r=="string"&&!Nn.test(r)&&!Ke[(Wr.exec(r)||["",""])[1].toLowerCase()]){r=o.htmlPrefilter(r);try{for(;s=0&&(x+=Math.max(0,Math.ceil(e["offset"+r[0].toUpperCase()+r.slice(1)]-f-x-E-.5))||0),x}function ur(e,r,n){var s=kr(e),c=!U.boxSizingReliable()||n,f=c&&o.css(e,"boxSizing",!1,s)==="border-box",h=f,E=or(e,r,s),x="offset"+r[0].toUpperCase()+r.slice(1);if(qr.test(E)){if(!n)return E;E="auto"}return(!U.boxSizingReliable()&&f||!U.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+Xr(e,r,n||(f?"border":"content"),h,s,E)+"px"}o.extend({cssHooks:{opacity:{get:function(e,r){if(r){var n=or(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,r,n,s){if(!(!e||e.nodeType===3||e.nodeType===8||!e.style)){var c,f,h,E=bt(r),x=Vr.test(r),F=e.style;if(x||(r=Gr(E)),h=o.cssHooks[r]||o.cssHooks[E],n!==void 0){if(f=typeof n,f==="string"&&(c=Mt.exec(n))&&c[1]&&(n=Or(e,r,c),f="number"),n==null||n!==n)return;f==="number"&&!x&&(n+=c&&c[3]||(o.cssNumber[E]?"":"px")),!U.clearCloneStyle&&n===""&&r.indexOf("background")===0&&(F[r]="inherit"),(!h||!("set"in h)||(n=h.set(e,n,s))!==void 0)&&(x?F.setProperty(r,n):F[r]=n)}else return h&&"get"in h&&(c=h.get(e,!1,s))!==void 0?c:F[r]}},css:function(e,r,n,s){var c,f,h,E=bt(r),x=Vr.test(r);return x||(r=Gr(E)),h=o.cssHooks[r]||o.cssHooks[E],h&&"get"in h&&(c=h.get(e,!0,n)),c===void 0&&(c=or(e,r,s)),c==="normal"&&r in Yr&&(c=Yr[r]),n===""||n?(f=parseFloat(c),n===!0||isFinite(f)?f||0:c):c}}),o.each(["height","width"],function(e,r){o.cssHooks[r]={get:function(n,s,c){if(s)return Ui.test(o.css(n,"display"))&&(!n.getClientRects().length||!n.getBoundingClientRect().width)?Oi(n,lr,function(){return ur(n,r,c)}):ur(n,r,c)},set:function(n,s,c){var f,h=kr(n),E=!U.scrollboxSize()&&h.position==="absolute",x=E||c,F=x&&o.css(n,"boxSizing",!1,h)==="border-box",R=c?Xr(n,r,c,F,h):0;return F&&E&&(R-=Math.ceil(n["offset"+r[0].toUpperCase()+r.slice(1)]-parseFloat(h[r])-Xr(n,r,"border",!1,h)-.5)),R&&(f=Mt.exec(s))&&(f[3]||"px")!=="px"&&(n.style[r]=s,s=o.css(n,r)),Wt(n,s,R)}}}),o.cssHooks.marginLeft=Wi(U.reliableMarginLeft,function(e,r){if(r)return(parseFloat(or(e,"marginLeft"))||e.getBoundingClientRect().left-Oi(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),o.each({margin:"",padding:"",border:"Width"},function(e,r){o.cssHooks[e+r]={expand:function(n){for(var s=0,c={},f=typeof n=="string"?n.split(" "):[n];s<4;s++)c[e+yt[s]+r]=f[s]||f[s-2]||f[0];return c}},e!=="margin"&&(o.cssHooks[e+r].set=Wt)}),o.fn.extend({css:function(e,r){return _t(this,function(n,s,c){var f,h,E={},x=0;if(Array.isArray(s)){for(f=kr(n),h=s.length;x1)}});function Ge(e,r,n,s,c){return new Ge.prototype.init(e,r,n,s,c)}o.Tween=Ge,Ge.prototype={constructor:Ge,init:function(e,r,n,s,c,f){this.elem=e,this.prop=n,this.easing=c||o.easing._default,this.options=r,this.start=this.now=this.cur(),this.end=s,this.unit=f||(o.cssNumber[n]?"":"px")},cur:function(){var e=Ge.propHooks[this.prop];return e&&e.get?e.get(this):Ge.propHooks._default.get(this)},run:function(e){var r,n=Ge.propHooks[this.prop];return this.options.duration?this.pos=r=o.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=r=e,this.now=(this.end-this.start)*r+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ge.propHooks._default.set(this),this}},Ge.prototype.init.prototype=Ge.prototype,Ge.propHooks={_default:{get:function(e){var r;return e.elem.nodeType!==1||e.elem[e.prop]!=null&&e.elem.style[e.prop]==null?e.elem[e.prop]:(r=o.css(e.elem,e.prop,""),!r||r==="auto"?0:r)},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[Gr(e.prop)]!=null)?o.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ge.propHooks.scrollTop=Ge.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=Ge.prototype.init,o.fx.step={};var Jt,Pr,Qr=/^(?:toggle|show|hide)$/,qn=/queueHooks$/;function Jr(){Pr&&(K.hidden===!1&&l.requestAnimationFrame?l.requestAnimationFrame(Jr):l.setTimeout(Jr,o.fx.interval),o.fx.tick())}function p(){return l.setTimeout(function(){Jt=void 0}),Jt=Date.now()}function S(e,r){var n,s=0,c={height:e};for(r=r?1:0;s<4;s+=2-r)n=yt[s],c["margin"+n]=c["padding"+n]=e;return r&&(c.opacity=c.width=e),c}function v(e,r,n){for(var s,c=(_.tweeners[r]||[]).concat(_.tweeners["*"]),f=0,h=c.length;f1)},removeAttr:function(e){return this.each(function(){o.removeAttr(this,e)})}}),o.extend({attr:function(e,r,n){var s,c,f=e.nodeType;if(!(f===3||f===8||f===2)){if(typeof e.getAttribute=="undefined")return o.prop(e,r,n);if((f!==1||!o.isXMLDoc(e))&&(c=o.attrHooks[r.toLowerCase()]||(o.expr.match.bool.test(r)?N:void 0)),n!==void 0){if(n===null){o.removeAttr(e,r);return}return c&&"set"in c&&(s=c.set(e,n,r))!==void 0?s:(e.setAttribute(r,n+""),n)}return c&&"get"in c&&(s=c.get(e,r))!==null?s:(s=o.find.attr(e,r),s==null?void 0:s)}},attrHooks:{type:{set:function(e,r){if(!U.radioValue&&r==="radio"&&Me(e,"input")){var n=e.value;return e.setAttribute("type",r),n&&(e.value=n),r}}}},removeAttr:function(e,r){var n,s=0,c=r&&r.match(vt);if(c&&e.nodeType===1)for(;n=c[s++];)e.removeAttribute(n)}}),N={set:function(e,r,n){return r===!1?o.removeAttr(e,n):e.setAttribute(n,n),n}},o.each(o.expr.match.bool.source.match(/\w+/g),function(e,r){var n=j[r]||o.find.attr;j[r]=function(s,c,f){var h,E,x=c.toLowerCase();return f||(E=j[x],j[x]=h,h=n(s,c,f)!=null?x:null,j[x]=E),h}});var V=/^(?:input|select|textarea|button)$/i,G=/^(?:a|area)$/i;o.fn.extend({prop:function(e,r){return _t(this,o.prop,e,r,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[o.propFix[e]||e]})}}),o.extend({prop:function(e,r,n){var s,c,f=e.nodeType;if(!(f===3||f===8||f===2))return(f!==1||!o.isXMLDoc(e))&&(r=o.propFix[r]||r,c=o.propHooks[r]),n!==void 0?c&&"set"in c&&(s=c.set(e,n,r))!==void 0?s:e[r]=n:c&&"get"in c&&(s=c.get(e,r))!==null?s:e[r]},propHooks:{tabIndex:{get:function(e){var r=o.find.attr(e,"tabindex");return r?parseInt(r,10):V.test(e.nodeName)||G.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),U.optSelected||(o.propHooks.selected={get:function(e){var r=e.parentNode;return r&&r.parentNode&&r.parentNode.selectedIndex,null},set:function(e){var r=e.parentNode;r&&(r.selectedIndex,r.parentNode&&r.parentNode.selectedIndex)}}),o.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){o.propFix[this.toLowerCase()]=this});function Y(e){var r=e.match(vt)||[];return r.join(" ")}function Z(e){return e.getAttribute&&e.getAttribute("class")||""}function ye(e){return Array.isArray(e)?e:typeof e=="string"?e.match(vt)||[]:[]}o.fn.extend({addClass:function(e){var r,n,s,c,f,h;return q(e)?this.each(function(E){o(this).addClass(e.call(this,E,Z(this)))}):(r=ye(e),r.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,r){var n,s,c,f,h=typeof e,E=h==="string"||Array.isArray(e);return q(e)?this.each(function(x){o(this).toggleClass(e.call(this,x,Z(this),r),r)}):typeof r=="boolean"&&E?r?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 r,n,s,c=this[0];return arguments.length?(s=q(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+""})),r=o.valHooks[this.type]||o.valHooks[this.nodeName.toLowerCase()],(!r||!("set"in r)||r.set(this,h,"value")===void 0)&&(this.value=h))})):c?(r=o.valHooks[c.type]||o.valHooks[c.nodeName.toLowerCase()],r&&"get"in r&&(n=r.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 r=o.find.attr(e,"value");return r!=null?r:Y(o.text(e))}},select:{get:function(e){var r,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,r){if(Array.isArray(r))return e.checked=o.inArray(o(e).val(),r)>-1}},U.checkOn||(o.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value})}),U.focusin="onfocusin"in l;var Pe=/^(?:focusinfocus|focusoutblur)$/,We=function(e){e.stopPropagation()};o.extend(o.event,{trigger:function(e,r,n,s){var c,f,h,E,x,F,R,B,D=[n||K],I=W.call(e,"type")?e.type:e,ne=W.call(e,"namespace")?e.namespace.split("."):[];if(f=B=h=n=n||K,!(n.nodeType===3||n.nodeType===8)&&!Pe.test(I+o.event.triggered)&&(I.indexOf(".")>-1&&(ne=I.split("."),I=ne.shift(),ne.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=ne.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+ne.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),r=r==null?[e]:o.makeArray(r,[e]),R=o.event.special[I]||{},!(!s&&R.trigger&&R.trigger.apply(n,r)===!1))){if(!s&&!R.noBubble&&!de(n)){for(E=R.delegateType||I,Pe.test(E+I)||(f=f.parentNode);f;f=f.parentNode)D.push(f),h=f;h===(n.ownerDocument||K)&&D.push(h.defaultView||h.parentWindow||l)}for(c=0;(f=D[c++])&&!e.isPropagationStopped();)B=f,e.type=c>1?E:R.bindType||I,F=(le.get(f,"events")||Object.create(null))[e.type]&&le.get(f,"handle"),F&&F.apply(f,r),F=x&&f[x],F&&F.apply&&nr(f)&&(e.result=F.apply(f,r),e.result===!1&&e.preventDefault());return e.type=I,!s&&!e.isDefaultPrevented()&&(!R._default||R._default.apply(D.pop(),r)===!1)&&nr(n)&&x&&q(n[I])&&!de(n)&&(h=n[x],h&&(n[x]=null),o.event.triggered=I,e.isPropagationStopped()&&B.addEventListener(I,We),n[I](),e.isPropagationStopped()&&B.removeEventListener(I,We),o.event.triggered=void 0,h&&(n[x]=h)),e.result}},simulate:function(e,r,n){var s=o.extend(new o.Event,n,{type:e,isSimulated:!0});o.event.trigger(s,null,r)}}),o.fn.extend({trigger:function(e,r){return this.each(function(){o.event.trigger(e,r,this)})},triggerHandler:function(e,r){var n=this[0];if(n)return o.event.trigger(e,r,n,!0)}}),U.focusin||o.each({focus:"focusin",blur:"focusout"},function(e,r){var n=function(s){o.event.simulate(r,s.target,o.event.fix(s))};o.event.special[r]={setup:function(){var s=this.ownerDocument||this.document||this,c=le.access(s,r);c||s.addEventListener(e,n,!0),le.access(s,r,(c||0)+1)},teardown:function(){var s=this.ownerDocument||this.document||this,c=le.access(s,r)-1;c?le.access(s,r,c):(s.removeEventListener(e,n,!0),le.remove(s,r))}}});var Le=l.location,it={guid:Date.now()},jt=/\?/;o.parseXML=function(e){var r,n;if(!e||typeof e!="string")return null;try{r=new l.DOMParser().parseFromString(e,"text/xml")}catch(s){}return n=r&&r.getElementsByTagName("parsererror")[0],(!r||n)&&o.error("Invalid XML: "+(n?o.map(n.childNodes,function(s){return s.textContent}).join(` `):e)),r};var Kr=/\[\]$/,zi=/\r?\n/g,Zr=/^(?:submit|button|image|reset|file)$/i,ss=/^(?:input|select|textarea|keygen)/i;function ei(e,r,n,s){var c;if(Array.isArray(r))o.each(r,function(f,h){n||Kr.test(e)?s(e,h):ei(e+"["+(typeof h=="object"&&h!=null?f:"")+"]",h,n,s)});else if(!n&&be(r)==="object")for(c in r)ei(e+"["+c+"]",r[c],n,s);else s(e,r)}o.param=function(e,r){var n,s=[],c=function(f,h){var E=q(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)ei(n,e[n],r,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")&&ss.test(this.nodeName)&&!Zr.test(e)&&(this.checked||!Xt.test(e))}).map(function(e,r){var n=o(this).val();return n==null?null:Array.isArray(n)?o.map(n,function(s){return{name:r.name,value:s.replace(zi,`\r `)}}):{name:r.name,value:n.replace(zi,`\r `)}}).get()}});var Vn=/%20/g,qi=/#.*$/,Ao=/([?&])_=[^&]*/,Fo=/^(.*?):[ \t]*([^\r\n]*)$/mg,Do=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lo=/^(?:GET|HEAD)$/,Ro=/^\/\//,os={},Gn={},ls="*/".concat("*"),Yn=K.createElement("a");Yn.href=Le.href;function us(e){return function(r,n){typeof r!="string"&&(n=r,r="*");var s,c=0,f=r.toLowerCase().match(vt)||[];if(q(n))for(;s=f[c++];)s[0]==="+"?(s=s.slice(1)||"*",(e[s]=e[s]||[]).unshift(n)):(e[s]=e[s]||[]).push(n)}}function cs(e,r,n,s){var c={},f=e===Gn;function h(E){var x;return c[E]=!0,o.each(e[E]||[],function(F,R){var B=R(r,n,s);if(typeof B=="string"&&!f&&!c[B])return r.dataTypes.unshift(B),h(B),!1;if(f)return!(x=B)}),x}return h(r.dataTypes[0])||!c["*"]&&h("*")}function Xn(e,r){var n,s,c=o.ajaxSettings.flatOptions||{};for(n in r)r[n]!==void 0&&((c[n]?e:s||(s={}))[n]=r[n]);return s&&o.extend(!0,e,s),e}function Io(e,r,n){for(var s,c,f,h,E=e.contents,x=e.dataTypes;x[0]==="*";)x.shift(),s===void 0&&(s=e.mimeType||r.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 Mo(e,r,n,s){var c,f,h,E,x,F={},R=e.dataTypes.slice();if(R[1])for(h in e.converters)F[h.toLowerCase()]=e.converters[h];for(f=R.shift();f;)if(e.responseFields[f]&&(n[e.responseFields[f]]=r),!x&&s&&e.dataFilter&&(r=e.dataFilter(r,e.dataType)),x=f,f=R.shift(),f){if(f==="*")f=x;else if(x!=="*"&&x!==f){if(h=F[x+" "+f]||F["* "+f],!h){for(c in F)if(E=c.split(" "),E[1]===f&&(h=F[x+" "+E[0]]||F["* "+E[0]],h)){h===!0?h=F[c]:F[c]!==!0&&(f=E[0],R.unshift(E[1]));break}}if(h!==!0)if(h&&e.throws)r=h(r);else try{r=h(r)}catch(B){return{state:"parsererror",error:h?B:"No conversion from "+x+" to "+f}}}}return{state:"success",data:r}}o.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Le.href,type:"GET",isLocal:Do.test(Le.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":ls,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,r){return r?Xn(Xn(e,o.ajaxSettings),r):Xn(o.ajaxSettings,e)},ajaxPrefilter:us(os),ajaxTransport:us(Gn),ajax:function(e,r){typeof e=="object"&&(r=e,e=void 0),r=r||{};var n,s,c,f,h,E,x,F,R,B,D=o.ajaxSetup({},r),I=D.context||D,ne=D.context&&(I.nodeType||I.jquery)?o(I):o.event,ve=o.Deferred(),re=o.Callbacks("once memory"),ze=D.statusCode||{},Ue={},ct={},Fe="canceled",me={readyState:0,getResponseHeader:function(Te){var je;if(x){if(!f)for(f={};je=Fo.exec(c);)f[je[1].toLowerCase()+" "]=(f[je[1].toLowerCase()+" "]||[]).concat(je[2]);je=f[Te.toLowerCase()+" "]}return je==null?null:je.join(", ")},getAllResponseHeaders:function(){return x?c:null},setRequestHeader:function(Te,je){return x==null&&(Te=ct[Te.toLowerCase()]=ct[Te.toLowerCase()]||Te,Ue[Te]=je),this},overrideMimeType:function(Te){return x==null&&(D.mimeType=Te),this},statusCode:function(Te){var je;if(Te)if(x)me.always(Te[me.status]);else for(je in Te)ze[je]=[ze[je],Te[je]];return this},abort:function(Te){var je=Te||Fe;return n&&n.abort(je),st(0,je),this}};if(ve.promise(me),D.url=((e||D.url||Le.href)+"").replace(Ro,Le.protocol+"//"),D.type=r.method||r.type||D.method||D.type,D.dataTypes=(D.dataType||"*").toLowerCase().match(vt)||[""],D.crossDomain==null){E=K.createElement("a");try{E.href=D.url,E.href=E.href,D.crossDomain=Yn.protocol+"//"+Yn.host!=E.protocol+"//"+E.host}catch(Te){D.crossDomain=!0}}if(D.data&&D.processData&&typeof D.data!="string"&&(D.data=o.param(D.data,D.traditional)),cs(os,D,r,me),x)return me;F=o.event&&D.global,F&&o.active++==0&&o.event.trigger("ajaxStart"),D.type=D.type.toUpperCase(),D.hasContent=!Lo.test(D.type),s=D.url.replace(qi,""),D.hasContent?D.data&&D.processData&&(D.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&(D.data=D.data.replace(Vn,"+")):(B=D.url.slice(s.length),D.data&&(D.processData||typeof D.data=="string")&&(s+=(jt.test(s)?"&":"?")+D.data,delete D.data),D.cache===!1&&(s=s.replace(Ao,"$1"),B=(jt.test(s)?"&":"?")+"_="+it.guid+++B),D.url=s+B),D.ifModified&&(o.lastModified[s]&&me.setRequestHeader("If-Modified-Since",o.lastModified[s]),o.etag[s]&&me.setRequestHeader("If-None-Match",o.etag[s])),(D.data&&D.hasContent&&D.contentType!==!1||r.contentType)&&me.setRequestHeader("Content-Type",D.contentType),me.setRequestHeader("Accept",D.dataTypes[0]&&D.accepts[D.dataTypes[0]]?D.accepts[D.dataTypes[0]]+(D.dataTypes[0]!=="*"?", "+ls+"; q=0.01":""):D.accepts["*"]);for(R in D.headers)me.setRequestHeader(R,D.headers[R]);if(D.beforeSend&&(D.beforeSend.call(I,me,D)===!1||x))return me.abort();if(Fe="abort",re.add(D.complete),me.done(D.success),me.fail(D.error),n=cs(Gn,D,r,me),!n)st(-1,"No Transport");else{if(me.readyState=1,F&&ne.trigger("ajaxSend",[me,D]),x)return me;D.async&&D.timeout>0&&(h=l.setTimeout(function(){me.abort("timeout")},D.timeout));try{x=!1,n.send(Ue,st)}catch(Te){if(x)throw Te;st(-1,Te)}}function st(Te,je,ri,Vi){var ft,cr,fr,ot,Kt,xt=je;x||(x=!0,h&&l.clearTimeout(h),n=void 0,c=Vi||"",me.readyState=Te>0?4:0,ft=Te>=200&&Te<300||Te===304,ri&&(ot=Io(D,me,ri)),!ft&&o.inArray("script",D.dataTypes)>-1&&o.inArray("json",D.dataTypes)<0&&(D.converters["text script"]=function(){}),ot=Mo(D,ot,me,ft),ft?(D.ifModified&&(Kt=me.getResponseHeader("Last-Modified"),Kt&&(o.lastModified[s]=Kt),Kt=me.getResponseHeader("etag"),Kt&&(o.etag[s]=Kt)),Te===204||D.type==="HEAD"?xt="nocontent":Te===304?xt="notmodified":(xt=ot.state,cr=ot.data,fr=ot.error,ft=!fr)):(fr=xt,(Te||!xt)&&(xt="error",Te<0&&(Te=0))),me.status=Te,me.statusText=(je||xt)+"",ft?ve.resolveWith(I,[cr,xt,me]):ve.rejectWith(I,[me,xt,fr]),me.statusCode(ze),ze=void 0,F&&ne.trigger(ft?"ajaxSuccess":"ajaxError",[me,D,ft?cr:fr]),re.fireWith(I,[me,xt]),F&&(ne.trigger("ajaxComplete",[me,D]),--o.active||o.event.trigger("ajaxStop")))}return me},getJSON:function(e,r,n){return o.get(e,r,n,"json")},getScript:function(e,r){return o.get(e,void 0,r,"script")}}),o.each(["get","post"],function(e,r){o[r]=function(n,s,c,f){return q(s)&&(f=f||c,c=s,s=void 0),o.ajax(o.extend({url:n,type:r,dataType:f,data:s,success:c},o.isPlainObject(n)&&n))}}),o.ajaxPrefilter(function(e){var r;for(r in e.headers)r.toLowerCase()==="content-type"&&(e.contentType=e.headers[r]||"")}),o._evalUrl=function(e,r,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,r,n)}})},o.fn.extend({wrapAll:function(e){var r;return this[0]&&(q(e)&&(e=e.call(this[0])),r=o(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&r.insertBefore(this[0]),r.map(function(){for(var n=this;n.firstElementChild;)n=n.firstElementChild;return n}).append(this)),this},wrapInner:function(e){return q(e)?this.each(function(r){o(this).wrapInner(e.call(this,r))}):this.each(function(){var r=o(this),n=r.contents();n.length?n.wrapAll(e):r.append(e)})},wrap:function(e){var r=q(e);return this.each(function(n){o(this).wrapAll(r?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 No={0:200,1223:204},ti=o.ajaxSettings.xhr();U.cors=!!ti&&"withCredentials"in ti,U.ajax=ti=!!ti,o.ajaxTransport(function(e){var r,n;if(U.cors||ti&&!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]);r=function(E){return function(){r&&(r=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(No[h.status]||h.status,h.statusText,(h.responseType||"text")!=="text"||typeof h.responseText!="string"?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=r(),n=h.onerror=h.ontimeout=r("error"),h.onabort!==void 0?h.onabort=n:h.onreadystatechange=function(){h.readyState===4&&l.setTimeout(function(){r&&n()})},r=r("abort");try{h.send(e.hasContent&&e.data||null)}catch(E){if(r)throw E}},abort:function(){r&&r()}}}),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 r,n;return{send:function(s,c){r=o(" - - @@ -204,7 +194,6 @@ if (window.location.host.endsWith('8bitworkshop.com')) {