nes-emu
Version:
A NES emulator
51 lines (46 loc) • 1.75 kB
JavaScript
;
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;