]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Keyboard reset behavior change when reset warning is enabled.
authorToni Wilen <twilen@winuae.net>
Sat, 11 Mar 2023 17:33:58 +0000 (19:33 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 11 Mar 2023 17:33:58 +0000 (19:33 +0200)
cia.cpp
include/inputdevice.h
inputdevice.cpp
od-win32/dinput.cpp

diff --git a/cia.cpp b/cia.cpp
index e29039a8df57be9a9672d50eb1a17e8ad68376ac..d4be935450ee9dc7bf3d8e3d205244fae423ce09 100644 (file)
--- 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);
                }
        }
 }
index 18fdeda4024e5b213f2a3f47dea7173df018bdeb..a3b206eda3bc2b92022d197a7b1d75deb68f8904 100644 (file)
@@ -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);
index 299d0b94f0390d7db27d8ba380c8c6a5f50b6ebe..5d9331110d8e65ce343307b6a85e053bbefd3673 100644 (file)
@@ -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)
 {
index 627fa6575b37e342ae8cca4d8e663a0e055bb375..e5b98618f2b7720de70d832c3f50cf2e52628151 100644 (file)
@@ -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);