]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2400b9
authorToni Wilen <twilen@winuae.net>
Fri, 30 Dec 2011 18:41:49 +0000 (20:41 +0200)
committerToni Wilen <twilen@winuae.net>
Fri, 30 Dec 2011 18:41:49 +0000 (20:41 +0200)
25 files changed:
bsdsocket.cpp
cfgfile.cpp
custom.cpp
drawing.cpp
include/inputdevice.h
include/options.h
inputdevice.cpp
inputevents.def
main.cpp
od-win32/bsdsock.cpp
od-win32/dinput.cpp
od-win32/direct3d.cpp
od-win32/dxwrap.cpp
od-win32/keyboard_win32.cpp
od-win32/picasso96_win.cpp
od-win32/resources/resource
od-win32/resources/winuae.rc
od-win32/sounddep/sound.cpp
od-win32/win32.cpp
od-win32/win32.h
od-win32/win32gfx.cpp
od-win32/win32gui.cpp
od-win32/winuae_msvc10/winuae_msvc.vcxproj
od-win32/winuaechangelog.txt
specialmonitors.cpp

index 0cd1b36a7ed16a84e81e96cbbb90f856445a4f6c..4b35b021be6d206aca560ee5bbb060d260d04e40 100644 (file)
@@ -101,7 +101,7 @@ static uae_u32 gettask (TrapContext *context)
        m68k_areg (regs, 1) = a1;
 
        tskname = au((char*)get_real_address (get_long (currtask + 10)));
-       BSDTRACE ((L"[%s] ", au));
+       BSDTRACE ((L"[%s] ", tskname));
        xfree (tskname);
        return currtask;
 }
@@ -263,7 +263,7 @@ void addtosigqueue (SB, int events)
        }
        sb->dosignal = 1;
 
-       bsd_int_requested = 1;
+       bsd_int_requested |= 1;
 
        unlocksigqueue ();
 
@@ -513,7 +513,7 @@ static uae_u32 REGPARAM2 bsdsocklib_Open (TrapContext *context)
 
                put_pointer (result + offsetof (struct UAEBSDBase, sb), sb);
 
-               BSDTRACE ((L"%0lx [%d]\n", result, opencount));
+               BSDTRACE ((L"%0x [%d]\n", result, opencount));
        } else
                BSDTRACE ((L"failed (out of memory)\n"));
 
