sms, improve gg detection (zip, rom header)
authorkub <derkub@gmail.com>
Fri, 15 Oct 2021 17:22:01 +0000 (19:22 +0200)
committerkub <derkub@gmail.com>
Fri, 15 Oct 2021 17:22:01 +0000 (19:22 +0200)
pico/cart.c
pico/media.c
pico/sms.c

index ed76615..1b15a45 100644 (file)
@@ -243,6 +243,7 @@ zip_failed:
     file->param = cso;\r
     file->size  = cso->header.total_bytes;\r
     file->type  = PMT_CSO;\r
+    strncpy(file->ext, ext, sizeof(file->ext) - 1);\r
     return file;\r
 \r
 cso_failed:\r
index d7e91a0..d6d136b 100644 (file)
@@ -259,7 +259,6 @@ enum media_type_e PicoLoadMedia(const char *filename,
   }
 
   ret = PicoCartLoad(rom, &rom_data, &rom_size, (PicoIn.AHW & PAHW_SMS) ? 1 : 0);
-  pm_close(rom);
   if (ret != 0) {
     if      (ret == 2) lprintf("Out of memory\n");
     else if (ret == 3) lprintf("Read failed\n");
@@ -299,7 +298,7 @@ enum media_type_e PicoLoadMedia(const char *filename,
 
   // simple test for GG. Do this here since m.hardware is nulled in Insert
   if (PicoIn.AHW & PAHW_SMS) {
-    if (strstr(filename,".gg")) {
+    if (!strcmp(rom->ext,"gg")) {
       Pico.m.hardware |= 0x1;
       lprintf("detected GG ROM\n");
     } else
@@ -322,6 +321,8 @@ enum media_type_e PicoLoadMedia(const char *filename,
     PicoSetInputDevice(0, PICO_INPUT_PAD_6BTN);
 
 out:
+  if (rom)
+    pm_close(rom);
   if (rom_data)
     free(rom_data);
   return media_type;
index 6c8ce35..78fce13 100644 (file)
@@ -323,6 +323,7 @@ void PicoResetMS(void)
 void PicoPowerMS(void)
 {
   int s, tmp;
+  unsigned tmr;
 
   memset(&PicoMem,0,sizeof(PicoMem));
   memset(&Pico.video,0,sizeof(Pico.video));
@@ -339,6 +340,15 @@ void PicoPowerMS(void)
   tmp = 1 << s;
   bank_mask = (tmp - 1) >> 14;
 
+  // check if the ROM header contains more system information to detect GG
+  for (tmr = 0x2000; tmr < 0xbfff && tmr <= Pico.romsize; tmr *= 2) {
+    if (!memcmp(Pico.rom + tmr-16, "TMR SEGA", 8)) {
+      if (Pico.rom[tmr-1] >= 0x50 && Pico.rom[tmr-1] < 0x80)
+        Pico.m.hardware |= 0x1;
+      break;
+    }
+  }
+
   PicoReset();
 }