1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-07-27 08:29:06 +00:00
8bitworkshop/gen/atari7800-QU2XJDVM.js

8 lines
8.7 KiB
JavaScript

import{G as W,h as E,k as N,n as F,r as _}from"./chunk-2T5IQXGX.js";import"./chunk-JM5NHRL4.js";import{I as k,T as M,U as r,V as T,X as O,Z as U,_ as w,g,s as I}from"./chunk-VOKPYVET.js";import"./chunk-5XVCUSSZ.js";var f=0,R=2,A=8,q=O([[r.A,A+0,128],[r.B,A+1,128],[r.SELECT,R,-2],[r.START,R,-1],[r.UP,f,-16],[r.DOWN,f,-32],[r.LEFT,f,-64],[r.RIGHT,f,-128],[r.P2_A,A+2,128],[r.P2_B,A+3,128],[r.P2_UP,f,-1],[r.P2_DOWN,f,-2],[r.P2_LEFT,f,-4],[r.P2_RIGHT,f,-8]]);var S=262,z=258-16,d=454,X=28,K=4,Y=S*60*K,P=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}},B=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 b=t.read(s+(a+0&511)),n=t.read(s+(a+1&511));if(n==0||s>=16384)break;let $=t.read(s+(a+2&511)),v=t.read(s+(a+3&511)),p=!1;if((n&31)==0){var e=v>>5,o=32-(v&31),x=t.read(s+(a+4&511)),i=n&128;p=(n&32)!=0,a+=5,this.cycles+=10}else{var x=v,e=n>>5,o=32-(n&31),i=0;a+=4,this.cycles+=8}let D=b+(($+(p?0:this.offset)&255)<<8);x*=2;let j=(this.regs[28]&3)+(i?4:0),C=p&&(this.regs[28]&16)!=0;C&&(o*=2);for(var l=0;l<o;l++){let m=this.readDMA(C?D+(l>>1):D+l);if(p){let h=(this.regs[20]+this.offset<<8)+m;C&&l&1&&(h++,this.cycles-=3),m=this.readDMA(h)}switch(j){case 0:for(let h=0;h<4;h++){var c=m>>6&3;c>0&&(this.pixels[x]=this.pixels[x+1]=this.regs[(e<<2)+c]),m<<=2,x=x+2&511}break;case 2:case 3:for(let h=0;h<8;h++){var c=m&128?1:0;c>0&&(this.pixels[x]=this.regs[(e<<2)+c]),m<<=1,x=x+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: $`+g((t.regs[12]<<8)+t.regs[16],4)+" @ $"+g(t.dll,4),e+=`
DL: $`+g(t.dlstart,4),e+=`
Offset: `+t.offset,e+=`
DLI? `+t.dli,e}},L=class extends F{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 P;this.maria=new B;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.probeDMABus=this.probeIOBus(this),this.handler=T(this.inputs,q),this.pokey1=new E,this.audioadapter=new N(this.pokey1,K,Y)}readConst(t){let e=this.probe;this.probe=null;let o=this.read(t);return this.probe=e,o}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,o=0,x,i=0,l=0,c=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<X&&!this.maria.WSYNC;){if(t&&t()){t=null,s=999;break}i+=this.advanceCPU()<<2,c++}if(a){let n=this.maria.doDMA(this.probeDMABus);if(this.probe.logClocks(n>>2),i+=n,e)for(var b=0;b<320;b++)e[o++]=G[this.maria.pixels[b]]}for((a||s==S-1)&&this.maria.doInterrupt()&&(this.probe.logInterrupt(0),this.cpu.NMI());i<d;){if(this.maria.WSYNC){this.probe.logClocks(d-i>>2),i=d;break}if(t&&t()){t=null,s=999;break}i+=this.advanceCPU()<<2,c++}this.audio&&this.audioadapter.generate(this.audio),i-=d,l+=i,this.probe.logNewScanline()}return this.lastFrameCycles=l,c}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[f]=255,this.inputs[R]=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 P.stateToLongString(e.tia);case"MARIA":return B.stateToLongString(e.maria)+`
Scanline: `+this.scanline}}},H=[0,4210752,7105644,9474192,11579568,13158600,14474460,16053492,17476,1074276,2393220,3448992,4241592,5296336,6088936,6880508,10352,1328260,2645144,3963052,5016764,6070476,6862044,7915756,6276,1586328,3166380,4745408,6062288,7378144,8431852,9747708,136,2105500,3947696,5789888,7368912,8947936,10526956,11842812,6029432,7610508,8928416,10246320,11563200,12616912,13671644,14725356,7864392,9445472,10763384,12081292,13398176,14451892,15506628,16560340,8650772,9969712,11287628,12605544,13660284,14715028,15507624,16561340,8912896,10231836,11550776,12606544,13661288,14716028,15508624,16562340,8132608,9451548,11031608,12349520,13404264,14457980,15512720,16566436,6040576,7883804,9463864,11306064,12622952,13939836,15256720,16572580,2898944,4742172,6585400,8428624,9745512,11325564,12641424,13958308,15360,2120736,4226112,6069340,7648372,9228428,10806436,12123320,14356,1858612,3701840,5281900,6861956,8178844,9495732,10812616,12332,1855564,3436648,5016708,6596764,7913652,8967372,10284256,10308,1591396,3172484,4490400,5807288,7124176,8178920,9232636],G=new Uint32Array(256),J=[];for(u=0;u<256;u++)G[u]=H[u>>1]|4278190080,J[u]="#"+g(I(H[u>>1]),6);var u;var Q=[{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 L}getPresets(){return Q}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getROMExtension(){return".a78"}};k.atari7800=V;
//# sourceMappingURL=atari7800-QU2XJDVM.js.map