From 4a2cb26f5689fa3a64a82dd982e7bc318336f47c Mon Sep 17 00:00:00 2001 From: Honza Slesinger Date: Thu, 10 Apr 2025 22:51:57 +0200 Subject: [PATCH] issue #493 fix for 128D and 128DCR --- software/io/c64/keyboard_c64.cc | 53 ++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/software/io/c64/keyboard_c64.cc b/software/io/c64/keyboard_c64.cc index d8de1e253..141b9f716 100644 --- a/software/io/c64/keyboard_c64.cc +++ b/software/io/c64/keyboard_c64.cc @@ -178,23 +178,48 @@ void Keyboard_C64 :: scan(void) shift_prev = 0xFF; return; } - - if((shift_flag == shift_prev) && (mtrx_prev == mtrx)) { // this key was pressed before - if (delay_count == 0) { - delay_count = repeat_speed; - // do not return, store char + + // Special handling for the RETURN key - make it more responsive on C128D machines + // RETURN key is in keymap_normal[1] or on specific matrix coordinates + if(key == KEY_RETURN) { + // For RETURN key, reduce the debounce delay to make it more responsive + if((shift_flag == shift_prev) && (mtrx_prev == mtrx)) { + // RETURN key was pressed before, don't wait as long for repeat + if (delay_count <= 1) { // Use a shorter threshold for RETURN key + delay_count = repeat_speed / 2; // Use half the repeat delay for RETURN + // Continue to store the key below + } else { + delay_count = delay_count - 2; // Decrease the delay counter faster + if (delay_count <= 0) { + delay_count = 0; // Prevent underflow + } + // Continue to store the key + } } else { - delay_count = delay_count - 1; + // First time RETURN key was pressed + delay_count = first_delay / 2; // Half the initial delay for RETURN + mtrx_prev = mtrx; + shift_prev = shift_flag; + } + } else { + // Normal handling for other keys + if((shift_flag == shift_prev) && (mtrx_prev == mtrx)) { // this key was pressed before + if (delay_count == 0) { + delay_count = repeat_speed; + // do not return, store char + } else { + delay_count = delay_count - 1; + return; + } + } else if(mtrx == mtrx_prev) { // same key, but modifier changed.. ignore! (for some time) + delay_count = first_delay; + shift_prev = shift_flag; return; + } else { // first time this key was pressed + delay_count = first_delay; + mtrx_prev = mtrx; + shift_prev = shift_flag; } - } else if(mtrx == mtrx_prev) { // same key, but modifier changed.. ignore! (for some time) - delay_count = first_delay; - shift_prev = shift_flag; - return; - } else { // first time this key was pressed - delay_count = first_delay; - mtrx_prev = mtrx; - shift_prev = shift_flag; } // printf("%b ", key);