]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
imported winuaesrc1100b9.zip
authorToni Wilen <twilen@winuae.net>
Sun, 25 Sep 2005 13:09:53 +0000 (16:09 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 22 Feb 2010 19:26:44 +0000 (21:26 +0200)
21 files changed:
ar.c
cfgfile.c
cia.c
custom.c
disk.c
filesys.c
include/filesys.h
include/gui.h
include/memory.h
include/options.h
include/zfile.h
memory.c
newcpu.c
od-win32/dinput.c
od-win32/hardfile_win32.c
od-win32/resources/winuae.rc
od-win32/win32.c
od-win32/win32.h
od-win32/win32gui.c
savestate.c
zfile.c

diff --git a/ar.c b/ar.c
index 759e5e8ef83445ddad1b4c9ae053a468af1106b6..41f4ab21deba18a2f38435cae9c537c6fc3e172f 100755 (executable)
--- a/ar.c
+++ b/ar.c
 #include "zfile.h"
 #include "ar.h"
 #include "savestate.h"
+#include "crc32.h"
 
 #define DEBUG
 #ifdef DEBUG
@@ -1610,7 +1611,7 @@ uae_u8 *save_action_replay (int *len, uae_u8 *dstptr)
     strcpy (dst, currprefs.cartfile);
     dst += strlen(dst) + 1;
     memcpy (dst, armemory_ram, arram_size);
-    save_u32 (0);
+    save_u32 (get_crc32 (armemory_rom + 4, arrom_size - 4));
     return dstbak;
 }
 
@@ -1625,13 +1626,13 @@ uae_u8 *restore_action_replay (uae_u8 *src)
     strncpy (changed_prefs.cartfile, src, 255);
     strcpy (currprefs.cartfile, changed_prefs.cartfile);
     src += strlen(src) + 1;
-    crc32 = restore_u32 ();
     action_replay_load ();
     if (armemory_ram) {
        memcpy (armemory_ram, src, arram_size);
        memcpy (ar_custom, armemory_ram + 0xf000, 2 * 256);
        src += arram_size;
     }
+    crc32 = restore_u32 ();
     src += 256;
     return src;
 }
index 63afbc98e6f6cb180eb86e70dd71aa4d7072d74d..796a4a85ae36bcec048e65aff045a69b28d8ba3b 100755 (executable)
--- a/cfgfile.c
+++ b/cfgfile.c
@@ -238,15 +238,21 @@ static void save_options (struct zfile *f, struct uae_prefs *p, int type)
     str = cfgfile_subst_path (p->path_rom, UNEXPANDED, p->romfile);
     cfgfile_write (f, "kickstart_rom_file=%s\n", str);
     free (str);
+    if (p->romident[0])
+       cfgfile_write (f, "kickstart_rom=%s\n", p->romident);
     str = cfgfile_subst_path (p->path_rom, UNEXPANDED, p->romextfile);
     cfgfile_write (f, "kickstart_ext_rom_file=%s\n", str);
     free (str);
+    if (p->romextident[0])
+       cfgfile_write (f, "kickstart_ext_rom=%s\n", p->romextident);
     str = cfgfile_subst_path (p->path_rom, UNEXPANDED, p->flashfile);
     cfgfile_write (f, "flash_file=%s\n", str);
     free (str);
     str = cfgfile_subst_path (p->path_rom, UNEXPANDED, p->cartfile);
     cfgfile_write (f, "cart_file=%s\n", str);
     free (str);
+    if (p->cartident[0])
+       cfgfile_write (f, "cart=%s\n", p->cartident);
     cfgfile_write (f, "kickshifter=%s\n", p->kickshifter ? "true" : "false");
 
     p->nr_floppies = 4;
@@ -872,6 +878,73 @@ static int cfgfile_parse_host (struct uae_prefs *p, char *option, char *value)
     return 0;
 }
 
+static void decode_rom_ident (char *romfile, int maxlen, char *ident)
+{
+    char *p;
+    int ver, rev, subver, subrev, round, i;
+    char model[64], *modelp;
+    struct romlist **rl;
+    char *romtxt;
+
+    if (!ident[0])
+       return;
+    romtxt = malloc (10000);
+    romtxt[0] = 0;
+    for (round = 0; round < 2; round++) {
+       ver = rev = subver = subrev = -1;
+       modelp = NULL;
+       memset (model, 0, sizeof model);
+       p = ident;
+       while (*p) {
+           char c = *p++;
+           int *pp1 = NULL, *pp2 = NULL;
+           if (toupper(c) == 'V' && isdigit(*p)) {
+               pp1 = &ver;
+               pp2 = &rev;
+           } else if (toupper(c) == 'R' && isdigit(*p)) {
+               pp1 = &subver;
+               pp2 = &subrev;
+           } else if (!isdigit(c) && c != ' ') {
+               strncpy (model, p - 1, (sizeof model) - 1);
+               p += strlen(model);
+               modelp = model;
+           }
+           if (pp1) {
+               *pp1 = atol(p);
+               while (*p != 0 && *p != '.' && *p != ' ')
+               p++;
+               if (*p == '.') {
+               p++;
+               if (pp2)
+                       *pp2 = atol(p);
+               }
+           }
+           if (*p == 0 || *p == ';') {
+               rl = getrombyident(ver, rev, subver, subrev, modelp, round);
+               if (rl) {
+                   for (i = 0; rl[i]; i++) {
+                       if (round) {
+                           char romname[MAX_DPATH];
+                           getromname(rl[i]->rd, romname);
+                           strcat (romtxt, romname);
+                           strcat (romtxt, "\n");
+                       } else {
+                           strncpy (romfile, rl[i]->path, maxlen);
+                           goto end;
+                       }
+                   }
+                   xfree (rl);
+               }
+           }
+       }
+    }
+end:
+    if (round && romtxt[0]) {
+       notify_user_parms (NUMSG_ROMNEED, romtxt, romtxt);
+    }
+    xfree(romtxt);
+}
+
 static int cfgfile_parse_hardware (struct uae_prefs *p, char *option, char *value)
 {
     int tmpval, dummy, i;
@@ -933,14 +1006,23 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, char *option, char *valu
        || cfgfile_string (option, value, "ghostscript_parameters", p->ghostscript_parameters, sizeof p->ghostscript_parameters))
        return 1;
 
