diff --git a/gen/atari8-7JMZYB25.js b/gen/atari8-6YYPKFEU.js similarity index 90% rename from gen/atari8-7JMZYB25.js rename to gen/atari8-6YYPKFEU.js index f8c1d373..61e7613b 100644 --- a/gen/atari8-7JMZYB25.js +++ b/gen/atari8-6YYPKFEU.js @@ -1,7 +1,7 @@ -import{a as nt}from"./chunk-237GW4LQ.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-ELRBFCEX.js";import{K as S,V as O,W as i,X as Z,Z as J,a as F,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,B=2,H=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,Q=[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: "+F(e.h,3)+" V: "+F(e.v,3)+` +import{a as nt}from"./chunk-237GW4LQ.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-ELRBFCEX.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)+` `,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=Q[this.mode],this.period=Ft[this.mode],this.jmp?(this.regs[B]=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[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[B]+(this.regs[H]<<8)}nextInsn(){let e=this.getDlistAddr(),t=this.read(e);return e=e+1&1023|e&-1024,this.regs[B]=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[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,z=14,E=15;var qt=8,Wt=9,Gt=10,jt=13,I=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 X,K;function se(){X=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),X[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[I]|=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[z]&e&&(this.irq(),this.readregs[I]&=~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=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),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 Y,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 Y.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="",R=!1,D;if(p==0)D=(l>>4&7)+1,d+=" blank="+D;else{D=Q[p],d+=" mode="+m(p),d+=" lines="+D,R=(l&-65)==1;let j=(l&64)!=0&&(l&15)!=0;if(l&16&&(d+=" HSCROL"),l&32&&(d+=" VSCROL"),l&128&&(d+=" DLI"),R&&l&64?d+=" JVB":R?d+=" JMP":j&&(d+=" LMS"),R||j){let It=s(),Rt=s();d+=" $"+m(Rt)+m(It)}}if(r.push("$"+m(f)+" y="+n+" "+d),R)break;n+=D}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}},q=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"]}},U=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/"}S["atari8-800.xlmame"]=U;S["atari8-800xl.mame"]=U;S["atari8-5200.mame"]=W;S["atari8-800"]=w;S["atari8-5200"]=q; -//# sourceMappingURL=atari8-7JMZYB25.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]]),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-6YYPKFEU.js.map diff --git a/gen/atari8-7JMZYB25.js.map b/gen/atari8-6YYPKFEU.js.map similarity index 99% rename from gen/atari8-7JMZYB25.js.map rename to gen/atari8-6YYPKFEU.js.map index 691fe6e8..af61b552 100644 --- a/gen/atari8-7JMZYB25.js.map +++ b/gen/atari8-6YYPKFEU.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-800xl.mame'] = Atari800MAMEPlatform // for dithertron\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 (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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", "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-PIHGTUS7.js b/gen/basic-TJGJVKDY.js similarity index 99% rename from gen/basic-PIHGTUS7.js rename to gen/basic-TJGJVKDY.js index a187c8c6..41723ff9 100644 --- a/gen/basic-PIHGTUS7.js +++ b/gen/basic-TJGJVKDY.js @@ -1,4 +1,4 @@ -import{b as S}from"./chunk-3FIVEUG2.js";import{w as E}from"./chunk-UPXOK7NH.js";import"./chunk-CZNGOAGP.js";import"./chunk-T6VURU5O.js";import"./chunk-A7SWO6EA.js";import"./chunk-VJW2RRBI.js";import"./chunk-ELRBFCEX.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{w as E}from"./chunk-L4IYBNZK.js";import"./chunk-CZNGOAGP.js";import"./chunk-T6VURU5O.js";import"./chunk-A7SWO6EA.js";import"./chunk-LHLRVY5A.js";import"./chunk-ELRBFCEX.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{w as E}from"./chunk-UPXOK7NH.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{(function(r){if(typeof ob=="object"&&typeof Su!="undefined")Su.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 i(n,s,o){function a(d,h){if(!s[d]){if(!n[d]){var u=typeof _o=="function"&&_o;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:{}};n[d][0].call(p.exports,function(m){var S=n[d][1][m];return a(S||m)},p,p.exports,i,n,s,o)}return s[d].exports}for(var l=typeof _o=="function"&&_o,c=0;c=43)}}).catch(function(){return!1})}function q(g){return typeof A=="boolean"?u.resolve(A):z(g).then(function(y){return A=y,A})}function ne(g){var y=R[g.name],x={};x.promise=new u(function(k,X){x.resolve=k,x.reject=X}),y.deferredOperations.push(x),y.dbReady?y.dbReady=y.dbReady.then(function(){return x.promise}):y.dbReady=x.promise}function se(g){var y=R[g.name],x=y.deferredOperations.pop();if(x)return x.resolve(),x.promise}function te(g,y){var x=R[g.name],k=x.deferredOperations.pop();if(k)return k.reject(y),k.promise}function fe(g,y){return new u(function(x,k){if(R[g.name]=R[g.name]||At(),g.db)if(y)ne(g),g.db.close();else return x(g.db);var X=[g.name];y&&X.push(g.version);var Q=c.open.apply(c,X);y&&(Q.onupgradeneeded=function(Z){var L=Q.result;try{L.createObjectStore(g.storeName),Z.oldVersion<=1&&L.createObjectStore(v)}catch(D){if(D.name==="ConstraintError")console.warn('The database "'+g.name+'" has been upgraded from version '+Z.oldVersion+" to version "+Z.newVersion+', but the storage "'+g.storeName+'" already exists.');else throw D}}),Q.onerror=function(Z){Z.preventDefault(),k(Q.error)},Q.onsuccess=function(){var Z=Q.result;Z.onversionchange=function(L){L.target.close()},x(Z),se(g)}})}function Oe(g){return fe(g,!1)}function ve(g){return fe(g,!0)}function M(g,y){if(!g.db)return!0;var x=!g.db.objectStoreNames.contains(g.storeName),k=g.versiong.db.version;if(k&&(g.version!==y&&console.warn('The database "'+g.name+`" can't be downgraded from version `+g.db.version+" to version "+g.version+"."),g.version=g.db.version),X||x){if(x){var Q=g.db.version+1;Q>g.version&&(g.version=Q)}return!0}return!1}function oe(g){return new u(function(y,x){var k=new FileReader;k.onerror=x,k.onloadend=function(X){var Q=btoa(X.target.result||"");y({__local_forage_encoded_blob:!0,data:Q,type:g.type})},k.readAsBinaryString(g)})}function G(g){var y=C(atob(g.data));return h([y],{type:g.type})}function ge(g){return g&&g.__local_forage_encoded_blob}function Se(g){var y=this,x=y._initReady().then(function(){var k=R[y._dbInfo.name];if(k&&k.dbReady)return k.dbReady});return p(x,g,g),x}function Fe(g){ne(g);for(var y=R[g.name],x=y.forages,k=0;k0&&(!g.db||Q.name==="InvalidStateError"||Q.name==="NotFoundError"))return u.resolve().then(function(){if(!g.db||Q.name==="NotFoundError"&&!g.db.objectStoreNames.contains(g.storeName)&&g.version<=g.db.version)return g.db&&(g.version=g.db.version+1),ve(g)}).then(function(){return Fe(g).then(function(){Ne(g,y,x,k-1)})}).catch(x);x(Q)}}function At(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function Zr(g){var y=this,x={db:null};if(g)for(var k in g)x[k]=g[k];var X=R[x.name];X||(X=At(),R[x.name]=X),X.forages.push(y),y._initReady||(y._initReady=y.ready,y.ready=Se);var Q=[];function Z(){return u.resolve()}for(var L=0;L>4,N[X++]=(Z&15)<<4|L>>2,N[X++]=(L&3)<<6|D&63;return j}function Ei(g){var y=new Uint8Array(g),x="",k;for(k=0;k>2],x+=pr[(y[k]&3)<<4|y[k+1]>>4],x+=pr[(y[k+1]&15)<<2|y[k+2]>>6],x+=pr[y[k+2]&63];return y.length%3===2?x=x.substring(0,x.length-1)+"=":y.length%3===1&&(x=x.substring(0,x.length-2)+"=="),x}function us(g,y){var x="";if(g&&(x=hs.call(g)),g&&(x==="[object ArrayBuffer]"||g.buffer&&hs.call(g.buffer)==="[object ArrayBuffer]")){var k,X=Et;g instanceof ArrayBuffer?(k=g,X+=ls):(k=g.buffer,x==="[object Int8Array]"?X+=xo:x==="[object Uint8Array]"?X+=cs:x==="[object Uint8ClampedArray]"?X+=wo:x==="[object Int16Array]"?X+=So:x==="[object Uint16Array]"?X+=ti:x==="[object Int32Array]"?X+=Ur:x==="[object Uint32Array]"?X+=ri:x==="[object Float32Array]"?X+=ds:x==="[object Float64Array]"?X+=gn:y(new Error("Failed to get type for BinaryArray"))),y(X+Ei(k))}else if(x==="[object Blob]"){var Q=new FileReader;Q.onload=function(){var Z=je+g.type+"~"+Ei(this.result);y(Et+mr+Z)},Q.readAsArrayBuffer(g)}else try{y(JSON.stringify(g))}catch(Z){console.error("Couldn't convert value into a JSON string: ",g),y(null,Z)}}function hl(g){if(g.substring(0,Oi)!==Et)return JSON.parse(g);var y=g.substring(bn),x=g.substring(Oi,bn),k;if(x===mr&&as.test(y)){var X=y.match(as);k=X[1],y=y.substring(X[0].length)}var Q=pi(y);switch(x){case ls:return Q;case mr:return h([Q],{type:k});case xo:return new Int8Array(Q);case cs:return new Uint8Array(Q);case wo:return new Uint8ClampedArray(Q);case So:return new Int16Array(Q);case ti:return new Uint16Array(Q);case Ur:return new Int32Array(Q);case ri:return new Uint32Array(Q);case ds:return new Float32Array(Q);case gn:return new Float64Array(Q);default:throw new Error("Unkown type: "+x)}}var fs={serialize:us,deserialize:hl,stringToBuffer:pi,bufferToString:Ei};function yo(g,y,x,k){g.executeSql("CREATE TABLE IF NOT EXISTS "+y.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],x,k)}function vo(g){var y=this,x={db:null};if(g)for(var k in g)x[k]=typeof g[k]!="string"?g[k].toString():g[k];var X=new u(function(Q,Z){try{x.db=openDatabase(x.name,String(x.version),x.description,x.size)}catch(L){return Z(L)}x.db.transaction(function(L){yo(L,x,function(){y._dbInfo=x,Q()},function(D,j){Z(j)})},Z)});return x.serializer=fs,X}function gr(g,y,x,k,X,Q){g.executeSql(x,k,X,function(Z,L){L.code===L.SYNTAX_ERR?Z.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[y.storeName],function(D,j){j.rows.length?Q(D,L):yo(D,y,function(){D.executeSql(x,k,X,Q)},Q)},Q):Q(Z,L)},Q)}function Zi(g,y){var x=this;g=m(g);var k=new u(function(X,Q){x.ready().then(function(){var Z=x._dbInfo;Z.db.transaction(function(L){gr(L,Z,"SELECT * FROM "+Z.storeName+" WHERE key = ? LIMIT 1",[g],function(D,j){var N=j.rows.length?j.rows.item(0).value:null;N&&(N=Z.serializer.deserialize(N)),X(N)},function(D,j){Q(j)})})}).catch(Q)});return f(k,y),k}function Ui(g,y){var x=this,k=new u(function(X,Q){x.ready().then(function(){var Z=x._dbInfo;Z.db.transaction(function(L){gr(L,Z,"SELECT * FROM "+Z.storeName,[],function(D,j){for(var N=j.rows,le=N.length,xe=0;xe0){Z(Qo.apply(X,[g,D,x,k-1]));return}L(xe)}})})}).catch(L)});return f(Q,x),Q}function ul(g,y,x){return Qo.apply(this,[g,y,x,1])}function fl(g,y){var x=this;g=m(g);var k=new u(function(X,Q){x.ready().then(function(){var Z=x._dbInfo;Z.db.transaction(function(L){gr(L,Z,"DELETE FROM "+Z.storeName+" WHERE key = ?",[g],function(){X()},function(D,j){Q(j)})})}).catch(Q)});return f(k,y),k}function Ol(g){var y=this,x=new u(function(k,X){y.ready().then(function(){var Q=y._dbInfo;Q.db.transaction(function(Z){gr(Z,Q,"DELETE FROM "+Q.storeName,[],function(){k()},function(L,D){X(D)})})}).catch(X)});return f(x,g),x}function pl(g){var y=this,x=new u(function(k,X){y.ready().then(function(){var Q=y._dbInfo;Q.db.transaction(function(Z){gr(Z,Q,"SELECT COUNT(key) as c FROM "+Q.storeName,[],function(L,D){var j=D.rows.item(0).c;k(j)},function(L,D){X(D)})})}).catch(X)});return f(x,g),x}function Os(g,y){var x=this,k=new u(function(X,Q){x.ready().then(function(){var Z=x._dbInfo;Z.db.transaction(function(L){gr(L,Z,"SELECT key FROM "+Z.storeName+" WHERE id = ? LIMIT 1",[g+1],function(D,j){var N=j.rows.length?j.rows.item(0).key:null;X(N)},function(D,j){Q(j)})})}).catch(Q)});return f(k,y),k}function ps(g){var y=this,x=new u(function(k,X){y.ready().then(function(){var Q=y._dbInfo;Q.db.transaction(function(Z){gr(Z,Q,"SELECT key FROM "+Q.storeName,[],function(L,D){for(var j=[],N=0;N '__WebKitDatabaseInfoTable__'",[],function(X,Q){for(var Z=[],L=0;L0}function bl(g){var y=this,x={};if(g)for(var k in g)x[k]=g[k];return x.keyPrefix=ml(g,y._defaultConfig),ko()?(y._dbInfo=x,x.serializer=fs,u.resolve()):u.reject()}function To(g){var y=this,x=y.ready().then(function(){for(var k=y._dbInfo.keyPrefix,X=localStorage.length-1;X>=0;X--){var Q=localStorage.key(X);Q.indexOf(k)===0&&localStorage.removeItem(Q)}});return f(x,g),x}function nu(g,y){var x=this;g=m(g);var k=x.ready().then(function(){var X=x._dbInfo,Q=localStorage.getItem(X.keyPrefix+g);return Q&&(Q=X.serializer.deserialize(Q)),Q});return f(k,y),k}function xn(g,y){var x=this,k=x.ready().then(function(){for(var X=x._dbInfo,Q=X.keyPrefix,Z=Q.length,L=localStorage.length,D=1,j=0;j=0;Z--){var L=localStorage.key(Z);L.indexOf(Q)===0&&localStorage.removeItem(L)}}):X=u.reject("Invalid arguments"),f(X,y),X}var Xo={_driver:"localStorageWrapper",_initStorage:bl,_support:$o(),iterate:xn,getItem:nu,setItem:au,removeItem:Mi,clear:To,length:Je,key:su,keys:ou,dropInstance:xl},wl=function(y,x){return y===x||typeof y=="number"&&typeof x=="number"&&isNaN(y)&&isNaN(x)},Sl=function(y,x){for(var k=y.length,X=0;X{"use strict";function QP(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,i=Array(e);t2?i-2:0),s=2;s1?t-1:0),n=1;n1?t-1:0),n=1;n2&&arguments[2]!==void 0?arguments[2]:el;if(PP&&PP(r,null),!fo(e))return r;let i=e.length;for(;i--;){let n=e[i];if(typeof n=="string"){let s=t(n);s!==n&&(l5(e)||(e[i]=s),n=s)}r[n]=!0}return r}function g5(r){for(let e=0;e/g),Q5=gt(/\${[\w\W]*/g),P5=gt(/^data-[\-\w.\u00B7-\uFFFF]+$/),$5=gt(/^aria-[\-\w]+$/),ZP=gt(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),k5=gt(/^(?:\w+script|data):/i),T5=gt(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),X5=gt(/^html$/i),_5=gt(/^[a-z][.\w]*(-[.\w]+)+$/i),UP=gt(/<[/\w!]/g),zP=gt(/<[/\w]/g),R5=gt(/<\/no(script|embed|frames)/i),C5=gt(/\/>/i),ur={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},WP=["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"],A5=mt(Ae({},WP)),E5=(function(){let r={};return ns(WP,e=>{r[e]=gt(new RegExp("])","i"))}),mt(r)})(),Z5=function(){return typeof window=="undefined"?null:window},U5=function(e,t){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let i=null,n="data-tt-policy-suffix";t&&t.hasAttribute(n)&&(i=t.getAttribute(n));let s="dompurify"+(i?"#"+i:"");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}},MP=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},fn=function(e,t,i,n){return ir(e,t)&&fo(e[t])?Ae(n.base?fr(n.base):{},e[t],n.transform):i},kg=function(e,t,i){let n=ir(e,t)?e[t]:void 0;return n&&typeof n=="object"?fr(n):i()};function VP(){let r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Z5(),e=I=>VP(I);if(e.version="3.4.15",e.removed=[],!r||!r.document||r.document.nodeType!==ur.document||!r.Element)return e.isSupported=!1,e;let t=r.document,i=t,n=i.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=Ar(u,"cloneNode"),p=Ar(u,"remove"),m=Ar(u,"removeAttributeNode"),S=Ar(u,"nextSibling"),v=Ar(u,"childNodes"),A=Ar(u,"parentNode"),R=Ar(u,"shadowRoot"),U=Ar(u,"attributes"),T=o&&o.prototype?Ar(o.prototype,"nodeType"):null,P=o&&o.prototype?Ar(o.prototype,"nodeName"):null,C=o&&o.prototype?Ar(o.prototype,"ownerDocument"):null,z=function(b){return T?T(b):b.nodeType},q=function(b){return P?P(b):b.nodeName};if(typeof s=="function"){let I=t.createElement("template");I.content&&I.content.ownerDocument&&(t=I.content.ownerDocument)}let ne,se="",te,fe=!1,Oe=0,ve=function(){if(Oe>0)throw is('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.')},M=function(b){ve(),Oe++;try{return ne.createHTML(b)}finally{Oe--}},oe=function(b){ve(),Oe++;try{return ne.createScriptURL(b)}finally{Oe--}},G=function(){return fe||(te=U5(h,n),fe=!0),te},ge=t,Se=ge.implementation,Fe=ge.createNodeIterator,Ne=ge.createDocumentFragment,At=ge.getElementsByTagName,Zr=i.importNode,Re=MP();e.isSupported=typeof LP=="function"&&typeof A=="function"&&Se&&Se.createHTMLDocument!==void 0;let Ai=y5,os=v5,Jh=Q5,eu=P5,tu=$5,ru=k5,cl=T5,iu=_5,dl=ZP,Ve=null,pr=Ae({},[...RP,...vg,...Qg,...Pg,...CP]),je=null,as=Ae({},[...AP,...$g,...EP,...Eh]),Et=Object.seal(uo(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}})),Oi=null,ls=null,mr=Object.seal(uo(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),xo=!0,cs=!0,wo=!1,So=!0,Ur=!1,ti=!0,ri=!1,ds=!1,gn=null,bn=null,hs=!1,pi=!1,Ei=!1,us=!1,hl=!0,fs=!1,yo="user-content-",vo=!0,gr=!1,Zi={},Ui=null,Qo=Ae({},["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"]),ul=null,fl=Ae({},["audio","video","img","source","image","track"]),Ol=null,pl=Ae({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Os="http://www.w3.org/1998/Math/MathML",ps="http://www.w3.org/2000/svg",br="http://www.w3.org/1999/xhtml",zi=br,Po=!1,$o=null,ml=Ae({},[Os,ps,br],yg),gl=mt(["mi","mo","mn","ms","mtext"]),ko=Ae({},gl),bl=mt(["annotation-xml"]),To=Ae({},bl),nu=Ae({},["title","style","font","a","script"]),xn=null,su=["application/xhtml+xml","text/html"],ou="text/html",Je=null,Mi=null,au=t.createElement("form"),xl=function(b){return b instanceof RegExp||b instanceof Function},Xo=function(){let b=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(Mi&&Mi===b)return;(!b||typeof b!="object")&&(b={}),b=fr(b),xn=su.indexOf(b.PARSER_MEDIA_TYPE)===-1?ou:b.PARSER_MEDIA_TYPE,Je=xn==="application/xhtml+xml"?yg:el,Ve=fn(b,"ALLOWED_TAGS",pr,{transform:Je}),je=fn(b,"ALLOWED_ATTR",as,{transform:Je}),$o=fn(b,"ALLOWED_NAMESPACES",ml,{transform:yg}),Ol=fn(b,"ADD_URI_SAFE_ATTR",pl,{transform:Je,base:pl}),ul=fn(b,"ADD_DATA_URI_TAGS",fl,{transform:Je,base:fl}),Ui=fn(b,"FORBID_CONTENTS",Qo,{transform:Je}),Oi=fn(b,"FORBID_TAGS",fr({}),{transform:Je}),ls=fn(b,"FORBID_ATTR",fr({}),{transform:Je}),Zi=ir(b,"USE_PROFILES")?b.USE_PROFILES&&typeof b.USE_PROFILES=="object"?fr(b.USE_PROFILES):b.USE_PROFILES:!1,xo=b.ALLOW_ARIA_ATTR!==!1,cs=b.ALLOW_DATA_ATTR!==!1,wo=b.ALLOW_UNKNOWN_PROTOCOLS||!1,So=b.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Ur=b.SAFE_FOR_TEMPLATES||!1,ti=b.SAFE_FOR_XML!==!1,ri=b.WHOLE_DOCUMENT||!1,pi=b.RETURN_DOM||!1,Ei=b.RETURN_DOM_FRAGMENT||!1,us=b.RETURN_TRUSTED_TYPE||!1,hs=b.FORCE_BODY||!1,hl=b.SANITIZE_DOM!==!1,fs=b.SANITIZE_NAMED_PROPS||!1,vo=b.KEEP_CONTENT!==!1,gr=b.IN_PLACE||!1,dl=x5(b.ALLOWED_URI_REGEXP)?b.ALLOWED_URI_REGEXP:ZP,zi=typeof b.NAMESPACE=="string"?b.NAMESPACE:br,ko=kg(b,"MATHML_TEXT_INTEGRATION_POINTS",()=>Ae({},gl)),To=kg(b,"HTML_INTEGRATION_POINTS",()=>Ae({},bl));let _=kg(b,"CUSTOM_ELEMENT_HANDLING",()=>uo(null));if(Et=uo(null),ir(_,"tagNameCheck")&&xl(_.tagNameCheck)&&(Et.tagNameCheck=_.tagNameCheck),ir(_,"attributeNameCheck")&&xl(_.attributeNameCheck)&&(Et.attributeNameCheck=_.attributeNameCheck),ir(_,"allowCustomizedBuiltInElements")&&typeof _.allowCustomizedBuiltInElements=="boolean"&&(Et.allowCustomizedBuiltInElements=_.allowCustomizedBuiltInElements),gt(Et),Ur&&(cs=!1),Ei&&(pi=!0),Zi&&(Ve=Ae({},CP),je=uo(null),Zi.html===!0&&(Ae(Ve,RP),Ae(je,AP)),Zi.svg===!0&&(Ae(Ve,vg),Ae(je,$g),Ae(je,Eh)),Zi.svgFilters===!0&&(Ae(Ve,Qg),Ae(je,$g),Ae(je,Eh)),Zi.mathMl===!0&&(Ae(Ve,Pg),Ae(je,EP),Ae(je,Eh))),mr.tagCheck=null,mr.attributeCheck=null,ir(b,"ADD_TAGS")&&(typeof b.ADD_TAGS=="function"?mr.tagCheck=b.ADD_TAGS:fo(b.ADD_TAGS)&&(Ve===pr&&(Ve=fr(Ve)),Ae(Ve,b.ADD_TAGS,Je))),ir(b,"ADD_ATTR")&&(typeof b.ADD_ATTR=="function"?mr.attributeCheck=b.ADD_ATTR:fo(b.ADD_ATTR)&&(je===as&&(je=fr(je)),Ae(je,b.ADD_ATTR,Je))),ir(b,"ADD_FORBID_CONTENTS")&&fo(b.ADD_FORBID_CONTENTS)&&(Ui===Qo&&(Ui=fr(Ui)),Ae(Ui,b.ADD_FORBID_CONTENTS,Je)),vo&&(Ve["#text"]=!0),ri&&Ae(Ve,["html","head","body"]),Ve.table&&(Ae(Ve,["tbody"]),delete Oi.tbody),b.TRUSTED_TYPES_POLICY){if(typeof b.TRUSTED_TYPES_POLICY.createHTML!="function")throw is('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof b.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw is('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');let Y=ne;ne=b.TRUSTED_TYPES_POLICY;try{se=M("")}catch(ie){throw ne=Y,ie}}else b.TRUSTED_TYPES_POLICY===null?(ne=void 0,se=""):(ne===void 0&&(ne=G()),ne&&typeof se=="string"&&(se=M("")));mt&&mt(b),Mi=b},wl=Ae({},[...vg,...Qg,...w5]),Sl=Ae({},[...Pg,...S5]),yl=function(b,_,Y){return _.namespaceURI===br?b==="svg":_.namespaceURI===Os?b==="svg"&&(Y==="annotation-xml"||ko[Y]):!!wl[b]},wn=function(b,_,Y){return _.namespaceURI===br?b==="math":_.namespaceURI===ps?b==="math"&&To[Y]:!!Sl[b]},vl=function(b,_,Y){return _.namespaceURI===ps&&!To[Y]||_.namespaceURI===Os&&!ko[Y]?!1:!Sl[b]&&(nu[b]||!wl[b])},Li=function(b){let _=A(b);(!_||!_.tagName)&&(_={namespaceURI:zi,tagName:"template"});let Y=el(b.tagName),ie=el(_.tagName);return $o[b.namespaceURI]?b.namespaceURI===ps?yl(Y,_,ie):b.namespaceURI===Os?wn(Y,_,ie):b.namespaceURI===br?vl(Y,_,ie):!!(xn==="application/xhtml+xml"&&$o[b.namespaceURI]):!1},ii=function(b){Ha(e.removed,{element:b});try{A(b).removeChild(b)}catch(_){if(p(b),!A(b))throw is("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},Sn=function(b,_,Y){try{m(b,_)}catch(ie){try{b.removeAttribute(Y)}catch(he){}}},Yi=function(b){Wi(b);let _=v(b);if(_){let ie=[];ns(_,he=>{Ha(ie,he)}),ns(ie,he=>{try{p(he)}catch(pe){}})}let Y=U(b);if(Y)for(let ie=Y.length-1;ie>=0;--ie){let he=Y[ie],pe=he&&he.name;typeof pe=="string"&&Sn(b,he,pe)}},mi=function(b,_,Y){if(!Y)try{Y=_.getAttributeNode(b)}catch(ie){Y=null}Ha(e.removed,{attribute:Y||null,from:_});try{Y?m(_,Y):_.removeAttribute(b)}catch(ie){try{_.removeAttribute(b)}catch(he){}}if(b==="is")if(pi||Ei)try{ii(_)}catch(ie){}else try{_.setAttribute(b,"")}catch(ie){}},lu=function(b){let _=U(b);if(_)for(let Y=_.length-1;Y>=0;--Y){let ie=_[Y],he=ie&&ie.name;typeof he!="string"||je[Je(he)]||Sn(b,ie,he)}},Wi=function(b){let _=[b];for(;_.length>0;){let Y=_.pop();z(Y)===ur.element&&lu(Y);let he=v(Y);if(he)for(let pe=he.length-1;pe>=0;--pe)_.push(he[pe])}},Ql=function(b,_){return ti?b==="patchsrc"?!0:b==="for"&&_!=="label"&&_!=="output":!1},cu=function(b){if(!ti)return;let _=[b];for(;_.length>0;){let Y=_.pop(),ie=z(Y);if(ie===ur.processingInstruction||ie===ur.comment&&Ct(zP,Y.data)){try{p(Y)}catch(pe){}continue}if(ie===ur.element){let pe=Y,De=Je(q(Y));try{pe.hasAttribute&&pe.hasAttribute("patchsrc")&&pe.removeAttribute("patchsrc"),pe.hasAttribute&&pe.hasAttribute("for")&&Ql("for",De)&&pe.removeAttribute("for")}catch(et){}}let he=v(Y);if(he)for(let pe=he.length-1;pe>=0;--pe)_.push(he[pe])}},g=function(b){let _=null,Y=null;if(hs)b=""+b;else{let pe=kP(b,/^[\r\n\t ]+/);Y=pe&&pe[0]}xn==="application/xhtml+xml"&&zi===br&&(b=''+b+"");let ie=ne?M(b):b;if(zi===br)try{_=new d().parseFromString(ie,xn)}catch(pe){}if(!_||!_.documentElement){_=Se.createDocument(zi,"template",null);try{_.documentElement.innerHTML=Po?se:ie}catch(pe){}}let he=_.body||_.documentElement;return b&&Y&&he.insertBefore(t.createTextNode(Y),he.childNodes[0]||null),zi===br?At.call(_,ri?"html":"body")[0]:ri?_.documentElement:he},y=function(b){let _=C?C(b):b.ownerDocument;return Fe.call(_||b,b,l.SHOW_ELEMENT|l.SHOW_COMMENT|l.SHOW_TEXT|l.SHOW_PROCESSING_INSTRUCTION|l.SHOW_CDATA_SECTION,null)},x=function(b){return b=Ka(b,Ai," "),b=Ka(b,os," "),b=Ka(b,Jh," "),b},k=function(b){var _;b.normalize();let Y=C?C(b):b.ownerDocument,ie=Fe.call(Y||b,b,l.SHOW_TEXT|l.SHOW_COMMENT|l.SHOW_CDATA_SECTION|l.SHOW_PROCESSING_INSTRUCTION,null),he=ie.nextNode();for(;he;)he.data=x(he.data),he=ie.nextNode();let pe=(_=b.querySelectorAll)===null||_===void 0?void 0:_.call(b,"template");pe&&ns(pe,De=>{Q(De.content)&&k(De.content)})},X=function(b){let _=P?P(b):null;return typeof _!="string"||Je(_)!=="form"?!1:typeof b.nodeName!="string"||typeof b.textContent!="string"||typeof b.removeChild!="function"||b.attributes!==U(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!==v(b)},Q=function(b){if(!T||typeof b!="object"||b===null)return!1;try{return T(b)===ur.documentFragment}catch(_){return!1}},Z=function(b){if(!T||typeof b!="object"||b===null)return!1;try{return typeof T(b)=="number"}catch(_){return!1}};function L(I,b,_){I.length!==0&&ns(I,Y=>{Y.call(e,b,_,Mi)})}let D=function(b,_){return!!(ti&&b.hasChildNodes()&&!Z(b.firstElementChild)&&Ct(UP,b.textContent)&&Ct(UP,b.innerHTML)||ti&&b.namespaceURI===br&&A5[_]&&(Z(b.firstElementChild)||typeof b.textContent=="string"&&Ct(E5[_],b.textContent))||b.nodeType===ur.processingInstruction||ti&&b.nodeType===ur.comment&&Ct(zP,b.data))},j=function(b,_){if(b instanceof RegExp)return Ct(b,_);if(b instanceof Function){for(var Y=arguments.length,ie=new Array(Y>2?Y-2:0),he=2;he=0;--De){let et=b===Y?f(he[De],!0):he[De];ie.insertBefore(et,S(b))}}}return ii(b),!0},le=function(b,_,Y,ie){return b.length===0?_:_===Y||_===ie?fr(_):_},xe=function(b,_){return b===_||A(b)!==null?!1:(gr&&Wi(b),!0)},Ce=function(b,_){if(L(Re.beforeSanitizeElements,b,null),xe(b,_))return!0;if(X(b))return ii(b),!0;let Y=Je(q(b));if(Ve=le(Re.uponSanitizeElement,Ve,pr,gn),L(Re.uponSanitizeElement,b,{tagName:Y,allowedTags:Ve}),xe(b,_))return!0;if(D(b,Y))return ii(b),!0;if(Oi[Y]||!(mr.tagCheck instanceof Function&&mr.tagCheck(Y))&&!Ve[Y]){let he=N(b,Y,_);return he===!1&&L(Re.afterSanitizeElements,b,null),he}if(z(b)===ur.element&&!Li(b)||(Y==="noscript"||Y==="noembed"||Y==="noframes")&&Ct(R5,b.innerHTML))return ii(b),!0;if(Ur&&b.nodeType===ur.text){let he=x(b.textContent);b.textContent!==he&&(Ha(e.removed,{element:b.cloneNode()}),b.textContent=he)}return L(Re.afterSanitizeElements,b,null),!1},Ee=function(b,_,Y){if(ls[_]||Ql(_,b)||hl&&(_==="id"||_==="name")&&(Y in t||Y in au))return!1;let ie=je[_]||mr.attributeCheck instanceof Function&&mr.attributeCheck(_,b);return cs&&Ct(eu,_)||xo&&Ct(tu,_)?!0:ie?Ol[_]||Ct(dl,Ka(Y,cl,""))||(_==="src"||_==="xlink:href"||_==="href")&&b!=="script"&&TP(Y,"data:")===0&&ul[b]||wo&&!Ct(ru,Ka(Y,cl,""))?!0:!Y:Ge(b)&&j(Et.tagNameCheck,b)&&j(Et.attributeNameCheck,_,b)||_==="is"&&Et.allowCustomizedBuiltInElements&&j(Et.tagNameCheck,Y)},nt=Ae({},["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[el(b)]&&Ct(iu,b)},qt=function(b,_,Y,ie){if(ne&&typeof h=="object"&&typeof h.getAttributeType=="function"&&!Y)switch(h.getAttributeType(b,_)){case"TrustedHTML":return M(ie);case"TrustedScriptURL":return oe(ie)}return ie},yn=function(b,_,Y,ie){try{return Y?b.setAttributeNS(Y,_,ie):b.setAttribute(_,ie),X(b)?(ii(b),!1):!0}catch(he){return mi(_,b),!1}},ms=function(b){L(Re.beforeSanitizeAttributes,b,null);let _=b.attributes;if(!_||X(b))return;je=le(Re.uponSanitizeAttribute,je,as,bn);let Y={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:je,forceKeepAttr:void 0},ie=_.length,he=Je(b.nodeName);for(;ie--;){let pe=_[ie],De=pe.name,et=pe.namespaceURI,Ft=pe.value,Bt=Je(De),du=Ft,Zt=De==="value"?du:f5(du),qg=!1;if(Y.attrName=Bt,Y.attrValue=Zt,Y.keepAttr=!0,Y.forceKeepAttr=void 0,L(Re.uponSanitizeAttribute,b,Y),Zt=Y.attrValue,fs&&(Bt==="id"||Bt==="name")&&TP(Zt,yo)!==0&&(mi(De,b,pe),Zt=yo+Zt,qg=!0),ti&&Ct(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,Zt)){mi(De,b,pe);continue}if(Bt==="attributename"&&kP(Zt,"href")){mi(De,b,pe);continue}if(!Y.forceKeepAttr){if(!Y.keepAttr){mi(De,b,pe);continue}if(!So&&Ct(C5,Zt)){mi(De,b,pe);continue}if(Ur&&(Zt=x(Zt)),!Ee(he,Bt,Zt)){mi(De,b,pe);continue}Zt=qt(he,Bt,et,Zt),Zt!==du&&yn(b,De,et,Zt)&&qg&&$P(e.removed)}}L(Re.afterSanitizeAttributes,b,null)},gs=function(b){let _=null,Y=y(b);for(L(Re.beforeSanitizeShadowDOM,b,null);_=Y.nextNode();)if(L(Re.uponSanitizeShadowNode,_,null),Ce(_,b),ms(_),Q(_.content)&&gs(_.content),z(_)===ur.element){let ie=R(_);Q(ie)&&(vn(ie),gs(ie))}L(Re.afterSanitizeShadowDOM,b,null)},vn=function(b){let _=[{node:b,shadow:null}];for(;_.length>0;){let Y=_.pop();if(Y.shadow){gs(Y.shadow);continue}let ie=Y.node,pe=z(ie)===ur.element,De=v(ie);if(De)for(let et=De.length-1;et>=0;--et)_.push({node:De[et],shadow:null});if(pe){let et=P?P(ie):null;if(typeof et=="string"&&Je(et)==="template"){let Ft=ie.content;Q(Ft)&&_.push({node:Ft,shadow:null})}}if(pe){let et=R(ie);Q(et)&&_.push({node:null,shadow:et},{node:et,shadow:null})}}};return e.sanitize=function(I){let b=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},_=null,Y=null,ie=null,he=null;if(Po=!I,Po&&(I=""),typeof I!="string"&&!Z(I)&&(I=b5(I),typeof I!="string"))throw is("dirty is not a string, aborting");if(!e.isSupported)return I;ds?(Ve=gn,je=bn):Xo(b),(Re.uponSanitizeElement.length>0||Re.uponSanitizeAttribute.length>0)&&(Ve=fr(Ve)),Re.uponSanitizeAttribute.length>0&&(je=fr(je)),e.removed=[];let pe=gr&&typeof I!="string"&&Z(I);if(pe){cu(I);let Ft=q(I);if(typeof Ft=="string"){let Bt=Je(Ft);if(!Ve[Bt]||Oi[Bt])throw Yi(I),is("root node is forbidden and cannot be sanitized in-place")}if(X(I))throw Yi(I),is("root node is clobbered and cannot be sanitized in-place");try{vn(I)}catch(Bt){throw Yi(I),Bt}}else if(Z(I))_=g(""),Y=_.ownerDocument.importNode(I,!0),Y.nodeType===ur.element&&Y.nodeName==="BODY"||Y.nodeName==="HTML"?_=Y:_.appendChild(Y),vn(_);else{if(!pi&&!Ur&&!ri&&I.indexOf("<")===-1)return ne&&us?M(I):I;if(_=g(I),!_)return pi?null:us?se:""}_&&hs&&ii(_.firstChild);let De=pe?I:_;try{let Ft=y(De);for(;ie=Ft.nextNode();)Ce(ie,De),ms(ie),Q(ie.content)&&gs(ie.content)}catch(Ft){throw pe&&(Yi(I),ns(e.removed,Bt=>{Bt.element&&Wi(Bt.element)})),Ft}if(pe)return ns(e.removed,Ft=>{Ft.element&&Wi(Ft.element)}),Ur&&k(I),I;if(pi){if(Ur&&k(_),Ei)for(he=Ne.call(_.ownerDocument);_.firstChild;)he.appendChild(_.firstChild);else he=_;return(je.shadowroot||je.shadowrootmode)&&(he=Zr.call(i,he,!0)),he}let et=ri?_.outerHTML:_.innerHTML;return ri&&Ve["!doctype"]&&_.ownerDocument&&_.ownerDocument.doctype&&_.ownerDocument.doctype.name&&Ct(X5,_.ownerDocument.doctype.name)&&(et=" -`+et),Ur&&(et=x(et)),ne&&us?M(et):et},e.setConfig=function(){let I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Xo(I),ds=!0,gn=Ve,bn=je},e.clearConfig=function(){Mi=null,ds=!1,gn=null,bn=null,ne=te,se=""},e.isValidAttribute=function(I,b,_){Mi||Xo({});let Y=Je(I),ie=Je(b);return Ee(Y,ie,_)},e.addHook=function(I,b){typeof b=="function"&&ir(Re,I)&&Ha(Re[I],b)},e.removeHook=function(I,b){if(ir(Re,I)){if(b!==void 0){let _=h5(Re[I],b);return _===-1?void 0:u5(Re[I],_,1)[0]}return $P(Re[I])}},e.removeHooks=function(I){ir(Re,I)&&(Re[I]=[])},e.removeAllHooks=function(){Re=MP()},e}var z5=VP();jP.exports=z5});var Mg=hu(yu());var Me=[/^\s*[.#%]?(include|incbin|embed)\s+"(.+?)"/gmi,/^\s*([;']|[/][/])#(resource)\s+"(.+?)"/gm],Ie=[/^\s*([;]|[/][/])#link\s+"(.+?)"/gm],Eo=[/^\s*(`include|[.]include)\s+"(.+?)"/gmi,/^\s*\$(include|\$dofile|\$write_image_in_table)\('(.+?)'/gmi,{re:/^\s*([.]arch)\s+(\w+)/gmi,suffix:".json"},/\$readmem[bh]\("(.+?)"/gmi],U$=[{re:/^\s*[.#%]?\s*include\s+<(.+?)>/gmi,system:!0}];function cb(r){let e=r&&Nt(r);return e&&e.includeDirs&&e.includeDirs.length?U$:[]}var ab=[/^\s+(USE|ASM)\s+(\S+[.]\S+)/gm],z$=[/^[!]src\s+"(.+?)"/gmi],M$=[{re:/^\s*import\s*"(.+?)";/gmi,suffix:".wiz"},/^\s*embed\s*"(.+?)";/gmi],L$=[/^\s*(import)\s*"(.+?)"/gmi],Y$=[/^\s*%%\s*#include\s+"(.+?)"/gm],lb={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"}},ys={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:Me,linkPatterns:Ie},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:[...Me,...z$],linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:[...Me,...ab],linkPatterns:Ie},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:lb,includePatterns:Me,linkPatterns:Ie},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:lb,includePatterns:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},sdasgb:{id:"sdasgb",name:"sdasgb",kind:"assembler",arch:"gbz80",extensions:[".sgb"],includeDirs:["/include"],editorStyle:"z80",wasmModule:"sdasgb",platforms:{default:{preloadFS:"sdcc"}},includePatterns:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},jsasm:{id:"jsasm",name:"JSASM",kind:"assembler",extensions:[".asm"],editorStyle:"z80",includePatterns:Eo,linkPatterns:[]},xasm6809:{id:"xasm6809",name:"XASM6809",kind:"assembler",arch:"6809",extensions:[".xasm"],editorStyle:"6809",wasmModule:"xasm6809",includePatterns:[...Me,...ab],linkPatterns:Ie},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:Me,linkPatterns:Ie},lwasm:{id:"lwasm",name:"LWASM",kind:"assembler",arch:"6809",extensions:[".lwasm"],wasmModule:"lwasm",version:"4.17",includePatterns:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},armips:{id:"armips",name:"armips",kind:"assembler",arch:"arm32",extensions:[".armips"],editorStyle:"vasm",wasmModule:"armips",version:"0.11.0",includePatterns:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:Me,linkPatterns:Ie},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:M$},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:[...Me,...L$]},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:Y$},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:Eo,linkPatterns:[]},yosys:{id:"yosys",name:"Yosys",kind:"hdl",arch:"verilog",extensions:[],wasmModule:"yosys",includePatterns:Eo,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:Eo,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:Me,linkPatterns:Ie,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 Nt(r){return ys[r.replace(/^remote:/,"")]}function db(r){let e=[];for(let t in ys){let i=ys[t];for(let n of i.extensions)if(n&&r.endsWith(n)){e.push({meta:i,len:n.length});break}}return e.sort((t,i)=>i.len-t.len).map(t=>t.meta)}function W$(r,e){let t=Nt(r);if(t&&t.platforms){if(e){let n=t.platforms[e];if(n&&n.preloadFS)return n.preloadFS;let s=zr(e);if(s&&s!==e){let o=t.platforms[s];if(o&&o.preloadFS)return o.preloadFS}}let i=t.platforms.default;if(i&&i.preloadFS)return i.preloadFS}}function vu(r){let e=Nt(r);return e&&e.skeleton?e.skeleton:r.replace(/^remote:/,"")}function El(r,e){let t=r&&Nt(r);return t&&t.includePatterns?t.includePatterns:e&&e.startsWith("verilog")?Eo:Me}function Zl(r,e){let t=r&&Nt(r);return t&&t.linkPatterns?t.linkPatterns:e&&e.startsWith("verilog")?[]:Ie}function Ul(r,e){e=e&&zr(e);let t=r&&Nt(r),i=t&&t.includeDirs||[];return i=i.map(n=>n.replace("$platform",e)),i}function zl(r,e){var t=W$(r,e);if(t)return t;let i=r&&Nt(r);return i&&i.wasiFSZip?"wasi:"+i.wasiFSZip:void 0}function Qu(r,e){let t=[];for(let i of e||[]){let n=i instanceof RegExp?{re:i}:i,s;for(n.re.lastIndex=0;s=n.re.exec(r);){let o=s[n.group!=null?n.group:s.length-1];o&&t.push(n.suffix?o+n.suffix:o)}}return t}var Lr={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}};Lr["sms-sms-libcv"]=Qn(tt({},Lr["sms-sg1000-libcv"]),{extra_preproc_args:["-I",".","-D","CV_SMS","-D","CV_MODE4"]});Lr["sms-gg-libcv"]=Lr["sms-sms-libcv"];Lr["gb.color"]=Qn(tt({},Lr.gb),{extra_link_args:Lr.gb.extra_link_args.map(r=>r==="GB_CGB_FLAGS=0x0"?"GB_CGB_FLAGS=0x80":r)});var V$=10,j$=1e4,hb="/error.php",D$=2e3,ub=0,fb="",Ob=0;function Vi(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(i){return""}}function pb(r,e,t){try{if(ub>=V$)return;var i=Date.now();if(r===fb&&i-Ob