1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-09-29 22:54:54 +00:00
8bitworkshop/gen/atari8-TVMHGW66.js

11 lines
26 KiB
JavaScript

import{a as xt}from"./chunk-SB4FEYXH.js";import{C as dt,J as B,g as nt,k as ht,q as ot,s as ct,u as lt,z as ft}from"./chunk-I4VYBHZZ.js";import{$ as C,J as O,O as p,U as y,V as i,W as rt,Y as D,a as T,da as at,g as m,q as b}from"./chunk-LKR3N7UH.js";import"./chunk-5XVCUSSZ.js";var Vt=[0,25,17,9],Ft=[0,25+64,17+80,9+96],E=0,Nt=1,H=2,Q=3,Ut=4,Yt=5,Bt=7,Ht=9,w=10,Qt=11,jt=12,zt=13,mt=14,Gt=15,L=15;var qt=17-4,Wt=110-4,Xt=105,Zt=[0,0,8,10,8,16,8,16,8,4,4,2,1,2,1,1],Jt=[0,0,2,2,2,2,4,4,8,4,4,4,4,2,2,2],$t=[0,0,0,0,0,1,0,1,0,0,2,1,0,0,0,0],ut=[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.v=0;this.h=0;this.linebuf=new Uint8Array(48);this.dmaclock=0;this.dmaidx=0;this.output=0;this.dramrefresh=!1;this.vscroll=0;this.read=t,this.nmi=e}reset(){this.regs.fill(0),this.regs[mt]=0,this.regs[L]=127,this.regs[jt]=0,this.regs[zt]=255,this.setReg(E,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(E,t.regs[E])}static stateToLongString(t){let e="";return e+="H: "+T(t.h,3)+" V: "+T(t.v,3)+`
`,e+="DLIOp: "+m(t.dliop,2)+" Lines: "+t.yofs+"/"+t.linesleft,e+=" DMA "+(t.dma_enabled?"ON ":"off")+`
`,e+="Addr: "+m(t.scanaddr,4)+`
`,e+=y(t.regs,0,16).replace("$00","Regs"),e}setReg(t,e){switch(t){case w:this.regs[w]=255;return;case Gt:this.regs[L]=31;return}this.regs[t]=e}readReg(t){switch(t){case L:return this.regs[t];case Qt:return this.v>>1;default:return 255}}processDLIEntry(){this.mode==0?this.linesleft=(this.dliop>>4&7)+1:(this.linesleft=Zt[this.mode],this.period=Jt[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.lms&&(this.scanaddr=this.dlarg_lo+(this.dlarg_hi<<8)),this.startaddr=this.scanaddr);let t=this.regs[E]&3,e=this.dliop&16?(this.regs[Ut]&15)>>1:0;this.dliop&16&&t<3&&t++,this.left=Vt[t]+e,this.right=Ft[t]+e;let s=this.regs[Yt]&15;this.dliop&32^this.vscroll&&(this.vscroll?this.linesleft-=s:(this.linesleft-=s,this.yofs+=s),this.vscroll^=32)}nextLine(){this.linesleft>0&&(this.linesleft--,this.yofs++,this.mode>=8&&this.linesleft&&(this.scanaddr=this.startaddr))}triggerNMI(t){this.regs[L]=t|31,this.regs[mt]&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[E]&32}isVisibleScanline(){return this.v>=8&&this.v<248}isPlayfieldDMAEnabled(){return this.dma_enabled&&!this.linesleft}isPlayerDMAEnabled(){return this.regs[E]&8}isMissileDMAEnabled(){return this.regs[E]&12}clockPulse(){let t=this.regs[w]!=0;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,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.yofs==0&&(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.yofs==0&&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<=Xt;this.dmaclock<<=1,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.yofs==0&&(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<qt||this.h>Wt)&&(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[w]=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}doPlayerMissileDMA(t){let e=this.regs[E]&16,s=this.regs[Bt]<<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>>$t[this.mode],a=s&7,h=this.regs[Ht];(t&14)==6?(e&=63,h&=254):(e&=127,h&=252);let c=(e<<3)+(h<<8);if((t&14)==2){let n=this.regs[Nt],I=t==3&&(e&96)==96;n&4?this.pfbyte=this.read(c+(a^7)):this.pfbyte=this.read(c+a),I&&s<2&&(this.pfbyte=0),!I&&s>7&&(this.pfbyte=0),this.ch&128&&(n&1&&(this.pfbyte=0),n&2&&(this.pfbyte^=255))}else this.pfbyte=this.read(c+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: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 te=0;var ee=8,se=12,gt=13,pt=17,A=18,x=22,ie=23,re=24,ae=25,S=26,j=27;var _t=29,ne=30,he=31,oe=0,ce=4,le=8,K=12,bt=16,z=31,At=-9,G=[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],fe=[A+0,A+1,A+2,A+3,x+0,x+1,x+2,x+3,S,S,S,S,x+0,x+1,x+2,x+3],V=class{constructor(){this.regs=new Uint8Array(32);this.readregs=new Uint8Array(32);this.shiftregs=new Uint32Array(8);this.priortab=new Uint8Array(12);this.count=0;this.an=0;this.rgb=0;this.pmcol=0;this.gtiacol=0;this.gtiacol2=0;this.hbias=At}reset(){this.regs.fill(0),this.readregs.fill(0),this.readregs[20]=15,this.count=0}saveState(){return b(0,{},this)}loadState(t){b(0,this,t)}setReg(t,e){switch(t){case A:case A+1:case A+2:case A+3:case x:case x+1:case x+2:case x+3:case S:e&=254;break;case ne:this.readregs.fill(0,0,16);return}this.regs[t]=e}readReg(t){switch(t){case z:return this.readregs[t]&~this.regs[he]}return this.readregs[t]}sync(){this.count=0}setBias(t){this.hbias=At+t}updateGfx(t,e){switch(t){case 0:this.regs[_t]&1&&(this.regs[pt]=e);break;case 2:case 3:case 4:case 5:this.regs[_t]&2&&(this.regs[gt-2+t]=e);break}}getPlayfieldColor(){switch(this.regs[j]>>6){case 0:switch(this.an){case 0:return S;case 4:case 5:case 6:case 7:return x+this.an-4;case 8:return this.regs[re]&240|this.regs[ie]&15|256}break;case 1:return this.regs[S]&240|this.gtiacol&15|256;case 2:return fe[this.gtiacol];case 3:return this.regs[S]&15|this.gtiacol<<4|256}return 256}anySpriteActive(){return this.shiftregs[0]|this.shiftregs[1]|this.shiftregs[2]|this.shiftregs[3]|this.shiftregs[4]|this.shiftregs[5]|this.shiftregs[6]|this.shiftregs[7]}processPlayerMissile(){if(this.an==2||!this.anySpriteActive()){for(let n=0;n<8;n++)this.shiftObject(n);this.pmcol=-1;return}let t=(this.regs[j]&15)<<4,e=G[(this.an&7)+8+t],s=this.an-4,a=-1,h=0,c=0;for(let n=0;n<4;n++)if(this.shiftObject(n)){s>=0&&(this.readregs[ce+n]|=1<<s),h|=1<<n,c++;let _=G[n+t];_<e&&(a=n,e=_)}for(let n=0;n<4;n++)if(this.shiftObject(n+4)){s>=0&&(this.readregs[oe+n]|=1<<s),this.readregs[le+n]|=h;let _=G[n+t];_<e&&(a=n+4,e=_)}c>1&&(this.readregs[K+0]|=h&~1,this.readregs[K+1]|=h&~2,this.readregs[K+2]|=h&~4,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.regs[te+t]+this.hbias==this.count&&this.triggerObject(t),e}getObjectColor(t){return this.regs[j]&16&&t>=4?this.regs[ae]:this.regs[A+(t&3)]}triggerObject(t){let e,s;if(t<4)e=this.regs[ee+t]&3,s=this.regs[gt+t];else{let a=t-4<<1;e=this.regs[se]>>a&3,s=(this.regs[pt]>>a&3)<<6}e&1?s=yt(s):s<<=8,e==3?s=yt(s):s<<=16,this.shiftregs[t]=s}clockPulse1(){this.processPlayerMissile(),this.clockPulse2(),this.count++}clockPulse2(){var t;if(this.pmcol>=0)t=this.pmcol;else{let e=this.getPlayfieldColor();t=e&256?e&255:this.regs[e]}this.rgb=Et[t],this.gtiacol2=this.gtiacol2<<1|this.an>>3}clockPulse4(){this.gtiacol=this.gtiacol2&15}static stateToLongString(t){let e="";return e+=`X: ${T(t.count,3)} ANTIC: ${m(t.an,1)} PM: ${m(t.pmcol,3)}
`,e+=`Write Registers:
`,e+=y(t.regs,0,32),e+=`Read Registers:
`,e+=y(t.readregs,0,32),e}};function yt(r){return r=(r|r<<8)&16711935,r=(r|r<<4)&252645135,r=(r|r<<2)&858993459,r=(r|r<<1)&1431655765,r|r<<1}var Et=new Uint32Array(256);for(v=0;v<256;v++)Et[v]=at(v);var v;var o=0;var de=2;var St=4;var Rt=6;var u=8,xe=9,me=10,ue=11,ge=13,q=14,M=15;var pe=8,_e=9,be=10,Ae=13,P=14,F=15;var It=128,Ot=64,ye=32,Mt=16,Pt=8;var Ee=1,Tt=28,Se=114;var Ct=511,vt=131071,f=0,d=1,g=2,l=3,R=114,Re=15;var Ie=8;var W,N;function Oe(){W=new Uint8Array(511),N=new Uint8Array(16385);let r=511;for(let t=0;t<511;t++)r=(((r>>5^r)&1)<<8)+(r>>1),W[t]=r;r=131071;for(let t=0;t<16385;t++)r=(((r>>5^r)&255)<<9)+(r>>8),N[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[F]=239,this.basemult=Tt,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 pe:for(let s=0;s<8;s++)this.pot_inputs[s]<=this.pot_scanline&&(e&=~(1<<s));break;case _e:return this.kbcode;case F:e=F+(this.CASSETTE_IOLineStatus()<<4);break;case be:if((this.regs[M]&3)!=0){let s=this.random_scanline_counter+this.antic_xpos();if(this.regs[u]&It)e=W[s%Ct];else{s%=vt;let a=s>>3;s&=7,e=(N[a]>>s)+(N[a+1]<<8-s)}}break}return e&255}write(t,e){switch(t&=15,this.regs[t]=e,t){case u:e&Ee?this.basemult=Se:this.basemult=Tt,this.update_counter(1<<f|1<<d|1<<g|1<<l);break;case o:this.update_counter(this.regs[u]&Mt?1<<d|1<<f:1<<f);break;case de:this.update_counter(1<<d);break;case St:this.update_counter(this.regs[u]&Pt?1<<l|1<<g:1<<g);break;case Rt:this.update_counter(1<<l);break;case q:this.readregs[P]|=~e&247,~this.readregs[P]&this.regs[q]&&this.generateIRQ(this.readregs[P]);break;case me:this.readregs[F]|=224;break;case ue:this.regs[M]&4||(this.pot_scanline=0);break;case ge:(this.regs[M]&112)==32&&this.siocheck()&&this.SIO_PutByte(e),(this.regs[M]&8)==0?(this.DELAYED_SEROUT_IRQ=Ie,this.readregs[P]|=8,this.DELAYED_XMTDONE_IRQ=Re):(this.DELAYED_SEROUT_IRQ=312*50*10*(this.regs[St]+this.regs[Rt]*256)/895e3,this.DELAYED_SEROUT_IRQ>=3?(this.readregs[P]|=8,this.DELAYED_XMTDONE_IRQ=2*this.DELAYED_SEROUT_IRQ-2):(this.DELAYED_SEROUT_IRQ=0,this.DELAYED_XMTDONE_IRQ=0));break;case xe:this.divnirq[f]=this.divnmax[f],this.divnirq[d]=this.divnmax[d],this.divnirq[g]=this.divnmax[g],this.divnirq[l]=this.divnmax[l];break;case M: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<<f&&(this.regs[u]&Ot?this.divnmax[f]=this.regs[o+f]+4:this.divnmax[f]=(this.regs[o+f]+1)*this.basemult,this.divnmax[f]<R&&(this.divnmax[f]=R)),t&1<<d&&(this.regs[u]&Mt?this.regs[u]&Ot?this.divnmax[d]=this.regs[o+d]*256+this.regs[o+f]+7:this.divnmax[d]=(this.regs[o+d]*256+this.regs[o+f]+1)*this.basemult:this.divnmax[d]=(this.regs[o+d]+1)*this.basemult,this.divnmax[d]<R&&(this.divnmax[d]=R)),t&1<<l&&(this.regs[u]&Pt?this.regs[u]&ye?this.divnmax[l]=this.regs[o+l]*256+this.regs[o+g]+7:this.divnmax[l]=(this.regs[o+l]*256+this.regs[o+g]+1)*this.basemult:this.divnmax[l]=(this.regs[o+l]+1)*this.basemult,this.divnmax[l]<R&&(this.divnmax[l]=R))}snd_update(t){}advanceScanline(){(this.regs[M]&3)!=0&&(this.pot_scanline<228&&this.pot_scanline++,this.random_scanline_counter+=R,this.random_scanline_counter%=this.regs[u]&It?Ct:vt,this.DELAYED_SERIN_IRQ>0&&--this.DELAYED_SERIN_IRQ==0&&(this.readregs[Ae]=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(f,1),this.advanceIRQTimer(d,2),this.advanceIRQTimer(l,4))}advanceIRQTimer(t,e){(this.divnirq[t]-=R)<0&&(this.divnirq[t]+=this.divnmax[t],this.generateIRQ(e))}generateIRQ(t){this.regs[q]&t&&(this.irq(),this.readregs[P]&=~t)}static stateToLongString(t){let e="";return e+=`Write Registers:
`,e+=y(t.regs,0,16),e+=`Read Registers:
`,e+=y(t.readregs,0,16),e}CASSETTE_IOLineStatus(){return 0}siocheck(){return((this.regs[o+g]==40||this.regs[o+g]==16||this.regs[o+g]==8||this.regs[o+g]==10)&&this.regs[o+l]==0||(this.regs[M]&120)==40)&&(this.regs[u]&40)==40}SIO_PutByte(t){console.log("SIO put byte",t)}SIO_GetByte(){return 0}};var Me=[i.VK_L,i.VK_J,i.VK_SEMICOLON,i.VK_F1,i.VK_F2,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_F8,i.VK_C,i.VK_F3,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],Pe=D([[i.UP,0,1],[i.DOWN,0,2],[i.LEFT,0,4],[i.RIGHT,0,8],[i.VK_SHIFT,2,1],[i.START,3,1],[i.SELECT,3,2],[i.OPTION,3,4]]),Y=class extends ot{constructor(){super();this.cpuFrequency=1789773;this.numTotalScanlines=262;this.cpuCyclesPerLine=114;this.canvasWidth=336;this.numVisibleScanlines=224;this.aspectRatio=this.canvasWidth/this.numVisibleScanlines*.857;this.firstVisibleScanline=16;this.firstVisibleClock=(44-6)*2;this.defaultROMSize=32768;this.overscan=!0;this.audioOversample=4;this.sampleRate=this.numTotalScanlines*60*this.audioOversample;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.cpu=new lt,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=nt(1),this.audioadapter=new ht(this.audio_pokey.pokey1,this.audioOversample,this.sampleRate),this.handler=rt(this.inputs,Pe,this.getKeyboardFunction(),!0)}newBus(){return{read:C([[0,32767,65535,t=>this.ram[t]],[32768,40959,65535,t=>this.cart_80?this.rom[t-32768]:this.ram[t]],[40960,49151,65535,t=>this.cart_a0?this.rom[t-32768]:this.ram[t]],[53248,53503,31,t=>this.gtia.readReg(t)],[53760,54015,15,t=>this.readPokey(t)],[54016,54271,15,t=>this.readPIA(t)],[54272,54527,15,t=>this.antic.readReg(t)],[55296,65535,65535,t=>this.bios[t-55296]]]),write:C([[0,49146,65535,(t,e)=>{this.ram[t]=e}],[49147,49151,65535,(t,e)=>{this.ram[t]=e,this.initCartA()}],[53248,53503,31,(t,e)=>{this.gtia.setReg(t,e)}],[53760,54015,15,(t,e)=>{this.writePokey(t,e)}],[54272,54527,15,(t,e)=>{this.antic.setReg(t,e)}],[54528,54783,255,(t,e)=>{this.writeMapper(t,e)}]])}}loadBIOS(t){this.bios.set(t)}reset(){super.reset(),this.antic.reset(),this.gtia.reset(),this.keycode=0,this.xexdata&&(this.cart_a0=!0)}read(t){return this.bus.read(t)}readDMA(t){let e=this.bus.read(t);return this.probe.logVRAMRead(t,e),this.lastdmabyte=e,e}readConst(t){return t<53248||t>=57344?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[bt+t]=~this.inputs[2]>>t&1;this.gtia.readregs[z]=~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.gtia.updateGfx(this.antic.h-1,this.lastdmabyte),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=ut[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.keycode=t.keycode}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}}loadControlsState(t){this.inputs.set(t.inputs)}saveControlsState(){return{inputs:this.inputs.slice(0)}}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(a&(p.KeyDown|p.KeyUp)){var h=Me;if(e==i.VK_F9.c)return this.irq_pokey.generateIRQ(128),!0;for(var c=0;c<h.length;c++)if(h[c]&&h[c].c==e&&(this.keycode=c,a&p.Shift&&(this.keycode|=64),a&p.Ctrl&&(this.keycode|=128),a&p.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){if(e&&e.toLowerCase().endsWith(".xex")&&t[0]==255&&t[1]==255){this.xexdata=t;let s=new Uint8Array(4096);s.set([0,1,0,4,0,1],4090),this.loadCartridge(s)}else 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.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.ram,a=256;for(;e<t.length;){let n=t[e+0]+t[e+1]*256,I=t[e+2]+t[e+3]*256;console.log("XEX",e,m(n),m(I)),e+=4;for(let _=n;_<=I;_++)this.ram[_]=t[e++];var h=this.ram[736]+this.ram[737]*256,c=this.ram[738]+this.ram[739]*256;if(console.log("XEX run",m(h),"init",m(c)),c&&(s[a++]=32,s[a++]=c&255,s[a++]=c>>8),e>t.length)throw new Error("Bad .XEX file format")}h&&(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)}initCartA(){this.cpu.getPC()==61823&&this.xexdata&&this.loadXEX(this.xexdata)}},X=class extends Y{newBus(){return{read:C([[0,16383,65535,t=>this.ram[t]],[16384,49151,65535,t=>this.rom?this.rom[t-16384]:0],[49152,53247,31,t=>this.gtia.readReg(t)],[54272,54527,15,t=>this.antic.readReg(t)],[59392,61439,15,t=>this.readPokey(t)],[63488,65535,2047,t=>this.bios[t]]]),write:C([[0,16383,65535,(t,e)=>{this.ram[t]=e}],[49152,53247,31,(t,e)=>{this.gtia.setReg(t,e)}],[54272,54527,15,(t,e)=>{this.antic.setReg(t,e)}],[59392,61439,15,(t,e)=>{this.writePokey(t,e)}]])}}},Z=class extends ct{constructor(){super(...arguments);this.numTotalScanlines=312;this.cpuCyclesPerLine=63;this.joymask0=0;this.joymask1=0}loadROM(t){super.loadROM(t),this.reloadROM()}reloadROM(){if(this.sys){var t=this.exports.machine_load_rom(this.sys,this.romptr,this.romlen);console.log("machine_load_rom",t)}}loadBIOS(t){super.loadBIOS(t)}reset(){this.reloadROM()}advanceFrame(t){return this.exports.machine_start_frame(this.sys),t?this.advanceFrameClock(t,999999):this.exports.machine_advance_frame(this.sys),this.syncVideo(),this.syncAudio(),1}getCPUState(){this.exports.machine_save_cpu_state(this.sys,this.stateptr);var t=this.statearr,e=t[6]+(t[7]<<8);return{PC:e,SP:t[2],A:t[0],X:t[3],Y:t[4],C:t[1]&1,Z:t[1]&2,I:t[1]&4,D:t[1]&8,V:t[1]&64,N:t[1]&128,o:this.readConst(e)}}saveState(){var t=this.getCPUState();return this.exports.machine_save_state(this.sys,this.stateptr),{c:t,state:this.statearr.slice(0)}}loadState(t){this.statearr.set(t.state),this.exports.machine_load_state(this.sys,this.stateptr)}getVideoParams(){return{width:384,height:240,overscan:!0,videoFrequency:60}}pollControls(){}setKeyInput(t,e,s){s&p.Shift&&(t|=256),s&p.Ctrl&&(t|=512);var a=0;t==37&&(t=8,a=4),t==38&&(t=11,a=1),t==39&&(t=9,a=8),t==40&&(t=10,a=2),t==32&&(a=256),s&p.KeyDown?(this.exports.machine_key_down(this.sys,t),this.joymask0|=a):s&p.KeyUp&&(this.exports.machine_key_up(this.sys,t),this.joymask0&=~a),this.setJoyInput(0,this.joymask0),this.setJoyInput(1,this.joymask1)}setJoyInput(t,e){this.exports.machine_joy_set(this.sys,t,e)}setPaddleInput(t,e){this.exports.machine_paddle_set(this.sys,t,e)}};var Dt=[{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)"}],J=Dt.concat([{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)"}]),os=D([[i.VK_SPACE,0,0],[i.VK_ENTER,0,0]]),$={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 tt(r){return r.endsWith(".bas")||r.endsWith(".fb")||r.endsWith(".fbi")?"fastbasic":ft(r)}var et=class extends xt{constructor(){super(...arguments);this.getToolForFilename=tt;this.getOpcodeMetadata=dt}getPresets(){return Dt}getDefaultExtension(){return".asm"}showHelp(t,e){t=="fastbasic"?window.open("https://github.com/dmsc/fastbasic/blob/master/manual.md","_help"):window.open("https://atariwiki.org/wiki/Wiki.jsp?page=Assembler","_help")}};var st=class extends et{constructor(){super(...arguments);this.getMemoryMap=function(){return $}}getPresets(){return J}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(){}},wt=class extends et{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(){}},Lt=class extends B{constructor(){super(...arguments);this.getToolForFilename=tt}newMachine(){return new Z("atari8")}getPresets(){return J}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getMemoryMap(){return $}showHelp(){}getROMExtension(t){return t&&t[0]==1&&t[1]==8?".prg":".bin"}},kt=class extends Lt{},it=class extends B{constructor(){super(...arguments);this.getToolForFilename=tt;this.biosPath="res/altirra/kernel.rom"}newMachine(){return new Y}getPresets(){return J}getDefaultExtension(){return".c"}readAddress(t){return this.machine.readConst(t)}getMemoryMap(){return $}showHelp(){}getROMExtension(t){return t&&t[0]==1&&t[1]==8?".prg":".bin"}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")}},Kt=class extends it{constructor(){super(...arguments);this.biosPath="res/altirra/superkernel.rom"}newMachine(){return new X}};O["atari8-800.xlmame"]=st;O["atari8-800xl.mame"]=st;O["atari8-5200.mame"]=wt;O["atari8-800.xlwasm"]=kt;O["atari8-800"]=it;O["atari8-5200"]=Kt;
//# sourceMappingURL=atari8-TVMHGW66.js.map