From c46d912da64ca1e501fcac2ac6faa2ef9fc38d4d Mon Sep 17 00:00:00 2001 From: sehugg Date: Wed, 16 Sep 2026 14:26:47 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20sehugg/8?= =?UTF-8?q?bitworkshop@516d84b3351c853c1a19fa94ace6870b9a123ed0=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/ui.css | 39 ++++++ ...7800-K3O5HT4E.js => atari7800-XKMHPAB2.js} | 4 +- ...5HT4E.js.map => atari7800-XKMHPAB2.js.map} | 4 +- ...{atari8-G2ROI5V7.js => atari8-NPXQGTKX.js} | 8 +- ...G2ROI5V7.js.map => atari8-NPXQGTKX.js.map} | 4 +- gen/{basic-PINDSKMV.js => basic-G4Y7BVWJ.js} | 4 +- ...-PINDSKMV.js.map => basic-G4Y7BVWJ.js.map} | 0 gen/{c64-6OBK6BOT.js => c64-RILK5FDC.js} | 8 +- ...64-6OBK6BOT.js.map => c64-RILK5FDC.js.map} | 4 +- gen/{chunk-EX34LRSY.js => chunk-4H5H6MGY.js} | 80 ++++++------ ...-EX34LRSY.js.map => chunk-4H5H6MGY.js.map} | 6 +- gen/{chunk-PEELNZF2.js => chunk-SIGRU5UF.js} | 4 +- ...-PEELNZF2.js.map => chunk-SIGRU5UF.js.map} | 0 gen/{cpc-Y2LBEMQF.js => cpc-K33QRZMJ.js} | 4 +- ...pc-Y2LBEMQF.js.map => cpc-K33QRZMJ.js.map} | 4 +- gen/{devel-5WJH6CCE.js => devel-Q6YXKXKB.js} | 4 +- ...-5WJH6CCE.js.map => devel-Q6YXKXKB.js.map} | 0 gen/embedui.js | 2 +- gen/ide/ui.js | 9 +- gen/ide/ui.js.map | 2 +- gen/ide/views/gutter.js | 35 +---- gen/ide/views/gutter.js.map | 2 +- gen/{nes-ZMBUGVPQ.js => nes-EEFZEAIQ.js} | 4 +- ...es-ZMBUGVPQ.js.map => nes-EEFZEAIQ.js.map} | 4 +- gen/platform/atari7800.js | 2 +- gen/platform/atari7800.js.map | 2 +- gen/platform/atari8.js | 20 +-- gen/platform/atari8.js.map | 2 +- gen/platform/c64.js | 2 +- gen/platform/c64.js.map | 2 +- gen/platform/cpc.js | 20 +-- gen/platform/cpc.js.map | 2 +- gen/platform/nes.js | 2 +- gen/platform/nes.js.map | 2 +- gen/platform/zx.js | 2 +- gen/platform/zx.js.map | 2 +- gen/src/ide/ui.js | 9 +- gen/src/ide/ui.js.map | 2 +- gen/src/ide/views/gutter.js | 35 +---- gen/src/ide/views/gutter.js.map | 2 +- gen/src/platform/atari7800.js | 2 +- gen/src/platform/atari7800.js.map | 2 +- gen/src/platform/atari8.js | 20 +-- gen/src/platform/atari8.js.map | 2 +- gen/src/platform/c64.js | 2 +- gen/src/platform/c64.js.map | 2 +- gen/src/platform/cpc.js | 20 +-- gen/src/platform/cpc.js.map | 2 +- gen/src/platform/nes.js | 2 +- gen/src/platform/nes.js.map | 2 +- gen/src/platform/zx.js | 2 +- gen/src/platform/zx.js.map | 2 +- gen/src/tools/emutarget.js | 32 ++++- gen/src/tools/emutarget.js.map | 2 +- gen/test/tsconfig.tsbuildinfo | 2 +- gen/test/unit/testc64breakpoints.js | 121 ++++++++++++++++++ gen/test/unit/testc64breakpoints.js.map | 1 + gen/tools/emutarget.js | 32 ++++- gen/tools/emutarget.js.map | 2 +- gen/ui.js | 2 +- gen/{zx-OKQTLQ6I.js => zx-5QVL7NCW.js} | 4 +- ...{zx-OKQTLQ6I.js.map => zx-5QVL7NCW.js.map} | 4 +- presets/zx/skeleton.zmac | 20 +++ src/ide/ui.ts | 7 +- src/ide/views/gutter.ts | 35 +---- src/platform/atari7800.ts | 2 +- src/platform/atari8.ts | 20 +-- src/platform/c64.ts | 2 +- src/platform/cpc.ts | 20 +-- src/platform/nes.ts | 2 +- src/platform/zx.ts | 2 +- src/tools/emutarget.ts | 32 ++++- 72 files changed, 475 insertions(+), 272 deletions(-) rename gen/{atari7800-K3O5HT4E.js => atari7800-XKMHPAB2.js} (88%) rename gen/{atari7800-K3O5HT4E.js.map => atari7800-XKMHPAB2.js.map} (95%) rename gen/{atari8-G2ROI5V7.js => atari8-NPXQGTKX.js} (75%) rename gen/{atari8-G2ROI5V7.js.map => atari8-NPXQGTKX.js.map} (89%) rename gen/{basic-PINDSKMV.js => basic-G4Y7BVWJ.js} (99%) rename gen/{basic-PINDSKMV.js.map => basic-G4Y7BVWJ.js.map} (100%) rename gen/{c64-6OBK6BOT.js => c64-RILK5FDC.js} (78%) rename gen/{c64-6OBK6BOT.js.map => c64-RILK5FDC.js.map} (81%) rename gen/{chunk-EX34LRSY.js => chunk-4H5H6MGY.js} (92%) rename gen/{chunk-EX34LRSY.js.map => chunk-4H5H6MGY.js.map} (51%) rename gen/{chunk-PEELNZF2.js => chunk-SIGRU5UF.js} (92%) rename gen/{chunk-PEELNZF2.js.map => chunk-SIGRU5UF.js.map} (100%) rename gen/{cpc-Y2LBEMQF.js => cpc-K33QRZMJ.js} (69%) rename gen/{cpc-Y2LBEMQF.js.map => cpc-K33QRZMJ.js.map} (81%) rename gen/{devel-5WJH6CCE.js => devel-Q6YXKXKB.js} (93%) rename gen/{devel-5WJH6CCE.js.map => devel-Q6YXKXKB.js.map} (100%) rename gen/{nes-ZMBUGVPQ.js => nes-EEFZEAIQ.js} (94%) rename gen/{nes-ZMBUGVPQ.js.map => nes-EEFZEAIQ.js.map} (91%) create mode 100644 gen/test/unit/testc64breakpoints.js create mode 100644 gen/test/unit/testc64breakpoints.js.map rename gen/{zx-OKQTLQ6I.js => zx-5QVL7NCW.js} (78%) rename gen/{zx-OKQTLQ6I.js.map => zx-5QVL7NCW.js.map} (88%) create mode 100644 presets/zx/skeleton.zmac diff --git a/css/ui.css b/css/ui.css index d4d03531..06643b54 100644 --- a/css/ui.css +++ b/css/ui.css @@ -1361,3 +1361,42 @@ div.scripting-cell button.scripting-enabled { margin-top: 0.8em; line-height: 1.4; } +/* CodeMirror gutter markers */ +.gutter-offset-marker { + cursor: pointer; +} +.gutter-offset-marker:hover { + text-decoration: underline; +} +.gutter-breakpoint, +.gutter-breakpoint-placeholder { + cursor: pointer; +} +.gutter-breakpoint-enabled { + color: rgba(255, 0, 0, 1.0); +} +.gutter-breakpoint-disabled { + color: rgba(255, 255, 255, 0.35); +} +.gutter-breakpoint-placeholder { + color: transparent; +} +.gutter-breakpoint-placeholder:hover { + color: rgba(255, 0, 0, 0.5); +} +.gutter-error { + color: #ff6666; + font-weight: bold; + cursor: pointer; +} +.gutter-currentpc { + color: #ff66ee; + cursor: pointer; +} +.gutter-currentpc-placeholder { + color: transparent; + cursor: pointer; +} +.gutter-currentpc-placeholder:hover { + color: #ffee66; +} diff --git a/gen/atari7800-K3O5HT4E.js b/gen/atari7800-XKMHPAB2.js similarity index 88% rename from gen/atari7800-K3O5HT4E.js rename to gen/atari7800-XKMHPAB2.js index c50633a0..b666e448 100644 --- a/gen/atari7800-K3O5HT4E.js +++ b/gen/atari7800-XKMHPAB2.js @@ -3,5 +3,5 @@ import{a as j}from"./chunk-LZK7RTFU.js";import{J as $,h as H,k as z,m as Y,q as DL: $`+S(r.dlstart,4),t+=` Offset: `+r.offset,t+=` DLI? `+r.dli,t}},T=class extends K{constructor(){super();this.cpuFrequency=1789772;this.canvasWidth=320;this.numTotalScanlines=M;this.numVisibleScanlines=G;this.defaultROMSize=49152;this.cpuCyclesPerLine=113.5;this.sampleRate=X;this.ram=new Uint8Array(4096);this.regs6532=new Uint8Array(4);this.piatimer=0;this.timerinterval=1;this.tia=new I;this.maria=new L;this.lastFrameCycles=0;this.xtracyc=0;this.cpu=new Y,this.read=_([[8,13,15,t=>(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=_([[21,26,31,(t,e)=>{this.xtracyc++,this.pokey1.setTIARegister(t,e)}],[0,31,31,(t,e)=>{this.xtracyc++,this.tia.write(t,e)}],[32,63,31,(t,e)=>{this.maria.write(t,e)}],[64,255,255,(t,e)=>{this.ram[t+2048]=e}],[256,319,255,(t,e)=>{this.write(t,e)}],[320,511,511,(t,e)=>{this.ram[t+2048]=e}],[640,767,127,(t,e)=>{this.xtracyc++,this.writePIA(t,e)}],[6144,10239,65535,(t,e)=>{this.ram[t-6144]=e}],[10240,16383,2047,(t,e)=>{this.write(t|8192,e)}],[49151,49151,65535,(t,e)=>{}],[0,65535,65535,(t,e)=>{this.probe&&this.probe.logIllegal(t)}]]),this.connectCPUMemoryBus(this),this.dmaBus=this.probeDMABus(this),this.handler=E(this.inputs,Z),this.pokey1=new H,this.audioadapter=new z(this.pokey1,q,X)}readConst(t){let e=this.probe;this.probe=null;let n=this.read(t);return this.probe=e,n}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,n=0,i,s=0,u=0,c=0;this.lastFrameCycles=-1,this.probe.logNewFrame();for(var x=0;x>2),s+=p,e){let m=(this.maria.regs[28]&128)!=0?15:255;for(var l=0;l<320;l++)e[n++]=J[this.maria.pixels[l]&m]}}for((d||x==M-1)&&this.maria.doInterrupt()&&(this.probe.logInterrupt(0),this.cpu.NMI());s>2),s=C;break}if(t&&t()){t=null,x=999,this.lastFrameCycles=s;break}s+=this.advanceCPU()<<2,c++}this.audio&&this.audioadapter.generate(this.audio),s-=C,u+=s,this.probe.logNewScanline()}return c}getRasterX(){return(this.lastFrameCycles+C)%C}getRasterY(){return this.scanline}getRasterCanvasPosition(){return{x:this.getRasterX(),y:this.getRasterY()}}loadROM(t){t.length==49280&&(t=t.slice(128)),this.rom=N(t,this.defaultROMSize,!0)}reset(){super.reset(),this.tia.reset(),this.maria.reset(),this.inputs.fill(0),this.inputs[b]=255,this.inputs[U]=11,this.setPIATimer(0,0)}readAddress(t){return this.read(t)|0}loadState(t){this.cpu.loadState(t.c),this.ram.set(t.ram),this.tia.loadState(t.tia),this.maria.loadState(t.maria),this.regs6532.set(t.regs6532),this.piatimer=t.pia.timer,this.timerinterval=t.pia.interval,this.loadControlsState(t)}saveState(){return{c:this.cpu.saveState(),ram:this.ram.slice(0),tia:this.tia.saveState(),maria:this.maria.saveState(),regs6532:this.regs6532.slice(0),inputs:this.inputs.slice(0),pia:{timer:this.piatimer,interval:this.timerinterval}}}loadControlsState(t){this.inputs.set(t.inputs)}saveControlsState(){return{inputs:this.inputs.slice(0)}}getDebugCategories(){return["CPU","Stack","TIA","MARIA"]}getDebugInfo(t,e){switch(t){case"TIA":return I.stateToLongString(e.tia);case"MARIA":return L.stateToLongString(e.maria)+` -Scanline: `+this.scanline}}getDebugDisplayLists(){let t={},e=this.maria.getDLLStart(),n=0;for(;n<240;){let i=this.readConst(e),s=i&15,u=(i&64)!=0,c=(i&32)!=0,x=(this.readConst(e+1)<<8)+this.readConst(e+2);e=e+3&65535;let d=(this.readConst(e)&128)!=0,l="DL $"+S(x,4)+" "+n+"-"+(n+s);u&&(l+=" H16"),c&&(l+=" H8"),d&&(l+=" DLI"),t[l]={$$:this._readDebugDisplayList(x)},n+=s+1}return t}_readDebugDisplayList(t){return()=>this.readDebugDisplayList(t)}readDebugDisplayList(t){let e=[],n=t&65280,i=t&255;do{let x=this.maria.regs[28],d=this.readConst(n+(i+0&511)),l=this.readConst(n+(i+1&511));if(l==0)break;let p=this.readConst(n+(i+2&511)),g=this.readConst(n+(i+3&511)),y=!1,m="",k,A=(x&3)+(l&128?4:0);if((l&31)==0){var s=g>>5,u=32-(g&31),c=this.readConst(n+(i+4&511));y=(l&32)!=0,k=l&128,i+=5}else{var c=g,s=l>>5,u=32-(l&31);i+=4}m+="X="+c+" W="+u+" P="+s,k&&(m+=" WM=1"),y&&(m+=" CHR=$"+S(this.maria.regs[20]+this.maria.offset&255)+"xx");let w=d+((p+(y?0:this.maria.offset)&255)<<8);m=" $"+S(w,4)+" "+m,m=["160A","?","320D","320A","160B","?","320B","320C"][A]+" "+m,e.push(m)}while(i<512);return e}},J=new Uint32Array(256);for(D=0;D<256;D++)J[D]=j(D);var D;var it=[{id:"sprites.dasm",name:"Sprites (ASM)",category:"Assembler"},{id:"wsync.c",name:"WSYNC",category:"CC65"},{id:"sprites.c",name:"Double Buffering"},{id:"scroll.c",name:"Scrolling"},{id:"test_conio.c78",name:"Conio Test",category:"cc7800"},{id:"example_small_sprites.c78",name:"Small Sprites"},{id:"example_vertical_scrolling.c78",name:"Vertical Scrolling"}],F=class extends ${constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"TIA",start:0,size:32,type:"io"},{name:"MARIA",start:32,size:32,type:"io"},{name:"RAM (6166 Block 0)",start:64,size:192,type:"ram"},{name:"RAM (6166 Block 1)",start:320,size:192,type:"ram"},{name:"PIA",start:640,size:24,type:"io"},{name:"RAM",start:6144,size:4096,type:"ram"},{name:"Cartridge ROM",start:16384,size:49146,type:"rom"},{name:"CPU Vectors",start:65530,size:6,type:"rom"}]}}}newMachine(){return new T}getPresets(){return it}getDefaultExtensions(){return[...super.getDefaultExtensions(),".cc7800"]}readAddress(t){return this.machine.readConst(t)}getROMExtension(){return".a78"}getDebugTree(){let t=super.getDebugTree();return t.display_list=this.machine.getDebugDisplayLists(),t}getToolForFilename(t){return t.endsWith(".cc7800")||t.endsWith(".c78")?"cc7800":V(t)}};O.atari7800=F; -//# sourceMappingURL=atari7800-K3O5HT4E.js.map +Scanline: `+this.scanline}}getDebugDisplayLists(){let t={},e=this.maria.getDLLStart(),n=0;for(;n<240;){let i=this.readConst(e),s=i&15,u=(i&64)!=0,c=(i&32)!=0,x=(this.readConst(e+1)<<8)+this.readConst(e+2);e=e+3&65535;let d=(this.readConst(e)&128)!=0,l="DL $"+S(x,4)+" "+n+"-"+(n+s);u&&(l+=" H16"),c&&(l+=" H8"),d&&(l+=" DLI"),t[l]={$$:this._readDebugDisplayList(x)},n+=s+1}return t}_readDebugDisplayList(t){return()=>this.readDebugDisplayList(t)}readDebugDisplayList(t){let e=[],n=t&65280,i=t&255;do{let x=this.maria.regs[28],d=this.readConst(n+(i+0&511)),l=this.readConst(n+(i+1&511));if(l==0)break;let p=this.readConst(n+(i+2&511)),g=this.readConst(n+(i+3&511)),y=!1,m="",k,A=(x&3)+(l&128?4:0);if((l&31)==0){var s=g>>5,u=32-(g&31),c=this.readConst(n+(i+4&511));y=(l&32)!=0,k=l&128,i+=5}else{var c=g,s=l>>5,u=32-(l&31);i+=4}m+="X="+c+" W="+u+" P="+s,k&&(m+=" WM=1"),y&&(m+=" CHR=$"+S(this.maria.regs[20]+this.maria.offset&255)+"xx");let w=d+((p+(y?0:this.maria.offset)&255)<<8);m=" $"+S(w,4)+" "+m,m=["160A","?","320D","320A","160B","?","320B","320C"][A]+" "+m,e.push(m)}while(i<512);return e}},J=new Uint32Array(256);for(D=0;D<256;D++)J[D]=j(D);var D;var it=[{id:"sprites.dasm",name:"Sprites (ASM)",category:"Assembly"},{id:"wsync.c",name:"WSYNC",category:"CC65"},{id:"sprites.c",name:"Double Buffering"},{id:"scroll.c",name:"Scrolling"},{id:"test_conio.c78",name:"Conio Test",category:"cc7800"},{id:"example_small_sprites.c78",name:"Small Sprites"},{id:"example_vertical_scrolling.c78",name:"Vertical Scrolling"}],F=class extends ${constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"TIA",start:0,size:32,type:"io"},{name:"MARIA",start:32,size:32,type:"io"},{name:"RAM (6166 Block 0)",start:64,size:192,type:"ram"},{name:"RAM (6166 Block 1)",start:320,size:192,type:"ram"},{name:"PIA",start:640,size:24,type:"io"},{name:"RAM",start:6144,size:4096,type:"ram"},{name:"Cartridge ROM",start:16384,size:49146,type:"rom"},{name:"CPU Vectors",start:65530,size:6,type:"rom"}]}}}newMachine(){return new T}getPresets(){return it}getDefaultExtensions(){return[...super.getDefaultExtensions(),".cc7800"]}readAddress(t){return this.machine.readConst(t)}getROMExtension(){return".a78"}getDebugTree(){let t=super.getDebugTree();return t.display_list=this.machine.getDebugDisplayLists(),t}getToolForFilename(t){return t.endsWith(".cc7800")||t.endsWith(".c78")?"cc7800":V(t)}};O.atari7800=F; +//# sourceMappingURL=atari7800-XKMHPAB2.js.map diff --git a/gen/atari7800-K3O5HT4E.js.map b/gen/atari7800-XKMHPAB2.js.map similarity index 95% rename from gen/atari7800-K3O5HT4E.js.map rename to gen/atari7800-XKMHPAB2.js.map index 1d9a2967..318f1a4c 100644 --- a/gen/atari7800-K3O5HT4E.js.map +++ b/gen/atari7800-XKMHPAB2.js.map @@ -1,7 +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 } from \"../common/emu\";\nimport { gtia_ntsc_to_rgb } from \"./chips/gtia\";\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://atarihq.com/danb/files/7800vid.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.GP_A, INPT0+0, 0x80],\n [Keys.GP_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 writemode : number = 0;\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 writemode: this.writemode,\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 this.writemode = s.writemode|0;\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 const pix = this.pixels;\n pix.fill(this.regs[0x0]); // background color\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 indirect = (b1 & 0x20) != 0;\n dlofs += 5;\n this.cycles += 10;\n this.writemode = b1 & 0x80;\n } else {\n // direct mode\n var xpos = b3;\n var pal = b1 >> 5;\n var width = 32 - (b1 & 31);\n dlofs += 4;\n this.cycles += 8;\n }\n this.indirect = indirect;\n const gfxadr = b0 + (((b2 + (indirect?0:this.offset)) & 0xff) << 8);\n xpos *= 2;\n const ctrlreg = this.regs[0x1c];\n // gfx mode (readmode + writemode * 4)\n const grmode = (ctrlreg & 0x3) + (this.writemode ? 4 : 0);\n // kangaroo mode\n const kangaroo = (ctrlreg & 0x4) != 0;\n // double bytes?\n const dbl = indirect && (ctrlreg & 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 (grmode) {\n case 0:\t// 160A\n for (let j=0; j<4; j++) {\n let col = (data >> 6) & 3;\n if (col || kangaroo) {\n pix[xpos] = pix[xpos+1] = this.regs[(pal<<2) + col];\n }\n data <<= 2;\n xpos = (xpos + 2) & 0x1ff;\n }\n break;\n case 3:\t// 320A\n for (let j=0; j<8; j++) {\n let col = (data & 0x80) >> 6;\n if (col || kangaroo) {\n pix[xpos] = this.regs[(pal<<2) + col];\n }\n data <<= 1;\n xpos = (xpos + 1) & 0x1ff;\n }\n break;\n case 4: // 160B\n for (let j=0; j<2; j++) {\n let col = ((data >> 6) & 0b0011) + (data & 0b1100);\n if ((col & 3) || kangaroo) {\n pix[xpos] = pix[xpos+1] = pix[xpos+2] = pix[xpos+3] = this.regs[((pal&4)<<2) + col];\n }\n data <<= 2;\n xpos = (xpos + 2) & 0x1ff;\n }\n break;\n case 6: // 320B\n for (let j=0; j<4; j++) {\n let col = ((data & 0x80) >> 6) | ((data & 0x08) >> 3);\n if (col || kangaroo) {\n pix[xpos] = this.regs[(pal<<2) + col];\n }\n data <<= 1;\n xpos = (xpos + 1) & 0x1ff;\n }\n break;\n case 2: // 320D\n for (let j=0; j<8; j++) {\n let col = ((data & 0x80) >> 6);\n col += (j & 1) ? (pal & 1) : ((pal >> 1) & 1);\n if (col || kangaroo) {\n pix[xpos] = this.regs[(pal<<2) + col];\n }\n data <<= 1;\n xpos = (xpos + 1) & 0x1ff;\n }\n break;\n case 7: // 320C\n let data0 = data;\n for (let j=0; j<4; j++) {\n if (j == 2) data0 <<= 2;\n let col = (data & 0x80) >> 6;\n let ppal = (pal & 4) | ((data0 >> 2) & 3);\n if (col || kangaroo) {\n pix[xpos] = this.regs[(ppal<<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.lastFrameCycles = -1;\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 const ctrlreg = this.maria.regs[0x1c];\n const colorkill = (ctrlreg & 0x80) != 0;\n const mask = colorkill ? 0x0f : 0xff;\n for (var i=0; i<320; i++) {\n idata[iofs++] = COLORS_RGBA[this.maria.pixels[i] & mask];\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 this.lastFrameCycles = mc;\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 return steps;\n }\n\n // TODO: doesn't work when breakpoint\n getRasterX() { return (this.lastFrameCycles + colorClocksPerLine) % colorClocksPerLine; }\n\n getRasterY() { return this.scanline; }\n\n getRasterCanvasPosition() {\n return { x: this.getRasterX(), y: this.getRasterY() };\n }\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.setPIATimer(0, 0); // TODO?\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 const ctrlreg = this.maria.regs[0x1c];\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 let writemode;\n const grmode = (ctrlreg & 0x3) + ((b1 & 0x80) ? 4 : 0);\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 indirect = (b1 & 0x20) != 0;\n writemode = b1 & 0x80;\n dlofs += 5;\n } else {\n // direct mode\n var xpos = b3;\n var pal = b1 >> 5;\n var width = 32 - (b1 & 31);\n dlofs += 4;\n }\n description += \"X=\" + xpos + \" W=\" + width + \" P=\" + pal;\n if (writemode) description += \" WM=1\";\n if (indirect) description += \" CHR=$\" + hex((this.maria.regs[0x14] + this.maria.offset) & 0xff) + \"xx\";\n let gfxadr = b0 + (((b2 + (indirect?0:this.maria.offset)) & 0xff) << 8);\n description = \" $\" + hex(gfxadr,4) + \" \" + description;\n description = [\"160A\",\"?\",\"320D\",\"320A\",\"160B\",\"?\",\"320B\",\"320C\"][grmode] + ' ' + 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, getToolForFilename_6502 } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\n\nvar Atari7800_PRESETS = [\n {id:'sprites.dasm', name:'Sprites (ASM)', category:'Assembler'},\n\n {id:'wsync.c', name:'WSYNC', category:'CC65'},\n {id:'sprites.c', name:'Double Buffering'},\n {id:'scroll.c', name:'Scrolling'},\n\n {id:'test_conio.c78', name:'Conio Test', category:'cc7800'},\n {id:'example_small_sprites.c78', name:'Small Sprites'},\n {id:'example_vertical_scrolling.c78', name:'Vertical Scrolling'},\n];\n\nclass Atari7800Platform extends Base6502MachinePlatform implements Platform {\n\n newMachine() { return new Atari7800(); }\n getPresets() { return Atari7800_PRESETS; }\n getDefaultExtensions() { return [...super.getDefaultExtensions(), \".cc7800\"]; }\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-6,type:'rom'},\n {name:'CPU Vectors',start:0xfffa,size:0x6,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 getToolForFilename(filename: string) {\n if (filename.endsWith(\".cc7800\")) return \"cc7800\";\n if (filename.endsWith(\".c78\")) return \"cc7800\";\n return getToolForFilename_6502(filename);\n }\n}\n\n///\n\nPLATFORMS['atari7800'] = Atari7800Platform;\n"], - "mappings": "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", + "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 } from \"../common/emu\";\nimport { gtia_ntsc_to_rgb } from \"./chips/gtia\";\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://atarihq.com/danb/files/7800vid.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.GP_A, INPT0+0, 0x80],\n [Keys.GP_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 writemode : number = 0;\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 writemode: this.writemode,\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 this.writemode = s.writemode|0;\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 const pix = this.pixels;\n pix.fill(this.regs[0x0]); // background color\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 indirect = (b1 & 0x20) != 0;\n dlofs += 5;\n this.cycles += 10;\n this.writemode = b1 & 0x80;\n } else {\n // direct mode\n var xpos = b3;\n var pal = b1 >> 5;\n var width = 32 - (b1 & 31);\n dlofs += 4;\n this.cycles += 8;\n }\n this.indirect = indirect;\n const gfxadr = b0 + (((b2 + (indirect?0:this.offset)) & 0xff) << 8);\n xpos *= 2;\n const ctrlreg = this.regs[0x1c];\n // gfx mode (readmode + writemode * 4)\n const grmode = (ctrlreg & 0x3) + (this.writemode ? 4 : 0);\n // kangaroo mode\n const kangaroo = (ctrlreg & 0x4) != 0;\n // double bytes?\n const dbl = indirect && (ctrlreg & 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 (grmode) {\n case 0:\t// 160A\n for (let j=0; j<4; j++) {\n let col = (data >> 6) & 3;\n if (col || kangaroo) {\n pix[xpos] = pix[xpos+1] = this.regs[(pal<<2) + col];\n }\n data <<= 2;\n xpos = (xpos + 2) & 0x1ff;\n }\n break;\n case 3:\t// 320A\n for (let j=0; j<8; j++) {\n let col = (data & 0x80) >> 6;\n if (col || kangaroo) {\n pix[xpos] = this.regs[(pal<<2) + col];\n }\n data <<= 1;\n xpos = (xpos + 1) & 0x1ff;\n }\n break;\n case 4: // 160B\n for (let j=0; j<2; j++) {\n let col = ((data >> 6) & 0b0011) + (data & 0b1100);\n if ((col & 3) || kangaroo) {\n pix[xpos] = pix[xpos+1] = pix[xpos+2] = pix[xpos+3] = this.regs[((pal&4)<<2) + col];\n }\n data <<= 2;\n xpos = (xpos + 2) & 0x1ff;\n }\n break;\n case 6: // 320B\n for (let j=0; j<4; j++) {\n let col = ((data & 0x80) >> 6) | ((data & 0x08) >> 3);\n if (col || kangaroo) {\n pix[xpos] = this.regs[(pal<<2) + col];\n }\n data <<= 1;\n xpos = (xpos + 1) & 0x1ff;\n }\n break;\n case 2: // 320D\n for (let j=0; j<8; j++) {\n let col = ((data & 0x80) >> 6);\n col += (j & 1) ? (pal & 1) : ((pal >> 1) & 1);\n if (col || kangaroo) {\n pix[xpos] = this.regs[(pal<<2) + col];\n }\n data <<= 1;\n xpos = (xpos + 1) & 0x1ff;\n }\n break;\n case 7: // 320C\n let data0 = data;\n for (let j=0; j<4; j++) {\n if (j == 2) data0 <<= 2;\n let col = (data & 0x80) >> 6;\n let ppal = (pal & 4) | ((data0 >> 2) & 3);\n if (col || kangaroo) {\n pix[xpos] = this.regs[(ppal<<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.lastFrameCycles = -1;\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 const ctrlreg = this.maria.regs[0x1c];\n const colorkill = (ctrlreg & 0x80) != 0;\n const mask = colorkill ? 0x0f : 0xff;\n for (var i=0; i<320; i++) {\n idata[iofs++] = COLORS_RGBA[this.maria.pixels[i] & mask];\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 this.lastFrameCycles = mc;\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 return steps;\n }\n\n // TODO: doesn't work when breakpoint\n getRasterX() { return (this.lastFrameCycles + colorClocksPerLine) % colorClocksPerLine; }\n\n getRasterY() { return this.scanline; }\n\n getRasterCanvasPosition() {\n return { x: this.getRasterX(), y: this.getRasterY() };\n }\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.setPIATimer(0, 0); // TODO?\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 const ctrlreg = this.maria.regs[0x1c];\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 let writemode;\n const grmode = (ctrlreg & 0x3) + ((b1 & 0x80) ? 4 : 0);\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 indirect = (b1 & 0x20) != 0;\n writemode = b1 & 0x80;\n dlofs += 5;\n } else {\n // direct mode\n var xpos = b3;\n var pal = b1 >> 5;\n var width = 32 - (b1 & 31);\n dlofs += 4;\n }\n description += \"X=\" + xpos + \" W=\" + width + \" P=\" + pal;\n if (writemode) description += \" WM=1\";\n if (indirect) description += \" CHR=$\" + hex((this.maria.regs[0x14] + this.maria.offset) & 0xff) + \"xx\";\n let gfxadr = b0 + (((b2 + (indirect?0:this.maria.offset)) & 0xff) << 8);\n description = \" $\" + hex(gfxadr,4) + \" \" + description;\n description = [\"160A\",\"?\",\"320D\",\"320A\",\"160B\",\"?\",\"320B\",\"320C\"][grmode] + ' ' + 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, getToolForFilename_6502 } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\n\nvar Atari7800_PRESETS = [\n {id:'sprites.dasm', name:'Sprites (ASM)', category:'Assembly'},\n\n {id:'wsync.c', name:'WSYNC', category:'CC65'},\n {id:'sprites.c', name:'Double Buffering'},\n {id:'scroll.c', name:'Scrolling'},\n\n {id:'test_conio.c78', name:'Conio Test', category:'cc7800'},\n {id:'example_small_sprites.c78', name:'Small Sprites'},\n {id:'example_vertical_scrolling.c78', name:'Vertical Scrolling'},\n];\n\nclass Atari7800Platform extends Base6502MachinePlatform implements Platform {\n\n newMachine() { return new Atari7800(); }\n getPresets() { return Atari7800_PRESETS; }\n getDefaultExtensions() { return [...super.getDefaultExtensions(), \".cc7800\"]; }\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-6,type:'rom'},\n {name:'CPU Vectors',start:0xfffa,size:0x6,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 getToolForFilename(filename: string) {\n if (filename.endsWith(\".cc7800\")) return \"cc7800\";\n if (filename.endsWith(\".c78\")) return \"cc7800\";\n return getToolForFilename_6502(filename);\n }\n}\n\n///\n\nPLATFORMS['atari7800'] = Atari7800Platform;\n"], + "mappings": "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", "names": ["SWCHA", "SWCHB", "INPT0", "Atari7800_KEYCODE_MAP", "makeKeycodeMap", "Keys", "linesPerFrame", "numVisibleLines", "colorClocksPerLine", "colorClocksPreDMA", "colorClocksShutdownOther", "colorClocksShutdownLast", "audioOversample", "audioSampleRate", "TIA", "a", "v", "s", "i", "state", "dumpRAM", "MARIA", "b", "bus", "x", "pix", "dlhi", "dlofs", "b0", "b1", "b2", "b3", "indirect", "pal", "width", "xpos", "gfxadr", "ctrlreg", "grmode", "kangaroo", "dbl", "data", "indadr", "j", "col", "data0", "ppal", "hex", "Atari7800", "BasicMachine", "MOS6502", "newAddressDecoder", "newKeyboardHandler", "Atari7800_KEYCODE_MAP", "POKEYDeviceChannel", "TssChannelAdapter", "oldprobe", "shift", "clk", "clocks", "trap", "idata", "iofs", "rgb", "mc", "fc", "steps", "sl", "visible", "dmaClocks", "mask", "COLORS_RGBA", "padBytes", "SWCHA", "SWCHB", "addr", "category", "display_lists", "dll_ofs", "y", "offset", "h16", "h8", "dlstart", "dli", "title", "display_list", "description", "writemode", "gtia_ntsc_to_rgb", "Atari7800_PRESETS", "Atari7800Platform", "Base6502MachinePlatform", "Atari7800", "a", "tree", "filename", "getToolForFilename_6502", "PLATFORMS"] } diff --git a/gen/atari8-G2ROI5V7.js b/gen/atari8-NPXQGTKX.js similarity index 75% rename from gen/atari8-G2ROI5V7.js rename to gen/atari8-NPXQGTKX.js index b96de2a7..cd9c57b7 100644 --- a/gen/atari8-G2ROI5V7.js +++ b/gen/atari8-NPXQGTKX.js @@ -1,7 +1,7 @@ -import{a as nt}from"./chunk-WIKZL6VD.js";import{b as ht,c as ot,d as F}from"./chunk-LZK7RTFU.js";import{A as rt,J as at,g as $,k as tt,m as et,r as st,x as it}from"./chunk-2XSLQJUY.js";import{K as D,V as O,W as i,X as Z,Z as J,a as U,aa as T,g as m,r as A}from"./chunk-TYDI7JZQ.js";import"./chunk-VSC4MAII.js";var Dt=[0,25,17,9],Ot=[0,89,97,105],b=0,Tt=1,Y=2,B=3,Mt=4,kt=5,vt=7,Ct=9,C=10,Lt=11,Pt=12,Kt=13,lt=14,Vt=15,L=15;var wt=13,Nt=106,Ut=105,H=[0,0,8,10,8,16,8,16,8,4,4,2,1,2,1,1],Ft=[0,0,2,2,2,2,4,4,8,4,4,4,4,2,2,2],Yt=[0,0,0,0,0,1,0,1,0,0,2,1,0,0,0,0],ct=[0,0,1,1,2,2,2,2,8,4,4,2,2,2,2,1],M=class{constructor(e,t){this.regs=new Uint8Array(16);this.left=-1;this.right=-1;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=e,this.nmi=t}reset(){this.regs.fill(0),this.regs[lt]=0,this.regs[L]=127,this.regs[Pt]=0,this.regs[Kt]=255,this.setReg(b,0),this.h=this.v=0,this.startaddr=this.scanaddr=0,this.dmaclock=0}saveState(){return A(0,{},this)}loadState(e){A(0,this,e),this.setReg(b,e.regs[b])}static stateToLongString(e){let t="";return t+="H: "+U(e.h,3)+" V: "+U(e.v,3)+` +import{a as nt}from"./chunk-WIKZL6VD.js";import{b as ht,c as ot,d as Y}from"./chunk-LZK7RTFU.js";import{A as rt,J as at,g as $,k as tt,m as et,r as st,x as it}from"./chunk-2XSLQJUY.js";import{K as D,V as O,W as i,X as Z,Z as J,a as U,aa as T,g as m,r as A}from"./chunk-TYDI7JZQ.js";import"./chunk-VSC4MAII.js";var Dt=[0,25,17,9],Ot=[0,89,97,105],b=0,Tt=1,F=2,H=3,kt=4,vt=5,Mt=7,Ct=9,C=10,Lt=11,Pt=12,Kt=13,lt=14,Vt=15,L=15;var wt=13,Nt=106,Ut=105,Q=[0,0,8,10,8,16,8,16,8,4,4,2,1,2,1,1],Yt=[0,0,2,2,2,2,4,4,8,4,4,4,4,2,2,2],Ft=[0,0,0,0,0,1,0,1,0,0,2,1,0,0,0,0],ct=[0,0,1,1,2,2,2,2,8,4,4,2,2,2,2,1],k=class{constructor(e,t){this.regs=new Uint8Array(16);this.left=-1;this.right=-1;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=e,this.nmi=t}reset(){this.regs.fill(0),this.regs[lt]=0,this.regs[L]=127,this.regs[Pt]=0,this.regs[Kt]=255,this.setReg(b,0),this.h=this.v=0,this.startaddr=this.scanaddr=0,this.dmaclock=0}saveState(){return A(0,{},this)}loadState(e){A(0,this,e),this.setReg(b,e.regs[b])}static stateToLongString(e){let t="";return t+="H: "+U(e.h,3)+" V: "+U(e.v,3)+` `,t+="DLIOp: "+m(e.dliop,2)+" Lines: "+e.yofs+"/"+e.linesleft,t+=" DMA "+(e.dma_enabled?"ON ":"off"),e.dma_enabled&&(t+=" idx "+e.dmaidx+" clk "+m(e.dmaclock)),t+=` `,t+="Addr: "+m(e.scanaddr,4)+` -`,t+=O(e.regs,0,16).replace("$00","Regs"),t}setReg(e,t){switch(e){case C:this.regs[C]=255;return;case Vt:this.regs[L]=31;return}this.regs[e]=t}readReg(e){switch(e){case L:return this.regs[e];case Lt: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=H[this.mode],this.period=Ft[this.mode],this.jmp?(this.regs[Y]=this.dlarg_lo,this.regs[B]=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 e=this.regs[b]&3,t=this.dliop&16?(this.regs[Mt]&15)>>1:0;this.dliop&16&&e<3&&e++,this.left=Dt[e]+t,this.right=Ot[e]+t;let s=this.regs[kt]&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(e){this.regs[L]=e|31,this.regs[lt]&e&&this.nmi()}getDlistAddr(){return this.regs[Y]+(this.regs[B]<<8)}nextInsn(){let e=this.getDlistAddr(),t=this.read(e);return e=e+1&1023|e&-1024,this.regs[Y]=e&255,this.regs[B]=e>>8,t}nextScreen(){let e=this.read(this.scanaddr);return this.incScanAddr(),e}incScanAddr(){this.scanaddr=this.scanaddr+1&4095|this.scanaddr&-4096}dlDMAEnabled(){return this.regs[b]&32}isVisibleScanline(){return this.v>=8&&this.v<248}isPlayfieldDMAEnabled(){return this.dma_enabled&&!this.linesleft}isPlayerDMAEnabled(){return this.regs[b]&8}isMissileDMAEnabled(){return this.regs[b]&12}isWSYNC(){return this.regs[C]!=0}clockPulse(){let e=this.isWSYNC();if(!this.isVisibleScanline())this.doVBlank();else{switch(this.h){case 0:this.isMissileDMAEnabled()&&(this.doPlayerMissileDMA(3),e=!0);break;case 1:if(this.isPlayfieldDMAEnabled()){let t=this.nextInsn();this.jmp=(t&-65)==1,this.lms=(t&64)!=0&&(t&15)!=0,this.mode=t&15,this.dliop=t,this.yofs=0,this.isfirstline=!0,e=!0}break;case 2:case 3:case 4:case 5:this.isPlayerDMAEnabled()&&(this.doPlayerMissileDMA(this.h+2),e=!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()),e=!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 t=this.h<=Ut;this.dmaclock=this.dmaclock<<1&511,this.dmaclock&1<=8&&this.incScanAddr(),e=t),this.output=this.h>=this.left+3&&this.h<=this.right+2?4:0}}return(this.hNt)&&(this.output=2),this.incHorizCounter(),!e&&this.dramrefresh&&(this.read(0),this.dramrefresh=!1,e=!0),e}incHorizCounter(){switch(this.h){case 25:case 29:case 33:case 37:case 41:case 45:case 49:case 53:case 57: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(e){let t=this.regs[b]&16,s=this.regs[vt]<<8;t?(s&=63488,s|=e<<8,s|=this.v&255):(s&=64512,s|=e<<7,s|=this.v>>1),this.read(s)}readBitmapData(){let e=this.mode;if(e<8){let t=this.ch,s=this.yofs>>Yt[this.mode],r=s&7,n=this.regs[Ct];(e&14)==6?(t&=63,n&=254):(t&=127,n&=252);let h=(t<<3)+(n<<8);if((e&14)==2){let f=this.regs[Tt],l=e==3&&(t&96)==96;f&4?this.pfbyte=this.read(h+(r^7)):this.pfbyte=this.read(h+r),l&&s<2&&(this.pfbyte=0),!l&&s>7&&(this.pfbyte=0),this.ch&128&&(f&1&&(this.pfbyte=0),f&2&&(this.pfbyte^=255))}else this.pfbyte=this.read(h+r)}else this.pfbyte=this.nextScreen()}shiftout(){if(this.output==4)switch(this.mode){case 2:case 3:case 15:{let e=this.pfbyte>>7&1;return this.pfbyte<<=1,e?8:6}case 6:case 7:{let e=this.pfbyte>>7&1;return this.pfbyte<<=1,e?(this.ch>>6)+4:0}case 9:case 11:case 12:{let e=this.pfbyte>>7&1;return this.pfbyte<<=1,e?4:0}case 4:case 5:{let e=this.pfbyte>>6&3;return this.pfbyte<<=2,this.ch&128?[0,4,5,7][e]:[0,4,5,6][e]}case 8:case 10:case 13:case 14:{let e=this.pfbyte>>6&3;return this.pfbyte<<=2,[0,4,5,6][e]}}return this.output}};var o=0;var Bt=2;var ft=4;var dt=6;var g=8,Ht=9,Qt=10,zt=11,Xt=13,Q=14,E=15;var qt=8,Wt=9,Gt=10,jt=13,S=14,P=15;var xt=128,ut=64,Zt=32,mt=16,gt=8;var Jt=1,_t=28,$t=114;var pt=511,bt=131071,x=0,u=1,_=2,c=3,y=114,te=15;var ee=8;var z,K;function se(){z=new Uint8Array(511),K=new Uint8Array(16385);let a=511;for(let e=0;e<511;e++)a=(((a>>5^a)&1)<<8)+(a>>1),z[e]=a;a=131071;for(let e=0;e<16385;e++)a=(((a>>5^a)&255)<<9)+(a>>8),K[e]=a>>1}var k=class{constructor(e,t){this.irq=e;this.antic_xpos=t;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 A(0,{},this)}loadState(e){A(0,this,e)}init(){this.readregs.fill(255),this.readregs[P]=239,this.basemult=_t,this.pot_inputs.fill(128),se()}read(e){let t=this.readregs[e];switch(e&=15,e){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:return t=this.pot_inputs[e],t>3;s&=7,t=(K[r]>>s)+(K[r+1]<<8-s)}}break}return t&255}write(e,t){switch(e&=15,this.regs[e]=t,e){case g:t&Jt?this.basemult=$t:this.basemult=_t,this.update_counter(1<=3?(this.readregs[S]|=8,this.DELAYED_XMTDONE_IRQ=2*this.DELAYED_SEROUT_IRQ-2):(this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0));break;case Ht:this.divnirq[x]=this.divnmax[x],this.divnirq[u]=this.divnmax[u],this.divnirq[_]=this.divnmax[_],this.divnirq[c]=this.divnmax[c];break;case E:t&4&&(this.pot_scanline=228),(t&3)==0&&(this.DELAYED_SERIN_IRQ=0,this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0);break}this.snd_update(e)}update_counter(e){e&1<0&&--this.DELAYED_SERIN_IRQ==0&&(this.readregs[jt]=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(c,4))}advanceIRQTimer(e,t){(this.divnirq[e]-=y)<0&&(this.divnirq[e]+=this.divnmax[e],this.generateIRQ(t))}generateIRQ(e){this.regs[Q]&e&&(this.irq(),this.readregs[S]&=~e)}static stateToLongString(e){let t="";return t+=`Write Registers: +`,t+=O(e.regs,0,16).replace("$00","Regs"),t}setReg(e,t){switch(e){case C:this.regs[C]=255;return;case Vt:this.regs[L]=31;return}this.regs[e]=t}readReg(e){switch(e){case L:return this.regs[e];case Lt: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=Q[this.mode],this.period=Yt[this.mode],this.jmp?(this.regs[F]=this.dlarg_lo,this.regs[H]=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 e=this.regs[b]&3,t=this.dliop&16?(this.regs[kt]&15)>>1:0;this.dliop&16&&e<3&&e++,this.left=Dt[e]+t,this.right=Ot[e]+t;let s=this.regs[vt]&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(e){this.regs[L]=e|31,this.regs[lt]&e&&this.nmi()}getDlistAddr(){return this.regs[F]+(this.regs[H]<<8)}nextInsn(){let e=this.getDlistAddr(),t=this.read(e);return e=e+1&1023|e&-1024,this.regs[F]=e&255,this.regs[H]=e>>8,t}nextScreen(){let e=this.read(this.scanaddr);return this.incScanAddr(),e}incScanAddr(){this.scanaddr=this.scanaddr+1&4095|this.scanaddr&-4096}dlDMAEnabled(){return this.regs[b]&32}isVisibleScanline(){return this.v>=8&&this.v<248}isPlayfieldDMAEnabled(){return this.dma_enabled&&!this.linesleft}isPlayerDMAEnabled(){return this.regs[b]&8}isMissileDMAEnabled(){return this.regs[b]&12}isWSYNC(){return this.regs[C]!=0}clockPulse(){let e=this.isWSYNC();if(!this.isVisibleScanline())this.doVBlank();else{switch(this.h){case 0:this.isMissileDMAEnabled()&&(this.doPlayerMissileDMA(3),e=!0);break;case 1:if(this.isPlayfieldDMAEnabled()){let t=this.nextInsn();this.jmp=(t&-65)==1,this.lms=(t&64)!=0&&(t&15)!=0,this.mode=t&15,this.dliop=t,this.yofs=0,this.isfirstline=!0,e=!0}break;case 2:case 3:case 4:case 5:this.isPlayerDMAEnabled()&&(this.doPlayerMissileDMA(this.h+2),e=!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()),e=!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 t=this.h<=Ut;this.dmaclock=this.dmaclock<<1&511,this.dmaclock&1<=8&&this.incScanAddr(),e=t),this.output=this.h>=this.left+3&&this.h<=this.right+2?4:0}}return(this.hNt)&&(this.output=2),this.incHorizCounter(),!e&&this.dramrefresh&&(this.read(0),this.dramrefresh=!1,e=!0),e}incHorizCounter(){switch(this.h){case 25:case 29:case 33:case 37:case 41:case 45:case 49:case 53:case 57: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(e){let t=this.regs[b]&16,s=this.regs[Mt]<<8;t?(s&=63488,s|=e<<8,s|=this.v&255):(s&=64512,s|=e<<7,s|=this.v>>1),this.read(s)}readBitmapData(){let e=this.mode;if(e<8){let t=this.ch,s=this.yofs>>Ft[this.mode],r=s&7,n=this.regs[Ct];(e&14)==6?(t&=63,n&=254):(t&=127,n&=252);let h=(t<<3)+(n<<8);if((e&14)==2){let f=this.regs[Tt],l=e==3&&(t&96)==96;f&4?this.pfbyte=this.read(h+(r^7)):this.pfbyte=this.read(h+r),l&&s<2&&(this.pfbyte=0),!l&&s>7&&(this.pfbyte=0),this.ch&128&&(f&1&&(this.pfbyte=0),f&2&&(this.pfbyte^=255))}else this.pfbyte=this.read(h+r)}else this.pfbyte=this.nextScreen()}shiftout(){if(this.output==4)switch(this.mode){case 2:case 3:case 15:{let e=this.pfbyte>>7&1;return this.pfbyte<<=1,e?8:6}case 6:case 7:{let e=this.pfbyte>>7&1;return this.pfbyte<<=1,e?(this.ch>>6)+4:0}case 9:case 11:case 12:{let e=this.pfbyte>>7&1;return this.pfbyte<<=1,e?4:0}case 4:case 5:{let e=this.pfbyte>>6&3;return this.pfbyte<<=2,this.ch&128?[0,4,5,7][e]:[0,4,5,6][e]}case 8:case 10:case 13:case 14:{let e=this.pfbyte>>6&3;return this.pfbyte<<=2,[0,4,5,6][e]}}return this.output}};var o=0;var Ht=2;var ft=4;var dt=6;var g=8,Qt=9,Bt=10,zt=11,Xt=13,B=14,E=15;var qt=8,Wt=9,Gt=10,jt=13,S=14,P=15;var xt=128,ut=64,Zt=32,mt=16,gt=8;var Jt=1,_t=28,$t=114;var pt=511,bt=131071,x=0,u=1,_=2,c=3,y=114,te=15;var ee=8;var z,K;function se(){z=new Uint8Array(511),K=new Uint8Array(16385);let a=511;for(let e=0;e<511;e++)a=(((a>>5^a)&1)<<8)+(a>>1),z[e]=a;a=131071;for(let e=0;e<16385;e++)a=(((a>>5^a)&255)<<9)+(a>>8),K[e]=a>>1}var v=class{constructor(e,t){this.irq=e;this.antic_xpos=t;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 A(0,{},this)}loadState(e){A(0,this,e)}init(){this.readregs.fill(255),this.readregs[P]=239,this.basemult=_t,this.pot_inputs.fill(128),se()}read(e){let t=this.readregs[e];switch(e&=15,e){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:return t=this.pot_inputs[e],t>3;s&=7,t=(K[r]>>s)+(K[r+1]<<8-s)}}break}return t&255}write(e,t){switch(e&=15,this.regs[e]=t,e){case g:t&Jt?this.basemult=$t:this.basemult=_t,this.update_counter(1<=3?(this.readregs[S]|=8,this.DELAYED_XMTDONE_IRQ=2*this.DELAYED_SEROUT_IRQ-2):(this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0));break;case Qt:this.divnirq[x]=this.divnmax[x],this.divnirq[u]=this.divnmax[u],this.divnirq[_]=this.divnmax[_],this.divnirq[c]=this.divnmax[c];break;case E:t&4&&(this.pot_scanline=228),(t&3)==0&&(this.DELAYED_SERIN_IRQ=0,this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0);break}this.snd_update(e)}update_counter(e){e&1<0&&--this.DELAYED_SERIN_IRQ==0&&(this.readregs[jt]=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(c,4))}advanceIRQTimer(e,t){(this.divnirq[e]-=y)<0&&(this.divnirq[e]+=this.divnmax[e],this.generateIRQ(t))}generateIRQ(e){this.regs[B]&e&&(this.irq(),this.readregs[S]&=~e)}static stateToLongString(e){let t="";return t+=`Write Registers: `,t+=O(e.regs,0,16),t+=`Read Registers: -`,t+=O(e.readregs,0,16),t}CASSETTE_IOLineStatus(){return 0}siocheck(){return((this.regs[o+_]==40||this.regs[o+_]==16||this.regs[o+_]==8||this.regs[o+_]==10)&&this.regs[o+c]==0||(this.regs[E]&120)==40)&&(this.regs[g]&40)==40}SIO_PutByte(e){console.log("SIO put byte",e)}SIO_GetByte(){return 0}};var ie=[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],re=J([[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]]),v=class extends st{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=76;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 et,this.ram=new Uint8Array(65536),this.bios=new Uint8Array(10240),this.bus=this.newBus(),this.connectCPUMemoryBus(this.bus),this.antic=new M(this.readDMA.bind(this),this.antic_nmi.bind(this)),this.gtia=new F,this.irq_pokey=new k(this.pokey_irq.bind(this),()=>this.antic.h),this.audio_pokey=$(1),this.audioadapter=new tt(this.audio_pokey.pokey1,this.audioOversample,this.sampleRate),this.handler=Z(this.inputs,re,this.getKeyboardFunction(),!0)}newBus(){return{read:T([[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:T([[0,49146,65535,(t,s)=>{this.ram[t]=s}],[49147,49151,65535,(t,s)=>{this.ram[t]=s,this.initCartA()}],[53248,53503,31,(t,s)=>{this.gtia.setReg(t,s)}],[53760,54015,15,(t,s)=>{this.writePokey(t,s)}],[54272,54527,15,(t,s)=>{this.antic.setReg(t,s)}],[54528,54783,255,(t,s)=>{this.writeMapper(t,s)}]])}}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 s=this.bus.read(t);return this.probe.logDMARead(t,s),this.lastdmabyte=s,s}readConst(t){return t<53248||t>=54528?this.bus.read(t):255}write(t,s){this.bus.write(t,s)}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,s){this.audio_pokey.pokey1.setRegister(t,s),this.irq_pokey.write(t,s)}startScanline(){this.gtia.sync();for(let t=0;t<4;t++)this.gtia.readregs[ht+t]=~this.inputs[2]>>t&1;this.gtia.readregs[ot]=~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},r=()=>{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 n=ct[this.antic.mode],h=this.antic.h&1;return(n<8||h)&&(this.gtia.an=this.antic.shiftout()),s(),n==1&&(this.gtia.an=this.antic.shiftout()),r(),n<=2&&(this.gtia.an=this.antic.shiftout()),s(),n==1&&(this.gtia.an=this.antic.shiftout()),r(),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}}getRasterY(){return this.antic.v}getRasterX(){return this.antic.h}getRasterCanvasPosition(){return{x:this.antic.h*4-this.firstVisibleClock,y:this.antic.v-this.firstVisibleScanline}}getDebugCategories(){return["CPU","Stack","ANTIC","GTIA","POKEY"]}getDebugInfo(t,s){switch(t){case"ANTIC":return M.stateToLongString(s.antic);case"GTIA":return F.stateToLongString(s.gtia);case"POKEY":return k.stateToLongString(s.pokey)}}getKeyboardFunction(){return(t,s,r,n)=>{if(!this.keyboard_active)return!1;if(n&65){var h=ie;if(s==i.VK_F9.c)return this.irq_pokey.generateIRQ(128),!0;for(var f=0;f>8}if(s>t.length)throw new Error("Bad .XEX file format")}h>=0&&(r[n++]=169,r[n++]=160,r[n++]=141,r[n++]=255,r[n++]=213,r[n++]=76,r[n++]=h&255,r[n++]=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,s){this.irq_pokey.pot_inputs[t]=255-s}getDebugDisplayList(){let t=this.antic.getDlistAddr(),s=()=>{let h=this.read(t);return t=t+1&1023|t&-1024,h},r=[],n=0;for(let h=0;h<256&&n<240;h++){let f=t,l=s(),p=l&15,d="",I=!1,R;if(p==0)R=(l>>4&7)+1,d+=" blank="+R;else{R=H[p],d+=" mode="+m(p),d+=" lines="+R,I=(l&-65)==1;let j=(l&64)!=0&&(l&15)!=0;if(l&16&&(d+=" HSCROL"),l&32&&(d+=" VSCROL"),l&128&&(d+=" DLI"),I&&l&64?d+=" JVB":I?d+=" JMP":j&&(d+=" LMS"),I||j){let It=s(),Rt=s();d+=" $"+m(Rt)+m(It)}}if(r.push("$"+m(f)+" y="+n+" "+d),I)break;n+=R}return r}},V=class extends v{newBus(){return{read:T([[0,16383,65535,e=>this.ram[e]],[16384,49151,65535,e=>this.rom?this.rom[e-16384]:0],[49152,53247,31,e=>this.gtia.readReg(e)],[54272,54527,15,e=>this.antic.readReg(e)],[59392,61439,15,e=>this.readPokey(e)],[63488,65535,2047,e=>this.bios[e]]]),write:T([[0,16383,65535,(e,t)=>{this.ram[e]=t}],[49152,53247,31,(e,t)=>{this.gtia.setReg(e,t)}],[54272,54527,15,(e,t)=>{this.antic.setReg(e,t)}],[59392,61439,15,(e,t)=>{this.writePokey(e,t)}]])}}};var G=[{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)"}],yt=G.concat([{id:"testmusic.c",name:"POKEY Music (C)"},{id:"sieve.bas",name:"Benchmark (FastBasic)",category:"FastBasic"},{id:"pmtest.bas",name:"Sprites Test (FastBasic)"},{id:"dli.bas",name:"DLI Test (FastBasic)"},{id:"joyas.bas",name:"Match-3 Game (FastBasic)"}]),Et={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 At(a){return a.endsWith(".bas")||a.endsWith(".fb")||a.endsWith(".fbi")?"fastbasic":it(a)}var w=class extends at{constructor(){super(...arguments);this.getToolForFilename=At;this.showHelp=St;this.getROMExtension=ae;this.biosPath="res/altirra/kernel.rom"}newMachine(){return new v}getPresets(){return yt}getDefaultExtensions(){return[...super.getDefaultExtensions(),".bas"]}readAddress(t){return this.machine.readConst(t)}getMemoryMap(){return Et}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 s=await t.arrayBuffer();return new Uint8Array(s)}else throw new Error("could not load BIOS file")}getDebugTree(){let t=super.getDebugTree();return t.display_list=this.machine.getDebugDisplayList(),t}},X=class extends w{constructor(){super(...arguments);this.biosPath="res/altirra/superkernel.rom"}getPresets(){return G}newMachine(){return new V}},N=class extends nt{constructor(){super(...arguments);this.getToolForFilename=At;this.getOpcodeMetadata=rt;this.showHelp=St}getPresets(){return G}getDefaultExtensions(){return[".c",".bas",".cpp",".acme",".xa",".ca65",".dasm",".ecs",".wiz"]}},q=class extends N{constructor(){super(...arguments);this.getMemoryMap=function(){return Et}}getPresets(){return yt}loadROM(t,s){this.started?(this.loadROMFile(s),this.loadRegion(":cartleft:cart:rom",s)):this.startModule(this.mainElement,{jsfile:"mame8bitws.js",biosfile:"a800xl.zip",cfgfile:"a800xl.cfg",driver:"a800xl",width:336*2,height:450,romfn:"/emulator/cart.rom",romdata:new Uint8Array(s),romsize:8192,preInit:function(r){}})}start(){}},W=class extends N{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,s){this.started?(this.loadROMFile(s),this.loadRegion(":cartleft:cart:rom",s)):this.startModule(this.mainElement,{jsfile:"mame8bitws.js",biosfile:"a5200/5200.rom",cfgfile:"a5200.cfg",driver:"a5200",width:336*2,height:450,romfn:"/emulator/cart.rom",romdata:new Uint8Array(s),romsize:32768,preInit:function(r){}})}start(){}};function ae(a){return a==null?".bin":a[0]==255&&a[1]==255?".xex":".rom"}function St(){return"https://8bitworkshop.com/docs/platforms/atari8/"}D["atari8-800.xlmame"]=q;D["atari8-5200.mame"]=W;D["atari8-800"]=w;D["atari8-5200"]=X; -//# sourceMappingURL=atari8-G2ROI5V7.js.map +`,t+=O(e.readregs,0,16),t}CASSETTE_IOLineStatus(){return 0}siocheck(){return((this.regs[o+_]==40||this.regs[o+_]==16||this.regs[o+_]==8||this.regs[o+_]==10)&&this.regs[o+c]==0||(this.regs[E]&120)==40)&&(this.regs[g]&40)==40}SIO_PutByte(e){console.log("SIO put byte",e)}SIO_GetByte(){return 0}};var ie=[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],re=J([[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]]),M=class extends st{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=76;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 et,this.ram=new Uint8Array(65536),this.bios=new Uint8Array(10240),this.bus=this.newBus(),this.connectCPUMemoryBus(this.bus),this.antic=new k(this.readDMA.bind(this),this.antic_nmi.bind(this)),this.gtia=new Y,this.irq_pokey=new v(this.pokey_irq.bind(this),()=>this.antic.h),this.audio_pokey=$(1),this.audioadapter=new tt(this.audio_pokey.pokey1,this.audioOversample,this.sampleRate),this.handler=Z(this.inputs,re,this.getKeyboardFunction(),!0)}newBus(){return{read:T([[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:T([[0,49146,65535,(t,s)=>{this.ram[t]=s}],[49147,49151,65535,(t,s)=>{this.ram[t]=s,this.initCartA()}],[53248,53503,31,(t,s)=>{this.gtia.setReg(t,s)}],[53760,54015,15,(t,s)=>{this.writePokey(t,s)}],[54272,54527,15,(t,s)=>{this.antic.setReg(t,s)}],[54528,54783,255,(t,s)=>{this.writeMapper(t,s)}]])}}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 s=this.bus.read(t);return this.probe.logDMARead(t,s),this.lastdmabyte=s,s}readConst(t){return t<53248||t>=54528?this.bus.read(t):255}write(t,s){this.bus.write(t,s)}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,s){this.audio_pokey.pokey1.setRegister(t,s),this.irq_pokey.write(t,s)}startScanline(){this.gtia.sync();for(let t=0;t<4;t++)this.gtia.readregs[ht+t]=~this.inputs[2]>>t&1;this.gtia.readregs[ot]=~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},r=()=>{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 n=ct[this.antic.mode],h=this.antic.h&1;return(n<8||h)&&(this.gtia.an=this.antic.shiftout()),s(),n==1&&(this.gtia.an=this.antic.shiftout()),r(),n<=2&&(this.gtia.an=this.antic.shiftout()),s(),n==1&&(this.gtia.an=this.antic.shiftout()),r(),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}}getRasterY(){return this.antic.v}getRasterX(){return this.antic.h}getRasterCanvasPosition(){return{x:this.antic.h*4-this.firstVisibleClock,y:this.antic.v-this.firstVisibleScanline}}getDebugCategories(){return["CPU","Stack","ANTIC","GTIA","POKEY"]}getDebugInfo(t,s){switch(t){case"ANTIC":return k.stateToLongString(s.antic);case"GTIA":return Y.stateToLongString(s.gtia);case"POKEY":return v.stateToLongString(s.pokey)}}getKeyboardFunction(){return(t,s,r,n)=>{if(!this.keyboard_active)return!1;if(n&65){var h=ie;if(s==i.VK_F9.c)return this.irq_pokey.generateIRQ(128),!0;for(var f=0;f>8}if(s>t.length)throw new Error("Bad .XEX file format")}h>=0&&(r[n++]=169,r[n++]=160,r[n++]=141,r[n++]=255,r[n++]=213,r[n++]=76,r[n++]=h&255,r[n++]=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,s){this.irq_pokey.pot_inputs[t]=255-s}getDebugDisplayList(){let t=this.antic.getDlistAddr(),s=()=>{let h=this.read(t);return t=t+1&1023|t&-1024,h},r=[],n=0;for(let h=0;h<256&&n<240;h++){let f=t,l=s(),p=l&15,d="",I=!1,R;if(p==0)R=(l>>4&7)+1,d+=" blank="+R;else{R=Q[p],d+=" mode="+m(p),d+=" lines="+R,I=(l&-65)==1;let j=(l&64)!=0&&(l&15)!=0;if(l&16&&(d+=" HSCROL"),l&32&&(d+=" VSCROL"),l&128&&(d+=" DLI"),I&&l&64?d+=" JVB":I?d+=" JMP":j&&(d+=" LMS"),I||j){let It=s(),Rt=s();d+=" $"+m(Rt)+m(It)}}if(r.push("$"+m(f)+" y="+n+" "+d),I)break;n+=R}return r}},V=class extends M{newBus(){return{read:T([[0,16383,65535,e=>this.ram[e]],[16384,49151,65535,e=>this.rom?this.rom[e-16384]:0],[49152,53247,31,e=>this.gtia.readReg(e)],[54272,54527,15,e=>this.antic.readReg(e)],[59392,61439,15,e=>this.readPokey(e)],[63488,65535,2047,e=>this.bios[e]]]),write:T([[0,16383,65535,(e,t)=>{this.ram[e]=t}],[49152,53247,31,(e,t)=>{this.gtia.setReg(e,t)}],[54272,54527,15,(e,t)=>{this.antic.setReg(e,t)}],[59392,61439,15,(e,t)=>{this.writePokey(e,t)}]])}}};var G=[{id:"hello.dasm",name:"Hello World",category:"Assembly"},{id:"hellopm.dasm",name:"Hello Sprites"},{id:"helloconio.c",name:"Text Mode",category:"C"},{id:"siegegame.c",name:"Siege Game"},{id:"hellodlist.c",name:"Display List"}],yt=G.concat([{id:"testmusic.c",name:"POKEY Music"},{id:"sieve.bas",name:"Benchmark",category:"FastBasic"},{id:"pmtest.bas",name:"Sprites Test"},{id:"dli.bas",name:"DLI Test"},{id:"joyas.bas",name:"Match-3 Game"}]),Et={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 At(a){return a.endsWith(".bas")||a.endsWith(".fb")||a.endsWith(".fbi")?"fastbasic":it(a)}var w=class extends at{constructor(){super(...arguments);this.getToolForFilename=At;this.showHelp=St;this.getROMExtension=ae;this.biosPath="res/altirra/kernel.rom"}newMachine(){return new M}getPresets(){return yt}getDefaultExtensions(){return[...super.getDefaultExtensions(),".bas"]}readAddress(t){return this.machine.readConst(t)}getMemoryMap(){return Et}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 s=await t.arrayBuffer();return new Uint8Array(s)}else throw new Error("could not load BIOS file")}getDebugTree(){let t=super.getDebugTree();return t.display_list=this.machine.getDebugDisplayList(),t}},X=class extends w{constructor(){super(...arguments);this.biosPath="res/altirra/superkernel.rom"}getPresets(){return G}newMachine(){return new V}},N=class extends nt{constructor(){super(...arguments);this.getToolForFilename=At;this.getOpcodeMetadata=rt;this.showHelp=St}getPresets(){return G}getDefaultExtensions(){return[".c",".bas",".cpp",".acme",".xa",".ca65",".dasm",".ecs",".wiz"]}},q=class extends N{constructor(){super(...arguments);this.getMemoryMap=function(){return Et}}getPresets(){return yt}loadROM(t,s){this.started?(this.loadROMFile(s),this.loadRegion(":cartleft:cart:rom",s)):this.startModule(this.mainElement,{jsfile:"mame8bitws.js",biosfile:"a800xl.zip",cfgfile:"a800xl.cfg",driver:"a800xl",width:336*2,height:450,romfn:"/emulator/cart.rom",romdata:new Uint8Array(s),romsize:8192,preInit:function(r){}})}start(){}},W=class extends N{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,s){this.started?(this.loadROMFile(s),this.loadRegion(":cartleft:cart:rom",s)):this.startModule(this.mainElement,{jsfile:"mame8bitws.js",biosfile:"a5200/5200.rom",cfgfile:"a5200.cfg",driver:"a5200",width:336*2,height:450,romfn:"/emulator/cart.rom",romdata:new Uint8Array(s),romsize:32768,preInit:function(r){}})}start(){}};function ae(a){return a==null?".bin":a[0]==255&&a[1]==255?".xex":".rom"}function St(){return"https://8bitworkshop.com/docs/platforms/atari8/"}D["atari8-800.xlmame"]=q;D["atari8-5200.mame"]=W;D["atari8-800"]=w;D["atari8-5200"]=X; +//# sourceMappingURL=atari8-NPXQGTKX.js.map diff --git a/gen/atari8-G2ROI5V7.js.map b/gen/atari8-NPXQGTKX.js.map similarity index 89% rename from gen/atari8-G2ROI5V7.js.map rename to gen/atari8-NPXQGTKX.js.map index af61b552..c7dd9c7a 100644 --- a/gen/atari8-G2ROI5V7.js.map +++ b/gen/atari8-NPXQGTKX.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/machine/chips/antic.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 // Initialized so they are always own properties and therefore always\n // round-trip through saveState()/loadState() -- safe_extend() copies only\n // the keys present in the source, so a field that is merely declared is\n // absent from a save state and keeps its old value on load, which leaks\n // state backwards across a rewind. -1 behaves exactly as undefined did in\n // every comparison below (h is never negative, and h >= 2 && h <= 1 is\n // never true), so this does not change emulation.\n left: number = -1;\n right: number = -1;\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 * 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 { MOS6502 } from \"../common/cpu/MOS6502\";\nimport { AcceptsPaddleInput, BasicScanlineMachine } from \"../common/devices\";\nimport { KeyFlags, Keys, makeKeycodeMap, newAddressDecoder, newKeyboardHandler } from \"../common/emu\";\nimport { hex } from \"../common/util\";\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 getRasterY() {\n return this.antic.v;\n }\n getRasterX() {\n return this.antic.h;\n }\n getRasterCanvasPosition() {\n return {\n x: this.antic.h * 4 - this.firstVisibleClock,\n y: this.antic.v - this.firstVisibleScanline,\n }\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 (op & 0x10) { debugmsg += \" HSCROL\"; }\n if (op & 0x20) { debugmsg += \" VSCROL\"; }\n if (op & 0x80) { debugmsg += \" DLI\"; }\n if (jmp && (op & 0x40)) { debugmsg += \" JVB\"; }\n else if (jmp) debugmsg += \" JMP\";\n else if (lms) debugmsg += \" LMS\";\n if (jmp || lms) {\n let dlarg_lo = nextInsn();\n let dlarg_hi = nextInsn();\n debugmsg += \" $\" + hex(dlarg_hi) + \"\" + hex(dlarg_lo);\n }\n }\n dlist.push(\"$\"+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, Preset } 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 : Preset[] = [\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)', category:'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 getDefaultExtensions() { return [...super.getDefaultExtensions(), \".bas\"]; }\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 getDefaultExtensions() { return [\".c\", \".bas\", \".cpp\", \".acme\", \".xa\", \".ca65\", \".dasm\", \".ecs\", \".wiz\"]; }\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-5200.mame'] = Atari5200MAMEPlatform\nPLATFORMS['atari8-800'] = Atari800Platform\nPLATFORMS['atari8-5200'] = Atari5200Platform\n"], - "mappings": "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", + "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 // Initialized so they are always own properties and therefore always\n // round-trip through saveState()/loadState() -- safe_extend() copies only\n // the keys present in the source, so a field that is merely declared is\n // absent from a save state and keeps its old value on load, which leaks\n // state backwards across a rewind. -1 behaves exactly as undefined did in\n // every comparison below (h is never negative, and h >= 2 && h <= 1 is\n // never true), so this does not change emulation.\n left: number = -1;\n right: number = -1;\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 * 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 { MOS6502 } from \"../common/cpu/MOS6502\";\nimport { AcceptsPaddleInput, BasicScanlineMachine } from \"../common/devices\";\nimport { KeyFlags, Keys, makeKeycodeMap, newAddressDecoder, newKeyboardHandler } from \"../common/emu\";\nimport { hex } from \"../common/util\";\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 getRasterY() {\n return this.antic.v;\n }\n getRasterX() {\n return this.antic.h;\n }\n getRasterCanvasPosition() {\n return {\n x: this.antic.h * 4 - this.firstVisibleClock,\n y: this.antic.v - this.firstVisibleScanline,\n }\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 (op & 0x10) { debugmsg += \" HSCROL\"; }\n if (op & 0x20) { debugmsg += \" VSCROL\"; }\n if (op & 0x80) { debugmsg += \" DLI\"; }\n if (jmp && (op & 0x40)) { debugmsg += \" JVB\"; }\n else if (jmp) debugmsg += \" JMP\";\n else if (lms) debugmsg += \" LMS\";\n if (jmp || lms) {\n let dlarg_lo = nextInsn();\n let dlarg_hi = nextInsn();\n debugmsg += \" $\" + hex(dlarg_hi) + \"\" + hex(dlarg_lo);\n }\n }\n dlist.push(\"$\"+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, Preset } 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 : Preset[] = [\n {id:'hello.dasm', name:'Hello World', category:'Assembly'},\n {id:'hellopm.dasm', name:'Hello Sprites'},\n {id:'helloconio.c', name:'Text Mode', category:'C'},\n {id:'siegegame.c', name:'Siege Game'},\n {id:'hellodlist.c', name:'Display List'},\n];\n\nvar Atari800_PRESETS = Atari8_PRESETS.concat([\n {id:'testmusic.c', name:'POKEY Music'},\n {id:'sieve.bas', name:'Benchmark', category:'FastBasic'},\n {id:'pmtest.bas', name:'Sprites Test'},\n {id:'dli.bas', name:'DLI Test'},\n {id:'joyas.bas', name:'Match-3 Game'},\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 getDefaultExtensions() { return [...super.getDefaultExtensions(), \".bas\"]; }\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 getDefaultExtensions() { return [\".c\", \".bas\", \".cpp\", \".acme\", \".xa\", \".ca65\", \".dasm\", \".ecs\", \".wiz\"]; }\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-5200.mame'] = Atari5200MAMEPlatform\nPLATFORMS['atari8-800'] = Atari800Platform\nPLATFORMS['atari8-5200'] = Atari5200Platform\n"], + "mappings": "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", "names": ["PF_LEFT", "PF_RIGHT", "DMACTL", "CHACTL", "DLISTL", "DLISTH", "HSCROL", "VSCROL", "PMBASE", "CHBASE", "WSYNC", "VCOUNT", "PENH", "PENV", "NMIEN", "NMIRES", "NMIST", "ANTIC_LEFT", "ANTIC_RIGHT", "LAST_DMA_H", "MODE_LINES", "MODE_PERIOD", "MODE_YPERIOD", "MODE_SHIFT", "ANTIC", "readfn", "nmifn", "NMIEN", "NMIST", "PENH", "PENV", "DMACTL", "safe_extend", "s", "state", "lpad", "hex", "dumpRAM", "a", "v", "WSYNC", "NMIRES", "VCOUNT", "DLISTL", "DLISTH", "effwidth", "hscroll", "HSCROL", "PF_LEFT", "PF_RIGHT", "vscrol", "VSCROL", "mask", "pc", "b", "did_dma", "op", "candma", "section", "oneline", "pmaddr", "PMBASE", "mode", "ch", "y", "addrofs", "chbase", "CHBASE", "addr", "chactl", "CHACTL", "mode3lc", "AUDF1", "AUDF2", "AUDF3", "AUDF4", "AUDCTL", "STIMER", "SKRES", "POTGO", "SEROUT", "IRQEN", "SKCTL", "ALLPOT", "KBCODE", "RANDOM", "SERIN", "IRQST", "SKSTAT", "POLY9", "CH1_179", "CH3_179", "CH1_CH2", "CH3_CH4", "CLOCK_15", "DIV_64", "DIV_15", "POLY9_SIZE", "POLY17_SIZE", "CHAN1", "CHAN2", "CHAN3", "CHAN4", "ANTIC_LINE_C", "SIO_XMTDONE_INTERVAL", "SIO_SEROUT_INTERVAL", "poly9", "poly17", "initPolyTables", "reg", "i", "POKEY", "irq", "antic_xpos", "safe_extend", "s", "SKSTAT", "DIV_64", "addr", "byte", "ALLPOT", "KBCODE", "RANDOM", "SKCTL", "AUDCTL", "POLY9", "POLY9_SIZE", "POLY17_SIZE", "ptr", "CLOCK_15", "DIV_15", "CHAN1", "CHAN2", "CHAN3", "CHAN4", "AUDF1", "CH1_CH2", "AUDF2", "AUDF3", "CH3_CH4", "AUDF4", "IRQEN", "IRQST", "SKRES", "POTGO", "SEROUT", "SIO_SEROUT_INTERVAL", "SIO_XMTDONE_INTERVAL", "STIMER", "chan_mask", "CH1_179", "ANTIC_LINE_C", "CH3_179", "SERIN", "chan", "mask", "state", "dumpRAM", "ATARI8_KEYMATRIX_INTL_NOSHIFT", "Keys", "ATARI8_KEYCODE_MAP", "makeKeycodeMap", "Atari800", "BasicScanlineMachine", "MOS6502", "ANTIC", "GTIA", "POKEY", "newPOKEYAudio", "TssChannelAdapter", "newKeyboardHandler", "newAddressDecoder", "a", "v", "bios", "i", "TRIG0", "CONSOL", "y", "xofs", "gtiatick1", "gtiatick2", "bp", "MODE_SHIFT", "odd", "state", "category", "o", "key", "code", "flags", "keymap", "rom", "title", "rom2", "addr", "value", "ofs", "stub", "stubofs", "runaddr", "start", "end", "hex", "initaddr", "controller", "pc", "nextInsn", "b", "dlist", "pc0", "op", "mode", "debugmsg", "jmp", "lines", "MODE_LINES", "lms", "dlarg_lo", "dlarg_hi", "Atari5200", "Atari8_PRESETS", "Atari800_PRESETS", "Atari800_MemoryMap", "getToolForFilename_Atari8", "fn", "getToolForFilename_6502", "Atari800Platform", "Base6502MachinePlatform", "atari8_showHelp", "atari8_getROMExtension", "Atari800", "a", "bios", "biosResponse", "biosBinary", "tree", "Atari5200Platform", "Atari5200", "Atari8MAMEPlatform", "BaseMAME6502Platform", "getOpcodeMetadata_6502", "Atari800MAMEPlatform", "title", "data", "_self", "Atari5200MAMEPlatform", "rom", "PLATFORMS"] } diff --git a/gen/basic-PINDSKMV.js b/gen/basic-G4Y7BVWJ.js similarity index 99% rename from gen/basic-PINDSKMV.js rename to gen/basic-G4Y7BVWJ.js index 33c43a45..d1da2615 100644 --- a/gen/basic-PINDSKMV.js +++ b/gen/basic-G4Y7BVWJ.js @@ -1,4 +1,4 @@ -import{b as S}from"./chunk-3FIVEUG2.js";import{y as E}from"./chunk-EX34LRSY.js";import"./chunk-22ZJCPEG.js";import"./chunk-T6VURU5O.js";import"./chunk-A7SWO6EA.js";import"./chunk-PEELNZF2.js";import"./chunk-2XSLQJUY.js";import{B as c,K as f,T as d,U as v,a as g}from"./chunk-TYDI7JZQ.js";import"./chunk-VSC4MAII.js";function k(u){return u.value!=null}function y(u){return u.name!=null}function O(u){return u.op!=null&&u.left!=null&&u.right!=null}function N(u){return u.op!=null&&u.expr!=null}var m=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,h,o){r=s,e=a,i=h,n=o},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)}},I=1024*1024,l=class u{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=I),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(h=>{this.curpc=s.$loc.offset,this.datums.push(h)}))}),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 m,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(u.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 d(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 S}from"./chunk-3FIVEUG2.js";import{y as E}from"./chunk-4H5H6MGY.js";import"./chunk-22ZJCPEG.js";import"./chunk-T6VURU5O.js";import"./chunk-A7SWO6EA.js";import"./chunk-SIGRU5UF.js";import"./chunk-2XSLQJUY.js";import{B as c,K as f,T as d,U as v,a as g}from"./chunk-TYDI7JZQ.js";import"./chunk-VSC4MAII.js";function k(u){return u.value!=null}function y(u){return u.name!=null}function O(u){return u.op!=null&&u.left!=null&&u.right!=null}function N(u){return u.op!=null&&u.expr!=null}var m=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,h,o){r=s,e=a,i=h,n=o},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)}},I=1024*1024,l=class u{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=I),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(h=>{this.curpc=s.$loc.offset,this.datums.push(h)}))}),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 m,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(u.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 d(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={}),k(t))return JSON.stringify(t.value);if(y(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 h=t.args?t.args.map(o=>this.expr2js(o,r)).join(", "):[];return t.name.startsWith("FN")?e+=`this.getDef(${i})(${h})`:this.builtins[t.name]?(this.checkFuncArgs(t,this.builtins[t.name]),e+=`this.builtins.${t.name}(${h})`):t.args?this.opts.arraysContainChars&&t.name.endsWith("$")?e+=`this.getStringSlice(this.vars.${t.name}, ${h})`:e+=`this.arrayGet(${i}, ${h})`:e+=`this.vars.${t.name}`,r.novalid?e:`this.checkValue(${e}, ${i})`}}else if(O(t)){var n=this.expr2js(t.left,r),s=this.expr2js(t.right,r);return`this.${t.op}(${n}, ${s})`}else if(N(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 h=()=>i>=0?this.vars[t]>e:this.vars[t]o==t)),this.forLoopStack.push(t),this.forLoops[t]={$next:o=>{o&&t!=o&&this.runtimeError(`I executed NEXT "${o}", but the last FOR was for "${t}".`),this.vars[t]+=i;var b=h();b?(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=${b}`)}}}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 S}from"./chunk-3FIVEUG2.js";import{y as E}from"./chunk-EX34LRSY.js"; `),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,(!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()}getDefaultExtensions(){return[".bas"]}getToolForFilename(){return"basic"}getPresets(){return L}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){if(t==="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+=g(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()}hasCustomStepOver(){return!0}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>4)*1024,p=i.vic[17]&32,C=(i.cia2[0]&1)==1&&(i.vic[24]&12)==4,A=i.state[244],I=this.getRasterY();return s+="Mode:",i.vic[17]&32?s+=" BITMAP":s+=" CHAR",i.vic[22]&16&&(s+=" MULTICOLOR"),i.vic[17]&64&&(s+=" EXTENDED"),s+=` `,s+=`Raster: (${x(A,3)}, ${x(I,3)}) `,s+=`Scroll: (${i.vic[22]&7}, ${i.vic[17]&7})`,s+=` `,s+=`VIC Bank: $${a(r,4)} Scrn: $${a(l,4)} `,p?s+=`Bitmap: $${a(o&57344,4)}`:C?s+=`Char: ROM $${a(o,4)}`:s+=`Char: $${a(o,4)}`,s+=` -`,s+=u(t,53248,64),s}case"SID":{let t=i.sid,s="";return s+=u(t,54272,32),s}}}setPaddleInput(e,i){e==0&&(this.lightpen_x=i),e==1&&(this.lightpen_y=i);let t=22,s=36,r=228,o=220,l=d(0,255,(this.lightpen_x-t)/(r-t)*160+24),p=d(0,255,(this.lightpen_y-s)/(o-s)*200+50);this.exports.machine_set_mouse(this.sys,l,p)}};var R=[{id:"helloc.c",name:"Hello World",category:"C"},{id:"screen_ram.c",name:"Screen RAM"},{id:"siegegame.c",name:"Siege Game"},{id:"joymove.c",name:"Sprite Movement"},{id:"sprite_collision.c",name:"Sprite Collision"},{id:"scroll1.c",name:"Scrolling (Single Buffer)"},{id:"test_setirq.c",name:"Raster Interrupts"},{id:"test_display_list.c",name:"Raster IRQ Library"},{id:"scrolling_text.c",name:"Big Scrolling Text"},{id:"side_scroller.c",name:"Side-Scrolling Game"},{id:"scroll2.c",name:"Scrolling (Double Buffer)"},{id:"scroll3.c",name:"Scrolling (Multidirectional)"},{id:"scroll4.c",name:"Scrolling (Color RAM Buffering)"},{id:"scroll5.c",name:"Scrolling (Camera Following)"},{id:"fullscrollgame.c",name:"Full-Scrolling Game"},{id:"test_multiplex.c",name:"Sprite Retriggering"},{id:"test_multispritelib.c",name:"Sprite Multiplexing Library"},{id:"mcbitmap.c",name:"Multicolor Bitmap Mode"},{id:"testlz4.c",name:"LZ4 Bitmap Compression"},{id:"musicplayer.c",name:"Music Player"},{id:"siddemo.c",name:"SID Player Demo"},{id:"digisound.c",name:"Digi Sound Player"},{id:"climber.c",name:"Climber Game"},{id:"test_border_sprites.c",name:"Sprites in the Borders"},{id:"sprite_stretch.c",name:"Sprite Stretching"},{id:"linecrunch.c",name:"Linecrunch"},{id:"fld.c",name:"Flexible Line Distance"},{id:"plasma.c",name:"Plasma Demo"},{id:"23matches.c",name:"23 Matches"},{id:"tgidemo.c",name:"TGI Graphics Demo"},{id:"upandaway.c",name:"Up, Up and Away"},{id:"hello.dasm",name:"Hello World (DASM)",category:"Assembly Language"},{id:"hello.acme",name:"Hello World (ACME)"},{id:"hello.wiz",name:"Hello Wiz (Wiz)"},{id:"hello.cpp",name:"Hello Oscar64",category:"C++ (Oscar64)"},{id:"particles.cpp",name:"Fireworks"},{id:"lander.cpp",name:"Lunar Lander"}],v={main:[{name:"6510 Registers",start:0,size:2,type:"io"},{name:"BIOS Reserved",start:512,size:167},{name:"Default Screen RAM",start:1024,size:1024,type:"ram"},{name:"Cartridge ROM",start:32768,size:8192,type:"rom"},{name:"BASIC ROM",start:40960,size:8192,type:"rom"},{name:"Upper RAM",start:49152,size:4096,type:"ram"},{name:"Character ROM",start:53248,size:4096,type:"rom"},{name:"VIC-II I/O",start:53248,size:1024,type:"io"},{name:"SID",start:54272,size:1024,type:"io"},{name:"Color RAM",start:55296,size:1024,type:"io"},{name:"CIA 1",start:56320,size:256,type:"io"},{name:"CIA 2",start:56576,size:256,type:"io"},{name:"I/O 1",start:56832,size:256,type:"io"},{name:"I/O 2",start:57088,size:256,type:"io"},{name:"KERNAL ROM",start:57344,size:8192,type:"rom"}]},h=class extends y{newMachine(){return new m("c64")}getPresets(){return R}readAddress(c){return this.machine.readConst(c)}getMemoryMap(){return v}showHelp(){return"https://8bitworkshop.com/docs/platforms/c64/"}getROMExtension(c){return c&&c[0]==1&&c[1]==8?".prg":".bin"}},f=class extends M{constructor(){super(...arguments);this.getToolForFilename=S;this.getOpcodeMetadata=_}getPresets(){return R}getDefaultExtensions(){return[".c",".cpp",".o64",".acme",".xa",".ca65",".dasm",".ecs",".wiz"]}loadROM(e,i){if(!this.started)this.startModule(this.mainElement,{jsfile:"mame8bitpc.js",biosfile:"c64.zip",cfgfile:"c64.cfg",driver:"c64",width:418,height:235,romfn:"/emulator/image.crt",romdata:new Uint8Array(i),romsize:65536,extraargs:["-autoboot_delay","5","-autoboot_command",`load "$",8,1 -`],preInit:function(s){}});else{this.loadROMFile(i),this.loadRegion(":quickload",i);var t=this.luacall('image:load("/emulator/image.prg")');console.log("load rom",t)}}start(){}getMemoryMap(){return v}};n.c64=h;n["c64.wasm"]=h;n["c64.mame"]=f; -//# sourceMappingURL=c64-6OBK6BOT.js.map +`,s+=f(t,53248,64),s}case"SID":{let t=i.sid,s="";return s+=f(t,54272,32),s}}}setPaddleInput(e,i){e==0&&(this.lightpen_x=i),e==1&&(this.lightpen_y=i);let t=22,s=36,r=228,o=220,l=d(0,255,(this.lightpen_x-t)/(r-t)*160+24),p=d(0,255,(this.lightpen_y-s)/(o-s)*200+50);this.exports.machine_set_mouse(this.sys,l,p)}};var R=[{id:"helloc.c",name:"Hello World",category:"C"},{id:"screen_ram.c",name:"Screen RAM"},{id:"siegegame.c",name:"Siege Game"},{id:"joymove.c",name:"Sprite Movement"},{id:"sprite_collision.c",name:"Sprite Collision"},{id:"scroll1.c",name:"Scrolling (Single Buffer)"},{id:"test_setirq.c",name:"Raster Interrupts"},{id:"test_display_list.c",name:"Raster IRQ Library"},{id:"scrolling_text.c",name:"Big Scrolling Text"},{id:"side_scroller.c",name:"Side-Scrolling Game"},{id:"scroll2.c",name:"Scrolling (Double Buffer)"},{id:"scroll3.c",name:"Scrolling (Multidirectional)"},{id:"scroll4.c",name:"Scrolling (Color RAM Buffering)"},{id:"scroll5.c",name:"Scrolling (Camera Following)"},{id:"fullscrollgame.c",name:"Full-Scrolling Game"},{id:"test_multiplex.c",name:"Sprite Retriggering"},{id:"test_multispritelib.c",name:"Sprite Multiplexing Library"},{id:"mcbitmap.c",name:"Multicolor Bitmap Mode"},{id:"testlz4.c",name:"LZ4 Bitmap Compression"},{id:"musicplayer.c",name:"Music Player"},{id:"siddemo.c",name:"SID Player Demo"},{id:"digisound.c",name:"Digi Sound Player"},{id:"climber.c",name:"Climber Game"},{id:"test_border_sprites.c",name:"Sprites in the Borders"},{id:"sprite_stretch.c",name:"Sprite Stretching"},{id:"linecrunch.c",name:"Linecrunch"},{id:"fld.c",name:"Flexible Line Distance"},{id:"plasma.c",name:"Plasma Demo"},{id:"23matches.c",name:"23 Matches"},{id:"tgidemo.c",name:"TGI Graphics Demo"},{id:"upandaway.c",name:"Up, Up and Away"},{id:"hello.dasm",name:"Hello World (DASM)",category:"Assembly"},{id:"hello.acme",name:"Hello World (ACME)"},{id:"hello.wiz",name:"Hello Wiz (Wiz)"},{id:"hello.cpp",name:"Hello Oscar64",category:"C++ (Oscar64)"},{id:"particles.cpp",name:"Fireworks"},{id:"lander.cpp",name:"Lunar Lander"}],v={main:[{name:"6510 Registers",start:0,size:2,type:"io"},{name:"BIOS Reserved",start:512,size:167},{name:"Default Screen RAM",start:1024,size:1024,type:"ram"},{name:"Cartridge ROM",start:32768,size:8192,type:"rom"},{name:"BASIC ROM",start:40960,size:8192,type:"rom"},{name:"Upper RAM",start:49152,size:4096,type:"ram"},{name:"Character ROM",start:53248,size:4096,type:"rom"},{name:"VIC-II I/O",start:53248,size:1024,type:"io"},{name:"SID",start:54272,size:1024,type:"io"},{name:"Color RAM",start:55296,size:1024,type:"io"},{name:"CIA 1",start:56320,size:256,type:"io"},{name:"CIA 2",start:56576,size:256,type:"io"},{name:"I/O 1",start:56832,size:256,type:"io"},{name:"I/O 2",start:57088,size:256,type:"io"},{name:"KERNAL ROM",start:57344,size:8192,type:"rom"}]},h=class extends y{newMachine(){return new m("c64")}getPresets(){return R}readAddress(c){return this.machine.readConst(c)}getMemoryMap(){return v}showHelp(){return"https://8bitworkshop.com/docs/platforms/c64/"}getROMExtension(c){return c&&c[0]==1&&c[1]==8?".prg":".bin"}},u=class extends M{constructor(){super(...arguments);this.getToolForFilename=S;this.getOpcodeMetadata=_}getPresets(){return R}getDefaultExtensions(){return[".c",".cpp",".o64",".acme",".xa",".ca65",".dasm",".ecs",".wiz"]}loadROM(e,i){if(!this.started)this.startModule(this.mainElement,{jsfile:"mame8bitpc.js",biosfile:"c64.zip",cfgfile:"c64.cfg",driver:"c64",width:418,height:235,romfn:"/emulator/image.crt",romdata:new Uint8Array(i),romsize:65536,extraargs:["-autoboot_delay","5","-autoboot_command",`load "$",8,1 +`],preInit:function(s){}});else{this.loadROMFile(i),this.loadRegion(":quickload",i);var t=this.luacall('image:load("/emulator/image.prg")');console.log("load rom",t)}}start(){}getMemoryMap(){return v}};n.c64=h;n["c64.wasm"]=h;n["c64.mame"]=u; +//# sourceMappingURL=c64-RILK5FDC.js.map diff --git a/gen/c64-6OBK6BOT.js.map b/gen/c64-RILK5FDC.js.map similarity index 81% rename from gen/c64-6OBK6BOT.js.map rename to gen/c64-RILK5FDC.js.map index beee877a..446c3414 100644 --- a/gen/c64-6OBK6BOT.js.map +++ b/gen/c64-RILK5FDC.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/machine/c64.ts", "../src/platform/c64.ts"], - "sourcesContent": ["\nimport { AcceptsPaddleInput, Probeable } from \"../common/devices\";\nimport { dumpRAM, KeyFlags } from \"../common/emu\";\nimport { clamp, hex, lpad } from \"../common/util\";\n\n// https://www.c64-wiki.com/wiki/C64\n// http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt\n// http://www.zimmers.net/cbmpics/cbm/c64/c64prg.txt\n// http://sta.c64.org/cbm64mem.html\n// http://hitmen.c02.at/temp/palstuff/\n\n//// WASM Machine\n\nimport { Machine } from \"../common/baseplatform\";\nimport { TrapCondition } from \"../common/devices\";\nimport { BaseWASMMachine } from \"../common/wasmplatform\";\n\nexport class C64_WASMMachine extends BaseWASMMachine \n implements Machine, Probeable, AcceptsPaddleInput {\n\n numTotalScanlines = 312;\n cpuCyclesPerLine = 63;\n\n prgstart : number;\n joymask0 = 0;\n joymask1 = 0;\n lightpen_x = 0;\n lightpen_y = 0;\n\n loadBIOS(srcArray: Uint8Array) {\n super.loadBIOS(srcArray);\n }\n reset() {\n super.reset();\n // clear keyboard\n for (var ch=0; ch<128; ch++) {\n this.exports.machine_key_up(this.sys, ch);\n }\n // load rom\n if (this.romptr && this.romlen) {\n this.exports.machine_load_rom(this.sys, this.romptr, this.romlen);\n this.prgstart = this.romarr[0] + (this.romarr[1]<<8); // get load address\n // look for BASIC program start\n if (this.prgstart == 0x801) {\n // decode SYS address from decimal?\n if (this.romarr[6] == 0x9e) {\n var addr = 0;\n for (var i=0; i<5; i++) {\n var ch = this.romarr[7+i];\n if (ch == 0x9b || ch == 0) break;\n addr = addr * 10 + (ch & 0xf);\n }\n this.prgstart = addr;\n console.log(\"SYS\", addr, hex(addr));\n } else {\n this.prgstart = this.romarr[2] + (this.romarr[3]<<8) + 2; // point to after BASIC program\n console.log(\"RUN\", this.prgstart, hex(this.prgstart));\n }\n }\n // is program loaded into RAM?\n if (this.prgstart < 0x8000) {\n // advance BIOS a few frames\n this.exports.machine_exec(this.sys, 250000);\n // type in command (SYS 2061)\n var cmd = \"\\rSYS \"+this.prgstart;\n for (var i=0; i ,\n case 191: key = flags & KeyFlags.Shift ? 0x3f : 0x2f; break; // ? /\n case 222: key = flags & KeyFlags.Shift ? 0x22 : 0x27; break; // \" '\n case 219: key = flags & KeyFlags.Shift ? 0x7b : 0x5b; break; // [\n case 221: key = flags & KeyFlags.Shift ? 0x7d : 0x5d; break; // ]\n case 48: if (flags & KeyFlags.Shift) key = 0x29; break; // )\n case 49: if (flags & KeyFlags.Shift) key = 0x21; break; // !\n case 50: if (flags & KeyFlags.Shift) key = 0x40; break; // @\n case 51: if (flags & KeyFlags.Shift) key = 0x23; break; // #\n case 52: if (flags & KeyFlags.Shift) key = 0x24; break; // $\n case 53: if (flags & KeyFlags.Shift) key = 0x25; break; // %\n case 54: if (flags & KeyFlags.Shift) key = 0x5e; break; // ^\n case 55: if (flags & KeyFlags.Shift) key = 0x26; break; // &\n case 56: if (flags & KeyFlags.Shift) key = 0x2a; break; // *\n case 57: if (flags & KeyFlags.Shift) key = 0x28; break; // (\n case 59: if (flags & KeyFlags.Shift) key = 0x3a; break; // ;\n case 61: if (flags & KeyFlags.Shift) key = 0x2b; break; // +\n case 173: key = flags & KeyFlags.Shift ? 0x5f : 0x2d; break; // _ -\n }\n if (flags & KeyFlags.KeyDown) {\n this.exports.machine_key_down(this.sys, key);\n this.joymask0 |= mask;\n this.joymask1 |= mask2;\n } else if (flags & KeyFlags.KeyUp) {\n this.exports.machine_key_up(this.sys, key);\n this.joymask0 &= ~mask;\n this.joymask1 &= ~mask2;\n }\n this.exports.c64_joystick(this.sys, this.joymask0, this.joymask1);\n }\n getRasterX() {\n return this.statearr[0xf4];\n }\n getRasterY() {\n return this.exports.machine_get_raster_line(this.sys);\n }\n getRasterCanvasPosition() {\n return {\n x: this.getRasterX() * 392/63,\n y: this.getRasterY() - 14,\n }\n }\n getDebugStateOffset(index: number) {\n var p = this.exports.machine_get_debug_pointer(this.sys, index);\n return p - this.sys;\n }\n getDebugCategories() {\n return ['CPU','ZPRAM','Stack','PLA','CIA','VIC','SID'];\n }\n getDebugInfo(category:string, state:any) {\n switch (category) {\n case 'PLA': {\n let s = \"\";\n let iomapped = state.pla[0];\n let port = state.pla[3];\n s += `$0000 - $9FFF RAM\\n`;\n s += `$A000 - $BFFF ${(port&3)==3 ? 'BASIC ROM' : 'RAM'}\\n`;\n s += `$C000 - $CFFF RAM\\n`;\n s += `$D000 - $DFFF ${iomapped ? 'I/O' : (port&3)!=0 ? 'CHAR ROM' : 'RAM'}\\n`;\n s += `$E000 - $FFFF ${(port&2)==2 ? 'KERNAL ROM' : 'RAM'}\\n`;\n return s;\n }\n case 'CIA': {\n let s = \"\";\n for (let i=0; i<2; i++) {\n let m = i ? state.cia2 : state.cia1;\n s += `CIA ${i+1}\\n`;\n s += ` A: Data ${hex(m[0])} DDR ${hex(m[1])} Input ${hex(m[2])}`;\n s += ` Timer ${hex(m[10]+m[11]*256, 4)}\\n`;\n s += ` B: Data ${hex(m[4])} DDR ${hex(m[5])} Input ${hex(m[6])}`;\n s += ` Timer ${hex(m[10+10]+m[11+10]*256, 4)}\\n`;\n //s += ` IMR ${hex(m[48])} ICR ${hex(m[50])}\\n`\n }\n return s;\n }\n case 'VIC': {\n let m = state.vic;\n let s = '';\n let vicbank = ((state.cia2[0] & 3) ^ 3) * 0x4000;\n let charmem = vicbank + (state.vic[0x18] & 14) * 0x400;\n let screen = vicbank + (state.vic[0x18] >> 4) * 0x400;\n let isbitmap = state.vic[0x11] & 0x20;\n let ischar = (state.cia2[0]&1)==1 && (state.vic[0x18]&12)==4;\n let rasterX = state.state[0xf4];\n let rasterY = this.getRasterY();\n s += 'Mode:';\n if (state.vic[0x11] & 0x20) s += ' BITMAP'; else s += ' CHAR';\n if (state.vic[0x16] & 0x10) s += ' MULTICOLOR';\n if (state.vic[0x11] & 0x40) s += ' EXTENDED';\n s += \"\\n\";\n s += `Raster: (${lpad(rasterX,3)}, ${lpad(rasterY,3)}) `;\n s += `Scroll: (${state.vic[0x16] & 7}, ${state.vic[0x11] & 7})`;\n s += \"\\n\";\n s += `VIC Bank: $${hex(vicbank,4)} Scrn: $${hex(screen,4)} `;\n if (isbitmap) s += `Bitmap: $${hex(charmem&0xe000,4)}`\n else if (ischar) s += `Char: ROM $${hex(charmem,4)}`;\n else s += `Char: $${hex(charmem,4)}`;\n s += \"\\n\";\n s += dumpRAM(m, 0xd000, 64);\n return s;\n }\n case 'SID': {\n let m = state.sid;\n let s = ''\n s += dumpRAM(m, 0xd400, 32);\n return s;\n }\n }\n }\n\n setPaddleInput(controller: number, value: number): void {\n if (controller == 0) this.lightpen_x = value;\n if (controller == 1) this.lightpen_y = value;\n const x1 = 22;\n const y1 = 36;\n const x2 = 228;\n const y2 = 220;\n let x = clamp(0, 255, (this.lightpen_x - x1) / (x2 - x1) * 160 + 24);\n let y = clamp(0, 255, (this.lightpen_y - y1) / (y2 - y1) * 200 + 50);\n this.exports.machine_set_mouse(this.sys, x, y);\n }\n\n}\n", "\nimport { C64_WASMMachine } from \"../machine/c64\";\nimport { Platform, Base6502MachinePlatform, getToolForFilename_6502, getOpcodeMetadata_6502, Preset } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\nimport { BaseMAME6502Platform } from \"../common/mameplatform\";\n\nconst C64_PRESETS : Preset[] = [\n {id:'helloc.c', name:'Hello World', category:'C'},\n {id:'screen_ram.c', name:'Screen RAM'},\n {id:'siegegame.c', name:'Siege Game'},\n {id:'joymove.c', name:'Sprite Movement'},\n {id:'sprite_collision.c', name:'Sprite Collision'},\n {id:'scroll1.c', name:'Scrolling (Single Buffer)'},\n {id:'test_setirq.c', name:'Raster Interrupts'},\n {id:'test_display_list.c', name:'Raster IRQ Library'},\n {id:'scrolling_text.c', name:'Big Scrolling Text'},\n {id:'side_scroller.c', name:'Side-Scrolling Game'},\n {id:'scroll2.c', name:'Scrolling (Double Buffer)'},\n {id:'scroll3.c', name:'Scrolling (Multidirectional)'},\n {id:'scroll4.c', name:'Scrolling (Color RAM Buffering)'},\n {id:'scroll5.c', name:'Scrolling (Camera Following)'},\n// {id:'scrollingmap1.c', name:'Scrolling Tile Map'},\n {id:'fullscrollgame.c', name:'Full-Scrolling Game'},\n {id:'test_multiplex.c', name:'Sprite Retriggering'},\n {id:'test_multispritelib.c', name:'Sprite Multiplexing Library'},\n {id:'mcbitmap.c', name:'Multicolor Bitmap Mode'},\n {id:'testlz4.c', name:'LZ4 Bitmap Compression'},\n //{id:'mandel.c', name:'Mandelbrot Fractal'},\n {id:'musicplayer.c', name:'Music Player'},\n //{id:'sidtune.dasm', name:'Tiny SID Tune (ASM)'},\n {id:'siddemo.c', name:'SID Player Demo'},\n {id:'digisound.c', name:'Digi Sound Player'},\n {id:'climber.c', name:'Climber Game'},\n {id:'test_border_sprites.c', name:'Sprites in the Borders'},\n {id:'sprite_stretch.c', name:'Sprite Stretching'},\n {id:'linecrunch.c', name:'Linecrunch'},\n {id:'fld.c', name:'Flexible Line Distance'},\n {id:'plasma.c', name:'Plasma Demo'},\n {id:'23matches.c', name:'23 Matches'},\n {id:'tgidemo.c', name:'TGI Graphics Demo'},\n {id:'upandaway.c', name:'Up, Up and Away'},\n {id:'hello.dasm', name:'Hello World (DASM)', category:'Assembly Language'},\n {id:'hello.acme', name:'Hello World (ACME)'},\n {id:'hello.wiz', name:'Hello Wiz (Wiz)'},\n // {id:'kitchensink.dasm', name:'Kitchensink (DASM)'},\n {id:'hello.cpp', name:'Hello Oscar64', category:'C++ (Oscar64)'},\n {id:'particles.cpp', name:'Fireworks'},\n {id:'lander.cpp', name:'Lunar Lander'},\n];\n\nconst C64_MEMORY_MAP = { main:[\n {name:'6510 Registers',start:0x0, size:0x2,type:'io'},\n {name:'BIOS Reserved', start:0x200, size:0xa7},\n {name:'Default Screen RAM', start:0x400, size:1024,type:'ram'},\n //{name:'RAM', start:0x2, size:0x7ffe,type:'ram'},\n {name:'Cartridge ROM',start:0x8000,size:0x2000,type:'rom'},\n {name:'BASIC ROM', start:0xa000,size:0x2000,type:'rom'},\n {name:'Upper RAM', start:0xc000,size:0x1000,type:'ram'},\n {name:'Character ROM',start:0xd000,size:0x1000,type:'rom'},\n {name:'VIC-II I/O', start:0xd000,size:0x0400,type:'io'},\n {name:'SID', start:0xd400,size:0x0400,type:'io'},\n {name:'Color RAM', start:0xd800,size:0x0400,type:'io'},\n {name:'CIA 1', start:0xdc00,size:0x0100,type:'io'},\n {name:'CIA 2', start:0xdd00,size:0x0100,type:'io'},\n {name:'I/O 1', start:0xde00,size:0x0100,type:'io'},\n {name:'I/O 2', start:0xdf00,size:0x0100,type:'io'},\n {name:'KERNAL ROM', start:0xe000,size:0x2000,type:'rom'},\n] }\n\n// WASM C64 platform\nclass C64WASMPlatform extends Base6502MachinePlatform implements Platform {\n\n newMachine() { return new C64_WASMMachine('c64'); }\n\n getPresets() { return C64_PRESETS; }\n readAddress(a) { return this.machine.readConst(a); }\n getMemoryMap() { return C64_MEMORY_MAP; }\n showHelp() { return \"https://8bitworkshop.com/docs/platforms/c64/\" }\n getROMExtension(rom:Uint8Array) {\n /*\n if (rom && rom[0] == 0x00 && rom[1] == 0x80 && rom[2+4] == 0xc3 && rom[2+5] == 0xc2) return \".crt\";\n */\n if (rom && rom[0] == 0x01 && rom[1] == 0x08) return \".prg\";\n else return \".bin\";\n }\n}\n\n// C64 MAME platform\nabstract class C64MAMEPlatform extends BaseMAME6502Platform {\n getPresets() { return C64_PRESETS; }\n getToolForFilename = getToolForFilename_6502;\n getOpcodeMetadata = getOpcodeMetadata_6502;\n getDefaultExtensions() { return [\".c\", \".cpp\", \".o64\", \".acme\", \".xa\", \".ca65\", \".dasm\", \".ecs\", \".wiz\"]; }\n loadROM(title, data) {\n if (!this.started) {\n this.startModule(this.mainElement, {\n jsfile:'mame8bitpc.js',\n biosfile:'c64.zip',\n cfgfile:'c64.cfg',\n driver:'c64',\n width:418,\n height:235,\n romfn:'/emulator/image.crt',\n romdata:new Uint8Array(data),\n romsize:0x10000,\n extraargs: ['-autoboot_delay','5','-autoboot_command','load \"$\",8,1\\n'],\n preInit:function(_self) {\n },\n });\n } else {\n this.loadROMFile(data);\n this.loadRegion(\":quickload\", data);\n var result = this.luacall(`image:load(\"/emulator/image.prg\")`)\n console.log('load rom', result);\n //this.loadRegion(\":exp:standard\", data);\n }\n }\n start() {\n }\n getMemoryMap() { return C64_MEMORY_MAP; }\n}\n\n\nPLATFORMS['c64'] = C64WASMPlatform;\nPLATFORMS['c64.wasm'] = C64WASMPlatform;\nPLATFORMS['c64.mame'] = C64MAMEPlatform;\n"], - "mappings": "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", + "sourcesContent": ["\nimport { AcceptsPaddleInput, Probeable } from \"../common/devices\";\nimport { dumpRAM, KeyFlags } from \"../common/emu\";\nimport { clamp, hex, lpad } from \"../common/util\";\n\n// https://www.c64-wiki.com/wiki/C64\n// http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt\n// http://www.zimmers.net/cbmpics/cbm/c64/c64prg.txt\n// http://sta.c64.org/cbm64mem.html\n// http://hitmen.c02.at/temp/palstuff/\n\n//// WASM Machine\n\nimport { Machine } from \"../common/baseplatform\";\nimport { TrapCondition } from \"../common/devices\";\nimport { BaseWASMMachine } from \"../common/wasmplatform\";\n\nexport class C64_WASMMachine extends BaseWASMMachine \n implements Machine, Probeable, AcceptsPaddleInput {\n\n numTotalScanlines = 312;\n cpuCyclesPerLine = 63;\n\n prgstart : number;\n joymask0 = 0;\n joymask1 = 0;\n lightpen_x = 0;\n lightpen_y = 0;\n\n loadBIOS(srcArray: Uint8Array) {\n super.loadBIOS(srcArray);\n }\n reset() {\n super.reset();\n // clear keyboard\n for (var ch=0; ch<128; ch++) {\n this.exports.machine_key_up(this.sys, ch);\n }\n // load rom\n if (this.romptr && this.romlen) {\n this.exports.machine_load_rom(this.sys, this.romptr, this.romlen);\n this.prgstart = this.romarr[0] + (this.romarr[1]<<8); // get load address\n // look for BASIC program start\n if (this.prgstart == 0x801) {\n // decode SYS address from decimal?\n if (this.romarr[6] == 0x9e) {\n var addr = 0;\n for (var i=0; i<5; i++) {\n var ch = this.romarr[7+i];\n if (ch == 0x9b || ch == 0) break;\n addr = addr * 10 + (ch & 0xf);\n }\n this.prgstart = addr;\n console.log(\"SYS\", addr, hex(addr));\n } else {\n this.prgstart = this.romarr[2] + (this.romarr[3]<<8) + 2; // point to after BASIC program\n console.log(\"RUN\", this.prgstart, hex(this.prgstart));\n }\n }\n // is program loaded into RAM?\n if (this.prgstart < 0x8000) {\n // advance BIOS a few frames\n this.exports.machine_exec(this.sys, 250000);\n // type in command (SYS 2061)\n var cmd = \"\\rSYS \"+this.prgstart;\n for (var i=0; i ,\n case 191: key = flags & KeyFlags.Shift ? 0x3f : 0x2f; break; // ? /\n case 222: key = flags & KeyFlags.Shift ? 0x22 : 0x27; break; // \" '\n case 219: key = flags & KeyFlags.Shift ? 0x7b : 0x5b; break; // [\n case 221: key = flags & KeyFlags.Shift ? 0x7d : 0x5d; break; // ]\n case 48: if (flags & KeyFlags.Shift) key = 0x29; break; // )\n case 49: if (flags & KeyFlags.Shift) key = 0x21; break; // !\n case 50: if (flags & KeyFlags.Shift) key = 0x40; break; // @\n case 51: if (flags & KeyFlags.Shift) key = 0x23; break; // #\n case 52: if (flags & KeyFlags.Shift) key = 0x24; break; // $\n case 53: if (flags & KeyFlags.Shift) key = 0x25; break; // %\n case 54: if (flags & KeyFlags.Shift) key = 0x5e; break; // ^\n case 55: if (flags & KeyFlags.Shift) key = 0x26; break; // &\n case 56: if (flags & KeyFlags.Shift) key = 0x2a; break; // *\n case 57: if (flags & KeyFlags.Shift) key = 0x28; break; // (\n case 59: if (flags & KeyFlags.Shift) key = 0x3a; break; // ;\n case 61: if (flags & KeyFlags.Shift) key = 0x2b; break; // +\n case 173: key = flags & KeyFlags.Shift ? 0x5f : 0x2d; break; // _ -\n }\n if (flags & KeyFlags.KeyDown) {\n this.exports.machine_key_down(this.sys, key);\n this.joymask0 |= mask;\n this.joymask1 |= mask2;\n } else if (flags & KeyFlags.KeyUp) {\n this.exports.machine_key_up(this.sys, key);\n this.joymask0 &= ~mask;\n this.joymask1 &= ~mask2;\n }\n this.exports.c64_joystick(this.sys, this.joymask0, this.joymask1);\n }\n getRasterX() {\n return this.statearr[0xf4];\n }\n getRasterY() {\n return this.exports.machine_get_raster_line(this.sys);\n }\n getRasterCanvasPosition() {\n return {\n x: this.getRasterX() * 392/63,\n y: this.getRasterY() - 14,\n }\n }\n getDebugStateOffset(index: number) {\n var p = this.exports.machine_get_debug_pointer(this.sys, index);\n return p - this.sys;\n }\n getDebugCategories() {\n return ['CPU','ZPRAM','Stack','PLA','CIA','VIC','SID'];\n }\n getDebugInfo(category:string, state:any) {\n switch (category) {\n case 'PLA': {\n let s = \"\";\n let iomapped = state.pla[0];\n let port = state.pla[3];\n s += `$0000 - $9FFF RAM\\n`;\n s += `$A000 - $BFFF ${(port&3)==3 ? 'BASIC ROM' : 'RAM'}\\n`;\n s += `$C000 - $CFFF RAM\\n`;\n s += `$D000 - $DFFF ${iomapped ? 'I/O' : (port&3)!=0 ? 'CHAR ROM' : 'RAM'}\\n`;\n s += `$E000 - $FFFF ${(port&2)==2 ? 'KERNAL ROM' : 'RAM'}\\n`;\n return s;\n }\n case 'CIA': {\n let s = \"\";\n for (let i=0; i<2; i++) {\n let m = i ? state.cia2 : state.cia1;\n s += `CIA ${i+1}\\n`;\n s += ` A: Data ${hex(m[0])} DDR ${hex(m[1])} Input ${hex(m[2])}`;\n s += ` Timer ${hex(m[10]+m[11]*256, 4)}\\n`;\n s += ` B: Data ${hex(m[4])} DDR ${hex(m[5])} Input ${hex(m[6])}`;\n s += ` Timer ${hex(m[10+10]+m[11+10]*256, 4)}\\n`;\n //s += ` IMR ${hex(m[48])} ICR ${hex(m[50])}\\n`\n }\n return s;\n }\n case 'VIC': {\n let m = state.vic;\n let s = '';\n let vicbank = ((state.cia2[0] & 3) ^ 3) * 0x4000;\n let charmem = vicbank + (state.vic[0x18] & 14) * 0x400;\n let screen = vicbank + (state.vic[0x18] >> 4) * 0x400;\n let isbitmap = state.vic[0x11] & 0x20;\n let ischar = (state.cia2[0]&1)==1 && (state.vic[0x18]&12)==4;\n let rasterX = state.state[0xf4];\n let rasterY = this.getRasterY();\n s += 'Mode:';\n if (state.vic[0x11] & 0x20) s += ' BITMAP'; else s += ' CHAR';\n if (state.vic[0x16] & 0x10) s += ' MULTICOLOR';\n if (state.vic[0x11] & 0x40) s += ' EXTENDED';\n s += \"\\n\";\n s += `Raster: (${lpad(rasterX,3)}, ${lpad(rasterY,3)}) `;\n s += `Scroll: (${state.vic[0x16] & 7}, ${state.vic[0x11] & 7})`;\n s += \"\\n\";\n s += `VIC Bank: $${hex(vicbank,4)} Scrn: $${hex(screen,4)} `;\n if (isbitmap) s += `Bitmap: $${hex(charmem&0xe000,4)}`\n else if (ischar) s += `Char: ROM $${hex(charmem,4)}`;\n else s += `Char: $${hex(charmem,4)}`;\n s += \"\\n\";\n s += dumpRAM(m, 0xd000, 64);\n return s;\n }\n case 'SID': {\n let m = state.sid;\n let s = ''\n s += dumpRAM(m, 0xd400, 32);\n return s;\n }\n }\n }\n\n setPaddleInput(controller: number, value: number): void {\n if (controller == 0) this.lightpen_x = value;\n if (controller == 1) this.lightpen_y = value;\n const x1 = 22;\n const y1 = 36;\n const x2 = 228;\n const y2 = 220;\n let x = clamp(0, 255, (this.lightpen_x - x1) / (x2 - x1) * 160 + 24);\n let y = clamp(0, 255, (this.lightpen_y - y1) / (y2 - y1) * 200 + 50);\n this.exports.machine_set_mouse(this.sys, x, y);\n }\n\n}\n", "\nimport { C64_WASMMachine } from \"../machine/c64\";\nimport { Platform, Base6502MachinePlatform, getToolForFilename_6502, getOpcodeMetadata_6502, Preset } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\nimport { BaseMAME6502Platform } from \"../common/mameplatform\";\n\nconst C64_PRESETS : Preset[] = [\n {id:'helloc.c', name:'Hello World', category:'C'},\n {id:'screen_ram.c', name:'Screen RAM'},\n {id:'siegegame.c', name:'Siege Game'},\n {id:'joymove.c', name:'Sprite Movement'},\n {id:'sprite_collision.c', name:'Sprite Collision'},\n {id:'scroll1.c', name:'Scrolling (Single Buffer)'},\n {id:'test_setirq.c', name:'Raster Interrupts'},\n {id:'test_display_list.c', name:'Raster IRQ Library'},\n {id:'scrolling_text.c', name:'Big Scrolling Text'},\n {id:'side_scroller.c', name:'Side-Scrolling Game'},\n {id:'scroll2.c', name:'Scrolling (Double Buffer)'},\n {id:'scroll3.c', name:'Scrolling (Multidirectional)'},\n {id:'scroll4.c', name:'Scrolling (Color RAM Buffering)'},\n {id:'scroll5.c', name:'Scrolling (Camera Following)'},\n// {id:'scrollingmap1.c', name:'Scrolling Tile Map'},\n {id:'fullscrollgame.c', name:'Full-Scrolling Game'},\n {id:'test_multiplex.c', name:'Sprite Retriggering'},\n {id:'test_multispritelib.c', name:'Sprite Multiplexing Library'},\n {id:'mcbitmap.c', name:'Multicolor Bitmap Mode'},\n {id:'testlz4.c', name:'LZ4 Bitmap Compression'},\n //{id:'mandel.c', name:'Mandelbrot Fractal'},\n {id:'musicplayer.c', name:'Music Player'},\n //{id:'sidtune.dasm', name:'Tiny SID Tune (ASM)'},\n {id:'siddemo.c', name:'SID Player Demo'},\n {id:'digisound.c', name:'Digi Sound Player'},\n {id:'climber.c', name:'Climber Game'},\n {id:'test_border_sprites.c', name:'Sprites in the Borders'},\n {id:'sprite_stretch.c', name:'Sprite Stretching'},\n {id:'linecrunch.c', name:'Linecrunch'},\n {id:'fld.c', name:'Flexible Line Distance'},\n {id:'plasma.c', name:'Plasma Demo'},\n {id:'23matches.c', name:'23 Matches'},\n {id:'tgidemo.c', name:'TGI Graphics Demo'},\n {id:'upandaway.c', name:'Up, Up and Away'},\n {id:'hello.dasm', name:'Hello World (DASM)', category:'Assembly'},\n {id:'hello.acme', name:'Hello World (ACME)'},\n {id:'hello.wiz', name:'Hello Wiz (Wiz)'},\n // {id:'kitchensink.dasm', name:'Kitchensink (DASM)'},\n {id:'hello.cpp', name:'Hello Oscar64', category:'C++ (Oscar64)'},\n {id:'particles.cpp', name:'Fireworks'},\n {id:'lander.cpp', name:'Lunar Lander'},\n];\n\nconst C64_MEMORY_MAP = { main:[\n {name:'6510 Registers',start:0x0, size:0x2,type:'io'},\n {name:'BIOS Reserved', start:0x200, size:0xa7},\n {name:'Default Screen RAM', start:0x400, size:1024,type:'ram'},\n //{name:'RAM', start:0x2, size:0x7ffe,type:'ram'},\n {name:'Cartridge ROM',start:0x8000,size:0x2000,type:'rom'},\n {name:'BASIC ROM', start:0xa000,size:0x2000,type:'rom'},\n {name:'Upper RAM', start:0xc000,size:0x1000,type:'ram'},\n {name:'Character ROM',start:0xd000,size:0x1000,type:'rom'},\n {name:'VIC-II I/O', start:0xd000,size:0x0400,type:'io'},\n {name:'SID', start:0xd400,size:0x0400,type:'io'},\n {name:'Color RAM', start:0xd800,size:0x0400,type:'io'},\n {name:'CIA 1', start:0xdc00,size:0x0100,type:'io'},\n {name:'CIA 2', start:0xdd00,size:0x0100,type:'io'},\n {name:'I/O 1', start:0xde00,size:0x0100,type:'io'},\n {name:'I/O 2', start:0xdf00,size:0x0100,type:'io'},\n {name:'KERNAL ROM', start:0xe000,size:0x2000,type:'rom'},\n] }\n\n// WASM C64 platform\nclass C64WASMPlatform extends Base6502MachinePlatform implements Platform {\n\n newMachine() { return new C64_WASMMachine('c64'); }\n\n getPresets() { return C64_PRESETS; }\n readAddress(a) { return this.machine.readConst(a); }\n getMemoryMap() { return C64_MEMORY_MAP; }\n showHelp() { return \"https://8bitworkshop.com/docs/platforms/c64/\" }\n getROMExtension(rom:Uint8Array) {\n /*\n if (rom && rom[0] == 0x00 && rom[1] == 0x80 && rom[2+4] == 0xc3 && rom[2+5] == 0xc2) return \".crt\";\n */\n if (rom && rom[0] == 0x01 && rom[1] == 0x08) return \".prg\";\n else return \".bin\";\n }\n}\n\n// C64 MAME platform\nabstract class C64MAMEPlatform extends BaseMAME6502Platform {\n getPresets() { return C64_PRESETS; }\n getToolForFilename = getToolForFilename_6502;\n getOpcodeMetadata = getOpcodeMetadata_6502;\n getDefaultExtensions() { return [\".c\", \".cpp\", \".o64\", \".acme\", \".xa\", \".ca65\", \".dasm\", \".ecs\", \".wiz\"]; }\n loadROM(title, data) {\n if (!this.started) {\n this.startModule(this.mainElement, {\n jsfile:'mame8bitpc.js',\n biosfile:'c64.zip',\n cfgfile:'c64.cfg',\n driver:'c64',\n width:418,\n height:235,\n romfn:'/emulator/image.crt',\n romdata:new Uint8Array(data),\n romsize:0x10000,\n extraargs: ['-autoboot_delay','5','-autoboot_command','load \"$\",8,1\\n'],\n preInit:function(_self) {\n },\n });\n } else {\n this.loadROMFile(data);\n this.loadRegion(\":quickload\", data);\n var result = this.luacall(`image:load(\"/emulator/image.prg\")`)\n console.log('load rom', result);\n //this.loadRegion(\":exp:standard\", data);\n }\n }\n start() {\n }\n getMemoryMap() { return C64_MEMORY_MAP; }\n}\n\n\nPLATFORMS['c64'] = C64WASMPlatform;\nPLATFORMS['c64.wasm'] = C64WASMPlatform;\nPLATFORMS['c64.mame'] = C64MAMEPlatform;\n"], + "mappings": "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", "names": ["C64_WASMMachine", "BaseWASMMachine", "srcArray", "ch", "addr", "i", "hex", "cmd", "key", "warmstart", "trap", "scanline", "clocks", "probing", "s", "pc", "cia1", "cia2", "vic", "sid", "ramofs", "pla", "state", "code", "flags", "mask", "mask2", "index", "p", "category", "iomapped", "port", "m", "vicbank", "charmem", "screen", "isbitmap", "ischar", "rasterX", "rasterY", "lpad", "dumpRAM", "controller", "value", "x1", "y1", "x2", "y2", "x", "clamp", "y", "C64_PRESETS", "C64_MEMORY_MAP", "C64WASMPlatform", "Base6502MachinePlatform", "C64_WASMMachine", "a", "rom", "C64MAMEPlatform", "BaseMAME6502Platform", "getToolForFilename_6502", "getOpcodeMetadata_6502", "title", "data", "_self", "result", "PLATFORMS"] } diff --git a/gen/chunk-EX34LRSY.js b/gen/chunk-4H5H6MGY.js similarity index 92% rename from gen/chunk-EX34LRSY.js rename to gen/chunk-4H5H6MGY.js index a1a47d0f..bacd675d 100644 --- a/gen/chunk-EX34LRSY.js +++ b/gen/chunk-4H5H6MGY.js @@ -1,21 +1,21 @@ -import{a as Qu,b as $u,c as mb,d as Ob,e as gb,f as Xl,g as Ir,i as Dl,j as Il,k as Ts,l as HQ}from"./chunk-22ZJCPEG.js";import{a as GQ}from"./chunk-T6VURU5O.js";import{a as Zl}from"./chunk-A7SWO6EA.js";import{a as pb,b as bb,c as KQ}from"./chunk-PEELNZF2.js";import{D as Pu,K as ku,t as ub,u as fb}from"./chunk-2XSLQJUY.js";import{A as Sr,E as vr,F as Su,G as Qs,I as $s,J as Ml,K as vu,T as wu,V as hb,a as on,b as Xo,ba as Ll,d as ft,e as Do,f as $t,g as be,h as yu,i as ab,k as lb,m as Al,n as Rl,o as El,p as _i,q as cb,t as ks,w as db,x as xu,y as Io,z as Tt}from"./chunk-TYDI7JZQ.js";import{a as tt,b as Ti,c as Zo,d as ob,e as bu}from"./chunk-VSC4MAII.js";var _u=ob((yb,Tu)=>{(function(r){if(typeof yb=="object"&&typeof Tu!="undefined")Tu.exports=r();else if(typeof define=="function"&&define.amd)define([],r);else{var e;typeof window!="undefined"?e=window:typeof global!="undefined"?e=global:typeof self!="undefined"?e=self:e=this,e.localforage=r()}})(function(){var r,e,t;return(function n(i,s,o){function a(d,h){if(!s[d]){if(!i[d]){var u=typeof Zo=="function"&&Zo;if(!h&&u)return u(d,!0);if(l)return l(d,!0);var f=new Error("Cannot find module '"+d+"'");throw f.code="MODULE_NOT_FOUND",f}var p=s[d]={exports:{}};i[d][0].call(p.exports,function(O){var x=i[d][1][O];return a(x||O)},p,p.exports,n,i,s,o)}return s[d].exports}for(var l=typeof Zo=="function"&&Zo,c=0;c=43)}}).catch(function(){return!1})}function U(g){return typeof E=="boolean"?u.resolve(E):Z(g).then(function(v){return E=v,E})}function ie(g){var v=A[g.name],y={};y.promise=new u(function(Q,_){y.resolve=Q,y.reject=_}),v.deferredOperations.push(y),v.dbReady?v.dbReady=v.dbReady.then(function(){return y.promise}):v.dbReady=y.promise}function se(g){var v=A[g.name],y=v.deferredOperations.pop();if(y)return y.resolve(),y.promise}function te(g,v){var y=A[g.name],Q=y.deferredOperations.pop();if(Q)return Q.reject(v),Q.promise}function fe(g,v){return new u(function(y,Q){if(A[g.name]=A[g.name]||Lt(),g.db)if(v)ie(g),g.db.close();else return y(g.db);var _=[g.name];v&&_.push(g.version);var P=c.open.apply(c,_);v&&(P.onupgradeneeded=function(L){var I=P.result;try{I.createObjectStore(g.storeName),L.oldVersion<=1&&I.createObjectStore(w)}catch(B){if(B.name==="ConstraintError")console.warn('The database "'+g.name+'" has been upgraded from version '+L.oldVersion+" to version "+L.newVersion+', but the storage "'+g.storeName+'" already exists.');else throw B}}),P.onerror=function(L){L.preventDefault(),Q(P.error)},P.onsuccess=function(){var L=P.result;L.onversionchange=function(I){I.target.close()},y(L),se(g)}})}function pe(g){return fe(g,!1)}function we(g){return fe(g,!0)}function D(g,v){if(!g.db)return!0;var y=!g.db.objectStoreNames.contains(g.storeName),Q=g.versiong.db.version;if(Q&&(g.version!==v&&console.warn('The database "'+g.name+`" can't be downgraded from version `+g.db.version+" to version "+g.version+"."),g.version=g.db.version),_||y){if(y){var P=g.db.version+1;P>g.version&&(g.version=P)}return!0}return!1}function oe(g){return new u(function(v,y){var Q=new FileReader;Q.onerror=y,Q.onloadend=function(_){var P=btoa(_.target.result||"");v({__local_forage_encoded_blob:!0,data:P,type:g.type})},Q.readAsBinaryString(g)})}function G(g){var v=R(atob(g.data));return h([v],{type:g.type})}function ge(g){return g&&g.__local_forage_encoded_blob}function Se(g){var v=this,y=v._initReady().then(function(){var Q=A[v._dbInfo.name];if(Q&&Q.dbReady)return Q.dbReady});return p(y,g,g),y}function Ne(g){ie(g);for(var v=A[g.name],y=v.forages,Q=0;Q0&&(!g.db||P.name==="InvalidStateError"||P.name==="NotFoundError"))return u.resolve().then(function(){if(!g.db||P.name==="NotFoundError"&&!g.db.objectStoreNames.contains(g.storeName)&&g.version<=g.db.version)return g.db&&(g.version=g.db.version+1),we(g)}).then(function(){return Ne(g).then(function(){qe(g,v,y,Q-1)})}).catch(y);y(P)}}function Lt(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function Xr(g){var v=this,y={db:null};if(g)for(var Q in g)y[Q]=g[Q];var _=A[y.name];_||(_=Lt(),A[y.name]=_),_.forages.push(v),v._initReady||(v._initReady=v.ready,v.ready=Se);var P=[];function L(){return u.resolve()}for(var I=0;I<_.forages.length;I++){var B=_.forages[I];B!==v&&P.push(B._initReady().catch(L))}var Y=_.forages.slice(0);return u.all(P).then(function(){return y.db=_.db,pe(y)}).then(function(q){return y.db=q,D(y,v._defaultConfig.version)?we(y):q}).then(function(q){y.db=_.db=q,v._dbInfo=y;for(var le=0;le>4,q[_++]=(L&15)<<4|I>>2,q[_++]=(I&3)<<6|B&63;return Y}function In(g){var v=new Uint8Array(g),y="",Q;for(Q=0;Q>2],y+=gr[(v[Q]&3)<<4|v[Q+1]>>4],y+=gr[(v[Q+1]&15)<<2|v[Q+2]>>6],y+=gr[v[Q+2]&63];return v.length%3===2?y=y.substring(0,y.length-1)+"=":v.length%3===1&&(y=y.substring(0,y.length-2)+"=="),y}function ys(g,v){var y="";if(g&&(y=bs.call(g)),g&&(y==="[object ArrayBuffer]"||g.buffer&&bs.call(g.buffer)==="[object ArrayBuffer]")){var Q,_=Zt;g instanceof ArrayBuffer?(Q=g,_+=ms):(Q=g.buffer,y==="[object Int8Array]"?_+=ko:y==="[object Uint8Array]"?_+=Os:y==="[object Uint8ClampedArray]"?_+=Qo:y==="[object Int16Array]"?_+=$o:y==="[object Uint16Array]"?_+=rn:y==="[object Int32Array]"?_+=Dr:y==="[object Uint32Array]"?_+=nn:y==="[object Float32Array]"?_+=gs:y==="[object Float64Array]"?_+=Si:v(new Error("Failed to get type for BinaryArray"))),v(_+In(Q))}else if(y==="[object Blob]"){var P=new FileReader;P.onload=function(){var L=Ye+g.type+"~"+In(this.result);v(Zt+br+L)},P.readAsArrayBuffer(g)}else try{v(JSON.stringify(g))}catch(L){console.error("Couldn't convert value into a JSON string: ",g),v(null,L)}}function gl(g){if(g.substring(0,bn)!==Zt)return JSON.parse(g);var v=g.substring(vi),y=g.substring(bn,vi),Q;if(y===br&&ps.test(v)){var _=v.match(ps);Q=_[1],v=v.substring(_[0].length)}var P=yn(v);switch(y){case ms:return P;case br:return h([P],{type:Q});case ko:return new Int8Array(P);case Os:return new Uint8Array(P);case Qo:return new Uint8ClampedArray(P);case $o:return new Int16Array(P);case rn:return new Uint16Array(P);case Dr:return new Int32Array(P);case nn:return new Uint32Array(P);case gs:return new Float32Array(P);case Si:return new Float64Array(P);default:throw new Error("Unkown type: "+y)}}var xs={serialize:ys,deserialize:gl,stringToBuffer:yn,bufferToString:In};function To(g,v,y,Q){g.executeSql("CREATE TABLE IF NOT EXISTS "+v.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],y,Q)}function _o(g){var v=this,y={db:null};if(g)for(var Q in g)y[Q]=typeof g[Q]!="string"?g[Q].toString():g[Q];var _=new u(function(P,L){try{y.db=openDatabase(y.name,String(y.version),y.description,y.size)}catch(I){return L(I)}y.db.transaction(function(I){To(I,y,function(){v._dbInfo=y,P()},function(B,Y){L(Y)})},L)});return y.serializer=xs,_}function yr(g,v,y,Q,_,P){g.executeSql(y,Q,_,function(L,I){I.code===I.SYNTAX_ERR?L.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[v.storeName],function(B,Y){Y.rows.length?P(B,I):To(B,v,function(){B.executeSql(y,Q,_,P)},P)},P):P(L,I)},P)}function zn(g,v){var y=this;g=O(g);var Q=new u(function(_,P){y.ready().then(function(){var L=y._dbInfo;L.db.transaction(function(I){yr(I,L,"SELECT * FROM "+L.storeName+" WHERE key = ? LIMIT 1",[g],function(B,Y){var q=Y.rows.length?Y.rows.item(0).value:null;q&&(q=L.serializer.deserialize(q)),_(q)},function(B,Y){P(Y)})})}).catch(P)});return f(Q,v),Q}function Wn(g,v){var y=this,Q=new u(function(_,P){y.ready().then(function(){var L=y._dbInfo;L.db.transaction(function(I){yr(I,L,"SELECT * FROM "+L.storeName,[],function(B,Y){for(var q=Y.rows,le=q.length,ye=0;ye0){L(Co.apply(_,[g,B,y,Q-1]));return}I(ye)}})})}).catch(I)});return f(P,y),P}function bl(g,v,y){return Co.apply(this,[g,v,y,1])}function yl(g,v){var y=this;g=O(g);var Q=new u(function(_,P){y.ready().then(function(){var L=y._dbInfo;L.db.transaction(function(I){yr(I,L,"DELETE FROM "+L.storeName+" WHERE key = ?",[g],function(){_()},function(B,Y){P(Y)})})}).catch(P)});return f(Q,v),Q}function xl(g){var v=this,y=new u(function(Q,_){v.ready().then(function(){var P=v._dbInfo;P.db.transaction(function(L){yr(L,P,"DELETE FROM "+P.storeName,[],function(){Q()},function(I,B){_(B)})})}).catch(_)});return f(y,g),y}function Sl(g){var v=this,y=new u(function(Q,_){v.ready().then(function(){var P=v._dbInfo;P.db.transaction(function(L){yr(L,P,"SELECT COUNT(key) as c FROM "+P.storeName,[],function(I,B){var Y=B.rows.item(0).c;Q(Y)},function(I,B){_(B)})})}).catch(_)});return f(y,g),y}function Ss(g,v){var y=this,Q=new u(function(_,P){y.ready().then(function(){var L=y._dbInfo;L.db.transaction(function(I){yr(I,L,"SELECT key FROM "+L.storeName+" WHERE id = ? LIMIT 1",[g+1],function(B,Y){var q=Y.rows.length?Y.rows.item(0).key:null;_(q)},function(B,Y){P(Y)})})}).catch(P)});return f(Q,v),Q}function vs(g){var v=this,y=new u(function(Q,_){v.ready().then(function(){var P=v._dbInfo;P.db.transaction(function(L){yr(L,P,"SELECT key FROM "+P.storeName,[],function(I,B){for(var Y=[],q=0;q '__WebKitDatabaseInfoTable__'",[],function(_,P){for(var L=[],I=0;I0}function Pl(g){var v=this,y={};if(g)for(var Q in g)y[Q]=g[Q];return y.keyPrefix=vl(g,v._defaultConfig),Eo()?(v._dbInfo=y,y.serializer=xs,u.resolve()):u.reject()}function Mo(g){var v=this,y=v.ready().then(function(){for(var Q=v._dbInfo.keyPrefix,_=localStorage.length-1;_>=0;_--){var P=localStorage.key(_);P.indexOf(Q)===0&&localStorage.removeItem(P)}});return f(y,g),y}function hu(g,v){var y=this;g=O(g);var Q=y.ready().then(function(){var _=y._dbInfo,P=localStorage.getItem(_.keyPrefix+g);return P&&(P=_.serializer.deserialize(P)),P});return f(Q,v),Q}function wi(g,v){var y=this,Q=y.ready().then(function(){for(var _=y._dbInfo,P=_.keyPrefix,L=P.length,I=localStorage.length,B=1,Y=0;Y=0;L--){var I=localStorage.key(L);I.indexOf(P)===0&&localStorage.removeItem(I)}}):_=u.reject("Invalid arguments"),f(_,v),_}var Lo={_driver:"localStorageWrapper",_initStorage:Pl,_support:Ro(),iterate:wi,getItem:hu,setItem:pu,removeItem:Yn,clear:Mo,length:Je,key:uu,keys:fu,dropInstance:kl},Ql=function(v,y){return v===y||typeof v=="number"&&typeof y=="number"&&isNaN(v)&&isNaN(y)},$l=function(v,y){for(var Q=v.length,_=0;_{"use strict";function Dk(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,n=Array(e);t2?n-2:0),s=2;s1?t-1:0),i=1;i1?t-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:il;if(Ik&&Ik(r,null),!xo(e))return r;let n=e.length;for(;n--;){let i=e[n];if(typeof i=="string"){let s=t(i);s!==i&&(dZ(e)||(e[n]=s),i=s)}r[i]=!0}return r}function yZ(r){for(let e=0;e/g),QZ=bt(/\${[\w\W]*/g),$Z=bt(/^data-[\-\w.\u00B7-\uFFFF]+$/),TZ=bt(/^aria-[\-\w]+$/),qk=bt(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),_Z=bt(/^(?:\w+script|data):/i),CZ=bt(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),AZ=bt(/^html$/i),RZ=bt(/^[a-z][.\w]*(-[.\w]+)+$/i),Gk=bt(/<[/\w!]/g),Hk=bt(/<[/\w]/g),EZ=bt(/<\/no(script|embed|frames)/i),MZ=bt(/\/>/i),pr={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},tQ=["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"],LZ=Ot(Ee({},tQ)),ZZ=(function(){let r={};return ls(tQ,e=>{r[e]=bt(new RegExp("])","i"))}),Ot(r)})(),XZ=function(){return typeof window=="undefined"?null:window},DZ=function(e,t){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let n=null,i="data-tt-policy-suffix";t&&t.hasAttribute(i)&&(n=t.getAttribute(i));let s="dompurify"+(n?"#"+n:"");try{return e.createPolicy(s,{createHTML(o){return o},createScriptURL(o){return o}})}catch(o){return console.warn("TrustedTypes policy "+s+" could not be created."),null}},Kk=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},bi=function(e,t,n,i){return ir(e,t)&&xo(e[t])?Ee(i.base?mr(i.base):{},e[t],i.transform):n},Zg=function(e,t,n){let i=ir(e,t)?e[t]:void 0;return i&&typeof i=="object"?mr(i):n()};function rQ(){let r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:XZ(),e=j=>rQ(j);if(e.version="3.4.15",e.removed=[],!r||!r.document||r.document.nodeType!==pr.document||!r.Element)return e.isSupported=!1,e;let t=r.document,n=t,i=n.currentScript;r.DocumentFragment;let s=r.HTMLTemplateElement,o=r.Node,a=r.Element,l=r.NodeFilter,c=r.NamedNodeMap;c===void 0&&(r.NamedNodeMap||r.MozNamedAttrMap),r.HTMLFormElement;let d=r.DOMParser,h=r.trustedTypes,u=a.prototype,f=Lr(u,"cloneNode"),p=Lr(u,"remove"),O=Lr(u,"removeAttributeNode"),x=Lr(u,"nextSibling"),w=Lr(u,"childNodes"),E=Lr(u,"parentNode"),A=Lr(u,"shadowRoot"),X=Lr(u,"attributes"),T=o&&o.prototype?Lr(o.prototype,"nodeType"):null,k=o&&o.prototype?Lr(o.prototype,"nodeName"):null,R=o&&o.prototype?Lr(o.prototype,"ownerDocument"):null,Z=function(b){return T?T(b):b.nodeType},U=function(b){return k?k(b):b.nodeName};if(typeof s=="function"){let j=t.createElement("template");j.content&&j.content.ownerDocument&&(t=j.content.ownerDocument)}let ie,se="",te,fe=!1,pe=0,we=function(){if(pe>0)throw as('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},D=function(b){we(),pe++;try{return ie.createHTML(b)}finally{pe--}},oe=function(b){we(),pe++;try{return ie.createScriptURL(b)}finally{pe--}},G=function(){return fe||(te=DZ(h,i),fe=!0),te},ge=t,Se=ge.implementation,Ne=ge.createNodeIterator,qe=ge.createDocumentFragment,Lt=ge.getElementsByTagName,Xr=n.importNode,Ae=Kk();e.isSupported=typeof Jk=="function"&&typeof E=="function"&&Se&&Se.createHTMLDocument!==void 0;let Dn=PZ,fs=kZ,ou=QZ,au=$Z,lu=TZ,cu=_Z,ml=CZ,du=RZ,Ol=qk,Ve=null,gr=Ee({},[...jk,...Rg,...Eg,...Mg,...Fk]),Ye=null,ps=Ee({},[...Nk,...Lg,...Uk,...zh]),Zt=Object.seal(yo(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),bn=null,ms=null,br=Object.seal(yo(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),ko=!0,Os=!0,Qo=!1,$o=!0,Dr=!1,rn=!0,nn=!1,gs=!1,Si=null,vi=null,bs=!1,yn=!1,In=!1,ys=!1,gl=!0,xs=!1,To="user-content-",_o=!0,yr=!1,zn={},Wn=null,Co=Ee({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]),bl=null,yl=Ee({},["audio","video","img","source","image","track"]),xl=null,Sl=Ee({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ss="http://www.w3.org/1998/Math/MathML",vs="http://www.w3.org/2000/svg",xr="http://www.w3.org/1999/xhtml",Vn=xr,Ao=!1,Ro=null,vl=Ee({},[Ss,vs,xr],Ag),wl=Ot(["mi","mo","mn","ms","mtext"]),Eo=Ee({},wl),Pl=Ot(["annotation-xml"]),Mo=Ee({},Pl),hu=Ee({},["title","style","font","a","script"]),wi=null,uu=["application/xhtml+xml","text/html"],fu="text/html",Je=null,Yn=null,pu=t.createElement("form"),kl=function(b){return b instanceof RegExp||b instanceof Function},Lo=function(){let b=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(Yn&&Yn===b)return;(!b||typeof b!="object")&&(b={}),b=mr(b),wi=uu.indexOf(b.PARSER_MEDIA_TYPE)===-1?fu:b.PARSER_MEDIA_TYPE,Je=wi==="application/xhtml+xml"?Ag:il,Ve=bi(b,"ALLOWED_TAGS",gr,{transform:Je}),Ye=bi(b,"ALLOWED_ATTR",ps,{transform:Je}),Ro=bi(b,"ALLOWED_NAMESPACES",vl,{transform:Ag}),xl=bi(b,"ADD_URI_SAFE_ATTR",Sl,{transform:Je,base:Sl}),bl=bi(b,"ADD_DATA_URI_TAGS",yl,{transform:Je,base:yl}),Wn=bi(b,"FORBID_CONTENTS",Co,{transform:Je}),bn=bi(b,"FORBID_TAGS",mr({}),{transform:Je}),ms=bi(b,"FORBID_ATTR",mr({}),{transform:Je}),zn=ir(b,"USE_PROFILES")?b.USE_PROFILES&&typeof b.USE_PROFILES=="object"?mr(b.USE_PROFILES):b.USE_PROFILES:!1,ko=b.ALLOW_ARIA_ATTR!==!1,Os=b.ALLOW_DATA_ATTR!==!1,Qo=b.ALLOW_UNKNOWN_PROTOCOLS||!1,$o=b.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Dr=b.SAFE_FOR_TEMPLATES||!1,rn=b.SAFE_FOR_XML!==!1,nn=b.WHOLE_DOCUMENT||!1,yn=b.RETURN_DOM||!1,In=b.RETURN_DOM_FRAGMENT||!1,ys=b.RETURN_TRUSTED_TYPE||!1,bs=b.FORCE_BODY||!1,gl=b.SANITIZE_DOM!==!1,xs=b.SANITIZE_NAMED_PROPS||!1,_o=b.KEEP_CONTENT!==!1,yr=b.IN_PLACE||!1,Ol=SZ(b.ALLOWED_URI_REGEXP)?b.ALLOWED_URI_REGEXP:qk,Vn=typeof b.NAMESPACE=="string"?b.NAMESPACE:xr,Eo=Zg(b,"MATHML_TEXT_INTEGRATION_POINTS",()=>Ee({},wl)),Mo=Zg(b,"HTML_INTEGRATION_POINTS",()=>Ee({},Pl));let C=Zg(b,"CUSTOM_ELEMENT_HANDLING",()=>yo(null));if(Zt=yo(null),ir(C,"tagNameCheck")&&kl(C.tagNameCheck)&&(Zt.tagNameCheck=C.tagNameCheck),ir(C,"attributeNameCheck")&&kl(C.attributeNameCheck)&&(Zt.attributeNameCheck=C.attributeNameCheck),ir(C,"allowCustomizedBuiltInElements")&&typeof C.allowCustomizedBuiltInElements=="boolean"&&(Zt.allowCustomizedBuiltInElements=C.allowCustomizedBuiltInElements),bt(Zt),Dr&&(Os=!1),In&&(yn=!0),zn&&(Ve=Ee({},Fk),Ye=yo(null),zn.html===!0&&(Ee(Ve,jk),Ee(Ye,Nk)),zn.svg===!0&&(Ee(Ve,Rg),Ee(Ye,Lg),Ee(Ye,zh)),zn.svgFilters===!0&&(Ee(Ve,Eg),Ee(Ye,Lg),Ee(Ye,zh)),zn.mathMl===!0&&(Ee(Ve,Mg),Ee(Ye,Uk),Ee(Ye,zh))),br.tagCheck=null,br.attributeCheck=null,ir(b,"ADD_TAGS")&&(typeof b.ADD_TAGS=="function"?br.tagCheck=b.ADD_TAGS:xo(b.ADD_TAGS)&&(Ve===gr&&(Ve=mr(Ve)),Ee(Ve,b.ADD_TAGS,Je))),ir(b,"ADD_ATTR")&&(typeof b.ADD_ATTR=="function"?br.attributeCheck=b.ADD_ATTR:xo(b.ADD_ATTR)&&(Ye===ps&&(Ye=mr(Ye)),Ee(Ye,b.ADD_ATTR,Je))),ir(b,"ADD_FORBID_CONTENTS")&&xo(b.ADD_FORBID_CONTENTS)&&(Wn===Co&&(Wn=mr(Wn)),Ee(Wn,b.ADD_FORBID_CONTENTS,Je)),_o&&(Ve["#text"]=!0),nn&&Ee(Ve,["html","head","body"]),Ve.table&&(Ee(Ve,["tbody"]),delete bn.tbody),b.TRUSTED_TYPES_POLICY){if(typeof b.TRUSTED_TYPES_POLICY.createHTML!="function")throw as('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof b.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw as('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');let z=ie;ie=b.TRUSTED_TYPES_POLICY;try{se=D("")}catch(ne){throw ie=z,ne}}else b.TRUSTED_TYPES_POLICY===null?(ie=void 0,se=""):(ie===void 0&&(ie=G()),ie&&typeof se=="string"&&(se=D("")));Ot&&Ot(b),Yn=b},Ql=Ee({},[...Rg,...Eg,...vZ]),$l=Ee({},[...Mg,...wZ]),Tl=function(b,C,z){return C.namespaceURI===xr?b==="svg":C.namespaceURI===Ss?b==="svg"&&(z==="annotation-xml"||Eo[z]):!!Ql[b]},Pi=function(b,C,z){return C.namespaceURI===xr?b==="math":C.namespaceURI===vs?b==="math"&&Mo[z]:!!$l[b]},_l=function(b,C,z){return C.namespaceURI===vs&&!Mo[z]||C.namespaceURI===Ss&&!Eo[z]?!1:!$l[b]&&(hu[b]||!Ql[b])},Bn=function(b){let C=E(b);(!C||!C.tagName)&&(C={namespaceURI:Vn,tagName:"template"});let z=il(b.tagName),ne=il(C.tagName);return Ro[b.namespaceURI]?b.namespaceURI===vs?Tl(z,C,ne):b.namespaceURI===Ss?Pi(z,C,ne):b.namespaceURI===xr?_l(z,C,ne):!!(wi==="application/xhtml+xml"&&Ro[b.namespaceURI]):!1},sn=function(b){tl(e.removed,{element:b});try{E(b).removeChild(b)}catch(C){if(p(b),!E(b))throw as("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},ki=function(b,C,z){try{O(b,C)}catch(ne){try{b.removeAttribute(z)}catch(he){}}},jn=function(b){Fn(b);let C=w(b);if(C){let ne=[];ls(C,he=>{tl(ne,he)}),ls(ne,he=>{try{p(he)}catch(me){}})}let z=X(b);if(z)for(let ne=z.length-1;ne>=0;--ne){let he=z[ne],me=he&&he.name;typeof me=="string"&&ki(b,he,me)}},xn=function(b,C,z){if(!z)try{z=C.getAttributeNode(b)}catch(ne){z=null}tl(e.removed,{attribute:z||null,from:C});try{z?O(C,z):C.removeAttribute(b)}catch(ne){try{C.removeAttribute(b)}catch(he){}}if(b==="is")if(yn||In)try{sn(C)}catch(ne){}else try{C.setAttribute(b,"")}catch(ne){}},mu=function(b){let C=X(b);if(C)for(let z=C.length-1;z>=0;--z){let ne=C[z],he=ne&&ne.name;typeof he!="string"||Ye[Je(he)]||ki(b,ne,he)}},Fn=function(b){let C=[b];for(;C.length>0;){let z=C.pop();Z(z)===pr.element&&mu(z);let he=w(z);if(he)for(let me=he.length-1;me>=0;--me)C.push(he[me])}},Cl=function(b,C){return rn?b==="patchsrc"?!0:b==="for"&&C!=="label"&&C!=="output":!1},Ou=function(b){if(!rn)return;let C=[b];for(;C.length>0;){let z=C.pop(),ne=Z(z);if(ne===pr.processingInstruction||ne===pr.comment&&Mt(Hk,z.data)){try{p(z)}catch(me){}continue}if(ne===pr.element){let me=z,Be=Je(U(z));try{me.hasAttribute&&me.hasAttribute("patchsrc")&&me.removeAttribute("patchsrc"),me.hasAttribute&&me.hasAttribute("for")&&Cl("for",Be)&&me.removeAttribute("for")}catch(et){}}let he=w(z);if(he)for(let me=he.length-1;me>=0;--me)C.push(he[me])}},g=function(b){let C=null,z=null;if(bs)b=""+b;else{let me=Wk(b,/^[\r\n\t ]+/);z=me&&me[0]}wi==="application/xhtml+xml"&&Vn===xr&&(b=''+b+"");let ne=ie?D(b):b;if(Vn===xr)try{C=new d().parseFromString(ne,wi)}catch(me){}if(!C||!C.documentElement){C=Se.createDocument(Vn,"template",null);try{C.documentElement.innerHTML=Ao?se:ne}catch(me){}}let he=C.body||C.documentElement;return b&&z&&he.insertBefore(t.createTextNode(z),he.childNodes[0]||null),Vn===xr?Lt.call(C,nn?"html":"body")[0]:nn?C.documentElement:he},v=function(b){let C=R?R(b):b.ownerDocument;return Ne.call(C||b,b,l.SHOW_ELEMENT|l.SHOW_COMMENT|l.SHOW_TEXT|l.SHOW_PROCESSING_INSTRUCTION|l.SHOW_CDATA_SECTION,null)},y=function(b){return b=rl(b,Dn," "),b=rl(b,fs," "),b=rl(b,ou," "),b},Q=function(b){var C;b.normalize();let z=R?R(b):b.ownerDocument,ne=Ne.call(z||b,b,l.SHOW_TEXT|l.SHOW_COMMENT|l.SHOW_CDATA_SECTION|l.SHOW_PROCESSING_INSTRUCTION,null),he=ne.nextNode();for(;he;)he.data=y(he.data),he=ne.nextNode();let me=(C=b.querySelectorAll)===null||C===void 0?void 0:C.call(b,"template");me&&ls(me,Be=>{P(Be.content)&&Q(Be.content)})},_=function(b){let C=k?k(b):null;return typeof C!="string"||Je(C)!=="form"?!1:typeof b.nodeName!="string"||typeof b.textContent!="string"||typeof b.removeChild!="function"||b.attributes!==X(b)||typeof b.removeAttribute!="function"||typeof b.removeAttributeNode!="function"||typeof b.getAttributeNode!="function"||typeof b.setAttribute!="function"||typeof b.namespaceURI!="string"||typeof b.insertBefore!="function"||typeof b.hasChildNodes!="function"||b.nodeType!==T(b)||b.childNodes!==w(b)},P=function(b){if(!T||typeof b!="object"||b===null)return!1;try{return T(b)===pr.documentFragment}catch(C){return!1}},L=function(b){if(!T||typeof b!="object"||b===null)return!1;try{return typeof T(b)=="number"}catch(C){return!1}};function I(j,b,C){j.length!==0&&ls(j,z=>{z.call(e,b,C,Yn)})}let B=function(b,C){return!!(rn&&b.hasChildNodes()&&!L(b.firstElementChild)&&Mt(Gk,b.textContent)&&Mt(Gk,b.innerHTML)||rn&&b.namespaceURI===xr&&LZ[C]&&(L(b.firstElementChild)||typeof b.textContent=="string"&&Mt(ZZ[C],b.textContent))||b.nodeType===pr.processingInstruction||rn&&b.nodeType===pr.comment&&Mt(Hk,b.data))},Y=function(b,C){if(b instanceof RegExp)return Mt(b,C);if(b instanceof Function){for(var z=arguments.length,ne=new Array(z>2?z-2:0),he=2;he=0;--Be){let et=b===z?f(he[Be],!0):he[Be];ne.insertBefore(et,x(b))}}}return sn(b),!0},le=function(b,C,z,ne){return b.length===0?C:C===z||C===ne?mr(C):C},ye=function(b,C){return b===C||E(b)!==null?!1:(yr&&Fn(b),!0)},Re=function(b,C){if(I(Ae.beforeSanitizeElements,b,null),ye(b,C))return!0;if(_(b))return sn(b),!0;let z=Je(U(b));if(Ve=le(Ae.uponSanitizeElement,Ve,gr,Si),I(Ae.uponSanitizeElement,b,{tagName:z,allowedTags:Ve}),ye(b,C))return!0;if(B(b,z))return sn(b),!0;if(bn[z]||!(br.tagCheck instanceof Function&&br.tagCheck(z))&&!Ve[z]){let he=q(b,z,C);return he===!1&&I(Ae.afterSanitizeElements,b,null),he}if(Z(b)===pr.element&&!Bn(b)||(z==="noscript"||z==="noembed"||z==="noframes")&&Mt(EZ,b.innerHTML))return sn(b),!0;if(Dr&&b.nodeType===pr.text){let he=y(b.textContent);b.textContent!==he&&(tl(e.removed,{element:b.cloneNode()}),b.textContent=he)}return I(Ae.afterSanitizeElements,b,null),!1},Me=function(b,C,z){if(ms[C]||Cl(C,b)||gl&&(C==="id"||C==="name")&&(z in t||z in pu))return!1;let ne=Ye[C]||br.attributeCheck instanceof Function&&br.attributeCheck(C,b);return Os&&Mt(au,C)||ko&&Mt(lu,C)?!0:ne?xl[C]||Mt(Ol,rl(z,ml,""))||(C==="src"||C==="xlink:href"||C==="href")&&b!=="script"&&Vk(z,"data:")===0&&bl[b]||Qo&&!Mt(cu,rl(z,ml,""))?!0:!z:Ge(b)&&Y(Zt.tagNameCheck,b)&&Y(Zt.attributeNameCheck,C,b)||C==="is"&&Zt.allowCustomizedBuiltInElements&&Y(Zt.tagNameCheck,z)},nt=Ee({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),Ge=function(b){return!nt[il(b)]&&Mt(du,b)},Ut=function(b,C,z,ne){if(ie&&typeof h=="object"&&typeof h.getAttributeType=="function"&&!z)switch(h.getAttributeType(b,C)){case"TrustedHTML":return D(ne);case"TrustedScriptURL":return oe(ne)}return ne},Qi=function(b,C,z,ne){try{return z?b.setAttributeNS(z,C,ne):b.setAttribute(C,ne),_(b)?(sn(b),!1):!0}catch(he){return xn(C,b),!1}},ws=function(b){I(Ae.beforeSanitizeAttributes,b,null);let C=b.attributes;if(!C||_(b))return;Ye=le(Ae.uponSanitizeAttribute,Ye,ps,vi);let z={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ye,forceKeepAttr:void 0},ne=C.length,he=Je(b.nodeName);for(;ne--;){let me=C[ne],Be=me.name,et=me.namespaceURI,qt=me.value,Gt=Je(Be),gu=qt,Xt=Be==="value"?gu:mZ(gu),sb=!1;if(z.attrName=Gt,z.attrValue=Xt,z.keepAttr=!0,z.forceKeepAttr=void 0,I(Ae.uponSanitizeAttribute,b,z),Xt=z.attrValue,xs&&(Gt==="id"||Gt==="name")&&Vk(Xt,To)!==0&&(xn(Be,b,me),Xt=To+Xt,sb=!0),rn&&Mt(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,Xt)){xn(Be,b,me);continue}if(Gt==="attributename"&&Wk(Xt,"href")){xn(Be,b,me);continue}if(!z.forceKeepAttr){if(!z.keepAttr){xn(Be,b,me);continue}if(!$o&&Mt(MZ,Xt)){xn(Be,b,me);continue}if(Dr&&(Xt=y(Xt)),!Me(he,Gt,Xt)){xn(Be,b,me);continue}Xt=Ut(he,Gt,et,Xt),Xt!==gu&&Qi(b,Be,et,Xt)&&sb&&zk(e.removed)}}I(Ae.afterSanitizeAttributes,b,null)},Ps=function(b){let C=null,z=v(b);for(I(Ae.beforeSanitizeShadowDOM,b,null);C=z.nextNode();)if(I(Ae.uponSanitizeShadowNode,C,null),Re(C,b),ws(C),P(C.content)&&Ps(C.content),Z(C)===pr.element){let ne=A(C);P(ne)&&($i(ne),Ps(ne))}I(Ae.afterSanitizeShadowDOM,b,null)},$i=function(b){let C=[{node:b,shadow:null}];for(;C.length>0;){let z=C.pop();if(z.shadow){Ps(z.shadow);continue}let ne=z.node,me=Z(ne)===pr.element,Be=w(ne);if(Be)for(let et=Be.length-1;et>=0;--et)C.push({node:Be[et],shadow:null});if(me){let et=k?k(ne):null;if(typeof et=="string"&&Je(et)==="template"){let qt=ne.content;P(qt)&&C.push({node:qt,shadow:null})}}if(me){let et=A(ne);P(et)&&C.push({node:null,shadow:et},{node:et,shadow:null})}}};return e.sanitize=function(j){let b=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},C=null,z=null,ne=null,he=null;if(Ao=!j,Ao&&(j=""),typeof j!="string"&&!L(j)&&(j=xZ(j),typeof j!="string"))throw as("dirty is not a string, aborting");if(!e.isSupported)return j;gs?(Ve=Si,Ye=vi):Lo(b),(Ae.uponSanitizeElement.length>0||Ae.uponSanitizeAttribute.length>0)&&(Ve=mr(Ve)),Ae.uponSanitizeAttribute.length>0&&(Ye=mr(Ye)),e.removed=[];let me=yr&&typeof j!="string"&&L(j);if(me){Ou(j);let qt=U(j);if(typeof qt=="string"){let Gt=Je(qt);if(!Ve[Gt]||bn[Gt])throw jn(j),as("root node is forbidden and cannot be sanitized in-place")}if(_(j))throw jn(j),as("root node is clobbered and cannot be sanitized in-place");try{$i(j)}catch(Gt){throw jn(j),Gt}}else if(L(j))C=g(""),z=C.ownerDocument.importNode(j,!0),z.nodeType===pr.element&&z.nodeName==="BODY"||z.nodeName==="HTML"?C=z:C.appendChild(z),$i(C);else{if(!yn&&!Dr&&!nn&&j.indexOf("<")===-1)return ie&&ys?D(j):j;if(C=g(j),!C)return yn?null:ys?se:""}C&&bs&&sn(C.firstChild);let Be=me?j:C;try{let qt=v(Be);for(;ne=qt.nextNode();)Re(ne,Be),ws(ne),P(ne.content)&&Ps(ne.content)}catch(qt){throw me&&(jn(j),ls(e.removed,Gt=>{Gt.element&&Fn(Gt.element)})),qt}if(me)return ls(e.removed,qt=>{qt.element&&Fn(qt.element)}),Dr&&Q(j),j;if(yn){if(Dr&&Q(C),In)for(he=qe.call(C.ownerDocument);C.firstChild;)he.appendChild(C.firstChild);else he=C;return(Ye.shadowroot||Ye.shadowrootmode)&&(he=Xr.call(n,he,!0)),he}let et=nn?C.outerHTML:C.innerHTML;return nn&&Ve["!doctype"]&&C.ownerDocument&&C.ownerDocument.doctype&&C.ownerDocument.doctype.name&&Mt(AZ,C.ownerDocument.doctype.name)&&(et=" -`+et),Dr&&(et=y(et)),ie&&ys?D(et):et},e.setConfig=function(){let j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Lo(j),gs=!0,Si=Ve,vi=Ye},e.clearConfig=function(){Yn=null,gs=!1,Si=null,vi=null,ie=te,se=""},e.isValidAttribute=function(j,b,C){Yn||Lo({});let z=Je(j),ne=Je(b);return Me(z,ne,C)},e.addHook=function(j,b){typeof b=="function"&&ir(Ae,j)&&tl(Ae[j],b)},e.removeHook=function(j,b){if(ir(Ae,j)){if(b!==void 0){let C=fZ(Ae[j],b);return C===-1?void 0:pZ(Ae[j],C,1)[0]}return zk(Ae[j])}},e.removeHooks=function(j){ir(Ae,j)&&(Ae[j]=[])},e.removeAllHooks=function(){Ae=Kk()},e}var IZ=rQ();nQ.exports=IZ});var Hg=bu(_u());var De=[/^\s*[.#%]?(include|incbin|embed)\s+"(.+?)"/gmi,/^\s*([;']|[/][/])#(resource)\s+"(.+?)"/gm],je=[/^\s*([;]|[/][/])#link\s+"(.+?)"/gm],zo=[/^\s*(`include|[.]include)\s+"(.+?)"/gmi,/^\s*\$(include|\$dofile|\$write_image_in_table)\('(.+?)'/gmi,{re:/^\s*([.]arch)\s+(\w+)/gmi,suffix:".json"},/\$readmem[bh]\("(.+?)"/gmi],JQ=[{re:/^\s*[.#%]?\s*include\s+<(.+?)>/gmi,system:!0}];function vb(r){let e=r&&Dt(r);return e&&e.includeDirs&&e.includeDirs.length?JQ:[]}var xb=[/^\s+(USE|ASM)\s+(\S+[.]\S+)/gm],e$=[/^[!]src\s+"(.+?)"/gmi],t$=[{re:/^\s*import\s*"(.+?)";/gmi,suffix:".wiz"},/^\s*embed\s*"(.+?)";/gmi],r$=[/^\s*(import)\s*"(.+?)"/gmi],n$=[/^\s*%%\s*#include\s+"(.+?)"/gm],i$={cc65:{apple2:"https://cc65.github.io/doc/apple2.html",atari8:"https://cc65.github.io/doc/atari.html",c64:"https://cc65.github.io/doc/c64.html",nes:"https://cc65.github.io/doc/nes.html",pce:"https://cc65.github.io/doc/pce.html",vic20:"https://cc65.github.io/doc/vic20.html",lynx:"https://cc65.github.io/doc/lynx.html"}},Sb={apple2:{preloadFS:"65-apple2"},c64:{preloadFS:"65-c64"},vic20:{preloadFS:"65-vic20"},nes:{preloadFS:"65-nes"},atari8:{preloadFS:"65-atari8"},vector:{preloadFS:"65-none"},atari7800:{preloadFS:"65-none"},devel:{preloadFS:"65-none"},vcs:{preloadFS:"65-atari2600"},pce:{preloadFS:"65-pce"},exidy:{preloadFS:"65-none"}},_s={dasm:{id:"dasm",name:"DASM",kind:"assembler",arch:"6502",extensions:[".dasm"],editorStyle:"6502",helpURL:"https://raw.githubusercontent.com/dasm-assembler/dasm/refs/tags/v2.20.17/docs/dasm.txt",wasmModule:"dasm-wasisdk",version:"2.20.17",includePatterns:De,linkPatterns:je},acme:{id:"acme",name:"ACME",kind:"assembler",arch:"6502",extensions:[".acme"],editorStyle:"6502",helpURL:"https://raw.githubusercontent.com/sehugg/acme/main/docs/QuickRef.txt",wasmModule:"acme",version:"0.97.1",includePatterns:[...De,...e$],linkPatterns:je},xa:{id:"xa",name:"XA",kind:"assembler",arch:"6502",extensions:[".xa"],editorStyle:"6502",helpURL:"https://www.floodgap.com/retrotech/xa/",wasmModule:"xa",version:"2.4.1",includePatterns:De,linkPatterns:je},nesasm:{id:"nesasm",name:"NESASM",kind:"assembler",arch:"6502",extensions:[".nesasm"],editorStyle:"6502",helpURL:"https://github.com/camsaul/nesasm",wasmModule:"nesasm",version:"3.1",includePatterns:De,linkPatterns:je},merlin32:{id:"merlin32",name:"Merlin 32",kind:"assembler",arch:"6502",extensions:[".lnk"],editorStyle:"6502",helpURL:"https://github.com/apple2accumulator/merlin32",wasmModule:"merlin32",version:"1.1.10",includePatterns:[...De,...xb],linkPatterns:je},cc65:{id:"cc65",name:"cc65",kind:"compiler",arch:"6502",extensions:[".c",".h"],includeDirs:["/include","/asminc"],editorStyle:"text/x-csrc",helpURL:"https://cc65.github.io/doc/cc65.html",wasmModule:"cc65",version:"2.19",defineFlag:"-D",defineInline:!0,platforms:Sb,includePatterns:De,linkPatterns:je},ca65:{id:"ca65",name:"ca65",kind:"assembler",arch:"6502",extensions:[".s",".ca65",".inc"],includeDirs:["/include","/asminc"],editorStyle:"6502",helpURL:"https://cc65.github.io/doc/ca65.html",wasmModule:"ca65",version:"2.19",defineFlag:"-D",defineInline:!1,platforms:Sb,includePatterns:De,linkPatterns:je},ld65:{id:"ld65",name:"ld65",kind:"linker",arch:"6502",extensions:[],wasmModule:"ld65",version:"2.19",linkSymbolFlag:"-D",linkSymbolInline:!1},sdcc:{id:"sdcc",name:"SDCC",kind:"compiler",arch:"z80",extensions:[".c",".h"],includeDirs:["/include"],editorStyle:"text/x-csrc",helpURL:"http://sdcc.sourceforge.net/doc/sdccman.pdf",wasmModule:"sdcc",version:"3.6.5",defineFlag:"-D",defineInline:!0,platforms:{default:{preloadFS:"sdcc"}},includePatterns:De,linkPatterns:je},sdasz80:{id:"sdasz80",name:"sdasz80",kind:"assembler",arch:"z80",extensions:[".s"],includeDirs:["/include"],editorStyle:"z80",wasmModule:"sdasz80",version:"02.00",platforms:{default:{preloadFS:"sdcc"}},includePatterns:De,linkPatterns:je},sdasgb:{id:"sdasgb",name:"sdasgb",kind:"assembler",arch:"gbz80",extensions:[".sgb"],includeDirs:["/include"],editorStyle:"z80",wasmModule:"sdasgb",platforms:{default:{preloadFS:"sdcc"}},includePatterns:De,linkPatterns:je},sdldz80:{id:"sdldz80",name:"sdldz80",kind:"linker",arch:"z80",extensions:[],wasmModule:"sdldz80",version:"03.00",linkSymbolFlag:"-g",linkSymbolInline:!1},sccz80:{id:"sccz80",name:"sccz80",kind:"compiler",arch:"z80",extensions:[".scc"],platforms:{default:{preloadFS:"sccz80"}},noWorkerBuild:!0},naken:{id:"naken",name:"Naken",kind:"assembler",extensions:[".ns"],helpURL:"https://github.com/mikeakohn/naken_asm",noWorkerBuild:!0},zmac:{id:"zmac",name:"zmac",kind:"assembler",arch:"z80",extensions:[".z"],editorStyle:"z80",helpURL:"https://raw.githubusercontent.com/sehugg/zmac/master/doc.txt",wasmModule:"zmac",version:"28jul2018",includePatterns:De,linkPatterns:je},jsasm:{id:"jsasm",name:"JSASM",kind:"assembler",extensions:[".asm"],editorStyle:"z80",includePatterns:zo,linkPatterns:[]},xasm6809:{id:"xasm6809",name:"XASM6809",kind:"assembler",arch:"6809",extensions:[".xasm"],editorStyle:"6809",wasmModule:"xasm6809",includePatterns:[...De,...xb],linkPatterns:je},cmoc:{id:"cmoc",name:"CMOC",kind:"compiler",arch:"6809",extensions:[".c",".h"],editorStyle:"text/x-csrc",helpURL:"https://github.com/stahta01/cmoc/",wasmModule:"cmoc",version:"0.1.67",defineFlag:"-D",defineInline:!1,includePatterns:De,linkPatterns:je},lwasm:{id:"lwasm",name:"LWASM",kind:"assembler",arch:"6809",extensions:[".lwasm"],wasmModule:"lwasm",version:"4.17",includePatterns:De,linkPatterns:je},lwlink:{id:"lwlink",name:"LWLINK",kind:"linker",arch:"6809",extensions:[],wasmModule:"lwlink",version:"4.17"},vasmarm:{id:"vasmarm",name:"vasm (ARM)",kind:"assembler",arch:"arm32",extensions:[".vasm"],editorStyle:"vasm",wasmModule:"vasmarm_std",version:"1.8k",defineFlag:"-D",defineInline:!1,includePatterns:De,linkPatterns:je},armips:{id:"armips",name:"armips",kind:"assembler",arch:"arm32",extensions:[".armips"],editorStyle:"vasm",wasmModule:"armips",version:"0.11.0",includePatterns:De,linkPatterns:je},armtcc:{id:"armtcc",name:"TCC (ARM)",kind:"compiler",arch:"arm32",extensions:[".c",".s"],includeDirs:["/include"],wasiFSZip:"arm32-fs.zip",editorStyle:"text/x-csrc",wasmModule:"arm-tcc",defineFlag:"-D",defineInline:!1,includePatterns:De,linkPatterns:je},armtcclink:{id:"armtcclink",name:"TCC (ARM) link",kind:"linker",arch:"arm32",extensions:[],wasmModule:"arm-tcc"},smlrc:{id:"smlrc",name:"SmallerC",kind:"compiler",arch:"x86",extensions:[".c"],helpURL:"https://github.com/alexfru/SmallerC/blob/master/v0100/doc/smlrc.md",editorStyle:"text/x-csrc",wasmModule:"smlrc",defineFlag:"-D",defineInline:!1,includePatterns:De,linkPatterns:je},yasm:{id:"yasm",name:"YASM",kind:"assembler",arch:"x86",extensions:[".asm"],editorStyle:"gas",helpURL:"https://www.tortall.net/projects/yasm/manual/html/manual.html",wasmModule:"yasm",version:"1.3.0",defineFlag:"-D",defineInline:!1,includePatterns:De,linkPatterns:je},oscar64:{id:"oscar64",name:"Oscar64",kind:"compiler",arch:"6502",extensions:[".c",".cpp",".cc",".o64"],includeDirs:["/include"],wasiFSZip:"oscar64-fs.zip",editorStyle:"text/x-csrc",helpURL:"https://github.com/drmortalwombat/oscar64/blob/v1.32.266/oscar64.md",wasmModule:"oscar64",version:"1.32.266",includePatterns:De,linkPatterns:je},bataribasic:{id:"bataribasic",name:"batari Basic",kind:"compiler",arch:"6502",extensions:[".bb",".bas"],includeDirs:["/includes"],editorStyle:"bataribasic",helpURL:"help/bataribasic/manual.html",wasiFSZip:"bb-fs.zip",platforms:{default:{}},includePatterns:De,linkPatterns:je},fastbasic:{id:"fastbasic",name:"FastBasic",kind:"compiler",arch:"6502",extensions:[".bas",".fb",".fbi"],editorStyle:"fastbasic",helpURL:"https://github.com/dmsc/fastbasic/blob/v4.4/manual.md",wasmModule:"fastbasic-int",version:"4.4",platforms:{default:{preloadFS:"65-atari8"}},includePatterns:De,linkPatterns:je},cc2600:{id:"cc2600",name:"CC2600",kind:"compiler",arch:"6502",extensions:[".cc2600"],editorStyle:"text/x-csrc",helpURL:"https://github.com/steux/cc2600",wasmModule:"cc2600",version:"0.4.5",wasiFSZip:"cc2600-fs.zip",includeDirs:["/headers"],includePatterns:De,linkPatterns:je},cc7800:{id:"cc7800",name:"CC7800",kind:"compiler",arch:"6502",extensions:[".cc7800",".c78"],editorStyle:"text/x-csrc",helpURL:"https://github.com/steux/cc7800",wasmModule:"cc7800",version:"0.2.28",wasiFSZip:"cc7800-fs.zip",includeDirs:["/headers"],includePatterns:De,linkPatterns:je},basic:{id:"basic",name:"BASIC",kind:"interpreter",extensions:[".bas"],editorStyle:"basic"},wiz:{id:"wiz",name:"wiz",kind:"compiler",extensions:[".wiz"],includeDirs:["/common/$platform"],editorStyle:"text/x-wiz",helpURL:"https://github.com/wiz-lang/wiz/blob/master/readme.md#wiz",wasmModule:"wiz",version:"0.1.2",platforms:{default:{preloadFS:"wiz"}},includePatterns:t$},ecs:{id:"ecs",name:"ECS",kind:"assembler",arch:"6502",extensions:[".ecs"],editorStyle:"ecs",platforms:{vcs:{preloadFS:"65-atari2600"},nes:{preloadFS:"65-nes"},c64:{preloadFS:"65-c64"}},includePatterns:[...De,...r$]},inform6:{id:"inform6",name:"Inform 6",kind:"compiler",arch:"zmachine",extensions:[".inf"],editorStyle:"inform6",wasmModule:"inform",version:"6.34",platforms:{default:{preloadFS:"inform"}}},dialog:{id:"dialog",name:"Dialog",kind:"compiler",arch:"zmachine",extensions:[".dg"],editorStyle:"dialog",helpURL:"https://linusakesson.net/dialog/docs/",wasmModule:"dialogc",version:"1c/03-dev",wasiFSZip:"dialog-fs.zip",includeDirs:["/"],includePatterns:n$},verilator:{id:"verilator",name:"Verilator",kind:"hdl",arch:"verilog",extensions:[".v"],editorStyle:"verilog",helpURL:"https://verilator.org/guide/4.205/",wasmModule:"verilator_bin",version:"4.205",includePatterns:zo,linkPatterns:[]},yosys:{id:"yosys",name:"Yosys",kind:"hdl",arch:"verilog",extensions:[],wasmModule:"yosys",includePatterns:zo,linkPatterns:[]},silice:{id:"silice",name:"Silice",kind:"hdl",arch:"verilog",extensions:[".ice"],editorStyle:"verilog",helpURL:"https://github.com/sylefeb/Silice",wasmModule:"silice",version:"0.1",platforms:{default:{preloadFS:"Silice"}},includePatterns:zo,linkPatterns:[]},"llvm-mos":{id:"llvm-mos",name:"LLVM-MOS",kind:"compiler",arch:"6502",extensions:[".c",".cpp",".s",".S",".C"],editorStyle:"text/x-csrc",helpURL:"https://llvm-mos.org/wiki/Welcome",remote:!0,includePatterns:De,linkPatterns:je,server:{version:"latest",platforms:["atari8","c64","nes","pce","vcs"],binpath:"llvm-mos/bin",command:"mos-clang",args:["-Os","-g","-D","__8BITWORKSHOP__","-o","$OUTFILE","$INFILES"]}},remote:{id:"remote",name:"Remote build",kind:"remote",extensions:[],remote:!0}};function Dt(r){return _s[r.replace(/^remote:/,"")]}function wb(r,e){let t=Dt(r);if(!t||!e)return;let n=i$[t.id];if(!n)return;let i=n[e];if(!i){let s=Sr(e);s&&s!==e&&(i=n[s])}return i}function Pb(r){let e=[];for(let t in _s){let n=_s[t];for(let i of n.extensions)if(i&&r.endsWith(i)){e.push({meta:n,len:i.length});break}}return e.sort((t,n)=>n.len-t.len).map(t=>t.meta)}function s$(r,e){let t=Dt(r);if(t&&t.platforms){if(e){let i=t.platforms[e];if(i&&i.preloadFS)return i.preloadFS;let s=Sr(e);if(s&&s!==e){let o=t.platforms[s];if(o&&o.preloadFS)return o.preloadFS}}let n=t.platforms.default;if(n&&n.preloadFS)return n.preloadFS}}function Cu(r){let e=Dt(r);return e&&e.skeleton?e.skeleton:r.replace(/^remote:/,"")}function zl(r,e){let t=r&&Dt(r);return t&&t.includePatterns?t.includePatterns:e&&e.startsWith("verilog")?zo:De}function Wl(r,e){let t=r&&Dt(r);return t&&t.linkPatterns?t.linkPatterns:e&&e.startsWith("verilog")?[]:je}function Vl(r,e){e=e&&Sr(e);let t=r&&Dt(r),n=t&&t.includeDirs||[];return n=n.map(i=>i.replace("$platform",e)),n}function Yl(r,e){var t=s$(r,e);if(t)return t;let n=r&&Dt(r);return n&&n.wasiFSZip?"wasi:"+n.wasiFSZip:void 0}function Au(r,e){let t=[];for(let n of e||[]){let i=n instanceof RegExp?{re:n}:n,s;for(i.re.lastIndex=0;s=i.re.exec(r);){let o=s[i.group!=null?i.group:s.length-1];o&&t.push(i.suffix?o+i.suffix:o)}}return t}var zr={vcs:{arch:"6502",code_start:4096,code_size:61440,data_start:128,data_size:128,wiz_rom_ext:".a26",wiz_inc_dir:"2600",cfgfile:"atari2600.cfg",libargs:["crt0.o","atari2600.lib"],extra_link_files:["crt0.o","atari2600.cfg"],asm_cfgfile:"atari2600-asm.cfg",asm_libargs:[],asm_extra_link_files:["atari2600-asm.cfg"],define:["__ATARI2600__"]},mw8080bw:{arch:"z80",code_start:0,rom_size:8192,data_start:8192,data_size:1024,stack_end:9216},vicdual:{arch:"z80",code_start:0,rom_size:16416,data_start:58368,data_size:1024,stack_end:59392},galaxian:{arch:"z80",code_start:0,rom_size:16384,data_start:16384,data_size:1024,stack_end:18432},"galaxian-scramble":{arch:"z80",code_start:0,rom_size:20512,data_start:16384,data_size:1024,stack_end:18432},pacman:{arch:"z80",code_start:0,codeseg_start:202,rom_size:32768,data_start:19456,data_size:652,stack_end:20416},williams:{arch:"6809",code_start:0,rom_size:49152,data_start:38912,data_size:10240,stack_end:49152,set_stack_end:49152,extra_link_files:["williams.scr","libcmoc-crt-vec.a","libcmoc-std-vec.a"],extra_link_args:["-swilliams.scr","-lcmoc-crt-vec","-lcmoc-std-vec"],extra_compile_files:["assert.h","cmoc.h","stdarg.h","stdlib.h"]},"williams-defender":{arch:"6809",code_start:0,rom_size:49152,data_start:38912,data_size:10240,stack_end:49152},"williams-z80":{arch:"z80",code_start:0,rom_size:38912,data_start:38912,data_size:10240,stack_end:49152},"vector-z80color":{arch:"z80",code_start:0,rom_size:32768,data_start:57344,data_size:8192,stack_end:0},"vector-ataricolor":{arch:"6502",define:["__VECTOR__"],cfgfile:"vector-color.cfg",libargs:["crt0.o","none.lib"],extra_link_files:["crt0.o","vector-color.cfg"]},"sound_williams-z80":{arch:"z80",code_start:0,rom_size:16384,data_start:16384,data_size:1024,stack_end:32768},base_z80:{arch:"z80",code_start:0,rom_size:32768,data_start:32768,data_size:32768,stack_end:0},coleco:{arch:"z80",rom_start:32768,code_start:33024,rom_size:32768,data_start:28672,data_size:1024,stack_end:32768,extra_preproc_args:["-I","/share/include/coleco","-D","CV_CV"],extra_link_args:["-k","/share/lib/coleco","-l","libcv","-l","libcvu","crt0.rel"]},msx:{arch:"z80",rom_start:16384,code_start:16384,rom_size:32768,data_start:49152,data_size:12288,stack_end:65535,extra_link_args:["crt0-msx.rel"],extra_link_files:["crt0-msx.rel","crt0-msx.lst"],wiz_sys_type:"z80",wiz_inc_dir:"msx"},"msx-libcv":{arch:"z80",rom_start:16384,code_start:16384,rom_size:32768,data_start:49152,data_size:12288,stack_end:65535,extra_preproc_args:["-I",".","-D","CV_MSX"],extra_link_args:["-k",".","-l","libcv-msx","-l","libcvu-msx","crt0-msx.rel"],extra_link_files:["libcv-msx.lib","libcvu-msx.lib","crt0-msx.rel","crt0-msx.lst"],extra_compile_files:["cv.h","cv_graphics.h","cv_input.h","cv_sound.h","cv_support.h","cvu.h","cvu_c.h","cvu_compression.h","cvu_f.h","cvu_graphics.h","cvu_input.h","cvu_sound.h"]},"sms-sg1000-libcv":{arch:"z80",rom_start:0,code_start:256,rom_size:49152,data_start:49152,data_size:1024,stack_end:57344,extra_preproc_args:["-I",".","-D","CV_SMS"],extra_link_args:["-k",".","-l","libcv-sms","-l","libcvu-sms","crt0-sms.rel"],extra_link_files:["libcv-sms.lib","libcvu-sms.lib","crt0-sms.rel","crt0-sms.lst"],extra_compile_files:["cv.h","cv_graphics.h","cv_input.h","cv_sound.h","cv_support.h","cvu.h","cvu_c.h","cvu_compression.h","cvu_f.h","cvu_graphics.h","cvu_input.h","cvu_sound.h"]},nes:{arch:"6502",define:["__NES__"],cfgfile:"neslib2.cfg",libargs:["crt0.o","nes.lib","neslib2.lib","-D","NES_MAPPER=0","-D","NES_PRG_BANKS=2","-D","NES_CHR_BANKS=1","-D","NES_MIRRORING=0"],extra_link_files:["crt0.o","neslib2.lib","neslib2.cfg","nesbanked.cfg"],symbolConfigs:{NES_MAPPER:{4:"nesbanked.cfg"}},wiz_rom_ext:".nes"},apple2:{arch:"6502",define:["__APPLE2__"],cfgfile:"apple2.cfg",libargs:["--lib-path","/share/target/apple2/drv","apple2.lib"],__CODE_RUN__:16384,code_start:2051,acmeargs:["-f","apple"]},"apple2-e":{arch:"6502",define:["__APPLE2__"],cfgfile:"apple2.cfg",libargs:["apple2.lib"],acmeargs:["-f","apple"]},"atari8-800xl.disk":{arch:"6502",define:["__ATARI__"],cfgfile:"atari.cfg",libargs:["atari.lib"],fastbasic_cfgfile:"fastbasic-cart.cfg"},"atari8-800xl":{arch:"6502",define:["__ATARI__"],cfgfile:"atari-cart.cfg",libargs:["atari.lib","-D","__CARTFLAGS__=4"],fastbasic_cfgfile:"fastbasic-cart.cfg"},"atari8-800":{arch:"6502",define:["__ATARI__"],cfgfile:"atari-cart.cfg",libargs:["atari.lib","-D","__CARTFLAGS__=4"],fastbasic_cfgfile:"fastbasic-cart.cfg"},"atari8-5200":{arch:"6502",define:["__ATARI5200__"],cfgfile:"atari5200.cfg",libargs:["atari5200.lib","-D","__CARTFLAGS__=255"],fastbasic_cfgfile:"fastbasic-cart.cfg"},verilog:{arch:"verilog",extra_compile_files:["8bitworkshop.v"]},astrocade:{arch:"z80",code_start:8192,rom_size:8192,data_start:19984,data_size:496,stack_end:20480},"astrocade-arcade":{arch:"z80",code_start:0,rom_size:16384,data_start:32224,data_size:544,stack_end:32768},"astrocade-bios":{arch:"z80",code_start:0,rom_size:8192,data_start:20430,data_size:50,stack_end:20430},atari7800:{arch:"6502",define:["__ATARI7800__"],cfgfile:"atari7800.cfg",libargs:["crt0.o","none.lib"],extra_link_files:["crt0.o","atari7800.cfg"]},c64:{arch:"6502",define:["__CBM__","__C64__"],cfgfile:"c64.cfg",libargs:["openroms-compat.o","c64.lib"],extra_link_files:["openroms-compat.o"],acmeargs:["-f","cbm"]},vic20:{arch:"6502",define:["__CBM__","__VIC20__"],cfgfile:"vic20.cfg",libargs:["vic20.lib"],acmeargs:["-f","cbm"]},kim1:{arch:"6502"},vectrex:{arch:"6809",code_start:0,rom_size:32768,data_start:51328,data_size:896,stack_end:52224,extra_compile_files:["assert.h","cmoc.h","stdarg.h","vectrex.h","stdlib.h","bios.h"],extra_link_files:["vectrex.scr","libcmoc-crt-vec.a","libcmoc-std-vec.a"],extra_compile_args:["--vectrex"],extra_link_args:["-svectrex.scr","-lcmoc-crt-vec","-lcmoc-std-vec"]},x86:{arch:"x86"},zx:{arch:"z80",code_start:23755,rom_size:41613,data_start:61440,data_size:3584,stack_end:65368,extra_link_args:["crt0-zx.rel"],extra_link_files:["crt0-zx.rel","crt0-zx.lst"]},"devel-6502":{arch:"6502",cfgfile:"devel-6502.cfg",libargs:["crt0.o","none.lib"],extra_link_files:["crt0.o","devel-6502.cfg"]},"cpc.rslib":{arch:"z80",code_start:16384,rom_size:28928,data_start:45312,data_size:-3840,stack_end:49152,extra_compile_files:["cpcrslib.h"],extra_link_args:["crt0-cpc.rel","cpcrslib.lib"],extra_link_files:["crt0-cpc.rel","crt0-cpc.lst","cpcrslib.lib","cpcrslib.lst"]},cpc:{arch:"z80",code_start:16384,rom_size:28928,data_start:45312,data_size:-3840,stack_end:49152,extra_compile_files:["cpctelera.h"],extra_link_args:["crt0-cpc.rel","cpctelera.lib"],extra_link_files:["crt0-cpc.rel","crt0-cpc.lst","cpctelera.lib","cpctelera.lst"]},pce:{arch:"huc6280",define:["__PCE__"],cfgfile:"pce.cfg",libargs:["pce.lib","-D","__CARTSIZE__=0x8000"]},exidy:{define:["__EXIDY__"],cfgfile:"exidy.cfg",libargs:["crt0.o","none.lib"],extra_link_files:["crt0.o","exidy.cfg"]},arm32:{arch:"arm32",define:["__ARM__","DISABLE_UNIMPLEMENTED_LIBC_APIS","PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_SOFT"],extra_compile_args:["-I./arch/arm/include","-I./openlibm/include","-I./openlibm/src","-I./printf/src"],extra_link_files:["crt0.c","libc.a"],extra_link_args:["crt0.c","-lc"]},gb:{arch:"gbz80",code_start:0,codeseg_start:512,rom_size:32768,data_start:49312,data_size:8032,stack_end:57344,extra_link_files:["gbz80.lib","gb.lib"],extra_link_args:["-l","gb","-g","_shadow_OAM=0xC000","-g",".STACK=0xE000","-g",".refresh_OAM=0xFF80","-g","GB_MAPPER=0x0","-g","GB_ROM_SIZE=0x0","-g","GB_RAM_SIZE=0x0","-g","GB_CGB_FLAGS=0x0"],wiz_sys_type:"gb",wiz_inc_dir:"gb"},mcr:{arch:"z80",code_start:0,rom_size:106496,data_start:57344,data_size:2048,stack_end:59392}};zr["sms-sms-libcv"]=Ti(tt({},zr["sms-sg1000-libcv"]),{extra_preproc_args:["-I",".","-D","CV_SMS","-D","CV_MODE4"]});zr["sms-gg-libcv"]=zr["sms-sms-libcv"];zr["gb.color"]=Ti(tt({},zr.gb),{extra_link_args:zr.gb.extra_link_args.map(r=>r==="GB_CGB_FLAGS=0x0"?"GB_CGB_FLAGS=0x80":r)});var o$=10,a$=1e4,kb="/error.php",l$=2e3,Qb=0,$b="",Tb=0;function Nn(r,e){try{if(r==null)return"";var t=typeof r=="string"?r:typeof r=="object"?JSON.stringify(r):r+"";return t.substring(0,e)}catch(n){return""}}function _b(r,e,t){try{if(Qb>=o$)return;var n=Date.now();if(r===$b&&n-Tb