mirror of
https://github.com/LIV2/WinUAE.git
synced 2025-12-06 00:12:52 +00:00
2400b9
This commit is contained in:
parent
ea4b1f8b26
commit
63682b1497
@ -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"));
|
||||
|
||||
|
||||
14
cfgfile.cpp
14
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) ||
|
||||
|
||||
@ -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 ();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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*);
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
|
||||
10
main.cpp
10
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)
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
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);
|
||||
int v;
|
||||
|
||||
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;
|
||||
|
||||
//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])
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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];
|
||||
}
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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""
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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_NONE, buffer, sizeof buffer / sizeof (TCHAR));
|
||||
SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer);
|
||||
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
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
@ -152,6 +152,7 @@
|
||||
<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
|
||||
<ForcedIncludeFiles>%(ForcedIncludeFiles)</ForcedIncludeFiles>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user