2014-06-14 11:27:55 -04:00
|
|
|
#pragma once
|
|
|
|
|
2014-06-14 10:12:10 -04:00
|
|
|
#include "stdafx.h"
|
2014-06-14 11:27:55 -04:00
|
|
|
#include "IMemoryHandler.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:
|
|
|
|
PPUState _state;
|
2014-06-14 18:20:56 -04:00
|
|
|
uint64_t _cycleCount;
|
|
|
|
|
|
|
|
uint8_t _memoryReadBuffer;
|
2014-06-14 11:27:55 -04:00
|
|
|
uint8_t _spriteRAM[256];
|
|
|
|
uint8_t _videoRAM[16*1024];
|
|
|
|
|
2014-06-14 18:20:56 -04:00
|
|
|
uint8_t *_outputBuffer;
|
|
|
|
|
|
|
|
int16_t _scanline = -1;
|
|
|
|
uint16_t _cycle = 0;
|
|
|
|
|
|
|
|
PPUControlFlags _flags = {};
|
|
|
|
PPUStatusFlags _statusFlags = {};
|
|
|
|
|
|
|
|
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:
|
|
|
|
PPU();
|
2014-06-14 18:20:56 -04:00
|
|
|
~PPU();
|
|
|
|
|
2014-06-14 11:27:55 -04:00
|
|
|
std::array<int, 2> GetIOAddresses()
|
|
|
|
{
|
|
|
|
return std::array<int, 2> {{ 0x2000, 0x3FFF }};
|
|
|
|
}
|
2014-06-14 10:12:10 -04:00
|
|
|
|
2014-06-14 11:27:55 -04:00
|
|
|
uint8_t MemoryRead(uint16_t addr);
|
|
|
|
void MemoryWrite(uint16_t addr, uint8_t value);
|
2014-06-14 18:20:56 -04:00
|
|
|
|
|
|
|
void Exec();
|
2014-06-14 10:12:10 -04:00
|
|
|
};
|