if (!cfgfile_separate_line (line, line1b, line2b))
return;
cfgfile_parse_separated_line (p, line1b, line2b, type);
- return;
}
static void subst (char *p, char *f, int n)
return cfgfile_separate_line (tmp, option, value);
}
+#if 0
static int cfgfile_handle_custom_event (char *custom, int mode)
{
char option[CONFIG_BLEN], value[CONFIG_BLEN];
return 1;
return 0;
}
-
+#endif
int cmdlineparser (char *s, char *outp[], int max)
{
AKS_DECREASEREFRESHRATE,
AKS_INCREASEREFRESHRATE,
AKS_ARCADIADIAGNOSTICS, AKS_ARCADIAPLY1, AKS_ARCADIAPLY2, AKS_ARCADIACOIN1, AKS_ARCADIACOIN2,
- AKS_TOGGLEMOUSEGRAB, AKS_SWITCHINTERPOL
+ AKS_TOGGLEMOUSEGRAB, AKS_SWITCHINTERPOL,
+ AKS_INPUT_CONFIG_1,AKS_INPUT_CONFIG_2,AKS_INPUT_CONFIG_3,AKS_INPUT_CONFIG_4,
+ AKS_DISKSWAPPER_NEXT,AKS_DISKSWAPPER_PREV,
+ AKS_DISKSWAPPER_INSERT0,AKS_DISKSWAPPER_INSERT1,AKS_DISKSWAPPER_INSERT2,AKS_DISKSWAPPER_INSERT3,
};
*p = 0;
}
if (custom)
- sprintf (p, "'%s'.%d", custom, id->flags[i + offset][j]);
+ sprintf (p, "'%s'.%d", custom, id->flags[i + offset][j] & 0xff);
else if (event <= 0)
sprintf (p, "NULL");
else
*p = 0;
}
if (custom)
- sprintf (p, "'%s'.%d", custom, kbr->flags[i][j]);
+ sprintf (p, "'%s'.%d", custom, kbr->flags[i][j] & 0xff);
else if (evt > 0)
sprintf (p, "%s.%d", events[evt].confname, kbr->flags[i][j]);
else
}
flags = getnum (&p);
if (custom == NULL && ie->name == NULL) {
- if (!strcmp(p2,"NULL")) {
- id->eventid[keynum][subnum] = 0;
- id->flags[keynum][subnum] = 0;
+ if (!strcmp(p2, "NULL")) {
+ if (joystick < 0) {
+ id->eventid[keynum][subnum] = 0;
+ id->flags[keynum][subnum] = 0;
+ } else if (button) {
+ id->eventid[num + ID_BUTTON_OFFSET][subnum] = 0;
+ id->flags[num + ID_BUTTON_OFFSET][subnum] = 0;
+ } else {
+ id->eventid[num + ID_AXIS_OFFSET][subnum] = 0;
+ id->flags[num + ID_AXIS_OFFSET][subnum] = 0;
+ }
}
continue;
}
void inputdevice_handle_inputcode (void)
{
+ static int swapperslot;
int code = inputcode_pending;
int state = inputcode_pending_state;
+
inputcode_pending = 0;
if (code == 0)
return;
changed_prefs.chipset_refreshrate = 900;
}
break;
+ case AKS_DISKSWAPPER_NEXT:
+ swapperslot++;
+ if (swapperslot >= MAX_SPARE_DRIVES || currprefs.dfxlist[swapperslot][0] == 0)
+ swapperslot = 0;
+ break;
+ case AKS_DISKSWAPPER_PREV:
+ swapperslot--;
+ if (swapperslot < 0)
+ swapperslot = MAX_SPARE_DRIVES - 1;
+ while (swapperslot > 0) {
+ if (currprefs.dfxlist[swapperslot][0])
+ break;
+ swapperslot--;
+ }
+ break;
+ case AKS_DISKSWAPPER_INSERT0:
+ case AKS_DISKSWAPPER_INSERT1:
+ case AKS_DISKSWAPPER_INSERT2:
+ case AKS_DISKSWAPPER_INSERT3:
+ strcpy (changed_prefs.df[code - AKS_DISKSWAPPER_INSERT0], currprefs.dfxlist[swapperslot]);
+ break;
+
+ break;
+ case AKS_INPUT_CONFIG_1:
+ case AKS_INPUT_CONFIG_2:
+ case AKS_INPUT_CONFIG_3:
+ case AKS_INPUT_CONFIG_4:
+ changed_prefs.input_selected_setting = currprefs.input_selected_setting = code - AKS_INPUT_CONFIG_1 + 1;
+ inputdevice_updateconfig (&currprefs);
+ break;
+ }
+}
+
+int handle_custom_event (char *custom)
+{
+ char *p, *buf, *nextp;
+
+ if (custom == NULL)
+ return 0;
+ p = buf = my_strdup (custom);
+ while (p && *p) {
+ char *p2;
+ if (*p != '\"')
+ break;
+ p++;
+ p2 = p;
+ while (*p2 != '\"' && *p2 != 0)
+ p2++;
+ if (*p2 == '\"') {
+ *p2++ = 0;
+ nextp = p2 + 1;
+ while (*nextp == ' ')
+ nextp++;
+ }
+ write_log("'%s'\n", p);
+ cfgfile_parse_line (&changed_prefs, p, 0);
+ p = nextp;
}
+ xfree(buf);
+ return 0;
}
int handle_input_event (int nr, int state, int max, int autofire)
return 0;
}
+static void process_custom_event (struct uae_input_device *id, int offset, int state)
+{
+ int idx = -1;
+ int custompos = (id->flags[offset][0] >> 15) & 1;
+ char *custom;
+
+ if (state < 0) {
+ idx = 0;
+ custompos = 0;
+ } else {
+ idx = state > 0 ? 0 : 1;
+ if (custompos)
+ idx += 2;
+ if (state == 0)
+ custompos ^= 1;
+ }
+ custom = id->custom[offset][idx];
+ if (custom == NULL) {
+ if (idx >= 2)
+ custom = id->custom[offset][idx - 2];
+ }
+ handle_custom_event (custom);
+ id->flags[offset][0] &= ~0x8000;
+ id->flags[offset][0] |= custompos << 15;
+}
+
static void setbuttonstateall (struct uae_input_device *id, struct uae_input_device2 *id2, int button, int state)
{
- int event, autofire, i;
+ int evt, autofire, i;
uae_u32 mask = 1 << button;
uae_u32 omask = id2->buttonmask & mask;
uae_u32 nmask = (state ? 1 : 0) << button;
- char *custom;
if (!id->enabled) {
if (state)
}
if (button >= ID_BUTTON_TOTAL)
return;
+
for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) {
- event = id->eventid[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]];
- custom = id->custom[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]];
- if (event <= 0 && custom == NULL)
- continue;
+ evt = id->eventid[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]];
autofire = (id->flags[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]] & ID_FLAG_AUTOFIRE) ? 1 : 0;
if (state < 0) {
- handle_input_event (event, 1, 1, 0);
- queue_input_event (event, 0, 1, 1, 0); /* send release event next frame */
+ handle_input_event (evt, 1, 1, 0);
+ queue_input_event (evt, 0, 1, 1, 0); /* send release event next frame */
+ if (i == 0)
+ process_custom_event (id, ID_BUTTON_OFFSET + button, state);
} else {
- if ((omask ^ nmask) & mask)
- handle_input_event (event, state, 1, autofire);
+ if ((omask ^ nmask) & mask) {
+ handle_input_event (evt, state, 1, autofire);
+ if (i == 0)
+ process_custom_event (id, ID_BUTTON_OFFSET + button, state);
+ }
}
}
+
if ((omask ^ nmask) & mask) {
if (state)
id2->buttonmask |= mask;
if (na->extra[j][0] == scancode) {
for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) {/* send key release events in reverse order */
int autofire = (na->flags[j][sublevdir[state == 0 ? 1 : 0][k]] & ID_FLAG_AUTOFIRE) ? 1 : 0;
- int event = na->eventid[j][sublevdir[state == 0 ? 1 : 0][k]];
- char *custom = na->custom[j][sublevdir[state == 0 ? 1 : 0][k]];
- handled |= handle_input_event (event, state, 1, autofire);
+ int evt = na->eventid[j][sublevdir[state == 0 ? 1 : 0][k]];
+ handled |= handle_input_event (evt, state, 1, autofire);
}
+ process_custom_event (na, j, state);
return handled;
}
j++;
static int is_event_used (struct inputdevice_functions *id, int devnum, int isnum, int isevent)
{
struct uae_input_device *uid = get_uid (id, devnum);
- int num, event, flag, sub;
+ int num, evt, flag, sub;
char *custom;
for (num = 0; num < id->get_widget_num (devnum); num++) {
for (sub = 0; sub < MAX_INPUT_SUB_EVENT; sub++) {
- if (get_event_data (id, devnum, num, &event, &custom, &flag, sub) >= 0) {
- if (event == isevent && isnum != num)
+ if (get_event_data (id, devnum, num, &evt, &custom, &flag, sub) >= 0) {
+ if (evt == isevent && isnum != num)
return 1;
}
}
ie2++;
continue;
}
- if (ie2->allow_mask & mask) break;
+ if (ie2->allow_mask & mask)
+ break;
ie2++;
}
if (!(ie2->allow_mask & AM_INFO))
DEFEVENT(SPC_INCREASE_REFRESHRATE,"Increase emulation speed",AM_K,0,0,AKS_INCREASEREFRESHRATE)
DEFEVENT(SPC_SWITCHINTERPOL,"Switch between audio interpolation methods",AM_K,0,0,AKS_SWITCHINTERPOL)
+DEFEVENT(SPC_DISKSWAPPER_NEXT,"Next slot in Disk Swapper",AM_K,0,0,AKS_DISKSWAPPER_NEXT)
+DEFEVENT(SPC_DISKSWAPPER_PREV,"Previous slot in Disk Swapper",AM_K,0,0,AKS_DISKSWAPPER_PREV)
+DEFEVENT(SPC_DISKSWAPPER_INSERT0,"Insert disk in current Disk Swapper slot in DF0:",AM_K,0,0,AKS_DISKSWAPPER_INSERT0)
+DEFEVENT(SPC_DISKSWAPPER_INSERT1,"Insert disk in current Disk Swapper slot in DF1:",AM_K,0,0,AKS_DISKSWAPPER_INSERT1)
+DEFEVENT(SPC_DISKSWAPPER_INSERT2,"Insert disk in current Disk Swapper slot in DF2:",AM_K,0,0,AKS_DISKSWAPPER_INSERT2)
+DEFEVENT(SPC_DISKSWAPPER_INSERT3,"Insert disk in current Disk Swapper slot in DF3:",AM_K,0,0,AKS_DISKSWAPPER_INSERT3)
+
+DEFEVENT(SPC_INPUT_CONFIG1,"Select Input Configuration #1",AM_K,0,0,AKS_INPUT_CONFIG_1)
+DEFEVENT(SPC_INPUT_CONFIG2,"Select Input Configuration #2",AM_K,0,0,AKS_INPUT_CONFIG_2)
+DEFEVENT(SPC_INPUT_CONFIG3,"Select Input Configuration #3",AM_K,0,0,AKS_INPUT_CONFIG_3)
+DEFEVENT(SPC_INPUT_CONFIG4,"Select Input Configuration #4",AM_K,0,0,AKS_INPUT_CONFIG_4)
+
DEFEVENT(SPC_ARCADIA_DIAGNOSTICS,"Arcadia diagnostics dip switch",AM_K,0,0,AKS_ARCADIADIAGNOSTICS)
DEFEVENT(SPC_ARCADIA_PLAYER1,"Arcadia player 1",AM_K,0,0,AKS_ARCADIAPLY1)
DEFEVENT(SPC_ARCADIA_PLAYER2,"Arcadia player 2",AM_K,0,0,AKS_ARCADIAPLY2)
uae_u32 args2;
int args3;
long args4;
- char *args5;
+ char buf[MAXGETHOSTSTRUCT];
};
struct threadargsw {
WSADATA wsbData;
volatile HANDLE hGetThreads[MAX_GET_THREADS];
- volatile struct threadargs *threadGetargs[MAX_GET_THREADS];
+ volatile struct threadargs threadGetargs[MAX_GET_THREADS];
volatile int threadGetargs_inuse[MAX_GET_THREADS];
volatile HANDLE hGetEvents[MAX_GET_THREADS];
static unsigned int thread_get2(void *indexp)
{
- int index = *((int*)indexp);
- unsigned int result = 0;
- volatile struct threadargs *argsp;
- struct threadargs margs, *args;
- uae_u32 name;
- uae_u32 namelen;
- long addrtype;
- char *name_rp;
- char *buf;
- SB;
+ int index = *((int*)indexp);
+ unsigned int result = 0;
+ volatile struct threadargs *args;
+ uae_u32 name;
+ uae_u32 namelen;
+ long addrtype;
+ char *name_rp;
+ SB;
for (;;) {
+
WaitForSingleObject(bsd->hGetEvents[index], INFINITE);
- if (bsd->threadGetargs_inuse[index] == -1) {
+
+ if (bsd->threadGetargs_inuse[index] == -1)
bsd->threadGetargs_inuse[index] = 0;
- bsd->threadGetargs[index] = NULL;
- }
- if ((argsp = bsd->threadGetargs[index]) != NULL) {
- margs = *argsp;
- args = &margs;
+
+ if (bsd->threadGetargs_inuse[index]) {
+ args = &bsd->threadGetargs[index];
sb = args->sb;
if (args->args1 == 0) {
+
// gethostbyname or gethostbyaddr
struct hostent *host;
name = args->args2;
namelen = args->args3;
addrtype = args->args4;
- buf = args->args5;
name_rp = "";
if (addr_valid("thread_get1", name, 1))
name_rp = get_real_address(name);
TRACE(("failed (%d) - ", sb->sb_errno));
} else {
bsdsocklib_seterrno(sb, 0);
- memcpy(buf, host, sizeof(HOSTENT));
+ memcpy(args->buf, host, sizeof(HOSTENT));
}
}
}
+
} else if (args->args1 == 1) {
+
// getprotobyname
struct protoent *proto;
name = args->args2;
- buf = args->args5;
name_rp = "";
if (addr_valid("thread_get2", name, 1))
name_rp = get_real_address(name);
TRACE(("failed (%d) - ", sb->sb_errno));
} else {
bsdsocklib_seterrno(sb, 0);
- memcpy(buf, proto, sizeof(struct protoent));
+ memcpy(args->buf, proto, sizeof(struct protoent));
}
}
+
} else if (args->args1 == 2) {
+
// getservbyport and getservbyname
uae_u32 nameport;
uae_u32 proto;
nameport = args->args2;
proto = args->args3;
type = args->args4;
- buf = args->args5;
if (proto) {
if (addr_valid("thread_get3", proto, 1))
TRACE(("failed (%d) - ", sb->sb_errno));
} else {
bsdsocklib_seterrno(sb, 0);
- memcpy(buf, serv, sizeof(struct servent));
+ memcpy(args->buf, serv, sizeof(struct servent));
}
}
}
SETSIGNAL;
bsd->threadGetargs_inuse[index] = 0;
- bsd->threadGetargs[index] = NULL;
}
}
return 0;
}
-static int run_get_thread(TrapContext *context, SB, volatile struct threadargs *args)
+static volatile struct threadargs *run_get_thread(TrapContext *context, SB, struct threadargs *args)
{
int i;
for (i = 0; i < MAX_GET_THREADS; i++) {
if (bsd->threadGetargs_inuse[i] == -1) {
bsd->threadGetargs_inuse[i] = 0;
- bsd->threadGetargs[i] = NULL;
}
if (bsd->hGetThreads[i] && !bsd->threadGetargs_inuse[i])
break;
return 0;
} else {
bsdsetpriority (bsd->hGetThreads[i]);
- bsd->threadGetargs[i] = args;
+ memcpy (&bsd->threadGetargs[i], args, sizeof (struct threadargs));
bsd->threadGetargs_inuse[i] = 1;
SetEvent(bsd->hGetEvents[i]);
}
}
CANCELSIGNAL;
- return 1;
+ return &bsd->threadGetargs[i];
}
void host_gethostbynameaddr(TrapContext *context, SB, uae_u32 name, uae_u32 namelen, long addrtype)
char *name_rp;
int i;
struct threadargs args;
+ volatile struct threadargs *argsp;
uae_u32 addr;
uae_u32 *addr_list[2];
- char buf[MAXGETHOSTSTRUCT];
+ volatile char *buf;
unsigned int wMsg = 0;
// char on = 1;
// InternetSetOption(0,INTERNET_OPTION_SETTINGS_CHANGED,&on,strlen(&on));
// Do not use: Causes locks with some machines
+ memset(&args, 0, sizeof (args));
+ argsp = &args;
+ buf = argsp->buf;
name_rp = "";
+
if (addr_valid("host_gethostbynameaddr", name, 1))
name_rp = get_real_address(name);
TRACE(("gethostbyaddr(0x%lx,0x%lx,%ld) -> ",name,namelen,addrtype));
}
- args.sb = sb;
- args.args1 = 0;
- args.args2 = name;
- args.args3 = namelen;
- args.args4 = addrtype;
- args.args5 = buf;
+ argsp->sb = sb;
+ argsp->args1 = 0;
+ argsp->args2 = name;
+ argsp->args3 = namelen;
+ argsp->args4 = addrtype;
- if (!run_get_thread(context, sb, &args))
+ argsp = run_get_thread(context, sb, &args);
+ if (!argsp)
return;
+ buf = argsp->buf;
if (!sb->sb_errno) {
kludge:
char *name_rp;
int i;
struct threadargs args;
- char buf[MAXGETHOSTSTRUCT];
+ volatile struct threadargs *argsp;
name_rp = "";
if (addr_valid("host_gethostbynameaddr", name, 1))
TRACE(("getprotobyname(%s) -> ",name_rp));
- args.sb = sb;
- args.args1 = 1;
- args.args2 = name;
- args.args5 = buf;
+ memset(&args, 0, sizeof (args));
+ argsp = &args;
+ argsp->sb = sb;
+ argsp->args1 = 1;
+ argsp->args2 = name;
- if (!run_get_thread(context, sb, &args))
+ argsp = run_get_thread(context, sb, &args);
+ if (!argsp)
return;
if (!sb->sb_errno) {
- p = (PROTOENT *)buf;
+ p = (PROTOENT *)argsp->buf;
// compute total size of protoent
size = 16;
uae_u32 aptr;
char *name_rp = NULL, *proto_rp = NULL;
int i;
-
- char buf[MAXGETHOSTSTRUCT];
struct threadargs args;
+ volatile struct threadargs *argsp;
if (proto) {
if (addr_valid("host_getservbynameport1", proto, 1))
TRACE(("getservbyname(%s,%s) -> ",name_rp,proto_rp ? proto_rp : "NULL"));
}
- args.sb = sb;
- args.args1 = 2;
- args.args2 = nameport;
- args.args3 = proto;
- args.args4 = type;
- args.args5 = buf;
+ memset(&args, 0, sizeof (args));
+ argsp = &args;
+ argsp->sb = sb;
+ argsp->args1 = 2;
+ argsp->args2 = nameport;
+ argsp->args3 = proto;
+ argsp->args4 = type;
- if (!run_get_thread(context, sb, &args))
+ argsp = run_get_thread(context, sb, &args);
+ if (!argsp)
return;
if (!sb->sb_errno) {
- s = (SERVENT *)buf;
+ s = (SERVENT *)argsp->buf;
// compute total size of servent
size = 20;
#define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
#define GETBDD(x) ((x) % 100)
-#define WINUAEBETA 1
+#define WINUAEBETA 2
#define WINUAEPUBLICBETA 1
-#define WINUAEDATE MAKEBD(2007, 3, 6)
+#define WINUAEDATE MAKEBD(2007, 3, 7)
#define IHF_WINDOWHIDDEN 6
#define NORMAL_WINDOW_STYLE (WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU)
+Beta 2:
+- better bsdsocket threading fix, should finally fix random crashes.
+- diskswapper input-panel input targets added (next/prev/insert)
+- change input configuration (1-4) input target added
+- custom input targets added, experimental, not in GUI yet, need manual
+ configuration file editing, syntax:
+ <anything>.button.x=<press>,<release>,<secondary press>,<sec. release>
+ press/release = key down/up, joystick button down/up
+ secondary = toggle-mode (first press uses "press" event, second press
+ uses "secondary press", third press is again "press" event etc..)
+ format of single event: '"entry=value"'.0 "unlimited" multiple
+ entry/value pairs supported: '"entry1=value1" "entry2=value2"'.0
+ empty event: NULL.0
+ Examples:
+ - toggle onscreen leds:
+ '"show_leds=false"'.0,NULL.0,'"show_leds=true"'.0
+ - refresh rate = 100 while key/button is kept down:
+ '"chipset_refreshrate=100"'.0,'"chipset_refreshrate=50"'.0
+ NOTES: format can change in future, toggle-mode may be added to regular
+ input event mapping system in future version.
+ BTW: custom input was implemented ages ago but it was not enabled until
+ now... (I forgot it..)
+
Beta 1:
+- startup crash fixed if serial port enumeration detected more than
+ 8 ports. (broke in 140b6 when "compatibility mode" enumeration was
+ added) Also increased max amount of supported serial ports
- default ASPI detection selected (possibly non-existing) AdaptecASPI
-- Quickstart automatically selects working SCSI mode (uses setting from
- default.uae if available, if not, selects "best" available)
+- Quickstart now automatically selects working SCSI mode (uses setting
+ from default.uae if available, if not, selects "best" available)
- 120b1 right border update fixed to work in interlaced modes (Unreal)
-- serial port "compatibility mode" enumeration added in 140b6 didn't
- check if serial port buffer was already full (>=8 devices detected)
- Added check and increased size of buffer.
1.4.0