From: Toni Wilen Date: Sun, 12 Feb 2023 16:07:15 +0000 (+0200) Subject: Improved 1.5 M Chip RAM support. X-Git-Tag: 5.0.0~144 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=9458ade32e33dfa111fa0309b052dd644ca6b6e2;p=francis%2Fwinuae.git Improved 1.5 M Chip RAM support. --- diff --git a/memory.cpp b/memory.cpp index 5f4455b6..d560efc1 100644 --- a/memory.cpp +++ b/memory.cpp @@ -621,6 +621,82 @@ static void REGPARAM2 chipmem_bput_ce2 (uaecptr addr, uae_u32 b) #endif +static uae_u32 chipmem_noise(uae_u32 addr) +{ + // not yet implemented + return 0; +} + +static uae_u32 REGPARAM2 chipmem_lget_limit(uaecptr addr) +{ + uae_u32 *m; + + addr &= chipmem_bank.mask; + if (addr >= 0x180000 - 3) { + return chipmem_noise(addr); + } + m = (uae_u32 *)(chipmem_bank.baseaddr + addr); + return do_get_mem_long(m); +} + +static uae_u32 REGPARAM2 chipmem_wget_limit(uaecptr addr) +{ + uae_u16 *m, v; + + addr &= chipmem_bank.mask; + if (addr >= 0x180000 - 1) { + return chipmem_noise(addr); + } + m = (uae_u16 *)(chipmem_bank.baseaddr + addr); + v = do_get_mem_word(m); + return v; +} + +static uae_u32 REGPARAM2 chipmem_bget_limit(uaecptr addr) +{ + uae_u8 v; + addr &= chipmem_bank.mask; + if (addr >= 0x180000) { + return chipmem_noise(addr); + } + v = chipmem_bank.baseaddr[addr]; + return v; +} + +void REGPARAM2 chipmem_lput_limit(uaecptr addr, uae_u32 l) +{ + uae_u32 *m; + + addr &= chipmem_bank.mask; + if (addr >= 0x180000) { + return; + } + m = (uae_u32 *)(chipmem_bank.baseaddr + addr); + do_put_mem_long(m, l); +} + +void REGPARAM2 chipmem_wput_limit(uaecptr addr, uae_u32 w) +{ + uae_u16 *m; + + addr &= chipmem_bank.mask; + if (addr >= 0x180000) { + return; + } + m = (uae_u16 *)(chipmem_bank.baseaddr + addr); + do_put_mem_word(m, w); +} + +void REGPARAM2 chipmem_bput_limit(uaecptr addr, uae_u32 b) +{ + addr &= chipmem_bank.mask; + if (addr >= 0x180000) { + return; + } + chipmem_bank.baseaddr[addr] = b; +} + + static uae_u32 REGPARAM2 chipmem_lget (uaecptr addr) { uae_u32 *m; @@ -702,12 +778,6 @@ static uae_u32 REGPARAM2 chipmem_dummy_lget (uaecptr addr) return (chipmem_dummy () << 16) | chipmem_dummy (); } -static uae_u32 chipmem_noise(uae_u32 addr) -{ - // not yet implemented - return 0; -} - static uae_u32 REGPARAM2 chipmem_agnus_lget (uaecptr addr) { uae_u32 *m; @@ -901,6 +971,22 @@ void chipmem_setindirect(void) chipmem_check_indirect = chipmem_check; chipmem_xlate_indirect = chipmem_xlate; } + + if (currprefs.chipmem.size == 0x180000) { + chipmem_bank.bget = chipmem_bget_limit; + chipmem_bank.wget = chipmem_wget_limit; + chipmem_bank.lget = chipmem_lget_limit; + chipmem_bank.bput = chipmem_bput_limit; + chipmem_bank.wput = chipmem_wput_limit; + chipmem_bank.lput = chipmem_lput_limit; + } else { + chipmem_bank.bget = chipmem_bget; + chipmem_bank.wget = chipmem_wget; + chipmem_bank.lget = chipmem_lget; + chipmem_bank.bput = chipmem_bput; + chipmem_bank.wput = chipmem_wput; + chipmem_bank.lput = chipmem_lput; + } } /* Slow memory */ @@ -2289,10 +2375,13 @@ static void allocate_memory (void) memsize = chipmem_bank.reserved_size = chipmem_full_size = currprefs.chipmem.size; chipmem_full_mask = chipmem_bank.mask = chipmem_bank.reserved_size - 1; chipmem_bank.start = chipmem_start_addr; - if (!currprefs.cachesize && memsize < 0x100000) + if (!currprefs.cachesize && memsize < 0x100000) { memsize = 0x100000; - if (memsize > 0x100000 && memsize < 0x200000) + } + if (memsize == 0x180000) { memsize = 0x200000; + chipmem_full_mask = chipmem_bank.mask = memsize - 1; + } chipmem_bank.reserved_size = memsize; mapped_malloc (&chipmem_bank); chipmem_bank.reserved_size = currprefs.chipmem.size; @@ -2306,16 +2395,14 @@ static void allocate_memory (void) memset (chipmem_bank.baseaddr + chipmem_bank.allocated_size, 0xff, memsize - chipmem_bank.allocated_size); } currprefs.chipset_mask = changed_prefs.chipset_mask; - chipmem_full_mask = chipmem_bank.allocated_size - 1; - if (!currprefs.cachesize) { - if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) { - if (chipmem_bank.allocated_size < 0x100000) - chipmem_full_mask = 0x100000 - 1; - if (chipmem_bank.allocated_size > 0x100000 && chipmem_bank.allocated_size < 0x200000) - chipmem_full_mask = chipmem_bank.mask = 0x200000 - 1; - } else if (currprefs.cs_1mchipjumper) { + if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) { + if (chipmem_bank.allocated_size < 0x100000) + chipmem_full_mask = 0x100000 - 1; + if (currprefs.cs_1mchipjumper) { chipmem_full_mask = 0x80000 - 1; } + } else { + chipmem_full_mask = 0x80000 - 1; } } @@ -2327,6 +2414,10 @@ static void allocate_memory (void) } } + if (currprefs.cachesize) { + chipmem_full_mask = chipmem_bank.mask = chipmem_bank.allocated_size - 1; + } + if (bogomem_bank.reserved_size != currprefs.bogomem.size || bogoreset) { if (!(bogomem_bank.reserved_size == 0x200000 && currprefs.bogomem.size == 0x180000)) { mapped_free (&bogomem_bank);