sms, map 3D glasses to 2D
authorkub <derkub@gmail.com>
Fri, 25 Oct 2024 16:37:20 +0000 (18:37 +0200)
committerkub <derkub@gmail.com>
Fri, 25 Oct 2024 16:37:33 +0000 (18:37 +0200)
pico/pico_int.h
pico/sms.c
platform/common/emu.c

index 0c71233..198eea4 100644 (file)
@@ -353,6 +353,7 @@ struct PicoMisc
 #define PMS_HW_JAP     0x4   // japanese system\r
 #define PMS_HW_FM      0x8   // FM sound\r
 #define PMS_HW_TMS     0x10  // assume TMS9918\r
+#define PMS_HW_3D      0x20  // 3D glasses\r
 #define PMS_HW_FMUSED  0x80  // FM sound accessed\r
 \r
 #define PMS_MAP_AUTO   0\r
index 0c2ee63..fe06f63 100644 (file)
@@ -633,6 +633,13 @@ static u32 gg_smsmode[] = { // cf https://www.smspower.org/Tags/SMS-GG
   0x4f813028 /* Tesserae */
 };
 
+// TMR product codes and hardware type for known games using 3-D glasses
+static u32 three_dee[] = {
+  0x4f008001 /* Missile Def. */ , 0x40008007 /* Out Run 3-D */,
+  0x40008006 /* Poseidon Wars */, 0x40008004 /* Space Harrier */,
+  0x40008002 /* Zaxxon 3-D */   , 0x4fff8793 /* Maze Hunter */
+};
+
 void PicoResetMS(void)
 {
   unsigned tmr;
@@ -662,7 +669,7 @@ void PicoResetMS(void)
     if (!memcmp(Pico.rom + tmr-16, "TMR SEGA", 8)) {
       hw = Pico.rom[tmr-1] >> 4;
       id = CPU_LE4(*(u32 *)&Pico.rom[tmr-4]);
-      ck = *(u16 *)&Pico.rom[tmr-6] | (id&0xf0000000) | 0xfff0000;
+      ck = (CPU_LE4(*(u32 *)&Pico.rom[tmr-8])>>16) | (id&0xf0000000) | 0xfff0000;
 
       if (!PicoIn.hwSelect && !PicoIn.AHW && hw && ((id+1)&0xfffe) != 0) {
         if (hw >= 0x5 && hw < 0x8)
@@ -690,6 +697,11 @@ void PicoResetMS(void)
           Pico.m.hardware &= ~PMS_HW_FM; // incompatible with FM
           break;
         }
+      for (i = 0; i < sizeof(three_dee)/sizeof(*three_dee); i++)
+        if ((id == three_dee[i] || ck == three_dee[i])) {
+          Pico.m.hardware |= PMS_HW_3D; // uses 3-D glasses
+          break;
+        }
       break;
     }
   }
index cd0c2e5..e2b540b 100644 (file)
@@ -1620,6 +1620,12 @@ void emu_loop(void)
                }\r
 \r
                emu_update_input();\r
+\r
+               // 3D glasses\r
+               skip |= (PicoIn.AHW & PAHW_SMS) &&\r
+                       (Pico.m.hardware & PMS_HW_3D) &&\r
+                       (PicoMem.zram[0x1ffb] & 1);\r
+\r
                if (skip) {\r
                        int do_audio = diff > -target_frametime * 2;\r
                        PicoIn.skipFrame = do_audio ? 1 : 2;\r