#pragma once #include #include "util.hpp" class Bus; typedef union { BYTE b; struct { BYTE mode : 2; BYTE coincidence : 1; BYTE mode0 : 1; BYTE mode1 : 1; BYTE mode2 : 1; BYTE lyc : 1; } w; } STAT; typedef union { BYTE b; struct { BYTE priority : 1; BYTE obj_enable : 1; BYTE obj_size : 1; BYTE bg_tilemap : 1; BYTE tiledata : 1; BYTE window : 1; BYTE window_tilemap : 1; BYTE enable : 1; } w; } LCDC; typedef union { WORD w; struct { BYTE lo, hi; } b; } LCDRegister; typedef struct { WORD sprite; WORD highByte, lowByte; WORD full; } PixelFIFO; typedef struct { WORD tile; BYTE cycle; BYTE x, y; BYTE lo, hi; } PixelFetcher; typedef union { QWORD q; struct { BYTE y; BYTE x; BYTE idx; struct { BYTE padding : 4; BYTE palette : 1; BYTE xFlip : 1; BYTE yFlip : 1; BYTE bgPriority : 1; } attr; } b; } OAMEntry; class LCD { public: void Setup(); void Tick(); BYTE& GetReferenceToAddress(WORD addr, bool& handled); bool Read(WORD addr, BYTE& val); bool Write(WORD addr, BYTE val); DWORD cycles; WORD scanlineCycles; friend class Bus; friend class CPU; public: std::array display; std::array vram; std::array oam; public: Bus* bus; // Registers LCDC lcdc; STAT stat; BYTE scy; BYTE scx; BYTE ly; BYTE lyc; BYTE wy; BYTE wx; BYTE bgp; BYTE obp0; BYTE obp1; BYTE dma; PixelFetcher fetcher; PixelFIFO bgFIFO; PixelFIFO spriteFIFO; BYTE x; BYTE dmaCycles; };