core+platforms, add SMS option to select TMS palette for gfx modes 0-3
authorkub <derkub@gmail.com>
Sat, 13 Jan 2024 15:31:43 +0000 (16:31 +0100)
committerkub <derkub@gmail.com>
Sat, 13 Jan 2024 15:31:43 +0000 (16:31 +0100)
pico/mode4.c
pico/pico.h
pico/pico_int.h
platform/common/menu_pico.c
platform/common/menu_pico.h
platform/libretro/libretro.c
platform/libretro/libretro_core_options.h

index 78108ec..b396af6 100644 (file)
@@ -741,6 +741,10 @@ void PicoFrameStartSMS(void)
     Pico.m.dirtyPal = 1;
   }
 
+  Pico.m.hardware &= ~PMS_HW_TMS;
+  if (PicoIn.tmsPalette || (PicoIn.AHW & (PAHW_SG|PAHW_SC)))
+    Pico.m.hardware |= PMS_HW_TMS;
+
   // Copy LCD enable flag for easier handling
   Pico.m.hardware &= ~PMS_HW_LCD;
   if ((PicoIn.opt & POPT_EN_GG_LCD) && (PicoIn.AHW & PAHW_GG)) {
@@ -886,7 +890,7 @@ void PicoDoHighPal555SMS(void)
    * hence GG/SMS/TMS can all be handled the same here */
   for (j = cnt; j > 0; j--) {
     if (!(Pico.video.reg[0] & 0x4)) // fixed palette in TMS modes
-      spal = (u32 *)tmspal + (PicoIn.AHW & (PAHW_SG|PAHW_SC) ? 16/2:0);
+      spal = (u32 *)tmspal + (Pico.m.hardware & PMS_HW_TMS ? 16/2:0);
     for (i = 0x20/2; i > 0; i--, spal++, dpal++) { 
       t = *spal;
 #if defined(USE_BGR555)
index f17d93d..e45540c 100644 (file)
@@ -116,6 +116,7 @@ typedef struct PicoInterface
        unsigned short autoRgnOrder;   // packed priority list of regions, for example 0x148 means this detection order: EUR, USA, JAP\r
        unsigned int hwSelect;         // hardware preselected via option menu\r
        unsigned int mapper;           // mapper selection for SMS, 0 = auto\r
+       unsigned int tmsPalette;       // palette used by SMS in TMS graphic modes\r
 \r
        unsigned short quirks;         // game-specific quirks: PQUIRK_*\r
        unsigned short overclockM68k;  // overclock the emulated 68k, in %\r
index 0d33682..9ccfddb 100644 (file)
@@ -346,7 +346,8 @@ struct PicoMisc
 #define PMS_HW_LCD     0x2   // GG LCD\r
 #define PMS_HW_JAP     0x4   // japanese system\r
 #define PMS_HW_FM      0x8   // FM sound\r
-#define PMS_HW_FMUSED  0x10  // FM sound accessed\r
+#define PMS_HW_TMS     0x10  // assume TMS9918\r
+#define PMS_HW_FMUSED  0x80  // FM sound accessed\r
 \r
 #define PMS_MAP_AUTO   0\r
 #define PMS_MAP_SEGA   1\r
index 4312bf8..1492738 100644 (file)
@@ -577,10 +577,13 @@ static int menu_loop_32x_options(int id, int keys)
 static const char *sms_hardwares[] = { "auto", "Game Gear", "Master System", "SG-1000", "SC-3000", NULL };
 static const char *gg_ghosting_opts[] = { "OFF", "weak", "normal", NULL };
 static const char *sms_mappers[] = { "auto", "Sega", "Codemasters", "Korea", "Korea MSX", "Korea X-in-1", "Korea 4-Pak", "Korea Janggun", "Korea Nemesis", "Taiwan 8K RAM", "Korea XOR", "Sega 32K RAM", NULL };
+static const char *sms_tmspalette[] = { "SMS", "SG-1000" };
 
 static const char h_smsfm[] = "FM sound is only supported by few games,\n"
                                "some games may crash with FM enabled";
 static const char h_ghost[] = "Simulate the inertia of the GG LCD display";
+static const char h_smspal[] = "Selects the color palette used for SMS games\n"
+                               "using the original TMS9918 graphics modes";
 
 static menu_entry e_menu_sms_options[] =
 {
@@ -588,6 +591,7 @@ static menu_entry e_menu_sms_options[] =
        mee_enum      ("Cartridge mapping", MA_SMSOPT_MAPPER, PicoIn.mapper, sms_mappers),
        mee_enum_h    ("Game Gear LCD ghosting", MA_SMSOPT_GHOSTING, currentConfig.ghosting, gg_ghosting_opts, h_ghost),
        mee_onoff_h   ("FM Sound Unit",     MA_OPT2_ENABLE_YM2413, PicoIn.opt, POPT_EN_YM2413, h_smsfm),
+       mee_enum_h    ("SMS palette in TMS mode", MA_SMSOPT_TMSPALETTE, PicoIn.tmsPalette, sms_tmspalette, h_smspal),
        mee_end,
 };
 
index 1cfae2f..59e6af8 100644 (file)
@@ -99,6 +99,7 @@ typedef enum
        MA_SMSOPT_HARDWARE,
        MA_SMSOPT_MAPPER,
        MA_SMSOPT_GHOSTING,
+       MA_SMSOPT_TMSPALETTE,
        MA_CTRL_PLAYER1,
        MA_CTRL_PLAYER2,
        MA_CTRL_PLAYER3,
index adb4399..600c015 100644 (file)
@@ -1814,6 +1814,15 @@ static void update_variables(bool first_run)
          PicoIn.opt &= ~POPT_EN_YM2413;
    }
 
+   var.value = NULL;
+   var.key = "picodrive_smstms";
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+      if (strcmp(var.value, "SG-1000") == 0)
+         PicoIn.tmsPalette = 1;
+      else
+         PicoIn.tmsPalette = 0;
+   }
+
    var.value = NULL;
    var.key = "picodrive_smsmapper";
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
index 1e1d4c4..a5f7cb8 100644 (file)
@@ -145,6 +145,20 @@ struct retro_core_option_v2_definition option_defs_us[] = {
        },
       "Auto"
    },
+   {
+      "picodrive_smstms",
+      "Master System Palette in TMS modes",
+      NULL,
+      "Choose which colour palette should be used when an SMS game runs in one of the SG-1000 graphics modes.",
+      NULL,
+      "system",
+      {
+         { "SMS",           NULL },
+         { "SG-1000",       NULL },
+         { NULL, NULL },
+       },
+      "SMS"
+   },
    {
       "picodrive_ramcart",
       "Sega CD RAM Cart",