From 1bc6c13e6bbf341953530f49ec2bc9ce3428bca5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 17 Sep 2017 16:46:10 -0700 Subject: [PATCH] GBA: Fix keypad IRQs not firing when extra buttons are pressed --- CHANGES | 1 + src/gba/core.c | 1 - src/gba/gba.c | 6 ++---- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index df0252200..7cbcf633f 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,7 @@ Bugfixes: - GBA BIOS: Use core's VRAM variable instead of renderer's - GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes mgba.io/i/877) - SDL: Fix potential race condition when pressing keys (fixes mgba.io/i/872) + - GBA: Fix keypad IRQs not firing when extra buttons are pressed Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gba/core.c b/src/gba/core.c index 766d0b67a..aa7cdaeea 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -491,7 +491,6 @@ static void _GBACoreAddKeys(struct mCore* core, uint32_t keys) { static void _GBACoreClearKeys(struct mCore* core, uint32_t keys) { struct GBACore* gbacore = (struct GBACore*) core; gbacore->keys &= ~keys; - GBATestKeypadIRQ(core->board); } static int32_t _GBACoreFrameCounter(const struct mCore* core) { diff --git a/src/gba/gba.c b/src/gba/gba.c index 836e0dede..9073c5233 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -755,19 +755,17 @@ void GBATestKeypadIRQ(struct GBA* gba) { return; } int isAnd = keycnt & 0x8000; - uint16_t keyInput; - if (!gba->keySource) { // TODO? return; } keycnt &= 0x3FF; - keyInput = *gba->keySource; + uint16_t keyInput = *gba->keySource & keycnt; if (isAnd && keycnt == keyInput) { GBARaiseIRQ(gba, IRQ_KEYPAD); - } else if (!isAnd && keycnt & keyInput) { + } else if (!isAnd && keyInput) { GBARaiseIRQ(gba, IRQ_KEYPAD); } }