UNPKG

nes-emu

Version:

A NES emulator

44 lines (41 loc) 1.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _registers = require("../../registers"); /** * PPU Mask Register (> write) * * Controls the rendering of sprites and backgrounds, as well as colour effects. */ class PPUMask extends _registers.WriteOnlyInMemoryRegister { constructor() { super(); this.addReadOnlyField("grayscale", 0).addReadOnlyField("showBackgroundInLeftmost8PixelsOfScreen", 1).addReadOnlyField("showSpritesInLeftmost8PixelsOfScreen", 2).addReadOnlyField("showBackground", 3).addReadOnlyField("showSprites", 4).addReadOnlyField("emphasizeRed", 5).addReadOnlyField("emphasizeGreen", 6).addReadOnlyField("emphasizeBlue", 7); } /** Transforms a BGR `color` following the register's rules (grayscale or emphasize bits). */ transform(color) { let r = color >> 0 & 0xff; let g = color >> 8 & 0xff; let b = color >> 16 & 0xff; if (this.grayscale) { const gray = Math.floor(r / 3) + Math.floor(g / 3) + Math.floor(b / 3); r = gray; g = gray; b = gray; } if (this.emphasizeRed || this.emphasizeGreen || this.emphasizeBlue) { const all = this.emphasizeRed && this.emphasizeGreen && this.emphasizeBlue; r = this.emphasizeRed && !all ? r : Math.floor(r * 0.75); g = this.emphasizeGreen && !all ? g : Math.floor(g * 0.75); b = this.emphasizeBlue && !all ? b : Math.floor(b * 0.75); } return r << 0 | g << 8 | b << 16; } /** Returns whether any rendering (background or sprites) is active or not. */ get isRenderingEnabled() { return this.showBackground || this.showSprites; } } exports.default = PPUMask;