]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Map ROM reload support.
authorToni Wilen <twilen@winuae.net>
Sun, 12 Oct 2014 15:40:42 +0000 (18:40 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 12 Oct 2014 15:40:42 +0000 (18:40 +0300)
cpuboard.cpp
memory.cpp

index 97eb0f2749ff6eb979ba0c6c6a3c3a7576e36d34..f27c5debee4dab7f29a61dc389ebcb5470e32780 100644 (file)
@@ -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;
index 16e110aa2c7d3b99faaaad21ea5c08c74baa7378..0a9ec0bcff44a443b0c005e670675d7515601f4f 100644 (file)
@@ -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