From: Toni Wilen Date: Fri, 30 Dec 2011 18:41:49 +0000 (+0200) Subject: 2400b9 X-Git-Tag: 2400~19 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=63682b14973bfc6291700b932aae70c02c0d7a5c;p=francis%2Fwinuae.git 2400b9 --- diff --git a/bsdsocket.cpp b/bsdsocket.cpp index 0cd1b36a..4b35b021 100644 --- a/bsdsocket.cpp +++ b/bsdsocket.cpp @@ -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")); diff --git a/cfgfile.cpp b/cfgfile.cpp index ff0c2fb8..d4874173 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -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) || diff --git a/custom.cpp b/custom.cpp index ab88f60a..dc83949f 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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 (); diff --git a/drawing.cpp b/drawing.cpp index cb5f43d4..00bb1f83 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -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; } } diff --git a/include/inputdevice.h b/include/inputdevice.h index c1bd6dbb..9ea6313c 100644 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -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*); diff --git a/include/options.h b/include/options.h index 88ddbd06..42b58160 100644 --- a/include/options.h +++ b/include/options.h @@ -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]; diff --git a/inputdevice.cpp b/inputdevice.cpp index 76acdabe..58b7ab60 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -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; diff --git a/inputevents.def b/inputevents.def index 30f6efa1..1ac2eb65 100644 --- a/inputevents.def +++ b/inputevents.def @@ -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) diff --git a/main.cpp b/main.cpp index f0b82357..2e5327db 100644 --- 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) diff --git a/od-win32/bsdsock.cpp b/od-win32/bsdsock.cpp index 4ebd2540..d6680c6c 100644 --- a/od-win32/bsdsock.cpp +++ b/od-win32/bsdsock.cpp @@ -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; diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index b3dadd58..3e24bfe5 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -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]) diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index d1a8cb9a..20c35777 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -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); } diff --git a/od-win32/dxwrap.cpp b/od-win32/dxwrap.cpp index 4bed1061..61b0476b 100644 --- a/od-win32/dxwrap.cpp +++ b/od-win32/dxwrap.cpp @@ -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]; } diff --git a/od-win32/keyboard_win32.cpp b/od-win32/keyboard_win32.cpp index d385050f..43d96656 100644 --- a/od-win32/keyboard_win32.cpp +++ b/od-win32/keyboard_win32.cpp @@ -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: diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index cbe6a46d..167f6122 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -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) diff --git a/od-win32/resources/resource b/od-win32/resources/resource index 2eebbf6f..e8058eea 100644 --- a/od-win32/resources/resource +++ b/od-win32/resources/resource @@ -352,6 +352,8 @@ #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 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 8c86b4c5..06fd92f7 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -138,8 +138,8 @@ BEGIN EDITTEXT IDC_RATE2TEXT,143,192,41,12,ES_AUTOHSCROLL COMBOBOX IDC_RESOLUTIONDEPTH,134,27,46,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP CONTROL "Filtered low resolution",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,125,89,10 - COMBOBOX IDC_SCREENMODE_NATIVE,39,85,67,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_SCREENMODE_RTG,39,103,67,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SCREENMODE_NATIVE,39,85,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SCREENMODE_RTG,39,103,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP RTEXT "Native:",IDC_STATIC,9,85,23,15,SS_CENTERIMAGE RTEXT "RTG:",IDC_STATIC,8,101,24,15,SS_CENTERIMAGE PUSHBUTTON "Reset to defaults",IDC_DA_RESET,221,218,75,14 @@ -151,8 +151,8 @@ BEGIN COMBOBOX IDC_DISPLAY_BUFFERCNT,187,47,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP CONTROL "Resolution autoswitch",IDC_AUTORESOLUTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,139,89,10 EDITTEXT IDC_DA_TEXT,167,218,46,12,ES_AUTOHSCROLL | ES_READONLY - COMBOBOX IDC_SCREENMODE_NATIVE2,112,85,95,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_SCREENMODE_RTG2,112,103,95,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SCREENMODE_NATIVE2,108,85,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SCREENMODE_RTG2,108,103,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_RATE2BOX,143,173,60,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_RATE2ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,194,193,8,10 END @@ -1503,8 +1503,8 @@ BEGIN IDS_SCREEN_WINDOWED "Windowed" IDS_SCREEN_FULLSCREEN "Fullscreen" IDS_SCREEN_FULLWINDOW "Full-window" - IDS_SCREEN_VSYNC "VSync" - IDS_SCREEN_VSYNC_AUTOSWITCH "AutoVSync" + IDS_SCREEN_VSYNC "Legacy" + IDS_SCREEN_VSYNC_AUTOSWITCH "Legacy, 50/60Hz switch" IDS_SOUND_MONO "Mono" IDS_SOUND_MIXED "Mixed" IDS_SOUND_STEREO "Stereo" @@ -1694,8 +1694,9 @@ BEGIN IDS_PORT_AUTOFIRE_ALWAYS "Autofire (always)" IDS_PORT_AUTOFIRE_NO "No autofire" IDS_AUTOSCALE_INTEGER "Integer scaling" - IDS_SCREEN_VSYNC2_AUTOSWITCH "Low latency AutoVSync" - IDS_SCREEN_VSYNC2 "Low latency VSync" + IDS_SCREEN_VSYNC2_AUTOSWITCH "Low latency, 50/60Hz" + IDS_SCREEN_VSYNC2 "Low latency" + IDS_SCREEN_VSYNC_NONE "(VSync)" END #endif // English resources diff --git a/od-win32/sounddep/sound.cpp b/od-win32/sounddep/sound.cpp index 952af389..1e36e163 100644 --- a/od-win32/sounddep/sound.cpp +++ b/od-win32/sounddep/sound.cpp @@ -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); } } diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 532d95b6..7fc4bc1c 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -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); diff --git a/od-win32/win32.h b/od-win32/win32.h index 169b7f37..6126c820 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -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"" diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 27bfea01..bb2058a7 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -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) { diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index df0ff26b..82f62e65 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -103,6 +103,8 @@ #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); diff --git a/od-win32/winuae_msvc10/winuae_msvc.vcxproj b/od-win32/winuae_msvc10/winuae_msvc.vcxproj index 5301a791..0e22a545 100644 --- a/od-win32/winuae_msvc10/winuae_msvc.vcxproj +++ b/od-win32/winuae_msvc10/winuae_msvc.vcxproj @@ -152,6 +152,7 @@ false %(ForcedIncludeFiles) true + Disabled _DEBUG;%(PreprocessorDefinitions) diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 39c2b8fe..a7bc20c1 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -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 diff --git a/specialmonitors.cpp b/specialmonitors.cpp index d05ac87b..f4bf36e1 100755 --- a/specialmonitors.cpp +++ b/specialmonitors.cpp @@ -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;