8bitworkshop/gen/chunk-S56QHLVT.js.map

8 lines
57 KiB
Plaintext

{
"version": 3,
"sources": ["../src/common/video/tms9918a.ts", "../src/machine/vdp_z80.ts"],
"sourcesContent": ["/*\n * js99'er - TI-99/4A emulator written in JavaScript\n *\n * Created 2014 by Rasmus Moustgaard <rasmus.moustgaard@gmail.com>\n *\n * TMS9918A VDP emulation.\n *\n * https://github.com/Rasmus-M/Js99er\n * GNU General Public License v2.0\n */\n\nimport { hex, lpad, RGBA } from \"../util\";\nimport { ProbeVRAM, NullProbe } from \"../devices\";\n\nenum TMS9918A_Mode {\n GRAPHICS = 0,\n TEXT = 1,\n BITMAP = 2,\n MULTICOLOR = 3,\n MODE4 = 4,\n BITMAP_TEXT = 5,\n BITMAP_MULTICOLOR = 6,\n ILLEGAL = 7,\n};\n\ninterface CPUInterface {\n setVDPInterrupt(b:boolean);\n}\n\nexport class TMS9918A {\n\n cru : { setVDPInterrupt: (b:boolean) => void };\n enableFlicker : boolean;\n probe : ProbeVRAM = new NullProbe();\n\n ram = new Uint8Array(16384); // VDP RAM\n registers = new Uint8Array(8);\n spriteBuffer = new Uint8Array(256);\n addressRegister : number;\n statusRegister : number;\n\n palette : number[];\n\n latch : boolean;\n prefetchByte : number;\n\n displayOn : boolean = false;\n interruptsOn : boolean = false;\n screenMode : number;\n bitmapMode : boolean;\n textMode : boolean;\n colorTable : number;\n nameTable : number;\n charPatternTable : number;\n spriteAttributeTable : number;\n spritePatternTable : number;\n colorTableMask : number;\n patternTableMask : number;\n ramMask : number;\n fgColor : number;\n bgColor : number;\n\n flicker : boolean;\n redrawRequired : boolean;\n\n fb32 : Uint32Array;\n\n width : number;\n height : number;\n\n constructor(fb32:Uint32Array, cru:CPUInterface, enableFlicker:boolean) {\n\n this.fb32 = fb32;\n this.cru = cru;\n this.enableFlicker = enableFlicker;\n\n this.palette = [\n RGBA(0, 0, 0),\n RGBA(0, 0, 0),\n RGBA(33, 200, 66),\n RGBA(94, 220, 120),\n RGBA(84, 85, 237),\n RGBA(125, 118, 252),\n RGBA(212, 82, 77),\n RGBA(66, 235, 245),\n RGBA(252, 85, 84),\n RGBA(255, 121, 120),\n RGBA(212, 193, 84),\n RGBA(230, 206, 128),\n RGBA(33, 176, 59),\n RGBA(201, 91, 186),\n RGBA(204, 204, 204),\n RGBA(255, 255, 255)\n ];\n }\n\n reset() {\n\n var i;\n this.ram.fill(0);\n this.registers.fill(0);\n \n this.addressRegister = 0;\n this.statusRegister = 0;\n\n this.prefetchByte = 0;\n this.latch = false;\n\n this.displayOn = false;\n this.interruptsOn = false;\n this.screenMode = TMS9918A_Mode.GRAPHICS;\n this.bitmapMode = false;\n this.textMode = false;\n this.colorTable = 0;\n this.nameTable = 0;\n this.charPatternTable = 0;\n this.spriteAttributeTable = 0;\n this.spritePatternTable = 0;\n this.colorTableMask = 0x3FFF;\n this.patternTableMask = 0x3FFF;\n this.ramMask = 0x3FFF;\n this.fgColor = 0;\n this.bgColor = 0;\n\n this.flicker = this.enableFlicker;\n this.redrawRequired = true;\n\n this.width = 304;\n this.height = 240;\n }\n\n drawScanline(y:number) {\n var imageData = this.fb32,\n width = this.width,\n imageDataAddr = (y * width),\n screenMode = this.screenMode,\n textMode = this.textMode,\n bitmapMode = this.bitmapMode,\n drawWidth = !textMode ? 256 : 240,\n drawHeight = 192,\n hBorder = (width - drawWidth) >> 1,\n vBorder = (this.height - drawHeight) >> 1,\n fgColor = this.fgColor,\n bgColor = this.bgColor,\n ram = this.ram,\n nameTable = this.nameTable,\n colorTable = this.colorTable,\n charPatternTable = this.charPatternTable,\n colorTableMask = this.colorTableMask,\n patternTableMask = this.patternTableMask,\n spriteAttributeTable = this.spriteAttributeTable,\n spritePatternTable = this.spritePatternTable,\n spriteSize = (this.registers[1] & 0x2) !== 0,\n spriteMagnify = this.registers[1] & 0x1,\n spriteDimension = (spriteSize ? 16 : 8) << (spriteMagnify ? 1 : 0),\n maxSpritesOnLine = this.flicker ? 4 : 32,\n palette = this.palette,\n collision = false, fifthSprite = false, fifthSpriteIndex = 31,\n x, color, rgbColor, name, tableOffset, colorByte, patternByte;\n if (y >= vBorder && y < vBorder + drawHeight && this.displayOn) {\n var y1 = y - vBorder;\n // Pre-process sprites\n if (!textMode) {\n var spriteBuffer = this.spriteBuffer;\n spriteBuffer.fill(0);\n var spritesOnLine = 0;\n var endMarkerFound = false;\n var spriteAttributeAddr = spriteAttributeTable;\n var s;\n for (s = 0; s < 32 && spritesOnLine <= maxSpritesOnLine && !endMarkerFound; s++) {\n var sy = ram[spriteAttributeAddr];\n if (sy !== 0xD0) {\n if (sy > 0xD0) {\n sy -= 256;\n }\n sy++;\n var sy1 = sy + spriteDimension;\n var y2 = -1;\n if (s < 8 || !bitmapMode) {\n if (y1 >= sy && y1 < sy1) {\n y2 = y1;\n }\n }\n else {\n // Emulate sprite duplication bug\n var yMasked = y1 & (((this.registers[4] & 0x03) << 6) | 0x3F);\n if (yMasked >= sy && yMasked < sy1) {\n y2 = yMasked;\n }\n else if (y1 >= 64 && y1 < 128 && y1 >= sy && y1 < sy1) {\n y2 = y1;\n }\n }\n if (y2 !== -1) {\n if (spritesOnLine < maxSpritesOnLine) {\n var sx = ram[spriteAttributeAddr + 1];\n var sPatternNo = ram[spriteAttributeAddr + 2] & (spriteSize ? 0xFC : 0xFF);\n var sColor = ram[spriteAttributeAddr + 3] & 0x0F;\n if ((ram[spriteAttributeAddr + 3] & 0x80) !== 0) {\n sx -= 32;\n }\n var sLine = (y2 - sy) >> spriteMagnify;\n var sPatternBase = spritePatternTable + (sPatternNo << 3) + sLine;\n for (var sx1 = 0; sx1 < spriteDimension; sx1++) {\n var sx2 = sx + sx1;\n if (sx2 >= 0 && sx2 < drawWidth) {\n var sx3 = sx1 >> spriteMagnify;\n var sPatternByte = ram[sPatternBase + (sx3 >= 8 ? 16 : 0)];\n if ((sPatternByte & (0x80 >> (sx3 & 0x07))) !== 0) {\n if (spriteBuffer[sx2] === 0) {\n spriteBuffer[sx2] = sColor + 1;\n }\n else {\n collision = true;\n }\n }\n }\n }\n }\n spritesOnLine++;\n }\n spriteAttributeAddr += 4;\n }\n else {\n endMarkerFound = true;\n }\n }\n if (spritesOnLine > 4) {\n fifthSprite = true;\n fifthSpriteIndex = s;\n }\n }\n // Draw\n var rowOffset = !textMode ? (y1 >> 3) << 5 : (y1 >> 3) * 40;\n var lineOffset = y1 & 7;\n for (x = 0; x < width; x++) {\n if (x >= hBorder && x < hBorder + drawWidth) {\n var x1 = x - hBorder;\n // Tiles\n switch (screenMode) {\n case TMS9918A_Mode.GRAPHICS:\n name = ram[nameTable + rowOffset + (x1 >> 3)];\n colorByte = ram[colorTable + (name >> 3)];\n patternByte = ram[charPatternTable + (name << 3) + lineOffset];\n color = (patternByte & (0x80 >> (x1 & 7))) !== 0 ? (colorByte & 0xF0) >> 4 : colorByte & 0x0F;\n break;\n case TMS9918A_Mode.BITMAP:\n name = ram[nameTable + rowOffset + (x1 >> 3)];\n tableOffset = ((y1 & 0xC0) << 5) + (name << 3);\n colorByte = ram[colorTable + (tableOffset & colorTableMask) + lineOffset];\n patternByte = ram[charPatternTable + (tableOffset & patternTableMask) + lineOffset];\n color = (patternByte & (0x80 >> (x1 & 7))) !== 0 ? (colorByte & 0xF0) >> 4 : colorByte & 0x0F;\n break;\n case TMS9918A_Mode.MULTICOLOR:\n name = ram[nameTable + rowOffset + (x1 >> 3)];\n lineOffset = (y1 & 0x1C) >> 2;\n patternByte = ram[charPatternTable + (name << 3) + lineOffset];\n color = (x1 & 4) === 0 ? (patternByte & 0xF0) >> 4 : patternByte & 0x0F;\n break;\n case TMS9918A_Mode.TEXT:\n name = ram[nameTable + rowOffset + Math.floor(x1 / 6)];\n patternByte = ram[charPatternTable + (name << 3) + lineOffset];\n color = (patternByte & (0x80 >> (x1 % 6))) !== 0 ? fgColor : bgColor;\n break;\n case TMS9918A_Mode.BITMAP_TEXT:\n name = ram[nameTable + rowOffset + Math.floor(x1 / 6)];\n tableOffset = ((y1 & 0xC0) << 5) + (name << 3);\n patternByte = ram[charPatternTable + (tableOffset & patternTableMask) + lineOffset];\n color = (patternByte & (0x80 >> (x1 % 6))) !== 0 ? fgColor : bgColor;\n break;\n case TMS9918A_Mode.BITMAP_MULTICOLOR:\n name = ram[nameTable + rowOffset + (x1 >> 3)];\n lineOffset = (y1 & 0x1C) >> 2;\n tableOffset = ((y1 & 0xC0) << 5) + (name << 3);\n patternByte = ram[charPatternTable + (tableOffset & patternTableMask) + lineOffset];\n color = (x1 & 4) === 0 ? (patternByte & 0xF0) >> 4 : patternByte & 0x0F;\n break;\n case TMS9918A_Mode.ILLEGAL:\n color = (x1 & 4) === 0 ? fgColor : bgColor;\n break;\n }\n if (color === 0) {\n color = bgColor;\n }\n // Sprites\n if (!textMode) {\n var spriteColor = spriteBuffer[x1] - 1;\n if (spriteColor > 0) {\n color = spriteColor;\n }\n }\n }\n else {\n color = bgColor;\n }\n rgbColor = palette[color];\n imageData[imageDataAddr++] = rgbColor;\n }\n }\n // Top/bottom border\n else {\n rgbColor = palette[bgColor];\n for (x = 0; x < width; x++) {\n imageData[imageDataAddr++] = rgbColor;\n }\n }\n if (y === vBorder + drawHeight) {\n this.statusRegister |= 0x80;\n if (this.interruptsOn) {\n this.cru.setVDPInterrupt(true);\n }\n }\n if (collision) {\n this.statusRegister |= 0x20;\n }\n if ((this.statusRegister & 0x40) === 0) {\n this.statusRegister |= fifthSpriteIndex;\n }\n if (fifthSprite) {\n this.statusRegister |= 0x40;\n }\n }\n\n setReadAddress(i:number) {\n this.addressRegister = ((i & 0x3f) << 8) | (this.addressRegister & 0x00FF);\n this.prefetchByte = this.ram[this.addressRegister++];\n this.addressRegister &= 0x3FFF;\n }\n \n setWriteAddress(i:number) {\n this.addressRegister = ((i & 0x3f) << 8) | (this.addressRegister & 0x00FF);\n }\n \n setVDPWriteRegister(i:number) {\n var regmask = this.registers.length-1;\n this.registers[i & regmask] = this.addressRegister & 0x00FF;\n switch (i & regmask) {\n // Mode\n case 0:\n this.updateMode(this.registers[0], this.registers[1]);\n break;\n case 1:\n this.ramMask = (this.registers[1] & 0x80) !== 0 ? 0x3FFF : 0x1FFF;\n this.displayOn = (this.registers[1] & 0x40) !== 0;\n this.interruptsOn = (this.registers[1] & 0x20) !== 0;\n this.updateMode(this.registers[0], this.registers[1]);\n break;\n // Name table\n case 2:\n this.nameTable = (this.registers[2] & 0xf) << 10;\n break;\n // Color table\n case 3:\n if (this.bitmapMode) {\n this.colorTable = (this.registers[3] & 0x80) << 6;\n }\n else {\n this.colorTable = this.registers[3] << 6;\n }\n this.updateTableMasks();\n break;\n // Pattern table\n case 4:\n if (this.bitmapMode) {\n this.charPatternTable = (this.registers[4] & 0x4) << 11;\n }\n else {\n this.charPatternTable = (this.registers[4] & 0x7) << 11;\n }\n this.updateTableMasks();\n break;\n // Sprite attribute table\n case 5:\n this.spriteAttributeTable = (this.registers[5] & 0x7f) << 7;\n break;\n // Sprite pattern table\n case 6:\n this.spritePatternTable = (this.registers[6] & 0x7) << 11;\n break;\n // Background\n case 7:\n this.fgColor = (this.registers[7] & 0xf0) >> 4;\n this.bgColor = this.registers[7] & 0x0f;\n break;\n }\n // this.logRegisters();\n // this.log.info(\"Name table: \" + this.nameTable.toHexWord());\n // this.log.info(\"Pattern table: \" + this.charPatternTable.toHexWord());\n }\n\n setVDPWriteCommand3(i:number) {\n this.setVDPWriteRegister(i);\n }\n \n writeAddress(i:number) {\n if (!this.latch) {\n this.addressRegister = (this.addressRegister & 0xFF00) | i;\n } else {\n switch ((i & 0xc0) >> 6) {\n // Set read address\n case 0:\n this.setReadAddress(i);\n break;\n // Set write address\n case 1:\n this.setWriteAddress(i);\n break;\n // Write register\n case 2:\n this.setVDPWriteRegister(i);\n break;\n // Color RAM (SMS only)\n case 3:\n this.setVDPWriteCommand3(i);\n break;\n }\n this.redrawRequired = true;\n }\n this.latch = !this.latch;\n }\n\n updateMode(reg0:number, reg1:number) {\n this.bitmapMode = (reg0 & 0x02) !== 0;\n this.textMode = (reg1 & 0x10) !== 0;\n // Check bitmap mode bit, not text or multicolor\n if (this.bitmapMode) {\n switch ((reg1 & 0x18) >> 3) {\n case 0:\n // Bitmap mode\n this.screenMode = TMS9918A_Mode.BITMAP;\n break;\n case 1:\n // Multicolor mode\n this.screenMode = TMS9918A_Mode.BITMAP_MULTICOLOR;\n break;\n case 2:\n // Text mode\n this.screenMode = TMS9918A_Mode.BITMAP_TEXT;\n break;\n case 3:\n // Illegal\n this.screenMode = TMS9918A_Mode.ILLEGAL;\n break;\n }\n } else {\n switch ((reg1 & 0x18) >> 3) {\n case 0:\n // Graphics mode 0\n this.screenMode = TMS9918A_Mode.GRAPHICS;\n break;\n case 1:\n // Multicolor mode\n this.screenMode = TMS9918A_Mode.MULTICOLOR;\n break;\n case 2:\n // Text mode\n this.screenMode = TMS9918A_Mode.TEXT;\n break;\n case 3:\n // Illegal\n this.screenMode = TMS9918A_Mode.ILLEGAL;\n break;\n }\n }\n if (this.bitmapMode) {\n this.colorTable = (this.registers[3] & 0x80) << 6;\n this.charPatternTable = (this.registers[4] & 0x4) << 11;\n this.updateTableMasks();\n } else {\n this.colorTable = this.registers[3] << 6;\n this.charPatternTable = (this.registers[4] & 0x7) << 11;\n }\n this.nameTable = (this.registers[2] & 0xf) << 10;\n this.spriteAttributeTable = (this.registers[5] & 0x7f) << 7;\n this.spritePatternTable = (this.registers[6] & 0x7) << 11;\n }\n\n updateTableMasks() {\n if (this.screenMode === TMS9918A_Mode.BITMAP) {\n this.colorTableMask = ((this.registers[3] & 0x7F) << 6) | 0x3F; // 000CCCCCCC111111\n this.patternTableMask = ((this.registers[4] & 0x03) << 11) | (this.colorTableMask & 0x7FF); // 000PPCCCCC111111\n // this.log.info(\"colorTableMask:\" + this.colorTableMask);\n // this.log.info(\"patternTableMask:\" + this.patternTableMask);\n }\n else if (this.screenMode === TMS9918A_Mode.BITMAP_TEXT || this.screenMode === TMS9918A_Mode.BITMAP_MULTICOLOR) {\n this.colorTableMask = this.ramMask;\n this.patternTableMask = ((this.registers[4] & 0x03) << 11) | 0x7FF; // 000PP11111111111\n }\n else {\n this.colorTableMask = this.ramMask;\n this.patternTableMask = this.ramMask;\n }\n }\n\n writeData(i:number) {\n this.probe.logVRAMWrite(this.addressRegister, i);\n this.ram[this.addressRegister++] = i;\n this.prefetchByte = i;\n this.addressRegister &= this.ramMask;\n this.latch = false;\n this.redrawRequired = true;\n }\n\n readStatus() : number {\n var i = this.statusRegister;\n this.statusRegister = 0x1F; // TODO: & 0x1f?\n if (this.interruptsOn) {\n this.cru.setVDPInterrupt(false);\n }\n this.latch = false;\n return i;\n }\n\n readData() : number {\n var i = this.prefetchByte;\n this.prefetchByte = this.ram[this.addressRegister++];\n this.probe.logVRAMRead(this.addressRegister-1, this.prefetchByte);\n this.addressRegister &= this.ramMask;\n this.latch = false;\n return i;\n }\n\n getRAM() : Uint8Array {\n return this.ram;\n }\n\n colorTableSize() : number {\n if (this.screenMode === TMS9918A_Mode.GRAPHICS) {\n return 0x20;\n }\n else if (this.screenMode === TMS9918A_Mode.BITMAP) {\n return Math.min(this.colorTableMask + 1, 0x1800);\n }\n else {\n return 0;\n }\n }\n\n patternTableSize() : number {\n if (this.bitmapMode) {\n return Math.min(this.patternTableMask + 1, 0x1800);\n }\n else {\n return 0x800;\n }\n }\n getDebugTables() {\n var tables : [string,number,number][] = [\n [\"Pattern Table\", this.charPatternTable, this.patternTableSize()],\n [\"Name Table\", this.nameTable, 0x300],\n [\"Color Table\", this.colorTable, this.colorTableSize()],\n [\"Sprite Patterns\", this.spritePatternTable, 64*32],\n [\"Sprite Attributes\", this.spriteAttributeTable, 4*32],\n ];\n return tables;\n }\n getRegsString() : string {\n const w = 20;\n var s = \"Registers:\";\n for (var i = 0; i < this.registers.length; i++) {\n s += \" \" + hex(this.registers[i],2);\n }\n s += \"\\n\\n\";\n var tables = this.getDebugTables();\n for (var row of tables) {\n if (row[2] > 0)\n s += lpad(row[0], w) + \": $\" + hex(row[1],4) + \" - $\" + hex(row[1]+row[2]-1,4) + \"\\n\";\n }\n s += lpad(\"Address Register\",w) + \": $\" + hex(this.addressRegister,4) + \"\\n\";\n s += lpad(\"Status Register\",w) + \": $\" + hex(this.statusRegister,2) + \"\\n\";\n s += lpad(\"Screen Mode\",w) + \": \" + this.screenMode + \"\\n\";\n s += lpad(\"Display On\",w) + \": \" + this.displayOn + \"\\n\";\n if (this.ramMask != 0x3fff)\n s += lpad(\"RAM Mask\",w) + \": $\" + hex(this.ramMask) + \"\\n\";\n return s;\n }\n\n hexView(start:number, length:number, anchorAddr:number) : {text,lineCount,anchorLine} {\n var text = \"\";\n var anchorLine = null;\n var addr = start;\n var line = 0;\n for (var i = 0; i < length && addr < 0x4000; addr++, i++) {\n if ((i & 0x000F) === 0) {\n text += \"\\n\" + hex(addr,4) + \":\";\n line++;\n }\n text += \" \";\n if (anchorAddr && anchorAddr === addr) {\n anchorLine = line;\n }\n var hx = this.ram[addr].toString(16).toUpperCase();\n if (hx.length === 1) {\n text += \"0\";\n }\n text += hx;\n }\n return {text: text.substr(1), lineCount: line, anchorLine: anchorLine - 1};\n }\n\n getWord(addr:number) : number {\n return addr < 0x4000 ? this.ram[addr] << 8 | this.ram[addr+1] : 0;\n }\n\n getCharAt(x:number, y:number) : number {\n x -= 24;\n y -= 24;\n if (!this.textMode) {\n return this.ram[this.nameTable + Math.floor(x / 8) + Math.floor(y / 8) * 32];\n }\n else {\n return this.ram[this.nameTable + Math.floor((x - 8) / 6) + Math.floor(y / 8) * 40];\n }\n }\n\n setFlicker(value:boolean) {\n this.flicker = value;\n this.enableFlicker = value;\n }\n\n getState() {\n return {\n ram: this.ram.slice(0),\n registers: this.registers.slice(0),\n addressRegister: this.addressRegister,\n statusRegister: this.statusRegister,\n latch: this.latch,\n prefetchByte: this.prefetchByte,\n displayOn: this.displayOn,\n interruptsOn: this.interruptsOn,\n screenMode: this.screenMode,\n bitmapMode: this.bitmapMode,\n textMode: this.textMode,\n colorTable: this.colorTable,\n nameTable: this.nameTable,\n charPatternTable: this.charPatternTable,\n spriteAttributeTable: this.spriteAttributeTable,\n spritePatternTable: this.spritePatternTable,\n colorTableMask: this.colorTableMask,\n patternTableMask: this.patternTableMask,\n ramMask: this.ramMask,\n fgColor: this.fgColor,\n bgColor: this.bgColor,\n flicker: this.flicker\n };\n }\n\n restoreState(state) {\n this.ram.set(state.ram);\n this.registers.set(state.registers);\n this.addressRegister = state.addressRegister;\n this.statusRegister = state.statusRegister;\n this.latch = state.latch;\n this.prefetchByte = state.prefetchByte;\n this.displayOn = state.displayOn;\n this.interruptsOn = state.interruptsOn;\n this.screenMode = state.screenMode;\n this.bitmapMode = state.bitmapMode;\n this.textMode = state.textMode;\n this.colorTable = state.colorTable;\n this.nameTable = state.nameTable;\n this.charPatternTable = state.charPatternTable;\n this.spriteAttributeTable = state.spriteAttributeTable;\n this.spritePatternTable = state.spritePatternTable;\n this.colorTableMask = state.colorTableMask;\n this.patternTableMask = state.patternTableMask;\n this.ramMask = state.ramMask;\n this.fgColor = state.fgColor;\n this.bgColor = state.bgColor;\n this.flicker = state.flicker;\n this.redrawRequired = true;\n }\n};\n\nexport class SMSVDP extends TMS9918A {\n\n writeToCRAM : boolean;\n cram = new Uint8Array(32); // color RAM\n cpalette = new Uint32Array(32); // color RAM (RGBA)\n registers = new Uint8Array(16); // 8 more registers (actually only 5)\n vramUntwiddled = new Uint8Array(0x8000);\n numVisibleLines = 192;\n lineCounter = 0; // TODO: state\n lineInterruptPending = false; // TODO: state\n\n reset() {\n super.reset();\n this.writeToCRAM = false;\n this.cram.fill(0);\n this.cpalette.fill(0);\n this.vramUntwiddled.fill(0); \n }\n readStatus() {\n this.lineInterruptPending = false;\n return super.readStatus();\n }\n updateMode(reg0:number, reg1:number) {\n if (reg0 & 0x04) {\n this.screenMode = TMS9918A_Mode.MODE4;\n this.nameTable = ((this.registers[2] & 0xf) << 10) & 0x3800;\n this.spriteAttributeTable = (this.registers[5] & 0x7e) << 7;\n } else {\n super.updateMode(reg0, reg1);\n }\n }\n setReadAddress(i:number) {\n super.setReadAddress(i);\n this.writeToCRAM = false;\n }\n setWriteAddress(i:number) {\n super.setWriteAddress(i);\n this.writeToCRAM = false;\n }\n setVDPWriteRegister(i:number) {\n super.setVDPWriteRegister(i);\n //this.writeToCRAM = false; // TODO?\n this.ramMask = 0x3fff;\n }\n setVDPWriteCommand3(i:number) {\n this.writeToCRAM = true;\n //this.addressRegister &= 0x1f; // TODO?\n }\n writeData(i:number) {\n if (this.writeToCRAM) {\n var palindex = this.addressRegister++ & (this.cram.length-1);\n this.cram[palindex] = i;\n this.cpalette[palindex] = RGBA((i&3)*85, ((i>>2)&3)*85, ((i>>4)&3)*85);\n this.prefetchByte = i;\n this.addressRegister &= this.ramMask;\n this.redrawRequired = true;\n } else {\n var oldAddress = this.addressRegister;\n super.writeData(i);\n this.writeTwiddled(oldAddress, i);\n }\n this.latch = false;\n }\n writeTwiddled(vdp_addr:number, val:number) {\n var planarBase = vdp_addr & 0x3ffc;\n var twiddledBase = planarBase * 2;\n var val0 = this.ram[planarBase];\n var val1 = this.ram[planarBase + 1];\n var val2 = this.ram[planarBase + 2];\n var val3 = this.ram[planarBase + 3];\n for (var i = 0; i < 8; ++i) {\n var effectiveBit = 7 - i;\n var index = (((val0 >>> effectiveBit) & 1))\n | (((val1 >>> effectiveBit) & 1) << 1)\n | (((val2 >>> effectiveBit) & 1) << 2)\n | (((val3 >>> effectiveBit) & 1) << 3);\n this.vramUntwiddled[twiddledBase + i] = index;\n }\n }\n getState() {\n var state = super.getState();\n state['cram'] = this.cram.slice(0);\n return state;\n }\n restoreState(state) {\n super.restoreState(state);\n this.cram.set(state.cram);\n }\n drawScanline(y:number) {\n if (this.screenMode == TMS9918A_Mode.MODE4)\n this.rasterize_line(y);\t// special mode 4\n else\n super.drawScanline(y);\n }\n\n findSprites(line:number) {\n var spriteInfo = this.spriteAttributeTable;\n var active = [];\n var spriteHeight = 8;\n var i;\n if (this.registers[1] & 2) {\n spriteHeight = 16;\n }\n for (i = 0; i < 64; i++) {\n var y = this.ram[spriteInfo + i];\n if (y === 208) {\n break;\n }\n if (y >= 240) y -= 256;\n if (line >= y && line < (y + spriteHeight)) {\n if (active.length === 8) {\n this.statusRegister |= 0x40; // Sprite overflow\n break;\n }\n active.push([\n this.ram[spriteInfo + 128 + i * 2],\n this.ram[spriteInfo + 128 + i * 2 + 1],\n y]);\n }\n }\n return active;\n }\n\n\n rasterize_background(lineAddr:number, pixelOffset:number, tileData:number, tileDef:number, transparent:boolean) {\n lineAddr = lineAddr | 0;\n pixelOffset = pixelOffset | 0;\n tileData = tileData | 0;\n tileDef = (tileDef | 0) * 2;\n var i, tileDefInc;\n if ((tileData & (1 << 9))) {\n tileDefInc = -1;\n tileDef += 7;\n } else {\n tileDefInc = 1;\n }\n const paletteOffset = (tileData & (1 << 11)) ? 16 : 0;\n var index;\n if (transparent && paletteOffset === 0) {\n for (i = 0; i < 8; i++) {\n index = this.vramUntwiddled[tileDef];\n tileDef += tileDefInc;\n if (index !== 0) this.fb32[lineAddr + pixelOffset] = this.cpalette[index];\n pixelOffset = (pixelOffset + 1) & 255;\n }\n } else {\n for (i = 0; i < 8; i++) {\n index = this.vramUntwiddled[tileDef] + paletteOffset;\n tileDef += tileDefInc;\n this.fb32[lineAddr + pixelOffset] = this.cpalette[index];\n pixelOffset = (pixelOffset + 1) & 255;\n }\n }\n }\n\n \n clear_background(lineAddr:number, pixelOffset:number) {\n lineAddr = lineAddr | 0;\n pixelOffset = pixelOffset | 0;\n var i;\n const rgb = this.cpalette[0];\n for (i = 0; i < 8; ++i) {\n this.fb32[lineAddr + pixelOffset] = rgb;\n pixelOffset = (pixelOffset + 1) & 255;\n }\n }\n\n rasterize_background_line(lineAddr:number, pixelOffset:number, nameAddr:number, yMod:number) {\n lineAddr = lineAddr | 0;\n pixelOffset = pixelOffset | 0;\n nameAddr = nameAddr | 0;\n const yOffset = (yMod | 0) * 4;\n for (var i = 0; i < 32; i++) {\n // TODO: static left-hand rows.\n var tileData = this.ram[nameAddr + i * 2] | (this.ram[nameAddr + i * 2 + 1] << 8);\n var tileNum = tileData & 511;\n var tileDef = 32 * tileNum;\n if (tileData & (1 << 10)) {\n tileDef += 28 - yOffset;\n } else {\n tileDef += yOffset;\n }\n if ((tileData & (1 << 12)) === 0) {\n this.rasterize_background(lineAddr, pixelOffset, tileData, tileDef, false);\n } else {\n this.clear_background(lineAddr, pixelOffset);\n }\n pixelOffset = (pixelOffset + 8) & 255;\n }\n }\n\n rasterize_foreground_line(lineAddr:number, pixelOffset:number, nameAddr:number, yMod:number) {\n lineAddr = lineAddr | 0;\n pixelOffset = pixelOffset | 0;\n nameAddr = nameAddr | 0;\n const yOffset = (yMod | 0) * 4;\n for (var i = 0; i < 32; i++) {\n // TODO: static left-hand rows.\n var tileData = this.ram[nameAddr + i * 2] | (this.ram[nameAddr + i * 2 + 1] << 8);\n if ((tileData & (1 << 12)) === 0) continue;\n var tileNum = tileData & 511;\n var tileDef = 32 * tileNum;\n if (tileData & (1 << 10)) {\n tileDef += 28 - yOffset;\n } else {\n tileDef += yOffset;\n }\n this.rasterize_background(lineAddr, ((i * 8) + pixelOffset & 0xff), tileData, tileDef, true);\n }\n }\n\n\n rasterize_sprites(line:number, lineAddr:number, pixelOffset:number, sprites) {\n lineAddr = lineAddr | 0;\n pixelOffset = pixelOffset | 0;\n const spriteBase = (this.registers[6] & 4) ? 0x2000 : 0;\n // TODO: sprite X-8 shift\n // TODO: sprite double size\n for (var i = 0; i < 256; ++i) {\n var xPos = i;//(i + this.registers[8]) & 0xff;\n var spriteFoundThisX = false;\n var writtenTo = false;\n var minDistToNext = 256;\n for (var k = 0; k < sprites.length; k++) {\n var sprite = sprites[k];\n var offset = xPos - sprite[0];\n // Sprite to the right of the current X?\n if (offset < 0) {\n // Find out how far it would be to skip to this sprite\n var distToSprite = -offset;\n // Keep the minimum distance to the next sprite to the right.\n if (distToSprite < minDistToNext) minDistToNext = distToSprite;\n continue;\n }\n if (offset >= 8) continue;\n spriteFoundThisX = true;\n var spriteLine = line - sprite[2];\n var spriteAddr = spriteBase + sprite[1] * 32 + spriteLine * 4;\n var untwiddledAddr = spriteAddr * 2 + offset;\n var index = this.vramUntwiddled[untwiddledAddr];\n if (index === 0) {\n continue;\n }\n if (writtenTo) {\n // We have a collision!.\n this.statusRegister |= 0x20;\n break;\n }\n this.fb32[lineAddr + ((pixelOffset + i - this.registers[8]) & 0xff)] = this.cpalette[16 + index];\n writtenTo = true;\n }\n if (!spriteFoundThisX && minDistToNext > 1) {\n // If we didn't find a sprite on this X, then we can skip ahead by the minimum\n // dist to next (minus one to account for loop add)\n i += minDistToNext - 1;\n }\n }\n }\n\n border_clear(lineAddr:number, count:number) {\n lineAddr = lineAddr | 0;\n count = count | 0;\n const borderIndex = 16 + (this.registers[7] & 0xf);\n const borderRGB = this.cpalette[borderIndex];\n this.fb32.fill(borderRGB, lineAddr, lineAddr+count);\n }\n\n rasterize_line(line:number) {\n line |= 0;\n var vdp_regs = this.registers;\n var drawWidth = 256;\n var drawHeight = this.numVisibleLines; // TODO?\n var hBorder = (this.width - drawWidth) >> 1;\n var vBorder = (this.height - drawHeight) >> 1; // TODO?\n const startAddr = ((line + vBorder) * this.width) | 0;\n const lineAddr = (startAddr + hBorder) | 0;\n if (!this.displayOn || line < 0 || line >= drawHeight) {\n if (line < this.height)\n this.border_clear(startAddr, this.width);\n else if (line >= 262-vBorder)\n this.border_clear((line-262+vBorder)*this.width, this.width);\n } else {\n var effectiveLine = line + vdp_regs[9];\n if (effectiveLine >= 224) {\n effectiveLine -= 224;\n }\n const sprites = this.findSprites(line);\n const pixelOffset = ((vdp_regs[0] & 64) && line < 16) ? 0 : vdp_regs[8];\n const nameAddr = this.nameTable + (effectiveLine >>> 3) * 64;\n const yMod = effectiveLine & 7;\n\n this.rasterize_background_line(lineAddr, pixelOffset, nameAddr, yMod);\n this.rasterize_sprites(line, lineAddr, pixelOffset, sprites);\n this.rasterize_foreground_line(lineAddr, pixelOffset, nameAddr, yMod);\n\n this.border_clear(startAddr, hBorder);\n this.border_clear(lineAddr + 256, hBorder);\n if (vdp_regs[0] & (1 << 5)) {\n // Blank out left hand column.\n this.border_clear(lineAddr, 8);\n }\n }\n // frame interrupts\n if (line == drawHeight) {\n this.statusRegister |= 0x80;\n if (this.interruptsOn) {\n this.cru.setVDPInterrupt(true);\n }\n }\n // line interrupts\n if (line <= drawHeight) {\n if (this.lineCounter > 0) {\n this.lineCounter--;\n } else {\n this.lineCounter = this.registers[0xa];\n this.lineInterruptPending = true;\n }\n } else {\n this.lineCounter = this.registers[0xa];\n }\n if (this.lineInterruptPending) {\n if (this.registers[0] & 0x10) {\n // TODO this.cru.setVDPInterrupt(true);\n }\n }\n }\n\n getDebugTables() {\n if (this.screenMode == TMS9918A_Mode.MODE4) {\n var tables : [string,number,number][] = [\n [\"Pattern Table\", 0, 512*32],\n [\"Name Table\", this.nameTable, 32*32*2], // TODO: size\n [\"Sprite Attributes\", this.spriteAttributeTable, 256],\n ]\n return tables;\n } else {\n return super.getDebugTables();\n }\n }\n};\n\nexport class GameGearVDP extends SMSVDP {\n cram = new Uint8Array(64); // color RAM\n cram_latch = 0;\n\n writeData(value: number) {\n if (this.writeToCRAM) {\n //console.log(hex(this.addressRegister), hex(value), hex(this.cram_latch));\n if (this.addressRegister & 1) { // odd address?\n let rgb4 = this.cram_latch + (value << 8);\n let rgba = RGBA((rgb4&15)*17, ((rgb4>>4)&15)*17, ((rgb4>>8)&15)*17);\n let palindex = this.addressRegister & (this.cram.length-1);\n this.cram[palindex-1] = this.cram_latch;\n this.cram[palindex] = value;\n this.cpalette[palindex >> 1] = rgba;\n this.prefetchByte = value;\n this.addressRegister &= this.ramMask;\n this.redrawRequired = true;\n } else {\n this.cram_latch = value; // even address\n }\n this.addressRegister++;\n } else {\n super.writeData(value);\n }\n this.latch = false;\n }\n}\n", "\nimport { Z80, Z80State } from \"../common/cpu/ZilogZ80\";\nimport { BasicScanlineMachine, Bus, ProbeAll } from \"../common/devices\";\nimport { newAddressDecoder, newKeyboardHandler } from \"../common/emu\";\nimport { TssChannelAdapter } from \"../common/audio\";\nimport { TMS9918A } from \"../common/video/tms9918a\";\n\nconst audioOversample = 2;\n\nexport abstract class BaseZ80VDPBasedMachine extends BasicScanlineMachine {\n\n cpuFrequency = 3579545; // MHz\n canvasWidth = 304;\n numTotalScanlines = 262;\n numVisibleScanlines = 240;\n cpuCyclesPerLine = this.cpuFrequency / (262*60);\n sampleRate = 262*60*audioOversample;\n overscan = true;\n\n cpu: Z80 = new Z80();\n vdp: TMS9918A;\n psg;\n audioadapter;\n\n abstract vdpInterrupt();\n abstract getKeyboardMap();\n getKeyboardFunction() { return null; }\n \n init(membus:Bus, iobus:Bus, psg) {\n this.connectCPUMemoryBus(membus);\n this.connectCPUIOBus(iobus);\n this.handler = newKeyboardHandler(this.inputs, this.getKeyboardMap(), this.getKeyboardFunction());\n this.psg = psg;\n this.audioadapter = psg && new TssChannelAdapter(psg.psg, audioOversample, this.sampleRate);\n }\n \n connectVideo(pixels) {\n super.connectVideo(pixels);\n var cru = {\n setVDPInterrupt: (b) => {\n if (b) {\n this.vdpInterrupt();\n } else {\n // TODO: reset interrupt?\n }\n }\n };\n this.vdp = this.newVDP(this.pixels, cru, true);\n }\n\n connectProbe(probe: ProbeAll) : void {\n super.connectProbe(probe);\n this.vdp.probe = probe || this.nullProbe;\n }\n\n newVDP(frameData, cru, flicker) {\n return new TMS9918A(frameData, cru, flicker);\n }\n \n startScanline() {\n this.audio && this.audioadapter && this.audioadapter.generate(this.audio);\n }\n\n drawScanline() {\n this.vdp.drawScanline(this.scanline);\n }\n\n loadState(state) {\n super.loadState(state);\n this.vdp.restoreState(state['vdp']);\n }\n saveState() {\n var state = super.saveState();\n state['vdp'] = this.vdp.getState();\n return state;\n }\n reset() {\n super.reset();\n this.vdp.reset();\n this.psg.reset();\n }\n\n getDebugCategories() {\n return ['CPU','Stack','VDP'];\n }\n getDebugInfo(category, state) {\n switch (category) {\n case 'VDP': return this.vdpStateToLongString(state.vdp);\n }\n }\n vdpStateToLongString(ppu) {\n return this.vdp.getRegsString();\n }\n readVRAMAddress(a : number) : number {\n return this.vdp.ram[a & 0x3fff];\n }\n}\n\n"],
"mappings": "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",
"names": []
}