]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
imported winuaesrc1400b2.zip
authorToni Wilen <twilen@winuae.net>
Sat, 20 Jan 2007 16:11:40 +0000 (18:11 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 22 Feb 2010 19:31:24 +0000 (21:31 +0200)
30 files changed:
akiko.c
ar.c
bsdsocket.c
catweasel.c
cdtv.c
debug.c
filesys.c
hardfile.c
include/akiko.h
include/bsdsocket.h
include/cdtv.h
include/inputdevice.h
include/memory.h
inputdevice.c
memory.c
od-win32/bsdsock.c
od-win32/dinput.c
od-win32/driveclick_win32.c
od-win32/keyboard_win32.c
od-win32/parser.c
od-win32/picasso96_win.c
od-win32/posixemu.c
od-win32/resources/winuae.rc
od-win32/threaddep/thread.h
od-win32/win32.c
od-win32/win32.h
od-win32/winuaechangelog.txt
scsiemul.c
traps.c
uaeserial.c

diff --git a/akiko.c b/akiko.c
index de5b71fbcf841740576c8ce744a61603555b612e..16abcce8710abba803445424ccf93953a0ba9e51 100755 (executable)
--- 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 7c1c8526afeca63e80b0cedbe2616c0d49220dd9..810c6428bc378b73eb63424b8950200ce5076cd3 100755 (executable)
--- 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;
index 8116283586cd9c9d88dcac7a43c344f33cb00eee..9de1f19ca6f387fac7dcfdcd9236e2b995dfda4c 100755 (executable)
@@ -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;
+               }
            }
        }
 
index 3a13586759e69a2b94c17f0076ef1a15ac508c30..2bb7e19292173be754dbc233c67e868d9e8a337a 100755 (executable)
@@ -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 afacdd04968004df0177bbc4b3e931c38311bb97..730641eff22120b79b48a618589ee8a5586f85d2 100755 (executable)
--- 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 03ff5503368187a544f4a293008291442f94ffe8..68c489244edecb34168eca4dbfa2ca240445a763 100755 (executable)
--- 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) {
index 60acdaa4158cc265825130efe65c740b46e6d638..c941e6a8516b1e6ab0e2b83dea1f7bed635a33f7 100755 (executable)
--- 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)
index 1b5d6a5c8a96a7b21fc622b7b2d5bb24db1365f1..c45466acef33d3ae7935daa03b297964589bbff3 100755 (executable)
@@ -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;
 }
index 087ccda70101b35d1d09ac096c9128e6900d1362..6292538a26a38efe75e8054b904c6cc698ded1ea 100755 (executable)
@@ -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;
index 55053e77cb5ae237456ee79316441c62f4f5d254..e8e1256922859b7690736fee6ef74315299f264e 100755 (executable)
@@ -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
index 7c68cd1ee55656db45e33d8771d9aa94be69ac73..7ddce6ba5d16d2c1135c97a8e98e3e4f38282990 100755 (executable)
@@ -1,7 +1,6 @@
 
 #ifdef CDTV
 
-extern int cdtv_enabled;
 extern addrbank dmac_bank;
 
 extern void dmac_init (void);
index 075fa87a8c699aedd7788a58c87c7200f4231422..8ad1f7cee9b1a0ecfebfa51c4293205e2c051a2f 100755 (executable)
@@ -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);
index 8b811ea0349a387e7747728d3718c94b598ca970..801ec68ec236d66e88be14d03ed356955e8daea4 100755 (executable)
@@ -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);
+
index 5a2d3bd7769a0405f584591ef97dcbc98694e86a..6e6a2db4ee31f9527c2f754e498ab50cb6221b39 100755 (executable)
@@ -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)
 {
index 48fcc2105b6d1ca5dcc65c24e213862dfb9d4077..cdec57db6a147f6c11e4493a4674dd0c9baa1c0b 100755 (executable)
--- 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;
+}
index 1c091e71d5cf9f2aa635587e8f299ecc7a17cde1..1781cc13caeb6efd251ed433e17b3b501e311d91 100755 (executable)
@@ -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);
 }
 
index aabf39bb698d8db888916e12d2883cff6fd39a54..9ad93d52eaa8ff01da0ea685d1c11a815d34a0c2 100755 (executable)
@@ -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;
index d85f3578843f590e9f4012b9f2c9936453a5da14..67cc1fc8ecf5c362935beb6578b822047bfdc92a 100755 (executable)
@@ -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);
 }
index 7f96c5efa791ccc0086293ceaf6d5779649b1d46..0788dc8111d39cc00a2640f34f5c5ea10d0b57fb 100755 (executable)
@@ -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)
     {
index 26ab4ac7ea0461b8d00daf9e4a443b89b812482d..61d7c56dd0e96385bf7402b0d2c615321bba38c8 100755 (executable)
@@ -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;
index 329acedfeaa176401f397384ed5104219f351011..e282fb21cb8868c1972e120815d85341e6098ec0 100755 (executable)
@@ -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); 
index 45517d7fae82fea85cc7a048e15ed2542a472bf7..ffa6f1ff45e3a46493dbb75dcd9f6b12fc6da0e5 100755 (executable)
@@ -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)
index dd713ef69c33e3cf703ed361f12c08532d11de6c..376bd4c4ee9f306acd60ce962c66080ca4352102 100755 (executable)
@@ -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
index 2453f4997a5b96ba390c2a0481116202bf13c664..878a31a14f167c625fea16d80639005c4f5d7e8b 100755 (executable)
@@ -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"
index 74ef44aec64ca4c3c1fdbddba4289b1a73f36617..43981df58755fb269b688888ab553c3910b500a6 100755 (executable)
@@ -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;
 }
 
index a40be4496f8ebae1325d3766d5dd2740074d60f0..038114aca439b351e9baefd35a185b193cbe5f8d 100755 (executable)
@@ -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)
index 1893022b438a48c2866dec1fdf88ee3f88fe1b31..3591521cc55ca1c1bbdf146098523b3258d4acf2 100755 (executable)
@@ -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!
 
index fe4b378466466bbd1c0596ce720a1038e9862058..a3b6b6798bce3a56e816b615a1f0d90007df8f60 100755 (executable)
@@ -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 b11fbb0deb13e74df432116161e1231af7998622..624ad267b790d00462bd88664ed2c1a60628620e 100755 (executable)
--- 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.
index 9ec6294a877b6a11cb50c7dca8fc79284c5412c9..df8c3f6a865537b6a217981248d757b9c99794a6 100755 (executable)
@@ -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;
 }