From 463b0690aca8a04badd00eb59da863cb64ed7e7e Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 25 Sep 2005 16:09:53 +0300 Subject: [PATCH] imported winuaesrc1100b9.zip --- ar.c | 5 +- cfgfile.c | 92 +++++++++++++++- cia.c | 4 +- custom.c | 8 +- disk.c | 2 +- filesys.c | 2 +- include/filesys.h | 3 +- include/gui.h | 1 + include/memory.h | 11 +- include/options.h | 3 + include/zfile.h | 1 + memory.c | 208 ++++++++++++++++++++++++----------- newcpu.c | 14 ++- od-win32/dinput.c | 21 +++- od-win32/hardfile_win32.c | 117 +++++++++++++++----- od-win32/resources/winuae.rc | 2 +- od-win32/win32.c | 28 +++++ od-win32/win32.h | 2 +- od-win32/win32gui.c | 53 +++++++-- savestate.c | 8 ++ zfile.c | 20 +++- 21 files changed, 470 insertions(+), 135 deletions(-) diff --git a/ar.c b/ar.c index 759e5e8e..41f4ab21 100755 --- a/ar.c +++ b/ar.c @@ -155,6 +155,7 @@ #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; } diff --git a/cfgfile.c b/cfgfile.c index 63afbc98..796a4a85 100755 --- 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 69586a79..0a07d834 100755 --- 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; } diff --git a/custom.c b/custom.c index b60e9d35..6970d4b5 100755 --- 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 dceb7da5..42b29eb1 100755 --- 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; diff --git a/filesys.c b/filesys.c index e530df6b..f303ba0f 100755 --- 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); } } diff --git a/include/filesys.h b/include/filesys.h index da85147e..efa48b92 100755 --- a/include/filesys.h +++ b/include/filesys.h @@ -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); diff --git a/include/gui.h b/include/gui.h index 96e4cfe2..ed4a5652 100755 --- a/include/gui.h +++ b/include/gui.h @@ -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, diff --git a/include/memory.h b/include/memory.h index e763e03f..5bc07e01 100755 --- a/include/memory.h +++ b/include/memory.h @@ -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); diff --git a/include/options.h b/include/options.h index 6cc6c3b6..49f37d11 100755 --- a/include/options.h +++ b/include/options.h @@ -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]; diff --git a/include/zfile.h b/include/zfile.h index 3c096aa1..8735ad7e 100755 --- a/include/zfile.h +++ b/include/zfile.h @@ -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 diff --git a/memory.c b/memory.c index e7d60632..a273e8e7 100755 --- 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); } diff --git a/newcpu.c b/newcpu.c index bc5f6c1b..62d2f371 100755 --- 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; diff --git a/od-win32/dinput.c b/od-win32/dinput.c index b5d85dc1..d4149a86 100755 --- a/od-win32/dinput.c +++ b/od-win32/dinput.c @@ -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); diff --git a/od-win32/hardfile_win32.c b/od-win32/hardfile_win32.c index 7cbd905d..ea78d60f 100755 --- a/od-win32/hardfile_win32.c +++ b/od-win32/hardfile_win32.c @@ -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; } diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index cb04a417..94f7f0ac 100755 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -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/" diff --git a/od-win32/win32.c b/od-win32/win32.c index 8a57a8c2..406abb53 100755 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -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) diff --git a/od-win32/win32.h b/od-win32/win32.h index ffd260fb..cc97baa4 100755 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -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]; diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index 9904126f..878fb055 100755 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -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); diff --git a/savestate.c b/savestate.c index 81c5d801..54146431 100755 --- a/savestate.c +++ b/savestate.c @@ -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 0292a996..44d74d53 100755 --- 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]; -- 2.47.3