From 0c9150e491c15880381c410b33df054fc19c2baf Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 12 Oct 2014 18:40:42 +0300 Subject: [PATCH] Map ROM reload support. --- cpuboard.cpp | 32 ++++++++---- memory.cpp | 139 ++++++++++++++++++++++++++++----------------------- 2 files changed, 97 insertions(+), 74 deletions(-) diff --git a/cpuboard.cpp b/cpuboard.cpp index 97eb0f27..f27c5deb 100644 --- a/cpuboard.cpp +++ b/cpuboard.cpp @@ -202,6 +202,7 @@ bool ppc_interrupt(int new_m68k_ipl) return false; if (!m68kint && iplemu && active) { + uae_u8 ppcipl = (~io_reg[CSIII_REG_IPL_EMU]) & P5_PPC_IPL_MASK; if (new_m68k_ipl < 0) new_m68k_ipl = 0; @@ -713,12 +714,12 @@ static void REGPARAM2 blizzarde8_wput(uaecptr addr, uae_u32 b) if (is_a2630()) { addr &= 65535; if (addr == 0x0040) { - write_log(_T("A2630 write %04x\n"), b); + write_log(_T("A2630 write %04x PC=%08x\n"), b, M68K_GETPC); a2630_io = b; // bit 0: unmap 0x000000 // bit 1: unmap 0xf80000 if (b & 2) { - map_banks(&kickmem_bank, 0xf80000 >> 16, 65536 >> 16, 0); + map_banks(&kickmem_bank, 0xf80000 >> 16, 131072 >> 16, 0); write_log(_T("A2630 boot rom unmapped\n")); } // bit 2: autoconfig region enable @@ -786,16 +787,24 @@ static uae_u32 REGPARAM2 blizzarde8_lget(uaecptr addr) static void blizzard_copymaprom(void) { - uae_u8 *src = get_real_address(BLIZZARD_MAPROM_BASE); - uae_u8 *dst = kickmem_bank.baseaddr; - protect_roms(false); - memcpy(dst, src, 524288); - protect_roms(true); - set_roms_modified(); + if (!maprom_state) { + reload_roms(); + } else { + uae_u8 *src = get_real_address(BLIZZARD_MAPROM_BASE); + if (src) { + uae_u8 *dst = kickmem_bank.baseaddr; + protect_roms(false); + memcpy(dst, src, 524288); + protect_roms(true); + set_roms_modified(); + } + } } static void cyberstorm_copymaprom(void) { - if (blizzardmaprom_bank.baseaddr) { + if (!maprom_state) { + reload_roms(); + } else if (blizzardmaprom_bank.baseaddr) { uae_u8 *src = blizzardmaprom_bank.baseaddr; uae_u8 *dst = kickmem_bank.baseaddr; protect_roms(false); @@ -832,8 +841,7 @@ void cpuboard_rethink(void) if (is_csmk3() || is_blizzardppc()) { if (!(io_reg[CSIII_REG_IRQ] & (P5_IRQ_SCSI_EN | P5_IRQ_SCSI))) { INTREQ_0(0x8000 | 0x0008); - } - if (!(io_reg[CSIII_REG_IRQ] & (P5_IRQ_PPC_1 | P5_IRQ_PPC_2))) { + } else if (!(io_reg[CSIII_REG_IRQ] & (P5_IRQ_PPC_1 | P5_IRQ_PPC_2))) { INTREQ_0(0x8000 | 0x0008); } check_ppc_int_lvl(); @@ -1001,6 +1009,7 @@ static void REGPARAM2 blizzardio_bput(uaecptr addr, uae_u32 v) write_log(_T("BPPC: maprom disabled\n")); maprom_state = 0; blizzardppc_maprom(); + cyberstorm_copymaprom(); } } addr /= 8; @@ -1089,6 +1098,7 @@ static void REGPARAM2 blizzardio_bput(uaecptr addr, uae_u32 v) } if (!(io_reg[CSIII_REG_SHADOW] & P5_SELF_RESET)) { if (!(regval & P5_AMIGA_RESET)) { + uae_ppc_cpu_stop(); uae_reset(0, 0); write_log(_T("CS: Amiga Reset\n")); io_reg[addr] |= P5_AMIGA_RESET; diff --git a/memory.cpp b/memory.cpp index 16e110aa..0a9ec0bc 100644 --- a/memory.cpp +++ b/memory.cpp @@ -2153,6 +2153,79 @@ void memory_clear (void) cpuboard_clear(); } +static void restore_roms(void) +{ + roms_modified = false; + protect_roms (false); + write_log (_T("ROM loader.. (%s)\n"), currprefs.romfile); + kickstart_rom = 1; + a1000_handle_kickstart (0); + xfree (a1000_bootrom); + 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); + need_hardreset = true; + mapped_free (&extendedkickmem_bank); + mapped_free (&extendedkickmem2_bank); + extendedkickmem_bank.allocated = 0; + extendedkickmem2_bank.allocated = 0; + extendedkickmem_type = 0; + load_extendedkickstart (currprefs.romextfile, 0); + load_extendedkickstart (currprefs.romextfile2, EXTENDED_ROM_CDTV); + kickmem_bank.mask = ROM_SIZE_512 - 1; + if (!load_kickstart ()) { + if (_tcslen (currprefs.romfile) > 0) { + error_log (_T("Failed to open '%s'\n"), currprefs.romfile); + notify_user (NUMSG_NOROM); + } + load_kickstart_replacement (); + } else { + struct romdata *rd = getromdatabydata (kickmem_bank.baseaddr, kickmem_bank.allocated); + if (rd) { + write_log (_T("Known ROM '%s' loaded\n"), rd->name); + if ((rd->cpu & 8) && changed_prefs.cpu_model < 68030) { + notify_user (NUMSG_KS68030PLUS); + uae_restart (-1, NULL); + } else if ((rd->cpu & 3) == 3 && changed_prefs.cpu_model != 68030) { + notify_user (NUMSG_KS68030); + uae_restart (-1, NULL); + } else if ((rd->cpu & 3) == 1 && changed_prefs.cpu_model < 68020) { + notify_user (NUMSG_KS68EC020); + uae_restart (-1, NULL); + } else if ((rd->cpu & 3) == 2 && (changed_prefs.cpu_model < 68020 || changed_prefs.address_space_24)) { + notify_user (NUMSG_KS68020); + uae_restart (-1, NULL); + } + if (rd->cloanto) + cloanto_rom = 1; + kickstart_rom = 0; + if ((rd->type & (ROMTYPE_SPECIALKICK | ROMTYPE_KICK)) == ROMTYPE_KICK) + kickstart_rom = 1; + if ((rd->cpu & 4) && currprefs.cs_compatible) { + /* A4000 ROM = need ramsey, gary and ide */ + if (currprefs.cs_ramseyrev < 0) + changed_prefs.cs_ramseyrev = currprefs.cs_ramseyrev = 0x0f; + changed_prefs.cs_fatgaryrev = currprefs.cs_fatgaryrev = 0; + if (currprefs.cs_ide != IDE_A4000) + changed_prefs.cs_ide = currprefs.cs_ide = -1; + } + } else { + write_log (_T("Unknown ROM '%s' loaded\n"), currprefs.romfile); + } + } + patch_kick (); + write_log (_T("ROM loader end\n")); + protect_roms (true); +} + +void reload_roms(void) +{ + if (roms_modified) + restore_roms(); +} + void memory_reset (void) { int bnk, bnk_end; @@ -2194,69 +2267,7 @@ void memory_reset (void) || _tcscmp (currprefs.romfile, changed_prefs.romfile) != 0 || _tcscmp (currprefs.romextfile, changed_prefs.romextfile) != 0) { - roms_modified = false; - protect_roms (false); - write_log (_T("ROM loader.. (%s)\n"), currprefs.romfile); - kickstart_rom = 1; - a1000_handle_kickstart (0); - xfree (a1000_bootrom); - 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); - need_hardreset = true; - mapped_free (&extendedkickmem_bank); - mapped_free (&extendedkickmem2_bank); - extendedkickmem_bank.allocated = 0; - extendedkickmem2_bank.allocated = 0; - extendedkickmem_type = 0; - load_extendedkickstart (currprefs.romextfile, 0); - load_extendedkickstart (currprefs.romextfile2, EXTENDED_ROM_CDTV); - kickmem_bank.mask = ROM_SIZE_512 - 1; - if (!load_kickstart ()) { - if (_tcslen (currprefs.romfile) > 0) { - error_log (_T("Failed to open '%s'\n"), currprefs.romfile); - notify_user (NUMSG_NOROM); - } - load_kickstart_replacement (); - } else { - struct romdata *rd = getromdatabydata (kickmem_bank.baseaddr, kickmem_bank.allocated); - if (rd) { - write_log (_T("Known ROM '%s' loaded\n"), rd->name); - if ((rd->cpu & 8) && changed_prefs.cpu_model < 68030) { - notify_user (NUMSG_KS68030PLUS); - uae_restart (-1, NULL); - } else if ((rd->cpu & 3) == 3 && changed_prefs.cpu_model != 68030) { - notify_user (NUMSG_KS68030); - uae_restart (-1, NULL); - } else if ((rd->cpu & 3) == 1 && changed_prefs.cpu_model < 68020) { - notify_user (NUMSG_KS68EC020); - uae_restart (-1, NULL); - } else if ((rd->cpu & 3) == 2 && (changed_prefs.cpu_model < 68020 || changed_prefs.address_space_24)) { - notify_user (NUMSG_KS68020); - uae_restart (-1, NULL); - } - if (rd->cloanto) - cloanto_rom = 1; - kickstart_rom = 0; - if ((rd->type & (ROMTYPE_SPECIALKICK | ROMTYPE_KICK)) == ROMTYPE_KICK) - kickstart_rom = 1; - if ((rd->cpu & 4) && currprefs.cs_compatible) { - /* A4000 ROM = need ramsey, gary and ide */ - if (currprefs.cs_ramseyrev < 0) - changed_prefs.cs_ramseyrev = currprefs.cs_ramseyrev = 0x0f; - changed_prefs.cs_fatgaryrev = currprefs.cs_fatgaryrev = 0; - if (currprefs.cs_ide != IDE_A4000) - changed_prefs.cs_ide = currprefs.cs_ide = -1; - } - } else { - write_log (_T("Unknown ROM '%s' loaded\n"), currprefs.romfile); - } - } - patch_kick (); - write_log (_T("ROM loader end\n")); - protect_roms (true); + restore_roms(); } if ((cloanto_rom || extendedkickmem_bank.allocated) && currprefs.maprom && currprefs.maprom < 0x01000000) { @@ -2321,6 +2332,8 @@ void memory_reset (void) } #endif #ifdef CDTV + if (currprefs.cs_cdtvcr) + map_banks(&cdtvcr_bank, 0xB8, 1, 0); if (currprefs.cs_cdtvcd) cdtv_check_banks (); #endif -- 2.47.3