60 lines
1.5 KiB
C
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()->lcdc |= 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); |