gbemu/include/lcd.h

60 lines
1.5 KiB
C

#pragma once
#include <common.h>
typedef struct {
//registers
u8 lcdc;
u8 lcds;
u8 scroll_y;
u8 scroll_x;
u8 ly;
u8 ly_compare;
u8 dma;
u8 bg_palette;
u8 obj_palette[2];
u8 win_y;
u8 win_x;
//other data...
u32 bg_colors[4];
u32 sp1_colors[4];
u32 sp2_colors[4];
} lcd_context;
typedef enum {
MODE_HBLANK,
MODE_VBLANK,
MODE_OAM,
MODE_XFER
} lcd_mode;
lcd_context *lcd_get_context();
#define LCDC_BGW_ENABLE (BIT(lcd_get_context()->lcdc, 0))
#define LCDC_OBJ_ENABLE (BIT(lcd_get_context()->lcdc, 1))
#define LCDC_OBJ_HEIGHT (BIT(lcd_get_context()->lcdc, 2) ? 16 : 8)
#define LCDC_BG_MAP_AREA (BIT(lcd_get_context()->lcdc, 3) ? 0x9C00 : 0x9800)
#define LCDC_BGW_DATA_AREA (BIT(lcd_get_context()->lcdc, 4) ? 0x8000 : 0x8800)
#define LCDC_WIN_ENABLE (BIT(lcd_get_context()->lcdc, 5))
#define LCDC_WIN_MAP_AREA (BIT(lcd_get_context()->lcdc, 6) ? 0x9C00 : 0x9800)
#define LCDC_LCD_ENABLE (BIT(lcd_get_context()->lcdc, 7))
#define LCDS_MODE ((lcd_mode)(lcd_get_context()->lcds & 0b11))
#define LCDS_MODE_SET(mode) { lcd_get_context()->lcds &= ~0b11; lcd_get_context()->lcds |= mode; }
#define LCDS_LYC (BIT(lcd_get_context()->lcds, 2))
#define LCDS_LYC_SET(b) BIT_SET(lcd_get_context()->lcds, 2, b)
typedef enum {
SS_HBLANK = (1 << 3),
SS_VBLANK = (1 << 4),
SS_OAM = (1 << 5),
SS_LYC = (1 << 6)
} stat_src;
#define LCDS_STAT_INT(src) (lcd_get_context()->lcds & src)
void lcd_init();
u8 lcd_read(u16 address);
void lcd_write(u16 address, u8 value);