From b2215a464f4806c63f7fa488e8ed321fe322c998 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 11 Mar 2023 19:33:58 +0200 Subject: [PATCH] Keyboard reset behavior change when reset warning is enabled. --- cia.cpp | 6 ++---- include/inputdevice.h | 4 +++- inputdevice.cpp | 47 +++++++++++++++++++++++++++++-------------- od-win32/dinput.cpp | 8 +++----- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/cia.cpp b/cia.cpp index e29039a8..d4be9354 100644 --- a/cia.cpp +++ b/cia.cpp @@ -982,8 +982,7 @@ static void resetwarning_check(void) write_log(_T("KB: reset warning forced reset. Phase=%d\n"), resetwarning_phase); resetwarning_phase = -1; kblostsynccnt = 0; - send_internalevent(INTERNALEVENT_KBRESET); - uae_reset(0, 1); + inputdevice_do_kb_reset(0); } } if (resetwarning_phase == 1) { @@ -1005,8 +1004,7 @@ static void resetwarning_check(void) write_log(_T("KB: reset warning end by software. reset.\n")); resetwarning_phase = -1; kblostsynccnt = 0; - send_internalevent(INTERNALEVENT_KBRESET); - uae_reset(0, 1); + inputdevice_do_kb_reset(0); } } } diff --git a/include/inputdevice.h b/include/inputdevice.h index 18fdeda4..a3b206ed 100644 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -203,6 +203,7 @@ extern int inputdevice_get_device_total (int type); extern int inputdevice_get_widget_num (int devnum); extern int inputdevice_get_widget_type (int devnum, int num, TCHAR *name, bool inccode); extern int send_input_event (int nr, int state, int max, int autofire); +extern void release_keys(void); extern int input_get_default_mouse (struct uae_input_device *uid, int num, int port, int af, bool gp, bool wheel, bool joymouseswap); extern int input_get_default_lightpen (struct uae_input_device *uid, int num, int port, int af, bool gp, bool joymouseswap, int submode); @@ -262,7 +263,8 @@ extern void send_internalevent (int eventid); extern int inputdevice_translatekeycode (int keyboard, int scancode, int state, bool alwaysrelease); extern void inputdevice_checkqualifierkeycode (int keyboard, int scancode, int state); extern void inputdevice_setkeytranslation (struct uae_input_device_kbr_default **trans, int **kbmaps); -extern void inputdevice_do_keyboard (int code, int state); +extern void inputdevice_do_keyboard(int code, int state); +extern void inputdevice_do_kb_reset(int); extern int inputdevice_iskeymapped (int keyboard, int scancode); extern int inputdevice_synccapslock (int, int*); extern void inputdevice_testrecord (int type, int num, int wtype, int wnum, int state, int max); diff --git a/inputdevice.cpp b/inputdevice.cpp index 299d0b94..5d933111 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -163,7 +163,7 @@ static struct teststore testmode_wait[TESTMODE_MAX]; static int bouncy; static frame_time_t bouncy_cycles; static int autopause; -static int keyboard_reset_seq; +static int keyboard_reset_seq, keyboard_reset_seq_mode; #define HANDLE_IE_FLAG_CANSTOPPLAYBACK 1 #define HANDLE_IE_FLAG_PLAYBACKEVENT 2 @@ -4467,20 +4467,24 @@ void inputdevice_do_keyboard(int code, int state) if (code < 0x80) { uae_u8 key = code | (state ? 0x00 : 0x80); keybuf[key & 0x7f] = (key & 0x80) ? 0 : 1; - if (keyboard_reset_seq) { + if (keyboard_reset_seq_mode) { if (!(keybuf[AK_CTRL] || keybuf[AK_RCTRL]) || !keybuf[AK_LAMI] || !keybuf[AK_RAMI]) { memset(keybuf, 0, sizeof(keybuf)); - send_internalevent(INTERNALEVENT_KBRESET); - if (keyboard_reset_seq >= 5 * 50) { - custom_reset(true, true); - uae_reset(1, 1); - } else { - if (currprefs.cs_resetwarning && resetwarning_do(0)) - return; - custom_reset(false, true); - uae_reset(0, 1); + if (keyboard_reset_seq >= 5 * 50 || keyboard_reset_seq_mode > 0) { + send_internalevent(INTERNALEVENT_KBRESET); + if (keyboard_reset_seq >= 5 * 50 || keyboard_reset_seq_mode == 2) { + custom_reset(true, true); + uae_reset(1, 1); + } else { + custom_reset(false, true); + uae_reset(0, 1); + } + } else if (keyboard_reset_seq_mode == -1) { + resetwarning_do(0); } keyboard_reset_seq = 0; + keyboard_reset_seq_mode = 0; + release_keys(); } return; } @@ -4489,16 +4493,21 @@ void inputdevice_do_keyboard(int code, int state) resetwarning_do(0); return; } else if ((keybuf[AK_CTRL] || keybuf[AK_RCTRL]) && keybuf[AK_LAMI] && keybuf[AK_RAMI]) { + keyboard_reset_seq = 0; + keyboard_reset_seq_mode = 0; int r = keybuf[AK_LALT] | keybuf[AK_RALT]; if (r) { - send_internalevent(INTERNALEVENT_KBRESET); - uae_reset(1, 1); - keyboard_reset_seq = 0; + keyboard_reset_seq_mode = 2; + custom_reset(true, true); + cpu_inreset(); } else { keyboard_reset_seq = 1; - if (!currprefs.cs_resetwarning || !resetwarning_do(0)) { + if (currprefs.cs_resetwarning) { + keyboard_reset_seq_mode = -1; + } else { custom_reset(false, true); cpu_inreset(); + keyboard_reset_seq_mode = 1; } } } @@ -4511,6 +4520,14 @@ void inputdevice_do_keyboard(int code, int state) inputdevice_add_inputcode(code, state, NULL); } +void inputdevice_do_kb_reset(int hardreset) +{ + send_internalevent(INTERNALEVENT_KBRESET); + uae_reset(hardreset, 1); + keyboard_reset_seq_mode = 0; + keyboard_reset_seq = 0; +} + // these need cpu trace data static bool needcputrace (int code) { diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index 627fa657..e5b98618 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -3730,12 +3730,10 @@ int ispressed (int key) return 0; } -static void release_keys (void) +void release_keys(void) { - int i, j; - - for (j = 0; j < MAX_INPUT_DEVICES; j++) { - for (i = 0; i < MAX_KEYCODES; i++) { + for (int j = 0; j < MAX_INPUT_DEVICES; j++) { + for (int i = 0; i < MAX_KEYCODES; i++) { if (di_keycodes[j][i]) { #if DEBUG_SCANCODE write_log(_T("release %d:%02x:%02x\n"), j, di_keycodes[j][i], i); -- 2.47.3