#define AKIKO_DEBUG_IO 0
#define AKIKO_DEBUG_IO_CMD 0
-int cd32_enabled;
-
static int m68k_getpc(void) { return 0; }
/*
}
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;
}
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;
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++)
len = strlen (src) + 1;
- strcpyha (*dst, src);
+ strcpyha_safe (*dst, src);
(*dst) += len;
return res;
if (!src)
return 0;
- memcpyha (*dst, src, len);
+ memcpyha_safe (*dst, src, len);
(*dst) += len;
return res;
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];
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;
}
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;
+ }
}
}
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)
b = 0;
if (cwc.type < CATWEASEL_TYPE_MK3)
return b;
+ hsync_request();
b2 = catweasel_do_bget(0xc8) & (0x80 | 0x40);
if (!(b2 & 0x80))
b |= 0x80;
{
if (!cwc.can_mouse)
return 0;
+ hsync_request();
*dx = mouse_x[port];
mouse_x[port] = 0;
*dy = mouse_y[port];
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--;
{
if (!cwc.can_joy)
return 0;
+ hsync_request();
*dir = catweasel_do_bget(0xc0);
*buttons = get_buttons();
return 1;
if (!cwc.can_kb)
return 0;
+ if (!currprefs.catweasel)
+ return 0;
v = catweasel_do_bget (0xd4);
if (!(v & 0x80))
return 0;
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];
}
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);
}
return cw;
}
+static int detected;
+
int catweasel_init(void)
{
char name[32], tmp[1000];
}
}
write_log("%s\n", tmp);
+ detected = 1;
return 1;
fail:
{
char name[32];
int i;
- static int detected;
+ HANDLE h;
if (detected)
return detected < 0 ? 0 : 1;
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;
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)
out[2] = size >> 16;
out[3] = size >> 8;
out[4] = size >> 0;
+ cd_finished = 1;
return 5;
}
out[5] = (msflsn ? msf : lsn) >> 16;
out[6] = (msflsn ? msf : lsn) >> 8;
out[7] = (msflsn ? msf : lsn) >> 0;
+ cd_finished = 1;
return 8;
}
}
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 */
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) */
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)
flag |= 1 << 6;
cdrom_command_output[0] = flag;
cdrom_command_accepted(1, s, &cdrom_command_cnt_in);
+ cd_finished = 0;
}
break;
case 0x82:
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 */
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:
}
dmac_dma = 0;
dma_finished = 1;
+ cd_finished = 1;
}
static void *dev_thread (void *p)
cd_media = ismedia();
get_toc();
activate_stch = 1;
+ cd_error = 1;
}
}
break;
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)
cd_motor = 0;
cd_media = 0;
cd_error = 0;
+ cd_finished = 0;
stch = 0;
}
map_banks (&dummy_bank, 0xe80000 >> 16, 0x10000 >> 16, 0x10000);
write_log ("CDTV DMAC AUTOCONFIG SHUT-UP!\n");
configured = 1;
+ return;
}
if (!configured)
return;
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;
static uae_u8 *illgdebug;
static int illgdebug_break;
-extern int cdtv_enabled, cd32_enabled;
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" */
}
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) {
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)
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;
}
extern void akiko_exitgui (void);
extern void AKIKO_hsync_handler (void);
-extern int cd32_enabled;
extern uae_u8 *extendedkickmemory;
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
#ifdef CDTV
-extern int cdtv_enabled;
extern addrbank dmac_bank;
extern void dmac_init (void);
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);
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;
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);
+
return 0;
}
-#ifdef CD32
-extern int cd32_enabled;
-#endif
-
static void scanevents(struct uae_prefs *p)
{
int i, j, k, ei;
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;
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;
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
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)
{
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)
{
}
#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;
}
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;
/* 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)
{
//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
}
}
#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;
+}
}
unlocksigqueue();
- bsdsocklib_seterrno(sb,12); // ENOMEM
+ bsdsocklib_seterrno(sb, 12); // ENOMEM
write_log("BSDSOCK: ERROR - Async operation completion table overflow\n");
return 0;
{
SB;
- wMsg = (wMsg-0xb000)/2;
+ wMsg = (wMsg-0xb000) / 2;
sb = bsd->asyncsb[wMsg];
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;
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();
}
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;
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) {
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))
}
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;
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);
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;
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;
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
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);
}
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;
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);
}
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));
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)) {
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));
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)) {
break;
default:
write_log("BSDSOCK: WARNING - Unknown IoctlSocket request: 0x%08lx\n", request);
- bsdsocklib_seterrno(sb,22); // EINVAL
+ bsdsocklib_seterrno(sb, 22); // EINVAL
break;
}
}
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));
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 ?
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) {
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) {
// 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));
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));
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"));
}
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);
}
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;
}
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;
}
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;
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;
}
motors[drive] = 0;
}
-int driveclick_fdrawcmd_open(int drive)
+static int driveclick_fdrawcmd_open_2(int drive)
{
char s[32];
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;
}
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);
}
static int handlecd32 (int scancode, int state)
{
int e = 0;
- if (!cd32_enabled)
+ if (!currprefs.cs_cd32cd)
return 0;
switch (scancode)
{
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;
}
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;
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 {
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
};
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)
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);
#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)
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);
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)
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
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
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"
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);
}
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;
pGetNativeSystemInfo = (PGETNATIVESYSTEMINFO)GetProcAddress(
GetModuleHandle("kernel32.dll"), "GetNativeSystemInfo");
+ pIsUserAnAdmin = (PISUSERANADMIN)GetProcAddress(
+ GetModuleHandle("shell32.dll"), "IsUserAnAdmin");
+
GetSystemInfo(&SystemInfo);
if (pGetNativeSystemInfo)
pGetNativeSystemInfo(&SystemInfo);
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;
}
#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)
- "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!
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;
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;
}
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--;
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;
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;
}
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.
{
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;
}