From cdc3321c3613911d3e91a8f7c5713461466bb47e Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Sun, 19 Dec 2021 00:28:24 +0200 Subject: [PATCH] Add an API to allow illegal inputs --- Core/gb.h | 1 + Core/joypad.c | 17 ++++++++++++----- Core/joypad.h | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Core/gb.h b/Core/gb.h index bcd98c4..9af5a53 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -657,6 +657,7 @@ struct GB_gameboy_internal_s { bool objects_disabled; bool background_disabled; bool joyp_accessed; + bool illegal_inputs_allowed; /* Timing */ uint64_t last_sync; diff --git a/Core/joypad.c b/Core/joypad.c index f16aa9e..3527742 100644 --- a/Core/joypad.c +++ b/Core/joypad.c @@ -30,11 +30,13 @@ void GB_update_joyp(GB_gameboy_t *gb) gb->io_registers[GB_IO_JOYP] |= (!gb->keys[current_player][i]) << i; } /* Forbid pressing two opposing keys, this breaks a lot of games; even if it's somewhat possible. */ - if (!(gb->io_registers[GB_IO_JOYP] & 1)) { - gb->io_registers[GB_IO_JOYP] |= 2; - } - if (!(gb->io_registers[GB_IO_JOYP] & 4)) { - gb->io_registers[GB_IO_JOYP] |= 8; + if (likely(!gb->illegal_inputs_allowed)) { + if (!(gb->io_registers[GB_IO_JOYP] & 1)) { + gb->io_registers[GB_IO_JOYP] |= 2; + } + if (!(gb->io_registers[GB_IO_JOYP] & 4)) { + gb->io_registers[GB_IO_JOYP] |= 8; + } } break; @@ -131,3 +133,8 @@ void GB_clear_joyp_accessed(GB_gameboy_t *gb) { gb->joyp_accessed = false; } + +void GB_set_allow_illegal_inputs(GB_gameboy_t *gb, bool allow) +{ + gb->illegal_inputs_allowed = allow; +} diff --git a/Core/joypad.h b/Core/joypad.h index a360af1..21574e0 100644 --- a/Core/joypad.h +++ b/Core/joypad.h @@ -36,6 +36,7 @@ void GB_set_key_mask_for_player(GB_gameboy_t *gb, GB_key_mask_t mask, unsigned p void GB_icd_set_joyp(GB_gameboy_t *gb, uint8_t value); bool GB_get_joyp_accessed(GB_gameboy_t *gb); void GB_clear_joyp_accessed(GB_gameboy_t *gb); +void GB_set_allow_illegal_inputs(GB_gameboy_t *gb, bool allow); #ifdef GB_INTERNAL