From 4b03cc05c1ab5b94cebf50b90bb8b187875b91b6 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Sun, 24 Jul 2022 13:16:19 +0300 Subject: [PATCH] Optimization to joypad code --- Core/gb.h | 1 + Core/joypad.c | 7 +++++++ Core/memory.c | 1 + 3 files changed, 9 insertions(+) diff --git a/Core/gb.h b/Core/gb.h index c5404a5..63f02fe 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -689,6 +689,7 @@ struct GB_gameboy_internal_s { bool joyp_accessed; bool illegal_inputs_allowed; bool no_bouncing_emulation; + bool joypad_is_stable; /* Timing */ uint64_t last_sync; diff --git a/Core/joypad.c b/Core/joypad.c index b4e3cf9..2f47c60 100644 --- a/Core/joypad.c +++ b/Core/joypad.c @@ -132,6 +132,7 @@ void GB_set_key_state_for_player(GB_gameboy_t *gb, GB_key_t index, unsigned play assert(index >= 0 && index < GB_KEY_MAX); assert(player < 4); if (should_bounce(gb) && pressed != gb->keys[player][index]) { + gb->joypad_is_stable = false; gb->key_bounce_timing[index] = bounce_for_key(gb, index); } gb->keys[player][index] = pressed; @@ -143,6 +144,7 @@ void GB_set_key_mask(GB_gameboy_t *gb, GB_key_mask_t mask) for (unsigned i = 0; i < GB_KEY_MAX; i++) { bool pressed = mask & (1 << i); if (should_bounce(gb) && pressed != gb->keys[0][i]) { + gb->joypad_is_stable = false; gb->key_bounce_timing[i] = bounce_for_key(gb, i); } gb->keys[0][i] = pressed; @@ -156,6 +158,7 @@ void GB_set_key_mask_for_player(GB_gameboy_t *gb, GB_key_mask_t mask, unsigned p for (unsigned i = 0; i < GB_KEY_MAX; i++) { bool pressed = mask & (1 << i); if (should_bounce(gb) && pressed != gb->keys[player][i]) { + gb->joypad_is_stable = false; gb->key_bounce_timing[i] = bounce_for_key(gb, i); } gb->keys[player][i] = pressed; @@ -166,8 +169,11 @@ void GB_set_key_mask_for_player(GB_gameboy_t *gb, GB_key_mask_t mask, unsigned p void GB_joypad_run(GB_gameboy_t *gb, unsigned cycles) { + if (gb->joypad_is_stable) return; bool should_update_joyp = false; + gb->joypad_is_stable = true; if (gb->joyp_switching_delay) { + gb->joypad_is_stable = false; if (gb->joyp_switching_delay > cycles) { gb->joyp_switching_delay -= cycles; } @@ -180,6 +186,7 @@ void GB_joypad_run(GB_gameboy_t *gb, unsigned cycles) for (unsigned i = 0; i < GB_KEY_MAX; i++) { if (gb->key_bounce_timing[i]) { + gb->joypad_is_stable = false; should_update_joyp = true; if (gb->key_bounce_timing[i] > cycles) { gb->key_bounce_timing[i] -= cycles; diff --git a/Core/memory.c b/Core/memory.c index 6bbc949..8c454cf 100644 --- a/Core/memory.c +++ b/Core/memory.c @@ -1508,6 +1508,7 @@ static void write_high_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) gb->joyp_switch_value = value; gb->joyp_switching_delay = 24; value &= gb->io_registers[GB_IO_JOYP]; + gb->joypad_is_stable = false; } GB_sgb_write(gb, value); gb->io_registers[GB_IO_JOYP] = (value & 0xF0) | (gb->io_registers[GB_IO_JOYP] & 0x0F);