From: Toni Wilen Date: Sat, 20 Jan 2007 16:11:40 +0000 (+0200) Subject: imported winuaesrc1400b2.zip X-Git-Tag: 2100~249 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=544cd97b3a067d12d86547eae1d8f4608e8d188f;p=francis%2Fwinuae.git imported winuaesrc1400b2.zip --- diff --git a/akiko.c b/akiko.c index de5b71fb..16abcce8 100755 --- a/akiko.c +++ b/akiko.c @@ -29,8 +29,6 @@ #define AKIKO_DEBUG_IO 0 #define AKIKO_DEBUG_IO_CMD 0 -int cd32_enabled; - static int m68k_getpc(void) { return 0; } /* @@ -1391,7 +1389,7 @@ int akiko_init (void) } if (cdromok && !akiko_thread_running) { akiko_thread_running = 1; - uae_start_thread (akiko_thread, 0, &akiko_tid); + uae_start_thread ("akiko", akiko_thread, 0, &akiko_tid); } return 1; } diff --git a/ar.c b/ar.c index 7c1c8526..810c6428 100755 --- a/ar.c +++ b/ar.c @@ -1460,7 +1460,7 @@ static void hrtmon_configure(void) cfg->col1h = 0x0f; cfg->col1l = 0xff; cfg->a1200 = (currprefs.chipset_mask & CSMASK_AGA) ? 1 : 0; cfg->aga = (currprefs.chipset_mask & CSMASK_AGA) ? 1 : 0; - cfg->cd32 = cd32_enabled; + cfg->cd32 = currprefs.cs_cd32cd ? 1 : 0; cfg->screenmode = currprefs.ntscmode; cfg->novbr = TRUE; cfg->hexmode = TRUE; diff --git a/bsdsocket.c b/bsdsocket.c index 81162835..9de1f19c 100755 --- a/bsdsocket.c +++ b/bsdsocket.c @@ -41,41 +41,11 @@ struct sockd { static long curruniqid = 65536; static struct sockd *sockdata; -/* Memory-related helper functions */ -STATIC_INLINE void memcpyha (uae_u32 dst, const char *src, int size) -{ - while (size--) - put_byte (dst++, *src++); -} - -char *strncpyah (char *dst, uae_u32 src, int size) -{ - char *res = dst; - while (size-- && (*dst++ = get_byte (src++))); - return res; -} - -char *strcpyah (char *dst, uae_u32 src) -{ - char *res = dst; - while ((*dst++ = get_byte (src++)) != 0); - return res; -} - -uae_u32 strcpyha (uae_u32 dst, const char *src) -{ - uae_u32 res = dst; - - do { - put_byte (dst++, *src); - } while (*src++); - - return res; -} - uae_u32 strncpyha (uae_u32 dst, const char *src, int size) { uae_u32 res = dst; + if (!addr_valid("strncpyha", dst, size)) + return res; while (size--) { put_byte (dst++, *src); if (!*src++) @@ -91,7 +61,7 @@ uae_u32 addstr (uae_u32 * dst, const char *src) len = strlen (src) + 1; - strcpyha (*dst, src); + strcpyha_safe (*dst, src); (*dst) += len; return res; @@ -104,7 +74,7 @@ uae_u32 addmem (uae_u32 * dst, const char *src, int len) if (!src) return 0; - memcpyha (*dst, src, len); + memcpyha_safe (*dst, src, len); (*dst) += len; return res; @@ -223,10 +193,22 @@ SOCKET_TYPE getsock (SB, int sd) return -1; } if (sb->dtable[sd - 1] == INVALID_SOCKET) { - struct socketbase *sb1,*nsb; + struct socketbase *sb1, *nsb; + uaecptr ot; + if (!addr_valid("getsock1", sb->ownertask + 10, 4)) + return -1; + ot = get_long (sb->ownertask + 10); + if (!addr_valid("getsock2", ot, 1)) + return -1; // Fix for Newsrog (All Tasks of Newsrog using the same dtable) for (sb1 = socketbases; sb1; sb1 = nsb) { - if (strcmp(get_real_address (get_long (sb1->ownertask + 10)), get_real_address (get_long (sb->ownertask + 10))) == 0) { + uaecptr ot1; + if (!addr_valid("getsock3", sb1->ownertask + 10, 4)) + break; + ot1 = get_long (sb1->ownertask + 10); + if (!addr_valid("getsock4", ot1, 1)) + break; + if (strcmp(get_real_address (ot1), get_real_address (ot)) == 0) { // Task with same name already exists -> use same dtable if (sb1->dtable[sd - 1] != INVALID_SOCKET) return sb1->dtable[sd - 1]; @@ -1067,7 +1049,8 @@ static uae_u32 REGPARAM2 bsdsocklib_gethostname (TrapContext *context) static uae_u32 REGPARAM2 bsdsocklib_gethostid (TrapContext *context) { - write_log ("bsdsocket: WARNING: Process '%s' calls deprecated function gethostid() - returning 127.0.0.1\n", get_real_address (get_long (gettask (context) + 10))); + write_log ("bsdsocket: WARNING: Process '%s' calls deprecated function gethostid() - returning 127.0.0.1\n", + get_real_address (get_long (gettask (context) + 10))); return 0x7f000001; } @@ -1300,10 +1283,18 @@ static uae_u32 REGPARAM2 bsdsocklib_SocketBaseTagList (TrapContext *context) sb->herrnosize = 4; break; default: - write_log ("bsdsocket: WARNING: Unsupported tag type (%x) in SocketBaseTagList()\n", currtag); + write_log ("bsdsocket: WARNING: Unsupported tag type (%08.8x) in SocketBaseTagList(%x)\n", + currtag, m68k_areg (&context->regs, 0)); + break; } } else { TRACE (("TAG_UNKNOWN(0x%x)", currtag)); + /* Aminetradio uses 0x00004e55 as an ending tag */ + if ((currtag & 0xffff8000) == 0) { + write_log("bsdsocket: WARNING: Corrupted SocketBaseTagList(%x) tag detected (%08.8x)\n", + m68k_areg (&context->regs, 0), currtag); + goto done; + } } } diff --git a/catweasel.c b/catweasel.c index 3a135867..2bb7e192 100755 --- a/catweasel.c +++ b/catweasel.c @@ -40,6 +40,12 @@ int catweasel_ismouse(void) return cwc.can_mouse; } +static int hsync_requested; +static void hsync_request(void) +{ + hsync_requested = 10; +}; + static void sid_write(uae_u8 reg, uae_u8 val, int sidnum) { if (sidnum >= cwc.can_sid) @@ -67,6 +73,7 @@ static uae_u8 get_buttons(void) b = 0; if (cwc.type < CATWEASEL_TYPE_MK3) return b; + hsync_request(); b2 = catweasel_do_bget(0xc8) & (0x80 | 0x40); if (!(b2 & 0x80)) b |= 0x80; @@ -105,6 +112,7 @@ int catweasel_read_mouse(int port, int *dx, int *dy, int *buttons) { if (!cwc.can_mouse) return 0; + hsync_request(); *dx = mouse_x[port]; mouse_x[port] = 0; *dy = mouse_y[port]; @@ -184,6 +192,9 @@ void catweasel_hsync (void) catweasel_do_bput(0xd0, 0); handshake = 0; } + if (hsync_requested < 0) + return; + hsync_requested--; if (cwc.type == CATWEASEL_TYPE_MK3 && cwc.sid[0]) { uae_u8 b; cwmk3buttonsync--; @@ -235,6 +246,7 @@ int catweasel_read_joystick (uae_u8 *dir, uae_u8 *buttons) { if (!cwc.can_joy) return 0; + hsync_request(); *dir = catweasel_do_bget(0xc0); *buttons = get_buttons(); return 1; @@ -246,6 +258,8 @@ int catweasel_read_keyboard (uae_u8 *keycode) if (!cwc.can_kb) return 0; + if (!currprefs.catweasel) + return 0; v = catweasel_do_bget (0xd4); if (!(v & 0x80)) return 0; @@ -265,10 +279,12 @@ uae_u32 catweasel_do_bget (uaecptr addr) if (addr >= 0x100) return 0; buf1[0] = (uae_u8)addr; - if (handle != INVALID_HANDLE_VALUE) - DeviceIoControl (handle, CW_PEEKREG_FULL, buf1, 1, buf2, 1, &did_read, 0); - else + if (handle != INVALID_HANDLE_VALUE) { + if (!DeviceIoControl (handle, CW_PEEKREG_FULL, buf1, 1, buf2, 1, &did_read, 0)) + write_log("catweasel_do_bget fail err=%d\n", GetLastError()); + } else { buf2[0] = ioport_read (cwc.iobase + addr); + } //write_log ("G %02.2X %02.2X %d\n", buf1[0], buf2[0], did_read); return buf2[0]; } @@ -282,10 +298,12 @@ void catweasel_do_bput (uaecptr addr, uae_u32 b) return; buf[0] = (uae_u8)addr; buf[1] = b; - if (handle != INVALID_HANDLE_VALUE) - DeviceIoControl (handle, CW_POKEREG_FULL, buf, 2, 0, 0, &did_read, 0); - else + if (handle != INVALID_HANDLE_VALUE) { + if (!DeviceIoControl (handle, CW_POKEREG_FULL, buf, 2, 0, 0, &did_read, 0)) + write_log("catweasel_do_bput fail err=%d\n", GetLastError()); + } else { ioport_write (cwc.iobase + addr, b); + } //write_log ("P %02.2X %02.2X %d\n", (uae_u8)addr, (uae_u8)b, did_read); } @@ -495,6 +513,8 @@ static int direct_detect(void) return cw; } +static int detected; + int catweasel_init(void) { char name[32], tmp[1000]; @@ -611,6 +631,7 @@ int catweasel_init(void) } } write_log("%s\n", tmp); + detected = 1; return 1; fail: @@ -638,7 +659,7 @@ int catweasel_detect (void) { char name[32]; int i; - static int detected; + HANDLE h; if (detected) return detected < 0 ? 0 : 1; @@ -646,16 +667,16 @@ int catweasel_detect (void) detected = -1; for (i = 0; i < 4; i++) { sprintf (name, "\\\\.\\CAT%u_F0", i); - handle = CreateFile (name, GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, + h = CreateFile (name, GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if (handle != INVALID_HANDLE_VALUE) { - CloseHandle (handle); + if (h != INVALID_HANDLE_VALUE) { + CloseHandle (h); write_log("CW: Windows driver device detected '%s'\n", name); detected = 1; return TRUE; } } - if (handle == INVALID_HANDLE_VALUE) { + if (h == INVALID_HANDLE_VALUE) { if (force_direct_catweasel >= 100) { if (ioport_init()) return TRUE; diff --git a/cdtv.c b/cdtv.c index afacdd04..730641ef 100755 --- a/cdtv.c +++ b/cdtv.c @@ -48,12 +48,10 @@ static volatile int dmac_dma; static volatile int activate_stch, cdrom_command_done; static volatile int cdrom_sector, cdrom_sectors, cdrom_length, cdrom_offset; -static volatile int cd_playing, cd_paused, cd_motor, cd_media, cd_error; +static volatile int cd_playing, cd_paused, cd_motor, cd_media, cd_error, cd_finished; static volatile int cdtv_hsync, dma_wait, dma_finished; -int cdtv_enabled; - static void do_stch(void); static void INT2(void) @@ -262,6 +260,7 @@ static int cdrom_info(uae_u8 *out) out[2] = size >> 16; out[3] = size >> 8; out[4] = size >> 0; + cd_finished = 1; return 5; } @@ -291,6 +290,7 @@ static int read_toc(int track, int msflsn, uae_u8 *out) out[5] = (msflsn ? msf : lsn) >> 16; out[6] = (msflsn ? msf : lsn) >> 8; out[7] = (msflsn ? msf : lsn) >> 0; + cd_finished = 1; return 8; } } @@ -336,6 +336,7 @@ static void cdrom_command_thread(uae_u8 b) case 0x01: /* seek */ if (cdrom_command_cnt_in == 7) { cdrom_command_accepted(0, s, &cdrom_command_cnt_in); + cd_finished = 1; } break; case 0x02: /* read */ @@ -348,12 +349,14 @@ static void cdrom_command_thread(uae_u8 b) if (cdrom_command_cnt_in == 7) { cd_motor = 1; cdrom_command_accepted(0, s, &cdrom_command_cnt_in); + cd_finished = 1; } break; case 0x05: /* motor off */ if (cdrom_command_cnt_in == 7) { cd_motor = 0; cdrom_command_accepted(0, s, &cdrom_command_cnt_in); + cd_finished = 1; } break; case 0x09: /* play (lsn) */ @@ -370,7 +373,8 @@ static void cdrom_command_thread(uae_u8 b) case 0x81: if (cdrom_command_cnt_in == 1) { uae_u8 flag = 1 << 0; - flag |= 1 << 3; + if (cd_finished) + flag |= 1 << 3; if (cd_playing) flag |= 1 << 2; if (cd_error) @@ -381,6 +385,7 @@ static void cdrom_command_thread(uae_u8 b) flag |= 1 << 6; cdrom_command_output[0] = flag; cdrom_command_accepted(1, s, &cdrom_command_cnt_in); + cd_finished = 0; } break; case 0x82: @@ -389,11 +394,13 @@ static void cdrom_command_thread(uae_u8 b) cdrom_command_output[2] |= 1 << 4; cd_error = 0; cdrom_command_accepted(6, s, &cdrom_command_cnt_in); + cd_finished = 1; } break; case 0x84: if (cdrom_command_cnt_in == 7) { cdrom_command_accepted(0, s, &cdrom_command_cnt_in); + cd_finished = 1; } break; case 0x87: /* subq */ @@ -415,11 +422,13 @@ static void cdrom_command_thread(uae_u8 b) if (cdrom_command_cnt_in == 7) { pause_audio (s[1] == 0x00 ? 1 : 0); cdrom_command_accepted(0, s, &cdrom_command_cnt_in); + cd_finished = 1; } break; case 0xa3: /* front panel */ if (cdrom_command_cnt_in == 7) { cdrom_command_accepted(0, s, &cdrom_command_cnt_in); + cd_finished = 1; } break; default: @@ -468,6 +477,7 @@ static void dma_do_thread(void) } dmac_dma = 0; dma_finished = 1; + cd_finished = 1; } static void *dev_thread (void *p) @@ -492,6 +502,7 @@ static void *dev_thread (void *p) cd_media = ismedia(); get_toc(); activate_stch = 1; + cd_error = 1; } } break; @@ -570,12 +581,6 @@ static void tp_bput (int addr, uae_u8 v) enable = (tp_b >> 1) & 1; xaen = (tp_b >> 2) & 1; dten = (tp_b >> 3) & 1; -#if 0 - if (cmd == 1 && enable == 1 && cdrom_command_size_out && cdrom_command_cnt_out < cdrom_command_size_out) { - sten = 0; - tp_check_interrupts(); - } -#endif } static uae_u8 tp_bget(int addr) @@ -709,6 +714,7 @@ static void cdtv_reset (void) cd_motor = 0; cd_media = 0; cd_error = 0; + cd_finished = 0; stch = 0; } @@ -930,6 +936,7 @@ static void REGPARAM2 dmac_bput (uaecptr addr, uae_u32 b) map_banks (&dummy_bank, 0xe80000 >> 16, 0x10000 >> 16, 0x10000); write_log ("CDTV DMAC AUTOCONFIG SHUT-UP!\n"); configured = 1; + return; } if (!configured) return; @@ -1097,7 +1104,7 @@ void dmac_init (void) if (!thread_alive) { uae_thread_id tid; init_comm_pipe (&requests, 100, 1); - uae_start_thread (dev_thread, NULL, &tid); + uae_start_thread ("cdtv", dev_thread, NULL, &tid); } configured = 0; diff --git a/debug.c b/debug.c index 03ff5503..68c48924 100755 --- a/debug.c +++ b/debug.c @@ -823,7 +823,6 @@ static struct memwatch_node mwhit; static uae_u8 *illgdebug; static int illgdebug_break; -extern int cdtv_enabled, cd32_enabled; static void illg_init (void) { @@ -853,18 +852,18 @@ static void illg_init (void) memset (illgdebug + 0xf80000, 1, 512 * 1024); /* KS ROM */ memset (illgdebug + 0xdc0000, 0, 0x3f); /* clock */ #ifdef CDTV - if (cdtv_enabled) { - memset (illgdebug + 0xf00000, 1, 256 * 1024); /* CDTV ext ROM */ + if (currprefs.cs_cdtvram) { memset (illgdebug + 0xdc8000, 0, 4096); /* CDTV batt RAM */ + memset (illgdebug + 0xf00000, 1, 256 * 1024); /* CDTV ext ROM */ } #endif #ifdef CD32 - if (cd32_enabled) { + if (currprefs.cs_cd32cd) { memset (illgdebug + AKIKO_BASE, 0, AKIKO_BASE_END - AKIKO_BASE); memset (illgdebug + 0xe00000, 1, 512 * 1024); /* CD32 ext ROM */ } #endif - if (cloanto_rom) + if (currprefs.cs_ksmirror) memset (illgdebug + 0xe00000, 1, 512 * 1024); #ifdef FILESYS if (uae_boot_rom) /* filesys "rom" */ @@ -1701,6 +1700,8 @@ static void searchmem (char **cc) } console_out ("Searching from %08x to %08x..\n", addr, endaddr); while ((addr = nextaddr (addr, NULL)) != 0xffffffff) { + if (addr == endaddr) + break; for (i = 0; i < sslen; i++) { uae_u8 b = get_byte (addr + i); if (stringmode) { diff --git a/filesys.c b/filesys.c index 60acdaa4..c941e6a8 100755 --- a/filesys.c +++ b/filesys.c @@ -3589,7 +3589,7 @@ void filesys_start_threads (void) ui->back_pipe = (smp_comm_pipe *)xmalloc (sizeof (smp_comm_pipe)); init_comm_pipe (uip[i].unit_pipe, 100, 3); init_comm_pipe (uip[i].back_pipe, 100, 1); - uae_start_thread (filesys_thread, (void *)(uip + i), &uip[i].tid); + uae_start_thread ("filesys", filesys_thread, (void *)(uip + i), &uip[i].tid); } #endif if (savestate_state == STATE_RESTORE) diff --git a/hardfile.c b/hardfile.c index 1b5d6a5c..c45466ac 100755 --- a/hardfile.c +++ b/hardfile.c @@ -373,7 +373,7 @@ static int start_thread (int unit) memset (hfpd, 0, sizeof (struct hardfileprivdata)); init_comm_pipe (&hfpd->requests, 100, 1); uae_sem_init (&hfpd->sync_sem, 0, 0); - uae_start_thread (hardfile_thread, hfpd, &hfpd->tid); + uae_start_thread ("hardfile", hardfile_thread, hfpd, &hfpd->tid); uae_sem_wait (&hfpd->sync_sem); return hfpd->thread_running; } diff --git a/include/akiko.h b/include/akiko.h index 087ccda7..6292538a 100755 --- a/include/akiko.h +++ b/include/akiko.h @@ -11,5 +11,4 @@ extern void akiko_entergui (void); extern void akiko_exitgui (void); extern void AKIKO_hsync_handler (void); -extern int cd32_enabled; extern uae_u8 *extendedkickmemory; diff --git a/include/bsdsocket.h b/include/bsdsocket.h index 55053e77..e8e12569 100755 --- a/include/bsdsocket.h +++ b/include/bsdsocket.h @@ -124,8 +124,6 @@ extern uae_u32 addstr (uae_u32 *, const char *); extern uae_u32 addmem (uae_u32 *, const char *, int len); extern char *strncpyah (char *, uae_u32, int); -extern char *strcpyah (char *, uae_u32); -extern uae_u32 strcpyha (uae_u32, const char *); extern uae_u32 strncpyha (uae_u32, const char *, int); #define SB struct socketbase *sb diff --git a/include/cdtv.h b/include/cdtv.h index 7c68cd1e..7ddce6ba 100755 --- a/include/cdtv.h +++ b/include/cdtv.h @@ -1,7 +1,6 @@ #ifdef CDTV -extern int cdtv_enabled; extern addrbank dmac_bank; extern void dmac_init (void); diff --git a/include/inputdevice.h b/include/inputdevice.h index 075fa87a..8ad1f7ce 100755 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -95,7 +95,9 @@ extern void setjoybuttonstateall (int joy, uae_u32 buttonbits, uae_u32 buttonmas extern void setjoybuttonstate (int joy, int button, int state); extern void setmousebuttonstate (int mouse, int button, int state); extern void setjoystickstate (int joy, int axle, int state, int max); +extern int getjoystickstate (int mouse); void setmousestate (int mouse, int axis, int data, int isabs); +extern int getmousestate (int mouse); extern void inputdevice_updateconfig (struct uae_prefs *prefs); extern int inputdevice_translatekeycode (int keyboard, int scancode, int state); diff --git a/include/memory.h b/include/memory.h index 8b811ea0..801ec68e 100755 --- a/include/memory.h +++ b/include/memory.h @@ -272,6 +272,8 @@ STATIC_INLINE int valid_address(uaecptr addr, uae_u32 size) return get_mem_bank(addr).check(addr, size); } +extern int addr_valid(char*,uaecptr,uae_u32); + /* For faster access in custom chip emulation. */ extern uae_u32 REGPARAM3 chipmem_lget (uaecptr) REGPARAM; extern uae_u32 REGPARAM3 chipmem_wget (uaecptr) REGPARAM; @@ -364,3 +366,11 @@ extern int load_keyring (struct uae_prefs *p, char *path); extern uae_u8 *target_load_keyfile (struct uae_prefs *p, char *path, int *size, char *name); extern void free_keyring (void); extern int get_keyring (void); + +uaecptr strcpyha_safe (uaecptr dst, const char *src); +extern char *strcpyah_safe (char *dst, uaecptr src); +void memcpyha_safe (uaecptr dst, const uae_u8 *src, int size); +void memcpyha (uaecptr dst, const uae_u8 *src, int size); +void memcpyah_safe (uae_u8 *dst, uaecptr src, int size); +void memcpyah (uae_u8 *dst, uaecptr src, int size); + diff --git a/inputdevice.c b/inputdevice.c index 5a2d3bd7..6e6a2db4 100755 --- a/inputdevice.c +++ b/inputdevice.c @@ -1904,10 +1904,6 @@ static int ismouse (int ei) return 0; } -#ifdef CD32 -extern int cd32_enabled; -#endif - static void scanevents(struct uae_prefs *p) { int i, j, k, ei; @@ -2044,7 +2040,7 @@ static void compatibility_mode (struct uae_prefs *prefs) joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY2_2ND_BUTTON; joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY2_3RD_BUTTON; #ifdef CD32 - if (cd32_enabled) + if (currprefs.cs_cd32cd) setcd32 (joy, 1); #endif joysticks[joy].enabled = 1; @@ -2080,7 +2076,7 @@ static void compatibility_mode (struct uae_prefs *prefs) joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY2_2ND_BUTTON; joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY2_3RD_BUTTON; #ifdef CD32 - if (cd32_enabled) + if (currprefs.cs_cd32cd) setcd32 (joy, 1); #endif joysticks[joy].enabled = 1; @@ -2139,7 +2135,7 @@ void inputdevice_updateconfig (struct uae_prefs *prefs) scanevents (prefs); #ifdef CD32 - if (currprefs.input_selected_setting == 0 && cd32_enabled) + if (currprefs.input_selected_setting == 0 && currprefs.cs_cd32cd) cd32_pad_enabled[1] = 1; #endif @@ -2814,6 +2810,10 @@ void setjoystickstate (int joy, int axis, int state, int max) id->flags[ID_AXIS_OFFSET + axis][i]); id2->states[axis] = state; } +int getjoystickstate(int joy) +{ + return joysticks[joy].enabled; +} void setmousestate (int mouse, int axis, int data, int isabs) { @@ -2853,6 +2853,10 @@ void setmousestate (int mouse, int axis, int data, int isabs) handle_input_event (id->eventid[ID_AXIS_OFFSET + axis][i], v, 0, 0); mousehack_helper(); } +int getmousestate(int joy) +{ + return mice[joy].enabled; +} void warpmode (int mode) { diff --git a/memory.c b/memory.c index 48fcc210..cdec57db 100755 --- a/memory.c +++ b/memory.c @@ -585,6 +585,16 @@ __inline__ void byteput (uaecptr addr, uae_u32 b) } #endif +int addr_valid(char *txt, uaecptr addr, uae_u32 len) +{ + addrbank *ab = &get_mem_bank(addr); + if (ab == 0 || ab->flags != ABFLAG_RAM || addr < 0x100 || len < 0 || len > 16777215 || !valid_address(addr, len)) { + write_log("corrupt %s pointer %x (%d) detected!\n", txt, addr, len); + return 0; + } + return 1; +} + uae_u32 chipmem_mask, chipmem_full_mask; uae_u32 kickmem_mask, extendedkickmem_mask, bogomem_mask; uae_u32 a3000lmem_mask, a3000hmem_mask, cardmem_mask; @@ -2224,7 +2234,7 @@ void memory_reset (void) } if (rd->cloanto) cloanto_rom = 1; - if (rd->cpu & 4) { /* A4000 ROM = need some mb resources */ + if ((rd->cpu & 4) && currprefs.cs_compatible) { /* A4000 ROM = need some mb resources */ if (currprefs.cs_ramseyrev < 0) changed_prefs.cs_ramseyrev = currprefs.cs_ramseyrev = 0x0f; changed_prefs.cs_fatgaryrev = currprefs.cs_fatgaryrev = 0; @@ -2299,13 +2309,6 @@ void memory_reset (void) /* Map the chipmem into all of the lower 8MB */ map_overlay (1); -#ifdef CDTV - cdtv_enabled = 0; -#endif -#ifdef CD32 - cd32_enabled = 0; -#endif - switch (extendedkickmem_type) { @@ -2319,13 +2322,11 @@ void memory_reset (void) //extendedkickmemory[0x61a3] = 0x00; //extendedkickmemory[0x61a4] = 0x01; //extendedkickmemory[0x61a5] = 0x1a; - cdtv_enabled = 1; break; #endif #ifdef CD32 case EXTENDED_ROM_CD32: map_banks (&extendedkickmem_bank, 0xE0, 8, 0); - cd32_enabled = 1; break; #endif } @@ -2660,3 +2661,54 @@ uae_u8 *save_rom (int first, int *len, uae_u8 *dstptr) } #endif /* SAVESTATE */ + +/* memory helpers */ + +void memcpyha_safe (uaecptr dst, const uae_u8 *src, int size) +{ + if (!addr_valid("memcpyha", dst, size)) + return; + while (size--) + put_byte (dst++, *src++); +} +void memcpyha (uaecptr dst, const uae_u8 *src, int size) +{ + while (size--) + put_byte (dst++, *src++); +} +void memcpyah_safe (uae_u8 *dst, uaecptr src, int size) +{ + if (!addr_valid("memcpyah", src, size)) + return; + while (size--) + *dst++ = get_byte(src++); +} +void memcpyah (uae_u8 *dst, uaecptr src, int size) +{ + while (size--) + *dst++ = get_byte(src++); +} +char *strcpyah_safe (char *dst, uaecptr src) +{ + char *res = dst; + uae_u8 b; + do { + if (!addr_valid("strcpyah", src, 1)) + return res; + b = get_byte(src++); + *dst++ = b; + } while (b); + return res; +} +uaecptr strcpyha_safe (uaecptr dst, const char *src) +{ + uaecptr res = dst; + uae_u8 b; + do { + if (!addr_valid("strcpyha", dst, 1)) + return res; + b = *src++; + put_byte (dst++, b); + } while (b); + return res; +} diff --git a/od-win32/bsdsock.c b/od-win32/bsdsock.c index 1c091e71..1781cc13 100755 --- a/od-win32/bsdsock.c +++ b/od-win32/bsdsock.c @@ -435,7 +435,7 @@ static unsigned int allocasyncmsg(SB,uae_u32 sd,SOCKET s) } unlocksigqueue(); - bsdsocklib_seterrno(sb,12); // ENOMEM + bsdsocklib_seterrno(sb, 12); // ENOMEM write_log("BSDSOCK: ERROR - Async operation completion table overflow\n"); return 0; @@ -445,7 +445,7 @@ static void cancelasyncmsg(TrapContext *context, unsigned int wMsg) { SB; - wMsg = (wMsg-0xb000)/2; + wMsg = (wMsg-0xb000) / 2; sb = bsd->asyncsb[wMsg]; @@ -464,14 +464,14 @@ void sockabort(SB) void setWSAAsyncSelect(SB, uae_u32 sd, SOCKET s, long lEvent ) { - if (sb->mtable[sd-1]) { + if (sb->mtable[sd - 1]) { long wsbevents = 0; long eventflags; int i; locksigqueue(); - eventflags = sb->ftable[sd-1] & REP_ALL; + eventflags = sb->ftable[sd - 1] & REP_ALL; if (eventflags & REP_ACCEPT) wsbevents |= FD_ACCEPT; @@ -486,11 +486,11 @@ void setWSAAsyncSelect(SB, uae_u32 sd, SOCKET s, long lEvent ) if (eventflags & REP_CLOSE) wsbevents |= FD_CLOSE; wsbevents |= lEvent; - i = (sb->mtable[sd-1]-0xb000)/2; + i = (sb->mtable[sd - 1] - 0xb000) / 2; bsd->asyncsb[i] = sb; bsd->asyncsd[i] = sd; bsd->asyncsock[i] = s; - WSAAsyncSelect(s, hWndSelector ? hAmigaWnd : bsd->hSockWnd, sb->mtable[sd-1], wsbevents); + WSAAsyncSelect(s, hWndSelector ? hAmigaWnd : bsd->hSockWnd, sb->mtable[sd - 1], wsbevents); unlocksigqueue(); } @@ -590,23 +590,25 @@ uae_u32 host_bind(SB, uae_u32 sd, uae_u32 name, uae_u32 namelen) SOCKET s; sd++; - TRACE(("bind(%d,0x%lx,%d) -> ",sd,name,namelen)); + TRACE(("bind(%d,0x%lx,%d) -> ",sd, name, namelen)); s = getsock(sb, sd); if (s != INVALID_SOCKET) { if (namelen <= sizeof buf) { - memcpy(buf,get_real_address(name),namelen); + if (!addr_valid("host_bind", name, namelen)) + return 0; + memcpy(buf, get_real_address(name), namelen); // some Amiga programs set this field to bogus values prephostaddr((SOCKADDR_IN *)buf); - if ((success = bind(s,(struct sockaddr *)buf,namelen)) != 0) { + if ((success = bind(s,(struct sockaddr *)buf, namelen)) != 0) { SETERRNO; TRACE(("failed (%d)\n",sb->sb_errno)); } else TRACE(("OK\n")); } else - write_log("BSDSOCK: ERROR - Excessive namelen (%d) in bind()!\n",namelen); + write_log("BSDSOCK: ERROR - Excessive namelen (%d) in bind()!\n", namelen); } return success; @@ -618,7 +620,7 @@ uae_u32 host_listen(SB, uae_u32 sd, uae_u32 backlog) uae_u32 success = -1; sd++; - TRACE(("listen(%d,%d) -> ",sd,backlog)); + TRACE(("listen(%d,%d) -> ", sd, backlog)); s = getsock(sb, sd); if (s != INVALID_SOCKET) { @@ -642,6 +644,8 @@ void host_accept(TrapContext *context, SB, uae_u32 sd, uae_u32 name, uae_u32 nam sd++; if (name != 0) { + if (!addr_valid("host_accept1", name, sizeof(struct sockaddr)) || !addr_valid("host_accept2", namelen, 4)) + return; rp_nameuae = rp_name = (struct sockaddr *)get_real_address(name); hlenuae = hlen = get_long(namelen); if (hlenuae < sizeof(sockaddr)) @@ -655,7 +659,7 @@ void host_accept(TrapContext *context, SB, uae_u32 sd, uae_u32 name, uae_u32 nam } TRACE(("accept(%d,%d,%d) -> ",sd,name,hlenuae)); - s = (SOCKET)getsock(sb,(int)sd); + s = (SOCKET)getsock(sb, (int)sd); if (s != INVALID_SOCKET) { BEGINBLOCKING; @@ -909,7 +913,10 @@ void host_connect(TrapContext *context, SB, uae_u32 sd, uae_u32 name, uae_u32 na char buf[MAXADDRLEN]; sd++; - TRACE(("connect(%d,0x%lx,%d) -> ",sd,name,namelen)); + TRACE(("connect(%d,0x%lx,%d) -> ", sd, name, namelen)); + + if (!addr_valid("host_connect", name, namelen)) + return; s = (SOCKET)getsock(sb,(int)sd); @@ -925,7 +932,7 @@ void host_connect(TrapContext *context, SB, uae_u32 sd, uae_u32 name, uae_u32 na BEGINBLOCKING; PREPARE_THREAD; - memcpy(buf,get_real_address(name),namelen); + memcpy(buf, get_real_address(name), namelen); prephostaddr((SOCKADDR_IN *)buf); sockreq.packet_type = connect_req; @@ -939,7 +946,7 @@ void host_connect(TrapContext *context, SB, uae_u32 sd, uae_u32 name, uae_u32 na if (sb->resultval) { if (sb->sb_errno == WSAEWOULDBLOCK - WSABASEERR) { if (sb->ftable[sd-1] & SF_BLOCKING) { - bsdsocklib_seterrno(sb,0); + bsdsocklib_seterrno(sb, 0); WAITSIGNAL; @@ -951,7 +958,7 @@ void host_connect(TrapContext *context, SB, uae_u32 sd, uae_u32 name, uae_u32 na sb->dtable[sd-1] = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); } } else { - bsdsocklib_seterrno(sb,36); // EINPROGRESS + bsdsocklib_seterrno(sb, 36); // EINPROGRESS } } else { CANCELSIGNAL; // Cancel pending signal @@ -989,12 +996,17 @@ void host_sendto(TrapContext *context, SB, uae_u32 sd, uae_u32 msg, uae_u32 len, s = getsock(sb,sd); if (s != INVALID_SOCKET) { + if (!addr_valid("host_sendto1", msg, 4)) + return; realpt = get_real_address(msg); if (to) { - if (tolen > sizeof buf) write_log("BSDSOCK: WARNING - Target address in sendto() too large (%d)!\n", tolen); - else { - memcpy(buf,get_real_address(to),tolen); + if (tolen > sizeof buf) { + write_log("BSDSOCK: WARNING - Target address in sendto() too large (%d)!\n", tolen); + } else { + if (!addr_valid("host_sendto2", to, tolen)) + return; + memcpy(buf, get_real_address(to), tolen); // some Amiga software sets this field to bogus values prephostaddr((SOCKADDR_IN *)buf); } @@ -1083,7 +1095,7 @@ void host_sendto(TrapContext *context, SB, uae_u32 sd, uae_u32 msg, uae_u32 len, sb->resultval += iCut; } if (sb->resultval == -1) { - if (sb->sb_errno != WSAEWOULDBLOCK-WSABASEERR || !(sb->ftable[sd-1] & SF_BLOCKING)) + if (sb->sb_errno != WSAEWOULDBLOCK - WSABASEERR || !(sb->ftable[sd-1] & SF_BLOCKING)) break; } else { realpt += sb->resultval; @@ -1149,10 +1161,16 @@ void host_recvfrom(TrapContext *context, SB, uae_u32 sd, uae_u32 msg, uae_u32 le s = getsock(sb,sd); if (s != INVALID_SOCKET) { + if (!addr_valid("host_recvfrom1", msg, 4)) + return; realpt = get_real_address(msg); if (addr) { + if (!addr_valid("host_recvfrom1", addrlen, 4)) + return; hlen = get_long(addrlen); + if (!addr_valid("host_recvfrom2", addr, hlen)) + return; rp_addr = (struct sockaddr *)get_real_address(addr); } @@ -1353,6 +1371,8 @@ uae_u32 host_getsockname(SB, uae_u32 sd, uae_u32 name, uae_u32 namelen) struct sockaddr *rp_name; sd++; + if (!addr_valid("host_getsockname1", namelen, 4)) + return -1; len = get_long(namelen); TRACE(("getsockname(%d,0x%lx,%d) -> ",sd,name,len)); @@ -1360,6 +1380,8 @@ uae_u32 host_getsockname(SB, uae_u32 sd, uae_u32 name, uae_u32 namelen) s = getsock(sb,sd); if (s != INVALID_SOCKET) { + if (!addr_valid("host_getsockname2", name, len)) + return -1; rp_name = (struct sockaddr *)get_real_address(name); if (getsockname(s,rp_name,&len)) { @@ -1383,6 +1405,8 @@ uae_u32 host_getpeername(SB, uae_u32 sd, uae_u32 name, uae_u32 namelen) struct sockaddr *rp_name; sd++; + if (!addr_valid("host_getpeername1", namelen, 4)) + return -1; len = get_long(namelen); TRACE(("getpeername(%d,0x%lx,%d) -> ",sd,name,len)); @@ -1390,6 +1414,8 @@ uae_u32 host_getpeername(SB, uae_u32 sd, uae_u32 name, uae_u32 namelen) s = getsock(sb,sd); if (s != INVALID_SOCKET) { + if (!addr_valid("host_getpeername2", name, len)) + return -1; rp_name = (struct sockaddr *)get_real_address(name); if (getpeername(s,rp_name,&len)) { @@ -1463,7 +1489,7 @@ uae_u32 host_IoctlSocket(TrapContext *context, SB, uae_u32 sd, uae_u32 request, break; default: write_log("BSDSOCK: WARNING - Unknown IoctlSocket request: 0x%08lx\n", request); - bsdsocklib_seterrno(sb,22); // EINVAL + bsdsocklib_seterrno(sb, 22); // EINVAL break; } } @@ -1893,6 +1919,8 @@ uae_u32 host_inet_addr(uae_u32 cp) uae_u32 addr; char *cp_rp; + if (!addr_valid("host_inet_addr", cp, 4)) + return 0; cp_rp = get_real_address(cp); addr = htonl(inet_addr(cp_rp)); @@ -1950,7 +1978,9 @@ static unsigned int thread_get2(void *indexp) namelen = args->args3; addrtype = args->args4; buf = args->args5; - name_rp = get_real_address(name); + name_rp = ""; + if (addr_valid("thread_get1", name, 1)) + name_rp = get_real_address(name); if (strchr(name_rp, '.') == 0 || CheckOnline(sb) == TRUE) { // Local Address or Internet Online ? @@ -1978,7 +2008,9 @@ static unsigned int thread_get2(void *indexp) name = args->args2; buf = args->args5; - name_rp = get_real_address(name); + name_rp = ""; + if (addr_valid("thread_get2", name, 1)) + name_rp = get_real_address(name); proto = getprotobyname (name_rp); if (bsd->threadGetargs_inuse[index] != -1) { // No CTRL-C Signal if (proto == 0) { @@ -2004,13 +2036,16 @@ static unsigned int thread_get2(void *indexp) type = args->args4; buf = args->args5; - if (proto) - proto_rp = get_real_address(proto); + if (proto) { + if (addr_valid("thread_get3", proto, 1)) + proto_rp = get_real_address(proto); + } if (type) { serv = getservbyport(nameport, proto_rp); } else { - name_rp = get_real_address(nameport); + if (addr_valid("thread_get4", nameport, 1)) + name_rp = get_real_address(nameport); serv = getservbyname(name_rp, proto_rp); } if (bsd->threadGetargs_inuse[index] != -1) { @@ -2066,8 +2101,9 @@ void host_gethostbynameaddr(TrapContext *context, SB, uae_u32 name, uae_u32 name // InternetSetOption(0,INTERNET_OPTION_SETTINGS_CHANGED,&on,strlen(&on)); // Do not use: Causes locks with some machines - name_rp = get_real_address(name); - + name_rp = ""; + if (addr_valid("host_gethostbynameaddr", name, 1)) + name_rp = get_real_address(name); if (addrtype == -1) { TRACE(("gethostbyname(%s) -> ",name_rp)); @@ -2212,7 +2248,9 @@ void host_getprotobyname(TrapContext *context, SB, uae_u32 name) struct threadargs args; char buf[MAXGETHOSTSTRUCT]; - name_rp = get_real_address(name); + name_rp = ""; + if (addr_valid("host_gethostbynameaddr", name, 1)) + name_rp = get_real_address(name); TRACE(("getprotobyname(%s) -> ",name_rp)); @@ -2329,13 +2367,16 @@ void host_getservbynameport(TrapContext *context, SB, uae_u32 nameport, uae_u32 char buf[MAXGETHOSTSTRUCT]; struct threadargs args; - if (proto) - proto_rp = get_real_address(proto); + if (proto) { + if (addr_valid("host_getservbynameport1", proto, 1)) + proto_rp = get_real_address(proto); + } if (type) { TRACE(("getservbyport(%d,%s) -> ",nameport,proto_rp ? proto_rp : "NULL")); } else { - name_rp = get_real_address(nameport); + if (addr_valid("host_getservbynameport2", nameport, 1)) + name_rp = get_real_address(nameport); TRACE(("getservbyname(%s,%s) -> ",name_rp,proto_rp ? proto_rp : "NULL")); } @@ -2444,6 +2485,8 @@ void host_getservbynameport(TrapContext *context, SB, uae_u32 nameport, uae_u32 uae_u32 host_gethostname(uae_u32 name, uae_u32 namelen) { + if (!addr_valid("host_gethostname", name, namelen)) + return -1; return gethostname(get_real_address(name),namelen); } diff --git a/od-win32/dinput.c b/od-win32/dinput.c index aabf39bb..9ad93d52 100755 --- a/od-win32/dinput.c +++ b/od-win32/dinput.c @@ -1065,15 +1065,17 @@ static void read_mouse (void) if (!did->acquired) continue; if (did->connection == DIDC_CAT) { - int cx, cy, cbuttons; - if (catweasel_read_mouse(did->catweasel, &cx, &cy, &cbuttons)) { - if (cx) - setmousestate(i, 0, cx, 0); - if (cy) - setmousestate(i, 1, cy, 0); - setmousebuttonstate(i, 0, cbuttons & 8); - setmousebuttonstate(i, 1, cbuttons & 4); - setmousebuttonstate(i, 2, cbuttons & 2); + if (getmousestate(i)) { + int cx, cy, cbuttons; + if (catweasel_read_mouse(did->catweasel, &cx, &cy, &cbuttons)) { + if (cx) + setmousestate(i, 0, cx, 0); + if (cy) + setmousestate(i, 1, cy, 0); + setmousebuttonstate(i, 0, cbuttons & 8); + setmousebuttonstate(i, 1, cbuttons & 4); + setmousebuttonstate(i, 2, cbuttons & 2); + } } continue; } @@ -1716,15 +1718,18 @@ static void read_joystick (void) if (!did->acquired) continue; if (did->connection == DIDC_CAT) { - uae_u8 cdir, cbuttons; - if (catweasel_read_joystick(&cdir, &cbuttons)) { - cdir >>= did->catweasel * 4; - cbuttons >>= did->catweasel * 4; - setjoystickstate(i, 0, !(cdir & 1) ? 1 : !(cdir & 2) ? -1 : 0, 0); - setjoystickstate(i, 1, !(cdir & 4) ? 1 : !(cdir & 8) ? -1 : 0, 0); - setjoybuttonstate(i, 0, cbuttons & 8); - setjoybuttonstate(i, 1, cbuttons & 4); - setjoybuttonstate(i, 2, cbuttons & 2); + if (getjoystickstate(i)) { + /* only read CW state if it is really needed */ + uae_u8 cdir, cbuttons; + if (catweasel_read_joystick(&cdir, &cbuttons)) { + cdir >>= did->catweasel * 4; + cbuttons >>= did->catweasel * 4; + setjoystickstate(i, 0, !(cdir & 1) ? 1 : !(cdir & 2) ? -1 : 0, 0); + setjoystickstate(i, 1, !(cdir & 4) ? 1 : !(cdir & 8) ? -1 : 0, 0); + setjoybuttonstate(i, 0, cbuttons & 8); + setjoybuttonstate(i, 1, cbuttons & 4); + setjoybuttonstate(i, 2, cbuttons & 2); + } } continue; } @@ -1908,7 +1913,7 @@ void input_get_default_joystick (struct uae_input_device *uid) uid[i].eventid[ID_BUTTON_OFFSET + 0][0] = port ? INPUTEVENT_JOY2_FIRE_BUTTON : INPUTEVENT_JOY1_FIRE_BUTTON; uid[i].eventid[ID_BUTTON_OFFSET + 1][0] = port ? INPUTEVENT_JOY2_2ND_BUTTON : INPUTEVENT_JOY1_2ND_BUTTON; uid[i].eventid[ID_BUTTON_OFFSET + 2][0] = port ? INPUTEVENT_JOY2_3RD_BUTTON : INPUTEVENT_JOY1_3RD_BUTTON; - if (cd32_enabled) { + if (currprefs.cs_cd32cd) { uid[i].eventid[ID_BUTTON_OFFSET + 0][0] = port ? INPUTEVENT_JOY2_CD32_RED : INPUTEVENT_JOY1_CD32_RED; uid[i].eventid[ID_BUTTON_OFFSET + 1][0] = port ? INPUTEVENT_JOY2_CD32_BLUE : INPUTEVENT_JOY1_CD32_BLUE; uid[i].eventid[ID_BUTTON_OFFSET + 2][0] = port ? INPUTEVENT_JOY2_CD32_YELLOW : INPUTEVENT_JOY1_CD32_YELLOW; diff --git a/od-win32/driveclick_win32.c b/od-win32/driveclick_win32.c index d85f3578..67cc1fc8 100755 --- a/od-win32/driveclick_win32.c +++ b/od-win32/driveclick_win32.c @@ -128,7 +128,7 @@ static int driveclick_fdrawcmd_init(int drive) return 1; thread_ok = 1; init_comm_pipe (dc_pipe, DC_PIPE_SIZE, 3); - uae_start_thread(driveclick_thread, NULL, &tid); + uae_start_thread("fdrawcmd_win32", driveclick_thread, NULL, &tid); return 1; } @@ -140,7 +140,7 @@ void driveclick_fdrawcmd_close(int drive) motors[drive] = 0; } -int driveclick_fdrawcmd_open(int drive) +static int driveclick_fdrawcmd_open_2(int drive) { char s[32]; @@ -149,6 +149,13 @@ int driveclick_fdrawcmd_open(int drive) h[drive] = CreateFile(s, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (h[drive] == INVALID_HANDLE_VALUE) return 0; + return 1; +} + +int driveclick_fdrawcmd_open(int drive) +{ + if (!driveclick_fdrawcmd_open_2(drive)) + return 0; driveclick_fdrawcmd_init(drive); return 1; } @@ -159,10 +166,10 @@ void driveclick_fdrawcmd_detect(void) if (detected) return; detected = 1; - if (driveclick_fdrawcmd_open(0)) + if (driveclick_fdrawcmd_open_2(0)) driveclick_pcdrivemask |= 1; driveclick_fdrawcmd_close(0); - if (driveclick_fdrawcmd_open(1)) + if (driveclick_fdrawcmd_open_2(1)) driveclick_pcdrivemask |= 2; driveclick_fdrawcmd_close(1); } diff --git a/od-win32/keyboard_win32.c b/od-win32/keyboard_win32.c index 7f96c5ef..0788dc81 100755 --- a/od-win32/keyboard_win32.c +++ b/od-win32/keyboard_win32.c @@ -303,7 +303,7 @@ static int handlecdtv (int scancode, int state) static int handlecd32 (int scancode, int state) { int e = 0; - if (!cd32_enabled) + if (!currprefs.cs_cd32cd) return 0; switch (scancode) { diff --git a/od-win32/parser.c b/od-win32/parser.c index 26ab4ac7..61d7c56d 100755 --- a/od-win32/parser.c +++ b/od-win32/parser.c @@ -262,7 +262,7 @@ static void DoSomeWeirdPrintingStuff (char val) if (currprefs.parallel_postscript_emulation) { prt_started = 0; - if (uae_start_thread (prt_thread, psbuffer, &prt_tid)) { + if (uae_start_thread ("postscript", prt_thread, psbuffer, &prt_tid)) { while (!prt_started) Sleep (5); psbuffers = 0; @@ -700,7 +700,7 @@ int uaeser_open (struct uaeserialdatawin32 *sd, void *user, int unit) } uae_sem_init (&sd->sync_sem, 0, 0); uae_sem_init (&sd->change_sem, 0, 1); - uae_start_thread (uaeser_trap_thread, sd, &sd->tid); + uae_start_thread ("uaeserial_win32", uaeser_trap_thread, sd, &sd->tid); uae_sem_wait (&sd->sync_sem); CommTimeOuts.ReadIntervalTimeout = 0; diff --git a/od-win32/picasso96_win.c b/od-win32/picasso96_win.c index 329acedf..e282fb21 100755 --- a/od-win32/picasso96_win.c +++ b/od-win32/picasso96_win.c @@ -1653,7 +1653,8 @@ static void FillBoardInfo (uaecptr amigamemptr, struct LibResolution *res, struc put_byte (amigamemptr + PSSO_ModeInfo_first_union, 98); put_byte (amigamemptr + PSSO_ModeInfo_second_union, 14); - put_long (amigamemptr + PSSO_ModeInfo_PixelClock, dm->res.width * dm->res.height * (currprefs.gfx_refreshrate ? abs (currprefs.gfx_refreshrate) : default_freq)); + put_long (amigamemptr + PSSO_ModeInfo_PixelClock, + dm->res.width * dm->res.height * (currprefs.gfx_refreshrate ? abs (currprefs.gfx_refreshrate) : default_freq)); } struct modeids { @@ -1707,13 +1708,14 @@ static struct modeids mi[] = 2560,2048, 157, 400, 300, 158, 512, 384, 159, - 1360, 768, 160, - 1360,1024, 161, - 1400,1050, 162, - 1792,1344, 163, - 1800,1440, 164, - 1856,1392, 165, - 1920,1440, 166, + 640, 432, 160, + 1360, 768, 161, + 1360,1024, 162, + 1400,1050, 163, + 1792,1344, 164, + 1800,1440, 165, + 1856,1392, 166, + 1920,1440, 167, -1,-1,0 }; @@ -1726,11 +1728,11 @@ static int AssignModeID(int dm, int count, int *unkcnt) h = DisplayModes[dm].res.height; for (i = 0; mi[i].width > 0; i++) { if (w == mi[i].width && h == mi[i].height) - return 0x50001000 | (mi[i].id << 16); + return 0x50001000 | (mi[i].id * 0x10000); } (*unkcnt)++; write_log("P96: Non-unique mode %dx%d\n", w, h); - return 0x5F000000 + (*unkcnt) * 0x10000; + return 0x51000000 - (*unkcnt) * 0x10000; #if 0 int result; if(DisplayModes[i].res.width == 320 && DisplayModes[i].res.height == 200) @@ -1941,19 +1943,17 @@ uae_u32 REGPARAM2 picasso_SetDAC (struct regstruct *regs) static void init_picasso_screen( void ) { - if( set_panning_called ) - { + if(set_panning_called) { picasso96_state.Extent = picasso96_state.Address + ( picasso96_state.BytesPerRow * picasso96_state.VirtualHeight ); } - if (set_gc_called) - { + if (set_gc_called) { gfx_set_picasso_modeinfo (picasso96_state.Width, picasso96_state.Height, picasso96_state.GC_Depth, picasso96_state.RGBFormat); } - if( ( picasso_vidinfo.width == picasso96_state.Width ) && - ( picasso_vidinfo.height == picasso96_state.Height ) && - ( picasso_vidinfo.depth == (picasso96_state.GC_Depth >> 3) ) && - ( picasso_vidinfo.selected_rgbformat == picasso96_state.RGBFormat) ) + if((picasso_vidinfo.width == picasso96_state.Width) && + (picasso_vidinfo.height == picasso96_state.Height) && + (picasso_vidinfo.depth == (picasso96_state.GC_Depth >> 3)) && + (picasso_vidinfo.selected_rgbformat == picasso96_state.RGBFormat)) { DX_SetPalette (0, 256); picasso_refresh (1); diff --git a/od-win32/posixemu.c b/od-win32/posixemu.c index 45517d7f..ffa6f1ff 100755 --- a/od-win32/posixemu.c +++ b/od-win32/posixemu.c @@ -28,6 +28,7 @@ #include "posixemu.h" #include "threaddep/thread.h" #include "filesys.h" +#include "win32.h" /* Our Win32 implementation of this function */ void gettimeofday (struct timeval *tv, void *blah) @@ -219,13 +220,39 @@ void uae_sem_destroy (uae_sem_t * event) typedef unsigned (__stdcall *BEGINTHREADEX_FUNCPTR)(void *); -int uae_start_thread (void *(*f)(void *), void *arg, uae_thread_id *tid) +struct thparms +{ + void *(*f)(void*); + void *arg; +}; + +static unsigned __stdcall thread_init(void *f) +{ + struct thparms *thp = f; + void *(*fp)(void*) = thp->f; + void *arg = thp->arg; + + xfree(f); + __try { + fp(arg); + } __except(WIN32_ExceptionFilter(GetExceptionInformation(), GetExceptionCode())) { + } + return 0; +} + +int uae_start_thread (char *name, void *(*f)(void *), void *arg, uae_thread_id *tid) { HANDLE hThread; int result = 1; unsigned foo; - - hThread = (HANDLE)_beginthreadex(NULL, 0, (BEGINTHREADEX_FUNCPTR)f, arg, 0, &foo); + struct thparms *thp; + + if (name) + write_log("Thread '%s' started\n", name); + thp = malloc (sizeof (struct thparms)); + thp->f = f; + thp->arg = arg; + hThread = (HANDLE)_beginthreadex(NULL, 0, thread_init, thp, 0, &foo); *tid = hThread; if (hThread) SetThreadPriority (hThread, THREAD_PRIORITY_ABOVE_NORMAL); @@ -234,6 +261,11 @@ int uae_start_thread (void *(*f)(void *), void *arg, uae_thread_id *tid) return result; } +int uae_start_thread_fast (void *(*f)(void *), void *arg, uae_thread_id *tid) +{ + return uae_start_thread(NULL, f, arg, tid); +} + DWORD_PTR cpu_affinity = 1; void uae_set_thread_priority (int pri) diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index dd713ef6..376bd4c4 100755 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -316,8 +316,6 @@ BEGIN COMBOBOX IDC_SERIAL,49,84,232,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Shared",IDC_SER_SHARED,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,11,102,48,13 CONTROL "RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,65,102,55,12 - CONTROL "Direct []Use when emulating serial-link games on two PCs running WinUAE",IDC_SER_DIRECT, - "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,132,103,65,12 GROUPBOX "MIDI",IDC_MIDIFRAME,4,123,292,33 RTEXT "Out:",IDC_MIDI,10,134,34,15,SS_CENTERIMAGE COMBOBOX IDC_MIDIOUTLIST,50,134,95,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -330,7 +328,9 @@ BEGIN RTEXT "Port 0:",IDC_STATIC,11,173,25,15,SS_CENTERIMAGE RTEXT "Port 1:",IDC_STATIC,11,194,25,15,SS_CENTERIMAGE LTEXT "X-Arcade layout information []#1",IDC_STATIC,16,213,106,15,SS_NOTIFY | SS_CENTERIMAGE - CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,207,101,78,13 + CONTROL "Direct []Use when emulating serial-link games on two PCs running WinUAE",IDC_SER_DIRECT, + "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,132,103,65,12 + CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,207,103,78,13 END IDD_CONTRIBUTORS DIALOGEX 0, 0, 411, 242 diff --git a/od-win32/threaddep/thread.h b/od-win32/threaddep/thread.h index 2453f499..878a31a1 100755 --- a/od-win32/threaddep/thread.h +++ b/od-win32/threaddep/thread.h @@ -7,7 +7,8 @@ extern int uae_sem_trywait (uae_sem_t*); extern void uae_sem_post (uae_sem_t*); extern void uae_sem_wait (uae_sem_t*t); extern void uae_sem_init (uae_sem_t*, int manual_reset, int initial_state); -extern int uae_start_thread(void *(*f)(void *), void *arg, uae_thread_id *thread); +extern int uae_start_thread (char *name, void *(*f)(void *), void *arg, uae_thread_id *thread); +extern int uae_start_thread_fast (void *(*f)(void *), void *arg, uae_thread_id *thread); extern void uae_set_thread_priority (int); #include "commpipe.h" diff --git a/od-win32/win32.c b/od-win32/win32.c index 74ef44ae..43981df5 100755 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -1637,9 +1637,9 @@ void logging_init(void) fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process"); if (fnIsWow64Process) fnIsWow64Process(GetCurrentProcess(), &wow64); - write_log ("%s (%s %d.%d %s%s%s)", VersionStr, os_winnt ? "NT" : "W9X/ME", + write_log ("%s (%s %d.%d %s%s[%d])", VersionStr, os_winnt ? "NT" : "W9X/ME", osVersion.dwMajorVersion, osVersion.dwMinorVersion, osVersion.szCSDVersion, - strlen(osVersion.szCSDVersion) > 0 ? " " : "", os_winnt_admin ? "Admin" : ""); + strlen(osVersion.szCSDVersion) > 0 ? " " : "", os_winnt_admin); write_log (" %d-bit %X.%X %d", wow64 ? 64 : 32, SystemInfo.wProcessorLevel, SystemInfo.wProcessorRevision, SystemInfo.dwNumberOfProcessors); @@ -2369,10 +2369,12 @@ static int isadminpriv (void) } typedef void (CALLBACK* PGETNATIVESYSTEMINFO)(LPSYSTEM_INFO); -static PGETNATIVESYSTEMINFO pGetNativeSystemInfo; +typedef BOOL (CALLBACK* PISUSERANADMIN)(VOID); static int osdetect (void) { + PGETNATIVESYSTEMINFO pGetNativeSystemInfo; + PISUSERANADMIN pIsUserAnAdmin; os_winnt = 0; os_winnt_admin = 0; os_vista = 0; @@ -2380,6 +2382,9 @@ static int osdetect (void) pGetNativeSystemInfo = (PGETNATIVESYSTEMINFO)GetProcAddress( GetModuleHandle("kernel32.dll"), "GetNativeSystemInfo"); + pIsUserAnAdmin = (PISUSERANADMIN)GetProcAddress( + GetModuleHandle("shell32.dll"), "IsUserAnAdmin"); + GetSystemInfo(&SystemInfo); if (pGetNativeSystemInfo) pGetNativeSystemInfo(&SystemInfo); @@ -2401,11 +2406,14 @@ static int osdetect (void) if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) os_64bit = 1; } - - if (!os_winnt) { + if (!os_winnt) return 1; - } os_winnt_admin = isadminpriv (); + if (os_winnt_admin && pIsUserAnAdmin) { + if (pIsUserAnAdmin()) + os_winnt_admin++; + } + return 1; } diff --git a/od-win32/win32.h b/od-win32/win32.h index a40be449..038114ac 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 WINUAEPUBLICBETA 0 -#define WINUAEDATE MAKEBD(2007, 1, 13) +#define WINUAEBETA 2 +#define WINUAEPUBLICBETA 1 +#define WINUAEDATE MAKEBD(2007, 1, 20) #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 1893022b..3591521c 100755 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -10,6 +10,16 @@ Beta 2: - "magic mouse" related freezes fixed - dragndrop disk insert fixed (again..) - added more Picasso96 modes to "unique" mode list +- possible fix for some missing Picasso96 display modes +- added Amiga-side pointer validation to bsdsocket (smaller chance for + crashing if Amiga-side program passes garbage to bsdsocket) +- added safe host<>Amiga memcpy/strcpy helper functions to memory.c +- Aminetradio bsdsocket freeze fix (broke in 1340b6) +- do not "fix" configuration when advanced chipset compatible checkbox + is not checked and using A4000 rom. +- Windows driver Catweasel-mode works again +- only access CW registers if CW mouse/joystick is selected, read + keyboard port only if CW checkbox is enabled Beta 1: Lots of scary options. Do not touch! diff --git a/scsiemul.c b/scsiemul.c index fe4b3784..a3b6b679 100755 --- a/scsiemul.c +++ b/scsiemul.c @@ -131,17 +131,6 @@ static void io_log (char *msg, uaecptr request) get_long (request + 32), get_byte (request + 31)); } -void memcpyha (uaecptr dst, uae_u8 *src, int size) -{ - while (size--) - put_byte (dst++, *src++); -} -void memcpyah (uae_u8 *dst, uaecptr src, int size) -{ - while (size--) - *dst = get_byte (src++); -} - static struct devstruct *getdevstruct (int unit) { int i; @@ -181,7 +170,7 @@ static int start_thread (struct devstruct *dev) return 1; init_comm_pipe (&dev->requests, 100, 1); uae_sem_init (&dev->sync_sem, 0, 0); - uae_start_thread (dev_thread, dev, &dev->tid); + uae_start_thread ("uaescsi", dev_thread, dev, &dev->tid); uae_sem_wait (&dev->sync_sem); return dev->thread_running; } @@ -410,7 +399,7 @@ static int command_read (int mode, struct devstruct *dev, uaecptr data, int offs temp = sys_command_read (mode, dev->unitnum, offset); if (!temp) return 20; - memcpyha (data, temp, blocksize); + memcpyha_safe (data, temp, blocksize); data += blocksize; offset++; length--; @@ -428,7 +417,7 @@ static int command_write (int mode, struct devstruct *dev, uaecptr data, int off offset /= blocksize; while (length > 0) { int err; - memcpyah (dsi.buffer, data, blocksize); + memcpyah_safe (dsi.buffer, data, blocksize); err = sys_command_write (mode, dev->unitnum, offset); if (!err) return 20; @@ -457,19 +446,19 @@ static int command_cd_read (int mode, struct devstruct *dev, uaecptr data, int o if (startoffset > 0) { len = dev->di.bytespersector - startoffset; if (len > length) len = length; - memcpyha (data, temp + startoffset, len); + memcpyha_safe (data, temp + startoffset, len); length -= len; data += len; startoffset = 0; *io_actual += len; } else if (length >= dev->di.bytespersector) { len = dev->di.bytespersector; - memcpyha (data, temp, len); + memcpyha_safe (data, temp, len); length -= len; data += len; *io_actual += len; } else { - memcpyha (data, temp, length); + memcpyha_safe (data, temp, length); *io_actual += length; length = 0; } diff --git a/traps.c b/traps.c index b11fbb0d..624ad267 100755 --- a/traps.c +++ b/traps.c @@ -262,7 +262,7 @@ static void trap_HandleExtendedTrap (TrapHandler handler_func, int has_retval) context->saved_regs = regs; /* Copy of regs to be restored when trap is done */ /* Start thread to handle new trap context. */ - uae_start_thread (trap_thread, (void *)context, &context->thread); + uae_start_thread_fast (trap_thread, (void *)context, &context->thread); /* Switch to trap context to begin execution of * trap handler function. diff --git a/uaeserial.c b/uaeserial.c index 9ec6294a..df8c3f6a 100755 --- a/uaeserial.c +++ b/uaeserial.c @@ -169,7 +169,7 @@ static int start_thread (struct devstruct *dev) { init_comm_pipe (&dev->requests, 100, 1); uae_sem_init (&dev->sync_sem, 0, 0); - uae_start_thread (dev_thread, dev, &dev->tid); + uae_start_thread ("uaeserial", dev_thread, dev, &dev->tid); uae_sem_wait (&dev->sync_sem); return dev->thread_running; }