UNPKG

nes-emu

Version:

A NES emulator

51 lines (46 loc) 1.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _registers = require("../../registers"); var _constants = _interopRequireDefault(require("../../constants")); var _helpers = require("../../helpers"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * PPU Data Port (<> read/write) * * Read/Write VRAM data here. `PPUAddr` will be incremented after any read/write. * Reads are delayed by 1. */ class PPUData extends _registers.InMemoryRegister { /** When a context is loaded. */ onLoad() { this.buffer = 0; // (used to simulate read delay) } /** Reads a value from PPU address space, delayed by one read (except for the Palette RAM). */ readAt() { if (this.context.isDebugging) return this.buffer; let data = this.buffer; const ppuAddress = this.context.ppu.registers.ppuAddr.address; this.buffer = this.context.ppu.memory.readAt(ppuAddress); // (if the PPUAddr is inside Palette RAM area, skip the buffer) if (ppuAddress >= _constants.default.PPU_ADDRESSED_PALETTE_RAM_START_ADDRESS) data = this.buffer; // (reading increments `PPUAddr` as a side effect) this._incrementAddress(); return data; } /** Writes a `byte` to PPU address space and increments `PPUAddr`. */ writeAt(__, byte) { const ppuAddress = this.context.ppu.registers.ppuAddr.address; this.context.ppu.memory.writeAt(ppuAddress, byte); this._incrementAddress(); } _incrementAddress() { const { registers } = this.context.ppu; registers.ppuAddr.address = _helpers.Byte.force16Bit(registers.ppuAddr.address + registers.ppuCtrl.vramAddressIncrement); } } exports.default = PPUData;