]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
imported winuaesrc1000b11.zip
authorToni Wilen <twilen@winuae.net>
Sat, 12 Feb 2005 13:35:09 +0000 (15:35 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 22 Feb 2010 19:25:05 +0000 (21:25 +0200)
27 files changed:
arcadia.c
audio.c
blitter.c
catweasel.c
catweasel_old.c [new file with mode: 0755]
catweasel_old2.c [new file with mode: 0755]
cfgfile.c
custom.c
enforcer.c
expansion.c
filesys.c
genblitter.c
include/catweasel.h
include/custom.h
include/memory.h
include/options.h
inputdevice.c
inputevents.def
memory.c
newcpu.c
od-win32/fsdb_win32.c
od-win32/mman.c
od-win32/picasso96_win.c
od-win32/resources/winuae.rc
od-win32/win32.c
od-win32/win32.h
od-win32/win32gui.c

index 5fbec9baa9d54f85b7d4c55de814e064e0514b30..eab2eb136894a87843f2d95acd4fb82238af425d 100755 (executable)
--- a/arcadia.c
+++ b/arcadia.c
@@ -47,11 +47,11 @@ static struct arcadiarom roms[] = {
     { "ar_dart.zip", "scpa211", "dart_", 1, 4, 0, 7, 6, 3, 1, 2, 5, 0x98f564 },
     { "ar_fast.zip", "scpav3_0.1", "fastv28.", 0, 7, 6, 5, 4, 3, 2, 1, 0, 0x9902bc },
     { "ar_ldrb.zip", "scpa211", "lbg240", 0, 7, 6, 5, 4, 3, 2, 1, 0, 0x98f564 },
-    { "ar_ldrba.zip", "ar_ldrb.zip/scpa211", "ldrb_", 1, 2, 3, 4, 1, 0, 7, 5, 6, 0x98f564 },
+    { "ar_ldrba.zip", "scpa211", "ldrb_", 1, 2, 3, 4, 1, 0, 7, 5, 6, 0x98f564 },
     { "ar_ninj.zip", "scpa211", "ninj_", 1, 1, 6, 5, 7, 4, 2, 0, 3, 0x98f564 },
     { "ar_rdwr.zip", "scpa211", "rdwr_", 1, 3, 1, 6, 4, 0, 5, 2, 7, 0x98f564 },
     { "ar_sdwr.zip", "scpa211", "sdwr_", 1, 6, 3, 4, 5, 2, 1, 0, 7, 0x98f564 },
-    { "ar_spot.zip", "spotv3.0", "spotv2.", 0, 7, 6, 5, 4, 3, 2, 1, 0, 0x9902bc },
+    { "ar_spot.zip", "scpav3_0.1", "spotv2.", 0, 7, 6, 5, 4, 3, 2, 1, 0, 0x9902bc },
     { "ar_sprg.zip", "scpa211", "sprg_", 1, 4, 7, 3, 0, 6, 5, 2, 1, 0x98f564 },
     { "ar_xeon.zip", "scpa211", "xeon_", 1, 3, 1, 2, 4, 0, 5, 6, 7, 0x98f564 },
     { NULL, NULL, NULL }
@@ -130,34 +130,40 @@ static struct arcadiarom *is_arcadia (char *xpath)
 
 static int load_roms (char *xpath, struct arcadiarom *rom)
 {
-    char path[MAX_DPATH], path2[MAX_DPATH];
+    char path[MAX_DPATH], path2[MAX_DPATH], path3[MAX_DPATH], *p;
     int i;
     
-    i = 0;
-    strcpy (path2, xpath);
-    if (strchr (rom->bios, '/')) {
-       char *p = path2 + strlen (path2) - 1;
-       while (p > path2) {
-           if (p[0] == '\\' || p[0] == '/') {
-               *p = 0;
-               break;
-           }
-           p--;
-       }
-       if (p == path2)
+    strcpy (path3, xpath);
+    p = path3 + strlen (path3) - 1;
+    while (p > path3) {
+       if (p[0] == '\\' || p[0] == '/') {
            *p = 0;
+           break;
+        }
+        p--;
     }
-    sprintf (path, "%s/%s", path2, rom->bios);
+    if (p == path3)
+       *p = 0;
+    strcpy (path2, xpath);
+    if (strchr (rom->bios, '/'))
+       strcpy (path2, path3);
+
+    sprintf (path, "%s/ar_bios.zip/%s", path3, rom->bios);
     if (!load_rom8 (path, arbmemory + bios_offset, 0)) {
-       write_log ("Arcadia: bios load failed ('%s')\n", path);
-       return 0;
+        write_log ("Arcadia: bios load failed ('%s')\n", path);
+       sprintf (path, "%s/%s", path2, rom->bios);
+        if (!load_rom8 (path, arbmemory + bios_offset, 0)) {
+           write_log ("Arcadia: bios load failed ('%s')\n", path);
+           return 0;
+       }
     }
     write_log ("Arcadia: bios '%s' loaded\n", path);
+    i = 0;
     for (;;) {
-       sprintf (path, "%s/%s%d", xpath, rom->rom, i + 1);
+        sprintf (path, "%s/%s%d", xpath, rom->rom, i + 1);
        if (!load_rom8 (path, arbmemory + 2 * 65536 * i, rom->bin)) {
            if (i == 0)
-               write_log ("Arcadia: game rom load failed ('%s')\n", path);
+               write_log ("Arcadia: game rom load failed ('%s')\n", path);
            break;
        }
        i++;
diff --git a/audio.c b/audio.c
index 3c1be73c3a26a9034d8c720588287826a17301c4..532e07ae06456e4603ce46cb41c505489632937a 100755 (executable)
--- a/audio.c
+++ b/audio.c
@@ -906,7 +906,7 @@ void audio_hsync (int dmaaction)
                    write_log ("%d:>5: LEN=%d PT=%08.8X\n", nr, cdp->wlen, cdp->pt);
 #endif
            }
-           cdp->dat2 = chipmem_wget (cdp->pt);
+           cdp->dat2 = chipmem_agnus_wget (cdp->pt);
            if (cdp->request_word >= 2)
                handle2 = 1;
            if (chan_ena) {
index 1e512c0ebb8477db306547a4ebf4fc135e88fd4b..d9aa43578e5b7a5760a75a22158d3ef3f5b59892 100755 (executable)
--- a/blitter.c
+++ b/blitter.c
@@ -227,7 +227,7 @@ static void blitter_dofast(void)
                uae_u32 bltadat, blitahold;
                uae_u16 bltbdat;
                if (bltadatptr) {
-                   blt_info.bltadat = bltadat = chipmem_wget (bltadatptr);
+                   blt_info.bltadat = bltadat = chipmem_agnus_wget (bltadatptr);
                    bltadatptr += 2;
                } else
                    bltadat = blt_info.bltadat;
@@ -236,17 +236,17 @@ static void blitter_dofast(void)
                preva = bltadat;
 
                if (bltbdatptr) {
-                   blt_info.bltbdat = bltbdat = chipmem_wget (bltbdatptr);
+                   blt_info.bltbdat = bltbdat = chipmem_agnus_wget (bltbdatptr);
                    bltbdatptr += 2;
                    blitbhold = (((uae_u32)prevb << 16) | bltbdat) >> blt_info.blitbshift;
                    prevb = bltbdat;
                }
 
                if (bltcdatptr) {
-                   blt_info.bltcdat = chipmem_wget (bltcdatptr);
+                   blt_info.bltcdat = chipmem_agnus_wget (bltcdatptr);
                    bltcdatptr += 2;
                }
-               if (dodst) chipmem_wput (dstp, blt_info.bltddat);
+               if (dodst) chipmem_agnus_wput (dstp, blt_info.bltddat);
                blt_info.bltddat = blit_func (blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF;
                if (blitfill) {
                    uae_u16 d = blt_info.bltddat;
@@ -269,7 +269,7 @@ static void blitter_dofast(void)
            if (bltcdatptr) bltcdatptr += blt_info.bltcmod;
            if (bltddatptr) bltddatptr += blt_info.bltdmod;
        }
-       if (dodst) chipmem_wput (dstp, blt_info.bltddat);
+       if (dodst) chipmem_agnus_wput (dstp, blt_info.bltddat);
        blt_info.bltbhold = blitbhold;
     }
     blit_masktable[0] = 0xFFFF;
@@ -320,7 +320,7 @@ static void blitter_dofast_desc(void)
                uae_u32 bltadat, blitahold;
                uae_u16 bltbdat;
                if (bltadatptr) {
-                   bltadat = blt_info.bltadat = chipmem_wget (bltadatptr);
+                   bltadat = blt_info.bltadat = chipmem_agnus_wget (bltadatptr);
                    bltadatptr -= 2;
                } else
                    bltadat = blt_info.bltadat;
@@ -329,17 +329,17 @@ static void blitter_dofast_desc(void)
                preva = bltadat;
 
                if (bltbdatptr) {
-                   blt_info.bltbdat = bltbdat = chipmem_wget (bltbdatptr);
+                   blt_info.bltbdat = bltbdat = chipmem_agnus_wget (bltbdatptr);
                    bltbdatptr -= 2;
                    blitbhold = (((uae_u32)bltbdat << 16) | prevb) >> blt_info.blitdownbshift;
                    prevb = bltbdat;
                }
 
                if (bltcdatptr) {
-                   blt_info.bltcdat = blt_info.bltbdat = chipmem_wget (bltcdatptr);
+                   blt_info.bltcdat = blt_info.bltbdat = chipmem_agnus_wget (bltcdatptr);
                    bltcdatptr -= 2;
                }
-               if (dodst) chipmem_wput (dstp, blt_info.bltddat);
+               if (dodst) chipmem_agnus_wput (dstp, blt_info.bltddat);
                blt_info.bltddat = blit_func (blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF;
                if (blitfill) {
                    uae_u16 d = blt_info.bltddat;
@@ -362,7 +362,7 @@ static void blitter_dofast_desc(void)
            if (bltcdatptr) bltcdatptr -= blt_info.bltcmod;
            if (bltddatptr) bltddatptr -= blt_info.bltdmod;
        }
-       if (dodst) chipmem_wput (dstp, blt_info.bltddat);
+       if (dodst) chipmem_agnus_wput (dstp, blt_info.bltddat);
        blt_info.bltbhold = blitbhold;
     }
     blit_masktable[0] = 0xFFFF;
@@ -604,7 +604,7 @@ STATIC_INLINE int blitter_doddma (void)
        wd = 1;
     }
     if (wd) {
-       chipmem_wput (bltdpt, d);
+       chipmem_agnus_wput (bltdpt, d);
        bltdpt += blit_add;
        blitter_hcounter2++;
        if (blitter_hcounter2 == blt_info.hblitsize) {
@@ -626,11 +626,11 @@ STATIC_INLINE void blitter_dodma (int ch)
     switch (ch)
     {
        case 1:
-        blt_info.bltadat = chipmem_wget (bltapt);
+        blt_info.bltadat = chipmem_agnus_wget (bltapt);
        bltapt += blit_add;
        break;
        case 2:
-       blt_info.bltbdat = chipmem_wget (bltbpt);
+       blt_info.bltbdat = chipmem_agnus_wget (bltbpt);
        bltbpt += blit_add;
        if (blitdesc)
            blt_info.bltbhold = (((uae_u32)blt_info.bltbdat << 16) | prevb) >> blt_info.blitdownbshift;
@@ -639,7 +639,7 @@ STATIC_INLINE void blitter_dodma (int ch)
        prevb = blt_info.bltbdat;
        break;
        case 3:
-       blt_info.bltcdat = chipmem_wget (bltcpt);
+       blt_info.bltcdat = chipmem_agnus_wget (bltcpt);
        bltcpt += blit_add;
        break;
     }
@@ -924,7 +924,6 @@ void do_blitter (int hpos)
        blitter_dump ();
     }
 #endif
-
     blit_slowdown = 0;
 
     unset_special (SPCFLAG_BLTNASTY);
index ac67d3330163d8831b973179ccfa691e7e1f66de..fab5915fe0022c219757ff8655de4ded2a3abb54 100755 (executable)
 #include "catweasel.h"
 #include "uae.h"
 
+#include <catweasl_usr.h>
+
 struct catweasel_contr cwc;
 
 static int cwhsync;
 static int handshake;
 
+static HANDLE handle = INVALID_HANDLE_VALUE;
+
 void catweasel_hsync (void)
 {
     if (cwhsync <= 0)
@@ -89,21 +93,45 @@ void catweasel_do_bput (uaecptr addr, uae_u32 b)
 
 int catweasel_init (void)
 {
-    if (!currprefs.catweasel_io)
-       return 0;
-    if (!ioport_init ())
-       return 0;
-    cwc.type = currprefs.catweasel_io >= 0x400 ? CATWEASEL_TYPE_MK3 : CATWEASEL_TYPE_MK1;
-    cwc.iobase = currprefs.catweasel_io;
+    char name[32];
+    int i, len;
+    uae_u8 buffer[1000];
+    uae_u32 model, base;
+
+    return 0;
+
+    for (i = 0; i < 4; i++) {
+        sprintf (name, "\\\\.\\CAT%d_F0", i);
+       handle = CreateFile (name, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0,
+           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+       if (handle != INVALID_HANDLE_VALUE)
+           break;
+       write_log("%s: %d\n", name, GetLastError());
+    }
+    if (handle == INVALID_HANDLE_VALUE)
+       goto fail;
+    if (!DeviceIoControl (handle, CW_LOCK_EXCLUSIVE, 0, 0, buffer, sizeof (buffer), &len, 0)) {
+       write_log ("CW_LOCK_EXCLUSIVE failed %d\n", GetLastError());
+       goto fail;
+    }
+    model = *((uae_u32*)(buffer + 4));
+    base = *((uae_u32*)(buffer + 0));
+    write_log ("Catweasel MK%d @%p detected and enabled\n", model, base);
+    cwc.type = model == 0 ? 1 : model == 3 ? 4 : 2;
+    cwc.iobase = base;
     catweasel_init_controller (&cwc);
     return 1;
+fail:
+    catweasel_free ();
+    return 0;
+
 }
 
 void catweasel_free (void)
 {
-    if (!currprefs.catweasel_io)
-       return;
-    ioport_free ();
+    if (handle != INVALID_HANDLE_VALUE)
+       CloseHandle (handle);
+    handle = INVALID_HANDLE_VALUE;
     cwc.type = 0;
 }
 
@@ -775,4 +803,6 @@ int catweasel_read(catweasel_drive *d, int side, int clock, int rawmode)
     return 1;
 }
 
-#endif
\ No newline at end of file
+#endif
+
+
diff --git a/catweasel_old.c b/catweasel_old.c
new file mode 100755 (executable)
index 0000000..9d345e5
--- /dev/null
@@ -0,0 +1,804 @@
+
+#include "sysconfig.h"
+#include "sysdeps.h"
+
+#ifdef CATWEASEL
+
+#include "config.h"
+#include "options.h"
+#include "memory.h"
+#include "ioport.h"
+#include "catweasel.h"
+#include "uae.h"
+
+#include <catweasl_usr.h>
+
+struct catweasel_contr cwc;
+
+static int cwhsync;
+static int handshake;
+
+static HANDLE h = INVALID_HANDLE_VALUE;
+
+void catweasel_hsync (void)
+{
+    if (cwhsync <= 0)
+       return;
+    cwhsync--;
+    if (cwhsync == 0) {
+        if (handshake)
+           ioport_write (currprefs.catweasel_io + 0xd0, 0);
+       handshake = 0;
+    }
+}
+
+int catweasel_read_joystick (uae_u8 *dir, uae_u8 *buttons)
+{
+    if (cwc.type != CATWEASEL_TYPE_MK3)
+       return 0;
+    *dir = ioport_read (currprefs.catweasel_io + 0xc0);
+    *buttons = ioport_read (currprefs.catweasel_io + 0xc8);
+    return 1;
+}
+
+int catweasel_read_keyboard (uae_u8 *keycode)
+{
+    uae_u8 v;
+    if (cwc.type != CATWEASEL_TYPE_MK3)
+       return 0;
+    v = ioport_read (currprefs.catweasel_io + 0xd4);
+    if (!(v & 0x80))
+       return 0;
+    if (handshake)
+       return 0;
+    *keycode = ioport_read (currprefs.catweasel_io + 0xd0);
+    ioport_write (currprefs.catweasel_io + 0xd0, 0);
+    handshake = 1;
+    cwhsync = 10;
+    return 1;
+}
+
+uae_u32 catweasel_do_bget (uaecptr addr)
+{
+    if (cwc.type == CATWEASEL_TYPE_MK3) {
+       if ((currprefs.catweasel_io & 3) == 0 && addr >= 0xc0 && addr <= 0xfc)
+           return ioport_read (currprefs.catweasel_io + addr);
+    } else {
+       if (addr >= currprefs.catweasel_io && addr <= currprefs.catweasel_io + 8) {
+           return ioport_read (addr & 0x3ff);
+       } else if(addr >= 0x10000 + currprefs.catweasel_io && addr <= 0x10000 + currprefs.catweasel_io) {
+           return ioport_read (addr & 0x3ff);
+       } else if ((addr & 0x3ff) < 0x200 || (addr & 0x3ff) >= 0x400) {
+           write_log("catweasel_bget @%08.8X!\n",addr);
+       }
+    }
+    return 0;
+}
+
+void catweasel_do_bput (uaecptr addr, uae_u32 b)
+{
+    if (cwc.type == CATWEASEL_TYPE_MK3) {
+       if ((currprefs.catweasel_io & 3) == 0 && addr >= 0xc0 && addr <= 0xfc)
+           ioport_write (currprefs.catweasel_io + addr, b);
+    } else {
+       if (addr >= currprefs.catweasel_io && addr <= currprefs.catweasel_io + 8) {
+           ioport_write (addr & 0x3ff, b);
+       } else if(addr >= 0x10000 + currprefs.catweasel_io && addr <= 0x10000 + currprefs.catweasel_io) {
+           ioport_write (addr & 0x3ff, b);
+       } else if ((addr & 0x3ff) < 0x200 || (addr & 0x3ff) >= 0x400) {
+           write_log("catweasel_bput @%08.8X=%02.2X!\n",addr,b);
+       }
+    }
+}
+
+int catweasel_init (void)
+{
+    char name[32];
+    int i, len;
+    uae_u8 buffer[1000];
+    uae_u32 model, base;
+
+    for (i = 0; i < 4; i++) {
+        sprintf (name, "\\\\.\\CAT%d", i);
+       handle = CreateFile (devname, GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, 0,
+           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+       if (handle != INVALID_HANDLE_VALUE)
+           break;
+    }
+    if (handle == INVALID_HANDLE_VALUE)
+       goto fail;
+    if (!DeviceIoControl (handle, CW_LOCK_EXCLUSIVE, 0L, 0, buffer, sizeof (buffer), &len, 0) {
+       write_log ("CW_LOCK_EXCLUSIVE failed %d\n", GetLastError());
+       goto fail;
+    model = *((uae_u32*)(buffer + 4));
+    base = *((uae_u32*)(buffer + 0));
+    write_log ("Catweasel MK%d @%p detected and enabled\n", model, base);
+    cwc.type = model == 0 ? 1 : model == 3 ? 4 : 2;
+    cwc.iobase = base;
+    catweasel_init_controller (&cwc);
+    return 1;
+fail:
+    catweasel_free ();
+    return 0;
+
+}
+
+void catweasel_free (void)
+{
+    if (handle != INVALID_HANDLE_VALUE)
+       CloseHandle (handle);
+    handle = INVALID_HANDLE_VALUE;
+    cwc.type = 0;
+}
+
+#define outb(v,port) ioport_write(port,v)
+#define inb(port) ioport_read(port)
+
+#define LONGEST_TRACK 16000
+
+static uae_u8 mfmbuf[LONGEST_TRACK * 4];
+static uae_u8 tmpmfmbuffer[LONGEST_TRACK * 2];
+
+static int bitshiftcompare(uae_u8 *src,int bit,int len,uae_u8 *comp)
+{
+       uae_u8 b;
+       int ones,zeros,len2;
+
+       ones=zeros=0;
+       len2=len;
+       while(len--) {
+               b = (comp[0] << bit) | (comp[1] >> (8 - bit));
+               if(b != *src) return 1;
+               if(b==0x00) zeros++;
+               if(b==0xff) ones++;
+               src++;
+               comp++;
+       }
+       if(ones==len2||zeros==len2) return 1;
+       return 0;
+}
+
+static uae_u8 *mergepieces(uae_u8 *start,int len,int bits,uae_u8 *sync)
+{
+       uae_u8 *dst=tmpmfmbuffer;
+       uae_u8 b;
+       int size;
+       int shift;
+       
+       size=len-(sync-start);
+       memcpy(dst,sync,size);
+       dst+=size;
+       b=start[len];
+       b&=~(255>>bits);
+       b|=start[0]>>bits;
+       *dst++=b;
+       shift=8-bits;
+       while(start<=sync+2000) {
+               *dst++=(start[0]<<shift)|(start[1]>>(8-shift));
+               start++;
+       }
+       return tmpmfmbuffer;
+}      
+               
+#define SCANOFFSET 1 /* scanning range in bytes, -SCANOFFSET to SCANOFFSET */
+#define SCANOFFSET2 20
+#define SCANLENGHT 200 /* scanning length in bytes */
+
+static uae_u8* scantrack(uae_u8 *sync1,uae_u8 *sync2,int *trackbytes,int *trackbits)
+{
+       int i,bits,bytes,matched;
+       uae_u8 *sync2bak=sync2;
+       
+       sync1+=SCANOFFSET2;
+       sync2+=SCANOFFSET2;
+       while(sync1 < sync2bak - 2*SCANOFFSET - SCANOFFSET2 - SCANLENGHT) {
+               matched=0x7fff;
+               for(i=0;i<2*SCANOFFSET*8;i++) {
+                       bits=i&7;
+                       bytes=-SCANOFFSET+(i>>3);
+                       if(!bitshiftcompare(sync1,bits,SCANLENGHT,sync2+bytes)) {
+                               if(matched==0x7fff) {
+                                       matched=i;
+                               } else {
+                                       break;
+                               }
+                       }
+               }
+               if(matched!=0x7fff && i>=2*SCANOFFSET*8) {
+                       bits=matched&7;
+                       bytes=-SCANOFFSET+(matched>>3);
+                       *trackbytes=sync2+bytes-sync1;
+                       *trackbits=bits;
+                       return mergepieces(sync1,*trackbytes,*trackbits,sync2bak);
+               }
+               sync1++;
+               sync2++;
+       }
+       return 0;
+}      
+
+static unsigned char threshtab[128];
+
+static void codec_makethresh(int trycnt, const unsigned char *origt, unsigned char *t, int numthresh)
+{
+    static unsigned char tab[10] = { 0, 0, 0, 0, -1, -2, 1, 2, -1, 1 };
+
+    if (trycnt >= sizeof (tab))
+       trycnt = sizeof (tab) - 1;
+    while(numthresh--)
+       t[numthresh] = origt[numthresh] + tab[trycnt];
+}
+
+static void codec_init_threshtab(int trycnt, const unsigned char *origt)
+{
+    static unsigned char old_thresholds[2] = { 0, 0 };
+    unsigned char t[2];
+    int a, i;
+
+    codec_makethresh(trycnt, origt, t, 2);
+
+    if(*(unsigned short*)t == *(unsigned short*)old_thresholds)
+       return;
+
+    for(i=0,a=2; i<128; i++) {
+       if(i == t[0] || i == t[1])
+           a++;
+       threshtab[i] = a;
+    }
+
+    *(unsigned short*)&old_thresholds = *(unsigned short*)t;
+}
+
+static __inline__ void CWSetCReg(catweasel_contr *c, unsigned char clear, unsigned char set)
+{
+    c->control_register = (c->control_register & ~clear) | set;
+    outb(c->control_register, c->io_sr);
+}
+
+static void CWTriggerStep(catweasel_contr *c)
+{
+    CWSetCReg(c, c->crm_step, 0);
+    CWSetCReg(c, 0, c->crm_step);
+}
+
+void catweasel_init_controller(catweasel_contr *c)
+{
+    int i, j;
+
+    if(!c->iobase)
+       return;
+
+    switch(c->type) {
+    case CATWEASEL_TYPE_MK1:
+       c->crm_sel0 = 1 << 5;
+       c->crm_sel1 = 1 << 4;
+       c->crm_mot0 = 1 << 3;
+       c->crm_mot1 = 1 << 7;
+       c->crm_dir  = 1 << 1;
+       c->crm_step = 1 << 0;
+       c->srm_trk0 = 1 << 4;
+       c->srm_dchg = 1 << 5;
+       c->srm_writ = 1 << 1;
+       c->io_sr    = c->iobase + 2;
+       c->io_mem   = c->iobase;
+       break;
+    case CATWEASEL_TYPE_MK3:
+       c->crm_sel0 = 1 << 2;
+       c->crm_sel1 = 1 << 3;
+       c->crm_mot0 = 1 << 1;
+       c->crm_mot1 = 1 << 5;
+       c->crm_dir  = 1 << 4;
+       c->crm_step = 1 << 7;
+       c->srm_trk0 = 1 << 2;
+       c->srm_dchg = 1 << 5;
+       c->srm_writ = 1 << 6;
+       c->srm_dskready = 1 << 4;
+       c->io_sr    = c->iobase + 0xe8;
+       c->io_mem   = c->iobase + 0xe0;
+       break;
+    default:
+       return; 
+    }
+
+    c->control_register = 255;
+
+    /* select all drives, step inside */
+    CWSetCReg(c, c->crm_dir | c->crm_sel0 | c->crm_sel1, 0);
+    for(i=0;i<2;i++) {
+       c->drives[i].number = i;
+       c->drives[i].contr = c;
+       c->drives[i].diskindrive = 0;
+       
+       /* select only the respective drive, step to track 0 */
+       if(i == 0) {
+           CWSetCReg(c, c->crm_sel0, c->crm_dir | c->crm_sel1);
+       } else {
+           CWSetCReg(c, c->crm_sel1, c->crm_dir | c->crm_sel0);
+       }
+
+       for(j = 0; j < 86 && (inb(c->io_sr) & c->srm_trk0); j++) {
+           CWTriggerStep(c);
+           sleep_millis(6);
+       }
+       
+       if(j < 86) {
+           c->drives[i].type = 1;
+           c->drives[i].track = 0;
+       } else {
+           c->drives[i].type = 0;
+       }
+    }
+    c->drives[0].sel = c->crm_sel0;
+    c->drives[0].mot = c->crm_mot0;
+    c->drives[1].sel = c->crm_sel1;
+    c->drives[1].mot = c->crm_mot1;
+    CWSetCReg(c, 0, c->crm_sel0 | c->crm_sel1); /* deselect all drives */
+}
+
+void catweasel_free_controller(catweasel_contr *c)
+{
+    if(!c->iobase)
+       return;
+
+    /* all motors off, deselect all drives */
+    CWSetCReg(c, 0, c->crm_mot0 | c->crm_mot1 | c->crm_sel0 | c->crm_sel1);
+}
+
+void catweasel_set_motor(catweasel_drive *d, int on)
+{
+    CWSetCReg(d->contr, d->sel, 0);
+    if (on)
+       CWSetCReg(d->contr, d->mot, 0);
+    else
+       CWSetCReg(d->contr, 0, d->mot);
+    CWSetCReg(d->contr, 0, d->sel);
+}
+
+int catweasel_step(catweasel_drive *d, int dir)
+{
+    catweasel_contr *c = d->contr;
+    CWSetCReg(c, d->sel, 0);
+    if (dir > 0)
+       CWSetCReg(c, c->crm_dir, 0);
+    else
+       CWSetCReg(c, 0, c->crm_dir);
+    CWTriggerStep (c);
+    CWSetCReg(c, 0, d->sel);
+    d->track += dir > 0 ? 1 : -1;
+    return 1;
+}
+
+int catweasel_disk_changed(catweasel_drive *d)
+{
+    int ret;
+    CWSetCReg(d->contr, d->sel, 0);
+    ret = (inb(d->contr->io_sr) & d->contr->srm_dchg) ? 0 : 1;
+    CWSetCReg(d->contr, 0, d->sel);
+    return ret;
+}
+
+int catweasel_diskready(catweasel_drive *d)
+{
+    int ret;
+    CWSetCReg(d->contr, d->sel, 0);
+    ret = (inb(d->contr->io_sr) & d->contr->srm_dskready) ? 0 : 1;
+    CWSetCReg(d->contr, 0, d->sel);
+    return ret;
+}
+
+int catweasel_track0(catweasel_drive *d)
+{
+    int ret;
+    CWSetCReg(d->contr, d->sel, 0);
+    ret = (inb(d->contr->io_sr) & d->contr->srm_trk0) ? 0 : 1;
+    CWSetCReg(d->contr, 0, d->sel);
+    if (ret)
+       d->track = 0;
+    return ret;
+}
+
+int catweasel_write_protected(catweasel_drive *d)
+{
+    int ret;
+    CWSetCReg(d->contr, d->sel, 0);
+    ret = !(inb(d->contr->io_sr) & 8);
+    CWSetCReg(d->contr, 0, d->sel);
+    return ret;
+}
+
+uae_u8 catweasel_read_byte(catweasel_drive *d)
+{
+    return inb(d->contr->io_mem);
+}
+
+static const unsigned char amiga_thresholds[] = { 0x22, 0x30 }; // 27, 38 for 5.25"
+
+#define FLOPPY_WRITE_LEN 6250
+
+#define MFMMASK 0x55555555
+static uae_u32 getmfmlong (uae_u16 * mbuf)
+{
+       return (uae_u32)(((*mbuf << 16) | *(mbuf + 1)) & MFMMASK);
+}
+
+static int drive_write_adf_amigados (uae_u16 *mbuf, uae_u16 *mend, uae_u8 *writebuffer, int track)
+{
+       int i, secwritten = 0;
+       uae_u32 odd, even, chksum, id, dlong;
+       uae_u8 *secdata;
+       uae_u8 secbuf[544];
+       char sectable[22];
+       int num_sectors = 11;
+       int ec = 0;
+
+       memset (sectable, 0, sizeof (sectable));
+       mend -= (4 + 16 + 8 + 512);
+       while (secwritten < num_sectors) {
+               int trackoffs;
+
+               do {
+                       while (*mbuf++ != 0x4489) {
+                           if (mbuf >= mend) {
+                               ec = 1;
+                               goto err;
+                           }
+                       }
+               } while (*mbuf++ != 0x4489);
+
+               odd = getmfmlong (mbuf);
+               even = getmfmlong (mbuf + 2);
+               mbuf += 4;
+               id = (odd << 1) | even;
+
+               trackoffs = (id & 0xff00) >> 8;
+               if (trackoffs > 10) {
+                   ec = 2;
+                   goto err;
+               }
+               chksum = odd ^ even;
+               for (i = 0; i < 4; i++) {
+                       odd = getmfmlong (mbuf);
+                       even = getmfmlong (mbuf + 8);
+                       mbuf += 2;
+
+                       dlong = (odd << 1) | even;
+                       if (dlong) {
+                           ec = 6;
+                           goto err;
+                       }
+                       chksum ^= odd ^ even;
+               } /* could check here if the label is nonstandard */
+               mbuf += 8;
+               odd = getmfmlong (mbuf);
+               even = getmfmlong (mbuf + 2);
+               mbuf += 4;
+               if (((odd << 1) | even) != chksum) {
+                   ec = 3;
+                   goto err;
+               }
+               odd = (id & 0x00ff0000) >> 16;
+               if (odd != track) {
+                   ec = 7;
+                   goto err;
+               }
+               odd = getmfmlong (mbuf);
+               even = getmfmlong (mbuf + 2);
+               mbuf += 4;
+               chksum = (odd << 1) | even;
+               secdata = secbuf + 32;
+               for (i = 0; i < 128; i++) {
+                       odd = getmfmlong (mbuf);
+                       even = getmfmlong (mbuf + 256);
+                       mbuf += 2;
+                       dlong = (odd << 1) | even;
+                       *secdata++ = dlong >> 24;
+                       *secdata++ = dlong >> 16;
+                       *secdata++ = dlong >> 8;
+                       *secdata++ = dlong;
+                       chksum ^= odd ^ even;
+               }
+               mbuf += 256;
+               if (chksum) {
+                   ec = 4;
+                   goto err;
+               }
+               sectable[trackoffs] = 1;
+               secwritten++;
+               memcpy (writebuffer + trackoffs * 512, secbuf + 32, 512);
+       }
+       if (secwritten == 0 || secwritten < 0) {
+           ec = 5;
+           goto err;
+       }
+       return 0;
+err:
+       write_log ("mfm decode error %d. secwritten=%d\n", ec, secwritten);
+       for (i = 0; i < num_sectors; i++)
+           write_log ("%d:%d ", i, sectable[i]);
+       write_log ("\n");
+       return ec;
+}
+
+static void mfmcode (uae_u16 * mfm, int words)
+{
+    uae_u32 lastword = 0;
+
+    while (words--) {
+       uae_u32 v = *mfm;
+       uae_u32 lv = (lastword << 16) | v;
+       uae_u32 nlv = 0x55555555 & ~lv;
+       uae_u32 mfmbits = (nlv << 1) & (nlv >> 1);
+
+       *mfm++ = v | mfmbits;
+       lastword = v;
+    }
+}
+
+#define FLOPPY_GAP_LEN 360
+
+static int amigados_mfmcode (uae_u8 *src, uae_u16 *dst, int num_secs, int track)
+{
+       int sec;
+       memset (dst, 0xaa, FLOPPY_GAP_LEN * 2);
+
+       for (sec = 0; sec < num_secs; sec++) {
+           uae_u8 secbuf[544];
+           int i;
+           uae_u16 *mfmbuf = dst + 544 * sec + FLOPPY_GAP_LEN;
+           uae_u32 deven, dodd;
+           uae_u32 hck = 0, dck = 0;
+
+           secbuf[0] = secbuf[1] = 0x00;
+           secbuf[2] = secbuf[3] = 0xa1;
+           secbuf[4] = 0xff;
+           secbuf[5] = track;
+           secbuf[6] = sec;
+           secbuf[7] = num_secs - sec;
+
+           for (i = 8; i < 24; i++)
+               secbuf[i] = 0;
+
+           mfmbuf[0] = mfmbuf[1] = 0xaaaa;
+           mfmbuf[2] = mfmbuf[3] = 0x4489;
+
+           memcpy (secbuf + 32, src + sec * 512, 512);
+           deven = ((secbuf[4] << 24) | (secbuf[5] << 16)
+                    | (secbuf[6] << 8) | (secbuf[7]));
+           dodd = deven >> 1;
+           deven &= 0x55555555;
+           dodd &= 0x55555555;
+
+           mfmbuf[4] = dodd >> 16;
+           mfmbuf[5] = dodd;
+           mfmbuf[6] = deven >> 16;
+           mfmbuf[7] = deven;
+
+           for (i = 8; i < 48; i++)
+               mfmbuf[i] = 0xaaaa;
+           for (i = 0; i < 512; i += 4) {
+               deven = ((secbuf[i + 32] << 24) | (secbuf[i + 33] << 16)
+                        | (secbuf[i + 34] << 8) | (secbuf[i + 35]));
+               dodd = deven >> 1;
+               deven &= 0x55555555;
+               dodd &= 0x55555555;
+               mfmbuf[(i >> 1) + 32] = dodd >> 16;
+               mfmbuf[(i >> 1) + 33] = dodd;
+               mfmbuf[(i >> 1) + 256 + 32] = deven >> 16;
+               mfmbuf[(i >> 1) + 256 + 33] = deven;
+           }
+
+           for (i = 4; i < 24; i += 2)
+               hck ^= (mfmbuf[i] << 16) | mfmbuf[i + 1];
+
+           deven = dodd = hck;
+           dodd >>= 1;
+           mfmbuf[24] = dodd >> 16;
+           mfmbuf[25] = dodd;
+           mfmbuf[26] = deven >> 16;
+           mfmbuf[27] = deven;
+
+           for (i = 32; i < 544; i += 2)
+               dck ^= (mfmbuf[i] << 16) | mfmbuf[i + 1];
+
+           deven = dodd = dck;
+           dodd >>= 1;
+           mfmbuf[28] = dodd >> 16;
+           mfmbuf[29] = dodd;
+           mfmbuf[30] = deven >> 16;
+           mfmbuf[31] = deven;
+           mfmcode (mfmbuf + 4, 544 - 4);
+
+       }
+    return (num_secs * 544 + FLOPPY_GAP_LEN) * 2 * 8;
+}
+
+static uae_u16 amigamfmbuffer[LONGEST_TRACK];
+static uae_u8 amigabuffer[512*22];
+
+/* search and align to 0x4489 WORDSYNC markers */
+static int isamigatrack(uae_u8 *mfmdata, uae_u8 *mfmdatae, uae_u16 *mfmdst, int track)
+{
+       uae_u16 *dst = amigamfmbuffer;
+       int len;
+       int shift, syncshift, sync,ret;
+       uae_u32 l;
+       uae_u16 w;
+
+       sync = syncshift = shift = 0;
+       len = (mfmdatae - mfmdata) * 8;
+       if (len > LONGEST_TRACK * 8)
+           len = LONGEST_TRACK * 8;
+       while (len--) {
+               l = (mfmdata[0] << 16) | (mfmdata[1] << 8) | (mfmdata[2] << 0);
+               w = l >> (8 - shift);
+               if (w == 0x4489) {
+                       sync = 1;
+                       syncshift = 0;
+               }
+               if (sync) {
+                       if (syncshift == 0) *dst++ = w;
+                       syncshift ++;
+                       if (syncshift == 16) syncshift = 0;
+               }
+               shift++;
+               if (shift == 8) {
+                       mfmdata++;
+                       shift = 0;
+               }
+       }
+       if (sync) {
+               ret=drive_write_adf_amigados (amigamfmbuffer, dst, amigabuffer, track);
+               if(!ret)
+                   return amigados_mfmcode (amigabuffer, mfmdst, 11, track);
+               write_log ("decode error %d\n", ret);
+       } else {
+           write_log ("decode error: no sync found\n");
+       }
+       return 0;
+}
+
+
+
+int catweasel_fillmfm (catweasel_drive *d, uae_u16 *mfm, int side, int clock, int rawmode)
+{
+    int i, j, oldsync, syncs[10], synccnt, endcnt;
+    uae_u32 tt1 = 0, tt2 = 0;
+    uae_u8 *p1;
+    int bytes = 0, bits = 0;
+    static int lasttrack, trycnt;
+
+    if (cwc.type == 0)
+       return 0;
+    if (d->contr->control_register & d->mot)
+       return 0;
+    if (!catweasel_read (d, side, 1, rawmode))
+       return 0;
+    if(d->contr->type == CATWEASEL_TYPE_MK1) {
+       inb(d->contr->iobase + 1);
+       inb(d->contr->io_mem); /* ignore first byte */
+    } else {
+       outb(0, d->contr->iobase + 0xe4);
+    }
+    catweasel_read_byte (d);
+    if (lasttrack == d->track)
+       trycnt++;
+    else
+       trycnt = 0;
+    lasttrack = d->track;
+    codec_init_threshtab(trycnt, amiga_thresholds);
+    i = 0; j = 0;
+    synccnt = 0;
+    oldsync = -1;
+    endcnt = 0;
+    while (j < LONGEST_TRACK * 4) {
+       uae_u8 b = catweasel_read_byte (d);
+       if (b >= 250) {
+           if (b == 255 - endcnt) {
+               endcnt++;
+               if (endcnt == 5)
+                   break;
+           } else
+               endcnt = 0;
+       }
+       if (rawmode) {
+           if (b & 0x80) {
+               if (oldsync < j) {
+                   syncs[synccnt++] = j;
+                   oldsync = j + 300;
+               }
+           }
+           if (synccnt >= 3 && j > oldsync)
+               break;
+       }
+       b = threshtab[b & 0x7f];
+       tt1 = (tt1 << b) + 1;
+       tt2 += b;
+
+       if (tt2 >= 16) {
+           tt2 -= 16;
+           mfmbuf[j++] = tt1 >> (tt2 + 8);
+           mfmbuf[j++] = tt1 >> tt2;
+       }
+       i++;
+    }
+    write_log ("cyl=%d, side=%d, length %d, syncs %d\n", d->track, side, j, synccnt);
+    if (rawmode) {
+       if (synccnt >= 3) {
+           p1 = scantrack (mfmbuf + syncs[1], mfmbuf + syncs[2], &bytes, &bits);
+           if (p1) {
+               j = 0;
+               for (i = 0; i < bytes + 2; i+=2) {
+                   mfm[j++] = (p1[i] << 8) | p1[i + 1];
+               }
+               return bytes * 8 + bits;
+           }
+       }
+    } else {
+       return isamigatrack (mfmbuf, mfmbuf + j, mfm, d->track * 2 + side);
+    }
+    return 0;
+}
+       
+int catweasel_read(catweasel_drive *d, int side, int clock, int rawmode)
+{
+    int iobase = d->contr->iobase;
+
+    CWSetCReg(d->contr, d->sel, 0);
+    if(d->contr->type == CATWEASEL_TYPE_MK1) {
+       CWSetCReg(d->contr, 1<<2, (!side)<<2); /* set disk side */
+
+       inb(iobase+1); /* ra reset */
+       outb(clock*128, iobase+3);
+
+       inb(iobase+1);
+       inb(iobase+0);
+//     inb(iobase+0);
+//     outb(0, iobase+3); /* don't store index pulse */
+
+       inb(iobase+1);
+
+       inb(iobase+7); /* start reading */
+       sleep_millis(rawmode ? 550 : 225);
+       outb(0, iobase+1); /* stop reading, don't reset RAM pointer */
+
+       outb(128, iobase+0); /* add data end mark */
+       outb(128, iobase+0);
+
+       inb(iobase+1); /* Reset RAM pointer */
+    } else {
+       CWSetCReg(d->contr, 1<<6, (!side)<<6); /* set disk side */
+
+       outb(0, iobase + 0xe4); /* Reset memory pointer */
+       switch(clock) {
+       case 0: /* 28MHz */
+           outb(128, iobase + 0xec);
+           break;
+       case 1: /* 14MHz */
+           outb(0, iobase + 0xec);
+           break;
+       }
+       inb(iobase + 0xe0);
+       inb(iobase + 0xe0);
+       outb(0, iobase + 0xec); /* no IRQs, no MFM predecode */
+       inb(iobase + 0xe0);
+       outb(0, iobase + 0xec); /* don't store index pulse */
+
+       outb(0, iobase + 0xe4); /* Reset memory pointer */
+       inb(iobase + 0xf0); /* start reading */
+       sleep_millis(rawmode ? 550 : 225);
+       inb(iobase + 0xe4); /* stop reading, don't reset RAM pointer */
+
+       outb(255, iobase + 0xe0); /* add data end mark */
+       outb(254, iobase + 0xe0); /* add data end mark */
+       outb(253, iobase + 0xe0); /* add data end mark */
+       outb(252, iobase + 0xe0); /* add data end mark */
+       outb(251, iobase + 0xe0); /* add data end mark */
+       outb(0, iobase + 0xe4); /* Reset memory pointer */
+    }
+    CWSetCReg(d->contr, 0, d->sel);
+    return 1;
+}
+
+#endif
+
+
diff --git a/catweasel_old2.c b/catweasel_old2.c
new file mode 100755 (executable)
index 0000000..ac67d33
--- /dev/null
@@ -0,0 +1,778 @@
+
+#include "sysconfig.h"
+#include "sysdeps.h"
+
+#ifdef CATWEASEL
+
+#include "config.h"
+#include "options.h"
+#include "memory.h"
+#include "ioport.h"
+#include "catweasel.h"
+#include "uae.h"
+
+struct catweasel_contr cwc;
+
+static int cwhsync;
+static int handshake;
+
+void catweasel_hsync (void)
+{
+    if (cwhsync <= 0)
+       return;
+    cwhsync--;
+    if (cwhsync == 0) {
+        if (handshake)
+           ioport_write (currprefs.catweasel_io + 0xd0, 0);
+       handshake = 0;
+    }
+}
+
+int catweasel_read_joystick (uae_u8 *dir, uae_u8 *buttons)
+{
+    if (cwc.type != CATWEASEL_TYPE_MK3)
+       return 0;
+    *dir = ioport_read (currprefs.catweasel_io + 0xc0);
+    *buttons = ioport_read (currprefs.catweasel_io + 0xc8);
+    return 1;
+}
+
+int catweasel_read_keyboard (uae_u8 *keycode)
+{
+    uae_u8 v;
+    if (cwc.type != CATWEASEL_TYPE_MK3)
+       return 0;
+    v = ioport_read (currprefs.catweasel_io + 0xd4);
+    if (!(v & 0x80))
+       return 0;
+    if (handshake)
+       return 0;
+    *keycode = ioport_read (currprefs.catweasel_io + 0xd0);
+    ioport_write (currprefs.catweasel_io + 0xd0, 0);
+    handshake = 1;
+    cwhsync = 10;
+    return 1;
+}
+
+uae_u32 catweasel_do_bget (uaecptr addr)
+{
+    if (cwc.type == CATWEASEL_TYPE_MK3) {
+       if ((currprefs.catweasel_io & 3) == 0 && addr >= 0xc0 && addr <= 0xfc)
+           return ioport_read (currprefs.catweasel_io + addr);
+    } else {
+       if (addr >= currprefs.catweasel_io && addr <= currprefs.catweasel_io + 8) {
+           return ioport_read (addr & 0x3ff);
+       } else if(addr >= 0x10000 + currprefs.catweasel_io && addr <= 0x10000 + currprefs.catweasel_io) {
+           return ioport_read (addr & 0x3ff);
+       } else if ((addr & 0x3ff) < 0x200 || (addr & 0x3ff) >= 0x400) {
+           write_log("catweasel_bget @%08.8X!\n",addr);
+       }
+    }
+    return 0;
+}
+
+void catweasel_do_bput (uaecptr addr, uae_u32 b)
+{
+    if (cwc.type == CATWEASEL_TYPE_MK3) {
+       if ((currprefs.catweasel_io & 3) == 0 && addr >= 0xc0 && addr <= 0xfc)
+           ioport_write (currprefs.catweasel_io + addr, b);
+    } else {
+       if (addr >= currprefs.catweasel_io && addr <= currprefs.catweasel_io + 8) {
+           ioport_write (addr & 0x3ff, b);
+       } else if(addr >= 0x10000 + currprefs.catweasel_io && addr <= 0x10000 + currprefs.catweasel_io) {
+           ioport_write (addr & 0x3ff, b);
+       } else if ((addr & 0x3ff) < 0x200 || (addr & 0x3ff) >= 0x400) {
+           write_log("catweasel_bput @%08.8X=%02.2X!\n",addr,b);
+       }
+    }
+}
+
+int catweasel_init (void)
+{
+    if (!currprefs.catweasel_io)
+       return 0;
+    if (!ioport_init ())
+       return 0;
+    cwc.type = currprefs.catweasel_io >= 0x400 ? CATWEASEL_TYPE_MK3 : CATWEASEL_TYPE_MK1;
+    cwc.iobase = currprefs.catweasel_io;
+    catweasel_init_controller (&cwc);
+    return 1;
+}
+
+void catweasel_free (void)
+{
+    if (!currprefs.catweasel_io)
+       return;
+    ioport_free ();
+    cwc.type = 0;
+}
+
+#define outb(v,port) ioport_write(port,v)
+#define inb(port) ioport_read(port)
+
+#define LONGEST_TRACK 16000
+
+static uae_u8 mfmbuf[LONGEST_TRACK * 4];
+static uae_u8 tmpmfmbuffer[LONGEST_TRACK * 2];
+
+static int bitshiftcompare(uae_u8 *src,int bit,int len,uae_u8 *comp)
+{
+       uae_u8 b;
+       int ones,zeros,len2;
+
+       ones=zeros=0;
+       len2=len;
+       while(len--) {
+               b = (comp[0] << bit) | (comp[1] >> (8 - bit));
+               if(b != *src) return 1;
+               if(b==0x00) zeros++;
+               if(b==0xff) ones++;
+               src++;
+               comp++;
+       }
+       if(ones==len2||zeros==len2) return 1;
+       return 0;
+}
+
+static uae_u8 *mergepieces(uae_u8 *start,int len,int bits,uae_u8 *sync)
+{
+       uae_u8 *dst=tmpmfmbuffer;
+       uae_u8 b;
+       int size;
+       int shift;
+       
+       size=len-(sync-start);
+       memcpy(dst,sync,size);
+       dst+=size;
+       b=start[len];
+       b&=~(255>>bits);
+       b|=start[0]>>bits;
+       *dst++=b;
+       shift=8-bits;
+       while(start<=sync+2000) {
+               *dst++=(start[0]<<shift)|(start[1]>>(8-shift));
+               start++;
+       }
+       return tmpmfmbuffer;
+}      
+               
+#define SCANOFFSET 1 /* scanning range in bytes, -SCANOFFSET to SCANOFFSET */
+#define SCANOFFSET2 20
+#define SCANLENGHT 200 /* scanning length in bytes */
+
+static uae_u8* scantrack(uae_u8 *sync1,uae_u8 *sync2,int *trackbytes,int *trackbits)
+{
+       int i,bits,bytes,matched;
+       uae_u8 *sync2bak=sync2;
+       
+       sync1+=SCANOFFSET2;
+       sync2+=SCANOFFSET2;
+       while(sync1 < sync2bak - 2*SCANOFFSET - SCANOFFSET2 - SCANLENGHT) {
+               matched=0x7fff;
+               for(i=0;i<2*SCANOFFSET*8;i++) {
+                       bits=i&7;
+                       bytes=-SCANOFFSET+(i>>3);
+                       if(!bitshiftcompare(sync1,bits,SCANLENGHT,sync2+bytes)) {
+                               if(matched==0x7fff) {
+                                       matched=i;
+                               } else {
+                                       break;
+                               }
+                       }
+               }
+               if(matched!=0x7fff && i>=2*SCANOFFSET*8) {
+                       bits=matched&7;
+                       bytes=-SCANOFFSET+(matched>>3);
+                       *trackbytes=sync2+bytes-sync1;
+                       *trackbits=bits;
+                       return mergepieces(sync1,*trackbytes,*trackbits,sync2bak);
+               }
+               sync1++;
+               sync2++;
+       }
+       return 0;
+}      
+
+static unsigned char threshtab[128];
+
+static void codec_makethresh(int trycnt, const unsigned char *origt, unsigned char *t, int numthresh)
+{
+    static unsigned char tab[10] = { 0, 0, 0, 0, -1, -2, 1, 2, -1, 1 };
+
+    if (trycnt >= sizeof (tab))
+       trycnt = sizeof (tab) - 1;
+    while(numthresh--)
+       t[numthresh] = origt[numthresh] + tab[trycnt];
+}
+
+static void codec_init_threshtab(int trycnt, const unsigned char *origt)
+{
+    static unsigned char old_thresholds[2] = { 0, 0 };
+    unsigned char t[2];
+    int a, i;
+
+    codec_makethresh(trycnt, origt, t, 2);
+
+    if(*(unsigned short*)t == *(unsigned short*)old_thresholds)
+       return;
+
+    for(i=0,a=2; i<128; i++) {
+       if(i == t[0] || i == t[1])
+           a++;
+       threshtab[i] = a;
+    }
+
+    *(unsigned short*)&old_thresholds = *(unsigned short*)t;
+}
+
+static __inline__ void CWSetCReg(catweasel_contr *c, unsigned char clear, unsigned char set)
+{
+    c->control_register = (c->control_register & ~clear) | set;
+    outb(c->control_register, c->io_sr);
+}
+
+static void CWTriggerStep(catweasel_contr *c)
+{
+    CWSetCReg(c, c->crm_step, 0);
+    CWSetCReg(c, 0, c->crm_step);
+}
+
+void catweasel_init_controller(catweasel_contr *c)
+{
+    int i, j;
+
+    if(!c->iobase)
+       return;
+
+    switch(c->type) {
+    case CATWEASEL_TYPE_MK1:
+       c->crm_sel0 = 1 << 5;
+       c->crm_sel1 = 1 << 4;
+       c->crm_mot0 = 1 << 3;
+       c->crm_mot1 = 1 << 7;
+       c->crm_dir  = 1 << 1;
+       c->crm_step = 1 << 0;
+       c->srm_trk0 = 1 << 4;
+       c->srm_dchg = 1 << 5;
+       c->srm_writ = 1 << 1;
+       c->io_sr    = c->iobase + 2;
+       c->io_mem   = c->iobase;
+       break;
+    case CATWEASEL_TYPE_MK3:
+       c->crm_sel0 = 1 << 2;
+       c->crm_sel1 = 1 << 3;
+       c->crm_mot0 = 1 << 1;
+       c->crm_mot1 = 1 << 5;
+       c->crm_dir  = 1 << 4;
+       c->crm_step = 1 << 7;
+       c->srm_trk0 = 1 << 2;
+       c->srm_dchg = 1 << 5;
+       c->srm_writ = 1 << 6;
+       c->srm_dskready = 1 << 4;
+       c->io_sr    = c->iobase + 0xe8;
+       c->io_mem   = c->iobase + 0xe0;
+       break;
+    default:
+       return; 
+    }
+
+    c->control_register = 255;
+
+    /* select all drives, step inside */
+    CWSetCReg(c, c->crm_dir | c->crm_sel0 | c->crm_sel1, 0);
+    for(i=0;i<2;i++) {
+       c->drives[i].number = i;
+       c->drives[i].contr = c;
+       c->drives[i].diskindrive = 0;
+       
+       /* select only the respective drive, step to track 0 */
+       if(i == 0) {
+           CWSetCReg(c, c->crm_sel0, c->crm_dir | c->crm_sel1);
+       } else {
+           CWSetCReg(c, c->crm_sel1, c->crm_dir | c->crm_sel0);
+       }
+
+       for(j = 0; j < 86 && (inb(c->io_sr) & c->srm_trk0); j++) {
+           CWTriggerStep(c);
+           sleep_millis(6);
+       }
+       
+       if(j < 86) {
+           c->drives[i].type = 1;
+           c->drives[i].track = 0;
+       } else {
+           c->drives[i].type = 0;
+       }
+    }
+    c->drives[0].sel = c->crm_sel0;
+    c->drives[0].mot = c->crm_mot0;
+    c->drives[1].sel = c->crm_sel1;
+    c->drives[1].mot = c->crm_mot1;
+    CWSetCReg(c, 0, c->crm_sel0 | c->crm_sel1); /* deselect all drives */
+}
+
+void catweasel_free_controller(catweasel_contr *c)
+{
+    if(!c->iobase)
+       return;
+
+    /* all motors off, deselect all drives */
+    CWSetCReg(c, 0, c->crm_mot0 | c->crm_mot1 | c->crm_sel0 | c->crm_sel1);
+}
+
+void catweasel_set_motor(catweasel_drive *d, int on)
+{
+    CWSetCReg(d->contr, d->sel, 0);
+    if (on)
+       CWSetCReg(d->contr, d->mot, 0);
+    else
+       CWSetCReg(d->contr, 0, d->mot);
+    CWSetCReg(d->contr, 0, d->sel);
+}
+
+int catweasel_step(catweasel_drive *d, int dir)
+{
+    catweasel_contr *c = d->contr;
+    CWSetCReg(c, d->sel, 0);
+    if (dir > 0)
+       CWSetCReg(c, c->crm_dir, 0);
+    else
+       CWSetCReg(c, 0, c->crm_dir);
+    CWTriggerStep (c);
+    CWSetCReg(c, 0, d->sel);
+    d->track += dir > 0 ? 1 : -1;
+    return 1;
+}
+
+int catweasel_disk_changed(catweasel_drive *d)
+{
+    int ret;
+    CWSetCReg(d->contr, d->sel, 0);
+    ret = (inb(d->contr->io_sr) & d->contr->srm_dchg) ? 0 : 1;
+    CWSetCReg(d->contr, 0, d->sel);
+    return ret;
+}
+
+int catweasel_diskready(catweasel_drive *d)
+{
+    int ret;
+    CWSetCReg(d->contr, d->sel, 0);
+    ret = (inb(d->contr->io_sr) & d->contr->srm_dskready) ? 0 : 1;
+    CWSetCReg(d->contr, 0, d->sel);
+    return ret;
+}
+
+int catweasel_track0(catweasel_drive *d)
+{
+    int ret;
+    CWSetCReg(d->contr, d->sel, 0);
+    ret = (inb(d->contr->io_sr) & d->contr->srm_trk0) ? 0 : 1;
+    CWSetCReg(d->contr, 0, d->sel);
+    if (ret)
+       d->track = 0;
+    return ret;
+}
+
+int catweasel_write_protected(catweasel_drive *d)
+{
+    int ret;
+    CWSetCReg(d->contr, d->sel, 0);
+    ret = !(inb(d->contr->io_sr) & 8);
+    CWSetCReg(d->contr, 0, d->sel);
+    return ret;
+}
+
+uae_u8 catweasel_read_byte(catweasel_drive *d)
+{
+    return inb(d->contr->io_mem);
+}
+
+static const unsigned char amiga_thresholds[] = { 0x22, 0x30 }; // 27, 38 for 5.25"
+
+#define FLOPPY_WRITE_LEN 6250
+
+#define MFMMASK 0x55555555
+static uae_u32 getmfmlong (uae_u16 * mbuf)
+{
+       return (uae_u32)(((*mbuf << 16) | *(mbuf + 1)) & MFMMASK);
+}
+
+static int drive_write_adf_amigados (uae_u16 *mbuf, uae_u16 *mend, uae_u8 *writebuffer, int track)
+{
+       int i, secwritten = 0;
+       uae_u32 odd, even, chksum, id, dlong;
+       uae_u8 *secdata;
+       uae_u8 secbuf[544];
+       char sectable[22];
+       int num_sectors = 11;
+       int ec = 0;
+
+       memset (sectable, 0, sizeof (sectable));
+       mend -= (4 + 16 + 8 + 512);
+       while (secwritten < num_sectors) {
+               int trackoffs;
+
+               do {
+                       while (*mbuf++ != 0x4489) {
+                           if (mbuf >= mend) {
+                               ec = 1;
+                               goto err;
+                           }
+                       }
+               } while (*mbuf++ != 0x4489);
+
+               odd = getmfmlong (mbuf);
+               even = getmfmlong (mbuf + 2);
+               mbuf += 4;
+               id = (odd << 1) | even;
+
+               trackoffs = (id & 0xff00) >> 8;
+               if (trackoffs > 10) {
+                   ec = 2;
+                   goto err;
+               }
+               chksum = odd ^ even;
+               for (i = 0; i < 4; i++) {
+                       odd = getmfmlong (mbuf);
+                       even = getmfmlong (mbuf + 8);
+                       mbuf += 2;
+
+                       dlong = (odd << 1) | even;
+                       if (dlong) {
+                           ec = 6;
+                           goto err;
+                       }
+                       chksum ^= odd ^ even;
+               } /* could check here if the label is nonstandard */
+               mbuf += 8;
+               odd = getmfmlong (mbuf);
+               even = getmfmlong (mbuf + 2);
+               mbuf += 4;
+               if (((odd << 1) | even) != chksum) {
+                   ec = 3;
+                   goto err;
+               }
+               odd = (id & 0x00ff0000) >> 16;
+               if (odd != track) {
+                   ec = 7;
+                   goto err;
+               }
+               odd = getmfmlong (mbuf);
+               even = getmfmlong (mbuf + 2);
+               mbuf += 4;
+               chksum = (odd << 1) | even;
+               secdata = secbuf + 32;
+               for (i = 0; i < 128; i++) {
+                       odd = getmfmlong (mbuf);
+                       even = getmfmlong (mbuf + 256);
+                       mbuf += 2;
+                       dlong = (odd << 1) | even;
+                       *secdata++ = dlong >> 24;
+                       *secdata++ = dlong >> 16;
+                       *secdata++ = dlong >> 8;
+                       *secdata++ = dlong;
+                       chksum ^= odd ^ even;
+               }
+               mbuf += 256;
+               if (chksum) {
+                   ec = 4;
+                   goto err;
+               }
+               sectable[trackoffs] = 1;
+               secwritten++;
+               memcpy (writebuffer + trackoffs * 512, secbuf + 32, 512);
+       }
+       if (secwritten == 0 || secwritten < 0) {
+           ec = 5;
+           goto err;
+       }
+       return 0;
+err:
+       write_log ("mfm decode error %d. secwritten=%d\n", ec, secwritten);
+       for (i = 0; i < num_sectors; i++)
+           write_log ("%d:%d ", i, sectable[i]);
+       write_log ("\n");
+       return ec;
+}
+
+static void mfmcode (uae_u16 * mfm, int words)
+{
+    uae_u32 lastword = 0;
+
+    while (words--) {
+       uae_u32 v = *mfm;
+       uae_u32 lv = (lastword << 16) | v;
+       uae_u32 nlv = 0x55555555 & ~lv;
+       uae_u32 mfmbits = (nlv << 1) & (nlv >> 1);
+
+       *mfm++ = v | mfmbits;
+       lastword = v;
+    }
+}
+
+#define FLOPPY_GAP_LEN 360
+
+static int amigados_mfmcode (uae_u8 *src, uae_u16 *dst, int num_secs, int track)
+{
+       int sec;
+       memset (dst, 0xaa, FLOPPY_GAP_LEN * 2);
+
+       for (sec = 0; sec < num_secs; sec++) {
+           uae_u8 secbuf[544];
+           int i;
+           uae_u16 *mfmbuf = dst + 544 * sec + FLOPPY_GAP_LEN;
+           uae_u32 deven, dodd;
+           uae_u32 hck = 0, dck = 0;
+
+           secbuf[0] = secbuf[1] = 0x00;
+           secbuf[2] = secbuf[3] = 0xa1;
+           secbuf[4] = 0xff;
+           secbuf[5] = track;
+           secbuf[6] = sec;
+           secbuf[7] = num_secs - sec;
+
+           for (i = 8; i < 24; i++)
+               secbuf[i] = 0;
+
+           mfmbuf[0] = mfmbuf[1] = 0xaaaa;
+           mfmbuf[2] = mfmbuf[3] = 0x4489;
+
+           memcpy (secbuf + 32, src + sec * 512, 512);
+           deven = ((secbuf[4] << 24) | (secbuf[5] << 16)
+                    | (secbuf[6] << 8) | (secbuf[7]));
+           dodd = deven >> 1;
+           deven &= 0x55555555;
+           dodd &= 0x55555555;
+
+           mfmbuf[4] = dodd >> 16;
+           mfmbuf[5] = dodd;
+           mfmbuf[6] = deven >> 16;
+           mfmbuf[7] = deven;
+
+           for (i = 8; i < 48; i++)
+               mfmbuf[i] = 0xaaaa;
+           for (i = 0; i < 512; i += 4) {
+               deven = ((secbuf[i + 32] << 24) | (secbuf[i + 33] << 16)
+                        | (secbuf[i + 34] << 8) | (secbuf[i + 35]));
+               dodd = deven >> 1;
+               deven &= 0x55555555;
+               dodd &= 0x55555555;
+               mfmbuf[(i >> 1) + 32] = dodd >> 16;
+               mfmbuf[(i >> 1) + 33] = dodd;
+               mfmbuf[(i >> 1) + 256 + 32] = deven >> 16;
+               mfmbuf[(i >> 1) + 256 + 33] = deven;
+           }
+
+           for (i = 4; i < 24; i += 2)
+               hck ^= (mfmbuf[i] << 16) | mfmbuf[i + 1];
+
+           deven = dodd = hck;
+           dodd >>= 1;
+           mfmbuf[24] = dodd >> 16;
+           mfmbuf[25] = dodd;
+           mfmbuf[26] = deven >> 16;
+           mfmbuf[27] = deven;
+
+           for (i = 32; i < 544; i += 2)
+               dck ^= (mfmbuf[i] << 16) | mfmbuf[i + 1];
+
+           deven = dodd = dck;
+           dodd >>= 1;
+           mfmbuf[28] = dodd >> 16;
+           mfmbuf[29] = dodd;
+           mfmbuf[30] = deven >> 16;
+           mfmbuf[31] = deven;
+           mfmcode (mfmbuf + 4, 544 - 4);
+
+       }
+    return (num_secs * 544 + FLOPPY_GAP_LEN) * 2 * 8;
+}
+
+static uae_u16 amigamfmbuffer[LONGEST_TRACK];
+static uae_u8 amigabuffer[512*22];
+
+/* search and align to 0x4489 WORDSYNC markers */
+static int isamigatrack(uae_u8 *mfmdata, uae_u8 *mfmdatae, uae_u16 *mfmdst, int track)
+{
+       uae_u16 *dst = amigamfmbuffer;
+       int len;
+       int shift, syncshift, sync,ret;
+       uae_u32 l;
+       uae_u16 w;
+
+       sync = syncshift = shift = 0;
+       len = (mfmdatae - mfmdata) * 8;
+       if (len > LONGEST_TRACK * 8)
+           len = LONGEST_TRACK * 8;
+       while (len--) {
+               l = (mfmdata[0] << 16) | (mfmdata[1] << 8) | (mfmdata[2] << 0);
+               w = l >> (8 - shift);
+               if (w == 0x4489) {
+                       sync = 1;
+                       syncshift = 0;
+               }
+               if (sync) {
+                       if (syncshift == 0) *dst++ = w;
+                       syncshift ++;
+                       if (syncshift == 16) syncshift = 0;
+               }
+               shift++;
+               if (shift == 8) {
+                       mfmdata++;
+                       shift = 0;
+               }
+       }
+       if (sync) {
+               ret=drive_write_adf_amigados (amigamfmbuffer, dst, amigabuffer, track);
+               if(!ret)
+                   return amigados_mfmcode (amigabuffer, mfmdst, 11, track);
+               write_log ("decode error %d\n", ret);
+       } else {
+           write_log ("decode error: no sync found\n");
+       }
+       return 0;
+}
+
+
+
+int catweasel_fillmfm (catweasel_drive *d, uae_u16 *mfm, int side, int clock, int rawmode)
+{
+    int i, j, oldsync, syncs[10], synccnt, endcnt;
+    uae_u32 tt1 = 0, tt2 = 0;
+    uae_u8 *p1;
+    int bytes = 0, bits = 0;
+    static int lasttrack, trycnt;
+
+    if (cwc.type == 0)
+       return 0;
+    if (d->contr->control_register & d->mot)
+       return 0;
+    if (!catweasel_read (d, side, 1, rawmode))
+       return 0;
+    if(d->contr->type == CATWEASEL_TYPE_MK1) {
+       inb(d->contr->iobase + 1);
+       inb(d->contr->io_mem); /* ignore first byte */
+    } else {
+       outb(0, d->contr->iobase + 0xe4);
+    }
+    catweasel_read_byte (d);
+    if (lasttrack == d->track)
+       trycnt++;
+    else
+       trycnt = 0;
+    lasttrack = d->track;
+    codec_init_threshtab(trycnt, amiga_thresholds);
+    i = 0; j = 0;
+    synccnt = 0;
+    oldsync = -1;
+    endcnt = 0;
+    while (j < LONGEST_TRACK * 4) {
+       uae_u8 b = catweasel_read_byte (d);
+       if (b >= 250) {
+           if (b == 255 - endcnt) {
+               endcnt++;
+               if (endcnt == 5)
+                   break;
+           } else
+               endcnt = 0;
+       }
+       if (rawmode) {
+           if (b & 0x80) {
+               if (oldsync < j) {
+                   syncs[synccnt++] = j;
+                   oldsync = j + 300;
+               }
+           }
+           if (synccnt >= 3 && j > oldsync)
+               break;
+       }
+       b = threshtab[b & 0x7f];
+       tt1 = (tt1 << b) + 1;
+       tt2 += b;
+
+       if (tt2 >= 16) {
+           tt2 -= 16;
+           mfmbuf[j++] = tt1 >> (tt2 + 8);
+           mfmbuf[j++] = tt1 >> tt2;
+       }
+       i++;
+    }
+    write_log ("cyl=%d, side=%d, length %d, syncs %d\n", d->track, side, j, synccnt);
+    if (rawmode) {
+       if (synccnt >= 3) {
+           p1 = scantrack (mfmbuf + syncs[1], mfmbuf + syncs[2], &bytes, &bits);
+           if (p1) {
+               j = 0;
+               for (i = 0; i < bytes + 2; i+=2) {
+                   mfm[j++] = (p1[i] << 8) | p1[i + 1];
+               }
+               return bytes * 8 + bits;
+           }
+       }
+    } else {
+       return isamigatrack (mfmbuf, mfmbuf + j, mfm, d->track * 2 + side);
+    }
+    return 0;
+}
+       
+int catweasel_read(catweasel_drive *d, int side, int clock, int rawmode)
+{
+    int iobase = d->contr->iobase;
+
+    CWSetCReg(d->contr, d->sel, 0);
+    if(d->contr->type == CATWEASEL_TYPE_MK1) {
+       CWSetCReg(d->contr, 1<<2, (!side)<<2); /* set disk side */
+
+       inb(iobase+1); /* ra reset */
+       outb(clock*128, iobase+3);
+
+       inb(iobase+1);
+       inb(iobase+0);
+//     inb(iobase+0);
+//     outb(0, iobase+3); /* don't store index pulse */
+
+       inb(iobase+1);
+
+       inb(iobase+7); /* start reading */
+       sleep_millis(rawmode ? 550 : 225);
+       outb(0, iobase+1); /* stop reading, don't reset RAM pointer */
+
+       outb(128, iobase+0); /* add data end mark */
+       outb(128, iobase+0);
+
+       inb(iobase+1); /* Reset RAM pointer */
+    } else {
+       CWSetCReg(d->contr, 1<<6, (!side)<<6); /* set disk side */
+
+       outb(0, iobase + 0xe4); /* Reset memory pointer */
+       switch(clock) {
+       case 0: /* 28MHz */
+           outb(128, iobase + 0xec);
+           break;
+       case 1: /* 14MHz */
+           outb(0, iobase + 0xec);
+           break;
+       }
+       inb(iobase + 0xe0);
+       inb(iobase + 0xe0);
+       outb(0, iobase + 0xec); /* no IRQs, no MFM predecode */
+       inb(iobase + 0xe0);
+       outb(0, iobase + 0xec); /* don't store index pulse */
+
+       outb(0, iobase + 0xe4); /* Reset memory pointer */
+       inb(iobase + 0xf0); /* start reading */
+       sleep_millis(rawmode ? 550 : 225);
+       inb(iobase + 0xe4); /* stop reading, don't reset RAM pointer */
+
+       outb(255, iobase + 0xe0); /* add data end mark */
+       outb(254, iobase + 0xe0); /* add data end mark */
+       outb(253, iobase + 0xe0); /* add data end mark */
+       outb(252, iobase + 0xe0); /* add data end mark */
+       outb(251, iobase + 0xe0); /* add data end mark */
+       outb(0, iobase + 0xe4); /* Reset memory pointer */
+    }
+    CWSetCReg(d->contr, 0, d->sel);
+    return 1;
+}
+
+#endif
\ No newline at end of file
index 6e70ef3e2aac7589f7fbac75e437778171596e9d..a7c13c83ac62c6f207b50a212cd5a7b4b54c0b79 100755 (executable)
--- a/cfgfile.c
+++ b/cfgfile.c
@@ -2643,6 +2643,7 @@ int build_in_prefs (struct uae_prefs *p, int model, int config, int compa, int r
        case 7:
        v = bip_a500 (p, 3, compa, romcheck);
        p->nr_floppies = 0;
+       p->chipset_mask = CSMASK_ECS_AGNUS;
        p->dfxtype[0] = -1;
        p->dfxtype[1] = -1;
        break;
index 12772c50b48c19b0dca6a5cd963d40ceaa9ea8aa..05b6302ffcd045e940dee395ecf2be9aa2392f0d 100755 (executable)
--- a/custom.c
+++ b/custom.c
@@ -837,7 +837,7 @@ STATIC_INLINE void fetch (int nr, int fm)
     p = bplpt[nr] + bpl_off[nr];
     switch (fm) {
     case 0:
-       fetched[nr] = last_custom_value = chipmem_wget (p);
+       fetched[nr] = last_custom_value = chipmem_agnus_wget (p);
        bplpt[nr] += 2;
        break;
 #ifdef AGA
@@ -2381,6 +2381,10 @@ STATIC_INLINE uae_u16 DMACONR (void)
     decide_blitter (current_hpos ());
     v = dmacon | (bltstate == BLT_done ? 0 : 0x4000)
            | (blt_info.blitzero ? 0x2000 : 0);
+#if 0
+    if (!dmaen (DMA_BLITTER))
+       v &= ~0x4000;
+#endif
     return v;
 }
 STATIC_INLINE uae_u16 INTENAR (void)
@@ -3389,7 +3393,7 @@ static void predict_copper (void)
     if (state == COP_read2) {
        w1 = cop_state.i1;
        if (w1 & 1) {
-           w2 = chipmem_wget (ip);
+           w2 = chipmem_agnus_wget (ip);
            if (w2 & 1)
                goto done;
            state = COP_wait;
@@ -3407,9 +3411,9 @@ static void predict_copper (void)
 
     while (c_hpos + 1 < maxhpos) {
        if (state == COP_read1) {
-           w1 = chipmem_wget (ip);
+           w1 = chipmem_agnus_wget (ip);
            if (w1 & 1) {
-               w2 = chipmem_wget (ip + 2);
+               w2 = chipmem_agnus_wget (ip + 2);
                if (w2 & 1)
                    break;
                state = COP_wait;
@@ -3635,7 +3639,7 @@ static void update_copper (int until_hpos)
        case COP_read1:
            if (copper_cant_read (old_hpos))
                continue;
-           cop_state.i1 = chipmem_wget (cop_state.ip);
+           cop_state.i1 = chipmem_agnus_wget (cop_state.ip);
 #ifdef CPUEMU_6
            cycle_line[old_hpos] |= CYCLE_COPPER;
 #endif
@@ -3649,7 +3653,7 @@ static void update_copper (int until_hpos)
        case COP_read2:
            if (copper_cant_read (old_hpos))
                continue;
-           cop_state.i2 = chipmem_wget (cop_state.ip);
+           cop_state.i2 = chipmem_agnus_wget (cop_state.ip);
 #ifdef CPUEMU_6
            cycle_line[old_hpos] |= CYCLE_COPPER;
 #endif
@@ -3771,18 +3775,18 @@ static void update_copper (int until_hpos)
            if ((vp1 > vcmp || (vp1 == vcmp && hp1 >= hcmp))
                && ((cop_state.saved_i2 & 0x8000) != 0 || ! (DMACONR() & 0x4000)))
                cop_state.ignore_next = 1;
-           if (chipmem_wget (cop_state.ip) & 1) { /* FIXME: HACK!!! */
+           if (chipmem_agnus_wget (cop_state.ip) & 1) { /* FIXME: HACK!!! */
                /* copper never skips if following instruction is WAIT or another SKIP... */
                cop_state.ignore_next = 0;
            }
 
            cop_state.state = COP_read1;
 
-           if (cop_state.ignore_next && (chipmem_wget (cop_state.ip) & 1) == 0) {
+           if (cop_state.ignore_next && (chipmem_agnus_wget (cop_state.ip) & 1) == 0) {
                /* another undocumented copper feature:
                   copper stops if skipped instruction is MOVE to dangerous register...
                */
-               test_copper_dangerous (chipmem_wget(cop_state.ip));
+               test_copper_dangerous (chipmem_agnus_wget(cop_state.ip));
            }
 
            record_copper (cop_state.ip - 4, old_hpos, vpos);
@@ -3885,7 +3889,7 @@ STATIC_INLINE uae_u16 sprite_fetch (struct sprite *s, int dma, int hpos, int cyc
 {
     uae_u16 data = last_custom_value;
     if (dma) {
-        data = last_custom_value = chipmem_wget (s->pt);
+        data = last_custom_value = chipmem_agnus_wget (s->pt);
 #ifdef CPUEMU_6
        cycle_line[hpos] |= CYCLE_SPRITE;
 #endif
index 4dd8db469b5dee66dcd50697a4b14d45c4412114..461e6b47ff9ac2c6b494eac5afc5837ad4e72a81 100755 (executable)
@@ -27,7 +27,7 @@
 extern uae_u32 natmem_offset;
 
 int flashscreen = 0;
-static int enforcer_installed = 0;
+static int enforcer_installed = 0,enforcermode = 0;
 static int enforcer_hit = 0; /* set to 1 if displaying the hit */
 
 #define ENFORCER_BUF_SIZE 4096
@@ -182,16 +182,19 @@ static void enforcer_display_hit(const char *addressmode, uae_u32 pc, uaecptr ad
        static int bestpc_idxs[INSTRUCTIONLINES/2];
        char *enforcer_buf_ptr = enforcer_buf;
        uaecptr bestpc,pospc,nextpc,temppc;
-
+   
        if (enforcer_hit) return; /* our function itself generated a hit ;), avoid endless loop */
        enforcer_hit = 1;
 
        if (!(sysbase = get_long(4))) return;
        if (!(this_task = get_long(sysbase + 276))) return;
-
+    
        task_name = get_long(this_task + 10); /* ln_Name */
        native_task_name = amiga2native(task_name,100);
-
+       /*if (strcmp(native_task_name,"c:MCP")!=0)
+       {
+               Exception (0x2d,0);
+       }*/
        strcpy(enforcer_buf_ptr,"Enforcer Hit! Bad program\n");
        enforcer_buf_ptr += strlen(enforcer_buf_ptr);
 
@@ -368,8 +371,13 @@ uae_u32 REGPARAM2 chipmem_lget2 (uaecptr addr)
     m = (uae_u32 *)(chipmemory + addr);
        
        if (ISILLEGAL(addr))
+               {
                enforcer_display_hit("LONG READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
-
+        if (enforcermode==1)
+                       {
+                       set_special (SPCFLAG_TRAP);
+                       }       
+               }
     return do_get_mem_long (m);
 }
 
@@ -382,8 +390,13 @@ uae_u32 REGPARAM2 chipmem_wget2(uaecptr addr)
     m = (uae_u16 *)(chipmemory + addr);
 
        if (ISILLEGAL(addr))
+       {       
                enforcer_display_hit("WORD READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
-
+        if (enforcermode==1)
+                       {
+                       set_special (SPCFLAG_TRAP);
+                       }               
+       }
     return do_get_mem_word (m);
 }
 
@@ -393,8 +406,14 @@ uae_u32 REGPARAM2 chipmem_bget2 (uaecptr addr)
     addr &= chipmem_mask;
 
        if (ISILLEGAL(addr))
+       {
                enforcer_display_hit("BYTE READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
-
+               if (enforcermode==1)
+               {
+               set_special (SPCFLAG_TRAP);                             
+               }
+       }
+       
     return chipmemory[addr];
 }
 
@@ -407,8 +426,13 @@ void REGPARAM2 chipmem_lput2 (uaecptr addr, uae_u32 l)
     m = (uae_u32 *)(chipmemory + addr);
 
        if (ISILLEGAL(addr))
+       {
                enforcer_display_hit("LONG WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
-
+               if (enforcermode==1)
+               {
+               if ( addr!=0x100 ) set_special (SPCFLAG_TRAP);
+               }
+       }
     do_put_mem_long (m, l);
 }
 
@@ -421,8 +445,13 @@ void REGPARAM2 chipmem_wput2 (uaecptr addr, uae_u32 w)
     m = (uae_u16 *)(chipmemory + addr);
 
        if (ISILLEGAL(addr))
+       {
                enforcer_display_hit("WORD WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
-   
+       if (enforcermode==1)
+       {
+               set_special (SPCFLAG_TRAP);
+       }
+       }
     do_put_mem_word (m, w);
 }
 
@@ -433,8 +462,14 @@ void REGPARAM2 chipmem_bput2 (uaecptr addr, uae_u32 b)
     addr &= chipmem_mask;
 
        if (ISILLEGAL(addr))
+       {
                enforcer_display_hit("BYTE WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
-    chipmemory[addr] = b;
+               chipmemory[addr] = b;
+                       if (enforcermode==1)
+                       {
+                       set_special (SPCFLAG_TRAP);     
+                       }
+       }
 }
 
 int REGPARAM2 chipmem_check2 (uaecptr addr, uae_u32 size)
@@ -455,6 +490,11 @@ uae_u32 REGPARAM2 dummy_lget2 (uaecptr addr)
 {
     special_mem |= S_READ;
        enforcer_display_hit("LONG READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET), addr);
+       if (enforcermode==1)
+       {
+               set_special (SPCFLAG_TRAP);
+               return 0;
+       }
        return 0xbadedeef;
 }
 
@@ -479,6 +519,11 @@ uae_u32 REGPARAM2 dummy_wget2 (uaecptr addr)
        }
 #endif
        enforcer_display_hit("WORD READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
+       if (enforcermode==1)
+       {
+                       set_special (SPCFLAG_TRAP);
+                       return 0;
+       }
        return 0xbadf;
 }
 
@@ -486,6 +531,11 @@ uae_u32 REGPARAM2 dummy_bget2 (uaecptr addr)
 {
     special_mem |= S_READ;
        enforcer_display_hit("BYTE READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
+       if (enforcermode==1)
+       {
+               set_special (SPCFLAG_TRAP);
+               return 0;
+       }
        return 0xbadedeef;
 }
 
@@ -493,18 +543,33 @@ void REGPARAM2 dummy_lput2 (uaecptr addr, uae_u32 l)
 {
     special_mem |= S_WRITE;
        enforcer_display_hit("LONG WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
+    if (enforcermode==1)
+       {
+           set_special (SPCFLAG_TRAP);
+               return;
+       }
 }
 
 void REGPARAM2 dummy_wput2 (uaecptr addr, uae_u32 w)
 {
     special_mem |= S_WRITE;
        enforcer_display_hit("WORD WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
+    if (enforcermode==1)
+       {
+               set_special (SPCFLAG_TRAP);
+               return;
+       }
 }
 
 void REGPARAM2 dummy_bput2 (uaecptr addr, uae_u32 b)
 {
     special_mem |= S_WRITE;
        enforcer_display_hit("BYTE WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
+       if (enforcermode==1)
+       {
+               set_special (SPCFLAG_TRAP);
+               return;
+       }
 }
 
 int REGPARAM2 dummy_check2 (uaecptr addr, uae_u32 size)
@@ -520,10 +585,10 @@ int REGPARAM2 dummy_check2 (uaecptr addr, uae_u32 size)
  exceptions so enforcer can use it. Returns 1 if enforcer
  is enabled
 *************************************************************/
-int enforcer_enable(void)
+int enforcer_enable(int enfmode)
 {
        extern addrbank chipmem_bank,dummy_bank;
-
+    enforcermode=enfmode;
        if (!enforcer_installed)
        {
                saved_dummy_lget = dummy_bank.lget;
index 8deb712e456c1ecd3a73afbee631b235ba8bf316..1966b747b9e235633c1e7dc0751e0e54dfa68034 100755 (executable)
@@ -312,7 +312,7 @@ static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value)
        break;
 
      case 0x4c:
-       write_log ("   Card %d (Zorro %s) had no success.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
+       write_log ("   Card %d (Zorro%s) had no success.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
        ++ecard;
        if (ecard < MAX_EXPANSION_BOARDS)
            (*card_init[ecard]) ();
@@ -1162,6 +1162,8 @@ void expamem_reset (void)
 
 #ifdef ARCADIA
     if (arcadia_rom) {
+       arcadiaboot = mapped_malloc (0x10000, "arcadia");
+       arcadia_bank.baseaddr = arcadiaboot;    
        card_init[cardno] = expamem_init_arcadia;
        card_map[cardno++] = expamem_map_arcadia;
     }
@@ -1170,12 +1172,12 @@ void expamem_reset (void)
        card_init[cardno] = expamem_init_fastcard;
        card_map[cardno++] = expamem_map_fastcard;
     }
-    if (z3fastmem != NULL) {
+    if (z3fastmem != NULL && kickstart_version >= 36) {
        card_init[cardno] = expamem_init_z3fastmem;
        card_map[cardno++] = expamem_map_z3fastmem;
     }
 #ifdef PICASSO96
-    if (gfxmemory != NULL) {
+    if (gfxmemory != NULL && kickstart_version >= 36) {
        card_init[cardno] = expamem_init_gfxcard;
        card_map[cardno++] = expamem_map_gfxcard;
     }
@@ -1224,10 +1226,6 @@ void expansion_init (void)
        exit (0);
     }
     filesys_bank.baseaddr = (uae_u8*)filesysory;
-#ifdef ARCADIA
-    arcadiaboot = mapped_malloc (0x10000, "arcadia");
-    arcadia_bank.baseaddr = arcadiaboot;    
-#endif
 }
 
 void expansion_cleanup (void)
index 7ac480bb455d28764806274e2410b108f63338f7..25f96dbf37e21fe2cdd846829c98c5b2301573ab 100755 (executable)
--- a/filesys.c
+++ b/filesys.c
@@ -200,7 +200,8 @@ char *get_filesys_unit (struct uaedev_mount_info *mountinfo, int nr,
     *blocksize = uip->hf.blocksize;
     *size = uip->hf.size;
     *bootpri = uip->bootpri;
-    *flags = uip->automounted ? FILESYS_FLAG_DONOTSAVE : 0;
+    if (flags)
+       *flags = uip->automounted ? FILESYS_FLAG_DONOTSAVE : 0;
     if (filesysdir)
        *filesysdir = uip->filesysdir ? my_strdup (uip->filesysdir) : 0;
     return 0;
@@ -1744,7 +1745,7 @@ action_lock (Unit *unit, dpacket packet)
     uae_u32 err;
 
     if (mode != SHARED_LOCK && mode != EXCLUSIVE_LOCK) {
-       TRACE(("Bad mode.\n"));
+       TRACE(("Bad mode %d (should be %d or %d).\n", mode, SHARED_LOCK, EXCLUSIVE_LOCK));
        mode = SHARED_LOCK;
     }
 
@@ -2763,9 +2764,10 @@ action_parent (Unit *unit, dpacket packet)
     if (!lock) {
        PUT_PCK_RES1 (packet, 0);
        PUT_PCK_RES2 (packet, 0);
-       return;
+    } else {
+       action_parent_common (unit, packet, get_long (lock + 4));
     }
-    action_parent_common (unit, packet, get_long (lock + 4));
+    TRACE(("=%x %d\n", GET_PCK_RES1 (packet), GET_PCK_RES2 (packet)));
 }
 
 static void
@@ -3210,10 +3212,18 @@ static uae_u32 exter_int_helper (void)
            unit->cmds_complete = unit->cmds_acked;
            while (comm_pipe_has_data (unit->ui.back_pipe)) {
                uaecptr locks, lockend;
+               int cnt = 0;
                locks = read_comm_pipe_int_blocking (unit->ui.back_pipe);
                lockend = locks;
-               while (get_long (lockend) != 0)
+               while (get_long (lockend) != 0) {
+                   if (get_long (lockend) == lockend) {
+                       write_log ("filesystem lock queue corrupted!\n");
+                       break;
+                   }
                    lockend = get_long (lockend);
+                   cnt++;
+               }
+               TRACE(("%d %x %x %x\n", cnt, locks, lockend, m68k_areg (regs, 3)));
                put_long (lockend, get_long (m68k_areg (regs, 3)));
                put_long (m68k_areg (regs, 3), locks);
            }
index 0cb3204c3ae1868e62cfb75804d372bcf80d7370..c019395d48fac9323931e233c63c460872cb6486 100755 (executable)
@@ -97,15 +97,15 @@ static void generate_func(void)
        printf("uaecptr dstp = 0;\n");
        printf("for (j = 0; j < b->vblitsize; j++) {\n");
        printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n\n");
-       if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_wget (ptc); ptc += 2; }\n");
-       if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_wget (ptb); ptb += 2;\n");
+       if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_agnus_wget (ptc); ptc += 2; }\n");
+       if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_agnus_wget (ptb); ptb += 2;\n");
        if (b_is_on) printf("\t\t\tsrcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;\n");
        if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n");
-       if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_wget (pta); pta += 2; } else { bltadat = blt_info.bltadat; }\n");
+       if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_agnus_wget (pta); pta += 2; } else { bltadat = blt_info.bltadat; }\n");
        if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
        if (a_is_on) printf("\t\tsrca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;\n");
        if (a_is_on) printf("\t\tpreva = bltadat;\n");
-       printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n");
+       printf("\t\tif (dstp) chipmem_agnus_wput (dstp, dstd);\n");
        printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
        printf("\t\ttotald |= dstd;\n");
        printf("\t\tif (ptd) { dstp = ptd; ptd += 2; }\n");
@@ -117,7 +117,7 @@ static void generate_func(void)
        printf("}\n");
        if (b_is_on) printf("b->bltbhold = srcb;\n");
        printf("b->bltcdat = srcc;\n");
-       printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n");
+       printf("\t\tif (dstp) chipmem_agnus_wput (dstp, dstd);\n");
 #if 0
        printf("}\n");
 #endif
@@ -174,15 +174,15 @@ static void generate_func(void)
        printf("uaecptr dstp = 0;\n");
        printf("for (j = 0; j < b->vblitsize; j++) {\n");
        printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n");
-       if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_wget (ptc); ptc -= 2; }\n");
-       if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_wget (ptb); ptb -= 2;\n");
+       if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_agnus_wget (ptc); ptc -= 2; }\n");
+       if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_agnus_wget (ptb); ptb -= 2;\n");
        if (b_is_on) printf("\t\t\tsrcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;\n");
        if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n");
-       if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_wget (pta); pta -= 2; } else { bltadat = blt_info.bltadat; }\n");
+       if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_agnus_wget (pta); pta -= 2; } else { bltadat = blt_info.bltadat; }\n");
        if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
        if (a_is_on) printf("\t\tsrca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;\n");
        if (a_is_on) printf("\t\tpreva = bltadat;\n");
-       printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n");
+       printf("\t\tif (dstp) chipmem_agnus_wput (dstp, dstd);\n");
        printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
        printf("\t\ttotald |= dstd;\n");
        printf("\t\tif (ptd) { dstp = ptd; ptd -= 2; }\n");
@@ -194,7 +194,7 @@ static void generate_func(void)
        printf("}\n");
        if (b_is_on) printf("b->bltbhold = srcb;\n");
        printf("b->bltcdat = srcc;\n");
-       printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n");
+       printf("\t\tif (dstp) chipmem_agnus_wput (dstp, dstd);\n");
 #if 0
        printf("}\n");
 #endif
index 848221efcbd15aa405a1946bca7844e8e250cbbf..29c5de0ce8e64ddc57902ba0088f3ce2ba43e067 100755 (executable)
@@ -44,6 +44,7 @@ typedef struct catweasel_contr {
 #define CATWEASEL_TYPE_NONE  -1
 #define CATWEASEL_TYPE_MK1    1
 #define CATWEASEL_TYPE_MK3    3
+#define CATWEASEL_TYPE_MK4    4
 
 /* Initialize a Catweasel controller; c->iobase and c->msdelay must have
    been initialized -- msdelay might be used */
index 20816f1cb427e488cfe60e1120006df48e3786c8..3f4f526a24ded78fdf0cf885e764b4f69c79023b 100755 (executable)
@@ -62,6 +62,7 @@ STATIC_INLINE int dmaen (unsigned int dmamask)
 #define SPCFLAG_BLTNASTY 512
 #define SPCFLAG_EXEC 1024
 #define SPCFLAG_ACTION_REPLAY 2048
+#define SPCFLAG_TRAP 4096 /* enforcer-hack */
 #define SPCFLAG_MODE_CHANGE 8192
 #define SPCFLAG_END_COMPILE 16384
 
index 0c1cb86ab8cae5b4b51869980227972997e82e1b..f0ceb0f1796d5166d248c106266af274ec6f5202 100755 (executable)
@@ -81,6 +81,7 @@ extern uae_u8 *filesysory;
 extern uae_u8 *rtarea;
 
 extern addrbank chipmem_bank;
+extern addrbank chipmem_agnus_bank;
 extern addrbank chipmem_bank_ce2;
 extern addrbank kickmem_bank;
 extern addrbank custom_bank;
@@ -200,6 +201,13 @@ extern void chipmem_lput (uaecptr, uae_u32) REGPARAM;
 extern void chipmem_wput (uaecptr, uae_u32) REGPARAM;
 extern void chipmem_bput (uaecptr, uae_u32) REGPARAM;
 
+extern uae_u32 chipmem_agnus_lget (uaecptr) REGPARAM;
+extern uae_u32 chipmem_agnus_wget (uaecptr) REGPARAM;
+extern uae_u32 chipmem_agnus_bget (uaecptr) REGPARAM;
+extern void chipmem_agnus_lput (uaecptr, uae_u32) REGPARAM;
+extern void chipmem_agnus_wput (uaecptr, uae_u32) REGPARAM;
+extern void chipmem_agnus_bput (uaecptr, uae_u32) REGPARAM;
+
 extern uae_u32 chipmem_mask, kickmem_mask;
 extern uae_u8 *kickmemory;
 extern int kickmem_size;
index 96143c538a41a498fa4c46eb069fdf67bb0646c5..50c7e8fce8933fad397dfc58f5b80811ab0236d1 100755 (executable)
@@ -219,6 +219,7 @@ struct uae_prefs {
     int win32_midiindev;
     int win32_aspi;
     int win32_soundcard;
+    int win32_norecyclebin;
 
     int curses_reverse_video;
 
index a828129da1e8811000a7ae3d98364d1a0fda4bc2..867c8d76ebf7a6dddcb67bfc8741f52cf18ca14d 100755 (executable)
@@ -82,7 +82,7 @@ struct inputevent {
 #define AM_AF 32 /* supports autofire */
 #define AM_INFO 64 /* information data for gui */
 #define AM_DUMMY 128 /* placeholder */
-#define AM_K (AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF) /* keyboard */
+#define AM_K (AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF) /* generic button/switch */
 
 /* event flags */
 #define ID_FLAG_AUTOFIRE 1
index 21e13c689eedcadee0043e6ff4efbdfffa8518d3..678a90ea030f4a1b942cc6aab88f0c0f5128c29a 100755 (executable)
@@ -22,25 +22,25 @@ DEFEVENT(JOY1_VERT,"Joy1 Vertical",AM_JOY_AXIS,0,1,DIR_UP|DIR_DOWN)
 DEFEVENT(JOY1_HORIZ_POT,"Joy1 Horizontal (Analog)",AM_JOY_AXIS,64,1,0)
 DEFEVENT(JOY1_VERT_POT,"Joy1 Vertical (Analog)",AM_JOY_AXIS,64,1,1)
 
-DEFEVENT(JOY1_LEFT,"Joy1 Left",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_LEFT)
-DEFEVENT(JOY1_RIGHT,"Joy1 Right",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_RIGHT)
-DEFEVENT(JOY1_UP,"Joy1 Up",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_UP)
-DEFEVENT(JOY1_DOWN,"Joy1 Down",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_DOWN)
-DEFEVENT(JOY1_LEFT_UP,"Joy1 Left+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_LEFT|DIR_UP)
-DEFEVENT(JOY1_LEFT_DOWN,"Joy1 Left+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_LEFT|DIR_DOWN)
-DEFEVENT(JOY1_RIGHT_UP,"Joy1 Right+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_RIGHT|DIR_UP)
-DEFEVENT(JOY1_RIGHT_DOWN,"Joy1 Right+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_RIGHT|DIR_DOWN)
-
-DEFEVENT(JOY1_FIRE_BUTTON,"Joy1 Fire/Mouse1 Left Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_1)
-DEFEVENT(JOY1_2ND_BUTTON,"Joy1 2nd Button/Mouse1 Right Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_2)
-DEFEVENT(JOY1_3RD_BUTTON,"Joy1 3rd Button/Mouse1 Middle Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_3)
-DEFEVENT(JOY1_CD32_PLAY,"Joy1 CD32 Play",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_PLAY)
-DEFEVENT(JOY1_CD32_RWD,"Joy1 CD32 RWD",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_RWD)
-DEFEVENT(JOY1_CD32_FFW,"Joy1 CD32 FFW",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_FFW)
-DEFEVENT(JOY1_CD32_GREEN,"Joy1 CD32 Green",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_GREEN)
-DEFEVENT(JOY1_CD32_YELLOW,"Joy1 CD32 Yellow",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_YELLOW)
-DEFEVENT(JOY1_CD32_RED,"Joy1 CD32 Red",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_RED)
-DEFEVENT(JOY1_CD32_BLUE,"Joy1 CD32 Blue",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_BLUE)
+DEFEVENT(JOY1_LEFT,"Joy1 Left",AM_K,16,1,DIR_LEFT)
+DEFEVENT(JOY1_RIGHT,"Joy1 Right",AM_K,16,1,DIR_RIGHT)
+DEFEVENT(JOY1_UP,"Joy1 Up",AM_K,16,1,DIR_UP)
+DEFEVENT(JOY1_DOWN,"Joy1 Down",AM_K,16,1,DIR_DOWN)
+DEFEVENT(JOY1_LEFT_UP,"Joy1 Left+Up",AM_K,16,1,DIR_LEFT|DIR_UP)
+DEFEVENT(JOY1_LEFT_DOWN,"Joy1 Left+Down",AM_K,16,1,DIR_LEFT|DIR_DOWN)
+DEFEVENT(JOY1_RIGHT_UP,"Joy1 Right+Up",AM_K,16,1,DIR_RIGHT|DIR_UP)
+DEFEVENT(JOY1_RIGHT_DOWN,"Joy1 Right+Down",AM_K,16,1,DIR_RIGHT|DIR_DOWN)
+
+DEFEVENT(JOY1_FIRE_BUTTON,"Joy1 Fire/Mouse1 Left Button",AM_K,4,1,JOYBUTTON_1)
+DEFEVENT(JOY1_2ND_BUTTON,"Joy1 2nd Button/Mouse1 Right Button",AM_K,4,1,JOYBUTTON_2)
+DEFEVENT(JOY1_3RD_BUTTON,"Joy1 3rd Button/Mouse1 Middle Button",AM_K,4,1,JOYBUTTON_3)
+DEFEVENT(JOY1_CD32_PLAY,"Joy1 CD32 Play",AM_K,4,1,JOYBUTTON_CD32_PLAY)
+DEFEVENT(JOY1_CD32_RWD,"Joy1 CD32 RWD",AM_K,4,1,JOYBUTTON_CD32_RWD)
+DEFEVENT(JOY1_CD32_FFW,"Joy1 CD32 FFW",AM_K,4,1,JOYBUTTON_CD32_FFW)
+DEFEVENT(JOY1_CD32_GREEN,"Joy1 CD32 Green",AM_K,4,1,JOYBUTTON_CD32_GREEN)
+DEFEVENT(JOY1_CD32_YELLOW,"Joy1 CD32 Yellow",AM_K,4,1,JOYBUTTON_CD32_YELLOW)
+DEFEVENT(JOY1_CD32_RED,"Joy1 CD32 Red",AM_K,4,1,JOYBUTTON_CD32_RED)
+DEFEVENT(JOY1_CD32_BLUE,"Joy1 CD32 Blue",AM_K,4,1,JOYBUTTON_CD32_BLUE)
 
 /* joystick/mouse port 2 */
 
@@ -63,25 +63,25 @@ DEFEVENT(JOY2_VERT,"Joy2 Vertical",AM_JOY_AXIS,0,2,DIR_UP|DIR_DOWN)
 DEFEVENT(JOY2_HORIZ_POT,"Joy2 Horizontal (Analog)",AM_JOY_AXIS,64,2,0)
 DEFEVENT(JOY2_VERT_POT,"Joy2 Vertical (Analog)",AM_JOY_AXIS,64,2,1)
 
-DEFEVENT(JOY2_LEFT,"Joy2 Left",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_LEFT)
-DEFEVENT(JOY2_RIGHT,"Joy2 Right",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_RIGHT)
-DEFEVENT(JOY2_UP,"Joy2 Up",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_UP)
-DEFEVENT(JOY2_DOWN,"Joy2 Down",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_DOWN)
-DEFEVENT(JOY2_LEFT_UP,"Joy2 Left+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_LEFT|DIR_UP)
-DEFEVENT(JOY2_LEFT_DOWN,"Joy2 Left+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_LEFT|DIR_DOWN)
-DEFEVENT(JOY2_RIGHT_UP,"Joy2 Right+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_RIGHT|DIR_UP)
-DEFEVENT(JOY2_RIGHT_DOWN,"Joy2 Right+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_RIGHT|DIR_DOWN)
-
-DEFEVENT(JOY2_FIRE_BUTTON,"Joy2 Fire/Mouse1 Left Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_1)
-DEFEVENT(JOY2_2ND_BUTTON,"Joy2 2nd Button/Mouse1 Right Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_2)
-DEFEVENT(JOY2_3RD_BUTTON,"Joy2 3rd Button/Mouse1 Middle Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_3)
-DEFEVENT(JOY2_CD32_PLAY,"Joy2 CD32 Play",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_PLAY)
-DEFEVENT(JOY2_CD32_RWD,"Joy2 CD32 RWD",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_RWD)
-DEFEVENT(JOY2_CD32_FFW,"Joy2 CD32 FFW",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_FFW)
-DEFEVENT(JOY2_CD32_GREEN,"Joy2 CD32 Green",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_GREEN)
-DEFEVENT(JOY2_CD32_YELLOW,"Joy2 CD32 Yellow",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_YELLOW)
-DEFEVENT(JOY2_CD32_RED,"Joy2 CD32 Red",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_RED)
-DEFEVENT(JOY2_CD32_BLUE,"Joy2 CD32 Blue",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_BLUE)
+DEFEVENT(JOY2_LEFT,"Joy2 Left",AM_K,16,2,DIR_LEFT)
+DEFEVENT(JOY2_RIGHT,"Joy2 Right",AM_K,16,2,DIR_RIGHT)
+DEFEVENT(JOY2_UP,"Joy2 Up",AM_K,16,2,DIR_UP)
+DEFEVENT(JOY2_DOWN,"Joy2 Down",AM_K,16,2,DIR_DOWN)
+DEFEVENT(JOY2_LEFT_UP,"Joy2 Left+Up",AM_K,16,2,DIR_LEFT|DIR_UP)
+DEFEVENT(JOY2_LEFT_DOWN,"Joy2 Left+Down",AM_K,16,2,DIR_LEFT|DIR_DOWN)
+DEFEVENT(JOY2_RIGHT_UP,"Joy2 Right+Up",AM_K,16,2,DIR_RIGHT|DIR_UP)
+DEFEVENT(JOY2_RIGHT_DOWN,"Joy2 Right+Down",AM_K,16,2,DIR_RIGHT|DIR_DOWN)
+
+DEFEVENT(JOY2_FIRE_BUTTON,"Joy2 Fire/Mouse1 Left Button",AM_K,4,2,JOYBUTTON_1)
+DEFEVENT(JOY2_2ND_BUTTON,"Joy2 2nd Button/Mouse1 Right Button",AM_K,4,2,JOYBUTTON_2)
+DEFEVENT(JOY2_3RD_BUTTON,"Joy2 3rd Button/Mouse1 Middle Button",AM_K,4,2,JOYBUTTON_3)
+DEFEVENT(JOY2_CD32_PLAY,"Joy2 CD32 Play",AM_K,4,2,JOYBUTTON_CD32_PLAY)
+DEFEVENT(JOY2_CD32_RWD,"Joy2 CD32 RWD",AM_K,4,2,JOYBUTTON_CD32_RWD)
+DEFEVENT(JOY2_CD32_FFW,"Joy2 CD32 FFW",AM_K,4,2,JOYBUTTON_CD32_FFW)
+DEFEVENT(JOY2_CD32_GREEN,"Joy2 CD32 Green",AM_K,4,2,JOYBUTTON_CD32_GREEN)
+DEFEVENT(JOY2_CD32_YELLOW,"Joy2 CD32 Yellow",AM_K,4,2,JOYBUTTON_CD32_YELLOW)
+DEFEVENT(JOY2_CD32_RED,"Joy2 CD32 Red",AM_K,4,2,JOYBUTTON_CD32_RED)
+DEFEVENT(JOY2_CD32_BLUE,"Joy2 CD32 Blue",AM_K,4,2,JOYBUTTON_CD32_BLUE)
 
 /* parallel port joystick adapter */
 
@@ -89,29 +89,29 @@ DEFEVENT(PAR_JOY1_START, "Parallel port joystick adapter", AM_INFO, 0,3,0)
 
 DEFEVENT(PAR_JOY1_HORIZ,"Parallel Joy1 Horizontal",AM_JOY_AXIS,0,3,DIR_LEFT|DIR_RIGHT)
 DEFEVENT(PAR_JOY1_VERT,"Parallel Joy1 Vertical",AM_JOY_AXIS,0,3,DIR_UP|DIR_DOWN)
-DEFEVENT(PAR_JOY1_LEFT,"Parallel Joy1 Left",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_LEFT)
-DEFEVENT(PAR_JOY1_RIGHT,"Parallel Joy1 Right",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_RIGHT)
-DEFEVENT(PAR_JOY1_UP,"Parallel Joy1 Up",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_UP)
-DEFEVENT(PAR_JOY1_DOWN,"Parallel Joy1 Down",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_DOWN)
-DEFEVENT(PAR_JOY1_LEFT_UP,"Parallel Joy1 Left+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_LEFT|DIR_UP)
-DEFEVENT(PAR_JOY1_LEFT_DOWN,"Parallel Joy1 Left+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_LEFT|DIR_DOWN)
-DEFEVENT(PAR_JOY1_RIGHT_UP,"Parallel Joy1 Right+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_RIGHT|DIR_UP)
-DEFEVENT(PAR_JOY1_RIGHT_DOWN,"Parallel Joy1 Right+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_RIGHT|DIR_DOWN)
-DEFEVENT(PAR_JOY1_FIRE_BUTTON,"Parallel Joy1 Fire Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,3,JOYBUTTON_1)
+DEFEVENT(PAR_JOY1_LEFT,"Parallel Joy1 Left",AM_K,16,3,DIR_LEFT)
+DEFEVENT(PAR_JOY1_RIGHT,"Parallel Joy1 Right",AM_K,16,3,DIR_RIGHT)
+DEFEVENT(PAR_JOY1_UP,"Parallel Joy1 Up",AM_K,16,3,DIR_UP)
+DEFEVENT(PAR_JOY1_DOWN,"Parallel Joy1 Down",AM_K,16,3,DIR_DOWN)
+DEFEVENT(PAR_JOY1_LEFT_UP,"Parallel Joy1 Left+Up",AM_K,16,3,DIR_LEFT|DIR_UP)
+DEFEVENT(PAR_JOY1_LEFT_DOWN,"Parallel Joy1 Left+Down",AM_K,16,3,DIR_LEFT|DIR_DOWN)
+DEFEVENT(PAR_JOY1_RIGHT_UP,"Parallel Joy1 Right+Up",AM_K,16,3,DIR_RIGHT|DIR_UP)
+DEFEVENT(PAR_JOY1_RIGHT_DOWN,"Parallel Joy1 Right+Down",AM_K,16,3,DIR_RIGHT|DIR_DOWN)
+DEFEVENT(PAR_JOY1_FIRE_BUTTON,"Parallel Joy1 Fire Button",AM_K,4,3,JOYBUTTON_1)
 
 DEFEVENT(PAR_JOY2_START, "", AM_DUMMY, 0,4,0)
 
 DEFEVENT(PAR_JOY2_HORIZ,"Parallel Joy2 Horizontal",AM_JOY_AXIS,0,4,DIR_LEFT|DIR_RIGHT)
 DEFEVENT(PAR_JOY2_VERT,"Parallel Joy2 Vertical",AM_JOY_AXIS,0,4,DIR_UP|DIR_DOWN)
-DEFEVENT(PAR_JOY2_LEFT,"Parallel Joy2 Left",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_LEFT)
-DEFEVENT(PAR_JOY2_RIGHT,"Parallel Joy2 Right",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_RIGHT)
-DEFEVENT(PAR_JOY2_UP,"Parallel Joy2 Up",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_UP)
-DEFEVENT(PAR_JOY2_DOWN,"Parallel Joy2 Down",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_DOWN)
-DEFEVENT(PAR_JOY2_LEFT_UP,"Parallel Joy2 Left+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_LEFT|DIR_UP)
-DEFEVENT(PAR_JOY2_LEFT_DOWN,"Parallel Joy2 Left+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_LEFT|DIR_DOWN)
-DEFEVENT(PAR_JOY2_RIGHT_UP,"Parallel Joy2 Right+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_RIGHT|DIR_UP)
-DEFEVENT(PAR_JOY2_RIGHT_DOWN,"Parallel Joy2 Right+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_RIGHT|DIR_DOWN)
-DEFEVENT(PAR_JOY2_FIRE_BUTTON,"Parallel Joy2 Fire Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,4,JOYBUTTON_1)
+DEFEVENT(PAR_JOY2_LEFT,"Parallel Joy2 Left",AM_K,16,4,DIR_LEFT)
+DEFEVENT(PAR_JOY2_RIGHT,"Parallel Joy2 Right",AM_K,16,4,DIR_RIGHT)
+DEFEVENT(PAR_JOY2_UP,"Parallel Joy2 Up",AM_K,16,4,DIR_UP)
+DEFEVENT(PAR_JOY2_DOWN,"Parallel Joy2 Down",AM_K,16,4,DIR_DOWN)
+DEFEVENT(PAR_JOY2_LEFT_UP,"Parallel Joy2 Left+Up",AM_K,16,4,DIR_LEFT|DIR_UP)
+DEFEVENT(PAR_JOY2_LEFT_DOWN,"Parallel Joy2 Left+Down",AM_K,16,4,DIR_LEFT|DIR_DOWN)
+DEFEVENT(PAR_JOY2_RIGHT_UP,"Parallel Joy2 Right+Up",AM_K,16,4,DIR_RIGHT|DIR_UP)
+DEFEVENT(PAR_JOY2_RIGHT_DOWN,"Parallel Joy2 Right+Down",AM_K,16,4,DIR_RIGHT|DIR_DOWN)
+DEFEVENT(PAR_JOY2_FIRE_BUTTON,"Parallel Joy2 Fire Button",AM_K,4,4,JOYBUTTON_1)
 
 DEFEVENT(PAR_JOY_END, "", AM_DUMMY, 0,0,0)
 
@@ -277,7 +277,7 @@ DEFEVENT(SPC_STATESAVEDIALOG,"Save state",AM_K,0,0,AKS_STATESAVEDIALOG)
 DEFEVENT(SPC_STATERESTOREDIALOG,"Restore state",AM_K,0,0,AKS_STATERESTOREDIALOG)
 DEFEVENT(SPC_TOGGLEFULLSCREEN,"Toggle windowed/fullscreen",AM_K,0,0,AKS_TOGGLEFULLSCREEN)
 DEFEVENT(SPC_DECREASE_REFRESHRATE,"Decrease emulation speed",AM_K,0,0,AKS_DECREASEREFRESHRATE)
-DEFEVENT(SPC_INCREASE_REFRESHRARE,"Increase emulation speed",AM_K,0,0,AKS_INCREASEREFRESHRATE)
+DEFEVENT(SPC_INCREASE_REFRESHRATE,"Increase emulation speed",AM_K,0,0,AKS_INCREASEREFRESHRATE)
 
 DEFEVENT(SPC_ARCADIA_DIAGNOSTICS,"Arcadia diagnostics dip switch",AM_K,0,0,AKS_ARCADIADIAGNOSTICS)
 DEFEVENT(SPC_ARCADIA_PLAYER1,"Arcadia player 1",AM_K,0,0,AKS_ARCADIAPLY1)
index 65e5c111d0062ab2aaa087f55d82d4ad81e0e273..8c86a4f93f872edffffdfd09620010361ee72ae7 100755 (executable)
--- a/memory.c
+++ b/memory.c
@@ -93,7 +93,7 @@ static struct romdata roms[] = {
     { "Kickstart v1.0 (A1000)(NTSC)", 0, 0, 0x299790ff, 262144, 1, 0, 0, ROMTYPE_KICK },
     { "Kickstart v1.1 (A1000)(NTSC)", 31, 34, 0xd060572a, 262144, 2, 0, 0, ROMTYPE_KICK },
     { "Kickstart v1.1 (A1000)(PAL)", 31, 34, 0xec86dae2, 262144, 3, 0, 0, ROMTYPE_KICK },
-    { "Kickstart v1.2 (A1000)", 33, 166, 0x0ed783d0, 262144, 4, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v1.2 (A1000)", 33, 166, 0x9ed783d0, 262144, 4, 0, 0, ROMTYPE_KICK },
     { "Kickstart v1.2 (A500,A1000,A2000)", 33, 180, 0xa6ce1636, 262144, 5, 0, 0, ROMTYPE_KICK },
     { "Kickstart v1.3 (A500,A1000,A2000)", 34, 5, 0xc4f0f55f, 262144, 6, 60, 0, ROMTYPE_KICK },
     { "Kickstart v1.3 (A3000)", 34, 5, 0xe0f37258, 262144, 32, 0, 0, ROMTYPE_KICK },
@@ -194,14 +194,13 @@ uae_u8 *load_keyfile (struct uae_prefs *p, char *path, int *size)
            strcat (tmp, "rom.key");
            f = zfile_fopen (tmp, "rb");
            if (!f) {
-               f = zfile_fopen ("roms\\rom.key", "rb");
+               f = zfile_fopen ("roms/rom.key", "rb");
                if (!f) {
                    strcpy (tmp, start_path);
                    strcat (tmp, "rom.key");
                    f = zfile_fopen(tmp, "rb");
                    if (!f) {
-                       strcpy (tmp, start_path);
-                       strcat (tmp, "..\\shared\\rom\\rom.key");
+                       sprintf (tmp, "%s../shared/rom/rom.key", start_path);
                        f = zfile_fopen(tmp, "rb");
                    }
                }
@@ -302,10 +301,12 @@ struct romdata *getromdatabydata (uae_u8 *rom, int size)
     memcpy (rom, tmp, 4);
     i = 0;
     while (roms[i].name) {
-       if (crc32a == roms[i].crc32 || crc32b == roms[i].crc32)
-           return &roms[i];
-       if (crc32c == roms[i].crc32 && roms[i].type == ROMTYPE_AR)
-           return &roms[i];
+       if (roms[i].crc32) {
+           if (crc32a == roms[i].crc32 || crc32b == roms[i].crc32)
+               return &roms[i];
+           if (crc32c == roms[i].crc32 && roms[i].type == ROMTYPE_AR)
+               return &roms[i];
+       }
        i++;
     }
     xfree (tmpbuf);
@@ -382,7 +383,8 @@ __inline__ void byteput (uaecptr addr, uae_u32 b)
 }
 #endif
 
-uae_u32 chipmem_mask, kickmem_mask, extendedkickmem_mask, bogomem_mask, a3000mem_mask;
+uae_u32 chipmem_mask, chipmem_full_mask;
+uae_u32 kickmem_mask, extendedkickmem_mask, bogomem_mask, a3000mem_mask;
 
 static int illegal_count;
 /* A dummy bank that only contains zeros */
@@ -690,7 +692,6 @@ void REGPARAM2 chipmem_lput (uaecptr addr, uae_u32 l)
     do_put_mem_long (m, l);
 }
 
-
 void REGPARAM2 chipmem_wput (uaecptr addr, uae_u32 w)
 {
     uae_u16 *m;
@@ -708,6 +709,66 @@ void REGPARAM2 chipmem_bput (uaecptr addr, uae_u32 b)
     chipmemory[addr] = b;
 }
 
+uae_u32 REGPARAM2 chipmem_agnus_lget (uaecptr addr)
+{
+    uae_u32 *m;
+
+    addr -= chipmem_start & chipmem_full_mask;
+    addr &= chipmem_full_mask;
+    m = (uae_u32 *)(chipmemory + addr);
+    return do_get_mem_long (m);
+}
+
+uae_u32 REGPARAM2 chipmem_agnus_wget (uaecptr addr)
+{
+    uae_u16 *m;
+
+    addr -= chipmem_start & chipmem_full_mask;
+    addr &= chipmem_full_mask;
+    m = (uae_u16 *)(chipmemory + addr);
+    return do_get_mem_word (m);
+}
+
+uae_u32 REGPARAM2 chipmem_agnus_bget (uaecptr addr)
+{
+    addr -= chipmem_start & chipmem_full_mask;
+    addr &= chipmem_full_mask;
+    return chipmemory[addr];
+}
+
+void REGPARAM2 chipmem_agnus_lput (uaecptr addr, uae_u32 l)
+{
+    uae_u32 *m;
+
+    addr -= chipmem_start & chipmem_full_mask;
+    addr &= chipmem_full_mask;
+    if (addr >= allocated_chipmem)
+       return;
+    m = (uae_u32 *)(chipmemory + addr);
+    do_put_mem_long (m, l);
+}
+
+void REGPARAM2 chipmem_agnus_wput (uaecptr addr, uae_u32 w)
+{
+    uae_u16 *m;
+
+    addr -= chipmem_start & chipmem_full_mask;
+    addr &= chipmem_full_mask;
+    if (addr >= allocated_chipmem)
+       return;
+    m = (uae_u16 *)(chipmemory + addr);
+    do_put_mem_word (m, w);
+}
+
+void REGPARAM2 chipmem_agnus_bput (uaecptr addr, uae_u32 b)
+{
+    addr -= chipmem_start & chipmem_full_mask;
+    addr &= chipmem_full_mask;
+    if (addr >= allocated_chipmem)
+       return;
+    chipmemory[addr] = b;
+}
+
 int REGPARAM2 chipmem_check (uaecptr addr, uae_u32 size)
 {
     addr -= chipmem_start & chipmem_mask;
@@ -1216,6 +1277,12 @@ addrbank chipmem_bank = {
     chipmem_xlate, chipmem_check, NULL
 };
 
+addrbank chipmem_agnus_bank = {
+    chipmem_agnus_lget, chipmem_agnus_wget, chipmem_agnus_bget,
+    chipmem_agnus_lput, chipmem_agnus_wput, chipmem_agnus_bput,
+    chipmem_xlate, chipmem_check, NULL
+};
+
 #ifdef AGA
 addrbank chipmem_bank_ce2 = {
     chipmem_lget_ce2, chipmem_wget_ce2, chipmem_bget_ce2,
@@ -1438,21 +1505,27 @@ static int patch_residents (uae_u8 *kickmemory)
 static int load_kickstart (void)
 {
     struct zfile *f = zfile_fopen (currprefs.romfile, "rb");
-    char tmprom[MAX_DPATH];
+    char tmprom[MAX_DPATH], tmprom2[MAX_DPATH];
     int patched = 0;
 
     strcpy (tmprom, currprefs.romfile);
     if (f == NULL) {
-       strcpy (currprefs.romfile, "roms/kick.rom");
-       f = zfile_fopen (currprefs.romfile, "rb");
+       sprintf (tmprom2, "%s%s", start_path, currprefs.romfile);
+       f = zfile_fopen (tmprom2, "rb");
        if (f == NULL) {
-           strcpy( currprefs.romfile, "kick.rom" );
-           f = zfile_fopen( currprefs.romfile, "rb" );
+           sprintf (currprefs.romfile, "%sroms/kick.rom", start_path);
+           f = zfile_fopen (currprefs.romfile, "rb");
            if (f == NULL) {
-               strcpy( currprefs.romfile, "..\\shared\\rom\\kick.rom" );
-               f = zfile_fopen( currprefs.romfile, "rb" );
+               sprintf (currprefs.romfile, "%skick.rom", start_path);
+               f = zfile_fopen (currprefs.romfile, "rb");
+               if (f == NULL) {
+                   sprintf (currprefs.romfile, "%s../shared/rom/kick.rom", start_path);
+                   f = zfile_fopen (currprefs.romfile, "rb");
+               }
            }
-        }
+       } else {
+           strcpy (currprefs.romfile, tmprom2);
+       }
     }
     if( f == NULL ) { /* still no luck */
 #if defined(AMIGA)||defined(__POS__)
@@ -1659,19 +1732,26 @@ void clearexec (void)
 static void allocate_memory (void)
 {
     if (allocated_chipmem != currprefs.chipmem_size) {
+       int memsize;
        if (chipmemory)
            mapped_free (chipmemory);
        chipmemory = 0;
 
-       allocated_chipmem = currprefs.chipmem_size;
-       chipmem_mask = allocated_chipmem - 1;
-
-       chipmemory = mapped_malloc (allocated_chipmem, "chip");
+       memsize = allocated_chipmem = currprefs.chipmem_size;
+       chipmem_full_mask = chipmem_mask = allocated_chipmem - 1;
+       if ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) && allocated_chipmem < 0x100000) {
+           chipmem_full_mask = 0x100000 - 1;
+           memsize *= 2;
+       }
+       chipmemory = mapped_malloc (memsize, "chip");
        if (chipmemory == 0) {
            write_log ("Fatal error: out of memory for chipmem.\n");
            allocated_chipmem = 0;
-       } else
-       clearexec ();
+       } else {
+           clearexec ();
+           if (memsize != allocated_chipmem)
+               memset (chipmemory + allocated_chipmem, 0xff, memsize - allocated_chipmem);
+       }
     }
 
     if (allocated_bogomem != currprefs.bogomem_size) {
@@ -1770,8 +1850,10 @@ void memory_reset (void)
         load_extendedkickstart ();
        kickmem_mask = 524288 - 1;
        if (!load_kickstart ()) {
-           if (strlen (currprefs.romfile) > 0)
+           if (strlen (currprefs.romfile) > 0) {
+               write_log ("%s\n", currprefs.romfile);
                notify_user (NUMSG_NOROM);
+           }
 #ifdef AUTOCONFIG
             init_ersatz_rom (kickmemory);
            ersatzkickfile = 1;
index 0a1637d9b07c5260e7c51e4eaa4eafadda1273e7..b4b3745d413f73476fd039a65f76cfcef439599c 100755 (executable)
--- a/newcpu.c
+++ b/newcpu.c
@@ -1698,9 +1698,13 @@ static int do_specialties (int cycles)
            do_copper ();
     }
 
-    if (regs.spcflags & SPCFLAG_DOTRACE) {
+    if (regs.spcflags & SPCFLAG_DOTRACE)
        Exception (9,last_trace_ad);
+    if (regs.spcflags & SPCFLAG_TRAP) {
+       unset_special (SPCFLAG_TRAP);
+       Exception (32 + 15, 0);
     }
+
     while (regs.spcflags & SPCFLAG_STOP) {
        do_cycles (4 * CYCLE_UNIT);
        if (regs.spcflags & SPCFLAG_COPPER)
index 6abb14337ce1b493e90d765f946140ac43764fef..5d1056ad0eb13d2d825572e6c1558a7bc9b24884 100755 (executable)
@@ -437,7 +437,8 @@ static int recycle (const char *name)
     memset (&fos, 0, sizeof (fos));
     fos.wFunc = FO_DELETE;
     fos.pFrom = p;
-    fos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NORECURSION | FOF_SILENT;
+    fos.fFlags = (currprefs.win32_norecyclebin ? 0 : FOF_ALLOWUNDO) |
+       FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NORECURSION | FOF_SILENT;
     v = SHFileOperation (&fos);
     xfree (p);
     return v ? -1 : 0;
@@ -469,14 +470,12 @@ int my_rmdir (const char *name)
     }
 
     return recycle (name);
-    //return RemoveDirectory (name) == 0 ? -1 : 0;
 }
 
 /* "move to Recycle Bin" (if enabled) -version of DeleteFile() */
 int my_unlink (const char *name)
 {
     return recycle (name);
-    //return DeleteFile (name) == 0 ? -1 : 0;
 }
 
 int my_rename (const char *oldname, const char *newname)
index a05eb40ca08a90ea806a46ccd3a12d176e300ab8..ad67e76e1377df1294628146f0b158d0b397eed8 100755 (executable)
@@ -25,6 +25,8 @@ void init_shm( void )
 #else
     LPBYTE address = (LPBYTE)0x10000000; // Letting the system decide doesn't seem to work on some systems
 #endif
+    int size = 0x19000000;
+    int add = 0x1000000;
 
     canbang = 0;
     gfxoffs = 0;
@@ -37,27 +39,34 @@ void init_shm( void )
        shmids[i].addr = NULL;
        shmids[i].name[0] = 0;
     }
-    while( address < (LPBYTE)0xa0000000 )
+    while (address < (LPBYTE)0xa0000000)
     {
-        blah = VirtualAlloc( address, 0x19000000, MEM_RESERVE, PAGE_EXECUTE_READWRITE );
-        if( blah == NULL )
+        blah = VirtualAlloc( address, size, MEM_RESERVE, PAGE_EXECUTE_READWRITE );
+        if (blah == NULL)
         {
-           address += 0x01000000;
+           address += add;
        }
         else
         {
-           natmem_offset = (uae_u32)blah + 0x1000000;
+           natmem_offset = (uae_u32)blah;
+           write_log ("NATMEM: Our special area: 0x%x-0x%x\n", natmem_offset, natmem_offset + size);
+           VirtualFree (blah, 0, MEM_RELEASE);
+           while (address < (LPBYTE)0xa0000000) {
+               address += add * 8;
+               blah = VirtualAlloc (address, size, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
+               if (blah == NULL) {
+                   address -= add * 8;
+                   break;
+               }
+               VirtualFree (blah, 0, MEM_RELEASE);
+           }
+           natmem_offset = (uae_u8*)natmem_offset + ((uae_u8*)address - (uae_u8*)natmem_offset) / 2;
+           write_log ("NATMEM: after adjustment; 0x%x-0x%x\n", natmem_offset, natmem_offset + size);
+           canbang = 1;
            break;
        }
     }
-    if( natmem_offset )
-    {
-       write_log( "NATMEM: Our special area is 0x%x\n", natmem_offset );
-       VirtualFree( blah, 0, MEM_RELEASE );
-       canbang = 1;
-    }
-    else
-    {
+    if (!natmem_offset) {
        write_log( "NATMEM: No special area could be allocated!\n" );
     }
 }
@@ -199,6 +208,12 @@ void *shmat(int shmid, LPVOID shmaddr, int shmflg)
            shmids[shmid].attached=result;
            return result;
        }
+       if(!strcmp(shmids[shmid].name,"arcadia"))
+       {
+           result=natmem_offset+0x10000;
+           shmids[shmid].attached=result;
+           return result;
+       }
 }
 #endif
     
@@ -210,10 +225,11 @@ void *shmat(int shmid, LPVOID shmaddr, int shmflg)
            {
                result=(void*)VirtualFree(shmaddr,0,MEM_RELEASE);
            }
-           result =VirtualAlloc(shmaddr,size,MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
+           result = VirtualAlloc(shmaddr,size,MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
            if( result == NULL )
            {
                result = (void *)-1;
+               write_log ("VirtualAlloc %x %x failed %d\n", shmaddr, size, GetLastError ());
            }
            else
            {
index 4c00195878f56b0c36e781b3c40e24690b58f75b..9ea9ba1a12f69f460dd55980126914441fd5aaa4 100755 (executable)
@@ -1583,7 +1583,7 @@ 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 ? 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));
 }
 
 static int AssignModeID( int i, int count )
@@ -2235,8 +2235,8 @@ STATIC_INLINE int BlitRectHelper( void )
     * If we have a destination RenderInfo, then we've been called from picasso_BlitRectNoMaskComplete()
     * and we need to put the results on the screen from the frame-buffer.
     */
-    //if (dstri == NULL) 
-    if (dstri->Memory == ri->Memory)
+    //if (dstri->Memory == ri->Memory)
+    if (dstri == NULL || dstri->Memory == ri->Memory)
     {
         if( mask != 0xFF && Bpp > 1 ) 
         {
@@ -2862,7 +2862,7 @@ void init_hz_p96 (void)
     if (isfullscreen ())
        rate = DirectDraw_CurrentRefreshRate ();
     else
-       rate = currprefs.gfx_refreshrate;
+       rate = abs (currprefs.gfx_refreshrate);
     if (rate <= 0)
         rate = 60;
     p96syncrate /= rate;
index 3bdb1820f44a8575e042f8884ead971465ec1235..c6c0c771b6002be8e98cda5d2058b9d572c664a0 100755 (executable)
@@ -1258,7 +1258,7 @@ BEGIN
     IDS_SELECTFILESYSROOT   "Please select your file-system root directory..."
     IDS_DEFAULTMIDIOUT      "Default MIDI-Out Device"
     IDS_CONTRIBUTORS1       "Bernd Schmidt - The Grand-Master\nSam Jordan - Custom-chip, floppy-DMA, etc.\nMathias Ortmann - Original WinUAE Main Guy, BSD Socket support\nBrian King - Picasso96 Support, Integrated GUI for WinUAE, previous WinUAE Main Guy\nToni Wilen - Core updates, WinUAE Main Guy\nGustavo Goedert/Peter Remmers/Michael Sontheimer/Tomi Hakala/Tim Gunn/Nemo Pohle - DOS Port Stuff\nSamuel Devulder/Olaf Barthel/Sam Jordan - Amiga Ports\nKrister Bergman - XFree86 and OS/2 Port\nA. Blanchard/Ernesto Corvi - MacOS Port\nChristian Bauer - BeOS Port\nIan Stephenson - NextStep Port\nPeter Teichmann - Acorn/RiscOS Port\nStefan Reinauer - ZorroII/III AutoConfig, Serial Support\nChristian Schmitt/Chris Hames - Serial Support\nHerman ten Brugge - 68020/68881 Emulation Code\nTauno Taipaleenmaki - Various UAE-Control/UAE-Library Support\nBrett Eden/Tim Gunn/Paolo Besser/Nemo Pohle - Various Docs and Web-Sites\nGeorg Veichtlbauer - Help File coordinator, German GUI\nFulvio Leonardi - Italian translator for WinUAE\n"
-    IDS_CONTRIBUTORS2       "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser  - Postscript printing emulation idea and testing."
+    IDS_CONTRIBUTORS2       "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser  - Postscript printing emulation idea and testing.\nPéter Tóth /Balázs Rátkai/Iván Herczeg/András Arató - Hungarian translation"
     IDS_INVALIDPRTPORT      "The printer you have in this configuration is not valid on this machine.\n"
     IDS_RESTOREUSS          "Restore a UAE Snap-Shot File"
     IDS_USS                 "UAE Snap-Shot Files"
@@ -1277,7 +1277,7 @@ BEGIN
     IDS_PATH                "Path"
     IDS_RW                  "R/W"
     IDS_SECTORS             "Sectors"
-    IDS_SURFACES            "Surfaces"
+    IDS_SURFACES            "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser  - Postscript printing emulation idea and testing.\nHungarian translation - Péter Tóth , Balázs Rátkai , Iván Herczeg , András Arató"
     IDS_RESERVED            "Reserved"
     IDS_BLOCKSIZE           "Block Size"
     IDS_NAME                "Name"
index 5341f564d27ec4d94adab7e9326542d17959a786..c6784bb106edf5781a8eabc1eb24bad4db81ae91 100755 (executable)
@@ -1958,7 +1958,7 @@ static void WIN32_HandleRegistryStuff( void )
                               KEY_ALL_ACCESS, NULL, &hWinUAEKeyLocal, &disposition ) == ERROR_SUCCESS ) )
         {
             /* Set our (default) sub-key to BE the "WinUAE" command for launching a configuration */
-            sprintf( path, "%sWinUAE.exe -f \"%%1\"", start_path );
+            sprintf( path, "%sWinUAE.exe -log -f \"%%1\"", start_path );
             RegSetValueEx( hWinUAEKeyLocal, "", 0, REG_SZ, (CONST BYTE *)path, strlen( path ) + 1 );
         }
        RegCloseKey( hWinUAEKeyLocal );
@@ -2222,6 +2222,7 @@ __asm{
            posn[1] = 0;
        sprintf (help_file, "%sWinUAE.chm", start_path );
        sprintf( VersionStr, "WinUAE %d.%d.%d%s", UAEMAJOR, UAEMINOR, UAESUBREV, WINUAEBETA ? WINUAEBETASTR : "" );
+       SetCurrentDirectory (start_path);
 
        logging_init ();
 
index a004f9ae41448331ac1453862d9f649451f84fee..fd9776073b9485965345e3a810663eb9ea850818 100755 (executable)
@@ -22,7 +22,7 @@ extern int manual_palette_refresh_needed;
 extern int mouseactive, focus;
 extern int ignore_messages_all;
 #define WINUAEBETA 1
-#define WINUAEBETASTR " Beta 1"
+#define WINUAEBETASTR " Beta 2"
 
 extern void my_kbd_handler (int, int, int);
 extern void clearallkeys(void);
index 8bdd57d71bdb926f46bd2bc969d5efa5255ea655..06b63cb626f2f1d61522b95270e13ccb64d93c0f 100755 (executable)
@@ -497,7 +497,7 @@ end:
     free (p);
 }
 
-int scan_roms (char *pathp)
+static int scan_roms_2 (char *pathp)
 {
     HKEY fkey = NULL;
     char buf[MAX_PATH], path[MAX_PATH];
@@ -530,7 +530,7 @@ int scan_roms (char *pathp)
            char tmppath[MAX_PATH];
            strcpy (tmppath, path);
            strcat (tmppath, find_data.cFileName);
-           if (scan_rom (tmppath, fkey, keybuf, keysize))
+           if (find_data.nFileSizeLow < 10000000 && scan_rom (tmppath, fkey, keybuf, keysize))
                ret = 1;
            if (FindNextFile (handle, &find_data) == 0) {
                FindClose (handle);
@@ -548,6 +548,20 @@ end:
     if (fkey)
        RegCloseKey (fkey);
     free_keyfile (keybuf);
+    return ret;
+}
+
+int scan_roms (char *pathp)
+{
+    char path[MAX_DPATH];
+
+    int ret = scan_roms_2 (pathp);
+    sprintf (path, "%s..\\shared\\rom\\", start_path);
+    if (!ret && pathp == NULL) {
+       ret = scan_roms_2 (path);
+       if (ret)
+           set_path ("KickstartPath", path);
+    }
     read_rom_list (0);
     show_rom_list ();
     return ret;
@@ -4313,7 +4327,7 @@ static BOOL MiscDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                    break;
                }
            }
-       } else {
+       } else if (currentpage == MISC2_ID) {
            misc_getpri (hDlg, IDC_ACTIVE_PRIORITY, &workprefs.win32_active_priority);
            misc_getpri (hDlg, IDC_INACTIVE_PRIORITY, &workprefs.win32_inactive_priority);
            misc_getpri (hDlg, IDC_MINIMIZED_PRIORITY, &workprefs.win32_iconified_priority);
@@ -6128,15 +6142,18 @@ static void swapperhili (HWND hDlg, int entry)
 static void addswapperfile (HWND hDlg, int entry)
 {
     char path[MAX_DPATH];
+    int lastentry = entry;
+
     if (MultiDiskSelection (hDlg, -1, 0, &changed_prefs, path)) {
         char dpath[MAX_DPATH];
         loopmulti (path, NULL);
         while (loopmulti(path, dpath) && entry < MAX_SPARE_DRIVES) {
             strcpy (workprefs.dfxlist[entry], dpath);
+           lastentry = entry;
             entry++;
         }
         InitializeListView (hDlg);
-        swapperhili (hDlg, entry);
+        swapperhili (hDlg, lastentry);
     }
 }
 
@@ -6270,10 +6287,14 @@ static BOOL CALLBACK SwapperDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
            break;
        
            case IDC_DISKLISTINSERT:
-               if (entry >= 0 && getfloppybox (hDlg, IDC_DISKTEXT, tmp, sizeof (tmp))) {
-                   strcpy (workprefs.dfxlist[entry], tmp);
-                   InitializeListView (hDlg);
-                   swapperhili (hDlg, entry);
+               if (entry >= 0) {
+                   if (getfloppybox (hDlg, IDC_DISKTEXT, tmp, sizeof (tmp))) {
+                       strcpy (workprefs.dfxlist[entry], tmp);
+                       InitializeListView (hDlg);
+                       swapperhili (hDlg, entry);
+                   } else {
+                       addswapperfile (hDlg, entry);
+                   }
                }
                break;