reverted useless threaded buffering code
[picodrive.git] / Pico / Cart.c
index a19dcc8..25bb961 100644 (file)
@@ -15,6 +15,8 @@
 \r
 static char *rom_exts[] = { "bin", "gen", "smd", "iso" };\r
 \r
+void (*PicoCartUnloadHook)(void) = NULL;\r
+\r
 void (*PicoCartLoadProgressCB)(int percent) = NULL;\r
 void (*PicoCDLoadProgressCB)(int percent) = NULL; // handled in Pico/cd/cd_file.c\r
 \r
@@ -481,7 +483,7 @@ int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)
   return 0;\r
 }\r
 \r
-// Insert/remove a cartridge:\r
+// Insert a cartridge:\r
 int PicoCartInsert(unsigned char *rom,unsigned int romsize)\r
 {\r
   // notaz: add a 68k "jump one op back" opcode to the end of ROM.\r
@@ -493,21 +495,39 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
   Pico.rom=rom;\r
   Pico.romsize=romsize;\r
 \r
+  if (PicoCartUnloadHook != NULL) {\r
+    PicoCartUnloadHook();\r
+    PicoCartUnloadHook = NULL;\r
+  }\r
+\r
+  PicoMemResetHooks();\r
+  PicoDmaHook = NULL;\r
+  PicoResetHook = NULL;\r
+  PicoLineHook = NULL;\r
+  PicoLoadStateHook = NULL;\r
+  carthw_chunks = NULL;\r
+\r
+  PicoMemReset();\r
+\r
+  if (!(PicoMCD & 1))\r
+    PicoCartDetect();\r
+\r
   // setup correct memory map for loaded ROM\r
+  // call PicoMemReset again due to possible memmap change\r
   if (PicoMCD & 1)\r
        PicoMemSetupCD();\r
   else PicoMemSetup();\r
   PicoMemReset();\r
 \r
-  if (!(PicoMCD & 1))\r
-    PicoCartDetect();\r
-\r
   return PicoReset(1);\r
 }\r
 \r
-int PicoUnloadCart(unsigned char* romdata)\r
+int PicoCartUnload(void)\r
 {\r
-  free(romdata);\r
+  if (Pico.rom != NULL) {\r
+    free(Pico.rom);\r
+    Pico.rom=NULL;\r
+  }\r
   return 0;\r
 }\r
 \r
@@ -526,7 +546,10 @@ static int name_cmp(const char *name)
   return rom_strcmp(0x150, name);\r
 }\r
 \r
-/* various cart-specific things, which can't be handled by generic code */\r
+/*\r
+ * various cart-specific things, which can't be handled by generic code\r
+ * (maybe I should start using CRC for this stuff?)\r
+ */\r
 void PicoCartDetect(void)\r
 {\r
   int sram_size = 0, csum;\r
@@ -546,10 +569,12 @@ void PicoCartDetect(void)
       Pico.m.sram_reg |= 4;\r
     } else {\r
       // normal SRAM\r
-      SRam.start = PicoRead32(0x1B4) & 0xFFFF00;\r
+      SRam.start = PicoRead32(0x1B4) & ~0xff;\r
       SRam.end   = PicoRead32(0x1B8) | 1;\r
       sram_size  = SRam.end - SRam.start + 1;\r
     }\r
+    SRam.start &= ~0xff000000;\r
+    SRam.end   &= ~0xff000000;\r
     Pico.m.sram_reg |= 0x10; // SRAM was detected\r
   }\r
   if (sram_size <= 0)\r
@@ -622,10 +647,35 @@ void PicoCartDetect(void)
     SRam.eeprom_bit_out= 7;\r
   }\r
 \r
+  // SVP detection\r
+  else if (name_cmp("Virtua Racing") == 0 ||\r
+           name_cmp("VIRTUA RACING") == 0)\r
+  {\r
+    PicoSVPStartup();\r
+  }\r
+\r
+  // Detect 12-in-1 mapper\r
+  else if ((name_cmp("ROBOCOP 3") == 0 && Pico.romsize == 0x200000) ||\r
+    (rom_strcmp(0x160, "FLICKY") == 0 && Pico.romsize >= 0x200000))\r
+  {\r
+    carthw_12in1_startup();\r
+  }\r
+\r
+  // Realtec mapper\r
+  else if (Pico.romsize == 512*1024 && (\r
+    rom_strcmp(0x94, "THE EARTH DEFEND") == 0 ||\r
+    rom_strcmp(0xfe, "WISEGAME 11-03-1993") == 0 || // Funny World\r
+    rom_strcmp(0x95, "MALLET LEGEND ") == 0)) // Whac-A-Critter\r
+  {\r
+    carthw_realtec_startup();\r
+  }\r
+\r
   // Some games malfunction if SRAM is not filled with 0xff\r
   if (name_cmp("DINO DINI'S SOCCER") == 0 ||\r
       name_cmp("MICRO MACHINES II") == 0)\r
+  {\r
     memset(SRam.data, 0xff, sram_size);\r
+  }\r
 \r
   // Unusual region 'code'\r
   if (rom_strcmp(0x1f0, "EUROPE") == 0)\r