Mesen-X/Core/PPU.h

98 lines
1.6 KiB
C
Raw Normal View History

2014-06-14 11:27:55 -04:00
#pragma once
2014-06-14 10:12:10 -04:00
#include "stdafx.h"
2014-06-15 21:45:36 -04:00
#include "MemoryManager.h"
2014-06-14 10:12:10 -04:00
enum PPURegisters
{
Control = 0x00,
Control2 = 0x01,
Status = 0x02,
SpriteAddr = 0x03,
SpriteData = 0x04,
ScrollOffsets = 0x05,
VideoMemoryAddr = 0x06,
VideoMemoryData = 0x07
};
2014-06-14 18:20:56 -04:00
struct PPUControlFlags
{
uint16_t NameTableAddr;
bool VerticalWrite;
uint16_t SpritePatternAddr;
uint16_t BackgroundPatternAddr;
bool LargeSprites;
bool VBlank;
bool Grayscale;
bool BackgroundMask;
bool SpriteMask;
bool BackgroundEnabled;
bool SpritesEnabled;
bool IntensifyRed;
bool IntensifyGreen;
bool IntensifyBlue;
};
struct PPUStatusFlags
{
bool SpriteOverflow;
bool Sprite0Hit;
bool VerticalBlank;
};
2014-06-14 10:12:10 -04:00
struct PPUState
{
2014-06-14 18:20:56 -04:00
uint8_t Control;
uint8_t Control2;
2014-06-14 10:12:10 -04:00
uint8_t Status;
uint8_t SpriteRamAddr;
uint16_t VideoRamAddr;
};
class PPU : public IMemoryHandler
{
2014-06-14 11:27:55 -04:00
private:
2014-06-15 21:45:36 -04:00
MemoryManager *_memoryManager;
2014-06-14 11:27:55 -04:00
PPUState _state;
2014-06-14 18:20:56 -04:00
uint64_t _cycleCount;
uint8_t _memoryReadBuffer;
uint8_t _spriteRAM[0x100];
2014-06-14 11:27:55 -04:00
2014-06-14 18:20:56 -04:00
uint8_t *_outputBuffer;
int16_t _scanline = 0;
2014-06-14 18:20:56 -04:00
uint16_t _cycle = 0;
2014-06-15 09:35:17 -04:00
uint32_t _frameCount = 0;
2014-06-14 18:20:56 -04:00
bool _writeLow = false;
2014-06-15 09:35:17 -04:00
PPUControlFlags _flags;
PPUStatusFlags _statusFlags;
2014-06-14 18:20:56 -04:00
void PPU::UpdateStatusFlag();
void PPU::UpdateFlags();
bool PPU::CheckFlag(PPUControlFlags flag);
2014-06-14 11:27:55 -04:00
PPURegisters GetRegisterID(uint16_t addr)
{
return (PPURegisters)(addr & 0x07);
2014-06-14 10:12:10 -04:00
}
2014-06-14 11:27:55 -04:00
public:
2014-06-15 21:45:36 -04:00
PPU(MemoryManager *memoryManager);
2014-06-14 18:20:56 -04:00
~PPU();
2014-06-15 21:45:36 -04:00
vector<std::array<uint16_t, 2>> GetRAMAddresses()
{
return{ { { 0x2000, 0x3FFF } }, { {0x4014, 0x4014 } } };
2014-06-14 11:27:55 -04:00
}
2014-06-14 10:12:10 -04:00
2014-06-15 21:45:36 -04:00
uint8_t ReadRAM(uint16_t addr);
void WriteRAM(uint16_t addr, uint8_t value);
2014-06-14 18:20:56 -04:00
void Exec();
2014-06-14 10:12:10 -04:00
};