]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
imported winuaesrc1500b17.zip
authorToni Wilen <twilen@winuae.net>
Sat, 10 May 2008 12:23:30 +0000 (15:23 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 22 Feb 2010 19:40:10 +0000 (21:40 +0200)
19 files changed:
cfgfile.c
expansion.c
include/memory.h
include/options.h
include/savestate.h
main.c
memory.c
moduleripper.c
od-win32/dxwrap.c
od-win32/dxwrap.h
od-win32/mman.c
od-win32/picasso96_win.c
od-win32/rp.c
od-win32/win32.c
od-win32/win32.h
od-win32/win32gfx.c
od-win32/win32gui.c
od-win32/winuaechangelog.txt
savestate.c

index cfa8372f6ecd552233c74d6adfd4cb4966e2208a..ea91e0c7e416db759b8d63e14814e49717858a5a 100755 (executable)
--- a/cfgfile.c
+++ b/cfgfile.c
@@ -630,6 +630,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
     cfgfile_write (f, "a3000mem_size=%d\n", p->mbresmem_low_size / 0x100000);
     cfgfile_write (f, "mbresmem_size=%d\n", p->mbresmem_high_size / 0x100000);
     cfgfile_write (f, "z3mem_size=%d\n", p->z3fastmem_size / 0x100000);
+    cfgfile_write (f, "z3mem2_size=%d\n", p->z3fastmem2_size / 0x100000);
     cfgfile_write (f, "z3mem_start=0x%x\n", p->z3fastmem_start);
     cfgfile_write (f, "bogomem_size=%d\n", p->bogomem_size / 0x40000);
     cfgfile_write (f, "gfxcard_size=%d\n", p->gfxmem_size / 0x100000);
@@ -1362,6 +1363,7 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, char *option, char *valu
        || cfgfile_intval (option, value, "a3000mem_size", &p->mbresmem_low_size, 0x100000)
        || cfgfile_intval (option, value, "mbresmem_size", &p->mbresmem_high_size, 0x100000)
        || cfgfile_intval (option, value, "z3mem_size", &p->z3fastmem_size, 0x100000)
+       || cfgfile_intval (option, value, "z3mem2_size", &p->z3fastmem2_size, 0x100000)
        || cfgfile_intval (option, value, "z3mem_start", &p->z3fastmem_start, 1)
        || cfgfile_intval (option, value, "bogomem_size", &p->bogomem_size, 0x40000)
        || cfgfile_intval (option, value, "gfxcard_size", &p->gfxmem_size, 0x100000)
@@ -2984,6 +2986,7 @@ void default_prefs (struct uae_prefs *p, int type)
     p->mbresmem_low_size = 0x00000000;
     p->mbresmem_high_size = 0x00000000;
     p->z3fastmem_size = 0x00000000;
+    p->z3fastmem2_size = 0x00000000;
     p->z3fastmem_start = 0x10000000;
     p->chipmem_size = 0x00080000;
     p->bogomem_size = 0x00080000;
@@ -3085,6 +3088,7 @@ static void buildin_default_prefs (struct uae_prefs *p)
     p->mbresmem_low_size = 0x00000000;
     p->mbresmem_high_size = 0x00000000;
     p->z3fastmem_size = 0x00000000;
+    p->z3fastmem2_size = 0x00000000;
     p->gfxmem_size = 0x00000000;
 
     p->cs_rtc = 0;
index acef08ee820fb1cb86602b3da06a6e8e8d837aab..b51b33f23838f6ce5a13c2449ffdd47f9b2320ce 100755 (executable)
@@ -135,8 +135,7 @@ int uae_boot_rom, uae_boot_rom_size; /* size = code size only */
 static void (*card_init[MAX_EXPANSION_BOARDS]) (void);
 static void (*card_map[MAX_EXPANSION_BOARDS]) (void);
 
-static int ecard;
-static int cardno;
+static int ecard, cardno, z3num;
 
 static uae_u16 uae_id;
 
@@ -277,21 +276,29 @@ static void REGPARAM2 expamem_wput (uaecptr addr, uae_u32 value)
        switch (addr & 0xff) {
         case 0x44:
            if (expamem_type() == zorroIII) {
+               uae_u32 p1, p2;
                // +Bernd Roesch & Toni Wilen
+               p1 = get_word (regs.regs[11] + 0x20);
                if (expamem[0] & add_memory) {
                    // Z3 RAM expansion
-                   value = z3fastmem_start >> 16;
+                   if (z3num == 0)
+                       p2 = z3fastmem_start >> 16;
+                   else
+                       p2 = z3fastmem2_start >> 16;
+                   z3num++;
                } else {
                    // Z3 P96 RAM
-                   value = p96ram_start >> 16;
+                   p2 = p96ram_start >> 16;
                }
-               put_word (regs.regs[11] + 0x20, value);
-               put_word (regs.regs[11] + 0x28, value);
+               put_word (regs.regs[11] + 0x20, p2);
+               put_word (regs.regs[11] + 0x28, p2);
                // -Bernd Roesch
-               expamem_hi = value;
+               expamem_hi = p2;
                (*card_map[ecard]) ();
-               write_log ("   Card %d (Zorro%s) done.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
-               ++ecard;
+               ecard++;
+               if (p1 != p2)
+                   write_log ("   Card %d remapped %04x0000 -> %04x0000\n", ecard, p1, p2);
+               write_log ("   Card %d (Zorro%s) done.\n", ecard, expamem_type () == 0xc0 ? "II" : "III");
                if (ecard < cardno)
                    (*card_init[ecard]) ();
                else
@@ -322,7 +329,7 @@ static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value)
        if (expamem_type () == zorroII) {
            expamem_hi = value;
            (*card_map[ecard]) ();
-           write_log ("   Card %d (Zorro%s) done.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
+           write_log ("   Card %d (Zorro%s) done.\n", ecard + 1, expamem_type () == 0xc0 ? "II" : "III");
            ++ecard;
            if (ecard < cardno)
                (*card_init[ecard]) ();
@@ -338,7 +345,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 < cardno)
            (*card_init[ecard]) ();
@@ -682,19 +689,9 @@ static addrbank filesys_bank = {
  *  Z3fastmem Memory
  */
 
-static uae_u32 z3fastmem_mask;
-
-static uae_u32 REGPARAM3 z3fastmem_lget (uaecptr) REGPARAM;
-static uae_u32 REGPARAM3 z3fastmem_wget (uaecptr) REGPARAM;
-static uae_u32 REGPARAM3 z3fastmem_bget (uaecptr) REGPARAM;
-static void REGPARAM3 z3fastmem_lput (uaecptr, uae_u32) REGPARAM;
-static void REGPARAM3 z3fastmem_wput (uaecptr, uae_u32) REGPARAM;
-static void REGPARAM3 z3fastmem_bput (uaecptr, uae_u32) REGPARAM;
-static int REGPARAM3 z3fastmem_check (uaecptr addr, uae_u32 size) REGPARAM;
-static uae_u8 *REGPARAM3 z3fastmem_xlate (uaecptr addr) REGPARAM;
-
-uaecptr z3fastmem_start; /* Determined by the OS */
-static uae_u8 *z3fastmem;
+static uae_u32 z3fastmem_mask, z3fastmem2_mask;
+uaecptr z3fastmem_start, z3fastmem2_start;
+static uae_u8 *z3fastmem, *z3fastmem2;
 
 static uae_u32 REGPARAM2 z3fastmem_lget (uaecptr addr)
 {
@@ -704,7 +701,6 @@ static uae_u32 REGPARAM2 z3fastmem_lget (uaecptr addr)
     m = z3fastmem + addr;
     return do_get_mem_long ((uae_u32 *)m);
 }
-
 static uae_u32 REGPARAM2 z3fastmem_wget (uaecptr addr)
 {
     uae_u8 *m;
@@ -720,7 +716,6 @@ static uae_u32 REGPARAM2 z3fastmem_bget (uaecptr addr)
     addr &= z3fastmem_mask;
     return z3fastmem[addr];
 }
-
 static void REGPARAM2 z3fastmem_lput (uaecptr addr, uae_u32 l)
 {
     uae_u8 *m;
@@ -729,7 +724,6 @@ static void REGPARAM2 z3fastmem_lput (uaecptr addr, uae_u32 l)
     m = z3fastmem + addr;
     do_put_mem_long ((uae_u32 *)m, l);
 }
-
 static void REGPARAM2 z3fastmem_wput (uaecptr addr, uae_u32 w)
 {
     uae_u8 *m;
@@ -738,21 +732,18 @@ static void REGPARAM2 z3fastmem_wput (uaecptr addr, uae_u32 w)
     m = z3fastmem + addr;
     do_put_mem_word ((uae_u16 *)m, w);
 }
-
 static void REGPARAM2 z3fastmem_bput (uaecptr addr, uae_u32 b)
 {
     addr -= z3fastmem_start & z3fastmem_mask;
     addr &= z3fastmem_mask;
     z3fastmem[addr] = b;
 }
-
 static int REGPARAM2 z3fastmem_check (uaecptr addr, uae_u32 size)
 {
     addr -= z3fastmem_start & z3fastmem_mask;
     addr &= z3fastmem_mask;
     return (addr + size) <= allocated_z3fastmem;
 }
-
 static uae_u8 *REGPARAM2 z3fastmem_xlate (uaecptr addr)
 {
     addr -= z3fastmem_start & z3fastmem_mask;
@@ -760,12 +751,74 @@ static uae_u8 *REGPARAM2 z3fastmem_xlate (uaecptr addr)
     return z3fastmem + addr;
 }
 
+static uae_u32 REGPARAM2 z3fastmem2_lget (uaecptr addr)
+{
+    uae_u8 *m;
+    addr -= z3fastmem2_start & z3fastmem2_mask;
+    addr &= z3fastmem2_mask;
+    m = z3fastmem2 + addr;
+    return do_get_mem_long ((uae_u32 *)m);
+}
+static uae_u32 REGPARAM2 z3fastmem2_wget (uaecptr addr)
+{
+    uae_u8 *m;
+    addr -= z3fastmem2_start & z3fastmem2_mask;
+    addr &= z3fastmem2_mask;
+    m = z3fastmem2 + addr;
+    return do_get_mem_word ((uae_u16 *)m);
+}
+static uae_u32 REGPARAM2 z3fastmem2_bget (uaecptr addr)
+{
+    addr -= z3fastmem2_start & z3fastmem2_mask;
+    addr &= z3fastmem2_mask;
+    return z3fastmem2[addr];
+}
+static void REGPARAM2 z3fastmem2_lput (uaecptr addr, uae_u32 l)
+{
+    uae_u8 *m;
+    addr -= z3fastmem2_start & z3fastmem2_mask;
+    addr &= z3fastmem2_mask;
+    m = z3fastmem2 + addr;
+    do_put_mem_long ((uae_u32 *)m, l);
+}
+static void REGPARAM2 z3fastmem2_wput (uaecptr addr, uae_u32 w)
+{
+    uae_u8 *m;
+    addr -= z3fastmem2_start & z3fastmem2_mask;
+    addr &= z3fastmem2_mask;
+    m = z3fastmem2 + addr;
+    do_put_mem_word ((uae_u16 *)m, w);
+}
+static void REGPARAM2 z3fastmem2_bput (uaecptr addr, uae_u32 b)
+{
+    addr -= z3fastmem2_start & z3fastmem2_mask;
+    addr &= z3fastmem2_mask;
+    z3fastmem2[addr] = b;
+}
+static int REGPARAM2 z3fastmem2_check (uaecptr addr, uae_u32 size)
+{
+    addr -= z3fastmem2_start & z3fastmem2_mask;
+    addr &= z3fastmem2_mask;
+    return (addr + size) <= allocated_z3fastmem2;
+}
+static uae_u8 *REGPARAM2 z3fastmem2_xlate (uaecptr addr)
+{
+    addr -= z3fastmem2_start & z3fastmem2_mask;
+    addr &= z3fastmem2_mask;
+    return z3fastmem2 + addr;
+}
 addrbank z3fastmem_bank = {
     z3fastmem_lget, z3fastmem_wget, z3fastmem_bget,
     z3fastmem_lput, z3fastmem_wput, z3fastmem_bput,
     z3fastmem_xlate, z3fastmem_check, NULL, "ZorroIII Fast RAM",
     z3fastmem_lget, z3fastmem_wget, ABFLAG_RAM
 };
+addrbank z3fastmem2_bank = {
+    z3fastmem2_lget, z3fastmem2_wget, z3fastmem2_bget,
+    z3fastmem2_lput, z3fastmem2_wput, z3fastmem2_bput,
+    z3fastmem2_xlate, z3fastmem2_check, NULL, "ZorroIII Fast RAM #2",
+    z3fastmem2_lget, z3fastmem2_wget, ABFLAG_RAM
+};
 
 /* Z3-based UAEGFX-card */
 uae_u32 gfxmem_mask; /* for memory.c */
@@ -889,40 +942,50 @@ static void expamem_init_filesys (void)
  * Zorro III expansion memory
  */
 
-static void expamem_map_z3fastmem (void)
+static void expamem_map_z3fastmem_2 (addrbank *bank, int *startp, uae_u32 size, uae_u32 allocated)
 {
     int z3fs = ((expamem_hi | (expamem_lo >> 4)) << 16);
-
-    if (z3fastmem_start != z3fs) {
-       write_log ("WARNING: Z3FAST mapping changed from $%lx to $%lx\n", z3fastmem_start, z3fs);
-       map_banks (&dummy_bank, z3fastmem_start >> 16, currprefs.z3fastmem_size >> 16,
-                  allocated_z3fastmem);
-       z3fastmem_start = z3fs;
-       map_banks (&z3fastmem_bank, z3fastmem_start >> 16, currprefs.z3fastmem_size >> 16,
-                  allocated_z3fastmem);
+    int start = *startp;
+
+    if (start != z3fs) {
+       write_log ("WARNING: Z3FAST mapping changed from $%08x to $%08x\n", start, z3fs);
+       map_banks (&dummy_bank, start >> 16, size >> 16,
+                  allocated);
+       *startp = z3fs;
+       map_banks (bank, start >> 16, size >> 16,
+                  allocated);
     }
-    write_log ("Fastmem (32bit): mapped @$%lx: %d MB Zorro III fast memory \n",
-              z3fastmem_start, allocated_z3fastmem / 0x100000);
+    write_log ("Fastmem (32bit): mapped @$%08x: %d MB Zorro III fast memory \n",
+              start, allocated / 0x100000);
 }
 
-static void expamem_init_z3fastmem (void)
+static void expamem_map_z3fastmem (void)
 {
-    int code = (allocated_z3fastmem == 0x100000 ? Z2_MEM_1MB
-               : allocated_z3fastmem == 0x200000 ? Z2_MEM_2MB
-               : allocated_z3fastmem == 0x400000 ? Z2_MEM_4MB
-               : allocated_z3fastmem == 0x800000 ? Z2_MEM_8MB
-               : allocated_z3fastmem == 0x1000000 ? Z2_MEM_16MB
-               : allocated_z3fastmem == 0x2000000 ? Z2_MEM_32MB
-               : allocated_z3fastmem == 0x4000000 ? Z2_MEM_64MB
-               : allocated_z3fastmem == 0x8000000 ? Z2_MEM_128MB
-               : allocated_z3fastmem == 0x10000000 ? Z2_MEM_256MB
-               : allocated_z3fastmem == 0x20000000 ? Z2_MEM_512MB
+    expamem_map_z3fastmem_2 (&z3fastmem_bank, &z3fastmem_start, currprefs.z3fastmem_size, allocated_z3fastmem);
+}
+static void expamem_map_z3fastmem2 (void)
+{
+    expamem_map_z3fastmem_2 (&z3fastmem2_bank, &z3fastmem2_start, currprefs.z3fastmem2_size, allocated_z3fastmem2);
+}
+
+static void expamem_init_z3fastmem_2 (addrbank *bank, uae_u32 start, uae_u32 size, uae_u32 allocated)
+{
+    int code = (allocated == 0x100000 ? Z2_MEM_1MB
+               : allocated == 0x200000 ? Z2_MEM_2MB
+               : allocated == 0x400000 ? Z2_MEM_4MB
+               : allocated == 0x800000 ? Z2_MEM_8MB
+               : allocated == 0x1000000 ? Z2_MEM_16MB
+               : allocated == 0x2000000 ? Z2_MEM_32MB
+               : allocated == 0x4000000 ? Z2_MEM_64MB
+               : allocated == 0x8000000 ? Z2_MEM_128MB
+               : allocated == 0x10000000 ? Z2_MEM_256MB
+               : allocated == 0x20000000 ? Z2_MEM_512MB
                : Z2_MEM_1GB);
 
     expamem_init_clear ();
     expamem_write (0x00, add_memory | zorroIII | code);
 
-    expamem_write (0x08, care_addr | no_shutup | force_z3 | (allocated_z3fastmem > 0x800000 ? ext_size : Z3_MEM_AUTO));
+    expamem_write (0x08, care_addr | no_shutup | force_z3 | (allocated > 0x800000 ? ext_size : Z3_MEM_AUTO));
 
     expamem_write (0x04, 3);
 
@@ -939,10 +1002,17 @@ static void expamem_init_z3fastmem (void)
 
     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
 
-    map_banks (&z3fastmem_bank, z3fastmem_start >> 16, currprefs.z3fastmem_size >> 16,
-       allocated_z3fastmem);
+    map_banks (bank, start >> 16, size >> 16, allocated);
 
 }
+static void expamem_init_z3fastmem (void)
+{
+    expamem_init_z3fastmem_2 (&z3fastmem_bank, z3fastmem_start, currprefs.z3fastmem_size, allocated_z3fastmem);
+}
+static void expamem_init_z3fastmem2 (void)
+{
+    expamem_init_z3fastmem_2 (&z3fastmem2_bank, z3fastmem2_start, currprefs.z3fastmem2_size, allocated_z3fastmem2);
+}
 
 #ifdef PICASSO96
 /*
@@ -1000,7 +1070,7 @@ static void expamem_init_gfxcard (void)
 
 
 #ifdef SAVESTATE
-static size_t fast_filepos, z3_filepos, p96_filepos;
+static size_t fast_filepos, z3_filepos, z3_filepos2, p96_filepos;
 #endif
 
 void free_fastmemory (void)
@@ -1014,6 +1084,7 @@ static void allocate_expamem (void)
 {
     currprefs.fastmem_size = changed_prefs.fastmem_size;
     currprefs.z3fastmem_size = changed_prefs.z3fastmem_size;
+    currprefs.z3fastmem2_size = changed_prefs.z3fastmem2_size;
     currprefs.gfxmem_size = changed_prefs.gfxmem_size;
 
     if (allocated_fastmem != currprefs.fastmem_size) {
@@ -1047,6 +1118,23 @@ static void allocate_expamem (void)
        }
        memory_hardreset ();
     }
+    if (allocated_z3fastmem2 != currprefs.z3fastmem2_size) {
+       if (z3fastmem2)
+           mapped_free (z3fastmem2);
+       z3fastmem2 = 0;
+
+       allocated_z3fastmem2 = currprefs.z3fastmem2_size;
+       z3fastmem2_mask = allocated_z3fastmem2 - 1;
+
+       if (allocated_z3fastmem2) {
+           z3fastmem2 = mapped_malloc (allocated_z3fastmem2, "z3_2");
+           if (z3fastmem2 == 0) {
+               write_log ("Out of memory for 32 bit fast memory #2.\n");
+               allocated_z3fastmem2 = 0;
+           }
+       }
+       memory_hardreset ();
+    }
 #ifdef PICASSO96
     if (allocated_gfxmem != currprefs.gfxmem_size) {
        if (gfxmemory)
@@ -1068,6 +1156,7 @@ static void allocate_expamem (void)
 #endif
 
     z3fastmem_bank.baseaddr = z3fastmem;
+    z3fastmem2_bank.baseaddr = z3fastmem2;
     fastmem_bank.baseaddr = fastmemory;
     gfxmem_bankx.baseaddr = gfxmemory;
 
@@ -1083,6 +1172,11 @@ static void allocate_expamem (void)
            map_banks (&z3fastmem_bank, z3fastmem_start >> 16, currprefs.z3fastmem_size >> 16,
                allocated_z3fastmem);
        }
+       if (allocated_z3fastmem2 > 0) {
+           restore_ram (z3_filepos2, z3fastmem2);
+           map_banks (&z3fastmem2_bank, z3fastmem2_start >> 16, currprefs.z3fastmem2_size >> 16,
+               allocated_z3fastmem2);
+       }
 #ifdef PICASSO96
        if (allocated_gfxmem > 0 && gfxmem_start > 0) {
            restore_ram (p96_filepos, gfxmemory);
@@ -1165,9 +1259,9 @@ static void expamem_init_a4091 (void)
 void p96memstart(void)
 {
     /* make sure there is always empty space between Z3 and P96 RAM */
-    p96ram_start = currprefs.z3fastmem_start + ((currprefs.z3fastmem_size + 0xffffff) & ~0xffffff);
-    if (p96ram_start == currprefs.z3fastmem_start + currprefs.z3fastmem_size &&
-       (currprefs.z3fastmem_size < 512 * 1024 * 1024 || currprefs.gfxmem_size < 128 * 1024 * 1024))
+    p96ram_start = currprefs.z3fastmem_start + ((currprefs.z3fastmem_size + currprefs.z3fastmem2_size + 0xffffff) & ~0xffffff);
+    if (p96ram_start == currprefs.z3fastmem_start + currprefs.z3fastmem_size + currprefs.z3fastmem2_size &&
+       (currprefs.z3fastmem_size + currprefs.z3fastmem2_size < 512 * 1024 * 1024 || currprefs.gfxmem_size < 128 * 1024 * 1024))
        p96ram_start += 0x1000000;
 }
 
@@ -1202,9 +1296,19 @@ void expamem_reset (void)
        card_init[cardno] = expamem_init_fastcard;
        card_map[cardno++] = expamem_map_fastcard;
     }
+
+    z3fastmem_start = currprefs.z3fastmem_start;
+    z3fastmem2_start = currprefs.z3fastmem_start + currprefs.z3fastmem_size;
     if (z3fastmem != NULL) {
+       z3num = 0;
        card_init[cardno] = expamem_init_z3fastmem;
        card_map[cardno++] = expamem_map_z3fastmem;
+       map_banks (&z3fastmem_bank, z3fastmem_start >> 16, currprefs.z3fastmem_size >> 16, allocated_z3fastmem);
+        if (z3fastmem2 != NULL) {
+           card_init[cardno] = expamem_init_z3fastmem2;
+           card_map[cardno++] = expamem_map_z3fastmem2;
+           map_banks (&z3fastmem2_bank, z3fastmem2_start >> 16, currprefs.z3fastmem2_size >> 16, allocated_z3fastmem2);
+       }
     }
 #ifdef CDTV
     if (currprefs.cs_cdtvcd) {
@@ -1258,8 +1362,6 @@ void expamem_reset (void)
        card_map[cardno++] = expamem_map_clear;
     }
 
-    z3fastmem_start = currprefs.z3fastmem_start;
-
     if (cardno == 0)
        expamem_init_clear_zero ();
     else
@@ -1290,6 +1392,9 @@ void expansion_init (void)
     allocated_z3fastmem = 0;
     z3fastmem_mask = z3fastmem_start = 0;
     z3fastmem = 0;
+    allocated_z3fastmem2 = 0;
+    z3fastmem2_mask = z3fastmem2_start = 0;
+    z3fastmem2 = 0;
 
     allocate_expamem ();
 
@@ -1312,6 +1417,9 @@ void expansion_cleanup (void)
     if (z3fastmem)
        mapped_free (z3fastmem);
     z3fastmem = 0;
+    if (z3fastmem2)
+       mapped_free (z3fastmem2);
+    z3fastmem2 = 0;
 
 #ifdef PICASSO96
     if (gfxmemory)
@@ -1336,6 +1444,8 @@ void expansion_clear(void)
        memset (fastmemory, 0, allocated_fastmem);
     if (z3fastmem)
        memset (z3fastmem, 0, allocated_z3fastmem > 0x800000 ? 0x800000 : allocated_z3fastmem);
+    if (z3fastmem2)
+       memset (z3fastmem2, 0, allocated_z3fastmem2 > 0x800000 ? 0x800000 : allocated_z3fastmem2);
     if (gfxmemory)
        memset (gfxmemory, 0, allocated_gfxmem);
 }
@@ -1350,10 +1460,10 @@ uae_u8 *save_fram (int *len)
     return fastmemory;
 }
 
-uae_u8 *save_zram (int *len)
+uae_u8 *save_zram (int *len, int num)
 {
-    *len = allocated_z3fastmem;
-    return z3fastmem;
+    *len = num ? allocated_z3fastmem2 : allocated_z3fastmem;
+    return num ? z3fastmem2 : z3fastmem;
 }
 
 uae_u8 *save_pram (int *len)
@@ -1368,10 +1478,15 @@ void restore_fram (int len, size_t filepos)
     changed_prefs.fastmem_size = len;
 }
 
-void restore_zram (int len, size_t filepos)
+void restore_zram (int len, size_t filepos, int num)
 {
-    z3_filepos = filepos;
-    changed_prefs.z3fastmem_size = len;
+    if (num) {
+       z3_filepos2 = filepos;
+       changed_prefs.z3fastmem2_size = len;
+    } else {
+       z3_filepos = filepos;
+       changed_prefs.z3fastmem_size = len;
+    }
 }
 
 void restore_pram (int len, size_t filepos)
index 292f78d215d50ce00c47ca62c39d7b2ef39322fa..d730582d2229cba207d11437333d6fe709aff67c 100755 (executable)
@@ -42,7 +42,7 @@ extern uae_u32 allocated_chipmem;
 extern uae_u32 allocated_fastmem;
 extern uae_u32 allocated_bogomem;
 extern uae_u32 allocated_gfxmem;
-extern uae_u32 allocated_z3fastmem, max_z3fastmem;
+extern uae_u32 allocated_z3fastmem, allocated_z3fastmem2, max_z3fastmem;
 extern uae_u32 allocated_a3000mem;
 extern uae_u32 allocated_cardmem;
 
@@ -57,7 +57,7 @@ extern void wait_cpu_cycle_write (uaecptr addr, int mode, uae_u32 v);
 #define bogomem_start 0x00C00000
 #define cardmem_start 0x00E00000
 #define kickmem_start 0x00F80000
-extern uaecptr z3fastmem_start;
+extern uaecptr z3fastmem_start, z3fastmem2_start;
 extern uaecptr p96ram_start;
 extern uaecptr fastmem_start;
 extern uaecptr a3000lmem_start, a3000hmem_start;
index ba2b404add2cf65b4d29ce9150ab8ce7f3ddf96f..8a78877fa645d1e68f8f324f49cc1448244e5380 100755 (executable)
@@ -263,7 +263,7 @@ struct uae_prefs {
     int picasso96_nocustom;
     int picasso96_modeflags;
 
-    uae_u32 z3fastmem_size;
+    uae_u32 z3fastmem_size, z3fastmem2_size;
     uae_u32 z3fastmem_start;
     uae_u32 fastmem_size;
     uae_u32 chipmem_size;
index 4400fffb56560c00b0deb88c712d968a3ebb20ed..b296e10515d244df79a5c74d3c7af040b7dec862 100755 (executable)
@@ -104,7 +104,7 @@ extern uae_u8 *restore_log (uae_u8 *src);
 extern void restore_cram (int, size_t);
 extern void restore_bram (int, size_t);
 extern void restore_fram (int, size_t);
-extern void restore_zram (int, size_t);
+extern void restore_zram (int, size_t, int);
 extern void restore_bootrom (int, size_t);
 extern void restore_pram (int, size_t);
 extern void restore_a3000lram (int, size_t);
@@ -115,7 +115,7 @@ extern void restore_ram (size_t, uae_u8*);
 extern uae_u8 *save_cram (int *);
 extern uae_u8 *save_bram (int *);
 extern uae_u8 *save_fram (int *);
-extern uae_u8 *save_zram (int *);
+extern uae_u8 *save_zram (int *, int);
 extern uae_u8 *save_bootrom (int *);
 extern uae_u8 *save_pram (int *);
 extern uae_u8 *save_a3000lram (int *);
diff --git a/main.c b/main.c
index 46d3ba7433a64dc2e3735c50c72a8412554695f6..6722ceb655b90bb8fba5641a77b632a54a879ccb 100755 (executable)
--- a/main.c
+++ b/main.c
@@ -167,7 +167,7 @@ void fixup_prefs (struct uae_prefs *p)
     built_in_chipset_prefs (p);
     fixup_cpu (p);
 
-    if ((p->chipmem_size & (p->chipmem_size - 1)) != 0
+    if (((p->chipmem_size & (p->chipmem_size - 1)) != 0 && p->chipmem_size != 0x180000)
        || p->chipmem_size < 0x20000
        || p->chipmem_size > 0x800000)
     {
@@ -201,6 +201,16 @@ void fixup_prefs (struct uae_prefs *p)
            p->z3fastmem_size = 0;
        err = 1;
     }
+    if ((p->z3fastmem2_size & (p->z3fastmem2_size - 1)) != 0
+       || (p->z3fastmem2_size != 0 && (p->z3fastmem2_size < 0x100000 || p->z3fastmem2_size > max_z3fastmem)))
+    {
+       write_log ("Unsupported Zorro III fastmem size %x (%x)!\n", p->z3fastmem2_size, max_z3fastmem);
+       if (p->z3fastmem2_size > max_z3fastmem)
+           p->z3fastmem2_size = max_z3fastmem;
+       else
+           p->z3fastmem2_size = 0;
+       err = 1;
+    }
     p->z3fastmem_start &= ~0xffff;
     if (p->z3fastmem_start < 0x1000000)
        p->z3fastmem_start = 0x1000000;
index 4bf090f46b036fa0f46a4a883f6db2a1c83defb3..f118efb9a7f249e27151295f45a76a8a0bbf945c 100755 (executable)
--- a/memory.c
+++ b/memory.c
@@ -57,7 +57,7 @@ uae_u32 allocated_chipmem;
 uae_u32 allocated_fastmem;
 uae_u32 allocated_bogomem;
 uae_u32 allocated_gfxmem;
-uae_u32 allocated_z3fastmem;
+uae_u32 allocated_z3fastmem, allocated_z3fastmem2;
 uae_u32 allocated_a3000lmem;
 uae_u32 allocated_a3000hmem;
 uae_u32 allocated_cardmem;
@@ -621,25 +621,69 @@ static int decode_rekick_rom_do (uae_u8 *mem, int size, int real_size)
     return 1;
 }
 
-static void addkey (int *pkeyid, uae_u8 *key, int size, const char *name)
+static void addkey (uae_u8 *key, int size, const char *name)
 {
-    int keyid = *pkeyid;
     int i;
 
-    if (key == NULL || size == 0 || keyid >= ROM_KEY_NUM) {
+    if (key == NULL || size == 0) {
        xfree (key);
        return;
     }
-    for (i = 0; i < keyid; i++) {
+    for (i = 0; i < ROM_KEY_NUM; i++) {
        if (keyring[i].key && keyring[i].size == size && !memcmp (keyring[i].key, key, size)) {
            xfree (key);
            return;
        }
     }
-    keyring[keyid].key = key;
-    keyring[keyid++].size = size;
+    for (i = 0; i < ROM_KEY_NUM; i++) {
+       if (keyring[i].key == NULL)
+           break;
+    }
+    if (i == ROM_KEY_NUM) {
+       xfree (key);
+       return;
+    }
+    keyring[i].key = key;
+    keyring[i].size = size;
     write_log ("ROM KEY '%s' %d bytes loaded\n", name, size);
-    *pkeyid = keyid;
+}
+
+static void addkeyfile (const char *path)
+{
+    struct zfile *f;
+    int keysize;
+    uae_u8 *keybuf;
+
+    f = zfile_fopen (path, "rb");
+    if (!f)
+       return;
+    zfile_fseek (f, 0, SEEK_END);
+    keysize = zfile_ftell (f);
+    if (keysize > 0) {
+        zfile_fseek (f, 0, SEEK_SET);
+        keybuf = xmalloc (keysize);
+        zfile_fread (keybuf, 1, keysize, f);
+        addkey (keybuf, keysize, path);
+    }
+    zfile_fclose (f);
+}
+
+static void addkeydir (const char *path)
+{
+    char tmp[MAX_DPATH];
+
+    strcpy (tmp, path);
+    if (zfile_exists (tmp)) {
+        int i;
+        for (i = strlen (tmp) - 1; i > 0; i--) {
+           if (tmp[i] == '\\' || tmp[i] == '/')
+               break;
+       }
+       tmp[i] = 0;
+    }
+    strcat (tmp, "/");
+    strcat (tmp, "rom.key");
+    addkeyfile (tmp);
 }
 
 int get_keyring (void)
@@ -654,37 +698,22 @@ int get_keyring (void)
 
 int load_keyring (struct uae_prefs *p, char *path)
 {
-    struct zfile *f;
     uae_u8 *keybuf;
     int keysize;
     char tmp[MAX_PATH], *d;
     int keyids[] = { 0, 48, -1 };
-    int keyid;
     int cnt, i;
 
     free_keyring ();
-    keyid = 0;
     keybuf = target_load_keyfile (p, path, &keysize, tmp);
-    addkey (&keyid, keybuf, keysize, tmp);
-    for (i = 0; keyids[i] >= 0 && keyid < ROM_KEY_NUM; i++) {
+    addkey (keybuf, keysize, tmp);
+    for (i = 0; keyids[i] >= 0; i++) {
        struct romdata *rd = getromdatabyid (keyids[i]);
        char *s;
        if (rd) {
            s = romlist_get (rd);
-           if (s) {
-               f = zfile_fopen (s, "rb");
-               if (f) {
-                   zfile_fseek (f, 0, SEEK_END);
-                   keysize = zfile_ftell (f);
-                   if (keysize > 0) {
-                       zfile_fseek (f, 0, SEEK_SET);
-                       keybuf = (uae_u8*)xmalloc (keysize);
-                       zfile_fread (keybuf, 1, keysize, f);
-                       addkey(&keyid, keybuf, keysize, s);
-                   }
-                   zfile_fclose (f);
-               }
-           }
+           if (s)
+               addkeyfile (s);
        }
     }
 
@@ -735,23 +764,12 @@ int load_keyring (struct uae_prefs *p, char *path)
            }
        break;
        case 7:
-       return keyid;
+       return cnt;
        }
        cnt++;
        if (!tmp[0])
            continue;
-       f = zfile_fopen(tmp, "rb");
-       if (!f)
-           continue;
-       zfile_fseek (f, 0, SEEK_END);
-       keysize = zfile_ftell (f);
-       if (keysize > 0) {
-           zfile_fseek (f, 0, SEEK_SET);
-           keybuf = (uae_u8*)xmalloc (keysize);
-           zfile_fread (keybuf, 1, keysize, f);
-           addkey (&keyid, keybuf, keysize, tmp);
-       }
-       zfile_fclose (f);
+       addkeyfile (tmp);
     }
 }
 void free_keyring (void)
@@ -2318,6 +2336,7 @@ static int read_rom_file (uae_u8 *buf, struct romdata *rd)
        return 0;
     zfile_fread (buf, rd->size, 1, zf);
     zfile_fclose (zf);
+    addkeydir (rl->path);
     return 1;
 }
 
@@ -2479,7 +2498,7 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu
     }
     oldpos = zfile_ftell (f);
     i = zfile_fread (buffer, 1, 11, f);
-    if (!memcmp(buffer, "KICK", 4)) {
+    if (!memcmp (buffer, "KICK", 4)) {
        zfile_fseek (f, 512, SEEK_SET);
        kickdisk = 1;
 #if 0
@@ -2542,9 +2561,9 @@ static int load_extendedkickstart (void)
     struct zfile *f;
     int size, off;
 
-    if (strlen(currprefs.romextfile) == 0)
+    if (strlen (currprefs.romextfile) == 0)
        return 0;
-    if (is_arcadia_rom(currprefs.romextfile) == ARCADIA_BIOS) {
+    if (is_arcadia_rom (currprefs.romextfile) == ARCADIA_BIOS) {
        extendedkickmem_type = EXTENDED_ROM_ARCADIA;
        return 0;
     }
@@ -2570,12 +2589,12 @@ static int load_extendedkickstart (void)
     zfile_fseek (f, off, SEEK_SET);
     switch (extendedkickmem_type) {
     case EXTENDED_ROM_CDTV:
-       extendedkickmemory = (uae_u8 *) mapped_malloc (extendedkickmem_size, "rom_f0");
-       extendedkickmem_bank.baseaddr = (uae_u8 *) extendedkickmemory;
+       extendedkickmemory = mapped_malloc (extendedkickmem_size, "rom_f0");
+       extendedkickmem_bank.baseaddr = extendedkickmemory;
        break;
     case EXTENDED_ROM_CD32:
-       extendedkickmemory = (uae_u8 *) mapped_malloc (extendedkickmem_size, "rom_e0");
-       extendedkickmem_bank.baseaddr = (uae_u8 *) extendedkickmemory;
+       extendedkickmemory = mapped_malloc (extendedkickmem_size, "rom_e0");
+       extendedkickmem_bank.baseaddr = extendedkickmemory;
        break;
     }
     read_kickstart (f, extendedkickmemory, extendedkickmem_size,  0, 0, 1);
@@ -2708,6 +2727,7 @@ static int load_kickstart (void)
            strcpy (currprefs.romfile, tmprom2);
        }
     }
+    addkeydir (currprefs.romfile);
     if( f == NULL ) { /* still no luck */
 #if defined(AMIGA)||defined(__POS__)
 #define USE_UAE_ERSATZ "USE_UAE_ERSATZ"
@@ -2980,6 +3000,8 @@ static void allocate_memory (void)
        chipmem_full_mask = chipmem_mask = allocated_chipmem - 1;
        if (memsize < 0x100000)
            memsize = 0x100000;
+       if (memsize > 0x100000 && memsize < 0x200000)
+           memsize = 0x200000;
        chipmemory = mapped_malloc (memsize, "chip");
        if (chipmemory == 0) {
            write_log ("Fatal error: out of memory for chipmem.\n");
@@ -2993,8 +3015,12 @@ static void allocate_memory (void)
 
     currprefs.chipset_mask = changed_prefs.chipset_mask;
     chipmem_full_mask = allocated_chipmem - 1;
-    if ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) && allocated_chipmem < 0x100000)
-       chipmem_full_mask = 0x100000 - 1;
+    if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) {
+       if (allocated_chipmem < 0x100000)
+           chipmem_full_mask = 0x100000 - 1;
+       if (allocated_chipmem > 0x100000 && allocated_chipmem < 0x200000)
+           chipmem_full_mask = chipmem_mask = 0x200000 - 1;
+    }
 
     if (allocated_bogomem != currprefs.bogomem_size) {
        if (bogomemory)
@@ -3117,18 +3143,25 @@ static void allocate_memory (void)
 
 void map_overlay (int chip)
 {
-    int i = allocated_chipmem > 0x200000 ? (allocated_chipmem >> 16) : 32;
+    int size;
     addrbank *cb;
 
+    size = allocated_chipmem >= 0x180000 ? (allocated_chipmem >> 16) : 32;
     cb = &chipmem_bank;
 #ifdef AGA
     if (currprefs.cpu_cycle_exact && currprefs.cpu_model >= 68020)
        cb = &chipmem_bank_ce2;
 #endif
     if (chip) {
-       map_banks (cb, 0, i, allocated_chipmem);
+       map_banks (&dummy_bank, 0, 32, 0);
+       if (currprefs.cpu_model < 68020 || currprefs.address_space_24)
+           map_banks (cb, 0, size, allocated_chipmem);
+       else
+           map_banks (cb, 0, allocated_chipmem >> 16, 0);
     } else {
        addrbank *rb = NULL;
+       if (size < 32)
+           size = 32;
        cb = &get_mem_bank (0xf00000);
        if (!rb && cb && (cb->flags & ABFLAG_ROM) && get_word (0xf00000) == 0x1114)
            rb = cb;
@@ -3137,7 +3170,7 @@ void map_overlay (int chip)
            rb = cb;
        if (!rb)
            rb = &kickmem_bank;
-       map_banks (rb, 0, i, 0x80000);
+       map_banks (rb, 0, size, 0x80000);
     }
     if (savestate_state != STATE_RESTORE && savestate_state != STATE_REWIND && valid_address (regs.pc, 4))
        m68k_setpc (&regs, m68k_getpc (&regs));
index 1afcb7a9f84767851e7246c7d471238d9a46796c..3ca727f4e37bbef344829c294ec33137ace21d19 100755 (executable)
@@ -44,6 +44,7 @@ void moduleripper (void)
     size += currprefs.mbresmem_low_size;
     size += currprefs.mbresmem_high_size;
     size += currprefs.z3fastmem_size;
+    size += currprefs.z3fastmem2_size;
     buf = p = (uae_u8*)xmalloc (size);
     if (!buf)
        return;
@@ -59,6 +60,8 @@ void moduleripper (void)
     p += currprefs.mbresmem_high_size;
     mc (p, z3fastmem_start, currprefs.z3fastmem_size);
     p += currprefs.z3fastmem_size;
+    mc (p, z3fastmem_start + currprefs.z3fastmem_size, currprefs.z3fastmem2_size);
+    p += currprefs.z3fastmem2_size;
 
     got = 0;
     canceled = 0;
index b6bfd39cb6f04385121498ca49c2eab594885f10..b5a53f5d3d0ab9e7134cd9cf993101dc06d1faa4 100755 (executable)
@@ -45,7 +45,8 @@ static void freemainsurface (void)
     releaser (dxdata.flipping[0], IDirectDrawSurface7_Release);
     releaser (dxdata.primary, IDirectDrawSurface7_Release);
     releaser (dxdata.secondary, IDirectDrawSurface7_Release);
-    releaser (dxdata.cursorsurface, IDirectDrawSurface7_Release);
+    releaser (dxdata.cursorsurface1, IDirectDrawSurface7_Release);
+    releaser (dxdata.cursorsurface2, IDirectDrawSurface7_Release);
     dxdata.backbuffers = 0;
 }
 
@@ -204,7 +205,8 @@ LPDIRECTDRAWSURFACE7 allocsurface_3 (int width, int height, uae_u8 *ptr, int pit
     if (FAILED (ddrval)) {
        write_log ("IDirectDraw7_CreateSurface (%dx%d,%s): %s\n", width, height, alloctexts[forcemode], DXError (ddrval));
     } else {
-        write_log ("Created %dx%d surface in %s (%d)\n", width, height, alloctexts[forcemode], forcemode);
+       write_log ("Created %dx%dx%d (%p) surface in %s (%d)\n", width, height, desc.ddpfPixelFormat.dwRGBBitCount, surf,
+           alloctexts[forcemode], forcemode);
     }
     return surf;
 }
@@ -256,10 +258,14 @@ void DirectDraw_FreeMainSurface (void)
 
 static void createcursorsurface (void)
 {
-    releaser (dxdata.cursorsurface, IDirectDrawSurface7_Release);
-    dxdata.cursorsurface = allocsurface_2 (dxdata.cursorwidth, dxdata.cursorheight * 2, TRUE);
-    if (dxdata.cursorsurface)
-       clearsurf (dxdata.cursorsurface);
+    releaser (dxdata.cursorsurface1, IDirectDrawSurface7_Release);
+    releaser (dxdata.cursorsurface2, IDirectDrawSurface7_Release);
+    dxdata.cursorsurface1 = allocsurface_2 (dxdata.cursorwidth, dxdata.cursorheight, TRUE);
+    dxdata.cursorsurface2 = allocsurface_2 (dxdata.cursorwidth, dxdata.cursorheight, FALSE);
+    if (dxdata.cursorsurface1)
+       clearsurf (dxdata.cursorsurface1);
+    if (dxdata.cursorsurface2)
+       clearsurf (dxdata.cursorsurface2);
 }
 
 HRESULT DirectDraw_CreateMainSurface (int width, int height)
@@ -322,10 +328,11 @@ HRESULT DirectDraw_CreateMainSurface (int width, int height)
            unlocksurface (surf);
        }
        createcursorsurface ();
-
     } else {
        ddrval = DD_FALSE;
     }
