1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-05-28 23:41:32 +00:00
8bitworkshop/gen/atari7800-ZZ5YLXBU.js

8 lines
7.7 KiB
JavaScript

import{I as W,h as E,k as F,p as N,t as _}from"./chunk-VFG63MRQ.js";import{$ as w,J as k,U as M,V as r,W as I,Y as T,_ as U,da as O,g as b}from"./chunk-JC7DT6V7.js";import"./chunk-5XVCUSSZ.js";var h=0,P=2,A=8,j=T([[r.A,A+0,128],[r.B,A+1,128],[r.SELECT,P,-2],[r.START,P,-1],[r.UP,h,-16],[r.DOWN,h,-32],[r.LEFT,h,-64],[r.RIGHT,h,-128],[r.P2_A,A+2,128],[r.P2_B,A+3,128],[r.P2_UP,h,-1],[r.P2_DOWN,h,-2],[r.P2_LEFT,h,-4],[r.P2_RIGHT,h,-8]]);var S=262,z=258-16,d=454,q=28,K=2,Y=S*60*K,L=class{constructor(){this.regs=new Uint8Array(32)}reset(){this.regs.fill(0)}read(t){return this.regs[t]|0}write(t,e){this.regs[t]=e}saveState(){return{regs:this.regs.slice(0)}}loadState(t){for(let e=0;e<32;e++)this.write(e,t.regs[e])}static stateToLongString(t){let e="";return e+=M(t.regs,0,32),e}},R=class{constructor(){this.cycles=0;this.regs=new Uint8Array(32);this.offset=-1;this.dll=0;this.dlstart=0;this.dli=!1;this.h16=!1;this.h8=!1;this.pixels=new Uint8Array(320);this.WSYNC=0}reset(){this.regs.fill(0)}read(t){return this.regs[t]|0}write(t,e){this.regs[t]=e,t==4&&this.WSYNC++}saveState(){return{regs:this.regs.slice(0),offset:this.offset,dll:this.dll,dlstart:this.dlstart,dli:this.dli,h16:this.h16,h8:this.h8}}loadState(t){for(let e=0;e<32;e++)this.write(e,t.regs[e]|0);this.offset=t.offset|0,this.dll=t.dll|0,this.dlstart=t.dlstart|0,this.dli=!!t.dli,this.h16=!!t.h16,this.h8=!!t.h8}isDMAEnabled(){return(this.regs[28]&96)==64}getDLLStart(){return(this.regs[12]<<8)+this.regs[16]}getCharBaseAddress(){return(this.regs[20]<<8)+this.offset}setVBLANK(t){t?(this.regs[8]|=128,this.offset=-1,this.dll=this.getDLLStart(),this.dli=this.bus&&(this.bus.read(this.dll)&128)!=0):this.regs[8]&=~128}readDLLEntry(t){if(this.dll>=16384)return;let e=t.read(this.dll);this.offset=e&15,this.h16=(e&64)!=0,this.h8=(e&32)!=0,this.dlstart=(t.read(this.dll+1)<<8)+t.read(this.dll+2),this.dll=this.dll+3&65535,this.dli=(t.read(this.dll)&128)!=0}isHoley(t){return!!(t&32768&&(this.h16&&t&4096||this.h8&&t&2048))}readDMA(t){return this.isHoley(t)?0:(this.cycles+=3,this.bus.read(t))}doDMA(t){if(this.bus=t,this.cycles=0,this.pixels.fill(this.regs[0]),this.isDMAEnabled()){this.cycles+=16,this.offset<0&&this.readDLLEntry(t);let s=this.dlstart&65280,a=this.dlstart&255;do{let m=t.read(s+(a+0&511)),f=t.read(s+(a+1&511));if(f==0||s>=16384)break;let G=t.read(s+(a+2&511)),v=t.read(s+(a+3&511)),p=!1;if((f&31)==0){var e=v>>5,c=32-(v&31),n=t.read(s+(a+4&511)),i=f&128;p=(f&32)!=0,a+=5,this.cycles+=10}else{var n=v,e=f>>5,c=32-(f&31),i=0;a+=4,this.cycles+=8}let D=m+((G+(p?0:this.offset)&255)<<8);n*=2;let $=(this.regs[28]&3)+(i?4:0),C=p&&(this.regs[28]&16)!=0;C&&(c*=2);for(var o=0;o<c;o++){let u=this.readDMA(C?D+(o>>1):D+o);if(p){let x=(this.regs[20]+this.offset<<8)+u;C&&o&1&&(x++,this.cycles-=3),u=this.readDMA(x)}switch($){case 0:for(let x=0;x<4;x++){var l=u>>6&3;l>0&&(this.pixels[n]=this.pixels[n+1]=this.regs[(e<<2)+l]),u<<=2,n=n+2&511}break;case 2:case 3:for(let x=0;x<8;x++){var l=u&128?1:0;l>0&&(this.pixels[n]=this.regs[(e<<2)+l]),u<<=1,n=n+1&511}break}}}while(this.cycles<d);this.offset-=1}return this.cycles}doInterrupt(){return this.dli&&this.offset<0?(this.dli=!1,!0):!1}static stateToLongString(t){let e="";return e+=M(t.regs,0,32),e+=`
DLL: $`+b((t.regs[12]<<8)+t.regs[16],4)+" @ $"+b(t.dll,4),e+=`
DL: $`+b(t.dlstart,4),e+=`
Offset: `+t.offset,e+=`
DLI? `+t.dli,e}},B=class extends N{constructor(){super();this.cpuFrequency=1789772;this.canvasWidth=320;this.numTotalScanlines=S;this.numVisibleScanlines=z;this.defaultROMSize=49152;this.cpuCyclesPerLine=113.5;this.sampleRate=Y;this.ram=new Uint8Array(4096);this.regs6532=new Uint8Array(4);this.tia=new L;this.maria=new R;this.lastFrameCycles=0;this.xtracyc=0;this.cpu=new _,this.read=w([[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,3,t=>(this.xtracyc++,this.inputs[t])],[6144,10239,65535,t=>this.ram[t-6144]],[10240,16383,2047,t=>this.read(t|8192)],[16384,65535,65535,t=>this.rom?this.rom[t-16384]:0],[0,65535,65535,t=>this.probe&&this.probe.logIllegal(t)]]),this.write=w([[21,26,31,(t,e)=>{this.xtracyc++,this.pokey1.setTIARegister(t,e)}],[0,31,31,(t,e)=>{this.xtracyc++,this.tia.write(t,e)}],[32,63,31,(t,e)=>{this.maria.write(t,e)}],[64,255,255,(t,e)=>{this.ram[t+2048]=e}],[256,319,255,(t,e)=>{this.write(t,e)}],[320,511,511,(t,e)=>{this.ram[t+2048]=e}],[640,767,3,(t,e)=>{this.xtracyc++,this.regs6532[t]=e}],[6144,10239,65535,(t,e)=>{this.ram[t-6144]=e}],[10240,16383,2047,(t,e)=>{this.write(t|8192,e)}],[49151,49151,65535,(t,e)=>{}],[0,65535,65535,(t,e)=>{this.probe&&this.probe.logIllegal(t)}]]),this.connectCPUMemoryBus(this),this.dmaBus=this.probeDMABus(this),this.handler=I(this.inputs,j),this.pokey1=new E,this.audioadapter=new F(this.pokey1,K,Y)}readConst(t){let e=this.probe;this.probe=null;let c=this.read(t);return this.probe=e,c}readInput(t){switch(t){case 12:return~this.inputs[8]&128;case 13:return~this.inputs[9]&128;default:return this.inputs[t]|0}}advanceCPU(){var t=super.advanceCPU();return this.xtracyc&&(t+=this.xtracyc,this.probe.logClocks(this.xtracyc),this.xtracyc=0),t}advanceFrame(t){var e=this.pixels,c=0,n,i=0,o=0,l=0;this.probe.logNewFrame();for(var s=0;s<S;s++){this.scanline=s;var a=s<z;for(this.maria.setVBLANK(!a),this.maria.WSYNC=0;i<q&&!this.maria.WSYNC;){if(t&&t()){t=null,s=999;break}i+=this.advanceCPU()<<2,l++}if(a){let f=this.maria.doDMA(this.dmaBus);if(this.probe.logClocks(f>>2),i+=f,e)for(var m=0;m<320;m++)e[c++]=H[this.maria.pixels[m]]}for((a||s==S-1)&&this.maria.doInterrupt()&&(this.probe.logInterrupt(0),this.cpu.NMI());i<d;){if(this.maria.WSYNC){this.probe.logWait(0),this.probe.logClocks(d-i>>2),i=d;break}if(t&&t()){t=null,s=999;break}i+=this.advanceCPU()<<2,l++}this.audio&&this.audioadapter.generate(this.audio),i-=d,o+=i,this.probe.logNewScanline()}return this.lastFrameCycles=o,l}getRasterX(){return this.lastFrameCycles%d}getRasterY(){return Math.floor(this.lastFrameCycles/d)}loadROM(t){t.length==49280&&(t=t.slice(128)),this.rom=U(t,this.defaultROMSize,!0)}reset(){super.reset(),this.tia.reset(),this.maria.reset(),this.inputs.fill(0),this.inputs[h]=255,this.inputs[P]=1+2+8}readAddress(t){return this.read(t)|0}loadState(t){this.cpu.loadState(t.c),this.ram.set(t.ram),this.tia.loadState(t.tia),this.maria.loadState(t.maria),this.regs6532.set(t.regs6532),this.loadControlsState(t)}saveState(){return{c:this.cpu.saveState(),ram:this.ram.slice(0),tia:this.tia.saveState(),maria:this.maria.saveState(),regs6532:this.regs6532.slice(0),inputs:this.inputs.slice(0)}}loadControlsState(t){this.inputs.set(t.inputs)}saveControlsState(){return{inputs:this.inputs.slice(0)}}getDebugCategories(){return["CPU","Stack","TIA","MARIA"]}getDebugInfo(t,e){switch(t){case"TIA":return L.stateToLongString(e.tia);case"MARIA":return R.stateToLongString(e.maria)+`
Scanline: `+this.scanline}}},H=new Uint32Array(256);for(g=0;g<256;g++)H[g]=O(g);var g;var X=[{id:"sprites.dasm",name:"Sprites (ASM)"},{id:"wsync.c",name:"WSYNC"},{id:"sprites.c",name:"Double Buffering"},{id:"scroll.c",name:"Scrolling"}],V=class extends W{constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"TIA",start:0,size:32,type:"io"},{name:"MARIA",start:32,size:32,type:"io"},{name:"RAM (6166 Block 0)",start:64,size:192,type:"ram"},{name:"RAM (6166 Block 1)",start:320,size:192,type:"ram"},{name:"PIA",start:640,size:24,type:"io"},{name:"RAM",start:6144,size:4096,type:"ram"},{name:"Cartridge ROM",start:16384,size:49152,type:"rom"}]}}}newMachine(){return new B}getPresets(){return X}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getROMExtension(){return".a78"}};k.atari7800=V;
//# sourceMappingURL=atari7800-ZZ5YLXBU.js.map