+    if (cfgfile_string (option, value, "kickstart_rom", p->romident, sizeof p->romident)) {
+       decode_rom_ident (p->romfile, sizeof p->romfile, p->romident);
+       return 1;
+    }
+    if (cfgfile_string (option, value, "kickstart_ext_rom", p->romextident, sizeof p->romextident)) {
+       decode_rom_ident (p->romextfile, sizeof p->romextfile, p->romextident);
+       return 1;
+    }
+    if (cfgfile_string (option, value, "cart", p->cartident, sizeof p->cartident)) {
+       decode_rom_ident (p->cartfile, sizeof p->cartfile, p->cartident);
+       return 1;
+    }
+
     for (i = 0; i < 4; i++) {
        sprintf (tmpbuf, "floppy%d", i);
-       if (cfgfile_string (option, value, tmpbuf, p->df[i], sizeof p->df[i])) {
-#if 0
-           strcpy (p->dfxlist[i], p->df[i]);
-#endif
+       if (cfgfile_string (option, value, tmpbuf, p->df[i], sizeof p->df[i]))
            return 1;
-       }
     }
 
     if (cfgfile_intval (option, value, "chipmem_size", &dummy, 1)) {
diff --git a/cia.c b/cia.c
index 69586a79aadafd4089aa6372cab9f7aacfc490ec..0a07d8349a4f9078a3adadf6f1c314f4dc3d9d84 100755 (executable)
--- a/cia.c
+++ b/cia.c
@@ -176,7 +176,7 @@ static void CIA_update (void)
            if ((ciaacra & 0x48) == 0x40 && ciaasdr_cnt > 0 && --ciaasdr_cnt == 0)
                asp = 1;
            aovfla = 1;
-           if ((ciaacrb & 0x61) == 0x41) {
+           if ((ciaacrb & 0x61) == 0x41 || (ciaacrb & 0x61) == 0x61) {
                if (ciaatb-- == 0)
                    aovflb = 1;
            }
@@ -196,7 +196,7 @@ static void CIA_update (void)
            if ((ciabcra & 0x48) == 0x40 && ciabsdr_cnt > 0 && --ciabsdr_cnt == 0)
                bsp = 1;
            bovfla = 1;
-           if ((ciabcrb & 0x61) == 0x41) {
+           if ((ciabcrb & 0x61) == 0x41 || (ciabcrb & 0x61) == 0x61) {
                if (ciabtb-- == 0)
                    bovflb = 1;
            }
index b60e9d3523bb4b597a653e56802d597c44b07d7d..6970d4b5c4a331a89e7d722ca59c6463c1d20076 100755 (executable)
--- a/custom.c
+++ b/custom.c
@@ -1037,7 +1037,7 @@ STATIC_INLINE void flush_display (int fm)
     toscr_nbits = 0;
 }
 
-STATIC_INLINE fetch_start(void)
+STATIC_INLINE fetch_start(int hpoa)
 {
     fetch_state = fetch_started;
 }
@@ -1392,7 +1392,7 @@ STATIC_INLINE void update_fetch (int until, int fm)
        if (fetch_state == fetch_was_plane0)
            break;
 
-       fetch_start();
+       fetch_start(pos);
        if (one_fetch_cycle (pos, ddfstop_to_test, dma, fm))
            return;
     }
@@ -1452,7 +1452,7 @@ STATIC_INLINE void update_fetch (int until, int fm)
     for (; pos < until; pos++) {
        if (fetch_state == fetch_was_plane0)
            beginning_of_plane_block (pos, fm);
-       fetch_start();
+       fetch_start(pos);
 
        if (one_fetch_cycle (pos, ddfstop_to_test, dma, fm))
            return;
@@ -1485,7 +1485,7 @@ STATIC_INLINE void decide_fetch (int hpos)
 
 static void start_bpl_dma (int hpos, int hstart)
 {
-    fetch_start();
+    fetch_start(hpos);
     fetch_cycle = 0;
     last_fetch_hpos = hstart;
     out_nbits = 0;
diff --git a/disk.c b/disk.c
index dceb7da50c82af2245a58f51a61fd24542352f6d..42b29eb1b30a077a3ff34d51c7ea8a22385c0200 100755 (executable)
--- a/disk.c
+++ b/disk.c
@@ -1288,7 +1288,7 @@ static void drive_fill_bigbuf (drive * drv, int force)
            *mfm = 256 * *data + *(data + 1);
        }
 #if 0 && defined DISK_DEBUG
-       write_log ("rawtrack %d\n", tr);
+       write_log ("rawtrack %d image offset=%x\n", tr, ti->offs);
 #endif
     }
     drv->buffered_side = side;
index e530df6b6ed3a27c9726d4c933a201603f5c1d29..f303ba0f8c1b3d9b0cfd7fc77a32e6602e250751 100755 (executable)
--- a/filesys.c
+++ b/filesys.c
@@ -438,7 +438,7 @@ static void dup_mountinfo (struct uaedev_mount_info *mip, struct uaedev_mount_in
        if (uip->rootdir)
            uip->rootdir = my_strdup (uip->rootdir);
        if (uip->hf.handle)
-           hdf_dup (&uip->hf, uip->hf.handle);
+           hdf_dup (&uip->hf, &uip->hf);
     }
 }
 