+    write_log ("DDRAW: primary surface %p, secondary %p (%dx%dx%d)\n",
+       dxdata.primary, surf, width, height, dxdata.native.ddpfPixelFormat.dwRGBBitCount);
     return ddrval;
 }
 
@@ -668,10 +675,6 @@ int DirectDraw_BlitToPrimary (RECT *rect)
 static void DirectDraw_Blt (LPDIRECTDRAWSURFACE7 dst, RECT *dstrect, LPDIRECTDRAWSURFACE7 src, RECT *srcrect)
 {
     HRESULT ddrval;
-    DDBLTFX fx = { 0 };
-
-    fx.dwSize = sizeof (fx);
-    fx.dwROP = SRCCOPY;
 
     if (dst == NULL)
        dst = getlocksurface ();
@@ -679,7 +682,7 @@ static void DirectDraw_Blt (LPDIRECTDRAWSURFACE7 dst, RECT *dstrect, LPDIRECTDRA
        src = getlocksurface ();
     if (dst == src)
        return;
-    while (FAILED(ddrval = IDirectDrawSurface7_Blt (dst, dstrect, src, srcrect, DDBLT_ROP | DDBLT_WAIT, &fx))) {
+    while (FAILED(ddrval = IDirectDrawSurface7_Blt (dst, dstrect, src, srcrect, DDBLT_WAIT, NULL))) {
        if (ddrval == DDERR_SURFACELOST) {
            ddrval = restoresurfacex (dst, src);
            if (FAILED (ddrval))
index f7a85ea555460113135f5431805b8e7936c4d07f..55e22da3b368b68e281f3b3e15eaf95d8a49e1b8 100755 (executable)
@@ -27,7 +27,8 @@ struct ddstuff
     int maxwidth, maxheight;
     uae_u32 colorkey;
 
-    LPDIRECTDRAWSURFACE7 cursorsurface;
+    LPDIRECTDRAWSURFACE7 cursorsurface1;
+    LPDIRECTDRAWSURFACE7 cursorsurface2;
     int cursorwidth, cursorheight;
 };
 extern struct ddstuff dxdata;
index af3d40b74cba415792248c44b2992f54b5487cff..4a4afb57e010da0ed7e60d742b0930fc065bbd84 100755 (executable)
@@ -59,11 +59,23 @@ static void setworkingset(void)
 static uae_u32 lowmem (void)
 {
     uae_u32 change = 0;
-    if (currprefs.z3fastmem_size >= 8 * 1024 * 1024 && currprefs.gfxmem_size < 64 * 1024 * 1024) {
-        change = currprefs.z3fastmem_size - currprefs.z3fastmem_size / 2;
-        currprefs.z3fastmem_size >>= 1;
-       changed_prefs.z3fastmem_size = currprefs.z3fastmem_size;
-    } else if (currprefs.gfxmem_size >= 8 * 1024 * 1024) {
+    if (currprefs.z3fastmem_size + currprefs.z3fastmem2_size >= 8 * 1024 * 1024) {
+       if (currprefs.z3fastmem2_size) {
+           if (currprefs.z3fastmem2_size <= 128 * 1024 * 1024) {
+               change = currprefs.z3fastmem2_size;
+               currprefs.z3fastmem2_size = 0;
+           } else {
+               change = currprefs.z3fastmem2_size / 2;
+               currprefs.z3fastmem2_size >>= 1;
+               changed_prefs.z3fastmem2_size = currprefs.z3fastmem2_size;
+           }
+       } else {
+           change = currprefs.z3fastmem_size - currprefs.z3fastmem_size / 4;
+           currprefs.z3fastmem2_size = changed_prefs.z3fastmem2_size = currprefs.z3fastmem_size / 4;
+           currprefs.z3fastmem_size >>= 1;
+           changed_prefs.z3fastmem_size = currprefs.z3fastmem_size;
+       }
+    } else if (currprefs.gfxmem_size >= 1 * 1024 * 1024) {
         change = currprefs.gfxmem_size - currprefs.gfxmem_size / 2;
         currprefs.gfxmem_size >>= 1;
        changed_prefs.gfxmem_size = currprefs.gfxmem_size;
@@ -294,8 +306,8 @@ restart:
        rtgbarrier = si.dwPageSize;
        if (currprefs.cpu_model >= 68020)
            size = 0x10000000;
-       if (currprefs.z3fastmem_size) {
-           z3size = currprefs.z3fastmem_size + (currprefs.z3fastmem_start -  0x10000000);
+       if (currprefs.z3fastmem_size || currprefs.z3fastmem2_size) {
+           z3size = currprefs.z3fastmem_size + currprefs.z3fastmem2_size + (currprefs.z3fastmem_start - 0x10000000);
            if (currprefs.gfxmem_size)
                rtgbarrier = 16 * 1024 * 1024;
        } else {
@@ -334,7 +346,7 @@ restart:
            break;
        }
        write_log ("NATMEM: %dM area failed to allocate, err=%d (Z3=%dM,RTG=%dM)\n",
-           natmemsize >> 20, GetLastError (), currprefs.z3fastmem_size >> 20, currprefs.gfxmem_size >> 20);
+           natmemsize >> 20, GetLastError (), (currprefs.z3fastmem_size + currprefs.z3fastmem2_size) >> 20, currprefs.gfxmem_size >> 20);
        if (!lowmem ()) {
            write_log ("NATMEM: No special area could be allocated (2)!\n");
            return 0;
@@ -499,6 +511,12 @@ void *shmat (int shmid, void *shmaddr, int shmflg)
        }
        if(!strcmp(shmids[shmid].name,"z3")) {
            shmaddr=natmem_offset + currprefs.z3fastmem_start;
+           if (!currprefs.z3fastmem2_size)
+               size += BARRIER;
+           got = TRUE;
+       }
+       if(!strcmp(shmids[shmid].name,"z3_2")) {
+           shmaddr=natmem_offset + currprefs.z3fastmem_start + currprefs.z3fastmem_size;
            size += BARRIER;
            got = TRUE;
        }
@@ -561,12 +579,12 @@ void *shmat (int shmid, void *shmaddr, int shmflg)
        result = virtualallocwithlock (shmaddr, size, MEM_COMMIT, protect);
        if (result == NULL) {
            result = (void*)-1;
-           write_log ("VirtualAlloc %08.8X - %08.8X %x (%dk) failed %d\n",
+           write_log ("VirtualAlloc %08X - %08X %x (%dk) failed %d\n",
                (uae_u8*)shmaddr - natmem_offset, (uae_u8*)shmaddr - natmem_offset + size,
-               size, size >> 10, GetLastError());
+               size, size >> 10, GetLastError ());
         } else {
            shmids[shmid].attached = result;
-           write_log ("VirtualAlloc %08.8X - %08.8X %x (%dk) ok%s\n",
+           write_log ("VirtualAlloc %08X - %08X %x (%dk) ok%s\n",
                (uae_u8*)shmaddr - natmem_offset, (uae_u8*)shmaddr - natmem_offset + size,
                size, size >> 10, p96special ? " P96" : "");
        }
index 833ec1d3d85d46ddb3d9db39e19345e18af85484..b6684d963fc267f955e50646054bee5763edf071 100755 (executable)
@@ -603,8 +603,8 @@ static void mouseupdate (void)
 
     fx1 = remcursor_x;
     fy1 = remcursor_y;
-    fx2 = fx1 + remcursor_h;
-    fy2 = fy1 + remcursor_w;
+    fx2 = fx1 + remcursor_w;
+    fy2 = fy1 + remcursor_h;
 
     remcursor_x = x;
     remcursor_y = y;
@@ -720,8 +720,10 @@ typedef enum {
 static uae_u32 setspriteimage (uaecptr bi);
 static void recursor (void)
 {
-    restoresurface (dxdata.cursorsurface);
-    clearsurface (dxdata.cursorsurface);
+    restoresurface (dxdata.cursorsurface1);
+    restoresurface (dxdata.cursorsurface2);
+    clearsurface (dxdata.cursorsurface1);
+    clearsurface (dxdata.cursorsurface2);
     reloadcursor = 1;
     cursorok = FALSE;
     setspriteimage (cursorbi);
@@ -1310,11 +1312,11 @@ void picasso_putcursor (int sx, int sy, int sw, int sh)
     cursor_r1.bottom += ydiff;
 
     cursor_r2.left = 0;
-    cursor_r2.top = cursorheight;
+    cursor_r2.top = 0;
     cursor_r2.right = cursorwidth + xdiff + xdiff2;
-    cursor_r2.bottom = cursorheight + cursorheight + ydiff + ydiff2;
+    cursor_r2.bottom = cursorheight + ydiff + ydiff2;
 
-    ddrval = IDirectDrawSurface7_Blt (dxdata.cursorsurface, &cursor_r2, dstsurf, &cursor_r1, DDBLT_WAIT, NULL);
+    ddrval = IDirectDrawSurface7_Blt (dxdata.cursorsurface2, &cursor_r2, dstsurf, &cursor_r1, DDBLT_WAIT, NULL);
     if (FAILED (ddrval)) {
        if (ddrval != DDERR_SURFACELOST)
            write_log ("Cursor surface blit1 failed: %s\n", DXError (ddrval));
@@ -1327,7 +1329,7 @@ void picasso_putcursor (int sx, int sy, int sw, int sh)
     cursor_r2.right = cursor_r2.left + cursorwidth + xdiff + xdiff2;
     cursor_r2.bottom = cursor_r2.top + cursorheight + ydiff + ydiff2;
 
-    ddrval = IDirectDrawSurface7_Blt (dstsurf, &cursor_r1, dxdata.cursorsurface, &cursor_r2, DDBLT_WAIT | DDBLT_KEYSRC, NULL);
+    ddrval = IDirectDrawSurface7_Blt (dstsurf, &cursor_r1, dxdata.cursorsurface1, &cursor_r2, DDBLT_WAIT | DDBLT_KEYSRC, NULL);
     if (FAILED (ddrval)) {
        if (ddrval != DDERR_SURFACELOST)
            write_log ("Cursor surface blit2 failed: %s\n", DXError (ddrval));
@@ -1336,9 +1338,9 @@ void picasso_putcursor (int sx, int sy, int sw, int sh)
     }
 
     cursor_r2.left = 0;
-    cursor_r2.top = cursorheight;
+    cursor_r2.top = 0;
     cursor_r2.right = cursorwidth + xdiff + xdiff2;
-    cursor_r2.bottom = cursorheight + cursorheight + ydiff + ydiff2;
+    cursor_r2.bottom = cursorheight + ydiff + ydiff2;
 
     mouseput = 1;
 }
@@ -1353,7 +1355,7 @@ void picasso_clearcursor (void)
        return;
     mouseput = 0;
 
-    ddrval = IDirectDrawSurface7_Blt (dstsurf, &cursor_r1, dxdata.cursorsurface, &cursor_r2, DDBLT_WAIT, NULL);
+    ddrval = IDirectDrawSurface7_Blt (dstsurf, &cursor_r1, dxdata.cursorsurface2, &cursor_r2, DDBLT_WAIT, NULL);
     if (FAILED(ddrval)) {
        if (ddrval != DDERR_SURFACELOST)
            write_log ("Cursor surface clearblit failed: %s\n", DXError (ddrval));
@@ -1423,7 +1425,7 @@ static uae_u32 setspriteimage (uaecptr bi)
     int w, h;
 
     cursordeactivate = 0;
-    if (!hwsprite || !dxdata.cursorsurface)
+    if (!hwsprite || !dxdata.cursorsurface1)
        return 0;
     oldcursor_x = -10000;
     w = (uae_u32)get_byte (bi + PSSO_BoardInfo_MouseWidth);
@@ -1492,10 +1494,9 @@ static uae_u32 setspriteimage (uaecptr bi)
            if (!reloadcursor && w == cursorwidth && h == cursorheight) {
                int different = 0;
                desc.dwSize = sizeof (desc);
-               ddrval = DD_OK;
-               while (FAILED (ddrval = IDirectDrawSurface7_Lock (dxdata.cursorsurface, NULL, &desc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL))) {
+               while (FAILED ((ddrval = IDirectDrawSurface7_Lock (dxdata.cursorsurface1, NULL, &desc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL)))) {
                    if (ddrval == DDERR_SURFACELOST) {
-                       ddrval = IDirectDrawSurface7_Restore (dxdata.cursorsurface);
+                       ddrval = IDirectDrawSurface7_Restore (dxdata.cursorsurface1);
                        if (FAILED (ddrval))
                            break;
                    }
@@ -1510,7 +1511,7 @@ static uae_u32 setspriteimage (uaecptr bi)
                    if (memcmp (p1, p2, w * bpp))
                        different = 1;
                }
-               IDirectDrawSurface_Unlock (dxdata.cursorsurface, NULL);
+               IDirectDrawSurface_Unlock (dxdata.cursorsurface1, NULL);
                if (!different) {
                    P96TRACE_SPR (("sprite was same as previously\n"));
                    ret = 1;
@@ -1526,9 +1527,9 @@ static uae_u32 setspriteimage (uaecptr bi)
     cursorheight = h;
 
     desc.dwSize = sizeof (desc);
-    while (FAILED(ddrval = IDirectDrawSurface7_Lock (dxdata.cursorsurface, NULL, &desc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL))) {
+    while (FAILED((ddrval = IDirectDrawSurface7_Lock (dxdata.cursorsurface1, NULL, &desc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL)))) {
        if (ddrval == DDERR_SURFACELOST) {
-           ddrval = IDirectDrawSurface7_Restore (dxdata.cursorsurface);
+           ddrval = IDirectDrawSurface7_Restore (dxdata.cursorsurface1);
            if (FAILED(ddrval)) {
                write_log ("sprite surface failed to restore: %s\n", DXError (ddrval));
                goto end;
@@ -1542,7 +1543,7 @@ static uae_u32 setspriteimage (uaecptr bi)
        uae_u8 *p2 = dptr + pitch * y;
        memcpy (p2, p1, w * bpp);
     }
-    IDirectDrawSurface_Unlock (dxdata.cursorsurface, NULL);
+    IDirectDrawSurface_Unlock (dxdata.cursorsurface1, NULL);
     ret = 1;
     reloadcursor = 0;
     cursorok = TRUE;
@@ -1864,20 +1865,16 @@ void picasso96_alloc (TrapContext *ctx)
        while (missmodes[misscnt * 2] == 0)
            misscnt++;
        if (missmodes[misscnt * 2] >= 0) {
-           if (DisplayModes[i].res.width > missmodes[misscnt * 2 + 0] || DisplayModes[i].res.height > missmodes[misscnt * 2 + 1]) {
-               int depth;
-               int w = DisplayModes[i].res.width;
-               int h = DisplayModes[i].res.height;
-               for (depth = 8; depth <= 32; depth++) {
-                   struct PicassoResolution *pr = &newmodes[cnt];
-                   if (!p96depth (depth))
-                       continue;
-                   memcpy (pr, &DisplayModes[i], sizeof (struct PicassoResolution));
-                   pr->res.width = missmodes[misscnt * 2 + 0];
-                   pr->res.height = missmodes[misscnt * 2 + 1];
-                   sprintf (pr->name, "%dx%dx%d FAKE", pr->res.width, pr->res.height, depth);
-                   size += PSSO_ModeInfo_sizeof;
-               }
+           int w = DisplayModes[i].res.width;
+           int h = DisplayModes[i].res.height;
+           if (w > missmodes[misscnt * 2 + 0] || h > missmodes[misscnt * 2 + 1]) {
+               struct PicassoResolution *pr = &newmodes[cnt];
+               memcpy (pr, &DisplayModes[i], sizeof (struct PicassoResolution));
+               pr->res.width = missmodes[misscnt * 2 + 0];
+               pr->res.height = missmodes[misscnt * 2 + 1];
+               sprintf (pr->name, "%dx%d FAKE", pr->res.width, pr->res.height);
+               size += PSSO_ModeInfo_sizeof * depths;
+               cnt++;
                misscnt++;
                continue;
            }
@@ -2146,6 +2143,7 @@ static uae_u32 REGPARAM2 picasso_InitCard (TrapContext *ctx)
        struct LibResolution res = { 0 };
        j = i;
        addmode (AmigaBoardInfo, &amem, &res, newmodes[i].res.width, newmodes[i].res.height, NULL, -1, &unkcnt);
+       write_log ("%08X %4dx%4d %s\n", res.DisplayID, res.Width, res.Height, res.Name);
        while (newmodes[i].depth >= 0
            && newmodes[i].res.width == newmodes[j].res.width
            && newmodes[i].res.height == newmodes[j].res.height)
index 92330f0c69a8d65f2a73ea4800648ccf16154d84..6ef94c353fdf2363990e36c0cbd8c8c443b96834 100755 (executable)
@@ -112,7 +112,7 @@ static const char *getmsg (int msg)
        case RPIPCGM_VOLUME: return "RPIPCGM_VOLUME";
        case RPIPCGM_DEVICECONTENT: return "RPIPCGM_DEVICECONTENT";
        case RPIPCGM_DEVICESEEK: return "RPIPCGM_DEVICESEEK";
-
+       case RPIPCGM_ESCAPED: return "RPIPCGM_ESCAPED";
        case RPIPCHM_CLOSE: return "RPIPCHM_CLOSE";
        case RPIPCHM_SCREENMODE: return "RPIPCHM_SCREENMODE";
        case RPIPCHM_SCREENCAPTURE: return "RPIPCHM_SCREENCAPTURE";
index 1b6e128e77d7244456bac4ab881909d69673ef1c..b05ed31863fb6de6969cca275b425be3640bfe28 100755 (executable)
@@ -1167,7 +1167,7 @@ void handle_events (void)
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
-       sleep_millis (50);
+       sleep_millis (20);
        inputdevicefunc_keyboard.read ();
        inputdevicefunc_mouse.read ();
        inputdevicefunc_joystick.read ();
index 6a8b43be8f7b96530978b8d27c812a7c341bf4de..d6f3e2ccf28e7c3f8ea9e864af294ecdec63cf9c 100755 (executable)
@@ -15,9 +15,9 @@
 #define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
 #define GETBDD(x) ((x) % 100)
 
-#define WINUAEBETA 16
+#define WINUAEBETA 17
 #define WINUAEPUBLICBETA 1
-#define WINUAEDATE MAKEBD(2008, 5, 4)
+#define WINUAEDATE MAKEBD(2008, 5, 10)
 #define WINUAEEXTRA ""
 #define WINUAEREV ""
 
index 056aae41eceade8f04fb7e201b0701095f208a31..df33dd1000254ee54bc63696f4b196b8b5bb4407 100755 (executable)
@@ -195,7 +195,7 @@ struct MultiDisplay *getdisplay (struct uae_prefs *p)
 void centerdstrect (RECT *dr)
 {
     if(!(currentmode->flags & (DM_DX_FULLSCREEN | DM_W_FULLSCREEN)))
-       OffsetRect(dr, amigawin_rect.left, amigawin_rect.top);
+       OffsetRect (dr, amigawin_rect.left, amigawin_rect.top);
     if (currentmode->flags & DM_W_FULLSCREEN) {
        if (currentmode->fullfill && (currentmode->current_width > currentmode->native_width || currentmode->current_height > currentmode->native_height))
            return;
@@ -1277,9 +1277,12 @@ static int modeswitchneeded (struct winuae_currentmode *wc)
                picasso96_state.Height != wc->current_height)
                return 1;
            if (picasso96_state.Width == wc->current_width &&
-               picasso96_state.Height == wc->current_height &&
-               picasso96_state.BytesPerPixel * 8 == wc->current_depth)
-               return 0;
+               picasso96_state.Height == wc->current_height) {
+               if (picasso96_state.BytesPerPixel * 8 == wc->current_depth)
+                   return 0;
+               if (!currprefs.win32_rtgmatchdepth && wc->current_depth >= 16)
+                   return 0;
+           }
            return 1;
        } else {
            if (currentmode->current_width != wc->current_width ||
@@ -1664,7 +1667,7 @@ static int create_windows_2 (void)
        getbestmode (0);
     }
 
-    if (rp_isactive ()) {
+    if (rp_isactive () && !dxfs && !fsw) {
        HWND parent = rp_getparent ();
        hAmigaWnd = CreateWindowEx (dxfs ? WS_EX_ACCEPTFILES | WS_EX_TOPMOST : WS_EX_ACCEPTFILES | WS_EX_TOOLWINDOW | (currprefs.win32_alwaysontop ? WS_EX_TOPMOST : 0),
            "AmigaPowah", "WinUAE",
index 7267fddf28ba88e5bcf99537e8464219f054730e..32b09196119ce47ef8539b7b88cf7531839bae3d 100755 (executable)
@@ -622,7 +622,7 @@ static HWND cachedlist = NULL;
 #define MIN_SLOW_MEM 0
 #define MAX_SLOW_MEM 4
 #define MIN_Z3_MEM 0
-#define MAX_Z3_MEM ((max_z3fastmem >> 20) < 512 ? 9 : ((max_z3fastmem >> 20) < 1024 ? 10 : ((max_z3fastmem >> 20) < 2048) ? 11 : 12))
+#define MAX_Z3_MEM ((max_z3fastmem >> 20) < 512 ? 12 : ((max_z3fastmem >> 20) < 1024 ? 13 : ((max_z3fastmem >> 20) < 2048) ? 14 : 16))
 #define MIN_P96_MEM 0
 #define MAX_P96_MEM ((max_z3fastmem >> 20) < 512 ? 8 : ((max_z3fastmem >> 20) < 1024 ? 9 : ((max_z3fastmem >> 20) < 2048) ? 10 : 11))
 #define MIN_MB_MEM 0
@@ -1761,32 +1761,38 @@ static const char *memsize_names[] = {
 /* 14*/ "1.5MB",
 /* 15*/ "1.8MB",
 /* 16*/ "2 GB",
+/* 17*/ "384 MB",
+/* 18*/ "768 MB",
+/* 19*/ "1.5 GB",
 };
 
 static unsigned long memsizes[] = {
 /* 0 */ 0,
-/* 1 */ 0x00040000, /* 256-K */
-/* 2 */ 0x00080000, /* 512-K */
-/* 3 */ 0x00100000, /* 1-meg */
-/* 4 */ 0x00200000, /* 2-meg */
-/* 5 */ 0x00400000, /* 4-meg */
-/* 6 */ 0x00800000, /* 8-meg */
-/* 7 */ 0x01000000, /* 16-meg */
-/* 8 */ 0x02000000, /* 32-meg */
-/* 9 */ 0x04000000, /* 64-meg */
-/* 10*/ 0x08000000, //128 Meg
-/* 11*/ 0x10000000, //256 Meg
-/* 12*/ 0x20000000, //512 Meg The correct size is set in mman.c
+/* 1 */ 0x00040000, /* 256K */
+/* 2 */ 0x00080000, /* 512K */
+/* 3 */ 0x00100000, /* 1M */
+/* 4 */ 0x00200000, /* 2M */
+/* 5 */ 0x00400000, /* 4M */
+/* 6 */ 0x00800000, /* 8M */
+/* 7 */ 0x01000000, /* 16M */
+/* 8 */ 0x02000000, /* 32M */
+/* 9 */ 0x04000000, /* 64M */
+/* 10*/ 0x08000000, //128M
+/* 11*/ 0x10000000, //256M
+/* 12*/ 0x20000000, //512M
 /* 13*/ 0x40000000, //1GB
 /* 14*/ 0x00180000, //1.5MB
 /* 15*/ 0x001C0000, //1.8MB
 /* 16*/ 0x80000000, //2GB
+/* 17*/ 0x18000000, //384M
+/* 18*/ 0x30000000, //768M
+/* 19*/ 0x60000000, //1.5GB
 };
 
-static int msi_chip[] = { 1, 2, 3, 4, 5, 6 };
+static int msi_chip[] = { 1, 2, 3, 14, 4, 5, 6 };
 static int msi_bogo[] = { 0, 2, 3, 14, 15 };
 static int msi_fast[] = { 0, 3, 4, 5, 6 };
-static int msi_z3fast[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 };
+static int msi_z3fast[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 17, 12, 18, 13, 19, 16 };
 static int msi_gfx[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
 
 static int CalculateHardfileSize (HWND hDlg)
@@ -5010,14 +5016,16 @@ static void enable_for_memorydlg (HWND hDlg)
 static void values_to_memorydlg (HWND hDlg)
 {
     uae_u32 mem_size = 0;
+       uae_u32 v;
 
     switch (workprefs.chipmem_size) {
      case 0x00040000: mem_size = 0; break;
      case 0x00080000: mem_size = 1; break;
      case 0x00100000: mem_size = 2; break;
-     case 0x00200000: mem_size = 3; break;
-     case 0x00400000: mem_size = 4; break;
-     case 0x00800000: mem_size = 5; break;
+     case 0x00180000: mem_size = 3; break;
+     case 0x00200000: mem_size = 4; break;
+     case 0x00400000: mem_size = 5; break;
+     case 0x00800000: mem_size = 6; break;
     }
     SendDlgItemMessage (hDlg, IDC_CHIPMEM, TBM_SETPOS, TRUE, mem_size);
     SetDlgItemText (hDlg, IDC_CHIPRAM, memsize_names[msi_chip[mem_size]]);
@@ -5046,22 +5054,39 @@ static void values_to_memorydlg (HWND hDlg)
     SetDlgItemText (hDlg, IDC_SLOWRAM, memsize_names[msi_bogo[mem_size]]);
 
     mem_size = 0;
-    switch (workprefs.z3fastmem_size) {
-     case 0x00000000: mem_size = 0; break; /*   0-megs */
-     case 0x00100000: mem_size = 1; break; /*   1-megs */
-     case 0x00200000: mem_size = 2; break; /*   2-megs */
-     case 0x00400000: mem_size = 3; break; /*   4-megs */
-     case 0x00800000: mem_size = 4; break; /*   8-megs */
-     case 0x01000000: mem_size = 5; break; /*  16-megs */
-     case 0x02000000: mem_size = 6; break; /*  32-megs */
-     case 0x04000000: mem_size = 7; break; /*  64-megs */
-     case 0x08000000: mem_size = 8; break; /* 128-megs */
-     case 0x10000000: mem_size = 9; break; /* 256-megs */
-     case 0x20000000: mem_size = 10; break; /* 512-megs */
-     case 0x40000000: mem_size = 11; break; /* 1 GB */
-     case 0x80000000: mem_size = 12; break; /* 2 GB */
-
-    }
+       v = workprefs.z3fastmem_size + workprefs.z3fastmem2_size;
+       if      (v < 0x00100000)
+               mem_size = 0;
+       else if (v < 0x00200000)
+               mem_size = 1;
+       else if (v < 0x00400000)
+               mem_size = 2;
+       else if (v < 0x00800000)
+               mem_size = 3;
+       else if (v < 0x01000000)
+               mem_size = 4;
+       else if (v < 0x02000000)
+               mem_size = 5;
+       else if (v < 0x04000000)
+               mem_size = 6;
+       else if (v < 0x08000000)
+               mem_size = 7;
+       else if (v < 0x10000000)
+               mem_size = 8;
+       else if (v < 0x18000000)
+               mem_size = 9;
+       else if (v < 0x20000000)
+               mem_size = 10;
+       else if (v < 0x30000000)
+               mem_size = 11;
+       else if (v < 0x40000000)
+               mem_size = 12;
+       else if (v < 0x60000000)
+               mem_size = 13;
+       else if (v < 0x80000000)
+               mem_size = 14;
+       else
+               mem_size = 15;
     SendDlgItemMessage (hDlg, IDC_Z3FASTMEM, TBM_SETPOS, TRUE, mem_size);
     SetDlgItemText (hDlg, IDC_Z3FASTRAM, memsize_names[msi_z3fast[mem_size]]);
 
@@ -5156,6 +5181,40 @@ static void fix_values_memorydlg (void)
     if (workprefs.chipmem_size > 0x200000)
        workprefs.fastmem_size = 0;
 }
+static void updatez3 (uae_u32 *size1p, uae_u32 *size2p)
+{
+    int i;
+    uae_u32 s1, s2;
+
+    s1 = *size1p;
+    *size1p = 0;
+    *size2p = 0;
+    s2 = 0;
+    for (i = 32; i >= 0; i--) {
+       if (s1 & (1 << i))
+           break;
+    }
+    if (i < 20)
+       return;
+    if (s1 == (1 << i)) {
+       *size1p = s1;
+       return;
+    }
+    s2 = s1 & ((1 << i) - 1);
+    s1 = 1 << i;
+    i--;
+    while (i >= 0) {
+       if (s2 & (1 << i)) {
+           s2 = 1 << i;
+           break;
+       }
+       i--;
+    }
+    if (i < 19)
+       s2 = 0;
+    *size1p = s1;
+    *size2p = s2;
+}
 
 static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 {
@@ -5189,6 +5248,7 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA
            workprefs.bogomem_size = memsizes[msi_bogo[SendMessage (GetDlgItem (hDlg, IDC_SLOWMEM), TBM_GETPOS, 0, 0)]];
            workprefs.fastmem_size = memsizes[msi_fast[SendMessage (GetDlgItem (hDlg, IDC_FASTMEM), TBM_GETPOS, 0, 0)]];
            workprefs.z3fastmem_size = memsizes[msi_z3fast[SendMessage (GetDlgItem (hDlg, IDC_Z3FASTMEM), TBM_GETPOS, 0, 0)]];
+           updatez3 (&workprefs.z3fastmem_size, &workprefs.z3fastmem2_size);
            workprefs.gfxmem_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_P96MEM), TBM_GETPOS, 0, 0)]];
            workprefs.mbresmem_low_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_MBMEM1), TBM_GETPOS, 0, 0)]];
            workprefs.mbresmem_high_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_MBMEM2), TBM_GETPOS, 0, 0)]];
index 18f237d77271ff36f0c87957167604b70e3bffb1..c7e2ba1091fbc9de44f3944de465b29375ebf9f6 100755 (executable)
@@ -1,4 +1,21 @@
 
+Beta 17:
+
+- hardware mouse cursor trails fixed when cursor height > width
+- fullscreen to fullscreen picasso96 mode switching work properly
+  when "Match host and RTG color depth if possible" is off
+  (instant switch without resetting display mode)
+- Picasso96 "fake" (320x200 etc..) display resolutions fixed
+  (resolutions disappeared few betas ago)
+- added 1.5M chip ram option (A500Plus + 0.5M trap door expansion)
+  NOTE: do not use with JIT, JIT does not like non-power-of-2 RAM
+- added 384M/768M/1.5G Z3 RAM options (enables second Z3 RAM board,
+  384M = 256M+128M, 768M = 512M+256M...) Why? Because on most PCs
+  1G is not possible (without having 64-bit OS) but 768M is usually
+  possible and lots of RAM is fun and pointless :)
+- Z3 RAM is now always mapped (more compatible with some reset proof
+  programs)
+
 Beta 16:
 
 - winuaebootlog.txt and winuaelog.txt (if enabled) is written to crash
@@ -9,7 +26,7 @@ Beta 16:
   more Windows-like (input is read as long as program has focus)
 - "Match host and RTG color depth if possible" set and 24-bit fullscreen
   Picasso96 mode selected -> use 32-bit native mode
-- Picasso96 hardware mouse cursor fixed in 8/16-bit modes
+- fixed corrupted Picasso96 hardware mouse cursor in 8/16-bit modes
 
 Beta 15:
 
index 617b07091b8d31de5a2889d6e8fc47da45b647da..eaf6079961194e71ebf5978b273864a413373b6c 100755 (executable)
@@ -391,6 +391,7 @@ void restore_state (char *filename)
     char name[5];
     size_t len, totallen;
     size_t filepos, filesize;
+    int z3num;
 
     chunk = 0;
     f = zfile_fopen (filename, "rb");
@@ -413,8 +414,10 @@ void restore_state (char *filename)
     changed_prefs.chipmem_size = 0;
     changed_prefs.fastmem_size = 0;
     changed_prefs.z3fastmem_size = 0;
+    changed_prefs.z3fastmem2_size = 0;
     changed_prefs.mbresmem_low_size = 0;
     changed_prefs.mbresmem_high_size = 0;
+    z3num = 0;
     savestate_state = STATE_RESTORE;
     for (;;) {
        name[0] = 0;
@@ -444,7 +447,7 @@ void restore_state (char *filename)
            restore_fram (totallen, filepos);
            continue;
        } else if (!strcmp (name, "ZRAM")) {
-           restore_zram (totallen, filepos);
+           restore_zram (totallen, filepos, z3num++);
            continue;
        } else if (!strcmp (name, "BORO")) {
            restore_bootrom (totallen, filepos);
@@ -601,7 +604,9 @@ static void save_rams (struct zfile *f, int comp)
 #ifdef AUTOCONFIG
     dst = save_fram (&len);
     save_chunk (f, dst, len, "FRAM", comp);
-    dst = save_zram (&len);
+    dst = save_zram (&len, 0);
+    save_chunk (f, dst, len, "ZRAM", comp);
+    dst = save_zram (&len, 1);
     save_chunk (f, dst, len, "ZRAM", comp);
     dst = save_bootrom (&len);
     save_chunk (f, dst, len, "BORO", comp);
@@ -931,7 +936,7 @@ void savestate_rewind (void)
     memcpy (save_fram (&dummy), p, currprefs.fastmem_size > len ? len : currprefs.fastmem_size);
     p += len;
     len = restore_u32_func (&p);
-    memcpy (save_zram (&dummy), p, currprefs.z3fastmem_size > len ? len : currprefs.z3fastmem_size);
+    memcpy (save_zram (&dummy, 0), p, currprefs.z3fastmem_size > len ? len : currprefs.z3fastmem_size);
     p += len;
 #endif
 #ifdef ACTION_REPLAY
@@ -1086,7 +1091,7 @@ retry2:
     memcpy (p, dst, len);
     tlen += len + 4;
     p += len;
-    dst = save_zram (&len);
+    dst = save_zram (&len, 0);
     if (bufcheck (&p, len))
        goto retry;
     save_u32_func (&p, len);