From 2a75b70e4384a79d66ed7ba790c69a94fc61e7c1 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Mon, 14 Mar 2022 18:02:09 +0200 Subject: [PATCH] Second 1M ROM bank divided to 2x512k banks --- include/memory.h | 3 +- memory.cpp | 142 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 99 insertions(+), 46 deletions(-) diff --git a/include/memory.h b/include/memory.h index c7520a25..4b9ae591 100644 --- a/include/memory.h +++ b/include/memory.h @@ -439,7 +439,8 @@ extern addrbank debugmem_bank; extern addrbank a3000lmem_bank; extern addrbank a3000hmem_bank; extern addrbank extendedkickmem_bank; -extern addrbank extendedkickmem2_bank; +extern addrbank extendedkickmem2a_bank; +extern addrbank extendedkickmem2b_bank; extern addrbank custmem1_bank; extern addrbank custmem2_bank; extern addrbank romboardmem_bank[MAX_ROM_BOARDS]; diff --git a/memory.cpp b/memory.cpp index f7ee845f..ea7152d6 100644 --- a/memory.cpp +++ b/memory.cpp @@ -1089,32 +1089,58 @@ static void REGPARAM2 extendedkickmem_bput (uaecptr addr, uae_u32 b) } -static void REGPARAM3 extendedkickmem2_lput (uaecptr, uae_u32) REGPARAM; -static void REGPARAM3 extendedkickmem2_wput (uaecptr, uae_u32) REGPARAM; -static void REGPARAM3 extendedkickmem2_bput (uaecptr, uae_u32) REGPARAM; - -MEMORY_BGET(extendedkickmem2); -MEMORY_WGET(extendedkickmem2); -MEMORY_LGET(extendedkickmem2); -MEMORY_CHECK(extendedkickmem2); -MEMORY_XLATE(extendedkickmem2); +static void REGPARAM3 extendedkickmem2a_lput(uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 extendedkickmem2a_wput(uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 extendedkickmem2a_bput(uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 extendedkickmem2b_lput(uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 extendedkickmem2b_wput(uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 extendedkickmem2b_bput(uaecptr, uae_u32) REGPARAM; + +MEMORY_BGET(extendedkickmem2a); +MEMORY_WGET(extendedkickmem2a); +MEMORY_LGET(extendedkickmem2a); +MEMORY_CHECK(extendedkickmem2a); +MEMORY_XLATE(extendedkickmem2a); + +MEMORY_BGET(extendedkickmem2b); +MEMORY_WGET(extendedkickmem2b); +MEMORY_LGET(extendedkickmem2b); +MEMORY_CHECK(extendedkickmem2b); +MEMORY_XLATE(extendedkickmem2b); + +static void REGPARAM2 extendedkickmem2a_lput (uaecptr addr, uae_u32 b) +{ + if (currprefs.illegal_mem) + write_log (_T("Illegal extendedkickmem2a lput at %08x\n"), addr); +} +static void REGPARAM2 extendedkickmem2a_wput (uaecptr addr, uae_u32 b) +{ + if (currprefs.illegal_mem) + write_log (_T("Illegal extendedkickmem2a wput at %08x\n"), addr); +} +static void REGPARAM2 extendedkickmem2a_bput (uaecptr addr, uae_u32 b) +{ + if (currprefs.illegal_mem) + write_log (_T("Illegal extendedkickmem2a lput at %08x\n"), addr); +} -static void REGPARAM2 extendedkickmem2_lput (uaecptr addr, uae_u32 b) +static void REGPARAM2 extendedkickmem2b_lput(uaecptr addr, uae_u32 b) { if (currprefs.illegal_mem) - write_log (_T("Illegal extendedkickmem2 lput at %08x\n"), addr); + write_log(_T("Illegal extendedkickmem2b lput at %08x\n"), addr); } -static void REGPARAM2 extendedkickmem2_wput (uaecptr addr, uae_u32 b) +static void REGPARAM2 extendedkickmem2b_wput(uaecptr addr, uae_u32 b) { if (currprefs.illegal_mem) - write_log (_T("Illegal extendedkickmem2 wput at %08x\n"), addr); + write_log(_T("Illegal extendedkickmem2b wput at %08x\n"), addr); } -static void REGPARAM2 extendedkickmem2_bput (uaecptr addr, uae_u32 b) +static void REGPARAM2 extendedkickmem2b_bput(uaecptr addr, uae_u32 b) { if (currprefs.illegal_mem) - write_log (_T("Illegal extendedkickmem2 lput at %08x\n"), addr); + write_log(_T("Illegal extendedkickmem2b lput at %08x\n"), addr); } + /* Default memory access functions */ int REGPARAM2 default_check (uaecptr a, uae_u32 b) @@ -1281,11 +1307,18 @@ addrbank extendedkickmem_bank = { extendedkickmem_lget, extendedkickmem_wget, ABFLAG_ROM | ABFLAG_THREADSAFE | ABFLAG_CACHE_ENABLE_ALL | ABFLAG_DIRECTACCESS, 0, S_WRITE }; -addrbank extendedkickmem2_bank = { - extendedkickmem2_lget, extendedkickmem2_wget, extendedkickmem2_bget, - extendedkickmem2_lput, extendedkickmem2_wput, extendedkickmem2_bput, - extendedkickmem2_xlate, extendedkickmem2_check, NULL, _T("rom_a8"), _T("Extended 2nd Kickstart ROM"), - extendedkickmem2_lget, extendedkickmem2_wget, +addrbank extendedkickmem2a_bank = { + extendedkickmem2a_lget, extendedkickmem2a_wget, extendedkickmem2a_bget, + extendedkickmem2a_lput, extendedkickmem2a_wput, extendedkickmem2a_bput, + extendedkickmem2a_xlate, extendedkickmem2a_check, NULL, _T("rom_a8"), _T("Extended 2nd Kickstart ROM"), + extendedkickmem2a_lget, extendedkickmem2a_wget, + ABFLAG_ROM | ABFLAG_THREADSAFE | ABFLAG_CACHE_ENABLE_ALL | ABFLAG_DIRECTACCESS, 0, S_WRITE +}; +addrbank extendedkickmem2b_bank = { + extendedkickmem2b_lget, extendedkickmem2b_wget, extendedkickmem2b_bget, + extendedkickmem2b_lput, extendedkickmem2b_wput, extendedkickmem2b_bput, + extendedkickmem2b_xlate, extendedkickmem2b_check, NULL, _T("rom_b0"), _T("Extended 3nd Kickstart ROM"), + extendedkickmem2b_lget, extendedkickmem2b_wget, ABFLAG_ROM | ABFLAG_THREADSAFE | ABFLAG_CACHE_ENABLE_ALL | ABFLAG_DIRECTACCESS, 0, S_WRITE }; addrbank fakeuaebootrom_bank = { @@ -1804,13 +1837,18 @@ static int load_kickstart (void) if (size > ROM_SIZE_512) { maxsize = zfile_size(zf); singlebigrom = true; - extendedkickmem2_bank.reserved_size = size; - extendedkickmem2_bank.mask = extendedkickmem2_bank.allocated_size - 1; - extendedkickmem2_bank.start = size > 2 * ROM_SIZE_512 ? 0xa00000 : 0xa80000; - mapped_malloc(&extendedkickmem2_bank); - read_kickstart(f, extendedkickmem2_bank.baseaddr, size, 0, 1); + extendedkickmem2a_bank.reserved_size = 524288; + extendedkickmem2a_bank.mask = extendedkickmem2a_bank.allocated_size - 1; + extendedkickmem2a_bank.start = size > 2 * ROM_SIZE_512 ? 0xa00000 : 0xa80000; + mapped_malloc(&extendedkickmem2a_bank); + extendedkickmem2b_bank.reserved_size = 524288; + extendedkickmem2b_bank.mask = extendedkickmem2a_bank.allocated_size - 1; + extendedkickmem2a_bank.start = extendedkickmem2a_bank.start + 524288; + mapped_malloc(&extendedkickmem2a_bank); + read_kickstart(f, extendedkickmem2a_bank.baseaddr, 524288, 0, 1); + read_kickstart(f, extendedkickmem2b_bank.baseaddr, 524288, 0, 1); memset(kickmem_bank.baseaddr, 0, ROM_SIZE_512); - memcpy(kickmem_bank.baseaddr, extendedkickmem2_bank.baseaddr, 0xd0); + memcpy(kickmem_bank.baseaddr, extendedkickmem2a_bank.baseaddr, 0xd0); memcpy(kickmem_bank.baseaddr + ROM_SIZE_512 - 20, romend, sizeof(romend)); kickstart_fix_checksum(kickmem_bank.baseaddr, ROM_SIZE_512); } @@ -1863,14 +1901,18 @@ static int load_kickstart (void) extendedkickmem_bank.mask = extendedkickmem_bank.allocated_size - 1; } if (filesize > ROM_SIZE_512 * 2) { - extendedkickmem2_bank.reserved_size = ROM_SIZE_512 * 2; - mapped_malloc(&extendedkickmem2_bank); + extendedkickmem2a_bank.reserved_size = ROM_SIZE_512; + mapped_malloc(&extendedkickmem2a_bank); + extendedkickmem2b_bank.reserved_size = ROM_SIZE_512; + mapped_malloc(&extendedkickmem2b_bank); zfile_fseek(f, extpos + ROM_SIZE_512, SEEK_SET); - read_kickstart(f, extendedkickmem2_bank.baseaddr, ROM_SIZE_512, 0, 1); + read_kickstart(f, extendedkickmem2a_bank.baseaddr, ROM_SIZE_512, 0, 1); zfile_fseek(f, extpos + ROM_SIZE_512 * 2, SEEK_SET); - read_kickstart(f, extendedkickmem2_bank.baseaddr + ROM_SIZE_512, ROM_SIZE_512, 0, 1); - extendedkickmem2_bank.mask = extendedkickmem2_bank.allocated_size - 1; - extendedkickmem2_bank.start = 0xa80000; + read_kickstart(f, extendedkickmem2b_bank.baseaddr, ROM_SIZE_512, 0, 1); + extendedkickmem2a_bank.mask = extendedkickmem2a_bank.allocated_size - 1; + extendedkickmem2a_bank.start = 0xa80000; + extendedkickmem2b_bank.mask = extendedkickmem2b_bank.allocated_size - 1; + extendedkickmem2b_bank.start = 0xb00000; } } } @@ -2583,13 +2625,15 @@ static void restore_roms(void) a1000_bootrom = 0; a1000_kickstart_mode = 0; - memcpy (currprefs.romfile, changed_prefs.romfile, sizeof currprefs.romfile); - memcpy (currprefs.romextfile, changed_prefs.romextfile, sizeof currprefs.romextfile); + memcpy(currprefs.romfile, changed_prefs.romfile, sizeof currprefs.romfile); + memcpy(currprefs.romextfile, changed_prefs.romextfile, sizeof currprefs.romextfile); need_hardreset = true; - mapped_free (&extendedkickmem_bank); - mapped_free (&extendedkickmem2_bank); + mapped_free(&extendedkickmem_bank); + mapped_free(&extendedkickmem2a_bank); + mapped_free(&extendedkickmem2b_bank); extendedkickmem_bank.reserved_size = 0; - extendedkickmem2_bank.reserved_size = 0; + extendedkickmem2a_bank.reserved_size = 0; + extendedkickmem2b_bank.reserved_size = 0; extendedkickmem_type = 0; load_extendedkickstart (currprefs.romextfile, 0); load_extendedkickstart (currprefs.romextfile2, EXTENDED_ROM_CDTV); @@ -2725,7 +2769,7 @@ void memory_reset (void) if ((cloanto_rom || extendedkickmem_bank.allocated_size) && currprefs.maprom && currprefs.maprom < 0x01000000) { currprefs.maprom = changed_prefs.maprom = 0x00a80000; - if (extendedkickmem2_bank.allocated_size) // can't do if 2M ROM + if (extendedkickmem2a_bank.allocated_size || extendedkickmem2b_bank.allocated_size) // can't do if 2M ROM currprefs.maprom = changed_prefs.maprom = 0; } @@ -2811,7 +2855,7 @@ void memory_reset (void) map_banks_set(&kickmem_bank, 0xF8, 8, 0); if (currprefs.maprom) { if (!cpuboard_maprom()) - map_banks_set(&kickram_bank, currprefs.maprom >> 16, extendedkickmem2_bank.allocated_size ? 32 : (extendedkickmem_bank.allocated_size ? 16 : 8), 0); + map_banks_set(&kickram_bank, currprefs.maprom >> 16, extendedkickmem2a_bank.allocated_size ? 32 : (extendedkickmem_bank.allocated_size ? 16 : 8), 0); } /* map beta Kickstarts at 0x200000/0xC00000/0xF00000 */ if (kickmem_bank.baseaddr[0] == 0x11 && kickmem_bank.baseaddr[2] == 0x4e && kickmem_bank.baseaddr[3] == 0xf9 && kickmem_bank.baseaddr[4] == 0x00) { @@ -2866,8 +2910,11 @@ void memory_reset (void) map_banks(&kickmem_bank, 0xE0, 8, 0); } if (currprefs.cs_ksmirror_a8) { - if (extendedkickmem2_bank.allocated_size) { - map_banks_set(&extendedkickmem2_bank, extendedkickmem2_bank.start >> 16, extendedkickmem2_bank.allocated_size >> 16, 0); + if (extendedkickmem2a_bank.allocated_size && extendedkickmem2a_bank.baseaddr) { + map_banks_set(&extendedkickmem2a_bank, extendedkickmem2a_bank.start >> 16, extendedkickmem2a_bank.allocated_size >> 16, 0); + if (extendedkickmem2b_bank.allocated_size && extendedkickmem2b_bank.baseaddr) { + map_banks_set(&extendedkickmem2b_bank, extendedkickmem2b_bank.start >> 16, extendedkickmem2b_bank.allocated_size >> 16, 0); + } } else { struct romdata *rd = getromdatabypath (currprefs.cartfile); if (!rd || rd->id != 63) { @@ -2878,8 +2925,11 @@ void memory_reset (void) map_banks(&kickmem_bank, 0xa8, 8, 0); } } - } else if (extendedkickmem2_bank.allocated_size && extendedkickmem2_bank.baseaddr) { - map_banks_set(&extendedkickmem2_bank, extendedkickmem2_bank.start >> 16, extendedkickmem2_bank.allocated_size >> 16, 0); + } else if (extendedkickmem2a_bank.allocated_size && extendedkickmem2a_bank.baseaddr) { + map_banks_set(&extendedkickmem2a_bank, extendedkickmem2a_bank.start >> 16, extendedkickmem2a_bank.allocated_size >> 16, 0); + if (extendedkickmem2b_bank.allocated_size && extendedkickmem2b_bank.baseaddr) { + map_banks_set(&extendedkickmem2b_bank, extendedkickmem2b_bank.start >> 16, extendedkickmem2b_bank.allocated_size >> 16, 0); + } } #ifdef ARCADIA @@ -2935,8 +2985,10 @@ void memory_init (void) kickmem_bank.baseaddr = NULL; extendedkickmem_bank.baseaddr = NULL; extendedkickmem_bank.reserved_size = 0; - extendedkickmem2_bank.baseaddr = NULL; - extendedkickmem2_bank.reserved_size = 0; + extendedkickmem2a_bank.baseaddr = NULL; + extendedkickmem2a_bank.reserved_size = 0; + extendedkickmem2b_bank.baseaddr = NULL; + extendedkickmem2b_bank.reserved_size = 0; extendedkickmem_type = 0; chipmem_bank.baseaddr = 0; mem25bit_bank.reserved_size = mem25bit_bank.reserved_size = 0; -- 2.47.3