From: Toni Wilen Date: Wed, 7 Mar 2007 17:40:42 +0000 (+0200) Subject: imported winuaesrc1410b2.zip X-Git-Tag: 2100~238 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=5bfc143cc472e116bb5a43caee08d7727143ac7d;p=francis%2Fwinuae.git imported winuaesrc1410b2.zip --- diff --git a/cfgfile.c b/cfgfile.c index 18762bfe..3695c339 100755 --- a/cfgfile.c +++ b/cfgfile.c @@ -1486,7 +1486,6 @@ void cfgfile_parse_line (struct uae_prefs *p, char *line, int type) 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) @@ -2092,6 +2091,7 @@ static int getconfigstoreline (struct zfile *z, char *option, char *value) 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]; @@ -2148,7 +2148,7 @@ static int cfgfile_handle_custom_event (char *custom, int mode) return 1; return 0; } - +#endif int cmdlineparser (char *s, char *outp[], int max) { diff --git a/include/keyboard.h b/include/keyboard.h index 017c2ff1..14401052 100755 --- a/include/keyboard.h +++ b/include/keyboard.h @@ -150,5 +150,8 @@ enum aks { AKS_ENTERGUI = 0x200, AKS_SCREENSHOT, AKS_FREEZEBUTTON, 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, }; diff --git a/inputdevice.c b/inputdevice.c index 325916ac..d764943d 100755 --- a/inputdevice.c +++ b/inputdevice.c @@ -424,7 +424,7 @@ static void write_config2 (struct zfile *f, int idnum, int i, int offset, char * *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 @@ -507,7 +507,7 @@ static void write_kbr_config (struct zfile *f, int idnum, int devnum, struct uae *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 @@ -701,9 +701,17 @@ void read_inputdevice_config (struct uae_prefs *pr, char *option, char *value) } 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; } @@ -1457,8 +1465,10 @@ void inputdevice_do_keyboard (int code, int state) void inputdevice_handle_inputcode (void) { + static int swapperslot; int code = inputcode_pending; int state = inputcode_pending_state; + inputcode_pending = 0; if (code == 0) return; @@ -1615,7 +1625,66 @@ void inputdevice_handle_inputcode (void) 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) @@ -1827,13 +1896,38 @@ static int switchdevice(struct uae_input_device *id, int num) 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) @@ -1842,20 +1936,24 @@ static void setbuttonstateall (struct uae_input_device *id, struct uae_input_dev } 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; @@ -2222,10 +2320,10 @@ static int inputdevice_translatekeycode_2 (int keyboard, int scancode, int state 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++; @@ -2362,13 +2460,13 @@ static int put_event_data (struct inputdevice_functions *id, int devnum, int num 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; } } @@ -2490,7 +2588,8 @@ int inputdevice_iterate (int devnum, int num, char *name, int *af) ie2++; continue; } - if (ie2->allow_mask & mask) break; + if (ie2->allow_mask & mask) + break; ie2++; } if (!(ie2->allow_mask & AM_INFO)) diff --git a/inputevents.def b/inputevents.def index 36d0d0fc..5a8e628e 100755 --- a/inputevents.def +++ b/inputevents.def @@ -313,6 +313,18 @@ DEFEVENT(SPC_DECREASE_REFRESHRATE,"Decrease emulation speed",AM_K,0,0,AKS_DECREA 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) diff --git a/od-win32/bsdsock.c b/od-win32/bsdsock.c index 75272d63..edbe3b6b 100755 --- a/od-win32/bsdsock.c +++ b/od-win32/bsdsock.c @@ -43,7 +43,7 @@ struct threadargs { uae_u32 args2; int args3; long args4; - char *args5; + char buf[MAXGETHOSTSTRUCT]; }; struct threadargsw { @@ -69,7 +69,7 @@ struct bsdsockdata { 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]; @@ -1953,35 +1953,33 @@ static BOOL CheckOnline(SB) 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); @@ -2001,16 +1999,17 @@ static unsigned int thread_get2(void *indexp) 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); @@ -2022,10 +2021,12 @@ static unsigned int thread_get2(void *indexp) 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; @@ -2036,7 +2037,6 @@ static unsigned int thread_get2(void *indexp) nameport = args->args2; proto = args->args3; type = args->args4; - buf = args->args5; if (proto) { if (addr_valid("thread_get3", proto, 1)) @@ -2058,7 +2058,7 @@ static unsigned int thread_get2(void *indexp) TRACE(("failed (%d) - ", sb->sb_errno)); } else { bsdsocklib_seterrno(sb, 0); - memcpy(buf, serv, sizeof(struct servent)); + memcpy(args->buf, serv, sizeof(struct servent)); } } } @@ -2069,7 +2069,6 @@ static unsigned int thread_get2(void *indexp) SETSIGNAL; bsd->threadGetargs_inuse[index] = 0; - bsd->threadGetargs[index] = NULL; } } @@ -2086,14 +2085,13 @@ static unsigned int __stdcall thread_get(void *p) 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; @@ -2124,7 +2122,7 @@ static int run_get_thread(TrapContext *context, SB, volatile struct threadargs * 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]); } @@ -2137,7 +2135,7 @@ static int run_get_thread(TrapContext *context, SB, volatile struct threadargs * } CANCELSIGNAL; - return 1; + return &bsd->threadGetargs[i]; } void host_gethostbynameaddr(TrapContext *context, SB, uae_u32 name, uae_u32 namelen, long addrtype) @@ -2148,16 +2146,21 @@ void host_gethostbynameaddr(TrapContext *context, SB, uae_u32 name, uae_u32 name 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); @@ -2181,15 +2184,16 @@ void host_gethostbynameaddr(TrapContext *context, SB, uae_u32 name, uae_u32 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: @@ -2259,7 +2263,7 @@ void host_getprotobyname(TrapContext *context, SB, uae_u32 name) char *name_rp; int i; struct threadargs args; - char buf[MAXGETHOSTSTRUCT]; + volatile struct threadargs *argsp; name_rp = ""; if (addr_valid("host_gethostbynameaddr", name, 1)) @@ -2267,16 +2271,18 @@ void host_getprotobyname(TrapContext *context, SB, uae_u32 name) 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; @@ -2334,9 +2340,8 @@ void host_getservbynameport(TrapContext *context, SB, uae_u32 nameport, uae_u32 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)) @@ -2351,18 +2356,20 @@ void host_getservbynameport(TrapContext *context, SB, uae_u32 nameport, uae_u32 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; diff --git a/od-win32/win32.h b/od-win32/win32.h index 245f3061..adf55d51 100755 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -15,9 +15,9 @@ #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) diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 74522113..058295d3 100755 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,14 +1,37 @@ +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: + .button.x=,,, + 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