#pragma once #include "Registers.hpp" #include class NES; const unsigned int VRAM_SIZE = 2048u; const unsigned int VIDEO_WIDTH = 256u; const unsigned int VIDEO_HEIGHT = 240u; class PPU { public: void Cycle(uint8_t cpuCyclesElapsed); void WriteRegister(PpuRegister reg, uint8_t value); uint8_t ReadRegister(PpuRegister reg); void WriteMemory(uint16_t address, uint8_t value); uint8_t ReadMemory(uint16_t address); private: friend class NES; PpuRegisterCTRL ppuCtrl{}; PpuRegisterMask ppuMask{}; PpuRegisterStatus ppuStatus{}; uint8_t oamAddr{}; uint8_t oamData{}; uint8_t oam[256]{}; uint8_t ppuScroll{}; uint16_t ppuAddr{}; uint8_t ppuData{}; bool ppuAddrW{}; uint8_t regV{}; uint8_t regT{}; uint8_t regX{}; uint8_t regW{}; uint16_t cycles{}; uint16_t scanline{}; uint8_t ram[VRAM_SIZE]{}; uint8_t paletteIndexes[32]{}; uint32_t video[VIDEO_WIDTH * VIDEO_HEIGHT]{}; NES* nes; };