2025-02-01 00:48:49 -07:00
|
|
|
#include <lcd.h>
|
|
|
|
#include <ppu.h>
|
|
|
|
#include <dma.h>
|
|
|
|
|
|
|
|
static lcd_context ctx;
|
|
|
|
|
2025-02-19 10:20:45 -07:00
|
|
|
static unsigned long colors_default[4] = {0xFF759833, 0xFF588F51, 0xFF3B7560, 0xFF2E615A};
|
2025-02-01 00:48:49 -07:00
|
|
|
|
|
|
|
lcd_context *lcd_get_context() {
|
|
|
|
return &ctx;
|
|
|
|
}
|
|
|
|
|
|
|
|
void lcd_init() {
|
|
|
|
ctx.lcdc = 0x91;
|
|
|
|
ctx.scroll_x = 0;
|
|
|
|
ctx.scroll_y = 0;
|
|
|
|
ctx.ly = 0;
|
|
|
|
ctx.ly_compare = 0;
|
|
|
|
ctx.bg_palette = 0xFC;
|
|
|
|
ctx.obj_palette[0] = 0xFF;
|
|
|
|
ctx.obj_palette[1] = 0xFF;
|
|
|
|
ctx.win_x = 0;
|
|
|
|
ctx.win_y = 0;
|
|
|
|
|
|
|
|
for(int i = 0; i < 4; i++) {
|
|
|
|
ctx.bg_colors[i] = colors_default[i];
|
|
|
|
ctx.sp1_colors[i] = colors_default[i];
|
|
|
|
ctx.sp2_colors[i] = colors_default[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
u8 lcd_read(u16 address) {
|
|
|
|
u8 offset = (address - 0xFF40);
|
|
|
|
u8 *p = (u8 *)&ctx;
|
|
|
|
return p[offset];
|
|
|
|
}
|
|
|
|
|
|
|
|
void update_palette(u8 palette_data, u8 pal) {
|
|
|
|
u32 *p_colors = ctx.bg_colors;
|
|
|
|
|
|
|
|
switch(pal) {
|
|
|
|
case 1:
|
|
|
|
p_colors = ctx.sp1_colors;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
p_colors = ctx.sp2_colors;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
p_colors[0] = colors_default[palette_data & 0b11];
|
|
|
|
p_colors[1] = colors_default[(palette_data >> 2) & 0b11];
|
|
|
|
p_colors[2] = colors_default[(palette_data >> 4) & 0b11];
|
|
|
|
p_colors[3] = colors_default[(palette_data >> 6) & 0b11];
|
|
|
|
}
|
|
|
|
|
|
|
|
void lcd_write(u16 address, u8 value) {
|
|
|
|
u8 offset = (address - 0xFF40);
|
|
|
|
u8 *p = (u8 *)&ctx;
|
|
|
|
p[offset] = value;
|
|
|
|
|
2025-02-18 22:39:56 -07:00
|
|
|
if(offset == 2) {
|
2025-02-19 07:34:36 -07:00
|
|
|
//printf("YScroll: %02X\n", value);
|
2025-02-18 22:39:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if(offset == 0xA) {
|
2025-02-19 07:34:36 -07:00
|
|
|
//printf("WinY: %02X\n", value);
|
2025-02-18 22:39:56 -07:00
|
|
|
}
|
|
|
|
|
2025-02-01 00:48:49 -07:00
|
|
|
if(offset == 6) {
|
|
|
|
//offset FF64
|
|
|
|
dma_start(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(offset == 7) {
|
|
|
|
update_palette(value, 0);
|
|
|
|
} else if(offset == 8) {
|
|
|
|
update_palette(value & 0b11111100, 1);
|
|
|
|
} else if(offset == 9) {
|
|
|
|
update_palette(value & 0b11111100, 2);
|
|
|
|
}
|
|
|
|
}
|