From 2a796d48a027adc64cc80792cd5e684f19b847e9 Mon Sep 17 00:00:00 2001 From: retro-wertz Date: Sat, 26 Jan 2019 21:24:05 +0800 Subject: [PATCH] libretro: Add GB color palettes --- src/libretro/libretro.cpp | 83 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/src/libretro/libretro.cpp b/src/libretro/libretro.cpp index 9314a073..0fcf0f15 100644 --- a/src/libretro/libretro.cpp +++ b/src/libretro/libretro.cpp @@ -59,6 +59,7 @@ static unsigned width = 240; static unsigned height = 160; static EmulatedSystem* core = NULL; static IMAGE_TYPE type = IMAGE_UNKNOWN; +static unsigned current_gbPalette; uint16_t systemColorMap16[0x10000]; uint32_t systemColorMap32[0x10000]; @@ -130,6 +131,56 @@ uint16_t systemGbPalette[24] = { GS555(0x1f), GS555(0x15), GS555(0x0c), 0 }; +static const uint16_t defaultGBPalettes[][8] = { + { + // Standard + 0x7FFF, 0x56B5, 0x318C, 0x0000, 0x7FFF, 0x56B5, 0x318C, 0x0000, + }, + { + // Blue Sea + 0x6200, 0x7E10, 0x7C10, 0x5000, 0x6200, 0x7E10, 0x7C10, 0x5000, + }, + { + // Dark Night + 0x4008, 0x4000, 0x2000, 0x2008, 0x4008, 0x4000, 0x2000, 0x2008, + }, + { + // Green Forest + 0x43F0, 0x03E0, 0x4200, 0x2200, 0x43F0, 0x03E0, 0x4200, 0x2200, + }, + { + // Hot Desert + 0x43FF, 0x03FF, 0x221F, 0x021F, 0x43FF, 0x03FF, 0x221F, 0x021F, + }, + { + // Pink Dreams + 0x621F, 0x7E1F, 0x7C1F, 0x2010, 0x621F, 0x7E1F, 0x7C1F, 0x2010, + }, + { + // Weird Colors + 0x621F, 0x401F, 0x001F, 0x2010, 0x621F, 0x401F, 0x001F, 0x2010, + }, + { + // Real GB Colors + 0x1B8E, 0x02C0, 0x0DA0, 0x1140, 0x1B8E, 0x02C0, 0x0DA0, 0x1140, + }, + { + // Real 'GB on GBASP' Colors + 0x7BDE, /*0x23F0*/ 0x5778, /*0x5DC0*/ 0x5640, 0x0000, 0x7BDE, /*0x3678*/ 0x529C, /*0x0980*/ 0x2990, 0x0000, + } +}; + +static void set_gbPalette(void) +{ + const uint16_t *pal = defaultGBPalettes[current_gbPalette]; + + if (gbCgbMode || gbSgbMode) + return; + + for (int i = 0; i < 8; i++) + gbPalette[i] = pal[i]; +} + extern int gbRomType; // gets type from header 0x147 extern int gbBattery; // enabled when gbRamSize != 0 @@ -467,6 +518,7 @@ void retro_set_environment(retro_environment_t cb) { "vbam_soundinterpolation", "Sound Interpolation; enabled|disabled" }, { "vbam_soundfiltering", "Sound Filtering; 5|6|7|8|9|10|0|1|2|3|4" }, { "vbam_gbHardware", "(GB) Emulated Hardware; Game Boy Color|Automatic|Super Game Boy|Game Boy|Game Boy Advance|Super Game Boy 2" }, + { "vbam_palettes", "(GB) Color Palette; Standard|Blue Sea|Dark Knight|Green Forest|Hot Desert|Pink Dreams|Wierd Colors|Original|GBA SP" }, { "vbam_showborders", "(GB) Show Borders; disabled|enabled|auto" }, { "vbam_turboenable", "Enable Turbo Buttons; disabled|enabled" }, { "vbam_turbodelay", "Turbo Delay (in frames); 3|4|5|6|7|8|9|10|11|12|13|14|15|1|2" }, @@ -906,6 +958,8 @@ void retro_reset(void) int tmp = eepromSize; core->emuReset(); eepromSize = tmp; + + set_gbPalette(); } #define MAX_PLAYERS 4 @@ -1112,6 +1166,35 @@ static void update_variables(bool startup) swap_astick = (bool)(!strcmp(var.value, "enabled")); } + var.key = "vbam_palettes"; + var.value = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + int lastpal = current_gbPalette; + + if (!strcmp(var.value, "Standard")) + current_gbPalette = 0; + else if (!strcmp(var.value, "Blue Sea")) + current_gbPalette = 1; + else if (!strcmp(var.value, "Dark Knight")) + current_gbPalette = 2; + else if (!strcmp(var.value, "Green Forest")) + current_gbPalette = 3; + else if (!strcmp(var.value, "Hot Desert")) + current_gbPalette = 4; + else if (!strcmp(var.value, "Pink Dreams")) + current_gbPalette = 5; + else if (!strcmp(var.value, "Wierd Colors")) + current_gbPalette = 6; + else if (!strcmp(var.value, "Original")) + current_gbPalette = 7; + else if (!strcmp(var.value, "GBA SP")) + current_gbPalette = 8; + + if (lastpal != current_gbPalette) + set_gbPalette(); + } } // System analog stick range is -0x7fff to 0x7fff