ref: ce49c3f9d82b95fd032a5903a67465dfab357a9a
dir: /snes/ppu.h/
#ifndef PPU_H #define PPU_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <stdbool.h> typedef struct Ppu Ppu; #include "snes.h" typedef struct BgLayer { uint16_t hScroll; uint16_t vScroll; bool tilemapWider; bool tilemapHigher; uint16_t tilemapAdr; uint16_t tileAdr; bool bigTiles_always_zero; bool mosaicEnabled; } BgLayer; typedef struct Layer { bool screenEnabled[2]; // 0 = main, 1 = sub bool screenWindowed[2]; // 0 = main, 1 = sub } Layer; typedef struct WindowLayer { bool window1enabled; bool window2enabled; bool window1inversed; bool window2inversed; uint8_t maskLogic_always_zero; } WindowLayer; struct Ppu { Snes* snes; // vram access uint16_t vram[0x8000]; uint16_t vramPointer; bool vramIncrementOnHigh; uint16_t vramIncrement; uint8_t vramRemapMode; uint16_t vramReadBuffer; // cgram access uint16_t cgram[0x100]; uint8_t cgramPointer; bool cgramSecondWrite; uint8_t cgramBuffer; // oam access uint16_t oam[0x100]; uint8_t highOam[0x20]; uint8_t oamAdr; uint8_t oamAdrWritten; bool oamInHigh; bool oamInHighWritten; bool oamSecondWrite; uint8_t oamBuffer; // object/sprites bool objPriority; uint16_t objTileAdr1; uint16_t objTileAdr2; uint8_t objSize; uint8_t objPixelBuffer[256]; // line buffers uint8_t objPriorityBuffer[256]; bool timeOver; bool rangeOver; bool objInterlace_always_zero; // background layers BgLayer bgLayer[4]; uint8_t scrollPrev; uint8_t scrollPrev2; uint8_t mosaicSize; uint8_t mosaicStartLine; // layers Layer layer[5]; // mode 7 int16_t m7matrix[8]; // a, b, c, d, x, y, h, v uint8_t m7prev; bool m7largeField; bool m7charFill; bool m7xFlip; bool m7yFlip; bool m7extBg_always_zero; // mode 7 internal int32_t m7startX; int32_t m7startY; // windows WindowLayer windowLayer[6]; uint8_t window1left; uint8_t window1right; uint8_t window2left; uint8_t window2right; // color math uint8_t clipMode; uint8_t preventMathMode; bool addSubscreen; bool subtractColor; bool halfColor; bool mathEnabled[6]; uint8_t fixedColorR; uint8_t fixedColorG; uint8_t fixedColorB; // settings bool forcedBlank; uint8_t brightness; uint8_t mode; bool bg3priority; bool evenFrame; bool pseudoHires_always_zero; bool overscan_always_zero; bool frameOverscan_always_zero; // if we are overscanning this frame (determined at 0,225) bool interlace_always_zero; bool frameInterlace_always_zero; // if we are interlacing this frame (determined at start vblank) bool directColor_always_zero; // latching uint16_t hCount; uint16_t vCount; bool hCountSecond; bool vCountSecond; bool countersLatched; uint8_t ppu1openBus; uint8_t ppu2openBus; // pixel buffer (xbgr) // times 2 for even and odd frame uint8_t pixelBuffer[512 * 4 * 239 * 2]; }; Ppu* ppu_init(Snes* snes); void ppu_free(Ppu* ppu); void ppu_reset(Ppu* ppu); void ppu_handleVblank(Ppu* ppu); void ppu_runLine(Ppu* ppu, int line); uint8_t ppu_read(Ppu* ppu, uint8_t adr); void ppu_write(Ppu* ppu, uint8_t adr, uint8_t val); void ppu_putPixels(Ppu* ppu, uint8_t* pixels); void ppu_saveload(Ppu *ppu, SaveLoadFunc *func, void *ctx); #endif