219 lines
3 KiB
C
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_
|