1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-07-07 16:28:57 +00:00
8bitworkshop/gen/atari8-2AH7DNWQ.js

11 lines
25 KiB
JavaScript

import{a as ot}from"./chunk-7BAKXSVO.js";import{B as nt,I as ht,g as et,k as st,q as it,t as rt,y as at}from"./chunk-YLYWUMYM.js";import{$ as P,J as R,O as I,U as A,V as i,W as $,Y as J,a as M,da as tt,g as x,q as b}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.js";var Lt=[0,25,17,9],Kt=[0,25+64,17+80,9+96],y=0,wt=1,H=2,Q=3,Vt=4,Nt=5,Ft=7,Ut=9,C=10,Yt=11,Bt=12,Ht=13,ct=14,Qt=15,D=15;var jt=17-4,zt=110-4,Gt=105,Xt=[0,0,8,10,8,16,8,16,8,4,4,2,1,2,1,1],Wt=[0,0,2,2,2,2,4,4,8,4,4,4,4,2,2,2],qt=[0,0,0,0,0,1,0,1,0,0,2,1,0,0,0,0],lt=[0,0,1,1,2,2,2,2,8,4,4,2,2,2,2,1],k=class{constructor(t,e){this.regs=new Uint8Array(16);this.dma_enabled=!1;this.dliop=0;this.mode=0;this.jmp=!1;this.lms=!1;this.dlarg_lo=0;this.dlarg_hi=0;this.period=0;this.scanaddr=0;this.startaddr=0;this.pfbyte=0;this.ch=0;this.linesleft=0;this.yofs=0;this.isfirstline=!1;this.v=0;this.h=0;this.linebuf=new Uint8Array(48);this.dmaclock=0;this.dmaidx=0;this.output=0;this.dramrefresh=!1;this.in_vscroll=0;this.read=t,this.nmi=e}reset(){this.regs.fill(0),this.regs[ct]=0,this.regs[D]=127,this.regs[Bt]=0,this.regs[Ht]=255,this.setReg(y,0),this.h=this.v=0,this.startaddr=this.scanaddr=0,this.dmaclock=0}saveState(){return b(0,{},this)}loadState(t){b(0,this,t),this.setReg(y,t.regs[y])}static stateToLongString(t){let e="";return e+="H: "+M(t.h,3)+" V: "+M(t.v,3)+`
`,e+="DLIOp: "+x(t.dliop,2)+" Lines: "+t.yofs+"/"+t.linesleft,e+=" DMA "+(t.dma_enabled?"ON ":"off"),t.dma_enabled&&(e+=" idx "+t.dmaidx+" clk "+x(t.dmaclock)),e+=`
`,e+="Addr: "+x(t.scanaddr,4)+`
`,e+=A(t.regs,0,16).replace("$00","Regs"),e}setReg(t,e){switch(t){case C:this.regs[C]=255;return;case Qt:this.regs[D]=31;return}this.regs[t]=e}readReg(t){switch(t){case D:return this.regs[t];case Yt:return this.v>>1;default:return 255}}processDLIEntry(){if(this.mode==0)this.linesleft=(this.dliop>>4&7)+1,this.dmaclock=0;else{this.linesleft=Xt[this.mode],this.period=Wt[this.mode],this.jmp?(this.regs[H]=this.dlarg_lo,this.regs[Q]=this.dlarg_hi,this.mode=this.period=0,this.dliop&64&&(this.linesleft=1,this.dma_enabled=!1),this.dmaclock=0):this.lms&&(this.scanaddr=this.dlarg_lo+(this.dlarg_hi<<8)),this.startaddr=this.scanaddr;let t=this.regs[y]&3,e=this.dliop&16?(this.regs[Vt]&15)>>1:0;this.dliop&16&&t<3&&t++,this.left=Lt[t]+e,this.right=Kt[t]+e;let s=this.regs[Nt]&15;this.dliop&32^this.in_vscroll&&(this.in_vscroll?this.linesleft=s+1:(this.linesleft-=s,this.yofs+=s),this.linesleft&=15,this.in_vscroll^=32)}}nextLine(){this.linesleft>0&&(this.linesleft--,this.yofs++,this.isfirstline=!1,this.mode>=8&&this.linesleft&&(this.scanaddr=this.startaddr))}triggerNMI(t){this.regs[D]=t|31,this.regs[ct]&t&&this.nmi()}nextInsn(){let t=this.regs[H]+(this.regs[Q]<<8),e=this.read(t);return t=t+1&1023|t&~1023,this.regs[H]=t&255,this.regs[Q]=t>>8,e}nextScreen(){let t=this.read(this.scanaddr);return this.incScanAddr(),t}incScanAddr(){this.scanaddr=this.scanaddr+1&4095|this.scanaddr&~4095}dlDMAEnabled(){return this.regs[y]&32}isVisibleScanline(){return this.v>=8&&this.v<248}isPlayfieldDMAEnabled(){return this.dma_enabled&&!this.linesleft}isPlayerDMAEnabled(){return this.regs[y]&8}isMissileDMAEnabled(){return this.regs[y]&12}isWSYNC(){return this.regs[C]!=0}clockPulse(){let t=this.isWSYNC();if(!this.isVisibleScanline())this.doVBlank();else{switch(this.h){case 0:this.isMissileDMAEnabled()&&(this.doPlayerMissileDMA(3),t=!0);break;case 1:if(this.isPlayfieldDMAEnabled()){let e=this.nextInsn();this.jmp=(e&~64)==1,this.lms=(e&64)!=0&&(e&15)!=0,this.mode=e&15,this.dliop=e,this.yofs=0,this.isfirstline=!0,t=!0}break;case 2:case 3:case 4:case 5:this.isPlayerDMAEnabled()&&(this.doPlayerMissileDMA(this.h+2),t=!0);break;case 6:case 7:this.isPlayfieldDMAEnabled()&&this.isfirstline&&(this.jmp||this.lms)&&(this.h==6&&(this.dlarg_lo=this.nextInsn()),this.h==7&&(this.dlarg_hi=this.nextInsn()),t=!0);break;case 8:this.isfirstline&&this.processDLIEntry(),this.dliop&128&&this.linesleft==1&&this.triggerNMI(128);break;case 9:break;case 111:this.dma_enabled&&this.nextLine(),++this.v;break}if(this.output=0,this.mode>=2&&this.period){let e=this.h<=Gt;this.dmaclock=this.dmaclock<<1&511,this.dmaclock&1<<this.period&&(this.dmaclock|=1),this.h==this.left&&(this.dmaclock|=1,this.dmaidx=0),this.h==this.right&&(this.dmaclock&=~1,this.dmaidx++),this.dmaclock&1?(this.mode<8&&this.isfirstline&&(e?this.linebuf[this.dmaidx]=this.nextScreen():this.incScanAddr(),t=e),this.dmaidx++):this.dmaclock&8&&(this.ch=this.linebuf[this.dmaidx-4/this.period],e?this.readBitmapData():this.mode>=8&&this.incScanAddr(),t=e),this.output=this.h>=this.left+3&&this.h<=this.right+2?4:0}}return(this.h<jt||this.h>zt)&&(this.output=2),this.incHorizCounter(),!t&&this.dramrefresh&&(this.read(0),this.dramrefresh=!1,t=!0),t}incHorizCounter(){switch(this.h){case 25:case 25+4*1:case 25+4*2:case 25+4*3:case 25+4*4:case 25+4*5:case 25+4*6:case 25+4*7:case 25+4*8:this.dramrefresh=!0;break;case 102:this.regs[C]=0;break;case 113:this.h=0;return}++this.h}doVBlank(){this.linesleft=this.mode=this.period=0,this.h==111&&this.v++,this.v==248&&this.h==0&&this.triggerNMI(64),this.v==262&&this.h==112&&(this.v=0),this.v==7&&this.h==113&&(this.dma_enabled=this.dlDMAEnabled()!=0),this.output=2,this.dmaclock=0}doPlayerMissileDMA(t){let e=this.regs[y]&16,s=this.regs[Ft]<<8;e?(s&=63488,s|=t<<8,s|=this.v&255):(s&=64512,s|=t<<7,s|=this.v>>1),this.read(s)}readBitmapData(){let t=this.mode;if(t<8){let e=this.ch,s=this.yofs>>qt[this.mode],a=s&7,h=this.regs[Ut];(t&14)==6?(e&=63,h&=254):(e&=127,h&=252);let n=(e<<3)+(h<<8);if((t&14)==2){let p=this.regs[wt],d=t==3&&(e&96)==96;p&4?this.pfbyte=this.read(n+(a^7)):this.pfbyte=this.read(n+a),d&&s<2&&(this.pfbyte=0),!d&&s>7&&(this.pfbyte=0),this.ch&128&&(p&1&&(this.pfbyte=0),p&2&&(this.pfbyte^=255))}else this.pfbyte=this.read(n+a)}else this.pfbyte=this.nextScreen()}shiftout(){if(this.output==4)switch(this.mode){case 2:case 3:case 15:{let t=this.pfbyte>>7&1;return this.pfbyte<<=1,t?8:6}case 6:case 7:{let t=this.pfbyte>>7&1;return this.pfbyte<<=1,t?(this.ch>>6)+4:0}case 9:case 11:case 12:{let t=this.pfbyte>>7&1;return this.pfbyte<<=1,t?4:0}case 4:case 5:{let t=this.pfbyte>>6&3;return this.pfbyte<<=2,this.ch&128?[0,4,5,7][t]:[0,4,5,6][t]}case 8:case 10:case 13:case 14:{let t=this.pfbyte>>6&3;return this.pfbyte<<=2,[0,4,5,6][t]}}return this.output}};var Zt=0;var $t=8,Jt=12,ft=13,dt=17,_=18,u=22,te=23,ee=24,se=25,E=26,L=27,ie=28,xt=29,re=30,ae=31,ne=0,he=4,oe=8,K=12,ut=16,j=31,mt=-9,w=[0,1,2,3,7,7,7,7,8,8,8,8,4,5,6,7,0,1,2,3,7,7,7,7,8,8,8,8,4,5,6,7,0,1,6,7,5,5,5,5,8,8,8,8,2,3,4,5,0,1,6,7,5,5,5,5,8,8,8,8,2,3,4,5,4,5,6,7,3,3,3,3,8,8,8,8,0,1,2,3,4,5,6,7,3,3,3,3,8,8,8,8,0,1,2,3,4,5,6,7,3,3,3,3,8,8,8,8,0,1,2,3,4,5,6,7,3,3,3,3,8,8,8,8,0,1,2,3,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7,2,3,4,5,7,7,7,7,8,8,8,8,0,1,6,7],ce=[_+0,_+1,_+2,_+3,u+0,u+1,u+2,u+3,E,E,E,E,u+0,u+1,u+2,u+3],V=class{constructor(){this.regs=new Uint8Array(32);this.readregs=new Uint8Array(32);this.shiftregs=new Uint32Array(8);this.count=0;this.an=0;this.rgb=0;this.pmcol=0;this.gtiacol=0;this.gtiacol2=0;this.hbias=mt;this.pmDebugMask=-1}reset(){this.regs.fill(0),this.readregs.fill(0),this.readregs[20]=15,this.readregs.fill(15,21),this.count=0}saveState(){return b(0,{},this)}loadState(t){b(0,this,t)}setReg(t,e){switch(t){case _:case _+1:case _+2:case _+3:case u:case u+1:case u+2:case u+3:case E:e&=254;break;case re:this.readregs.fill(0,0,16);return}this.regs[t]=e}readReg(t){switch(t){case j:return this.readregs[t]&~this.regs[ae]}return this.readregs[t]}sync(){this.count=0}setBias(t){this.hbias=mt+t}updateGfx(t,e,s){switch(t){case 0:this.regs[xt]&1&&(this.regs[dt]=s);break;case 2:case 3:case 4:case 5:this.regs[xt]&2&&(!(e&1)||!(this.regs[ie]&1<<t+2))&&(this.regs[ft-2+t]=s);break}}getPlayfieldColor(){switch(this.regs[L]>>6){case 0:switch(this.an){case 0:return E;case 4:case 5:case 6:case 7:return u+this.an-4;case 8:return this.regs[ee]&240|this.regs[te]&15|256}break;case 1:return this.regs[E]&240|this.gtiacol&15|256;case 2:return ce[this.gtiacol];case 3:return this.regs[E]&15|this.gtiacol<<4|256}return 256}anySpriteActive(){return this.shiftregs[0]||this.shiftregs[1]||this.shiftregs[2]||this.shiftregs[3]||this.shiftregs[4]||this.shiftregs[5]||this.shiftregs[6]||this.shiftregs[7]}processPlayerMissile(){if(!this.anySpriteActive()){this.evalTrigger(0),this.evalTrigger(1),this.evalTrigger(2),this.evalTrigger(3),this.evalTrigger(4),this.evalTrigger(5),this.evalTrigger(6),this.evalTrigger(7),this.pmcol=-1;return}if(this.an==2){this.shiftObject(0),this.shiftObject(1),this.shiftObject(2),this.shiftObject(3),this.shiftObject(4),this.shiftObject(5),this.shiftObject(6),this.shiftObject(7),this.pmcol=-1;return}let t=(this.regs[L]&15)<<4,e=w[(this.an&7)+8+t],s=this.an-4,a=-1,h=0;for(let n=0;n<4;n++)if(this.shiftObject(n)){s>=0&&(this.readregs[he+n]|=1<<s),h|=1<<n;let d=w[n+t];d<e&&(a=n,e=d)}for(let n=0;n<4;n++)if(this.shiftObject(n+4)){s>=0&&(this.readregs[ne+n]|=1<<s),this.readregs[oe+n]|=h;let d=this.regs[L]&16?w[t+15]:w[n+t];d<e&&(a=n+4,e=d)}h&1&&(this.readregs[K+0]|=h&~1),h&2&&(this.readregs[K+1]|=h&~2),h&4&&(this.readregs[K+2]|=h&~4),h&8&&(this.readregs[K+3]|=h&~8),this.pmcol=a>=0?this.getObjectColor(a):-1}shiftObject(t){let e=(this.shiftregs[t]&2147483648)!=0;return this.shiftregs[t]<<=1,this.evalTrigger(t),e}getObjectColor(t){return this.regs[L]&16&&t>=4?this.regs[se]:this.regs[_+(t&3)]}evalTrigger(t){this.regs[Zt+t]+this.hbias==this.count&&this.triggerObject(t)}triggerObject(t){let e,s;if(!!(this.pmDebugMask&1<<t)){if(t<4)e=this.regs[$t+t]&3,s=this.regs[ft+t];else{let a=t-4<<1;e=this.regs[Jt]>>a&3,s=(this.regs[dt]>>a&3)<<6}e&1?s=gt(s):s<<=8,e==3?s=gt(s):s<<=16,this.shiftregs[t]|=s}}clockPulse1(){this.processPlayerMissile(),this.clockPulse2(),this.count++}clockPulse2(){var t;if(this.pmcol>=0)t=this.pmcol;else{let e=this.getPlayfieldColor();t=e&256?e&255:this.regs[e]}this.rgb=pt[t],this.gtiacol2=this.gtiacol2<<1|this.an>>3}clockPulse4(){this.gtiacol=this.gtiacol2&15}static stateToLongString(t){let e="";return e+=`X: ${M(t.count,3)} ANTIC: ${x(t.an,1)} PM: ${x(t.pmcol,3)}
`,e+=`Write Registers:
`,e+=A(t.regs,0,32),e+=`Read Registers:
`,e+=A(t.readregs,0,32),e}};function gt(r){return r=(r|r<<8)&16711935,r=(r|r<<4)&252645135,r=(r|r<<2)&858993459,r=(r|r<<1)&1431655765,r|r<<1}var pt=new Uint32Array(256);for(v=0;v<256;v++)pt[v]=tt(v);var v;var o=0;var le=2;var bt=4;var _t=6;var m=8,fe=9,de=10,xe=11,ue=13,z=14,O=15;var me=8,ge=9,pe=10,be=13,T=14,N=15;var At=128,yt=64,_e=32,Et=16,St=8;var Ae=1,Ot=28,ye=114;var Rt=511,It=131071,l=0,f=1,g=2,c=3,S=114,Ee=15;var Se=8;var G,F;function Oe(){G=new Uint8Array(511),F=new Uint8Array(16385);let r=511;for(let t=0;t<511;t++)r=(((r>>5^r)&1)<<8)+(r>>1),G[t]=r;r=131071;for(let t=0;t<16385;t++)r=(((r>>5^r)&255)<<9)+(r>>8),F[t]=r>>1}var U=class{constructor(t,e){this.irq=t;this.antic_xpos=e;this.regs=new Uint8Array(16);this.readregs=new Uint8Array(16);this.divnirq=new Uint32Array(4);this.divnmax=new Uint32Array(4);this.pot_inputs=new Uint8Array(8);this.basemult=0;this.pot_scanline=0;this.random_scanline_counter=0;this.kbcode=0;this.DELAYED_SERIN_IRQ=0;this.DELAYED_SEROUT_IRQ=0;this.DELAYED_XMTDONE_IRQ=0;this.init()}saveState(){return b(0,{},this)}loadState(t){b(0,this,t)}init(){this.readregs.fill(255),this.readregs[N]=239,this.basemult=Ot,this.pot_inputs.fill(128),Oe()}read(t){let e=this.readregs[t];switch(t&=15,t){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:return e=this.pot_inputs[t],e<this.pot_scanline?e:this.pot_scanline;case me:for(let s=0;s<8;s++)this.pot_inputs[s]<=this.pot_scanline&&(e&=~(1<<s));break;case ge:return this.kbcode;case N:e=N+(this.CASSETTE_IOLineStatus()<<4);break;case pe:if((this.regs[O]&3)!=0){let s=this.random_scanline_counter+this.antic_xpos();if(this.regs[m]&At)e=G[s%Rt];else{s%=It;let a=s>>3;s&=7,e=(F[a]>>s)+(F[a+1]<<8-s)}}break}return e&255}write(t,e){switch(t&=15,this.regs[t]=e,t){case m:e&Ae?this.basemult=ye:this.basemult=Ot,this.update_counter(1<<l|1<<f|1<<g|1<<c);break;case o:this.update_counter(this.regs[m]&Et?1<<f|1<<l:1<<l);break;case le:this.update_counter(1<<f);break;case bt:this.update_counter(this.regs[m]&St?1<<c|1<<g:1<<g);break;case _t:this.update_counter(1<<c);break;case z:this.readregs[T]|=~e&247,~this.readregs[T]&this.regs[z]&&this.generateIRQ(this.readregs[T]);break;case de:this.readregs[N]|=224;break;case xe:this.regs[O]&4||(this.pot_scanline=0);break;case ue:(this.regs[O]&112)==32&&this.siocheck()&&this.SIO_PutByte(e),(this.regs[O]&8)==0?(this.DELAYED_SEROUT_IRQ=Se,this.readregs[T]|=8,this.DELAYED_XMTDONE_IRQ=Ee):(this.DELAYED_SEROUT_IRQ=312*50*10*(this.regs[bt]+this.regs[_t]*256)/895e3,this.DELAYED_SEROUT_IRQ>=3?(this.readregs[T]|=8,this.DELAYED_XMTDONE_IRQ=2*this.DELAYED_SEROUT_IRQ-2):(this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0));break;case fe:this.divnirq[l]=this.divnmax[l],this.divnirq[f]=this.divnmax[f],this.divnirq[g]=this.divnmax[g],this.divnirq[c]=this.divnmax[c];break;case O:e&4&&(this.pot_scanline=228),(e&3)==0&&(this.DELAYED_SERIN_IRQ=0,this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0);break}this.snd_update(t)}update_counter(t){t&1<<l&&(this.regs[m]&yt?this.divnmax[l]=this.regs[o+l]+4:this.divnmax[l]=(this.regs[o+l]+1)*this.basemult,this.divnmax[l]<S&&(this.divnmax[l]=S)),t&1<<f&&(this.regs[m]&Et?this.regs[m]&yt?this.divnmax[f]=this.regs[o+f]*256+this.regs[o+l]+7:this.divnmax[f]=(this.regs[o+f]*256+this.regs[o+l]+1)*this.basemult:this.divnmax[f]=(this.regs[o+f]+1)*this.basemult,this.divnmax[f]<S&&(this.divnmax[f]=S)),t&1<<c&&(this.regs[m]&St?this.regs[m]&_e?this.divnmax[c]=this.regs[o+c]*256+this.regs[o+g]+7:this.divnmax[c]=(this.regs[o+c]*256+this.regs[o+g]+1)*this.basemult:this.divnmax[c]=(this.regs[o+c]+1)*this.basemult,this.divnmax[c]<S&&(this.divnmax[c]=S))}snd_update(t){}advanceScanline(){(this.regs[O]&3)!=0&&(this.pot_scanline<228&&this.pot_scanline++,this.random_scanline_counter+=S,this.random_scanline_counter%=this.regs[m]&At?Rt:It,this.DELAYED_SERIN_IRQ>0&&--this.DELAYED_SERIN_IRQ==0&&(this.readregs[be]=this.SIO_GetByte(),this.generateIRQ(32)),this.DELAYED_SEROUT_IRQ>0&&--this.DELAYED_SEROUT_IRQ==0&&this.generateIRQ(16),this.DELAYED_XMTDONE_IRQ>0&&--this.DELAYED_XMTDONE_IRQ==0&&this.generateIRQ(8),this.advanceIRQTimer(l,1),this.advanceIRQTimer(f,2),this.advanceIRQTimer(c,4))}advanceIRQTimer(t,e){(this.divnirq[t]-=S)<0&&(this.divnirq[t]+=this.divnmax[t],this.generateIRQ(e))}generateIRQ(t){this.regs[z]&t&&(this.irq(),this.readregs[T]&=~t)}static stateToLongString(t){let e="";return e+=`Write Registers:
`,e+=A(t.regs,0,16),e+=`Read Registers:
`,e+=A(t.readregs,0,16),e}CASSETTE_IOLineStatus(){return 0}siocheck(){return((this.regs[o+g]==40||this.regs[o+g]==16||this.regs[o+g]==8||this.regs[o+g]==10)&&this.regs[o+c]==0||(this.regs[O]&120)==40)&&(this.regs[m]&40)==40}SIO_PutByte(t){console.log("SIO put byte",t)}SIO_GetByte(){return 0}};var Re=[i.VK_L,i.VK_J,i.VK_SEMICOLON,i.VK_F4,i.VK_F5,i.VK_K,i.VK_BACK_SLASH,i.VK_TILDE,i.VK_O,null,i.VK_P,i.VK_U,i.VK_ENTER,i.VK_I,i.VK_MINUS2,i.VK_EQUALS2,i.VK_V,i.VK_F7,i.VK_C,i.VK_F6,i.VK_F4,i.VK_B,i.VK_X,i.VK_Z,i.VK_4,null,i.VK_3,i.VK_6,i.VK_ESCAPE,i.VK_5,i.VK_2,i.VK_1,i.VK_COMMA,i.VK_SPACE,i.VK_PERIOD,i.VK_N,null,i.VK_M,i.VK_SLASH,null,i.VK_R,null,i.VK_E,i.VK_Y,i.VK_TAB,i.VK_T,i.VK_W,i.VK_Q,i.VK_9,null,i.VK_0,i.VK_7,i.VK_BACK_SPACE,i.VK_8,null,null,i.VK_F,i.VK_H,i.VK_D,null,i.VK_CAPS_LOCK,i.VK_G,i.VK_S,i.VK_A],Ie=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]]),Y=class extends it{constructor(){super();this.cpuFrequency=1789773;this.numTotalScanlines=262;this.cpuCyclesPerLine=114;this.canvasWidth=336;this.numVisibleScanlines=224;this.aspectRatio=this.canvasWidth/this.numVisibleScanlines*.857;this.firstVisibleScanline=16;this.firstVisibleClock=(44-6)*2;this.defaultROMSize=32768;this.overscan=!0;this.audioOversample=2;this.sampleRate=this.numTotalScanlines*60*this.audioOversample;this.run_address=-1;this.inputs=new Uint8Array(4);this.linergb=new Uint32Array(this.canvasWidth);this.lastdmabyte=0;this.keycode=0;this.cart_80=!1;this.cart_a0=!1;this.xexdata=null;this.keyboard_active=!0;this.d500=new Uint8Array(256);this.cpu=new rt,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 V,this.irq_pokey=new U(this.pokey_irq.bind(this),()=>this.antic.h),this.audio_pokey=et(1),this.audioadapter=new st(this.audio_pokey.pokey1,this.audioOversample,this.sampleRate),this.handler=$(this.inputs,Ie,this.getKeyboardFunction(),!0)}newBus(){return{read:P([[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:P([[0,49146,65535,(t,e)=>{this.ram[t]=e}],[49147,49151,65535,(t,e)=>{this.ram[t]=e,this.initCartA()}],[53248,53503,31,(t,e)=>{this.gtia.setReg(t,e)}],[53760,54015,15,(t,e)=>{this.writePokey(t,e)}],[54272,54527,15,(t,e)=>{this.antic.setReg(t,e)}],[54528,54783,255,(t,e)=>{this.writeMapper(t,e)}]])}}loadBIOS(t){this.bios.set(t)}reset(){super.reset(),this.antic.reset(),this.gtia.reset(),this.keycode=0}read(t){return this.bus.read(t)}readDMA(t){let e=this.bus.read(t);return this.probe.logDMARead(t,e),this.lastdmabyte=e,e}readConst(t){return t<53248||t>=54528?this.bus.read(t):255}write(t,e){this.bus.write(t,e)}readPokey(t){switch(t&15){case 9:return this.keycode&255;case 15:return~this.keycode>>6&4|~this.keycode>>3&8|18;default:return this.irq_pokey.read(t)}}readPIA(t){if(t==0||t==1)return~this.inputs[t]}writePokey(t,e){this.audio_pokey.pokey1.setRegister(t,e),this.irq_pokey.write(t,e)}startScanline(){this.gtia.sync();for(let t=0;t<4;t++)this.gtia.readregs[ut+t]=~this.inputs[2]>>t&1;this.gtia.readregs[j]=~this.inputs[3]&7,this.audio&&this.audioadapter.generate(this.audio),this.irq_pokey.advanceScanline()}drawScanline(){let t=this.antic.v-this.firstVisibleScanline;t>=0&&t<this.numVisibleScanlines&&this.pixels.set(this.linergb,t*this.canvasWidth)}advanceCPU(){this.antic.clockPulse()?(this.antic.h<8&&this.gtia.updateGfx(this.antic.h-1,this.antic.v,this.lastdmabyte),this.antic.isWSYNC()&&this.probe.logWait(0),this.probe.logClocks(1)):super.advanceCPU();let t=this.antic.h*4-this.firstVisibleClock,e=()=>{this.gtia.clockPulse1(),this.linergb[t++]=this.gtia.rgb},s=()=>{this.gtia.clockPulse2(),this.linergb[t++]=this.gtia.rgb};this.gtia.clockPulse4(),this.antic.dliop&16&&this.antic.regs[4]&1?(t+=2,this.gtia.setBias(-1)):this.gtia.setBias(0);let a=lt[this.antic.mode],h=this.antic.h&1;return(a<8||h)&&(this.gtia.an=this.antic.shiftout()),e(),a==1&&(this.gtia.an=this.antic.shiftout()),s(),a<=2&&(this.gtia.an=this.antic.shiftout()),e(),a==1&&(this.gtia.an=this.antic.shiftout()),s(),1}loadState(t){this.loadControlsState(t),this.cpu.loadState(t.c),this.ram.set(t.ram),this.antic.loadState(t.antic),this.gtia.loadState(t.gtia),this.irq_pokey.loadState(t.pokey),this.lastdmabyte=t.lastdmabyte,this.cart_80=t.cart_80,this.cart_a0=t.cart_a0}saveState(){return{c:this.cpu.saveState(),ram:this.ram.slice(0),antic:this.antic.saveState(),gtia:this.gtia.saveState(),pokey:this.irq_pokey.saveState(),inputs:this.inputs.slice(0),lastdmabyte:this.lastdmabyte,keycode:this.keycode,cart_80:this.cart_80,cart_a0:this.cart_a0}}loadControlsState(t){this.inputs.set(t.inputs),this.keycode=t.keycode}saveControlsState(){return{inputs:this.inputs.slice(0),keycode:this.keycode}}getRasterScanline(){return this.antic.v}getRasterLineClock(){return this.antic.h}getDebugCategories(){return["CPU","Stack","ANTIC","GTIA","POKEY"]}getDebugInfo(t,e){switch(t){case"ANTIC":return k.stateToLongString(e.antic);case"GTIA":return V.stateToLongString(e.gtia);case"POKEY":return U.stateToLongString(e.pokey)}}getKeyboardFunction(){return(t,e,s,a)=>{if(!this.keyboard_active)return!1;if(a&(I.KeyDown|I.KeyUp)){var h=Re;if(e==i.VK_F9.c)return this.irq_pokey.generateIRQ(128),!0;for(var n=0;n<h.length;n++)if(h[n]&&h[n].c==e&&(this.keycode=n,a&I.Shift&&(this.keycode|=64),a&I.Ctrl&&(this.keycode|=128),a&I.KeyDown))return this.keycode|=256,this.irq_pokey.generateIRQ(64),!0}}}pokey_irq(){this.cpu.IRQ(),this.probe.logInterrupt(2)}antic_nmi(){this.cpu.NMI(),this.probe.logInterrupt(1)}loadROM(t,e){t[0]==255&&t[1]==255&&!(e==null?void 0:e.endsWith(".rom"))?this.xexdata=t:this.loadCartridge(t)}loadCartridge(t){if(t[0]==67&&t[1]==65&&t[2]==82&&t[3]==84&&(t=t.slice(16)),t.length!=4096&&t.length!=8192&&t.length!=16384&&t.length!=32768)throw new Error("Sorry, this platform can only load 4/8/16/32 KB cartridges at the moment.");let e=new Uint8Array(32768);for(let s=0;s<=e.length-t.length;s+=t.length)e.set(t,s);this.run_address=e[32766]+e[32767]*256,this.cart_a0=!0,this.cart_80=t.length==16384,super.loadROM(e)}writeMapper(t,e){t==255&&(e==128&&(this.cart_80=!1),e==160&&(this.cart_a0=!1))}loadXEX(t){let e=2,s=this.d500,a=0;for(var h=-1;e<t.length;){let p=t[e+0]+t[e+1]*256,d=t[e+2]+t[e+3]*256;console.log("XEX",x(e),x(p),x(d)),e+=4;for(let B=p;B<=d;B++)this.ram[B]=t[e++];if(p==736&&d==737&&(h=this.ram[736]+this.ram[737]*256,console.log("XEX run",x(h))),p==738&&d==739){var n=this.ram[738]+this.ram[739]*256;console.log("XEX init",x(n)),s[a++]=32,s[a++]=n&255,s[a++]=n>>8}if(e>t.length)throw new Error("Bad .XEX file format")}h>=0&&(s[a++]=169,s[a++]=160,s[a++]=141,s[a++]=255,s[a++]=213,s[a++]=76,s[a++]=h&255,s[a++]=h>>8,this.ram[10]=0,this.ram[11]=213,this.run_address=54528)}initCartA(){this.cpu.getPC()==61823&&this.xexdata&&this.loadXEX(this.xexdata)}},X=class extends Y{newBus(){return{read:P([[0,16383,65535,t=>this.ram[t]],[16384,49151,65535,t=>this.rom?this.rom[t-16384]:0],[49152,53247,31,t=>this.gtia.readReg(t)],[54272,54527,15,t=>this.antic.readReg(t)],[59392,61439,15,t=>this.readPokey(t)],[63488,65535,2047,t=>this.bios[t]]]),write:P([[0,16383,65535,(t,e)=>{this.ram[t]=e}],[49152,53247,31,(t,e)=>{this.gtia.setReg(t,e)}],[54272,54527,15,(t,e)=>{this.antic.setReg(t,e)}],[59392,61439,15,(t,e)=>{this.writePokey(t,e)}]])}}};var Tt=[{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)"}],Mt=Tt.concat([{id:"testmusic.c",name:"POKEY Music (C)"},{id:"sieve.bas",name:"Benchmark (FastBasic)"},{id:"pmtest.bas",name:"Sprites Test (FastBasic)"},{id:"dli.bas",name:"DLI Test (FastBasic)"},{id:"joyas.bas",name:"Match-3 Game (FastBasic)"}]),Pt={main:[{name:"RAM",start:0,size:49152,type:"ram"},{name:"Left Cartridge ROM",start:40960,size:8192,type:"rom"},{name:"GTIA",start:53248,size:32,type:"io"},{name:"POKEY",start:53760,size:16,type:"io"},{name:"PIA",start:54016,size:4,type:"io"},{name:"ANTIC",start:54272,size:16,type:"io"},{name:"Cartridge Control Line",start:54784,size:256,type:"io"},{name:"ROM",start:55296,size:2048,type:"rom"},{name:"Character Set",start:57344,size:1024,type:"rom"},{name:"ROM",start:58368,size:7168,type:"rom"}]};function vt(r){return r.endsWith(".bas")||r.endsWith(".fb")||r.endsWith(".fbi")?"fastbasic":at(r)}var W=class extends ht{constructor(){super(...arguments);this.getToolForFilename=vt;this.showHelp=kt;this.getROMExtension=Te;this.biosPath="res/altirra/kernel.rom"}newMachine(){return new Y}getPresets(){return Mt}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getMemoryMap(){return Pt}async start(){let t=await this.loadKernel();await super.start(),this.machine.loadBIOS(t)}async loadKernel(){var t=await fetch(this.biosPath);if(t.status==200||t.size){var e=await t.arrayBuffer();return new Uint8Array(e)}else throw new Error("could not load BIOS file")}},Ct=class extends W{constructor(){super(...arguments);this.biosPath="res/altirra/superkernel.rom"}newMachine(){return new X}},q=class extends ot{constructor(){super(...arguments);this.getToolForFilename=vt;this.getOpcodeMetadata=nt;this.showHelp=kt}getPresets(){return Tt}getDefaultExtension(){return".asm"}},Z=class extends q{constructor(){super(...arguments);this.getMemoryMap=function(){return Pt}}getPresets(){return Mt}loadROM(t,e){this.started?(this.loadROMFile(e),this.loadRegion(":cartleft:cart:rom",e)):this.startModule(this.mainElement,{jsfile:"mame8bitws.js",biosfile:"a800xl.zip",cfgfile:"a800xl.cfg",driver:"a800xl",width:336*2,height:225*2,romfn:"/emulator/cart.rom",romdata:new Uint8Array(e),romsize:8192,preInit:function(s){}})}start(){}},Dt=class extends q{constructor(){super(...arguments);this.getMemoryMap=function(){return{main:[{name:"RAM",start:0,size:16384,type:"ram"},{name:"Cartridge ROM",start:16384,size:32768,type:"rom"},{name:"GTIA",start:49152,size:32,type:"io"},{name:"ANTIC",start:54272,size:16,type:"io"},{name:"POKEY",start:59392,size:16,type:"io"},{name:"ATARI Character Set",start:63488,size:1024,type:"rom"},{name:"ROM",start:64512,size:1024,type:"rom"}]}}}loadROM(t,e){this.started?(this.loadROMFile(e),this.loadRegion(":cartleft:cart:rom",e)):this.startModule(this.mainElement,{jsfile:"mame8bitws.js",biosfile:"a5200/5200.rom",cfgfile:"a5200.cfg",driver:"a5200",width:336*2,height:225*2,romfn:"/emulator/cart.rom",romdata:new Uint8Array(e),romsize:32768,preInit:function(s){}})}start(){}};function Te(r){return r==null?".bin":r[0]==255&&r[1]==255?".xex":".rom"}function kt(){return"https://8bitworkshop.com/docs/platforms/atari8/"}R["atari8-800.xlmame"]=Z;R["atari8-800xl.mame"]=Z;R["atari8-5200.mame"]=Dt;R["atari8-800"]=W;R["atari8-5200"]=Ct;
//# sourceMappingURL=atari8-2AH7DNWQ.js.map