From c87f77ab82aedcc174dd67a4486b5bc601f92759 Mon Sep 17 00:00:00 2001 From: taoenwen <67533945+taoenwen@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:09:14 +0800 Subject: [PATCH] Optimized keyboard input --- src/burn/devices/joyprocess.h | 36 ++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/burn/devices/joyprocess.h b/src/burn/devices/joyprocess.h index 03ec4577b..4a7910b5f 100644 --- a/src/burn/devices/joyprocess.h +++ b/src/burn/devices/joyprocess.h @@ -115,29 +115,47 @@ struct HoldCoin { template struct ClearOpposite { - T prev[N<<2]; + T prev[N << 2], prev_a[N << 2], prev_b[N << 2]; void reset() { - memset(&prev, 0, sizeof(prev)); + memset(&prev, 0, sizeof(prev)); + memset(&prev_a, 0, sizeof(prev_a)); + memset(&prev_b, 0, sizeof(prev_b)); } void scan() { SCAN_VAR(prev); + SCAN_VAR(prev_a); + SCAN_VAR(prev_b); } void checkval(UINT8 n, T &inp, T val_a, T val_b) { - // When opposites become pressed simultaneously, and a 3rd direction isn't pressed - // remove the previously stored direction if it exists, cancel both otherwise if ((inp & val_a) == val_a) - inp &= (prev[n] && (inp & val_b) == 0 ? (inp ^ prev[n]) : ~val_a); - // Store direction anytime it's pressed without its opposite + inp &= (inp ^ prev_a[n]); else if (inp & val_a) - prev[n] = inp & val_a; + prev_a[n] = inp & val_a; + if ((inp & val_b) == val_b) + inp &= (inp ^ prev_b[n]); + else if (inp & val_b) + prev_b[n] = inp & val_b; + + if ((inp & val_a) == val_a) + inp &= ~val_a; + if ((inp & val_b) == val_b) + inp &= ~val_b; + + // Handling cross-frame conflicts + if (((inp | prev[n]) & val_a) == val_a) + inp &= ~val_a; + if (((inp | prev[n]) & val_b) == val_b) + inp &= ~val_b; + + prev[n] = inp; } void check(UINT8 num, T &inp, T val1, T val2) { - checkval((num<<1) , inp, val1, val2); - checkval((num<<1)+1, inp, val2, val1); + checkval((num<<1), inp, val1, val2); + checkval((num << 1) | 1, inp, val2, val1); } };