index da85147eef0dadc078c9dae6b81b416f341b8845..efa48b92d51226d2b575d55f1f199dcf693f8318 100755 (executable)
@@ -45,10 +45,11 @@ struct hardfiledata {
 struct uaedev_mount_info;
 extern struct uaedev_mount_info options_mountinfo;
 
+extern void filesys_init (void);
 extern struct hardfiledata *get_hardfile_data (int nr);
 #define FILESYS_MAX_BLOCKSIZE 2048
 extern int hdf_open (struct hardfiledata *hfd, char *name);
-extern int hdf_dup (struct hardfiledata *hfd, void *src);
+extern int hdf_dup (struct hardfiledata *dhfd, struct hardfiledata *shfd);
 extern void hdf_close (struct hardfiledata *hfd);
 extern int hdf_read (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len);
 extern int hdf_write (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len);
index 96e4cfe2594a95a789c0ada01656b3902080f8d4..ed4a5652ab559d67afdf156df980692bd92fb132 100755 (executable)
@@ -45,6 +45,7 @@ extern struct gui_info gui_data;
 extern void gui_update_gfx (void);
 
 void notify_user (int msg);
+void notify_user_parms (int msg, const char *parms, ...);
 int translate_message (int msg, char *out);
 typedef enum {
     NUMSG_NEEDEXT2, NUMSG_NOROM, NUMSG_NOROMKEY,
index e763e03fb112b66b4eb2a37c4d14db1ae62a2d42..5bc07e01f09a31bea44c54ee1c064c9d899f3037 100755 (executable)
@@ -256,7 +256,9 @@ extern void init_shm(void);
 
 struct romdata {
     char *name;
-    int version, revision;
+    int ver, rev;
+    int subver, subrev;
+    char *model;
     uae_u32 crc32;
     uae_u32 size;
     int id;
@@ -265,11 +267,17 @@ struct romdata {
     int type;
 };
 
+struct romlist {
+    char *path;
+    struct romdata *rd;
+};
+
 extern struct romdata *getromdatabycrc (uae_u32 crc32);
 extern struct romdata *getromdatabydata (uae_u8 *rom, int size);
 extern struct romdata *getromdatabyid (int id);
 extern struct romdata *getromdatabyzfile (struct zfile *f);
 extern struct romdata *getarcadiarombyname (char *name);
+extern struct romlist **getrombyident(int ver, int rev, int subver, int subrev, char *model, int all);
 extern void getromname (struct romdata*, char*);
 extern struct romdata *getromdatabyname (char*);
 extern void romlist_add (char *path, struct romdata *rd);
@@ -277,4 +285,5 @@ extern char *romlist_get (struct romdata *rd);
 extern void romlist_clear (void);
 
 extern uae_u8 *load_keyfile (struct uae_prefs *p, char *path, int *size);
+extern uae_u8 *target_load_keyfile (struct uae_prefs *p, char *path, int *size);
 extern void free_keyfile (uae_u8 *key);
index 6cc6c3b6d73aa6b04faad72da1c3be0bcf95889f..49f37d1172662192355ad6b1c4dc18c0ae9e5ed4 100755 (executable)
@@ -160,9 +160,12 @@ struct uae_prefs {
     char df[4][MAX_DPATH];
     char dfxlist[MAX_SPARE_DRIVES][MAX_DPATH];
     char romfile[MAX_DPATH];
+    char romident[256];
     char romextfile[MAX_DPATH];
+    char romextident[256];
     char flashfile[MAX_DPATH];
     char cartfile[MAX_DPATH];
+    char cartident[256];
     char pci_devices[256];
     char prtname[256];
     char sername[256];
index 3c096aa1ae911ed6ca18e65d9f923ce7018b9778..8735ad7e9fa3c4291d46de4edea08c51fdb8e103 100755 (executable)
@@ -28,6 +28,7 @@ extern int zfile_gettype (struct zfile *z);
 extern int zfile_zopen (const char *name, zfile_callback zc, void *user);
 extern char *zfile_getname (struct zfile *f);
 extern uae_u32 zfile_crc32 (struct zfile *f);
+extern struct zfile *zfile_dup (struct zfile *f);
 
 #define ZFILE_UNKNOWN 0
 #define ZFILE_CONFIGURATION 1
index e7d60632cd892bca385f67fe60f3b569e3b9959b..a273e8e787c056afa5b2d89bf94f24ce34154c91 100755 (executable)
--- a/memory.c
+++ b/memory.c
@@ -53,11 +53,6 @@ static long chip_filepos;
 static long bogo_filepos;
 static long rom_filepos;
 
-struct romlist {
-    char *path;
-    struct romdata *rd;
-};
-
 static struct romlist *rl;
 static int romlist_cnt;
 
@@ -93,65 +88,143 @@ void romlist_clear (void)
 }
 
 static struct romdata roms[] = {
-    { "Cloanto Amiga Forever ROM key", 0, 0, 0x869ae1b1, 2069, 0, 0, 1, ROMTYPE_KEY },
-
-    { "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, 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 },
-
-    { "Kickstart v2.04 (A500+)", 37, 175, 0xc3bdb240, 524288, 7, 0, 0, ROMTYPE_KICK },
-    { "Kickstart v2.05 (A600)", 37, 299, 0x83028fb5, 524288, 8, 0, 0, ROMTYPE_KICK },
-    { "Kickstart v2.05 (A600HD)", 37, 300, 0x64466c2a, 524288, 9, 0, 0, ROMTYPE_KICK },
-    { "Kickstart v2.05 (A600HD)", 37, 350, 0x43b0df7b, 524288, 10, 0, 0, ROMTYPE_KICK },
-
-    { "Kickstart v3.0 (A1200)", 39, 106, 0x6c9b07d2, 524288, 11, 0, 0, ROMTYPE_KICK },
-    { "Kickstart v3.0 (A4000)", 39, 106, 0x9e6ac152, 524288, 12, 2, 0, ROMTYPE_KICK },
-    { "Kickstart v3.1 (A4000)", 40, 70, 0x2b4566f1, 524288, 13, 2, 0, ROMTYPE_KICK },
-    { "Kickstart v3.1 (A500,A600,A2000)", 40, 63, 0xfc24ae0d, 524288, 14, 0, 0, ROMTYPE_KICK },
-    { "Kickstart v3.1 (A1200)", 40, 68, 0x1483a091, 524288, 15, 1, 0, ROMTYPE_KICK },
-    { "Kickstart v3.1 (A4000)(Cloanto)", 40, 68, 0x43b6dd22, 524288, 31, 2, 1, ROMTYPE_KICK },
-    { "Kickstart v3.1 (A4000)", 40, 68, 0xd6bae334, 524288, 16, 2, 0, ROMTYPE_KICK },
-    { "Kickstart v3.1 (A4000T)", 40, 70, 0x75932c3a, 524288, 17, 2, 0, ROMTYPE_KICK },
-
-    { "CD32 Kickstart v3.1", 40, 60, 0x1e62d4a5, 524288, 18, 1, 0, ROMTYPE_KICKCD32 },
-    { "CD32 Extended", 40, 60, 0x87746be2, 524288, 19, 1, 0, ROMTYPE_EXTCD32 },
-
-    { "CDTV Extended v1.00", 0, 0, 0x42baa124, 262144, 20, 0, 0, ROMTYPE_EXTCDTV },
-    { "CDTV Extended v2.30", 0, 0, 0x30b54232, 262144, 21, 0, 0, ROMTYPE_EXTCDTV },
-    { "CDTV Extended v2.07", 0, 0, 0xceae68d2, 262144, 22, 0, 0, ROMTYPE_EXTCDTV },
-
-    { "A1000 Bootstrap", 0, 0, 0x62f11c04, 8192, 23, 0, 0, ROMTYPE_KICK },
-    { "A1000 Bootstrap", 0, 0, 0x0b1ad2d0, 65536, 24, 0, 0, ROMTYPE_KICK },
-
-    { "Action Replay Mk I v1.50", 0, 0, 0xd4ce0675, 65536, 25, 0, 0, ROMTYPE_AR },
-    { "Action Replay Mk II v2.05", 0, 0, 0x1287301f , 131072, 26, 0, 0, ROMTYPE_AR },
-    { "Action Replay Mk II v2.12", 0, 0, 0x804d0361 , 131072, 27, 0, 0, ROMTYPE_AR },
-    { "Action Replay Mk II v2.14", 0, 0, 0x49650e4f, 131072, 28, 0, 0, ROMTYPE_AR },
-    { "Action Replay Mk III v3.09", 0, 0, 0x0ed9b5aa, 262144, 29, 0, 0, ROMTYPE_AR },
-    { "Action Replay Mk III v3.17", 0, 0, 0xc8a16406, 262144, 30, 0, 0, ROMTYPE_AR },
-
-    { "SportTime Table Hockey\0ar_airh", 0, 0, 0, 0, 33, 0, 0, ROMTYPE_ARCADIA },
-    { "SportTime Bowling\0ar_bowl", 0, 0, 0, 0, 34, 0, 0, ROMTYPE_ARCADIA },
-    { "World Darts\0ar_dart", 0, 0, 0, 0, 35, 0, 0, ROMTYPE_ARCADIA },
-    { "Magic Johnson's Fast Break\0ar_fast", 0, 0, 0, 0, 36, 0, 0, ROMTYPE_ARCADIA },
-    { "Leader Board Golf\0ar_ldrb", 0, 0, 0, 0, 37, 0, 0, ROMTYPE_ARCADIA },
-    { "Leader Board Golf (alt)\0ar_ldrba", 0, 0, 0, 0, 38, 0, 0, ROMTYPE_ARCADIA },
-    { "Ninja Mission\0ar_ninj", 0, 0, 0, 0, 39, 0, 0, ROMTYPE_ARCADIA },
-    { "Road Wars\0ar_rdwr", 0, 0, 0, 0, 40, 0, 0, ROMTYPE_ARCADIA },
-    { "Sidewinder\0ar_sdwr", 0, 0, 0, 0, 41, 0, 0, ROMTYPE_ARCADIA },
-    { "Cool Spot\0ar_spot", 0, 0, 0, 0, 42, 0, 0, ROMTYPE_ARCADIA },
-    { "Space Ranger\0ar_sprg", 0, 0, 0, 0, 43, 0, 0, ROMTYPE_ARCADIA },
-    { "Xenon\0ar_xeon", 0, 0, 0, 0, 44, 0, 0, ROMTYPE_ARCADIA },
-    { "World Trophy Soccer\0ar_socc", 0, 0, 0, 0, 45, 0, 0, ROMTYPE_ARCADIA },
-
-    { NULL, 0, 0, 0, 0, 0, 0, 0, 0 }
+    { "Cloanto Amiga Forever ROM key", 0, 0, 0, 0, 0, 0x869ae1b1, 2069, 0, 0, 1, ROMTYPE_KEY },
+
+    { "Kickstart v1.0 (A1000)(NTSC)", 1, 0, 1, 0, "A1000\0", 0x299790ff, 262144, 1, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v1.1 (A1000)(NTSC)", 1, 1, 31, 34, "A1000\0", 0xd060572a, 262144, 2, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v1.1 (A1000)(PAL)", 1, 1, 31, 34, "A1000\0", 0xec86dae2, 262144, 3, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v1.2 (A1000)", 1, 2, 33, 166, "A1000\0", 0x9ed783d0, 262144, 4, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v1.2 (A500,A1000,A2000)", 1, 2, 33, 180, "A500\0A1000\0A2000\0", 0xa6ce1636, 262144, 5, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v1.3 (A500,A1000,A2000)", 1, 3, 34, 5, "A500\0A1000\0A2000\0", 0xc4f0f55f, 262144, 6, 60, 0, ROMTYPE_KICK },
+    { "Kickstart v1.3 (A3000)", 1, 3, 34, 5, "A3000\0", 0xe0f37258, 262144, 32, 0, 0, ROMTYPE_KICK },
+
+    { "Kickstart v2.04 (A500+)", 2, 4, 37, 175, "A500+\0", 0xc3bdb240, 524288, 7, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v2.05 (A600)", 2, 5, 37, 299, "A600\0", 0x83028fb5, 524288, 8, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v2.05 (A600HD)", 2, 5, 37, 300, "A600HD\0A600\0", 0x64466c2a, 524288, 9, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v2.05 (A600HD)", 2, 5, 37, 350, "A600HD\0A600\0", 0x43b0df7b, 524288, 10, 0, 0, ROMTYPE_KICK },
+
+    { "Kickstart v3.0 (A1200)", 3, 0, 39, 106, "A1200\0", 0x6c9b07d2, 524288, 11, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v3.0 (A4000)", 3, 0, 39, 106, "A4000\0", 0x9e6ac152, 524288, 12, 2, 0, ROMTYPE_KICK },
+    { "Kickstart v3.1 (A4000)", 3, 1, 40, 70, "A4000\0", 0x2b4566f1, 524288, 13, 2, 0, ROMTYPE_KICK },
+    { "Kickstart v3.1 (A500,A600,A2000)", 3, 1, 40, 63, "A500\0A600\0A2000\0", 0xfc24ae0d, 524288, 14, 0, 0, ROMTYPE_KICK },
+    { "Kickstart v3.1 (A1200)", 3, 1, 40, 68, "A1200\0", 0x1483a091, 524288, 15, 1, 0, ROMTYPE_KICK },
+    { "Kickstart v3.1 (A4000)(Cloanto)", 3, 1, 40, 68, "A4000\0", 0x43b6dd22, 524288, 31, 2, 1, ROMTYPE_KICK },
+    { "Kickstart v3.1 (A4000)", 3, 1, 40, 68, "A4000\0", 0xd6bae334, 524288, 16, 2, 0, ROMTYPE_KICK },
+    { "Kickstart v3.1 (A4000T)", 3, 1, 40, 70, "A4000T\0", 0x75932c3a, 524288, 17, 2, 0, ROMTYPE_KICK },
+
+    { "CD32 Kickstart v3.1", 3, 1, 40, 60, "CD32\0", 0x1e62d4a5, 524288, 18, 1, 0, ROMTYPE_KICKCD32 },
+    { "CD32 Extended", 3, 1, 40, 60, "CD32\0", 0x87746be2, 524288, 19, 1, 0, ROMTYPE_EXTCD32 },
+
+    { "CDTV Extended v1.00", 1, 0, 1, 0, "CDTV\0", 0x42baa124, 262144, 20, 0, 0, ROMTYPE_EXTCDTV },
+    { "CDTV Extended v2.30", 2, 30, 2, 30, "CDTV\0", 0x30b54232, 262144, 21, 0, 0, ROMTYPE_EXTCDTV },
+    { "CDTV Extended v2.07", 2, 7, 2, 7, "CDTV\0", 0xceae68d2, 262144, 22, 0, 0, ROMTYPE_EXTCDTV },
+
+    { "A1000 Bootstrap", 0, 0, 0, 0, "A1000\0", 0x62f11c04, 8192, 23, 0, 0, ROMTYPE_KICK },
+    { "A1000 Bootstrap", 0, 0, 0, 0, "A1000\0", 0x0b1ad2d0, 65536, 24, 0, 0, ROMTYPE_KICK },
+
+    { "Action Replay Mk I v1.50", 1, 50, 1, 50, "AR\0", 0xd4ce0675, 65536, 25, 0, 0, ROMTYPE_AR },
+    { "Action Replay Mk II v2.05", 2, 5, 2, 5, "AR\0", 0x1287301f , 131072, 26, 0, 0, ROMTYPE_AR },
+    { "Action Replay Mk II v2.12", 2, 12, 2, 12, "AR\0", 0x804d0361 , 131072, 27, 0, 0, ROMTYPE_AR },
+    { "Action Replay Mk II v2.14", 2, 14, 2, 14, "AR\0", 0x49650e4f, 131072, 28, 0, 0, ROMTYPE_AR },
+    { "Action Replay Mk III v3.09", 3, 9, 3, 9, "AR\0", 0x0ed9b5aa, 262144, 29, 0, 0, ROMTYPE_AR },
+    { "Action Replay Mk III v3.17", 3, 17, 3, 17, "AR\0", 0xc8a16406, 262144, 30, 0, 0, ROMTYPE_AR },
+
+    { "Arcadia SportTime Table Hockey\0ar_airh", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 33, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia SportTime Bowling\0ar_bowl", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 34, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia World Darts\0ar_dart", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 35, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Magic Johnson's Fast Break\0ar_fast", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 36, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Leader Board Golf\0ar_ldrb", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 37, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Leader Board Golf (alt)\0ar_ldrba", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 38, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Ninja Mission\0ar_ninj", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 39, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Road Wars\0ar_rdwr", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 40, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Sidewinder\0ar_sdwr", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 41, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Cool Spot\0ar_spot", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 42, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Space Ranger\0ar_sprg", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 43, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia Xenon\0ar_xeon", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 44, 0, 0, ROMTYPE_ARCADIA },
+    { "Arcadia World Trophy Soccer\0ar_socc", 0, 0, 0, 0, "ARCADIA\0", 0, 0, 45, 0, 0, ROMTYPE_ARCADIA },
+
+    { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
 
 };
 
+struct romlist **getrombyident(int ver, int rev, int subver, int subrev, char *model, int all)
+{
+    int i, j, ok, out, max;
+    struct romdata *rd;
+    struct romlist **rdout, *rltmp;
+    void *buf;
+    static struct romlist rlstatic;
+    
+    for (i = 0; roms[i].name; i++);
+    if (all)
+       max = i;
+    else
+       max = romlist_cnt;
+    buf = xmalloc((sizeof (struct romlist*) + sizeof (struct romlist)) * (i + 1));
+    rdout = buf;
+    rltmp = (struct romlist*)((uae_u8*)buf + (i + 1) * sizeof (struct romlist*));
+    out = 0;
+    for (i = 0; i < max; i++) {
+        ok = 0;
+       if (!all)
+           rd = rl[i].rd;
+       else
+           rd = &roms[i];
+       if (model && !strcmpi(model, rd->name))
+           ok = 2;
+       if (rd->ver == ver && (rev < 0 || rd->rev == rev)) {
+           if (subver >= 0) {
+               if (rd->subver == subver && (subrev < 0 || rd->subrev == subrev) && rd->subver > 0)
+                   ok = 1;
+           } else {
+               ok = 1;
+           }
+       }
+       if (!ok)
+           continue;
+       if (model && ok < 2) {
+           char *p = rd->model;
+           ok = 0;
+           while (*p) {
+               if (!strcmp(rd->model, model)) {
+                   ok = 1;
+                   break;
+               }
+               p = p + strlen(p) + 1;
+           }
+       }
+       if (!model && rd->type != ROMTYPE_KICK)
+           ok = 0;
+       if (ok) {
+           if (all) {
+               rdout[out++] = rltmp;
+               rltmp->path = NULL;
+               rltmp->rd = rd;
+               rltmp++;
+           } else {
+               rdout[out++] = &rl[i];
+           }
+       }
+    }
+    if (out == 0) {
+       xfree (rdout);
+       return NULL;
+    }
+    for (i = 0; i < out; i++) {
+       int v1 = rdout[i]->rd->subver * 1000 + rdout[i]->rd->subrev;
+       for (j = i + 1; j < out; j++) {
+           int v2 = rdout[j]->rd->subver * 1000 + rdout[j]->rd->subrev;
+           if (v1 < v2) {
+               struct romlist *rltmp = rdout[j];
+               rdout[j] = rdout[i];
+               rdout[i] = rltmp;
+           }
+       }
+    }
+    rdout[out] = NULL;
+    return rdout;
+}
+
 struct romdata *getarcadiarombyname (char *name)
 {
     int i;
@@ -183,9 +256,14 @@ uae_u8 *load_keyfile (struct uae_prefs *p, char *path, int *size)
 {
     struct zfile *f;
     uae_u8 *keybuf = 0;
-    int keysize = 0;
+    int keysize;
     char tmp[MAX_PATH], *d;
 
+    keybuf = target_load_keyfile(p, path, size);
+    if (keybuf)
+       return keybuf;
+    
+    keybuf = NULL;
     tmp[0] = 0;
     if (path)
        strcpy (tmp, path);
@@ -361,11 +439,9 @@ struct romdata *getromdatabyzfile (struct zfile *f)
 void getromname        (struct romdata *rd, char *name)
 {
     name[0] = 0;
-    if (rd->type == ROMTYPE_ARCADIA)
-       strcat (name, "Arcadia ");
     strcat (name, rd->name);
-    if (rd->revision)
-       sprintf (name + strlen (name), " rev %d.%d", rd->version, rd->revision);
+    if (rd->subrev && rd->subrev != rd->rev)
+       sprintf (name + strlen (name), " rev %d.%d", rd->subver, rd->subrev);
     if (rd->size > 0)
        sprintf (name + strlen (name), " (%dk)", (rd->size + 1023) / 1024);
 }
index bc5f6c1bafdb82aa793bf55a36805c6033d27359..62d2f371bf8c0a82b355f40dc3062dc769168d47 100755 (executable)
--- a/newcpu.c
+++ b/newcpu.c
@@ -395,10 +395,16 @@ uae_s32 ShowEA (void *f, uae_u16 opcode, int reg, amodes mode, wordsizes size, c
        sprintf (buffer,"-(A%d)", reg);
        break;
      case Ad16:
-       disp16 = get_iword_1 (m68kpc_offset); m68kpc_offset += 2;
-       addr = m68k_areg(regs,reg) + (uae_s16)disp16;
-       sprintf (buffer,"(A%d,$%04x) == $%08lx", reg, disp16 & 0xffff,
-                                       (unsigned long)addr);
+       {
+           char offtxt[80];
+           disp16 = get_iword_1 (m68kpc_offset); m68kpc_offset += 2;
+           if (disp16 < 0)
+               sprintf (offtxt, "-$%04x", -disp16);
+           else
+               sprintf (offtxt, "$%04x", disp16);
+           addr = m68k_areg(regs,reg) + disp16;
+           sprintf (buffer,"(A%d,%s) == $%08lx", reg, offtxt, (unsigned long)addr);
+       }
        break;
      case Ad8r:
        dp = get_iword_1 (m68kpc_offset); m68kpc_offset += 2;
index b5d85dc1025bb5f65c977151ab022a1a719facfa..d4149a862b395671fcec7d3caa6f61793666f298 100755 (executable)
@@ -764,12 +764,17 @@ static BOOL CALLBACK di_enumcallback (LPCDIDEVICEINSTANCE lpddi, LPVOID *dd)
        did->axismappings[i] = -1;
        did->buttonmappings[i] = -1;
     }
-    len = strlen (lpddi->tszInstanceName) + 3 + 1;
-    did->connection = DIDC_DX;
-    did->name = malloc (len);
-    strcpy (did->name, lpddi->tszInstanceName);
+    if (lpddi->tszInstanceName) {
+       len = strlen (lpddi->tszInstanceName) + 5 + 1;
+       did->name = malloc (len);
+       strcpy (did->name, lpddi->tszInstanceName);
+    } else {
+       did->name = malloc (100);
+       sprintf(did->name, "[no name]");
+    }
     did->guid = lpddi->guidInstance;
     did->sortname = my_strdup (did->name);
+    did->connection = DIDC_DX;
 
     if (!memcmp (&did->guid, &GUID_SysKeyboard, sizeof (GUID)) || !memcmp (&did->guid, &GUID_SysMouse, sizeof (GUID))) {
        did->priority = 2;
@@ -793,15 +798,19 @@ static int di_do_init (void)
 
     hr = DirectInput8Create (hInst, DIRECTINPUT_VERSION, &IID_IDirectInput8A, (LPVOID *)&g_lpdi, NULL); 
     if (FAILED(hr)) {
-       gui_message ("Failed to initialize DirectInput!");
        write_log ("DirectInput8Create failed, %s\n", DXError (hr));
+       gui_message ("Failed to initialize DirectInput!");
        return 0;
     }
-
+    write_log("DirectInput enumeration..\n");
     IDirectInput8_EnumDevices (g_lpdi, DI8DEVCLASS_ALL, di_enumcallback, 0, DIEDFL_ATTACHEDONLY);
+    write_log("RawInput enumeration..\n");
     initialize_rawinput();
+    write_log("Windowsmouse initialization..\n");
     initialize_windowsmouse();
+    write_log("Catweasel joymouse initialization..\n");
     initialize_catweasel();
+    write_log("end\n");
 
     sortdd (di_joystick, num_joystick, DID_JOYSTICK);
     sortdd (di_mouse, num_mouse, DID_MOUSE);
index 7cbd905db52c2543854e36264d5af2ab3ba27f01..ea78d60f0d2404e2c2c13a0f80f3ad972126f0cc 100755 (executable)
@@ -12,6 +12,7 @@
 #include "filesys.h"
 #include "blkdev.h"
 #include "win32gui.h"
+#include "zfile.h"
 
 #define hfd_log write_log
 
@@ -39,6 +40,9 @@ struct uae_driveinfo {
     int bytespersector;
 };
 
+#define HDF_HANDLE_WIN32 1
+#define HDF_HANDLE_ZFILE 2
+
 #define CACHE_SIZE 16384
 #define CACHE_FLUSH_TIME 5
 
@@ -138,6 +142,8 @@ int isharddrive (char *name)
     return -1;
 }
 
+static char *hdz[] = { "hdz", "zip", "rar", "7z", NULL };
+
 int hdf_open (struct hardfiledata *hfd, char *name)
 {
     HANDLE h = INVALID_HANDLE_VALUE;
@@ -181,8 +187,18 @@ int hdf_open (struct hardfiledata *hfd, char *name)
                    return 0;
                }
            }
+           hfd->handle_valid = HDF_HANDLE_WIN32;
        }
     } else {
+       int zmode = 0;
+        char *ext = strrchr (name, '.');
+       if (ext != NULL) {
+           ext++;
+           for (i = 0; hdz[i]; i++) {
+               if (!stricmp (ext, hdz[i]))
+                   zmode = 1;
+           }
+       }
        h = CreateFile (name, GENERIC_READ | (hfd->readonly ? 0 : GENERIC_WRITE), hfd->readonly ? FILE_SHARE_READ : 0, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
         hfd->handle = h;
@@ -191,7 +207,7 @@ int hdf_open (struct hardfiledata *hfd, char *name)
            if ((i > 0 && (name[i - 1] == '/' || name[i - 1] == '\\')) || i == 0) {
                strcpy (hfd->vendor_id, "UAE");
                strncpy (hfd->product_id, name + i, 15);
-               strcpy (hfd->product_rev, "0.2");
+               strcpy (hfd->product_rev, "0.3");
                break;
            }
            i--;
@@ -211,14 +227,27 @@ int hdf_open (struct hardfiledata *hfd, char *name)
            }
            low &= ~(hfd->blocksize - 1);
            hfd->size = hfd->size2 = ((uae_u64)high << 32) | low;
+           hfd->handle_valid = HDF_HANDLE_WIN32;
+           if (hfd->size < 64 * 1024 * 1024 && zmode) {
+               write_log ("HDF '%s' re-opened in zfile-mode\n", name);
+               CloseHandle (h);
+               hfd->handle = h = zfile_fopen(name, hfd->readonly ? "rb" : "r+b");
+               if (!h) {
+                   hdf_close (hfd);
+                   return 0;
+               }
+               zfile_fseek (h, 0, SEEK_END);
+               hfd->size = hfd->size2 = zfile_ftell (h);
+               zfile_fseek (h, 0, SEEK_SET);
+               hfd->handle_valid = HDF_HANDLE_ZFILE;
+           }
        } else {
            write_log ("HDF '%s' failed to open. error = %d\n", name, GetLastError ());
        }
     }
     hfd->handle = h;
     if (hfd->handle != INVALID_HANDLE_VALUE) {
-       hfd->handle_valid = 1;
-       hfd_log ("HDF '%s' opened succesfully, handle=%p\n", name, hfd->handle);
+       hfd_log ("HDF '%s' opened succesfully, handle=%p, mode=%d\n", name, hfd->handle, hfd->handle_valid);
        return 1;
     }
     hdf_close (hfd);
@@ -231,8 +260,12 @@ void hdf_close (struct hardfiledata *hfd)
        return;
     hfd_log ("close handle=%p\n", hfd->handle);
     hfd->flags = 0;
-    if (hfd->handle && hfd->handle != INVALID_HANDLE_VALUE)
-       CloseHandle (hfd->handle);
+    if (hfd->handle && hfd->handle != INVALID_HANDLE_VALUE) {
+       if (hfd->handle_valid == HDF_HANDLE_WIN32)
+           CloseHandle (hfd->handle);
+       else if(hfd->handle_valid == HDF_HANDLE_ZFILE)
+           zfile_fclose (hfd->handle);
+    }
     hfd->handle = 0;
     hfd->handle_valid = 0;
     if (hfd->cache)
@@ -241,22 +274,30 @@ void hdf_close (struct hardfiledata *hfd)
     hfd->cache_valid = 0;
 }
 
-int hdf_dup (struct hardfiledata *hfd, void *src)
+int hdf_dup (struct hardfiledata *dhfd, struct hardfiledata *shfd)
 {
-    HANDLE duphandle;
-    if (src == 0 || src == INVALID_HANDLE_VALUE)
+    if (!shfd->handle_valid)
        return 0;
-    if (!DuplicateHandle (GetCurrentProcess(), src, GetCurrentProcess() , &duphandle, 0, FALSE, DUPLICATE_SAME_ACCESS))
-       return 0;
-    hfd->handle = duphandle;
-    hfd->cache = VirtualAlloc (NULL, CACHE_SIZE, MEM_COMMIT, PAGE_READWRITE);
-    hfd->cache_valid = 0;
-    hfd->handle_valid = 1;
-    if (!hfd->cache) {
-       hdf_close (hfd);
+    if (shfd->handle_valid == HDF_HANDLE_WIN32) {
+        HANDLE duphandle;
+       if (!DuplicateHandle (GetCurrentProcess(), shfd->handle, GetCurrentProcess() , &duphandle, 0, FALSE, DUPLICATE_SAME_ACCESS))
+           return 0;
+       dhfd->handle = duphandle;
+       dhfd->handle_valid = HDF_HANDLE_WIN32;
+    } else if (shfd->handle_valid == HDF_HANDLE_ZFILE) {
+       struct zfile *zf;
+       zf = zfile_dup (shfd->handle);
+       if (!zf)
+           return 0;
+       dhfd->handle = zf;
+       dhfd->handle_valid = HDF_HANDLE_ZFILE;
+    }
+    dhfd->cache = VirtualAlloc (NULL, CACHE_SIZE, MEM_COMMIT, PAGE_READWRITE);
+    dhfd->cache_valid = 0;
+    if (!dhfd->cache) {
+       hdf_close (dhfd);
        return 0;
     }
-    hfd_log ("dup handle %p->%p\n", src, duphandle);
     return 1;
 }
 
@@ -281,10 +322,14 @@ static int hdf_seek (struct hardfiledata *hfd, uae_u64 offset)
        gui_message ("hd: poscheck failed, offset not aligned to blocksize! (%I64X & %04.4X = %04.4X)\n", offset, hfd->blocksize, offset & (hfd->blocksize - 1));
        abort ();
     }
-    high = (DWORD)(offset >> 32);
-    ret = SetFilePointer (hfd->handle, (DWORD)offset, &high, FILE_BEGIN);
-    if (ret == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
-       return -1;
+    if (hfd->handle_valid == HDF_HANDLE_WIN32) {
+        high = (DWORD)(offset >> 32);
+       ret = SetFilePointer (hfd->handle, (DWORD)offset, &high, FILE_BEGIN);
+       if (ret == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
+           return -1;
+    } else if (hfd->handle_valid == HDF_HANDLE_ZFILE) {
+       zfile_fseek (hfd->handle, (long)offset, SEEK_SET);
+    }
     return 0;
 }
 
@@ -297,18 +342,22 @@ static void poscheck (struct hardfiledata *hfd, int len)
        gui_message ("hd: memory corruption detected in poscheck");
        abort ();
     }
-    high = 0;
-    ret = SetFilePointer (hfd->handle, 0, &high, FILE_CURRENT);
-    err = GetLastError ();
-    if (ret == INVALID_FILE_SIZE && err != NO_ERROR) {
-       gui_message ("hd: poscheck failed. seek failure, error %d", err);
-       abort ();
+    if (hfd->handle_valid == HDF_HANDLE_WIN32) {
+       high = 0;
+       ret = SetFilePointer (hfd->handle, 0, &high, FILE_CURRENT);
+       err = GetLastError ();
+       if (ret == INVALID_FILE_SIZE && err != NO_ERROR) {
+           gui_message ("hd: poscheck failed. seek failure, error %d", err);
+           abort ();
+       }
+        pos = ((uae_u64)high) << 32 | ret;
+    } else if (hfd->handle_valid == HDF_HANDLE_ZFILE) {
+       pos = zfile_ftell (hfd->handle);
     }
     if (len < 0) {
        gui_message ("hd: poscheck failed, negative length! (%d)", len);
        abort ();
     }
-    pos = ((uae_u64)high) << 32 | ret;
     if (pos < hfd->offset) {
        gui_message ("hd: poscheck failed, offset out of bounds! (%I64d < %I64d)", pos, hfd->offset);
        abort ();
@@ -378,7 +427,10 @@ int hdf_read (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len)
        hfd->cache_offset = hfd->offset + hfd->size - CACHE_SIZE;
     hdf_seek (hfd, hfd->cache_offset);
     poscheck (hfd, CACHE_SIZE);
-    ReadFile (hfd->handle, hfd->cache, CACHE_SIZE, &outlen, NULL);
+    if (hfd->handle_valid == HDF_HANDLE_WIN32)
+       ReadFile (hfd->handle, hfd->cache, CACHE_SIZE, &outlen, NULL);
+    else if (hfd->handle_valid == HDF_HANDLE_ZFILE)
+       outlen = zfile_fread (hfd->cache, 1, CACHE_SIZE, hfd->handle);
     hfd->cache_valid = 0;
     if (outlen != CACHE_SIZE)
        return 0;
@@ -396,11 +448,16 @@ int hdf_read (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len)
 int hdf_write (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len)
 {
     DWORD outlen = 0;
+    if (hfd->readonly)
+       return 0;
     hfd->cache_valid = 0;
     hdf_seek (hfd, offset);
     poscheck (hfd, len);
     memcpy (hfd->cache, buffer, len);
-    WriteFile (hfd->handle, hfd->cache, len, &outlen, NULL);
+    if (hfd->handle_valid == HDF_HANDLE_WIN32)
+       WriteFile (hfd->handle, hfd->cache, len, &outlen, NULL);
+    else if (hfd->handle_valid == HDF_HANDLE_ZFILE)
+       outlen = zfile_fwrite (hfd->cache, 1, len, hfd->handle);
     return outlen;
 }
 
index cb04a417aac2c366f3ce2ee2abfa4026d6b5870a..94f7f0ac9d0ffab6c5f848b8358e3e02c40f3f08 100755 (executable)
@@ -1119,7 +1119,7 @@ BEGIN
     IDS_NUMSG_MODRIP_FINISHED "Scan finished."
     IDS_NUMSG_MODRIP_SAVE   "Module/packed data found\n%s\nDo you want to save it?"
     IDS_NUMSG_KS68020       "Your Kickstart requires a 68020 CPU or later CPU."
-    IDS_NUMSG_ROMNEED       "You need any following ROM(s)\n\n%s"
+    IDS_NUMSG_ROMNEED       "You need any following ROM(s):\n\n%s\n\nCheck ROM-path in Paths-panel and click ""Rescan ROMs""-button."
     IDS_NUMSG_STATEHD       "WARNING: State saves do not support harddrive emulation. This message does not appear again."
     IDS_NUMSG_NOCAPS        "This disk image needs the S.P.S. plugin\nwhich is available from\nhttp//www.softpres.org/"
     IDS_NUMSG_OLDCAPS       "You need updated S.P.S. plugin\nwhich is available from\nhttp//www.softpres.org/"
index 8a57a8c2a71c68439843db8f53de99ae7193019d..406abb5319b3bd818ea77beba5ce8b96f1b4bba6 100755 (executable)
@@ -1655,6 +1655,34 @@ void logging_cleanup( void )
     debugfile = 0;
 }
 
+typedef DWORD (STDAPICALLTYPE *PFN_GetKey)(LPVOID lpvBuffer, DWORD dwSize);
+uae_u8 *target_load_keyfile (struct uae_prefs *p, char *path, int *sizep)
+{
+    uae_u8 *keybuf = NULL;
+    HMODULE h;
+    PFN_GetKey pfnGetKey;
+    int size;
+
+    h = WIN32_LoadLibrary ("amigaforever.dll");
+    if (!h)
+       return NULL;
+    pfnGetKey = (PFN_GetKey)GetProcAddress(h, "GetKey");
+    if (pfnGetKey) {
+       size = pfnGetKey(NULL, 0);
+       *sizep = size;
+       if (size > 0) {
+           keybuf = xmalloc (size);
+           if (pfnGetKey(keybuf, size) != size) {
+               xfree (keybuf);
+               keybuf = NULL;
+           }
+       }
+    }
+    FreeLibrary (h);
+    return keybuf;
+}
+
+
 extern char *get_nero_aspi_path(void);
 
 void target_default_options (struct uae_prefs *p, int type)
index ffd260fbefbf38623f03b650f6667cf6cacc2095..cc97baa42a8f7cf2a83222e1ad7290d4a9d59a6d 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 8"
+#define WINUAEBETASTR " Beta 9"
 
 extern char start_path_exe[MAX_DPATH];
 extern char start_path_data[MAX_DPATH];
index 9904126fe14ed0ae5fe9279e89cb1be802003d0e..878fb055d4bb11c4eebcd447744a6360f19a9e93 100755 (executable)
@@ -74,6 +74,7 @@
 #define ROM_FORMAT_STRING "(*.rom;*.zip;*.rar;*.7z;*.roz)\0*.rom;*.zip;*.rar;*.7z;*.roz\0"
 #define USS_FORMAT_STRING_RESTORE "(*.uss;*.gz;*.zip)\0*.uss;*.gz;*.zip\0"
 #define USS_FORMAT_STRING_SAVE "(*.uss)\0*.uss\0"
+#define HDF_FORMAT_STRING "(*.hdf;*.rdf;*.hdz;*.rdz)\0*.hdf;*.rdf;*.hdz;*.rdz\0"
 #define CONFIG_HOST "Host"
 #define CONFIG_HARDWARE "Hardware"
 
@@ -876,7 +877,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs
        WIN32GUI_LoadUIString( IDS_SELECTADF, szTitle, MAX_DPATH );
        WIN32GUI_LoadUIString( IDS_ADF, szFormat, MAX_DPATH );
        sprintf( szFilter, "%s ", szFormat );
-       memcpy( szFilter + strlen( szFilter ), DISK_FORMAT_STRING, sizeof( DISK_FORMAT_STRING ) + 1 );
+       memcpy( szFilter + strlen( szFilter ), DISK_FORMAT_STRING, sizeof(DISK_FORMAT_STRING) + 1);
 
        openFileName.lpstrTitle = szTitle;
        openFileName.lpstrDefExt = "ADF";
@@ -897,7 +898,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs
        WIN32GUI_LoadUIString( IDS_SELECTHDF, szTitle, MAX_DPATH );
        WIN32GUI_LoadUIString( IDS_HDF, szFormat, MAX_DPATH );
        sprintf( szFilter, "%s ", szFormat );
-       memcpy( szFilter + strlen( szFilter ), "(*.hdf;*.rdf)\0*.hdf;*.rdf\0", 26 );
+       memcpy( szFilter + strlen( szFilter ),  HDF_FORMAT_STRING, sizeof (HDF_FORMAT_STRING) + 1);
 
        openFileName.lpstrTitle = szTitle;
        openFileName.lpstrDefExt = "HDF";
@@ -5542,7 +5543,7 @@ static void new_filesys (HWND hDlg)
     result = add_filesys_unit (currprefs.mountinfo, current_fsvdlg.device, current_fsvdlg.volume,
                    current_fsvdlg.rootdir, ! current_fsvdlg.rw, 0, 0, 0, 0, current_fsvdlg.bootpri, 0, 0);
     if (result)
-       MessageBox (hDlg, result, "Bad directory",
+       MessageBox (hDlg, result, result,
                    MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
 }
 
@@ -5556,7 +5557,7 @@ static void new_hardfile (HWND hDlg)
                                current_hfdlg.reserved, current_hfdlg.blocksize,
                                current_hfdlg.bootpri, current_hfdlg.fsfilename, 0);
     if (result)
-       MessageBox (hDlg, result, "Bad hardfile",
+       MessageBox (hDlg, result, result,
                    MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
 }
 
@@ -5568,7 +5569,7 @@ static void new_harddrive (HWND hDlg)
                                current_hfdlg.filename, ! current_hfdlg.rw, 0, 0,
                                0, current_hfdlg.blocksize, 0, 0, 0);
     if (result)
-       MessageBox (hDlg, result, "Bad harddrive",
+       MessageBox (hDlg, result, result,
                    MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
 }
 
@@ -5633,7 +5634,7 @@ static void harddisk_edit (HWND hDlg)
                                        ! current_hfdlg.rw, current_hfdlg.sectors, current_hfdlg.surfaces,
                                        current_hfdlg.reserved, current_hfdlg.blocksize, current_hfdlg.bootpri, current_hfdlg.fsfilename, 0);
            if (result)
-               MessageBox (hDlg, result, "Bad hardfile",
+               MessageBox (hDlg, result, result,
                MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
        }
     }
@@ -5649,7 +5650,7 @@ static void harddisk_edit (HWND hDlg)
                                        ! current_hfdlg.rw, 0, 0,
                                        0, current_hfdlg.blocksize, current_hfdlg.bootpri, 0, 0);
            if (result)
-               MessageBox (hDlg, result, "Bad harddrive",
+               MessageBox (hDlg, result, result,
                MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
        }
     }
@@ -5671,7 +5672,7 @@ static void harddisk_edit (HWND hDlg)
            result = set_filesys_unit (currprefs.mountinfo, entry, current_fsvdlg.device, current_fsvdlg.volume,
                                        current_fsvdlg.rootdir, ! current_fsvdlg.rw, 0, 0, 0, 0, current_fsvdlg.bootpri, 0, 0);
            if (result)
-               MessageBox (hDlg, result, "Bad hardfile",
+               MessageBox (hDlg, result, result,
                MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
        }
     }
@@ -8449,7 +8450,8 @@ int dragdrop (HWND hDlg, HDROP hd, struct uae_prefs *prefs, int   currentpage)
     POINT pt;
     RECT r;
     int ret = 0;
-
+    DWORD flags;
+    
     DragQueryPoint (hd, &pt);
     pt.y += GetSystemMetrics (SM_CYMENU) + GetSystemMetrics (SM_CYBORDER);
     cnt = DragQueryFile (hd, 0xffffffff, NULL, 0);
@@ -8473,6 +8475,7 @@ int dragdrop (HWND hDlg, HDROP hd, struct uae_prefs *prefs, int   currentpage)
     for (i = 0; i < cnt; i++) {
        struct zfile *z;
        DragQueryFile (hd, i, file, sizeof (file));
+        flags = GetFileAttributes(file);
        z = zfile_fopen (file, "rb");
        if (z) {
            int type = zfile_gettype (z);
@@ -8522,6 +8525,20 @@ int dragdrop (HWND hDlg, HDROP hd, struct uae_prefs *prefs, int  currentpage)
                        strcpy (prefs->romfile, file);
                    }
                break;
+               case ZFILE_HDF:
+               {
+                   char *result;
+                   if (currentpage == HARDDISK_ID) {
+                       if (flags & FILE_ATTRIBUTE_DIRECTORY) {
+                           result = add_filesys_unit (currprefs.mountinfo, NULL, "XXX", file, 0,
+                               0, 0, 0, 0, 0, NULL, 0);
+                       } else {
+                           result = add_filesys_unit (currprefs.mountinfo, NULL, NULL, file, 0,
+                               32, 1, 2, 512, 0, NULL, 0);
+                       }
+                   }
+               }
+               break;
                case ZFILE_NVR:
                    strcpy (prefs->flashfile, file);
                break;
@@ -9100,6 +9117,24 @@ void notify_user (int msg)
     gui_message (tmp);
 }
 
+void notify_user_parms (int msg, const char *parms, ...)
+{
+    char msgtxt[MAX_DPATH];
+    char tmp[MAX_DPATH];
+    int c = 0;
+    va_list parms2;
+
+    c = gettranslation (msg);
+    if (c < 0)
+       return;
+    WIN32GUI_LoadUIString (c, tmp, MAX_DPATH);
+    va_start (parms2, parms);
+    vsprintf (msgtxt, tmp, parms2);
+    gui_message (msgtxt);
+    va_end (parms);
+}
+
+
 int translate_message (int msg,        char *out)
 {
     msg = gettranslation (msg);
index 81c5d8016203bb33b150cb0c1836eaf4b4e4b251..54146431d9ce1194f0b3b885a981beda19c47dea 100755 (executable)
@@ -1259,6 +1259,14 @@ ROM SPACE
 
        Usually saving ROM contents is not good idea.
 
+ACTION REPLAY
+
+       "ACTR"
+
+       Model (1,2,3)           4
+       path to rom image
+       RAM space               (depends on model)
+       ROM CRC                 4
 
 END
        hunk "END " ends, remember hunk size 8!
diff --git a/zfile.c b/zfile.c
index 0292a9966367ac9e2c991a8251b477d07c99fa22..44d74d536910669f9f29df3fd9ed9036cb618452 100755 (executable)
--- a/zfile.c
+++ b/zfile.c
@@ -130,6 +130,10 @@ int zfile_gettype (struct zfile *z)
            return ZFILE_NVR;
        if (strcasecmp (ext, "uae") == 0)
            return ZFILE_CONFIGURATION;
+       if (strcasecmp (ext, "hdf") == 0)
+           return ZFILE_HDF;
+       if (strcasecmp (ext, "hdz") == 0)
+           return ZFILE_HDF;
     }
     memset (buf, 0, sizeof (buf));
     zfile_fread (buf, 8, 1, z);
@@ -261,7 +265,7 @@ static struct zfile *gunzip (struct zfile *z)
     size |= b << 16;
     zfile_fread (&b, 1, 1, z);
     size |= b << 24;
-    if (size < 8 || size > 10000000) /* safety check */
+    if (size < 8 || size > 64 * 1024 * 1024) /* safety check */
        return z;
     zfile_fseek (z, offset, SEEK_SET);
     z2 = zfile_fopen_empty (name, size);
@@ -696,6 +700,8 @@ static struct zfile *zuncompress (struct zfile *z)
             return gunzip (z);
        if (strcasecmp (ext, "roz") == 0)
             return gunzip (z);
+       if (strcasecmp (ext, "hdz") == 0)
+            return gunzip (z);
        if (strcasecmp (ext, "dms") == 0)
             return dms (z);
 #if defined(ARCHIVEACCESS)
@@ -988,6 +994,18 @@ struct zfile *zfile_fopen (const char *name, const char *mode)
     return l;
 }
 
+struct zfile *zfile_dup (struct zfile *zf)
+{
+    struct zfile *nzf;
+    if (!zf->data)
+       return NULL;
+    nzf = zfile_create();
+    nzf->data = malloc (zf->size);
+    memcpy (nzf->data, zf->data, zf->size);
+    nzf->size = zf->size;
+    return nzf;
+}
+
 int zfile_exists (const char *name)
 {
     char fname[2000];