NESEmulator/NES Emulator/ppu.h
2021-10-30 19:42:17 +02:00

219 lines
3 KiB
C

#ifndef _PPU_H_
#define _PPU_H_
#include "types.h"
#include "SDL.h"
struct Bus;
struct Pixel
{
Byte r;
Byte g;
Byte b;
};
struct FIFO16
{
union
{
struct
{
Byte lo;
Byte hi;
};
Word data;
};
};
union OAMEntry
{
struct
{
Byte y;
Byte tile;
Byte attr;
Byte x;
};
DWord raw;
};
struct PPU
{
////////////////////////////////////////
/// REGISTERS ///
////////////////////////////////////////
union
{
struct
{
Byte nametable : 2;
Byte increment : 1;
Byte spriteTile : 1;
Byte bgTile : 1;
Byte spriteHeight : 1;
Byte master : 1;
Byte nmiEnable : 1;
};
Byte raw;
} ppuCtrl;
union
{
struct
{
Byte greyscale : 1;
Byte bgLeftColumn : 1;
Byte spriteLeftColumn : 1;
Byte bgEnable : 1;
Byte spriteEnable : 1;
Byte colorEmphasis : 3;
};
Byte raw;
} ppuMask;
union
{
struct
{
Byte padding : 5;
Byte overflow : 1;
Byte spriteZeroHit : 1;
Byte vBlank : 1;
};
Byte raw;
} ppuStatus;
Byte oamaddr;
Byte oamdata;
////////////////////////////////////////
/// PSEUDO REGISTERS ///
////////////////////////////////////////
Byte scrollX, scrollY;
Byte scrollWriteTarget;
union
{
struct
{
Byte lo;
Byte hi;
};
Word raw;
} ppuAddress;
Byte ppuAddressWriteTarget;
Byte ppuReadLatch;
Byte oamdma;
////////////////////////////////////////
/// VRAM ///
////////////////////////////////////////
Byte* nameTables[2];
SDL_Texture* nameTableTextures[2];
SDL_Texture* renderedNameTableTextures[2];
Byte mirroring;
Byte* paletteIndexes;
////////////////////////////////////////
/// PHASE TRACKERS ///
////////////////////////////////////////
enum
{
Visible,
PostRender,
VBlank,
PreRender,
VerticalPhaseSize
} verticalPhase;
enum
{
Idle,
Fetching,
SpriteFetching,
NextLineFetching,
Unknown,
HorizontalPhaseSize
} horizontalPhase;
Byte remainingCycles;
enum
{
Nametable,
Attribute,
PatternLow,
PatternHigh,
FetchingPhaseSize
} fetchingPhase;
////////////////////////////////////////
/// TILE DATA ///
////////////////////////////////////////
struct
{
Byte x;
Byte y;
} nametablePos;
Byte tilePosY;
struct
{
Byte nametable;
Byte attribute;
union
{
struct {
Byte lo;
Byte hi;
};
Word raw;
} tile;
} tileData;
struct FIFO16 loPatternFIFO;
struct FIFO16 hiPatternFIFO;
union OAMEntry* oam;
Word x, y;
struct Pixel* pixels;
SDL_Texture* screen;
struct Bus* bus;
};
struct PPU* createPPU(struct Bus* parent);
void destroyPPU(struct PPU* ppu);
Byte ppuRead(struct PPU* ppu, Word addr);
void ppuWrite(struct PPU* ppu, Word addr, Byte val);
int tickPPU(struct PPU* ppu);
SDL_Texture* getNameTableTexture(struct PPU* ppu, int index);
SDL_Texture* getScreenTexture(struct PPU* ppu);
SDL_Texture* getRenderedNameTableTexture(struct PPU* ppu, int index);
#endif // _PPU_H_