2019-02-13 13:32:21 -05:00
|
|
|
#pragma once
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "PpuTypes.h"
|
|
|
|
|
2019-02-13 18:44:39 -05:00
|
|
|
class Console;
|
2019-02-17 15:37:31 -05:00
|
|
|
class InternalRegisters;
|
2019-02-13 18:44:39 -05:00
|
|
|
|
2019-02-13 13:32:21 -05:00
|
|
|
class Ppu
|
|
|
|
{
|
2019-02-15 21:33:13 -05:00
|
|
|
public:
|
|
|
|
constexpr static uint32_t SpriteRamSize = 544;
|
|
|
|
constexpr static uint32_t CgRamSize = 512;
|
|
|
|
constexpr static uint32_t VideoRamSize = 0x10000;
|
|
|
|
|
2019-02-13 13:32:21 -05:00
|
|
|
private:
|
2019-02-13 18:44:39 -05:00
|
|
|
shared_ptr<Console> _console;
|
2019-02-17 15:37:31 -05:00
|
|
|
shared_ptr<InternalRegisters> _regs;
|
2019-02-13 18:44:39 -05:00
|
|
|
|
2019-02-13 13:32:21 -05:00
|
|
|
uint16_t _cycle = 0;
|
|
|
|
uint16_t _scanline = 0;
|
|
|
|
uint32_t _frameCount = 0;
|
2019-02-17 01:09:47 -05:00
|
|
|
|
2019-02-17 00:32:41 -05:00
|
|
|
uint8_t _bgMode = 0;
|
|
|
|
LayerConfig _layerConfig[4];
|
|
|
|
|
2019-02-17 15:37:31 -05:00
|
|
|
bool _nmiFlag = false;
|
|
|
|
|
2019-02-13 18:44:39 -05:00
|
|
|
uint8_t *_vram;
|
|
|
|
uint16_t _vramAddress;
|
|
|
|
uint8_t _vramIncrementValue;
|
|
|
|
uint8_t _vramAddressRemapping;
|
|
|
|
bool _vramAddrIncrementOnSecondReg;
|
|
|
|
|
|
|
|
uint16_t _cgramAddress;
|
2019-02-15 21:33:13 -05:00
|
|
|
uint8_t _cgram[Ppu::CgRamSize];
|
|
|
|
|
|
|
|
uint8_t _spriteRam[Ppu::SpriteRamSize];
|
2019-02-13 13:32:21 -05:00
|
|
|
|
2019-02-13 18:44:39 -05:00
|
|
|
uint16_t *_outputBuffers[2];
|
|
|
|
uint16_t *_currentBuffer;
|
2019-02-13 13:32:21 -05:00
|
|
|
|
2019-02-17 00:32:41 -05:00
|
|
|
void RenderTilemap(LayerConfig & config, uint8_t bpp);
|
2019-02-13 23:03:01 -05:00
|
|
|
|
2019-02-13 18:44:39 -05:00
|
|
|
public:
|
|
|
|
Ppu(shared_ptr<Console> console);
|
2019-02-16 01:16:57 -05:00
|
|
|
~Ppu();
|
2019-02-13 13:32:21 -05:00
|
|
|
|
2019-02-13 18:44:39 -05:00
|
|
|
PpuState GetState();
|
2019-02-13 13:32:21 -05:00
|
|
|
|
2019-02-13 18:44:39 -05:00
|
|
|
void Exec();
|
2019-02-13 13:32:21 -05:00
|
|
|
|
2019-02-13 18:44:39 -05:00
|
|
|
void SendFrame();
|
2019-02-13 13:32:21 -05:00
|
|
|
|
2019-02-15 21:33:13 -05:00
|
|
|
uint8_t* GetVideoRam();
|
|
|
|
uint8_t* GetCgRam();
|
|
|
|
uint8_t* GetSpriteRam();
|
|
|
|
|
2019-02-13 18:44:39 -05:00
|
|
|
uint8_t Read(uint16_t addr);
|
|
|
|
void Write(uint32_t addr, uint8_t value);
|
2019-02-13 13:32:21 -05:00
|
|
|
};
|