8bitworkshop/gen/chunk-S56QHLVT.js

12 lines
15 KiB
JavaScript

import{c as ae,k as he,n as ne,q as le}from"./chunk-ULPRULB6.js";import{X as ie,a as I,g as w,u as c}from"./chunk-RXF2JDJ3.js";var b;(function(a){a[a.GRAPHICS=0]="GRAPHICS",a[a.TEXT=1]="TEXT",a[a.BITMAP=2]="BITMAP",a[a.MULTICOLOR=3]="MULTICOLOR",a[a.MODE4=4]="MODE4",a[a.BITMAP_TEXT=5]="BITMAP_TEXT",a[a.BITMAP_MULTICOLOR=6]="BITMAP_MULTICOLOR",a[a.ILLEGAL=7]="ILLEGAL"})(b||(b={}));var O=class{constructor(e,t,r){this.probe=new ne;this.ram=new Uint8Array(16384);this.registers=new Uint8Array(8);this.spriteBuffer=new Uint8Array(256);this.displayOn=!1;this.interruptsOn=!1;this.fb32=e,this.cru=t,this.enableFlicker=r,this.palette=[c(0,0,0),c(0,0,0),c(33,200,66),c(94,220,120),c(84,85,237),c(125,118,252),c(212,82,77),c(66,235,245),c(252,85,84),c(255,121,120),c(212,193,84),c(230,206,128),c(33,176,59),c(201,91,186),c(204,204,204),c(255,255,255)]}reset(){var e;this.ram.fill(0),this.registers.fill(0),this.addressRegister=0,this.statusRegister=0,this.prefetchByte=0,this.latch=!1,this.displayOn=!1,this.interruptsOn=!1,this.screenMode=0,this.bitmapMode=!1,this.textMode=!1,this.colorTable=0,this.nameTable=0,this.charPatternTable=0,this.spriteAttributeTable=0,this.spritePatternTable=0,this.colorTableMask=16383,this.patternTableMask=16383,this.ramMask=16383,this.fgColor=0,this.bgColor=0,this.flicker=this.enableFlicker,this.redrawRequired=!0,this.width=304,this.height=240}drawScanline(e){var t=this.fb32,r=this.width,i=e*r,h=this.screenMode,s=this.textMode,l=this.bitmapMode,a=s?240:256,n=192,d=r-a>>1,m=this.height-n>>1,M=this.fgColor,g=this.bgColor,o=this.ram,P=this.nameTable,V=this.colorTable,C=this.charPatternTable,D=this.colorTableMask,H=this.patternTableMask,ce=this.spriteAttributeTable,ue=this.spritePatternTable,Z=(this.registers[1]&2)!=0,y=this.registers[1]&1,$=(Z?16:8)<<(y?1:0),j=this.flicker?4:32,J=this.palette,N=!1,Q=!1,Y=31,R,v,_,f,F,B,p;if(e>=m&&e<m+n&&this.displayOn){var u=e-m;if(!s){var W=this.spriteBuffer;W.fill(0);var z=0,ee=!1,A=ce,U;for(U=0;U<32&&z<=j&&!ee;U++){var k=o[A];if(k!==208){k>208&&(k-=256),k++;var X=k+$,L=-1;if(U<8||!l)u>=k&&u<X&&(L=u);else{var K=u&((this.registers[4]&3)<<6|63);K>=k&&K<X?L=K:u>=64&&u<128&&u>=k&&u<X&&(L=u)}if(L!==-1){if(z<j){var te=o[A+1],de=o[A+2]&(Z?252:255),me=o[A+3]&15;(o[A+3]&128)!=0&&(te-=32);for(var ge=L-k>>y,pe=ue+(de<<3)+ge,E=0;E<$;E++){var G=te+E;if(G>=0&&G<a){var re=E>>y,Te=o[pe+(re>=8?16:0)];(Te&128>>(re&7))!=0&&(W[G]===0?W[G]=me+1:N=!0)}}}z++}A+=4}else ee=!0}z>4&&(Q=!0,Y=U)}var S=s?(u>>3)*40:u>>3<<5,x=u&7;for(R=0;R<r;R++){if(R>=d&&R<d+a){var T=R-d;switch(h){case 0:f=o[P+S+(T>>3)],B=o[V+(f>>3)],p=o[C+(f<<3)+x],v=(p&128>>(T&7))!=0?(B&240)>>4:B&15;break;case 2:f=o[P+S+(T>>3)],F=((u&192)<<5)+(f<<3),B=o[V+(F&D)+x],p=o[C+(F&H)+x],v=(p&128>>(T&7))!=0?(B&240)>>4:B&15;break;case 3:f=o[P+S+(T>>3)],x=(u&28)>>2,p=o[C+(f<<3)+x],v=(T&4)==0?(p&240)>>4:p&15;break;case 1:f=o[P+S+Math.floor(T/6)],p=o[C+(f<<3)+x],v=(p&128>>T%6)!=0?M:g;break;case 5:f=o[P+S+Math.floor(T/6)],F=((u&192)<<5)+(f<<3),p=o[C+(F&H)+x],v=(p&128>>T%6)!=0?M:g;break;case 6:f=o[P+S+(T>>3)],x=(u&28)>>2,F=((u&192)<<5)+(f<<3),p=o[C+(F&H)+x],v=(T&4)==0?(p&240)>>4:p&15;break;case 7:v=(T&4)==0?M:g;break}if(v===0&&(v=g),!s){var se=W[T]-1;se>0&&(v=se)}}else v=g;_=J[v],t[i++]=_}}else for(_=J[g],R=0;R<r;R++)t[i++]=_;e===m+n&&(this.statusRegister|=128,this.interruptsOn&&this.cru.setVDPInterrupt(!0)),N&&(this.statusRegister|=32),(this.statusRegister&64)==0&&(this.statusRegister|=Y),Q&&(this.statusRegister|=64)}setReadAddress(e){this.addressRegister=(e&63)<<8|this.addressRegister&255,this.prefetchByte=this.ram[this.addressRegister++],this.addressRegister&=16383}setWriteAddress(e){this.addressRegister=(e&63)<<8|this.addressRegister&255}setVDPWriteRegister(e){var t=this.registers.length-1;switch(this.registers[e&t]=this.addressRegister&255,e&t){case 0:this.updateMode(this.registers[0],this.registers[1]);break;case 1:this.ramMask=(this.registers[1]&128)!=0?16383:8191,this.displayOn=(this.registers[1]&64)!=0,this.interruptsOn=(this.registers[1]&32)!=0,this.updateMode(this.registers[0],this.registers[1]);break;case 2:this.nameTable=(this.registers[2]&15)<<10;break;case 3:this.bitmapMode?this.colorTable=(this.registers[3]&128)<<6:this.colorTable=this.registers[3]<<6,this.updateTableMasks();break;case 4:this.bitmapMode?this.charPatternTable=(this.registers[4]&4)<<11:this.charPatternTable=(this.registers[4]&7)<<11,this.updateTableMasks();break;case 5:this.spriteAttributeTable=(this.registers[5]&127)<<7;break;case 6:this.spritePatternTable=(this.registers[6]&7)<<11;break;case 7:this.fgColor=(this.registers[7]&240)>>4,this.bgColor=this.registers[7]&15;break}}setVDPWriteCommand3(e){this.setVDPWriteRegister(e)}writeAddress(e){if(!this.latch)this.addressRegister=this.addressRegister&65280|e;else{switch((e&192)>>6){case 0:this.setReadAddress(e);break;case 1:this.setWriteAddress(e);break;case 2:this.setVDPWriteRegister(e);break;case 3:this.setVDPWriteCommand3(e);break}this.redrawRequired=!0}this.latch=!this.latch}updateMode(e,t){if(this.bitmapMode=(e&2)!=0,this.textMode=(t&16)!=0,this.bitmapMode)switch((t&24)>>3){case 0:this.screenMode=2;break;case 1:this.screenMode=6;break;case 2:this.screenMode=5;break;case 3:this.screenMode=7;break}else switch((t&24)>>3){case 0:this.screenMode=0;break;case 1:this.screenMode=3;break;case 2:this.screenMode=1;break;case 3:this.screenMode=7;break}this.bitmapMode?(this.colorTable=(this.registers[3]&128)<<6,this.charPatternTable=(this.registers[4]&4)<<11,this.updateTableMasks()):(this.colorTable=this.registers[3]<<6,this.charPatternTable=(this.registers[4]&7)<<11),this.nameTable=(this.registers[2]&15)<<10,this.spriteAttributeTable=(this.registers[5]&127)<<7,this.spritePatternTable=(this.registers[6]&7)<<11}updateTableMasks(){this.screenMode===2?(this.colorTableMask=(this.registers[3]&127)<<6|63,this.patternTableMask=(this.registers[4]&3)<<11|this.colorTableMask&2047):this.screenMode===5||this.screenMode===6?(this.colorTableMask=this.ramMask,this.patternTableMask=(this.registers[4]&3)<<11|2047):(this.colorTableMask=this.ramMask,this.patternTableMask=this.ramMask)}writeData(e){this.probe.logVRAMWrite(this.addressRegister,e),this.ram[this.addressRegister++]=e,this.prefetchByte=e,this.addressRegister&=this.ramMask,this.latch=!1,this.redrawRequired=!0}readStatus(){var e=this.statusRegister;return this.statusRegister=31,this.interruptsOn&&this.cru.setVDPInterrupt(!1),this.latch=!1,e}readData(){var e=this.prefetchByte;return this.prefetchByte=this.ram[this.addressRegister++],this.probe.logVRAMRead(this.addressRegister-1,this.prefetchByte),this.addressRegister&=this.ramMask,this.latch=!1,e}getRAM(){return this.ram}colorTableSize(){return this.screenMode===0?32:this.screenMode===2?Math.min(this.colorTableMask+1,6144):0}patternTableSize(){return this.bitmapMode?Math.min(this.patternTableMask+1,6144):2048}getDebugTables(){var e=[["Pattern Table",this.charPatternTable,this.patternTableSize()],["Name Table",this.nameTable,768],["Color Table",this.colorTable,this.colorTableSize()],["Sprite Patterns",this.spritePatternTable,64*32],["Sprite Attributes",this.spriteAttributeTable,4*32]];return e}getRegsString(){let e=20;for(var t="Registers:",r=0;r<this.registers.length;r++)t+=" "+w(this.registers[r],2);t+=`
`;var i=this.getDebugTables();for(var h of i)h[2]>0&&(t+=I(h[0],e)+": $"+w(h[1],4)+" - $"+w(h[1]+h[2]-1,4)+`
`);return t+=I("Address Register",e)+": $"+w(this.addressRegister,4)+`
`,t+=I("Status Register",e)+": $"+w(this.statusRegister,2)+`
`,t+=I("Screen Mode",e)+": "+this.screenMode+`
`,t+=I("Display On",e)+": "+this.displayOn+`
`,this.ramMask!=16383&&(t+=I("RAM Mask",e)+": $"+w(this.ramMask)+`
`),t}hexView(e,t,r){for(var i="",h=null,s=e,l=0,a=0;a<t&&s<16384;s++,a++){(a&15)==0&&(i+=`
`+w(s,4)+":",l++),i+=" ",r&&r===s&&(h=l);var n=this.ram[s].toString(16).toUpperCase();n.length===1&&(i+="0"),i+=n}return{text:i.substr(1),lineCount:l,anchorLine:h-1}}getWord(e){return e<16384?this.ram[e]<<8|this.ram[e+1]:0}getCharAt(e,t){return e-=24,t-=24,this.textMode?this.ram[this.nameTable+Math.floor((e-8)/6)+Math.floor(t/8)*40]:this.ram[this.nameTable+Math.floor(e/8)+Math.floor(t/8)*32]}setFlicker(e){this.flicker=e,this.enableFlicker=e}getState(){return{ram:this.ram.slice(0),registers:this.registers.slice(0),addressRegister:this.addressRegister,statusRegister:this.statusRegister,latch:this.latch,prefetchByte:this.prefetchByte,displayOn:this.displayOn,interruptsOn:this.interruptsOn,screenMode:this.screenMode,bitmapMode:this.bitmapMode,textMode:this.textMode,colorTable:this.colorTable,nameTable:this.nameTable,charPatternTable:this.charPatternTable,spriteAttributeTable:this.spriteAttributeTable,spritePatternTable:this.spritePatternTable,colorTableMask:this.colorTableMask,patternTableMask:this.patternTableMask,ramMask:this.ramMask,fgColor:this.fgColor,bgColor:this.bgColor,flicker:this.flicker}}restoreState(e){this.ram.set(e.ram),this.registers.set(e.registers),this.addressRegister=e.addressRegister,this.statusRegister=e.statusRegister,this.latch=e.latch,this.prefetchByte=e.prefetchByte,this.displayOn=e.displayOn,this.interruptsOn=e.interruptsOn,this.screenMode=e.screenMode,this.bitmapMode=e.bitmapMode,this.textMode=e.textMode,this.colorTable=e.colorTable,this.nameTable=e.nameTable,this.charPatternTable=e.charPatternTable,this.spriteAttributeTable=e.spriteAttributeTable,this.spritePatternTable=e.spritePatternTable,this.colorTableMask=e.colorTableMask,this.patternTableMask=e.patternTableMask,this.ramMask=e.ramMask,this.fgColor=e.fgColor,this.bgColor=e.bgColor,this.flicker=e.flicker,this.redrawRequired=!0}},be=class extends O{constructor(){super(...arguments);this.cram=new Uint8Array(32);this.cpalette=new Uint32Array(32);this.registers=new Uint8Array(16);this.vramUntwiddled=new Uint8Array(32768);this.numVisibleLines=192;this.lineCounter=0;this.lineInterruptPending=!1}reset(){super.reset(),this.writeToCRAM=!1,this.cram.fill(0),this.cpalette.fill(0),this.vramUntwiddled.fill(0)}readStatus(){return this.lineInterruptPending=!1,super.readStatus()}updateMode(e,t){e&4?(this.screenMode=4,this.nameTable=(this.registers[2]&15)<<10&14336,this.spriteAttributeTable=(this.registers[5]&126)<<7):super.updateMode(e,t)}setReadAddress(e){super.setReadAddress(e),this.writeToCRAM=!1}setWriteAddress(e){super.setWriteAddress(e),this.writeToCRAM=!1}setVDPWriteRegister(e){super.setVDPWriteRegister(e),this.ramMask=16383}setVDPWriteCommand3(e){this.writeToCRAM=!0}writeData(e){if(this.writeToCRAM){var t=this.addressRegister++&this.cram.length-1;this.cram[t]=e,this.cpalette[t]=c((e&3)*85,(e>>2&3)*85,(e>>4&3)*85),this.prefetchByte=e,this.addressRegister&=this.ramMask,this.redrawRequired=!0}else{var r=this.addressRegister;super.writeData(e),this.writeTwiddled(r,e)}this.latch=!1}writeTwiddled(e,t){for(var r=e&16380,i=r*2,h=this.ram[r],s=this.ram[r+1],l=this.ram[r+2],a=this.ram[r+3],n=0;n<8;++n){var d=7-n,m=h>>>d&1|(s>>>d&1)<<1|(l>>>d&1)<<2|(a>>>d&1)<<3;this.vramUntwiddled[i+n]=m}}getState(){var e=super.getState();return e.cram=this.cram.slice(0),e}restoreState(e){super.restoreState(e),this.cram.set(e.cram)}drawScanline(e){this.screenMode==4?this.rasterize_line(e):super.drawScanline(e)}findSprites(e){var t=this.spriteAttributeTable,r=[],i=8,h;for(this.registers[1]&2&&(i=16),h=0;h<64;h++){var s=this.ram[t+h];if(s===208)break;if(s>=240&&(s-=256),e>=s&&e<s+i){if(r.length===8){this.statusRegister|=64;break}r.push([this.ram[t+128+h*2],this.ram[t+128+h*2+1],s])}}return r}rasterize_background(e,t,r,i,h){e=e|0,t=t|0,r=r|0,i=(i|0)*2;var s,l;r&1<<9?(l=-1,i+=7):l=1;let a=r&1<<11?16:0;var n;if(h&&a===0)for(s=0;s<8;s++)n=this.vramUntwiddled[i],i+=l,n!==0&&(this.fb32[e+t]=this.cpalette[n]),t=t+1&255;else for(s=0;s<8;s++)n=this.vramUntwiddled[i]+a,i+=l,this.fb32[e+t]=this.cpalette[n],t=t+1&255}clear_background(e,t){e=e|0,t=t|0;var r;let i=this.cpalette[0];for(r=0;r<8;++r)this.fb32[e+t]=i,t=t+1&255}rasterize_background_line(e,t,r,i){e=e|0,t=t|0,r=r|0;let h=(i|0)*4;for(var s=0;s<32;s++){var l=this.ram[r+s*2]|this.ram[r+s*2+1]<<8,a=l&511,n=32*a;l&1<<10?n+=28-h:n+=h,(l&1<<12)==0?this.rasterize_background(e,t,l,n,!1):this.clear_background(e,t),t=t+8&255}}rasterize_foreground_line(e,t,r,i){e=e|0,t=t|0,r=r|0;let h=(i|0)*4;for(var s=0;s<32;s++){var l=this.ram[r+s*2]|this.ram[r+s*2+1]<<8;if((l&1<<12)!=0){var a=l&511,n=32*a;l&1<<10?n+=28-h:n+=h,this.rasterize_background(e,s*8+t&255,l,n,!0)}}}rasterize_sprites(e,t,r,i){t=t|0,r=r|0;let h=this.registers[6]&4?8192:0;for(var s=0;s<256;++s){for(var l=s,a=!1,n=!1,d=256,m=0;m<i.length;m++){var M=i[m],g=l-M[0];if(g<0){var o=-g;o<d&&(d=o);continue}if(!(g>=8)){a=!0;var P=e-M[2],V=h+M[1]*32+P*4,C=V*2+g,D=this.vramUntwiddled[C];if(D!==0){if(n){this.statusRegister|=32;break}this.fb32[t+(r+s-this.registers[8]&255)]=this.cpalette[16+D],n=!0}}}!a&&d>1&&(s+=d-1)}}border_clear(e,t){e=e|0,t=t|0;let r=16+(this.registers[7]&15),i=this.cpalette[r];this.fb32.fill(i,e,e+t)}rasterize_line(e){e|=0;var t=this.registers,r=256,i=this.numVisibleLines,h=this.width-r>>1,s=this.height-i>>1;let l=(e+s)*this.width|0,a=l+h|0;if(!this.displayOn||e<0||e>=i)e<this.height?this.border_clear(l,this.width):e>=262-s&&this.border_clear((e-262+s)*this.width,this.width);else{var n=e+t[9];n>=224&&(n-=224);let d=this.findSprites(e),m=t[0]&64&&e<16?0:t[8],M=this.nameTable+(n>>>3)*64,g=n&7;this.rasterize_background_line(a,m,M,g),this.rasterize_sprites(e,a,m,d),this.rasterize_foreground_line(a,m,M,g),this.border_clear(l,h),this.border_clear(a+256,h),t[0]&1<<5&&this.border_clear(a,8)}e==i&&(this.statusRegister|=128,this.interruptsOn&&this.cru.setVDPInterrupt(!0)),e<=i?this.lineCounter>0?this.lineCounter--:(this.lineCounter=this.registers[10],this.lineInterruptPending=!0):this.lineCounter=this.registers[10],this.lineInterruptPending&&this.registers[0]&16}getDebugTables(){if(this.screenMode==4){var e=[["Pattern Table",0,512*32],["Name Table",this.nameTable,32*32*2],["Sprite Attributes",this.spriteAttributeTable,256]];return e}else return super.getDebugTables()}},fe=class extends be{constructor(){super(...arguments);this.cram=new Uint8Array(64);this.cram_latch=0}writeData(e){if(this.writeToCRAM){if(this.addressRegister&1){let t=this.cram_latch+(e<<8),r=c((t&15)*17,(t>>4&15)*17,(t>>8&15)*17),i=this.addressRegister&this.cram.length-1;this.cram[i-1]=this.cram_latch,this.cram[i]=e,this.cpalette[i>>1]=r,this.prefetchByte=e,this.addressRegister&=this.ramMask,this.redrawRequired=!0}else this.cram_latch=e;this.addressRegister++}else super.writeData(e);this.latch=!1}};var oe=2,ve=class extends le{constructor(){super(...arguments);this.cpuFrequency=3579545;this.canvasWidth=304;this.numTotalScanlines=262;this.numVisibleScanlines=240;this.cpuCyclesPerLine=this.cpuFrequency/(262*60);this.sampleRate=262*60*oe;this.overscan=!0;this.cpu=new ae}getKeyboardFunction(){return null}init(e,t,r){this.connectCPUMemoryBus(e),this.connectCPUIOBus(t),this.handler=ie(this.inputs,this.getKeyboardMap(),this.getKeyboardFunction()),this.psg=r,this.audioadapter=r&&new he(r.psg,oe,this.sampleRate)}connectVideo(e){super.connectVideo(e);var t={setVDPInterrupt:r=>{r&&this.vdpInterrupt()}};this.vdp=this.newVDP(this.pixels,t,!0)}connectProbe(e){super.connectProbe(e),this.vdp.probe=e||this.nullProbe}newVDP(e,t,r){return new O(e,t,r)}startScanline(){this.audio&&this.audioadapter&&this.audioadapter.generate(this.audio)}drawScanline(){this.vdp.drawScanline(this.scanline)}loadState(e){super.loadState(e),this.vdp.restoreState(e.vdp)}saveState(){var e=super.saveState();return e.vdp=this.vdp.getState(),e}reset(){super.reset(),this.vdp.reset(),this.psg.reset()}getDebugCategories(){return["CPU","Stack","VDP"]}getDebugInfo(e,t){switch(e){case"VDP":return this.vdpStateToLongString(t.vdp)}}vdpStateToLongString(e){return this.vdp.getRegsString()}readVRAMAddress(e){return this.vdp.ram[e&16383]}};export{be as a,fe as b,ve as c};
//# sourceMappingURL=chunk-S56QHLVT.js.map