From: Toni Wilen Date: Sat, 10 May 2008 12:23:30 +0000 (+0300) Subject: imported winuaesrc1500b17.zip X-Git-Tag: 2100~149 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=ff46dd6c75e8577cf7db910b21700b4a51bd833a;p=francis%2Fwinuae.git imported winuaesrc1500b17.zip --- diff --git a/cfgfile.c b/cfgfile.c index cfa8372f..ea91e0c7 100755 --- 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; diff --git a/expansion.c b/expansion.c index acef08ee..b51b33f2 100755 --- a/expansion.c +++ b/expansion.c @@ -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) diff --git a/include/memory.h b/include/memory.h index 292f78d2..d730582d 100755 --- a/include/memory.h +++ b/include/memory.h @@ -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; diff --git a/include/options.h b/include/options.h index ba2b404a..8a78877f 100755 --- a/include/options.h +++ b/include/options.h @@ -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; diff --git a/include/savestate.h b/include/savestate.h index 4400fffb..b296e105 100755 --- a/include/savestate.h +++ b/include/savestate.h @@ -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 46d3ba74..6722ceb6 100755 --- 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; diff --git a/memory.c b/memory.c index 4bf090f4..f118efb9 100755 --- 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 (®s, m68k_getpc (®s)); diff --git a/moduleripper.c b/moduleripper.c index 1afcb7a9..3ca727f4 100755 --- a/moduleripper.c +++ b/moduleripper.c @@ -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; diff --git a/od-win32/dxwrap.c b/od-win32/dxwrap.c index b6bfd39c..b5a53f5d 100755 --- a/od-win32/dxwrap.c +++ b/od-win32/dxwrap.c @@ -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)) diff --git a/od-win32/dxwrap.h b/od-win32/dxwrap.h index f7a85ea5..55e22da3 100755 --- a/od-win32/dxwrap.h +++ b/od-win32/dxwrap.h @@ -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; diff --git a/od-win32/mman.c b/od-win32/mman.c index af3d40b7..4a4afb57 100755 --- a/od-win32/mman.c +++ b/od-win32/mman.c @@ -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" : ""); } diff --git a/od-win32/picasso96_win.c b/od-win32/picasso96_win.c index 833ec1d3..b6684d96 100755 --- a/od-win32/picasso96_win.c +++ b/od-win32/picasso96_win.c @@ -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) diff --git a/od-win32/rp.c b/od-win32/rp.c index 92330f0c..6ef94c35 100755 --- a/od-win32/rp.c +++ b/od-win32/rp.c @@ -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"; diff --git a/od-win32/win32.c b/od-win32/win32.c index 1b6e128e..b05ed318 100755 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -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 (); diff --git a/od-win32/win32.h b/od-win32/win32.h index 6a8b43be..d6f3e2cc 100755 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -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 "" diff --git a/od-win32/win32gfx.c b/od-win32/win32gfx.c index 056aae41..df33dd10 100755 --- a/od-win32/win32gfx.c +++ b/od-win32/win32gfx.c @@ -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", diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index 7267fddf..32b09196 100755 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -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)]]; diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 18f237d7..c7e2ba10 100755 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -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: diff --git a/savestate.c b/savestate.c index 617b0709..eaf60799 100755 --- a/savestate.c +++ b/savestate.c @@ -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);