From a30247cf16445fc99dafaca6328ee65e5502a806 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Fri, 10 Dec 2021 19:49:52 +0200 Subject: [PATCH] LCD line callback (for #422) --- Core/display.c | 10 ++++++++++ Core/gb.c | 5 +++++ Core/gb.h | 5 ++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Core/display.c b/Core/display.c index caf517c..f1f474e 100644 --- a/Core/display.c +++ b/Core/display.c @@ -456,6 +456,10 @@ void GB_lcd_off(GB_gameboy_t *gb) gb->accessed_oam_row = -1; gb->wy_triggered = false; + + if (unlikely(gb->lcd_line_callback)) { + gb->lcd_line_callback(gb, 0); + } } static void add_object_from_index(GB_gameboy_t *gb, unsigned index) @@ -983,6 +987,9 @@ void GB_display_run(GB_gameboy_t *gb, uint8_t cycles) /* Lines 0 - 143 */ gb->window_y = -1; for (; gb->current_line < LINES; gb->current_line++) { + if (unlikely(gb->lcd_line_callback)) { + gb->lcd_line_callback(gb, gb->current_line); + } gb->oam_write_blocked = GB_is_cgb(gb) && !gb->cgb_double_speed; gb->accessed_oam_row = 0; @@ -1343,6 +1350,9 @@ abort_fetching_object: for (; gb->current_line < VIRTUAL_LINES - 1; gb->current_line++) { gb->io_registers[GB_IO_LY] = gb->current_line; gb->ly_for_comparison = -1; + if (unlikely(gb->lcd_line_callback)) { + gb->lcd_line_callback(gb, gb->current_line); + } GB_SLEEP(gb, display, 26, 2); if (gb->current_line == LINES && !gb->stat_interrupt_line && (gb->io_registers[GB_IO_STAT] & 0x20)) { gb->io_registers[GB_IO_IF] |= 2; diff --git a/Core/gb.c b/Core/gb.c index d177822..cc85c92 100644 --- a/Core/gb.c +++ b/Core/gb.c @@ -1211,6 +1211,11 @@ void GB_set_execution_callback(GB_gameboy_t *gb, GB_execution_callback_t callbac gb->execution_callback = callback; } +void GB_set_lcd_line_callback(GB_gameboy_t *gb, GB_lcd_line_callback_t callback) +{ + gb->lcd_line_callback = callback; +} + const GB_palette_t GB_PALETTE_GREY = {{{0x00, 0x00, 0x00}, {0x55, 0x55, 0x55}, {0xaa, 0xaa, 0xaa}, {0xff, 0xff, 0xff}, {0xff, 0xff, 0xff}}}; const GB_palette_t GB_PALETTE_DMG = {{{0x08, 0x18, 0x10}, {0x39, 0x61, 0x39}, {0x84, 0xa5, 0x63}, {0xc6, 0xde, 0x8c}, {0xd2, 0xe6, 0xa6}}}; const GB_palette_t GB_PALETTE_MGB = {{{0x07, 0x10, 0x0e}, {0x3a, 0x4c, 0x3a}, {0x81, 0x8d, 0x66}, {0xc2, 0xce, 0x93}, {0xcf, 0xda, 0xac}}}; diff --git a/Core/gb.h b/Core/gb.h index 872ab19..d5a6471 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -284,6 +284,7 @@ typedef void (*GB_icd_vreset_callback_t)(GB_gameboy_t *gb); typedef void (*GB_boot_rom_load_callback_t)(GB_gameboy_t *gb, GB_boot_rom_t type); typedef void (*GB_execution_callback_t)(GB_gameboy_t *gb, uint16_t address, uint8_t opcode); +typedef void (*GB_lcd_line_callback_t)(GB_gameboy_t *gb, uint8_t line); struct GB_breakpoint_s; struct GB_watchpoint_s; @@ -668,6 +669,7 @@ struct GB_gameboy_internal_s { GB_workboy_set_time_callback workboy_set_time_callback; GB_workboy_get_time_callback workboy_get_time_callback; GB_execution_callback_t execution_callback; + GB_lcd_line_callback_t lcd_line_callback; /*** Debugger ***/ volatile bool debug_stopped, debug_disable; @@ -843,7 +845,8 @@ void GB_set_update_input_hint_callback(GB_gameboy_t *gb, GB_update_input_hint_ca void GB_set_boot_rom_load_callback(GB_gameboy_t *gb, GB_boot_rom_load_callback_t callback); void GB_set_execution_callback(GB_gameboy_t *gb, GB_execution_callback_t callback); - +void GB_set_lcd_line_callback(GB_gameboy_t *gb, GB_lcd_line_callback_t callback); + void GB_set_palette(GB_gameboy_t *gb, const GB_palette_t *palette); /* These APIs are used when using internal clock */