From 66f7babe86983abbf6006f1ba5175956413f9123 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Sun, 26 Dec 2021 15:50:24 +0200 Subject: [PATCH] Cache the clock rate --- Core/gb.c | 29 ++++++++++++++++++++--------- Core/gb.h | 3 +++ Core/save_state.c | 1 + 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Core/gb.c b/Core/gb.c index a98b08f..bb08cf5 100644 --- a/Core/gb.c +++ b/Core/gb.c @@ -1591,6 +1591,7 @@ void GB_reset(GB_gameboy_t *gb) { uint32_t mbc_ram_size = gb->mbc_ram_size; GB_model_t model = gb->model; + GB_update_clock_rate(gb); uint8_t rtc_section[GB_SECTION_SIZE(rtc)]; memcpy(rtc_section, GB_GET_SECTION(gb, rtc), sizeof(rtc_section)); memset(gb, 0, (size_t)GB_GET_SECTION((GB_gameboy_t *) 0, unsaved)); @@ -1756,24 +1757,34 @@ GB_registers_t *GB_get_registers(GB_gameboy_t *gb) void GB_set_clock_multiplier(GB_gameboy_t *gb, double multiplier) { gb->clock_multiplier = multiplier; + GB_update_clock_rate(gb); } uint32_t GB_get_clock_rate(GB_gameboy_t *gb) { - return GB_get_unmultiplied_clock_rate(gb) * gb->clock_multiplier; + return gb->clock_rate; } - uint32_t GB_get_unmultiplied_clock_rate(GB_gameboy_t *gb) { - if (gb->model & GB_MODEL_PAL_BIT) { - return SGB_PAL_FREQUENCY; - } - if ((gb->model & ~GB_MODEL_NO_SFC_BIT) == GB_MODEL_SGB) { - return SGB_NTSC_FREQUENCY; - } - return CPU_FREQUENCY; + return gb->unmultiplied_clock_rate; } + +void GB_update_clock_rate(GB_gameboy_t *gb) +{ + if (gb->model & GB_MODEL_PAL_BIT) { + gb->unmultiplied_clock_rate = SGB_PAL_FREQUENCY; + } + else if ((gb->model & ~GB_MODEL_NO_SFC_BIT) == GB_MODEL_SGB) { + gb->unmultiplied_clock_rate = SGB_NTSC_FREQUENCY; + } + else { + gb->unmultiplied_clock_rate = CPU_FREQUENCY; + } + + gb->clock_rate = gb->unmultiplied_clock_rate * gb->clock_multiplier; +} + void GB_set_border_mode(GB_gameboy_t *gb, GB_border_mode_t border_mode) { if (gb->border_mode > GB_BORDER_ALWAYS) return; diff --git a/Core/gb.h b/Core/gb.h index 54fa0f3..de1b4aa 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -667,6 +667,8 @@ struct GB_gameboy_internal_s { uint64_t cycles_since_last_sync; // In 8MHz units GB_rtc_mode_t rtc_mode; uint32_t rtc_second_length; + uint32_t clock_rate; + uint32_t unmultiplied_clock_rate; /* Audio */ GB_apu_output_t apu_output; @@ -918,6 +920,7 @@ uint32_t GB_get_rom_crc32(GB_gameboy_t *gb); #ifdef GB_INTERNAL internal void GB_borrow_sgb_border(GB_gameboy_t *gb); +internal void GB_update_clock_rate(GB_gameboy_t *gb); #endif #endif /* GB_h */ diff --git a/Core/save_state.c b/Core/save_state.c index 4dc304e..d5297b5 100644 --- a/Core/save_state.c +++ b/Core/save_state.c @@ -383,6 +383,7 @@ static void sanitize_state(GB_gameboy_t *gb) } gb->sgb->current_player &= gb->sgb->player_count - 1; } + GB_update_clock_rate(gb); } static bool dump_section(virtual_file_t *file, const void *src, uint32_t size)