#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
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;
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)
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;
}
}
}\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