starting SMS work
[picodrive.git] / pico / cart.c
index 44a1a25..11484ff 100644 (file)
@@ -13,7 +13,7 @@
 #include "../unzip/unzip_stream.h"\r
 \r
 \r
-static char *rom_exts[] = { "bin", "gen", "smd", "iso" };\r
+static const char *rom_exts[] = { "bin", "gen", "smd", "iso", "sms", "gg", "sg" };\r
 \r
 void (*PicoCartUnloadHook)(void) = NULL;\r
 \r
@@ -99,7 +99,10 @@ pm_file *pm_open(const char *path)
         if (zipentry->uncompressed_size >= 128*1024) goto found_rom_zip;\r
         if (strlen(zipentry->name) < 5) continue;\r
 \r
-        ext = zipentry->name+strlen(zipentry->name)-3;\r
+        ext = zipentry->name + strlen(zipentry->name) - 2;\r
+        if (ext[-1] != '.') ext--;\r
+        if (ext[-1] != '.') ext--;\r
+\r
         for (i = 0; i < sizeof(rom_exts)/sizeof(rom_exts[0]); i++)\r
           if (strcasecmp(ext, rom_exts[i]) == 0) goto found_rom_zip;\r
       }\r
@@ -437,7 +440,7 @@ static unsigned char *PicoCartAlloc(int filesize)
   return rom;\r
 }\r
 \r
-int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)\r
+int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize,int is_sms)\r
 {\r
   unsigned char *rom=NULL; int size, bytes_read;\r
   if (f==NULL) return 1;\r
@@ -478,19 +481,22 @@ int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)
     return 3;\r
   }\r
 \r
-  // maybe we are loading MegaCD BIOS?\r
-  if (!(PicoAHW & PAHW_MCD) && size == 0x20000 && (!strncmp((char *)rom+0x124, "BOOT", 4) ||\r
-       !strncmp((char *)rom+0x128, "BOOT", 4))) {\r
-    PicoAHW |= PAHW_MCD;\r
-    rom = cd_realloc(rom, size);\r
-  }\r
+  if (!is_sms)\r
+  {\r
+    // maybe we are loading MegaCD BIOS?\r
+    if (!(PicoAHW & PAHW_MCD) && size == 0x20000 && (!strncmp((char *)rom+0x124, "BOOT", 4) ||\r
+         !strncmp((char *)rom+0x128, "BOOT", 4))) {\r
+      PicoAHW |= PAHW_MCD;\r
+      rom = cd_realloc(rom, size);\r
+    }\r
 \r
-  // Check for SMD:\r
-  if (size >= 0x4200 && (size&0x3fff)==0x200 &&\r
-      ((rom[0x2280] == 'S' && rom[0x280] == 'E') || (rom[0x280] == 'S' && rom[0x2281] == 'E'))) {\r
-    DecodeSmd(rom,size); size-=0x200; // Decode and byteswap SMD\r
+    // Check for SMD:\r
+    if (size >= 0x4200 && (size&0x3fff)==0x200 &&\r
+        ((rom[0x2280] == 'S' && rom[0x280] == 'E') || (rom[0x280] == 'S' && rom[0x2281] == 'E'))) {\r
+      DecodeSmd(rom,size); size-=0x200; // Decode and byteswap SMD\r
+    }\r
+    else Byteswap(rom,size); // Just byteswap\r
   }\r
-  else Byteswap(rom,size); // Just byteswap\r
 \r
   if (prom)  *prom=rom;\r
   if (psize) *psize=size;\r
@@ -520,7 +526,7 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
     PicoCartUnloadHook = NULL;\r
   }\r
 \r
-  PicoAHW &= PAHW_MCD;\r
+  PicoAHW &= PAHW_MCD|PAHW_SMS;\r
 \r
   PicoMemResetHooks();\r
   PicoDmaHook = NULL;\r
@@ -531,7 +537,7 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
 \r
   PicoMemReset();\r
 \r
-  if (!(PicoAHW & PAHW_MCD))\r
+  if (!(PicoAHW & (PAHW_MCD|PAHW_SMS)))\r
     PicoCartDetect();\r
 \r
   // setup correct memory map for loaded ROM\r
@@ -543,15 +549,25 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
     case PAHW_SVP:  PicoMemSetup(); break;\r
     case PAHW_MCD:  PicoMemSetupCD(); break;\r
     case PAHW_PICO: PicoMemSetupPico(); break;\r
+    case PAHW_SMS:  PicoMemSetupMS(); break;\r
   }\r
   PicoMemReset();\r
 \r
-  PicoPower();\r
+  if (PicoAHW & PAHW_SMS)\r
+    PicoPowerMS();\r
+  else\r
+    PicoPower();\r
+\r
   return 0;\r
 }\r
 \r
 void PicoCartUnload(void)\r
 {\r
+  if (PicoCartUnloadHook != NULL) {\r
+    PicoCartUnloadHook();\r
+    PicoCartUnloadHook = NULL;\r
+  }\r
+\r
   if (Pico.rom != NULL) {\r
     SekFinishIdleDet();\r
     free(Pico.rom);\r