index ff0c2fb88d944727bc5c95409e2e7642d0aa4144..d4874173a37718dd5877bce47eb8d16be5d175c7 100644 (file)
@@ -1076,7 +1076,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
 
 int cfgfile_yesno (const TCHAR *option, const TCHAR *value, const TCHAR *name, int *location)
 {
-       if (_tcscmp (option, name) != 0)
+       if (name != NULL && _tcscmp (option, name) != 0)
                return 0;
        if (strcasecmp (value, L"yes") == 0 || strcasecmp (value, L"y") == 0
                || strcasecmp (value, L"true") == 0 || strcasecmp (value, L"t") == 0)
@@ -1108,7 +1108,7 @@ int cfgfile_doubleval (const TCHAR *option, const TCHAR *value, const TCHAR *nam
 {
        int base = 10;
        TCHAR *endptr;
-       if (_tcscmp (option, name) != 0)
+       if (name != NULL && _tcscmp (option, name) != 0)
                return 0;
        *location = _tcstod (value, &endptr);
        return 1;
@@ -1119,7 +1119,7 @@ int cfgfile_intval (const TCHAR *option, const TCHAR *value, const TCHAR *name,
 {
        int base = 10;
        TCHAR *endptr;
-       if (_tcscmp (option, name) != 0)
+       if (name != NULL && _tcscmp (option, name) != 0)
                return 0;
        /* I guess octal isn't popular enough to worry about here...  */
        if (value[0] == '0' && _totupper (value[1]) == 'X')
@@ -1154,7 +1154,7 @@ int cfgfile_intval (const TCHAR *option, const TCHAR *value, const TCHAR *name,
 int cfgfile_strval (const TCHAR *option, const TCHAR *value, const TCHAR *name, int *location, const TCHAR *table[], int more)
 {
        int val;
-       if (_tcscmp (option, name) != 0)
+       if (name != NULL && _tcscmp (option, name) != 0)
                return 0;
        val = match_string (table, value);
        if (val == -1) {
@@ -2681,7 +2681,7 @@ static int isutf8ext (TCHAR *s)
        return 0;
 }
 
-static int cfgfile_separate_linea (char *line, TCHAR *line1b, TCHAR *line2b)
+static int cfgfile_separate_linea (const TCHAR *filename, char *line, TCHAR *line1b, TCHAR *line2b)
 {
        char *line1, *line2;
        int i;
@@ -2690,7 +2690,7 @@ static int cfgfile_separate_linea (char *line, TCHAR *line1b, TCHAR *line2b)
        line2 = strchr (line, '=');
        if (! line2) {
                TCHAR *s = au (line1);
-               write_log (L"CFGFILE: linea was incomplete with only %s\n", s);
+               write_log (L"CFGFILE: '%s', linea was incomplete with only %s\n", filename, s);
                xfree (s);
                return 0;
        }
@@ -2923,7 +2923,7 @@ static int cfgfile_load_2 (struct uae_prefs *p, const TCHAR *filename, bool real
                                p->all_lines = u;
                                continue;
                        }
-                       if (!cfgfile_separate_linea (linea, line1b, line2b))
+                       if (!cfgfile_separate_linea (filename, linea, line1b, line2b))
                                continue;
                        type1 = type2 = 0;
                        if (cfgfile_yesno (line1b, line2b, L"config_hardware", &type1) ||
index ab88f60af81e90cd21e3ebc6779e7fd9c7220f04..dc83949f7cb997d0f90b9a9e2bbf000bb1f9b5cc 100644 (file)
@@ -5107,11 +5107,14 @@ static void framewait (void)
        int vs = isvsync_chipset ();
 
        if (vs > 0) {
+
                vsyncmintime = vsynctime;
                render_screen ();
                show_screen ();
                return;
+
        } else if (vs < 0) {
+
                int freetime;
                extern int extraframewait;
                vsyncmintime = vsynctime;
@@ -5132,11 +5135,12 @@ static void framewait (void)
                        vsyncmintime = curr_time + vsynctime;
                        show_screen ();
                        if (extraframewait)
-                               sleep_millis (extraframewait);
+                               sleep_millis_main (extraframewait);
 
                }
                return;
        }
+
        bool didrender = false;
        if (!picasso_on)
                didrender = render_screen ();
index cb5f43d44c334f7649d42ff39bbdd7082582c51c..00bb1f8334738e047abcf6c06ac1607841c8c2bd 100644 (file)
@@ -2868,7 +2868,7 @@ static void clearbuffer (struct vidbuffer *dst)
                return;
        uae_u8 *p = dst->bufmem_allocated;
        for (int y = 0; y < dst->height; y++) {
-               memset(p, 0, dst->width * dst->pixbytes);
+               memset (p, 0, dst->width * dst->pixbytes);
                p += dst->rowbytes;
        }
 }
index c1bd6dbb6faf77d276ffc1b0ac29e99fc7afbc81..9ea6313c04e45f3930a624697a1af459a6c21f00 100644 (file)
@@ -158,7 +158,7 @@ extern void inputdevice_updateconfig (struct uae_prefs *prefs);
 extern void inputdevice_devicechange (struct uae_prefs *prefs);
 
 extern int inputdevice_translatekeycode (int keyboard, int scancode, int state);
-extern void inputdevice_setkeytranslation (struct uae_input_device_kbr_default *trans, int **kbmaps);
+extern void inputdevice_setkeytranslation (struct uae_input_device_kbr_default **trans, int **kbmaps);
 extern void inputdevice_do_keyboard (int code, int state);
 extern int inputdevice_iskeymapped (int keyboard, int scancode);
 extern int inputdevice_synccapslock (int, int*);
index 88ddbd068aaed345de98ca8b5e6b4c8c5fa0f67c..42b58160da7a81fdd08290eea575c8fe1b5cc7de 100644 (file)
@@ -67,6 +67,10 @@ struct jport {
 #define JPORT_AF_TOGGLE 2
 #define JPORT_AF_ALWAYS 3
 
+#define KBTYPE_AMIGA 0
+#define KBTYPE_PC1 1
+#define KBTYPE_PC2 2
+
 #define MAX_SPARE_DRIVES 20
 #define MAX_CUSTOM_MEMORY_ADDRS 2
 
@@ -467,6 +471,7 @@ struct uae_prefs {
        int input_tablet;
        bool input_magic_mouse;
        int input_magic_mouse_cursor;
+       int input_keyboard_type;
        struct uae_input_device joystick_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
        struct uae_input_device mouse_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
        struct uae_input_device keyboard_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
index 76acdabe3050af64170712f3c710c0a6b532f5b9..58b7ab60c7a442564ef56de2d82741c7dcb8c8e6 100644 (file)
@@ -158,7 +158,7 @@ int inputdevice_uaelib (const TCHAR *s, const TCHAR *parm)
 static struct uae_input_device *joysticks;
 static struct uae_input_device *mice;
 static struct uae_input_device *keyboards;
-static struct uae_input_device_kbr_default *keyboard_default;
+static struct uae_input_device_kbr_default *keyboard_default, **keyboard_default_table;
 
 #define KBR_DEFAULT_MAP_FIRST 0
 #define KBR_DEFAULT_MAP_LAST 5
@@ -520,6 +520,8 @@ static void write_config (struct zfile *f, int idnum, int devnum, TCHAR *name, s
                write_config2 (f, idnum, i, ID_BUTTON_OFFSET, tmp1, id);
 }
 
+static const TCHAR *kbtypes[] = { L"amiga", L"pc", NULL };
+
 void write_inputdevice_config (struct uae_prefs *p, struct zfile *f)
 {
        int i, id;
@@ -533,6 +535,7 @@ void write_inputdevice_config (struct uae_prefs *p, struct zfile *f)
        cfgfile_write (f, L"input.analog_joystick_offset", L"%d", p->input_analog_joystick_offset);
        cfgfile_write (f, L"input.mouse_speed", L"%d", p->input_mouse_speed);
        cfgfile_write (f, L"input.autofire_speed", L"%d", p->input_autofire_linecnt);
+       cfgfile_dwrite_str (f, L"input.keyboard_type", kbtypes[p->input_keyboard_type]);
        cfgfile_dwrite (f, L"input.contact_bounce", L"%d", p->input_contact_bounce);
        for (id = 0; id < MAX_INPUT_SETTINGS; id++) {
                TCHAR tmp[MAX_DPATH];
@@ -662,6 +665,18 @@ static void set_kbr_default (struct uae_prefs *p, int index, int devnum)
        }
 }
 
+static void inputdevice_default_kb (struct uae_prefs *p)
+{
+       keyboard_default = keyboard_default_table[p->input_keyboard_type];
+       for (int i = 0; i < MAX_INPUT_SETTINGS; i++) {
+               if (i == GAMEPORT_INPUT_SETTINGS) {
+                       if (p->jports[0].id != JPORT_CUSTOM || p->jports[1].id != JPORT_CUSTOM) {
+                               reset_inputdevice_slot (p, i);
+                       }
+               }
+               set_kbr_default (p, i, -1);
+       }
+}
 
 static void clear_id (struct uae_input_device *id)
 {
@@ -784,6 +799,11 @@ void read_inputdevice_config (struct uae_prefs *pr, const TCHAR *option, TCHAR *
                pr->input_analog_joystick_mult = _tstol (value);
        if (!strcasecmp (p, L"analog_joystick_offset"))
                pr->input_analog_joystick_offset = _tstol (value);
+       if (!strcasecmp (p, L"keyboard_type")) {
+               cfgfile_strval (option, value, NULL, &pr->input_analog_joystick_offset, kbtypes, 0);
+               inputdevice_default_kb (pr);
+       }
+
        if (!strcasecmp (p, L"contact_bounce"))
                pr->input_contact_bounce = _tstol (value);
 
@@ -4533,6 +4553,8 @@ void inputdevice_updateconfig (struct uae_prefs *prefs)
 {
        int i;
 
+       keyboard_default = keyboard_default_table[currprefs.input_keyboard_type];
+
        copyjport (&changed_prefs, &currprefs, 0);
        copyjport (&changed_prefs, &currprefs, 1);
        copyjport (&changed_prefs, &currprefs, 2);
@@ -4637,12 +4659,12 @@ void inputdevice_devicechange (struct uae_prefs *prefs)
        config_changed = 1;
 }
 
+
 // set default prefs to all input configuration settings
 void inputdevice_default_prefs (struct uae_prefs *p)
 {
-       int i;
-
        inputdevice_init ();
+
        p->input_selected_setting = GAMEPORT_INPUT_SETTINGS;
        p->input_joymouse_multiplier = 100;
        p->input_joymouse_deadzone = 33;
@@ -4652,20 +4674,14 @@ void inputdevice_default_prefs (struct uae_prefs *p)
        p->input_analog_joystick_offset = -1;
        p->input_mouse_speed = 100;
        p->input_autofire_linecnt = 600;
-       for (i = 0; i < MAX_INPUT_SETTINGS; i++) {
-               if (i == GAMEPORT_INPUT_SETTINGS) {
-                       if (p->jports[0].id != JPORT_CUSTOM || p->jports[1].id != JPORT_CUSTOM) {
-                               reset_inputdevice_slot (p, i);
-                       }
-               }
-               set_kbr_default (p, i, -1);
-       }
+       p->input_keyboard_type = 0;
+       inputdevice_default_kb (p);
 }
 
 // set default keyboard and keyboard>joystick layouts
-void inputdevice_setkeytranslation (struct uae_input_device_kbr_default *trans, int **kbmaps)
+void inputdevice_setkeytranslation (struct uae_input_device_kbr_default **trans, int **kbmaps)
 {
-       keyboard_default = trans;
+       keyboard_default_table = trans;
        keyboard_default_kbmaps = kbmaps;
 }
 
@@ -4774,7 +4790,7 @@ static void sendmmcodes (int code, int newstate)
        uae_u8 b;
 
        b = RAW_STEALTH | IECODE_UP_PREFIX;
-       record_key(((b << 1) | (b >> 7)) & 0xff);
+       record_key (((b << 1) | (b >> 7)) & 0xff);
        b = IECODE_UP_PREFIX;
        if ((code >> 8) == 0x01)
                b |= STEALTHF_E0KEY;
index 30f6efa16e4cf5e1196c6909db7ad2a9a61e9ce5..1ac2eb6507607c56464d064507f5fd9e661e5ef4 100644 (file)
@@ -269,23 +269,23 @@ DEFEVENT(KEY_1C,L"Keycode 0x1C",AM_K,0,0,0x1c)
 DEFEVENT(KEY_2C,L"Keycode 0x2C",AM_K,0,0,0x2C)
 
 DEFEVENT(KEY_3B,L"Keycode 0x3B",AM_K,0,0,0x3b)
-DEFEVENT(KEY_47,L"Keycode 0x47",AM_K,0,0,0x47)
-
-DEFEVENT(KEY_48,L"Keycode 0x48",AM_K,0,0,0x48)
-DEFEVENT(KEY_49,L"Keycode 0x49",AM_K,0,0,0x49)
-DEFEVENT(KEY_4B,L"Keycode 0x4B",AM_K,0,0,0x4b)
 
 DEFEVENT(KEY_68,L"Keycode 0x68",AM_K,0,0,0x68)
 DEFEVENT(KEY_69,L"Keycode 0x69",AM_K,0,0,0x69)
 DEFEVENT(KEY_6A,L"Keycode 0x6A",AM_K,0,0,0x6a)
-DEFEVENT(KEY_6B,L"Keycode 0x6B",AM_K,0,0,0x6b)
 DEFEVENT(KEY_6C,L"Keycode 0x6C",AM_K,0,0,0x6c)
-DEFEVENT(KEY_6D,L"Keycode 0x6D",AM_K,0,0,0x6d)
-DEFEVENT(KEY_6E,L"Keycode 0x6E",AM_K,0,0,0x6e)
-DEFEVENT(KEY_6F,L"Keycode 0x6F",AM_K,0,0,0x6f)
 
-DEFEVENT(KEY_70,L"Keycode 0x70",AM_K,0,0,0x70)
-DEFEVENT(KEY_71,L"Keycode 0x71",AM_K,0,0,0x71)
+DEFEVENT(KEY_INSERT,L"Insert (PC)",AM_K,0,0,0x47)
+DEFEVENT(KEY_PAGEUP,L"Page Up (PC)",AM_K,0,0,0x48)
+DEFEVENT(KEY_PAGEDOWN,L"Page Down (PC)",AM_K,0,0,0x49)
+DEFEVENT(KEY_F11,L"F11 (PC)",AM_K,0,0,0x4b)
+DEFEVENT(KEY_APPS,L"Apps (PC)",AM_K,0,0,0x6b)
+DEFEVENT(KEY_SYSRQ,L"PrtScr/SysRq (PC)",AM_K,0,0,0x6d)
+DEFEVENT(KEY_PAUSE,L"Pause/Break (PC)",AM_K,0,0,0x6e)
+DEFEVENT(KEY_F12,L"F12 (PC)",AM_K,0,0,0x6f)
+DEFEVENT(KEY_HOME,L"Home (PC)",AM_K,0,0,0x70)
+DEFEVENT(KEY_END,L"End (PC)",AM_K,0,0,0x71)
+
 DEFEVENT(KEY_78,L"Keycode 0x78 (Reset Warning)",AM_K,0,0,0x78)
 DEFEVENT(KEY_79,L"Keycode 0x79",AM_K,0,0,0x79)
 DEFEVENT(KEY_7A,L"Keycode 0x7A",AM_K,0,0,0x7a)
index f0b82357ed3d735e5c344af06f19cae434a43f1c..2e5327db6604da2e3625e2b6408b9ce53db484f8 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -133,10 +133,10 @@ void fixup_prefs_dimensions (struct uae_prefs *prefs)
        fixup_prefs_dim2 (&prefs->gfx_size_win);
        if (prefs->gfx_filter == 0 && prefs->gfx_filter_autoscale && !prefs->gfx_api)
                prefs->gfx_filter = 1;
-       if (prefs->gfx_avsync)
-               prefs->gfx_avsyncmode = 1;
        if (prefs->gfx_pvsync)
                prefs->gfx_pvsyncmode = 1;
+       if (prefs->gfx_avsync && !prefs->gfx_avsyncmode && prefs->gfx_backbuffers < 2)
+               prefs->gfx_backbuffers = 2;
 }
 
 void fixup_cpu (struct uae_prefs *p)
@@ -365,6 +365,12 @@ void fixup_prefs (struct uae_prefs *p)
                                p->cs_ramseyrev = 0x0f;
                }
        }
+       /* Can't fit genlock and A2024 or Graffiti at the same time,
+        * also Graffiti uses genlock audio bit as an enable signal
+        */
+       if (p->genlock && p->monitoremu)
+               p->genlock = false;
+
        fixup_prefs_dimensions (p);
 
 #if !defined (JIT)
index 4ebd25406b1abd9f776be0d4037016116656ffad..d6680c6cfc05b0e09fcbaefc7c32cc9e544f601f 100644 (file)
@@ -2021,6 +2021,11 @@ static BOOL CheckOnline(SB)
        return bReturn;
 }
 
+#define GET_STATE_FREE 0
+#define GET_STATE_ACTIVE 1
+#define GET_STATE_CANCEL 2
+#define GET_STATE_FINISHED 3
+
 static unsigned int thread_get2 (void *indexp)
 {
        int index = *((int*)indexp);
@@ -2039,10 +2044,7 @@ static unsigned int thread_get2 (void *indexp)
                if (bsd->hGetEvents[index] == NULL)
                        break;
 
-               if (bsd->threadGetargs_inuse[index] == -1)
-                       bsd->threadGetargs_inuse[index] = 0;
-
-               if (bsd->threadGetargs_inuse[index]) {
+               if (bsd->threadGetargs_inuse[index] == GET_STATE_ACTIVE) {
                        args = &bsd->threadGetargs[index];
                        sb = args->sb;
 
@@ -2065,7 +2067,7 @@ static unsigned int thread_get2 (void *indexp)
                                        } else {
                                                host = gethostbyaddr (name_rp, namelen, addrtype);
                                        }
-                                       if (bsd->threadGetargs_inuse[index] != -1) {
+                                       if (bsd->threadGetargs_inuse[index] != GET_STATE_CANCEL) {
                                                // No CTRL-C Signal
                                                if (host == 0) {
                                                        // Error occured
@@ -2089,7 +2091,7 @@ static unsigned int thread_get2 (void *indexp)
                                else
                                        name_rp = "";
                                proto = getprotobyname (name_rp);
-                               if (bsd->threadGetargs_inuse[index] != -1) { // No CTRL-C Signal
+                               if (bsd->threadGetargs_inuse[index] != GET_STATE_CANCEL) { // No CTRL-C Signal
                                        if (proto == 0) {
                                                // Error occured
                                                SETERRNO;
@@ -2125,7 +2127,7 @@ static unsigned int thread_get2 (void *indexp)
                                                name_rp = (char*)get_real_address (nameport);
                                        serv = getservbyname(name_rp, proto_rp);
                                }
-                               if (bsd->threadGetargs_inuse[index] != -1) {
+                               if (bsd->threadGetargs_inuse[index] != GET_STATE_CANCEL) {
                                        // No CTRL-C Signal
                                        if (serv == 0) {
                                                // Error occured
@@ -2140,10 +2142,12 @@ static unsigned int thread_get2 (void *indexp)
 
                        BSDTRACE((L"-> "));
 
-                       if (bsd->threadGetargs_inuse[index] != -1)
+                       if (bsd->threadGetargs_inuse[index] == GET_STATE_ACTIVE)
                                SETSIGNAL;
 
-                       bsd->threadGetargs_inuse[index] = 0;
+                       locksigqueue ();
+                       bsd->threadGetargs_inuse[index] = GET_STATE_FINISHED;
+                       unlocksigqueue ();
 
                }
        }
@@ -2165,27 +2169,36 @@ static volatile struct threadargs *run_get_thread(TrapContext *context, SB, stru
 {
        int i;
 
+       locksigqueue ();
+
        for (i = 0; i < MAX_GET_THREADS; i++)  {
-               if (bsd->threadGetargs_inuse[i] == -1) {
-                       bsd->threadGetargs_inuse[i] = 0;
+               if (bsd->threadGetargs_inuse[i] == GET_STATE_FINISHED) {
+                       bsd->threadGetargs_inuse[i] = GET_STATE_FREE;
                }
-               if (bsd->hGetThreads[i] && !bsd->threadGetargs_inuse[i])
+               if (bsd->hGetThreads[i] && bsd->threadGetargs_inuse[i] == GET_STATE_FREE) {
                        break;
+               }
        }
 
        if (i >= MAX_GET_THREADS) {
                for (i = 0; i < MAX_GET_THREADS; i++) {
                        if (bsd->hGetThreads[i] == NULL) {
+                               bsd->threadGetargs_inuse[i] = GET_STATE_FREE;
                                bsd->hGetEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
-                               bsd->hGetThreads[i] = THREAD(thread_get, &threadindextable[i]);
+                               if (bsd->hGetEvents[i])
+                                       bsd->hGetThreads[i] = THREAD(thread_get, &threadindextable[i]);
                                if (bsd->hGetEvents[i] == NULL || bsd->hGetThreads[i] == NULL) {
-                                       bsd->hGetThreads[i] = NULL;
+                                       if (bsd->hGetEvents[i])
+                                               CloseHandle (bsd->hGetEvents[i]);
+                                       bsd->hGetEvents[i] = NULL;
                                        write_log (L"BSDSOCK: ERROR - Thread/Event creation failed - error code: %d\n",
                                                GetLastError());
                                        bsdsocklib_seterrno(sb, 12); // ENOMEM
                                        sb->resultval = -1;
+                                       unlocksigqueue ();
                                        return 0;
                                }
+                               bsdsetpriority (bsd->hGetThreads[i]);
                                break;
                        }
                }
@@ -2195,19 +2208,23 @@ static volatile struct threadargs *run_get_thread(TrapContext *context, SB, stru
                write_log (L"BSDSOCK: ERROR - Too many gethostbyname()s\n");
                bsdsocklib_seterrno(sb, 12); // ENOMEM
                sb->resultval = -1;
+               unlocksigqueue ();
                return 0;
        } else {
-               bsdsetpriority (bsd->hGetThreads[i]);
                memcpy (&bsd->threadGetargs[i], args, sizeof (struct threadargs));
-               bsd->threadGetargs_inuse[i] = 1;
+               bsd->threadGetargs_inuse[i] = GET_STATE_ACTIVE;
                SetEvent(bsd->hGetEvents[i]);
        }
 
+       unlocksigqueue ();
+
        sb->eintr = 0;
-       while (bsd->threadGetargs_inuse[i] != 0 && sb->eintr == 0) {
+       while (bsd->threadGetargs_inuse[i] != GET_STATE_FINISHED && sb->eintr == 0) {
                WAITSIGNAL;
-               if (sb->eintr == 1)
-                       bsd->threadGetargs_inuse[i] = -1;
+               locksigqueue ();
+               if (sb->eintr == 1 && bsd->threadGetargs_inuse[i] != GET_STATE_FINISHED)
+                       bsd->threadGetargs_inuse[i] = GET_STATE_CANCEL;
+               unlocksigqueue ();
        }
        CANCELSIGNAL;
 
index b3dadd5800156ced63642a7233599c888d46a8ad..3e24bfe5e88b2946c57df11402ba34ada0cf1ed6 100644 (file)
@@ -91,6 +91,7 @@ struct didata {
        LPDIRECTINPUTDEVICE8 lpdi;
        HANDLE rawinput;
        HIDP_CAPS hidcaps;
+       HIDP_VALUE_CAPS hidvcaps[MAX_MAPPINGS];
        PCHAR hidbuffer, hidbufferprev;
        PHIDP_PREPARSED_DATA hidpreparseddata;
        int maxusagelistlength;
@@ -109,9 +110,6 @@ struct didata {
        TCHAR *axisname[MAX_MAPPINGS];
        uae_s16 axissort[MAX_MAPPINGS];
        uae_s16 axistype[MAX_MAPPINGS];
-       uae_s32 axismax[MAX_MAPPINGS];
-       uae_s32 axismin[MAX_MAPPINGS];
-       uae_s16 axisusagepage[MAX_MAPPINGS];
        bool analogstick;
 
        uae_s16 buttonmappings[MAX_MAPPINGS];
@@ -906,18 +904,18 @@ static void sortobjects (struct didata *did)
 {
        int i, j;
        uae_s16 tmpi;
-       uae_s32 tmpl;
        TCHAR *tmpc;
 
        for (i = 0; i < did->axles; i++) {
                for (j = i + 1; j < did->axles; j++) {
                        if (did->axissort[i] > did->axissort[j]) {
+                               HIDP_VALUE_CAPS tmpvcaps;
                                tmpi = did->axismappings[i]; did->axismappings[i] = did->axismappings[j]; did->axismappings[j] = tmpi;
                                tmpi = did->axissort[i]; did->axissort[i] = did->axissort[j]; did->axissort[j] = tmpi;
                                tmpi = did->axistype[i]; did->axistype[i] = did->axistype[j]; did->axistype[j] = tmpi;
-                               tmpl = did->axismax[i]; did->axismax[i] = did->axismax[j]; did->axismax[j] = tmpl;
-                               tmpl = did->axismin[i]; did->axismin[i] = did->axismin[j]; did->axismin[j] = tmpl;
-                               tmpi = did->axisusagepage[i]; did->axisusagepage[i] = did->axisusagepage[j]; did->axisusagepage[j] = tmpi;
+                               memcpy (&tmpvcaps, &did->hidvcaps[i], sizeof tmpvcaps);
+                               memcpy (&did->hidvcaps[i], &did->hidvcaps[j], sizeof tmpvcaps);
+                               memcpy (&did->hidvcaps[j], &tmpvcaps, sizeof tmpvcaps);
                                tmpc = did->axisname[i]; did->axisname[i] = did->axisname[j]; did->axisname[j] = tmpc;
                        }
                }
@@ -936,12 +934,15 @@ static void sortobjects (struct didata *did)
 
 #ifdef DI_DEBUG
        if (did->axles + did->buttons > 0) {
-               write_log (L"%s:\n", did->name);
+               write_log (L"%s: (%x/%x)\n", did->name, did->vid, did->pid);
                if (did->connection == DIDC_DX)
                        write_log (L"PGUID=%s\n", outGUID (&did->pguid));
                for (i = 0; i < did->axles; i++) {
-                       write_log (L"%02X %03d '%s' (%d, [%d - %d])\n",
-                               did->axismappings[i], did->axismappings[i], did->axisname[i], did->axissort[i], did->axismin[i], did->axismax[i]);
+                       HIDP_VALUE_CAPS *caps = &did->hidvcaps[i];
+                       write_log (L"%02X %03d '%s' (%d, [%d - %d, %d - %d, %d %d %d])\n",
+                               did->axismappings[i], did->axismappings[i], did->axisname[i], did->axissort[i],
+                               caps->LogicalMin, caps->LogicalMax, caps->PhysicalMin, caps->PhysicalMax,
+                               caps->BitSize, caps->Units, caps->UnitsExp);
                }
                for (i = 0; i < did->buttons; i++) {
                        write_log (L"%02X %03d '%s' (%d)\n",
@@ -1181,6 +1182,94 @@ static const struct hiddesc hidtable[] =
        { 0 }
 };
 
+static int extractbits (uae_u32 val, int bits, bool issigned)
+{
+       if (issigned)
+               return val & (1 << (bits - 1)) ? val | (-1 << bits) : val;
+       else
+               return val & ((1 << bits) - 1);
+}
+
+struct hidquirk
+{
+       uae_u16 vid, pid;
+};
+
+#define USB_VENDOR_ID_LOGITECH         0x046d
+#define USB_DEVICE_ID_LOGITECH_G13     0xc2ab
+#define USB_VENDOR_ID_AASHIMA          0x06d6
+#define USB_DEVICE_ID_AASHIMA_GAMEPAD  0x0025
+#define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026
+#define USB_VENDOR_ID_ALPS             0x0433
+#define USB_DEVICE_ID_IBM_GAMEPAD      0x1101
+#define USB_VENDOR_ID_CHIC             0x05fe
+#define USB_DEVICE_ID_CHIC_GAMEPAD     0x0014
+#define USB_VENDOR_ID_DWAV             0x0eef
+#define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER   0x0001
+#define USB_VENDOR_ID_MOJO             0x8282
+#define USB_DEVICE_ID_RETRO_ADAPTER    0x3201
+#define USB_VENDOR_ID_HAPP             0x078b
+#define USB_DEVICE_ID_UGCI_DRIVING     0x0010
+#define USB_DEVICE_ID_UGCI_FLYING      0x0020
+#define USB_DEVICE_ID_UGCI_FIGHTING    0x0030
+#define USB_VENDOR_ID_NATSU            0x08b7
+#define USB_DEVICE_ID_NATSU_GAMEPAD    0x0001
+#define USB_VENDOR_ID_NEC              0x073e
+#define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301
+#define USB_VENDOR_ID_NEXTWINDOW       0x1926
+#define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN   0x0003
+#define USB_VENDOR_ID_SAITEK           0x06a3
+#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
+#define USB_VENDOR_ID_TOPMAX           0x0663
+#define USB_DEVICE_ID_TOPMAX_COBRAPAD  0x0103
+
+static const struct hidquirk quirks[] =  {
+       { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G13 },
+       { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD },
+       { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR },
+       { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD },
+       { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD },
+       { USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER },
+       { USB_VENDOR_ID_MOJO, USB_DEVICE_ID_RETRO_ADAPTER },
+       { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING },
+       { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING },
+       { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING },
+       { USB_VENDOR_ID_NATSU, USB_DEVICE_ID_NATSU_GAMEPAD },
+       { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD },
+       { USB_VENDOR_ID_NEXTWINDOW, USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN },
+       { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD },
+       { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD },
+       { 0 }
+};
+
+static void fixhidvcaps (RID_DEVICE_INFO_HID *hid, HIDP_VALUE_CAPS *caps)
+{
+       int pid = hid->dwProductId;
+       int vid = hid->dwVendorId;
+       ULONG mask = (1 << caps->BitSize) - 1;
+       /* min is always signed.
+        * if min < 0, max is signed, otherwise it is unsigned
+        */
+       if (caps->PhysicalMin >= 0)
+               caps->PhysicalMax = (uae_u32)(caps->PhysicalMax & mask);
+       else
+               caps->PhysicalMax = (uae_s32)caps->PhysicalMax;
+
+       if (caps->LogicalMin >= 0)
+               caps->LogicalMax = (uae_u32)(caps->LogicalMax & mask);
+       else
+               caps->LogicalMax = (uae_s32)caps->LogicalMax;
+
+       for (int i = 0; quirks[i].vid; i++) {
+               if (vid == quirks[i].vid && pid == quirks[i].pid) {
+                       caps->LogicalMin = 0;
+                       caps->LogicalMax = 255;
+                       break;
+               }
+       }
+
+}
+
 static bool initialize_rawinput (void)
 {
        RAWINPUTDEVICELIST *ridl = 0;
@@ -1438,9 +1527,8 @@ static bool initialize_rawinput (void)
                                                                                                                did->axisname[axiscnt] = my_strdup (tmp);
                                                                                                                did->axissort[axiscnt] = hidtable[ht].priority * 2 + l;
                                                                                                                did->axismappings[axiscnt] = acnt;
-                                                                                                               did->axisusagepage[axiscnt] = vcaps[i].UsagePage;
-                                                                                                               did->axismin[axiscnt] = vcaps[i].LogicalMin;
-                                                                                                               did->axismax[axiscnt] = vcaps[i].LogicalMax < 0 || vcaps[i].LogicalMax > 65535 ? 65535 : vcaps[i].LogicalMax;
+                                                                                                               memcpy (&did->hidvcaps[axiscnt], &vcaps[i], sizeof HIDP_VALUE_CAPS);
+                                                                                                               fixhidvcaps (&rdi->hid, &did->hidvcaps[axiscnt]);
                                                                                                                did->axistype[axiscnt] = l + 1;
                                                                                                                axiscnt++;
                                                                                                        }
@@ -1449,9 +1537,8 @@ static bool initialize_rawinput (void)
                                                                                                did->axissort[axiscnt] = hidtable[ht].priority * 2;
                                                                                                did->axisname[axiscnt] = my_strdup (hidtable[ht].name);
                                                                                                did->axismappings[axiscnt] = acnt;
-                                                                                               did->axisusagepage[axiscnt] = vcaps[i].UsagePage;
-                                                                                               did->axismin[axiscnt] = vcaps[i].LogicalMin;
-                                                                                               did->axismax[axiscnt] = vcaps[i].LogicalMax < 0 || vcaps[i].LogicalMax > 65535 ? 65535 : vcaps[i].LogicalMax;
+                                                                                               memcpy (&did->hidvcaps[axiscnt], &vcaps[i], sizeof HIDP_VALUE_CAPS);
+                                                                                               fixhidvcaps (&rdi->hid, &did->hidvcaps[axiscnt]);
                                                                                                did->axistype[axiscnt] = hidtable[ht].type;
                                                                                                axiscnt++;
                                                                                                did->analogstick = true;
@@ -1724,19 +1811,22 @@ static void handle_rawinput_2 (RAWINPUT *raw)
                                        for (int axisnum = 0; axisnum < did->axles; axisnum++) {
                                                ULONG val;
                                                int usage = did->axismappings[axisnum];
-                                               if (HidP_GetUsageValue (HidP_Input, did->axisusagepage[axisnum], 0, usage, &val, did->hidpreparseddata, rawdata, hid->dwSizeHid) == HIDP_STATUS_SUCCESS) {
+                                               NTSTATUS status;
+                                               
+                                               status = HidP_GetUsageValue (HidP_Input, did->hidvcaps[axisnum].UsagePage, 0, usage, &val, did->hidpreparseddata, rawdata, hid->dwSizeHid);
+                                               if (status == HIDP_STATUS_SUCCESS) {
 
                                                        int data = 0;
-                                                       int range = 0;
                                                        int digitalrange = 0;
+                                                       HIDP_VALUE_CAPS *vcaps = &did->hidvcaps[axisnum];
                                                        int type = did->axistype[axisnum];
+                                                       int logicalrange = (vcaps->LogicalMax - vcaps->LogicalMin) / 2;
+                                                       uae_u32 mask = (1 << vcaps->BitSize) - 1;
 
                                                        if (type == AXISTYPE_POV_X || type == AXISTYPE_POV_Y) {
 
-                                                               int min = did->axismin[axisnum];
-                                                               range = 127;
-                                                               digitalrange = range * 2 / 3;
-                                                               if (did->axismax[axisnum] - min == 7) {
+                                                               int min = vcaps->LogicalMin;
+                                                               if (vcaps->LogicalMax - min == 7) {
                                                                        if (val == min + 0 && type == AXISTYPE_POV_Y)
                                                                                data = -127;
                                                                        if (val == min + 2 && type == AXISTYPE_POV_X)
@@ -1756,52 +1846,49 @@ static void handle_rawinput_2 (RAWINPUT *raw)
                                                                                data = -127;
                                                                }
 
-                                                       } else if (type == AXISTYPE_SLIDER || type == AXISTYPE_DIAL) {
+                                                       } else {
 
-                                                               range = (did->axismax[axisnum] - did->axismin[axisnum]) / 2;
-                                                               digitalrange = range * 2 / 3;
-                                                               data = (int)val - range;
-                                                               //write_log (L"%d %d: %d\n", num, axisnum, data);
-                                                               if (istest) {
-                                                                       if (data < -digitalrange)
-                                                                               data = -range;
-                                                                       else if (data > digitalrange)
-                                                                               data = range;
-                                                                       else
-                                                                               data = 0;
-                                                               }
+                                                               int v;
 
-                                                       } else {
+                                                               v = extractbits (val, vcaps->BitSize, vcaps->LogicalMin < 0);
+                                               
+                                                               if (v < vcaps->LogicalMin)
+                                                                       v = vcaps->LogicalMin;
+                                                               else if (v > vcaps->LogicalMax)
+                                                                       v = vcaps->LogicalMax;
+
+                                                               v -= logicalrange + vcaps->LogicalMin;
 
-                                                               range = (did->axismax[axisnum] - did->axismin[axisnum]) / 2;
-                                                               digitalrange = range * 2 / 3;
-                                                               data = ((int)val) - range; 
-                                                               //write_log (L"%d %d: (%d-%d) %d\n", num, axisnum, did->axismin[axisnum], did->axismax[axisnum], data);
+                                                               //if (axisnum == 0)
+                                                               //      write_log (L"%d\n", v);
+
+                                                               data = v;
+
+                                                               digitalrange = logicalrange * 2 / 3;
                                                                if (istest) {
                                                                        if (data < -digitalrange)
-                                                                               data = -range;
+                                                                               data = -logicalrange;
                                                                        else if (data > digitalrange)
-                                                                               data = range;
+                                                                               data = logicalrange;
                                                                        else
                                                                                data = 0;
                                                                        //write_log (L"%d %d: (%d-%d) %d\n", num, axisnum, did->axismin[axisnum], did->axismax[axisnum], data);
                                                                }
-
                                                        }
 
-                                                       if (data != axisold[num][axisnum] && range) {
+                                                       if (data != axisold[num][axisnum] && logicalrange) {
                                                                //write_log (L"%d %d: %d->%d\n", num, axisnum, axisold[num][axisnum], data);
                                                                axisold[num][axisnum] = data;
                                                                int bstate = -1;
                                                                for (j = 0; j < did->buttons; j++) {
                                                                        if (did->buttonaxisparent[j] >= 0 && did->buttonmappings[j] == usage) {
-                                                                               if (did->buttonaxisparentdir[j] == 0 && data digitalrange)
+                                                                               if (did->buttonaxisparentdir[j] == 0 && data < -digitalrange)
                                                                                        bstate = j;
-                                                                               else if (did->buttonaxisparentdir[j] && data < -digitalrange)
+                                                                               else if (did->buttonaxisparentdir[j] && data digitalrange)
                                                                                        bstate = j;
                                                                        }
                                                                }
-                                                               setjoystickstate (num, axisnum, data, range);
+                                                               setjoystickstate (num, axisnum, data, logicalrange);
                                                                if (bstate >= 0)
                                                                        setjoybuttonstate (num, bstate, -1);
                                                        }
@@ -2732,6 +2819,8 @@ static uae_u32 kb_do_refresh;
 
 int ispressed (int key)
 {
+       if (key < 0 || key > 255)
+               return 0;
        int i;
        for (i = 0; i < MAX_INPUT_DEVICES; i++) {
                if (di_keycodes[i][key])
index d1a8cb9a7e9f92eb198abf33ea64bb48f8238e15..20c357775a5d6a2c241489772d093705089d85c1 100644 (file)
@@ -44,6 +44,7 @@ static D3DFORMAT tformat;
 static int d3d_enabled, d3d_ex;
 static IDirect3D9 *d3d;
 static IDirect3D9Ex *d3dex;
+static IDirect3DSwapChain9 *d3dswapchain;
 static D3DPRESENT_PARAMETERS dpp;
 static D3DDISPLAYMODEEX modeex;
 static IDirect3DDevice9 *d3ddev;
@@ -65,6 +66,7 @@ static int locked, fulllocked;
 static int cursor_offset_x, cursor_offset_y, cursor_offset2_x, cursor_offset2_y;
 static float maskmult_x, maskmult_y;
 static RECT mask2rect;
+static bool wasstilldrawing_broken;
 
 static D3DXMATRIXA16 m_matProj, m_matProj2;
 static D3DXMATRIXA16 m_matWorld, m_matWorld2;
@@ -1386,8 +1388,6 @@ end:
 
 static int createmasktexture (const TCHAR *filename)
 {
-       int ww = window_w;
-       int hh = window_h;
        struct zfile *zf;
        int size;
        uae_u8 *buf;
@@ -1435,7 +1435,7 @@ static int createmasktexture (const TCHAR *filename)
                masktexture = tx;
                tx = NULL;
        } else {
-               masktexture = createtext (ww, hh, D3DFMT_X8R8G8B8);
+               masktexture = createtext (window_w, window_h, D3DFMT_X8R8G8B8);
                if (FAILED (hr)) {
                        write_log (L"%s: mask texture creation failed: %s\n", D3DHEAD, D3D_ErrorString (hr));
                        goto end;
@@ -1477,8 +1477,8 @@ static int createmasktexture (const TCHAR *filename)
                masktexture_h = maskdesc.Height;
        }
        write_log (L"%s: mask %d*%d (%d*%d) ('%s') texture allocated\n", D3DHEAD, masktexture_w, masktexture_h, txdesc.Width, txdesc.Height, filename);
-       maskmult_x = (float)ww / masktexture_w;
-       maskmult_y = (float)hh / masktexture_h;
+       maskmult_x = (float)window_w / masktexture_w;
+       maskmult_y = (float)window_h / masktexture_h;
 
        return 1;
 end:
@@ -1817,6 +1817,10 @@ static int restoredeviceobjects (void)
 static void D3D_free2 (void)
 {
        invalidatedeviceobjects ();
+       if (d3dswapchain)  {
+               d3dswapchain->Release ();
+               d3dswapchain = NULL;
+       }
        if (d3ddev) {
                d3ddev->Release ();
                d3ddev = NULL;
@@ -1847,7 +1851,10 @@ bool D3D_getvblankpos (int *vpos)
        *vpos = -2;
        if (!isd3d ())
                return false;
-       hr = d3ddev->GetRasterStatus (0, &rt);
+       if (d3dswapchain)
+               hr = d3dswapchain->GetRasterStatus (&rt);
+       else
+               hr = d3ddev->GetRasterStatus (0, &rt);
        if (FAILED (hr)) {
                write_log (L"%s: GetRasterStatus %s\n", D3DHEAD, D3D_ErrorString (hr));
                return false;
@@ -1860,6 +1867,23 @@ bool D3D_getvblankpos (int *vpos)
        return true;
 }
 
+static int getd3dadapter (IDirect3D9 *d3d)
+{
+       struct MultiDisplay *md = getdisplay (&currprefs);
+       int num = d3d->GetAdapterCount ();
+       HMONITOR winmon;
+       POINT pt;
+
+       pt.x = (md->rect.right - md->rect.left) / 2 + md->rect.left;
+       pt.y = (md->rect.bottom - md->rect.top) / 2 + md->rect.top;
+       winmon = MonitorFromPoint (pt, MONITOR_DEFAULTTONEAREST);
+       for (int i = 0; i < num; i++) {
+               HMONITOR d3dmon = d3d->GetAdapterMonitor (i);
+               if (d3dmon == winmon)
+                       return i;
+       }
+       return D3DADAPTER_DEFAULT;
+}
 
 const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth, int mmult)
 {
@@ -1926,11 +1950,8 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth
        else
                D3DHEAD = L"D3D9";
 
-       adapter = currprefs.gfx_display - 1;
-       if (adapter < 0)
-               adapter = 0;
-       if (adapter >= d3d->GetAdapterCount ())
-               adapter = 0;
+
+       adapter = getd3dadapter (d3d);
 
        modeex.Size = sizeof modeex;
        if (d3dex && D3DEX) {
@@ -2060,7 +2081,7 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth
                dpp.Windowed ? 0 : dpp.FullScreen_RefreshRateInHz,
                dpp.Windowed ? L"" : L" FS",
                vsync, dpp.BackBufferCount,
-               dpp.PresentationInterval == D3DPRESENT_INTERVAL_IMMEDIATE ? L"I" : L"F",
+               dpp.PresentationInterval & D3DPRESENT_INTERVAL_IMMEDIATE ? L"I" : L"F",
                bb == 0 ? L"E" : L"", 
                t_depth, adapter
        );
@@ -2097,6 +2118,11 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth
                changed_prefs.gfx_filter_scanlines = currprefs.gfx_filter_scanlines = 0;
        }
 
+       hr = d3ddev->GetSwapChain (0, &d3dswapchain);
+       if (FAILED (hr)) {
+               write_log (L"%s: GetSwapChain() failed, %s\n", D3DHEAD, D3D_ErrorString (hr));
+       }
+
        switch (depth)
        {
                case 32:
@@ -2122,6 +2148,7 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth
        }
        maxscanline = 0;
        d3d_enabled = 1;
+       wasstilldrawing_broken = true;
 
        if (vsync < 0 && bb == 0) {
                hr = d3ddev->CreateQuery(D3DQUERYTYPE_EVENT, &query);
@@ -2191,6 +2218,36 @@ int D3D_needreset (void)
        return 0;
 }
 
+static void D3D_showframe2 (bool dowait)
+{
+       HRESULT hr;
+
+       if (!isd3d ())
+               return;
+       for (;;) {
+               if (d3dswapchain)
+                       hr = d3dswapchain->Present (NULL, NULL, NULL, NULL, dowait ? 0 : D3DPRESENT_DONOTWAIT);
+               else
+                       hr = d3ddev->Present (NULL, NULL, NULL, NULL);
+               if (hr == D3DERR_WASSTILLDRAWING) {
+                       wasstilldrawing_broken = false;
+               } else if (hr == S_PRESENT_OCCLUDED) {
+                       return;
+               } else {
+                       if (hr != FAILED (hr)) {
+                               write_log (L"%s: Present() %s\n", D3DHEAD, D3D_ErrorString (hr));
+                               if (hr == D3DERR_DEVICELOST || hr == S_PRESENT_MODE_CHANGED) {
+                                       devicelost = 1;
+                               }
+                       }
+                       return;
+               }
+               if (!dowait)
+                       return;
+               sleep_millis (1);
+       }
+}
+
 void D3D_clear (void)
 {
        int i;
@@ -2200,7 +2257,7 @@ void D3D_clear (void)
                return;
        for (i = 0; i < 2; i++) {
                hr = d3ddev->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, d3ddebug ? 0x80 : 0x00), 0, 0);
-               hr = d3ddev->Present (NULL, NULL, NULL, NULL);
+               D3D_showframe2 (true);          
        }
 }
 
@@ -2552,13 +2609,8 @@ uae_u8 *D3D_locktexture (int *pitch, int fullupdate)
 
 bool D3D_renderframe (void)
 {
-       static int frameskip;
-
        if (!isd3d ())
                return false;
-       if (currprefs.turbo_emulation && isfullscreen () > 0 && frameskip-- > 0)
-               return false;
-       frameskip = 50;
 
        D3D_render2 ();
        if (vsync2 && !currprefs.turbo_emulation) {
@@ -2582,16 +2634,16 @@ bool D3D_renderframe (void)
 
 void D3D_showframe (void)
 {
-       HRESULT hr;
-
-       if (!isd3d ())
-               return;
-       hr = d3ddev->Present (NULL, NULL, NULL, NULL);
-       if (FAILED (hr)) {
-               write_log (L"%s: Present() %s\n", D3DHEAD, D3D_ErrorString (hr));
-               if (hr == D3DERR_DEVICELOST) {
-                       devicelost = 1;
+       if (currprefs.turbo_emulation) {
+               if (!(dpp.PresentationInterval & D3DPRESENT_INTERVAL_IMMEDIATE) && wasstilldrawing_broken) {
+                       static int frameskip;
+                       if (currprefs.turbo_emulation && frameskip-- > 0)
+                               return;
+                       frameskip = 50;
                }
+               D3D_showframe2 (false);
+       } else {
+               D3D_showframe2 (true);
        }
 }
 
@@ -2600,9 +2652,9 @@ void D3D_refresh (void)
        if (!isd3d ())
                return;
        D3D_render2 ();
-       D3D_showframe ();
+       D3D_showframe2 (true);
        D3D_render2 ();
-       D3D_showframe ();
+       D3D_showframe2 (true);
        createscanlines (0);
 }
 
index 4bed1061fbd564019e8d69197aa94d736f59cff6..61b0476b8dbae2a18c1035bdd9604b216b25ca6a 100644 (file)
@@ -351,12 +351,12 @@ HRESULT DirectDraw_CreateMainSurface (int width, int height)
                        ddrval = IDirectDraw7_CreateSurface (dxdata.maindd, &desc, &dxdata.primary, NULL);
                        if (SUCCEEDED (ddrval)) {
                                DDSCAPS2 ddscaps;
-                               memset (&ddscaps, 0, sizeof (ddscaps));
+                               memset (&ddscaps, 0, sizeof ddscaps);
                                ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
                                ddrval = IDirectDrawSurface7_GetAttachedSurface (dxdata.primary, &ddscaps, &dxdata.flipping[0]);
                                if(SUCCEEDED (ddrval)) {
                                        if (desc.dwBackBufferCount > 1) {
-                                               memset (&ddscaps, 0, sizeof (ddscaps));
+                                               memset (&ddscaps, 0, sizeof ddscaps);
                                                ddscaps.dwCaps = DDSCAPS_FLIP;
                                                ddrval = IDirectDrawSurface7_GetAttachedSurface (dxdata.flipping[0], &ddscaps, &dxdata.flipping[1]);
                                        }
@@ -1079,22 +1079,32 @@ static void getcaps (void)
        showcaps (&hc);
 }
 
-static int guidcounter;
 static GUID monitorguids[MAX_DISPLAYS];
 
 static BOOL CALLBACK displaysCallback (GUID *guid, char *adesc, char *aname, LPVOID ctx, HMONITOR hm)
 {
-       if (guidcounter >= MAX_DISPLAYS)
-               return FALSE;
+       HMONITOR winmon;
+       POINT pt;
+       int i;
+
        if (guid == NULL)
                return TRUE;
-       memcpy (&monitorguids[guidcounter], guid, sizeof GUID);
-       guidcounter++;
+       for (i = 0; Displays[i].monitorname; i++) {
+               struct MultiDisplay *md = &Displays[i];
+               pt.x = (md->rect.right - md->rect.left) / 2 + md->rect.left;
+               pt.y = (md->rect.bottom - md->rect.top) / 2 + md->rect.top;
+               winmon = MonitorFromPoint (pt, MONITOR_DEFAULTTONEAREST);
+               if (hm == winmon) {
+                       memcpy (&monitorguids[i], guid, sizeof GUID);
+                       return TRUE;
+               }
+       }
        return TRUE;
 }
 
 int DirectDraw_Start (void)
 {
+       static bool guidsenumerated;
        static int first, firstdd;
        HRESULT ddrval;
        LPDIRECT3D9 d3d;
@@ -1131,15 +1141,17 @@ int DirectDraw_Start (void)
                return 1;
        }
 
-       if (!guidcounter)
+       if (!guidsenumerated) {
+               guidsenumerated = true;
                DirectDrawEnumerateExA (displaysCallback, 0, DDENUM_DETACHEDSECONDARYDEVICES | DDENUM_ATTACHEDSECONDARYDEVICES);
+       }
 
        guid = NULL;
        if (isfullscreen () > 0) {
                int disp = currprefs.gfx_display - 1;
                if (disp < 0)
                        disp = 0;
-               if (disp >= guidcounter)
+               if (disp >= MAX_DISPLAYS)
                        disp = 0;
                guid = &monitorguids[disp];
        }
index d385050f39d6f125ac23a6899fb8ecc7dda4ead9..43d96656c4c1aeef08370105557379ba773fbe36 100644 (file)
@@ -43,7 +43,7 @@
 //#define DBG_KEYBD 1
 //#define DEBUG_KBD
 
-static struct uae_input_device_kbr_default keytrans[] = {
+static struct uae_input_device_kbr_default keytrans_amiga[] = {
 
        { DIK_ESCAPE, INPUTEVENT_KEY_ESC },
 
@@ -143,6 +143,7 @@ static struct uae_input_device_kbr_default keytrans[] = {
        { DIK_DELETE, INPUTEVENT_KEY_DEL },
        { DIK_HOME, INPUTEVENT_KEY_AMIGA_RIGHT },
        { DIK_NEXT, INPUTEVENT_KEY_HELP },
+       { DIK_PRIOR, INPUTEVENT_SPC_FREEZEBUTTON },
 
        { DIK_LBRACKET, INPUTEVENT_KEY_LEFTBRACKET },
        { DIK_RBRACKET, INPUTEVENT_KEY_RIGHTBRACKET },
@@ -159,15 +160,14 @@ static struct uae_input_device_kbr_default keytrans[] = {
 //     { DIK_VOLUMEUP, INPUTEVENT_SPC_MASTER_VOLUME_UP },
 //     { DIK_MUTE, INPUTEVENT_SPC_MASTER_VOLUME_MUTE },
 
-       { DIK_HOME, INPUTEVENT_KEY_70 },
-       { DIK_END, INPUTEVENT_KEY_71 },
-//    { DIK_SYSRQ, INPUTEVENT_KEY_6E },
-//    { DIK_F12, INPUTEVENT_KEY_6F },
-       { DIK_INSERT, INPUTEVENT_KEY_47 },
-//    { DIK_PRIOR, INPUTEVENT_KEY_48 },
-       { DIK_PRIOR, INPUTEVENT_SPC_FREEZEBUTTON },
-       { DIK_NEXT, INPUTEVENT_KEY_49 },
-       { DIK_F11, INPUTEVENT_KEY_4B },
+//     { DIK_HOME, INPUTEVENT_KEY_70 },
+       { DIK_END, INPUTEVENT_KEY_END },
+//     { DIK_SYSRQ, INPUTEVENT_KEY_6E },
+//     { DIK_F12, INPUTEVENT_KEY_6F },
+//     { DIK_INSERT, INPUTEVENT_KEY_47 },
+//     { DIK_PRIOR, INPUTEVENT_KEY_48 },
+//     { DIK_NEXT, INPUTEVENT_KEY_49 },
+       { DIK_F11, INPUTEVENT_KEY_F11 },
 
        { DIK_MEDIASTOP, INPUTEVENT_KEY_CDTV_STOP },
        { DIK_PLAYPAUSE, INPUTEVENT_KEY_CDTV_PLAYPAUSE },
@@ -177,6 +177,137 @@ static struct uae_input_device_kbr_default keytrans[] = {
        { -1, 0 }
 };
 
+static struct uae_input_device_kbr_default keytrans_pc1[] = {
+
+       { DIK_ESCAPE, INPUTEVENT_KEY_ESC },
+
+       { DIK_F1, INPUTEVENT_KEY_F1 },
+       { DIK_F2, INPUTEVENT_KEY_F2 },
+       { DIK_F3, INPUTEVENT_KEY_F3 },
+       { DIK_F4, INPUTEVENT_KEY_F4 },
+       { DIK_F5, INPUTEVENT_KEY_F5 },
+       { DIK_F6, INPUTEVENT_KEY_F6 },
+       { DIK_F7, INPUTEVENT_KEY_F7 },
+       { DIK_F8, INPUTEVENT_KEY_F8 },
+       { DIK_F9, INPUTEVENT_KEY_F9 },
+       { DIK_F10, INPUTEVENT_KEY_F10 },
+       { DIK_F11, INPUTEVENT_KEY_F11 },
+       { DIK_F12, INPUTEVENT_KEY_F12 },
+
+       { DIK_1, INPUTEVENT_KEY_1 },
+       { DIK_2, INPUTEVENT_KEY_2 },
+       { DIK_3, INPUTEVENT_KEY_3 },
+       { DIK_4, INPUTEVENT_KEY_4 },
+       { DIK_5, INPUTEVENT_KEY_5 },
+       { DIK_6, INPUTEVENT_KEY_6 },
+       { DIK_7, INPUTEVENT_KEY_7 },
+       { DIK_8, INPUTEVENT_KEY_8 },
+       { DIK_9, INPUTEVENT_KEY_9 },
+       { DIK_0, INPUTEVENT_KEY_0 },
+
+       { DIK_TAB, INPUTEVENT_KEY_TAB },
+
+       { DIK_A, INPUTEVENT_KEY_A },
+       { DIK_B, INPUTEVENT_KEY_B },
+       { DIK_C, INPUTEVENT_KEY_C },
+       { DIK_D, INPUTEVENT_KEY_D },
+       { DIK_E, INPUTEVENT_KEY_E },
+       { DIK_F, INPUTEVENT_KEY_F },
+       { DIK_G, INPUTEVENT_KEY_G },
+       { DIK_H, INPUTEVENT_KEY_H },
+       { DIK_I, INPUTEVENT_KEY_I },
+       { DIK_J, INPUTEVENT_KEY_J },
+       { DIK_K, INPUTEVENT_KEY_K },
+       { DIK_L, INPUTEVENT_KEY_L },
+       { DIK_M, INPUTEVENT_KEY_M },
+       { DIK_N, INPUTEVENT_KEY_N },
+       { DIK_O, INPUTEVENT_KEY_O },
+       { DIK_P, INPUTEVENT_KEY_P },
+       { DIK_Q, INPUTEVENT_KEY_Q },
+       { DIK_R, INPUTEVENT_KEY_R },
+       { DIK_S, INPUTEVENT_KEY_S },
+       { DIK_T, INPUTEVENT_KEY_T },
+       { DIK_U, INPUTEVENT_KEY_U },
+       { DIK_W, INPUTEVENT_KEY_W },
+       { DIK_V, INPUTEVENT_KEY_V },
+       { DIK_X, INPUTEVENT_KEY_X },
+       { DIK_Y, INPUTEVENT_KEY_Y },
+       { DIK_Z, INPUTEVENT_KEY_Z },
+
+       { DIK_CAPITAL, INPUTEVENT_KEY_CAPS_LOCK, ID_FLAG_TOGGLE },
+
+       { DIK_NUMPAD1, INPUTEVENT_KEY_NP_1 },
+       { DIK_NUMPAD2, INPUTEVENT_KEY_NP_2 },
+       { DIK_NUMPAD3, INPUTEVENT_KEY_NP_3 },
+       { DIK_NUMPAD4, INPUTEVENT_KEY_NP_4 },
+       { DIK_NUMPAD5, INPUTEVENT_KEY_NP_5 },
+       { DIK_NUMPAD6, INPUTEVENT_KEY_NP_6 },
+       { DIK_NUMPAD7, INPUTEVENT_KEY_NP_7 },
+       { DIK_NUMPAD8, INPUTEVENT_KEY_NP_8 },
+       { DIK_NUMPAD9, INPUTEVENT_KEY_NP_9 },
+       { DIK_NUMPAD0, INPUTEVENT_KEY_NP_0 },
+       { DIK_DECIMAL, INPUTEVENT_KEY_NP_PERIOD },
+       { DIK_ADD, INPUTEVENT_KEY_NP_ADD },
+       { DIK_SUBTRACT, INPUTEVENT_KEY_NP_SUB },
+       { DIK_MULTIPLY, INPUTEVENT_KEY_NP_MUL },
+       { DIK_DIVIDE, INPUTEVENT_KEY_NP_DIV },
+       { DIK_NUMPADENTER, INPUTEVENT_KEY_ENTER },
+
+       { DIK_MINUS, INPUTEVENT_KEY_SUB },
+       { DIK_EQUALS, INPUTEVENT_KEY_EQUALS },
+       { DIK_BACK, INPUTEVENT_KEY_BACKSPACE },
+       { DIK_RETURN, INPUTEVENT_KEY_RETURN },
+       { DIK_SPACE, INPUTEVENT_KEY_SPACE },
+
+       { DIK_LSHIFT, INPUTEVENT_KEY_SHIFT_LEFT },
+       { DIK_LCONTROL, INPUTEVENT_KEY_CTRL },
+       { DIK_LWIN, INPUTEVENT_KEY_AMIGA_LEFT },
+       { DIK_LMENU, INPUTEVENT_KEY_ALT_LEFT },
+       { DIK_RMENU, INPUTEVENT_KEY_ALT_RIGHT },
+       { DIK_RWIN, INPUTEVENT_KEY_AMIGA_RIGHT },
+       { DIK_APPS, INPUTEVENT_KEY_APPS },
+       { DIK_RCONTROL, INPUTEVENT_KEY_CTRL_RIGHT },
+       { DIK_RSHIFT, INPUTEVENT_KEY_SHIFT_RIGHT },
+
+       { DIK_UP, INPUTEVENT_KEY_CURSOR_UP },
+       { DIK_DOWN, INPUTEVENT_KEY_CURSOR_DOWN },
+       { DIK_LEFT, INPUTEVENT_KEY_CURSOR_LEFT },
+       { DIK_RIGHT, INPUTEVENT_KEY_CURSOR_RIGHT },
+
+       { DIK_LBRACKET, INPUTEVENT_KEY_LEFTBRACKET },
+       { DIK_RBRACKET, INPUTEVENT_KEY_RIGHTBRACKET },
+       { DIK_SEMICOLON, INPUTEVENT_KEY_SEMICOLON },
+       { DIK_APOSTROPHE, INPUTEVENT_KEY_SINGLEQUOTE },
+       { DIK_GRAVE, INPUTEVENT_KEY_BACKQUOTE },
+       { DIK_BACKSLASH, INPUTEVENT_KEY_2B },
+       { DIK_COMMA, INPUTEVENT_KEY_COMMA },
+       { DIK_PERIOD, INPUTEVENT_KEY_PERIOD },
+       { DIK_SLASH, INPUTEVENT_KEY_DIV },
+       { DIK_OEM_102, INPUTEVENT_KEY_30 },
+
+       { DIK_INSERT, INPUTEVENT_KEY_INSERT },
+       { DIK_DELETE, INPUTEVENT_KEY_DEL },
+       { DIK_HOME, INPUTEVENT_KEY_HOME },
+       { DIK_END, INPUTEVENT_KEY_END },
+    { DIK_PRIOR, INPUTEVENT_KEY_PAGEUP },
+       { DIK_NEXT, INPUTEVENT_KEY_PAGEDOWN },
+       { DIK_SCROLL, INPUTEVENT_KEY_HELP },
+    { DIK_SYSRQ, INPUTEVENT_KEY_SYSRQ },
+
+       { DIK_MEDIASTOP, INPUTEVENT_KEY_CDTV_STOP },
+       { DIK_PLAYPAUSE, INPUTEVENT_KEY_CDTV_PLAYPAUSE },
+       { DIK_PREVTRACK, INPUTEVENT_KEY_CDTV_PREV },
+       { DIK_NEXTTRACK, INPUTEVENT_KEY_CDTV_NEXT },
+
+       { -1, 0 }
+};
+
+static struct uae_input_device_kbr_default *keytrans[] = {
+       keytrans_amiga,
+       keytrans_pc1,
+       keytrans_pc1
+};
+
 static int kb_np[] = { DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD8, -1, DIK_NUMPAD2, -1, DIK_NUMPAD0, DIK_NUMPAD5, -1, DIK_DECIMAL, -1, DIK_NUMPADENTER, -1, -1 };
 static int kb_ck[] = { DIK_LEFT, -1, DIK_RIGHT, -1, DIK_UP, -1, DIK_DOWN, -1, DIK_RCONTROL, DIK_RMENU, -1, DIK_RSHIFT, -1, -1 };
 static int kb_se[] = { DIK_A, -1, DIK_D, -1, DIK_W, -1, DIK_S, -1, DIK_LMENU, -1, DIK_LSHIFT, -1, -1 };
@@ -206,7 +337,9 @@ extern int ispressed (int key);
 
 static int specialkeycode (void)
 {
-       return currprefs.win32_specialkey;
+       if (currprefs.input_keyboard_type == 0)
+               return currprefs.win32_specialkey;
+       return -1;
 }
 static int specialpressed (void)
 {
@@ -273,26 +406,30 @@ void my_kbd_handler (int keyboard, int scancode, int newstate)
 {
        int code = 0;
        int scancode_new;
+       int defaultguikey;
+       bool amode = currprefs.input_keyboard_type == 0;
        static int swapperdrive = 0;
 
        if (scancode == specialkeycode ())
                return;
 
-       if (scancode == DIK_F11 && currprefs.win32_ctrl_F11_is_quit && ctrlpressed ())
+       if (amode && scancode == DIK_F11 && currprefs.win32_ctrl_F11_is_quit && ctrlpressed ())
                code = AKS_QUIT;
 
        scancode_new = scancode;
        if (!specialpressed () && inputdevice_iskeymapped (keyboard, scancode))
                scancode = 0;
+       
+       defaultguikey = amode ? DIK_F12 : DIK_NUMLOCK;
        // GUI must be always available
-       if (scancode_new == DIK_F12 && currprefs.win32_guikey < 0)
+       if (scancode_new == defaultguikey && currprefs.win32_guikey < 0)
                scancode = scancode_new;
-       if (scancode_new == currprefs.win32_guikey && scancode_new != DIK_F12)
+       if (scancode_new == currprefs.win32_guikey && scancode_new != defaultguikey)
                scancode = scancode_new;
        
        //write_log (L"keyboard = %d scancode = 0x%02x state = %d\n", keyboard, scancode, newstate );
 
-       if (newstate == 0 && code == 0) {
+       if (amode && newstate == 0 && code == 0) {
                switch (scancode)
                {
                        case DIK_SYSRQ:
@@ -304,7 +441,7 @@ void my_kbd_handler (int keyboard, int scancode, int newstate)
 
        if (newstate && code == 0) {
 
-               if (scancode == DIK_F12 || scancode == currprefs.win32_guikey) {
+               if (scancode == defaultguikey || scancode == currprefs.win32_guikey) {
                        if (ctrlpressed ()) {
                                code = AKS_TOGGLEDEFAULTSCREEN;
                        } else if (shiftpressed () || specialpressed ()) {
@@ -317,6 +454,10 @@ void my_kbd_handler (int keyboard, int scancode, int newstate)
                        }
                }
 
+       }
+
+       if (newstate && code == 0 && amode) {
+
                switch (scancode)
                {
                case DIK_F1:
index cbe6a46d629c53c1df6198b4a0fff876f31d12ba..167f612269ee8c2557052ffd79ba73c5cdb3e82a 100644 (file)
@@ -1997,6 +1997,10 @@ static void picasso96_alloc2 (TrapContext *ctx)
 
        i = 0;
        while (DisplayModes[i].depth >= 0) {
+               if (DisplayModes[i].rawmode) {
+                       i++;
+                       continue;
+               }
                j = i;
                size += PSSO_LibResolution_sizeof;
                while (missmodes[misscnt * 2] == 0)
index 2eebbf6f4384ab4e7c8e9d87cb9122434a98b17c..e8058eeacdd46e7c17ac052d7064afd942906d32 100644 (file)
 #define IDS_AUTOSCALE_INTEGER           375
 #define IDS_SCREEN_VSYNC2_AUTOSWITCH    376
 #define IDS_SCREEN_VSYNC2               377
+#define IDS_STRING23                    378
+#define IDS_SCREEN_VSYNC_NONE           378
 #define IDS_QS_MODELS                   1000
 #define IDS_QS_MODEL_A500               1001
 #define IDS_QS_MODEL_A500P              1002
index 8c86b4c51df10e6b91d26546492e5654e1db2591..06fd92f7ac058098e31903214381d8b3b1a46fb5 100644 (file)
@@ -138,8 +138,8 @@ BEGIN
     EDITTEXT        IDC_RATE2TEXT,143,192,41,12,ES_AUTOHSCROLL\r
     COMBOBOX        IDC_RESOLUTIONDEPTH,134,27,46,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
     CONTROL         "Filtered low resolution",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,125,89,10\r
-    COMBOBOX        IDC_SCREENMODE_NATIVE,39,85,67,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
-    COMBOBOX        IDC_SCREENMODE_RTG,39,103,67,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
+    COMBOBOX        IDC_SCREENMODE_NATIVE,39,85,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
+    COMBOBOX        IDC_SCREENMODE_RTG,39,103,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
     RTEXT           "Native:",IDC_STATIC,9,85,23,15,SS_CENTERIMAGE\r
     RTEXT           "RTG:",IDC_STATIC,8,101,24,15,SS_CENTERIMAGE\r
     PUSHBUTTON      "Reset to defaults",IDC_DA_RESET,221,218,75,14\r
@@ -151,8 +151,8 @@ BEGIN
     COMBOBOX        IDC_DISPLAY_BUFFERCNT,187,47,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
     CONTROL         "Resolution autoswitch",IDC_AUTORESOLUTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,139,89,10\r
     EDITTEXT        IDC_DA_TEXT,167,218,46,12,ES_AUTOHSCROLL | ES_READONLY\r
-    COMBOBOX        IDC_SCREENMODE_NATIVE2,112,85,95,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
-    COMBOBOX        IDC_SCREENMODE_RTG2,112,103,95,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
+    COMBOBOX        IDC_SCREENMODE_NATIVE2,108,85,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
+    COMBOBOX        IDC_SCREENMODE_RTG2,108,103,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
     COMBOBOX        IDC_RATE2BOX,143,173,60,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
     CONTROL         "",IDC_RATE2ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,194,193,8,10\r
 END\r
@@ -1503,8 +1503,8 @@ BEGIN
     IDS_SCREEN_WINDOWED     "Windowed"\r
     IDS_SCREEN_FULLSCREEN   "Fullscreen"\r
     IDS_SCREEN_FULLWINDOW   "Full-window"\r
-    IDS_SCREEN_VSYNC        "VSync"\r
-    IDS_SCREEN_VSYNC_AUTOSWITCH "AutoVSync"\r
+    IDS_SCREEN_VSYNC        "Legacy"\r
+    IDS_SCREEN_VSYNC_AUTOSWITCH "Legacy, 50/60Hz switch"\r
     IDS_SOUND_MONO          "Mono"\r
     IDS_SOUND_MIXED         "Mixed"\r
     IDS_SOUND_STEREO        "Stereo"\r
@@ -1694,8 +1694,9 @@ BEGIN
     IDS_PORT_AUTOFIRE_ALWAYS "Autofire (always)"\r
     IDS_PORT_AUTOFIRE_NO    "No autofire"\r
     IDS_AUTOSCALE_INTEGER   "Integer scaling"\r
-    IDS_SCREEN_VSYNC2_AUTOSWITCH "Low latency AutoVSync"\r
-    IDS_SCREEN_VSYNC2       "Low latency VSync"\r
+    IDS_SCREEN_VSYNC2_AUTOSWITCH "Low latency, 50/60Hz"\r
+    IDS_SCREEN_VSYNC2       "Low latency"\r
+    IDS_SCREEN_VSYNC_NONE   "(VSync)"\r
 END\r
 \r
 #endif    // English resources\r
index 952af389b8612b39b0545f44e5b4545f8ead446e..1e36e163fb8d7d1de3f1c37ebc89746f46ee68c0 100644 (file)
@@ -132,7 +132,7 @@ struct sound_dp
 #define EXP 2.1
 
 #define ADJUST_VSSIZE 10
-#define EXPVS 1.7
+#define EXPVS 1.6
 
 int sound_debug = 0;
 int sound_mode_skip = 0;
@@ -209,14 +209,17 @@ extern int vsynctime_orig;
 static int avioutput_audio;
 #endif
 
+#define ADJUST_LIMIT 7
+#define ADJUST_LIMIT2 1.5
+
 void sound_setadjust (double v)
 {
        float mult;
 
-       if (v < -5)
-               v = -5;
-       if (v > 5)
-               v = 5;
+       if (v < -ADJUST_LIMIT)
+               v = -ADJUST_LIMIT;
+       if (v > ADJUST_LIMIT)
+               v = ADJUST_LIMIT;
 
        mult = (1000.0 + v);
        if (avioutput_audio && avioutput_enabled && avioutput_nosoundsync)
@@ -233,6 +236,7 @@ void sound_setadjust (double v)
        }
 }
 
+
 static void docorrection (struct sound_dp *s, int sndbuf, double sync, int granulaty)
 {
        static int tfprev;
@@ -244,20 +248,23 @@ static void docorrection (struct sound_dp *s, int sndbuf, double sync, int granu
                granulaty = 10;
 
        if (tfprev != timeframes) {
-               double skipmode;
+               double skipmode, avgskipmode;
                double avg = s->avg_correct / s->cnt_correct;
-               if ((1 || sound_debug) && (tfprev % 10) == 0) {
-                       write_log (L"%+4d %7.1f %7.1f %6d\n", sndbuf, avg, sync, granulaty);
+
+               skipmode = sync / 10.0;
+               avgskipmode = avg / (10000.0 / granulaty);
+
+               if ((0 || sound_debug) && (tfprev % 10) == 0) {
+                       write_log (L"%+05d S=%7.1f AVG=%7.1f (IMM=%7.1f + AVG=%7.1f = %7.1f)\n", sndbuf, sync, avg, skipmode, avgskipmode, skipmode + avgskipmode);
                }
                gui_data.sndbuf = sndbuf;
-               skipmode = sync / 100.0;
 
-               if (skipmode > 1)
-                       skipmode = 1;
-               if (skipmode < -1)
-                       skipmode = -1;
+               if (skipmode > ADJUST_LIMIT2)
+                       skipmode = ADJUST_LIMIT2;
+               if (skipmode < -ADJUST_LIMIT2)
+                       skipmode = -ADJUST_LIMIT2;
 
-               sound_setadjust (avg / (5000 / granulaty));
+               sound_setadjust (skipmode + avgskipmode);
                tfprev = timeframes;
        }
 }
@@ -1863,7 +1870,7 @@ static double sync_sound (double m)
        double skipmode;
        if (isvsync () || 1) {
 
-               skipmode = pow (m < 0 ? -m : m, EXPVS) / 10;
+               skipmode = pow (m < 0 ? -m : m, EXPVS) / 8;
                if (m < 0)
                        skipmode = -skipmode;
                if (skipmode < -ADJUST_VSSIZE)
@@ -2155,10 +2162,10 @@ static void finish_sound_buffer_ds (struct sound_data *sd, uae_u16 *sndbuffer)
                                sd->sndbufsize / sd->samplesize, s->snd_configsize / sd->samplesize, s->max_sndbufsize / sd->samplesize,
                                s->dsoundbuf / sd->samplesize, diff / sd->samplesize, vdiff, skipmode, s->avg_correct / s->cnt_correct, adj);
                        tfprev = timeframes;
-                       if (skipmode > 1)
-                               skipmode = 1;
-                       if (skipmode < -1)
-                               skipmode = -1;
+                       if (skipmode > ADJUST_LIMIT2)
+                               skipmode = ADJUST_LIMIT2;
+                       if (skipmode < -ADJUST_LIMIT2)
+                               skipmode = -ADJUST_LIMIT2;
                        sound_setadjust (skipmode + adj);
                }
        }
index 532d95b6fcf9ec6a184c298ecfd5bf69749d3d9b..7fc4bc1c5d0a4608ac892cef50d96f5901dab49e 100644 (file)
@@ -4452,6 +4452,7 @@ extern void test (void);
 extern int screenshotmode, postscript_print_debugging, sound_debug, log_uaeserial, clipboard_debug;
 extern int force_direct_catweasel, sound_mode_skip, maxmem;
 extern int pngprint, log_sercon, midi_inbuflen;
+extern int vsync_busy_wait_mode;
 
 extern DWORD_PTR cpu_affinity, cpu_paffinity;
 static DWORD_PTR original_affinity = -1;
@@ -4722,13 +4723,16 @@ static int parseargs (const TCHAR *argx, const TCHAR *np, const TCHAR *np2)
        if (!np)
                return 0;
 
+       if (!_tcscmp (arg, L"vsyncbusywait")) {
+               vsync_busy_wait_mode = getval (np);
+               return 2;
+       }
        if (!_tcscmp (arg, L"midiinbuffer")) {
                midi_inbuflen = getval (np);
                if (midi_inbuflen < 16000)
                        midi_inbuflen = 16000;
                return 2;
        }
-
        if (!_tcscmp (arg, L"ddforcemode")) {
                extern int ddforceram;
                ddforceram = getval (np);
index 169b7f37e4c7aeb69e20924430c4de7d3983e9b6..6126c8205ce5d781129bffd61e841b59c678d5ed 100644 (file)
@@ -19,8 +19,8 @@
 #define LANG_DLL 1
 
 //#define WINUAEBETA L""
-#define WINUAEBETA L"Beta 8"
-#define WINUAEDATE MAKEBD(2011, 12, 26)
+#define WINUAEBETA L"Beta 9"
+#define WINUAEDATE MAKEBD(2011, 12, 30)
 #define WINUAEEXTRA L""
 #define WINUAEREV L""
 
index 27bfea018b4efd88bb70fae124b1fbf42dc5d16e..bb2058a7532391049a06e8a0472953e3de16f25b 100644 (file)
@@ -131,6 +131,24 @@ void gfx_unlock (void)
        LeaveCriticalSection (&screen_cs);
 }
 
+int vsync_busy_wait_mode;
+
+static void vsync_sleep (bool preferbusy)
+{
+       int bb = picasso_on ? currprefs.gfx_rtg_backbuffers : currprefs.gfx_backbuffers;
+       bool dowait;
+
+       if (vsync_busy_wait_mode == 0) {
+               dowait = bb || !preferbusy;
+       } else if (vsync_busy_wait_mode < 0) {
+               dowait = true;
+       } else {
+               dowait = false;
+       }
+       if (dowait)
+               sleep_millis_main (1);
+}
+
 static void changevblankthreadmode (int newmode)
 {
        int t = vblankthread_counter;
@@ -141,13 +159,13 @@ static void changevblankthreadmode (int newmode)
        vblankthread_mode = newmode;
        if (newmode == VBLANKTH_KILL) {
                flipthread_mode = 0;
-               SetEvent(flipevent);
+               SetEvent (flipevent);
                while (flipthread_mode == 0)
-                       sleep_millis (1);
-               CloseHandle(flipevent);
+                       sleep_millis_main (1);
+               CloseHandle (flipevent);
        }
        while (t == vblankthread_counter && vblankthread_mode > 0)
-               sleep_millis (1);
+               vsync_sleep (false);
 }
 
 int WIN32GFX_IsPicassoScreen (void)
@@ -632,6 +650,7 @@ void sortdisplays (void)
                md1->DisplayModes[0].depth = -1;
 
                write_log (L"%s [%s]\n", md1->adaptername, md1->monitorname);
+               write_log (L"-: %d*%d [%d*%d]\n", md1->rect.right - md1->rect.left, md1->rect.bottom - md1->rect.top, md1->rect.left, md1->rect.top);
                for (int mode = 0; mode < 2; mode++) {
                        DEVMODE dm;
                        dm.dmSize = sizeof dm;
@@ -2253,7 +2272,7 @@ static bool waitvblankstate (bool state, int *maxvpos)
        }
 }
 
-bool vblank_busywait (void)
+bool vblank_wait (void)
 {
        int vp;
 
@@ -2261,10 +2280,11 @@ bool vblank_busywait (void)
                int opos = prevvblankpos;
                if (!getvblankpos (&vp))
                        return false;
-               if (opos > maxscanline / 2 && vp < maxscanline / 5)
+               if (opos > maxscanline / 2 && vp < maxscanline / 4)
                        return true;
                if (vp <= 0)
                        return true;
+               vsync_sleep (true);
        }
 }
 
@@ -2276,7 +2296,7 @@ bool vblank_getstate (bool *state)
        opos = prevvblankpos;
        if (!getvblankpos (&vp))
                return false;
-       if (opos > maxscanline / 2 && vp < maxscanline / 5) {
+       if (opos > maxscanline / 2 && vp < maxscanline / 4) {
                *state = true;
                return true;
        }
@@ -2374,8 +2394,10 @@ bool vsync_busywait_check (void)
 
 frame_time_t vsync_busywait_end (void)
 {
-       while (!vblank_found && vblankthread_mode == VBLANKTH_ACTIVE)
-               sleep_millis (1);
+
+       while (!vblank_found && vblankthread_mode == VBLANKTH_ACTIVE) {
+               vsync_sleep (true);
+       }
        changevblankthreadmode (VBLANKTH_ACTIVE_WAIT);
        for (;;) {
                int vp;
@@ -2384,6 +2406,7 @@ frame_time_t vsync_busywait_end (void)
                        //write_log (L"%d ", vpos);
                        break;
                }
+               vsync_sleep (true);
        }
        return thread_vblank_time;
 }
@@ -2451,11 +2474,12 @@ bool vsync_busywait_do (int *freetime)
                }
 
                while (!framelost && read_processor_time () - prevtime < vblankbasewait) {
-                       sleep_millis_main (1);
+                       vsync_sleep (false);
                }
 
                framelost = false;
-               v = vblank_busywait ();
+               v = vblank_wait ();
+
        }
 
        if (v) {
index df0ff26b2e83283a92319f7c7abc4cd62e50e8a5..82f62e652a9243d9c7c3f5a794396472505046e4 100644 (file)
 #define CONFIG_HOST L"Host"
 #define CONFIG_HARDWARE L"Hardware"
 
+#define SOUND_BUFFER_MULTIPLIER 1024
+
 static wstring szNone;
 
 static int allow_quit;
@@ -5651,22 +5653,23 @@ static void values_to_displaydlg (HWND hDlg)
        WIN32GUI_LoadUIString(IDS_SCREEN_FULLWINDOW, buffer, sizeof buffer / sizeof (TCHAR));
        SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE, CB_ADDSTRING, 0, (LPARAM)buffer);
 
-       SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)L"-");
-#if 0
-       WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC, buffer, sizeof buffer / sizeof (TCHAR));
-       SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer);
-       WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC_AUTOSWITCH, buffer, sizeof buffer / sizeof (TCHAR));
+       
+       WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC_NONE, buffer, sizeof buffer / sizeof (TCHAR));
        SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer);
-#endif
        WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC2, buffer, sizeof buffer / sizeof (TCHAR));
        SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer);
        WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC2_AUTOSWITCH, buffer, sizeof buffer / sizeof (TCHAR));
        SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer);
-
+#if 1
+       WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC, buffer, sizeof buffer / sizeof (TCHAR));
+       SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer);
+       WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC_AUTOSWITCH, buffer, sizeof buffer / sizeof (TCHAR));
+       SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer);
+#endif
        SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE, CB_SETCURSEL,
                workprefs.gfx_afullscreen, 0);
        SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_SETCURSEL,
-               workprefs.gfx_avsync, 0);
+               workprefs.gfx_avsync + (workprefs.gfx_avsyncmode || !workprefs.gfx_avsync ? 0 : 2), 0);
 
        SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG, CB_RESETCONTENT, 0, 0);
        SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG2, CB_RESETCONTENT, 0, 0);
@@ -5840,7 +5843,7 @@ static void values_from_displaydlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l
        if (i > 0) {
                i--;
                workprefs.gfx_avsync = (i & 1) + 1;
-               workprefs.gfx_avsyncmode = 1;
+               workprefs.gfx_avsyncmode = (i < 2) ? 1 : 0;
        }
 
        workprefs.gfx_pfullscreen = SendDlgItemMessage (hDlg, IDC_SCREENMODE_RTG, CB_GETCURSEL, 0, 0);
@@ -8135,7 +8138,7 @@ static void update_soundgui (HWND hDlg)
        int bufsize;
        TCHAR txt[20];
 
-       bufsize = exact_log2 (workprefs.sound_maxbsiz / 1024);
+       bufsize = exact_log2 (workprefs.sound_maxbsiz / SOUND_BUFFER_MULTIPLIER) + 1;
        _stprintf (txt, L"%d", bufsize);
        SetDlgItemText (hDlg, IDC_SOUNDBUFFERMEM, txt);
 
@@ -8263,9 +8266,9 @@ static void values_to_sounddlg (HWND hDlg)
        CheckDlgButton (hDlg, IDC_SOUND_AUTO, workprefs.sound_auto);
 
        workprefs.sound_maxbsiz = 1 << exact_log2 (workprefs.sound_maxbsiz);
-       if (workprefs.sound_maxbsiz < 2048)
-               workprefs.sound_maxbsiz = 2048;
-       SendDlgItemMessage (hDlg, IDC_SOUNDBUFFERRAM, TBM_SETPOS, TRUE, exact_log2 (workprefs.sound_maxbsiz / 2048));
+       if (workprefs.sound_maxbsiz < SOUND_BUFFER_MULTIPLIER)
+               workprefs.sound_maxbsiz = SOUND_BUFFER_MULTIPLIER;
+       SendDlgItemMessage (hDlg, IDC_SOUNDBUFFERRAM, TBM_SETPOS, TRUE, exact_log2 (workprefs.sound_maxbsiz / SOUND_BUFFER_MULTIPLIER));
 
        SendDlgItemMessage (hDlg, IDC_SOUNDVOLUME, TBM_SETPOS, TRUE, 0);
        SendDlgItemMessage (hDlg, IDC_SOUNDDRIVEVOLUME, TBM_SETPOS, TRUE, 0);
@@ -8488,7 +8491,7 @@ static INT_PTR CALLBACK SoundDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
                break;
 
        case WM_HSCROLL:
-               workprefs.sound_maxbsiz = 2048 << SendMessage (GetDlgItem (hDlg, IDC_SOUNDBUFFERRAM), TBM_GETPOS, 0, 0);
+               workprefs.sound_maxbsiz = SOUND_BUFFER_MULTIPLIER << SendMessage (GetDlgItem (hDlg, IDC_SOUNDBUFFERRAM), TBM_GETPOS, 0, 0);
                workprefs.sound_volume = 100 - SendMessage (GetDlgItem (hDlg, IDC_SOUNDVOLUME), TBM_GETPOS, 0, 0);
                workprefs.dfxclickvolume = 100 - SendMessage (GetDlgItem (hDlg, IDC_SOUNDDRIVEVOLUME), TBM_GETPOS, 0, 0);
                update_soundgui (hDlg);
index 5301a791a5d338e1493dd2a9f6015153ccf5e8e4..0e22a545e887e4144c09ad0566efb3a8c72025c8 100644 (file)
       <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
       <ForcedIncludeFiles>%(ForcedIncludeFiles)</ForcedIncludeFiles>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
index 39c2b8feb53547f5276041564a7d7303ac045fb3..a7bc20c1a9bfed2c2036d33d4487aaba7dde9e43 100644 (file)
@@ -1,4 +1,26 @@
 
+- USB HID game controller support really works now. (HID signed value handling is a bit special)
+  Also added pad quirks list from Linux, some game pads apparently report bad minimum and maximum range
+  values, this also includes Logitech G13 stick which was not listed (reported range is -127 to 127,
+  real range is 0 to 255) and this caused the b8 problem because I assumed it was supposed to work that way
+  which of course broke other correctly working devices with negative minimum range.
+- D3D and DirectDraw fullscreen mode monitor selection improved, it wasn't reliable if system had
+  more than 1 display adapter(s). (Win32 EnumDisplayDevices(), DirectDraw and Direct3D monitor indexes
+  are not guaranteed to be same)
+- Adjusted sound buffer range, old 1 is new 2, 2 is 3, and so on. Old 7 is too big, most drivers won't
+  accept it and new vsync can work with buffer smaller than old 1. (Buffer size "0" or "1/2" would have
+  been too confusing..) In other words, if you load old configuration, only value shown in GUI increases by one,
+  real buffer size does not change.
+- Fixed Graffiti emulation crash in if Graffiti hires mode was detected but emulation was
+  not configured for superhires support. (Only in some situations)
+- Disable genlock detected option if A2024 or Graffiti enabled, this is impossible configuration and would only slow down
+  emulation (forces Graffiti emulation to keep looking for command codes continuously)
+- PC keyboard emulation mode, maps keys like F12, End, Home etc.. to Amiga key codes (afaik same key codes are also used by AROS, OS4 and MorphOS).
+  Num Lock opens the GUI by default (Only remaining key that is more or less free), all other special UAE key mappings are disabled.
+  Config file only at the moment: input.keyboard_type=pc
+- Do not include "raw" display modes (marked as "!") in RTG resolution list.
+- Old vsync mode is back (native only, non-fastest CPU mode compatible only)
+
 Beta 8:
 
 - Fixed D3D RTG hardware cursor stupid divide by zero crash introduced in b6
index d05ac87b868d633a452ed4fdb48d6ae12e543bf8..f4bf36e1888bf749919054fdf6c569d8cb435d57 100755 (executable)
@@ -83,9 +83,6 @@ static bool graffiti(struct vidbuffer *src, struct vidbuffer *dst)
        if (!(bplcon0 & 0x0100)) // GAUD
                return false;
 
-       if (monitor != MONITOREMU_GRAFFITI)
-               clearmonitor(dst);
-
        command = true;
        found = false;
        isntsc = (beamcon0 & 0x20) ? 0 : 1;
@@ -112,7 +109,7 @@ static bool graffiti(struct vidbuffer *src, struct vidbuffer *dst)
        dstbuf = dst->bufmem + (((ystart << VRES_MAX) - src->yoffset) / gfxvidinfo.ychange) * dst->rowbytes + (((xstart << RES_MAX) - src->xoffset) / gfxvidinfo.xchange) * dst->pixbytes;
 
        y = 0;
-       while (srcend > srcbuf) {
+       while (srcend > srcbuf && dst->bufmemend > dstbuf) {
                uae_u8 *srcp = srcbuf + extrapix;
                uae_u8 *dstp = dstbuf;
 
@@ -161,6 +158,10 @@ static bool graffiti(struct vidbuffer *src, struct vidbuffer *dst)
                                                        } else {
                                                                hires = false;
                                                        }
+                                                       if (xpixadd == 0) // shres needed
+                                                               return false;
+                                                       if (monitor != MONITOREMU_GRAFFITI)
+                                                               clearmonitor(dst);
                                                } else if (cmd & 4) {
                                                        if ((cmd & 3) == 1) {
                                                                read_mask = parm;