Merge remote-tracking branch 'vbam-libretro/master'
This commit is contained in:
commit
352eb149ae
|
@ -200,6 +200,7 @@ int gbCaptureNumber = 0;
|
|||
bool gbCapture = false;
|
||||
bool gbCapturePrevious = false;
|
||||
int gbJoymask[4] = { 0, 0, 0, 0 };
|
||||
static bool allow_colorizer_hack;
|
||||
|
||||
uint8_t gbRamFill = 0xff;
|
||||
|
||||
|
@ -776,6 +777,51 @@ static const uint16_t gbColorizationPaletteData[32][3][4] = {
|
|||
#define GBSAVE_GAME_VERSION_12 12
|
||||
#define GBSAVE_GAME_VERSION GBSAVE_GAME_VERSION_12
|
||||
|
||||
void setColorizerHack(bool value)
|
||||
{
|
||||
allow_colorizer_hack = value;
|
||||
}
|
||||
|
||||
bool allowColorizerHack(void)
|
||||
{
|
||||
if (gbHardware & 0xA)
|
||||
return (allow_colorizer_hack);
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool gbVramReadAccessValid(void)
|
||||
{
|
||||
// A lot of 'ugly' checks... But only way to emulate this particular behaviour...
|
||||
if (allowColorizerHack()||
|
||||
((gbHardware & 0xa) && ((gbLcdModeDelayed != 3) || (((register_LY == 0) && (gbScreenOn == false) && (register_LCDC & 0x80)) && (gbLcdLYIncrementTicksDelayed == (GBLY_INCREMENT_CLOCK_TICKS - GBLCD_MODE_2_CLOCK_TICKS))))) ||
|
||||
((gbHardware & 0x5) && (gbLcdModeDelayed != 3) && ((gbLcdMode != 3) || ((register_LY == 0) && ((gbScreenOn == false) && (register_LCDC & 0x80)) && (gbLcdLYIncrementTicks == (GBLY_INCREMENT_CLOCK_TICKS - GBLCD_MODE_2_CLOCK_TICKS))))))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool gbVramWriteAccessValid(void)
|
||||
{
|
||||
if (allowColorizerHack() ||
|
||||
// No access to Vram during mode 3
|
||||
// (used to emulate the gfx differences between GB & GBC-GBA/SP in Stunt Racer)
|
||||
(gbLcdModeDelayed != 3) ||
|
||||
// This part is used to emulate a small difference between hardwares
|
||||
// (check 8-in-1's arrow on GBA/GBC to verify it)
|
||||
((register_LY == 0) && ((gbHardware & 0xa) && (gbScreenOn == false) && (register_LCDC & 0x80)) && (gbLcdLYIncrementTicksDelayed == (GBLY_INCREMENT_CLOCK_TICKS - GBLCD_MODE_2_CLOCK_TICKS))))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool gbCgbPaletteAccessValid(void)
|
||||
{
|
||||
// No access to gbPalette during mode 3 (Color Panel Demo)
|
||||
if (allowColorizerHack() ||
|
||||
((gbLcdModeDelayed != 3) && (!((gbLcdMode == 0) && (gbLcdTicks >= (GBLCD_MODE_0_CLOCK_TICKS - gbSpritesTicks[299] - 1)))) && (!gbSpeed)) ||
|
||||
(gbSpeed && ((gbLcdMode == 1) || (gbLcdMode == 2) || ((gbLcdMode == 3) && (gbLcdTicks > (GBLCD_MODE_3_CLOCK_TICKS - 2))) || ((gbLcdMode == 0) && (gbLcdTicks <= (GBLCD_MODE_0_CLOCK_TICKS - gbSpritesTicks[299] - 2))))))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
int inline gbGetValue(int min, int max, int v)
|
||||
{
|
||||
return (int)(min + (float)(max - min) * (2.0 * (v / 31.0) - (v / 31.0) * (v / 31.0)));
|
||||
|
@ -919,12 +965,8 @@ void gbWriteMemory(uint16_t address, uint8_t value)
|
|||
}
|
||||
|
||||
if (address < 0xa000) {
|
||||
// No access to Vram during mode 3
|
||||
// (used to emulate the gfx differences between GB & GBC-GBA/SP in Stunt Racer)
|
||||
if ((gbLcdModeDelayed != 3) ||
|
||||
// This part is used to emulate a small difference between hardwares
|
||||
// (check 8-in-1's arrow on GBA/GBC to verify it)
|
||||
((register_LY == 0) && ((gbHardware & 0xa) && (gbScreenOn == false) && (register_LCDC & 0x80)) && (gbLcdLYIncrementTicksDelayed == (GBLY_INCREMENT_CLOCK_TICKS - GBLCD_MODE_2_CLOCK_TICKS))))
|
||||
|
||||
if (gbVramWriteAccessValid())
|
||||
gbMemoryMap[address >> 12][address & 0x0fff] = value;
|
||||
return;
|
||||
}
|
||||
|
@ -1270,6 +1312,7 @@ void gbWriteMemory(uint16_t address, uint8_t value)
|
|||
//register_STAT = (register_STAT & 0x87) |
|
||||
// (value & 0x7c);
|
||||
gbMemory[0xff41] = register_STAT = (value & 0xf8) | (register_STAT & 0x07); // fix ?
|
||||
// TODO:
|
||||
// GB bug from Devrs FAQ
|
||||
// http://www.devrs.com/gb/files/faqs.html#GBBugs
|
||||
// 2018-7-26 Backported STAT register bug behavior
|
||||
|
@ -1280,12 +1323,15 @@ void gbWriteMemory(uint16_t address, uint8_t value)
|
|||
// Games below relies on this bug, , and are incompatible with the GBC.
|
||||
// - Road Rash: crash after player screen
|
||||
// - Zerg no Densetsu: crash right after showing a small portion of intro
|
||||
// - 2019-07-18 - Speedy Gonzalez status bar relies on this as well.
|
||||
|
||||
if ((gbHardware & 5)
|
||||
&& (((!gbInt48Signal) && (gbLcdMode < 2) && (register_LCDC & 0x80))
|
||||
|| (register_LY == register_LYC))) {
|
||||
|
||||
gbMemory[0xff0f] = register_IF |=2;
|
||||
// send LCD interrupt only if no interrupt 48h signal...
|
||||
if (!gbInt48Signal)
|
||||
gbMemory[0xff0f] = register_IF |= 2;
|
||||
}
|
||||
|
||||
gbInt48Signal &= ((register_STAT >> 3) & 0xF);
|
||||
|
@ -1307,7 +1353,7 @@ void gbWriteMemory(uint16_t address, uint8_t value)
|
|||
if (!gbInt48Signal) {
|
||||
gbMemory[0xff0f] = register_IF |= 2;
|
||||
}
|
||||
gbInt48Signal |= 4;
|
||||
//gbInt48Signal |= 4;
|
||||
}
|
||||
gbCompareLYToLYC();
|
||||
|
||||
|
@ -1617,8 +1663,7 @@ void gbWriteMemory(uint16_t address, uint8_t value)
|
|||
int paletteIndex = (v & 0x3f) >> 1;
|
||||
int paletteHiLo = (v & 0x01);
|
||||
|
||||
// No access to gbPalette during mode 3 (Color Panel Demo)
|
||||
if (((gbLcdModeDelayed != 3) && (!((gbLcdMode == 0) && (gbLcdTicks >= (GBLCD_MODE_0_CLOCK_TICKS - gbSpritesTicks[299] - 1)))) && (!gbSpeed)) || (gbSpeed && ((gbLcdMode == 1) || (gbLcdMode == 2) || ((gbLcdMode == 3) && (gbLcdTicks > (GBLCD_MODE_3_CLOCK_TICKS - 2))) || ((gbLcdMode == 0) && (gbLcdTicks <= (GBLCD_MODE_0_CLOCK_TICKS - gbSpritesTicks[299] - 2)))))) {
|
||||
if (gbCgbPaletteAccessValid()) {
|
||||
gbMemory[0xff69] = value;
|
||||
gbPalette[paletteIndex] = (paletteHiLo ? ((value << 8) | (gbPalette[paletteIndex] & 0xff)) : ((gbPalette[paletteIndex] & 0xff00) | (value))) & 0x7fff;
|
||||
}
|
||||
|
@ -1658,8 +1703,7 @@ void gbWriteMemory(uint16_t address, uint8_t value)
|
|||
|
||||
paletteIndex += 32;
|
||||
|
||||
// No access to gbPalette during mode 3 (Color Panel Demo)
|
||||
if (((gbLcdModeDelayed != 3) && (!((gbLcdMode == 0) && (gbLcdTicks >= (GBLCD_MODE_0_CLOCK_TICKS - gbSpritesTicks[299] - 1)))) && (!gbSpeed)) || (gbSpeed && ((gbLcdMode == 1) || (gbLcdMode == 2) || ((gbLcdMode == 3) && (gbLcdTicks > (GBLCD_MODE_3_CLOCK_TICKS - 2))) || ((gbLcdMode == 0) && (gbLcdTicks <= (GBLCD_MODE_0_CLOCK_TICKS - gbSpritesTicks[299] - 2)))))) {
|
||||
if (gbCgbPaletteAccessValid()) {
|
||||
gbMemory[0xff6b] = value;
|
||||
gbPalette[paletteIndex] = (paletteHiLo ? ((value << 8) | (gbPalette[paletteIndex] & 0xff)) : ((gbPalette[paletteIndex] & 0xff00) | (value))) & 0x7fff;
|
||||
}
|
||||
|
@ -1729,13 +1773,8 @@ uint8_t gbReadMemory(uint16_t address)
|
|||
return gbMemoryMap[address >> 12][address & 0x0fff];
|
||||
|
||||
if (address < 0xa000) {
|
||||
// A lot of 'ugly' checks... But only way to emulate this particular behaviour...
|
||||
if (
|
||||
(
|
||||
(gbHardware & 0xa) && ((gbLcdModeDelayed != 3) || (((register_LY == 0) && (gbScreenOn == false) && (register_LCDC & 0x80)) && (gbLcdLYIncrementTicksDelayed == (GBLY_INCREMENT_CLOCK_TICKS - GBLCD_MODE_2_CLOCK_TICKS)))))
|
||||
|| ((gbHardware & 0x5) && (gbLcdModeDelayed != 3) && ((gbLcdMode != 3) || ((register_LY == 0) && ((gbScreenOn == false) && (register_LCDC & 0x80)) && (gbLcdLYIncrementTicks == (GBLY_INCREMENT_CLOCK_TICKS - GBLCD_MODE_2_CLOCK_TICKS))))))
|
||||
if (gbVramReadAccessValid())
|
||||
return gbMemoryMap[address >> 12][address & 0x0fff];
|
||||
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
@ -1977,8 +2016,7 @@ uint8_t gbReadMemory(uint16_t address)
|
|||
case 0x69:
|
||||
case 0x6b:
|
||||
if (gbCgbMode) {
|
||||
// No access to gbPalette during mode 3 (Color Panel Demo)
|
||||
if (((gbLcdModeDelayed != 3) && (!((gbLcdMode == 0) && (gbLcdTicks >= (GBLCD_MODE_0_CLOCK_TICKS - gbSpritesTicks[299] - 1)))) && (!gbSpeed)) || (gbSpeed && ((gbLcdMode == 1) || (gbLcdMode == 2) || ((gbLcdMode == 3) && (gbLcdTicks > (GBLCD_MODE_3_CLOCK_TICKS - 2))) || ((gbLcdMode == 0) && (gbLcdTicks <= (GBLCD_MODE_0_CLOCK_TICKS - gbSpritesTicks[299] - 2))))))
|
||||
if (gbCgbPaletteAccessValid())
|
||||
return (gbMemory[address]);
|
||||
else
|
||||
return 0xff;
|
||||
|
@ -3271,6 +3309,7 @@ void gbInit()
|
|||
{
|
||||
gbGenFilter();
|
||||
gbSgbInit();
|
||||
setColorizerHack(false);
|
||||
|
||||
gbMemory = (uint8_t*)malloc(65536);
|
||||
|
||||
|
@ -5421,7 +5460,6 @@ bool gbLoadRomData(const char* data, unsigned size)
|
|||
bios = NULL;
|
||||
}
|
||||
bios = (uint8_t*)calloc(1, 0x900);
|
||||
|
||||
return gbUpdateSizes();
|
||||
}
|
||||
|
||||
|
|
|
@ -50,6 +50,10 @@ bool gbReadGSASnapshot(const char*);
|
|||
|
||||
bool gbLoadRomData(const char* data, unsigned size);
|
||||
|
||||
// Allows invalid vram/palette access needed for Colorizer hacked games in GBC/GBA hardware
|
||||
void setColorizerHack(bool value);
|
||||
bool allowColorizerHack(void);
|
||||
|
||||
extern int gbHardware;
|
||||
|
||||
extern struct EmulatedSystem GBSystem;
|
||||
|
|
|
@ -308,7 +308,7 @@ mapperMBC3 gbDataMBC3 = {
|
|||
0, // timer latched hours
|
||||
0, // timer latched days
|
||||
0, // timer latched control
|
||||
0 // last time
|
||||
{0} // last time
|
||||
};
|
||||
|
||||
void memoryUpdateMBC3Clock()
|
||||
|
@ -1176,7 +1176,7 @@ mapperTAMA5 gbDataTAMA5 = {
|
|||
0, // timer latched months
|
||||
0, // timer latched years
|
||||
0, // timer latched control
|
||||
(time_t)-1 // last time
|
||||
{(time_t)-1} // last time
|
||||
};
|
||||
|
||||
void memoryUpdateTAMA5Clock()
|
||||
|
|
|
@ -142,8 +142,6 @@ const uint8_t gamepakWaitState[4] = { 4, 3, 2, 8 };
|
|||
const uint8_t gamepakWaitState0[2] = { 2, 1 };
|
||||
const uint8_t gamepakWaitState1[2] = { 4, 1 };
|
||||
const uint8_t gamepakWaitState2[2] = { 8, 1 };
|
||||
const bool isInRom[16] = { false, false, false, false, false, false, false, false,
|
||||
true, true, true, true, true, true, false, false };
|
||||
|
||||
uint8_t memoryWait[16] = { 0, 0, 2, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0 };
|
||||
uint8_t memoryWait32[16] = { 0, 0, 5, 0, 0, 1, 1, 0, 7, 7, 9, 9, 13, 13, 4, 0 };
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
INCFLAGS := -I$(CORE_DIR)
|
||||
LIBRETRO_COMMON := $(CORE_DIR)/libretro/libretro-common/include
|
||||
|
||||
INCFLAGS := -I$(CORE_DIR) -I$(LIBRETRO_COMMON)
|
||||
SOURCES_CXX :=
|
||||
|
||||
SOURCES_CXX += \
|
||||
|
|
|
@ -49,18 +49,6 @@ extern int systemBlueShift;
|
|||
extern uint16_t systemColorMap16[0x10000];
|
||||
extern uint32_t systemColorMap32[0x10000];
|
||||
|
||||
const char gb_image_header[] =
|
||||
{
|
||||
static_cast<const char>
|
||||
(
|
||||
0xce, 0xed, 0x66, 0x66, 0xcc, 0x0d, 0x00, 0x0b, 0x03, 0x73, 0x00,
|
||||
0x83, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x08, 0x11, 0x1f, 0x88, 0x89,
|
||||
0x00, 0x0e, 0xdc, 0xcc, 0x6e, 0xe6, 0xdd, 0xdd, 0xd9, 0x99, 0xbb,
|
||||
0xbb, 0x67, 0x63, 0x6e, 0x0e, 0xec, 0xcc, 0xdd, 0xdc, 0x99, 0x9f,
|
||||
0xbb, 0xb9, 0x33, 0x3e
|
||||
)
|
||||
};
|
||||
|
||||
bool utilWritePNGFile(const char* fileName, int w, int h, uint8_t* pix)
|
||||
{
|
||||
return false;
|
||||
|
@ -108,21 +96,6 @@ bool utilIsGBAImage(const char* file)
|
|||
|
||||
bool utilIsGBImage(const char* file)
|
||||
{
|
||||
/*
|
||||
FILE *fp;
|
||||
bool ret = false;
|
||||
char buffer[47];
|
||||
if (!file || !(fp = fopen (file, "r"))) //TODO more checks here (does file exist, is it a file, a symlink or a blockdevice)
|
||||
return ret;
|
||||
fseek (fp, 0, SEEK_END);
|
||||
if (ftell (fp) >= 0x8000) { //afaik there can be no gb-rom smaller than this
|
||||
fseek (fp, 0x104, SEEK_SET);
|
||||
fread (buffer, sizeof (char), 47, fp);
|
||||
ret = !memcmp (buffer, gb_image_header, 47);
|
||||
}
|
||||
fclose (fp);
|
||||
return ret;
|
||||
*/
|
||||
if (strlen(file) > 4) {
|
||||
const char *p = strrchr(file, '.');
|
||||
|
||||
|
|
|
@ -7,9 +7,20 @@ include $(LIBRETRO_DIR)/Makefile.common
|
|||
|
||||
COREFLAGS := -DHAVE_STDINT_H -DLSB_FIRST -D__LIBRETRO__ -DFINAL_VERSION -DC_CORE -DNO_LINK -DFRONTEND_SUPPORTS_RGB565 -DTILED_RENDERING -DNO_DEBUGGER $(INCFLAGS)
|
||||
|
||||
GIT_VERSION := " $(shell git rev-parse --short HEAD || echo unknown)"
|
||||
ifneq ($(GIT_VERSION)," unknown")
|
||||
COREFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\"
|
||||
#GIT_VERSION := " $(shell git rev-parse --short HEAD || echo unknown)"
|
||||
#ifneq ($(GIT_VERSION)," unknown")
|
||||
# COREFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\"
|
||||
#endif
|
||||
|
||||
VBAM_VERSION := $(shell sed -En 's/.*\[([0-9]+[^]]+).*/\1/p; T; q' ../../CHANGELOG.md 2>/dev/null)
|
||||
|
||||
COREFLAGS += -DVBAM_VERSION=\"$(VBAM_VERSION)\"
|
||||
|
||||
TAG_COMMIT := $(shell git rev-list -n 1 v$(VBAM_VERSION) --abbrev-commit 2>/dev/null)
|
||||
CURRENT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null)
|
||||
|
||||
ifneq ($(CURRENT_COMMIT),$(TAG_COMMIT))
|
||||
COREFLAGS += -DGIT_COMMIT=\"$(CURRENT_COMMIT)\"
|
||||
endif
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
|
1508
src/libretro/libretro.h → src/libretro/libretro-common/include/libretro.h
Executable file → Normal file
1508
src/libretro/libretro.h → src/libretro/libretro-common/include/libretro.h
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,39 @@
|
|||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (retro_inline.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* Permission is hereby granted, free of charge,
|
||||
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __LIBRETRO_SDK_INLINE_H
|
||||
#define __LIBRETRO_SDK_INLINE_H
|
||||
|
||||
#ifndef INLINE
|
||||
|
||||
#if defined(_WIN32) || defined(__INTEL_COMPILER)
|
||||
#define INLINE __inline
|
||||
#elif defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L
|
||||
#define INLINE inline
|
||||
#elif defined(__GNUC__)
|
||||
#define INLINE __inline__
|
||||
#else
|
||||
#define INLINE
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include "SoundRetro.h"
|
||||
#include "libretro.h"
|
||||
#include "libretro_core_options.h"
|
||||
|
||||
#include "../System.h"
|
||||
#include "../Util.h"
|
||||
|
@ -60,6 +61,7 @@ static unsigned height = 160;
|
|||
static EmulatedSystem* core = NULL;
|
||||
static IMAGE_TYPE type = IMAGE_UNKNOWN;
|
||||
static unsigned current_gbPalette;
|
||||
static bool opt_colorizer_hack = false;
|
||||
|
||||
uint16_t systemColorMap16[0x10000];
|
||||
uint32_t systemColorMap32[0x10000];
|
||||
|
@ -185,6 +187,11 @@ static void set_gbPalette(void)
|
|||
gbPalette[i] = pal[i];
|
||||
}
|
||||
|
||||
static void set_gbColorCorrection(int value)
|
||||
{
|
||||
gbColorOption = value;
|
||||
}
|
||||
|
||||
extern int gbRomType; // gets type from header 0x147
|
||||
extern int gbBattery; // enabled when gbRamSize != 0
|
||||
|
||||
|
@ -496,39 +503,7 @@ void retro_set_controller_port_device(unsigned port, unsigned device)
|
|||
void retro_set_environment(retro_environment_t cb)
|
||||
{
|
||||
environ_cb = cb;
|
||||
|
||||
struct retro_variable variables[] = {
|
||||
{ "vbam_solarsensor", "Solar Sensor Level; 0|1|2|3|4|5|6|7|8|9|10" },
|
||||
{ "vbam_usebios", "Use BIOS file (Restart); disabled|enabled" },
|
||||
{ "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" },
|
||||
{ "vbam_astick_deadzone", "Sensors Deadzone (%); 15|20|25|30|0|5|10"},
|
||||
{ "vbam_gyro_sensitivity", "Sensor Sensitivity (Gyroscope) (%); 100|105|110|115|120|10|15|20|25|30|35|40|45|50|55|60|65|70|75|80|85|90|95"},
|
||||
{ "vbam_tilt_sensitivity", "Sensor Sensitivity (Tilt) (%); 100|105|110|115|120|10|15|20|25|30|35|40|45|50|55|60|65|70|75|80|85|90|95"},
|
||||
{ "vbam_swap_astick", "Swap Left/Right Analog; disabled|enabled" },
|
||||
{ "vbam_layer_1", "Show layer 1; enabled|disabled" },
|
||||
{ "vbam_layer_2", "Show layer 2; enabled|disabled" },
|
||||
{ "vbam_layer_3", "Show layer 3; enabled|disabled" },
|
||||
{ "vbam_layer_4", "Show layer 4; enabled|disabled" },
|
||||
{ "vbam_layer_5", "Show sprite layer; enabled|disabled" },
|
||||
{ "vbam_layer_6", "Show window layer 1; enabled|disabled" },
|
||||
{ "vbam_layer_7", "Show window layer 2; enabled|disabled" },
|
||||
{ "vbam_layer_8", "Show sprite window layer; enabled|disabled" },
|
||||
{ "vbam_sound_1", "Sound channel 1; enabled|disabled" },
|
||||
{ "vbam_sound_2", "Sound channel 2; enabled|disabled" },
|
||||
{ "vbam_sound_3", "Sound channel 3; enabled|disabled" },
|
||||
{ "vbam_sound_4", "Sound channel 4; enabled|disabled" },
|
||||
{ "vbam_sound_5", "Direct Sound A; enabled|disabled" },
|
||||
{ "vbam_sound_6", "Direct Sound B; enabled|disabled" },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
|
||||
libretro_set_core_options(environ_cb);
|
||||
}
|
||||
|
||||
void retro_get_system_info(struct retro_system_info *info)
|
||||
|
@ -863,6 +838,12 @@ static void gb_init(void)
|
|||
|
||||
gbGetHardwareType();
|
||||
|
||||
setColorizerHack(opt_colorizer_hack);
|
||||
|
||||
// Disable bios loading when using Colorizer hack
|
||||
if (opt_colorizer_hack)
|
||||
usebios = false;
|
||||
|
||||
if (usebios) {
|
||||
snprintf(biosfile, sizeof(biosfile), "%s%c%s",
|
||||
retro_system_directory, SLASH, biosname[gbCgbMode]);
|
||||
|
@ -886,6 +867,7 @@ static void gb_init(void)
|
|||
gbSoundSetDeclicking(1);
|
||||
|
||||
gbReset(); // also resets sound;
|
||||
set_gbPalette();
|
||||
|
||||
// VBA-M always updates time based on current time and not in-game time.
|
||||
// No need to add RTC data to RETRO_MEMORY_RTC, so its safe to place this here.
|
||||
|
@ -1082,21 +1064,31 @@ static void update_variables(bool startup)
|
|||
var.key = "vbam_gbHardware";
|
||||
var.value = NULL;
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
|
||||
if (strcmp(var.value, "Automatic") == 0)
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && startup) {
|
||||
if (strcmp(var.value, "auto") == 0)
|
||||
gbEmulatorType = 0;
|
||||
else if (strcmp(var.value, "Game Boy Color") == 0)
|
||||
else if (strcmp(var.value, "gbc") == 0)
|
||||
gbEmulatorType = 1;
|
||||
else if (strcmp(var.value, "Super Game Boy") == 0)
|
||||
else if (strcmp(var.value, "sgb") == 0)
|
||||
gbEmulatorType = 2;
|
||||
else if (strcmp(var.value, "Game Boy") == 0)
|
||||
else if (strcmp(var.value, "gb") == 0)
|
||||
gbEmulatorType = 3;
|
||||
else if (strcmp(var.value, "Game Boy Advance") == 0)
|
||||
else if (strcmp(var.value, "gba") == 0)
|
||||
gbEmulatorType = 4;
|
||||
else if (strcmp(var.value, "Super Game Boy 2") == 0)
|
||||
else if (strcmp(var.value, "sgb2") == 0)
|
||||
gbEmulatorType = 5;
|
||||
}
|
||||
|
||||
var.key = "vbam_allowcolorizerhack";
|
||||
var.value = NULL;
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
|
||||
if (strcmp(var.value, "enabled") == 0)
|
||||
opt_colorizer_hack = true;
|
||||
else
|
||||
opt_colorizer_hack = false;
|
||||
}
|
||||
|
||||
var.key = "vbam_turboenable";
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
|
||||
|
@ -1151,28 +1143,37 @@ static void update_variables(bool startup)
|
|||
{
|
||||
int lastpal = current_gbPalette;
|
||||
|
||||
if (!strcmp(var.value, "Standard"))
|
||||
if (!strcmp(var.value, "black and white"))
|
||||
current_gbPalette = 0;
|
||||
else if (!strcmp(var.value, "Blue Sea"))
|
||||
else if (!strcmp(var.value, "blue sea"))
|
||||
current_gbPalette = 1;
|
||||
else if (!strcmp(var.value, "Dark Knight"))
|
||||
else if (!strcmp(var.value, "dark knight"))
|
||||
current_gbPalette = 2;
|
||||
else if (!strcmp(var.value, "Green Forest"))
|
||||
else if (!strcmp(var.value, "green forest"))
|
||||
current_gbPalette = 3;
|
||||
else if (!strcmp(var.value, "Hot Desert"))
|
||||
else if (!strcmp(var.value, "hot desert"))
|
||||
current_gbPalette = 4;
|
||||
else if (!strcmp(var.value, "Pink Dreams"))
|
||||
else if (!strcmp(var.value, "pink dreams"))
|
||||
current_gbPalette = 5;
|
||||
else if (!strcmp(var.value, "Wierd Colors"))
|
||||
else if (!strcmp(var.value, "wierd colors"))
|
||||
current_gbPalette = 6;
|
||||
else if (!strcmp(var.value, "Original"))
|
||||
else if (!strcmp(var.value, "original gameboy"))
|
||||
current_gbPalette = 7;
|
||||
else if (!strcmp(var.value, "GBA SP"))
|
||||
else if (!strcmp(var.value, "gba sp"))
|
||||
current_gbPalette = 8;
|
||||
|
||||
if (lastpal != current_gbPalette)
|
||||
set_gbPalette();
|
||||
}
|
||||
|
||||
var.key = "vbam_gbcoloroption";
|
||||
var.value = NULL;
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
|
||||
{
|
||||
int val = (!strcmp(var.value, "enabled")) ? 1 : 0;
|
||||
set_gbColorCorrection(val);
|
||||
}
|
||||
}
|
||||
|
||||
// System analog stick range is -0x7fff to 0x7fff
|
||||
|
@ -1217,25 +1218,25 @@ static void updateInput_MotionSensors(void)
|
|||
analog_y = astick_data[1];
|
||||
|
||||
// Gyro sensor section
|
||||
analog[3] = input_cb(0, RETRO_DEVICE_ANALOG,
|
||||
analog[2] = input_cb(0, RETRO_DEVICE_ANALOG,
|
||||
gyro_retro_device_index, RETRO_DEVICE_ID_ANALOG_X);
|
||||
|
||||
if ( analog[3] < -astick_deadzone ) {
|
||||
if ( analog[2] < -astick_deadzone ) {
|
||||
// Re-scale analog stick range
|
||||
scaled_range = (-analog[3] - astick_deadzone) *
|
||||
scaled_range = (-analog[2] - astick_deadzone) *
|
||||
((float)ASTICK_MAX / (ASTICK_MAX - astick_deadzone));
|
||||
// Gyro sensor range is +/- 1800
|
||||
scaled_range *= 1800.0 / ASTICK_MAX * (gyro_sensitivity / 100.0);
|
||||
astick_data[3] = -(int16_t)ROUND(scaled_range);
|
||||
} else if ( analog[3] > astick_deadzone ) {
|
||||
scaled_range = (analog[3] - astick_deadzone) *
|
||||
astick_data[2] = -(int16_t)ROUND(scaled_range);
|
||||
} else if ( analog[2] > astick_deadzone ) {
|
||||
scaled_range = (analog[2] - astick_deadzone) *
|
||||
((float)ASTICK_MAX / (ASTICK_MAX - astick_deadzone));
|
||||
scaled_range *= (1800.0 / ASTICK_MAX * (gyro_sensitivity / 100.0));
|
||||
astick_data[3] = +(int16_t)ROUND(scaled_range);
|
||||
astick_data[2] = +(int16_t)ROUND(scaled_range);
|
||||
} else
|
||||
astick_data[3] = 0;
|
||||
astick_data[2] = 0;
|
||||
|
||||
analog_z = astick_data[3];
|
||||
analog_z = astick_data[2];
|
||||
}
|
||||
|
||||
// Update solar sensor level by gamepad buttons, default L2/R2
|
||||
|
@ -1463,7 +1464,7 @@ bool retro_load_game(const struct retro_game_info *game)
|
|||
gb_init();
|
||||
|
||||
unsigned addr, i;
|
||||
struct retro_memory_descriptor desc[16];
|
||||
struct retro_memory_descriptor desc[17];
|
||||
struct retro_memory_map retromap;
|
||||
|
||||
memset(desc, 0, sizeof(desc));
|
||||
|
@ -1495,6 +1496,15 @@ bool retro_load_game(const struct retro_game_info *game)
|
|||
}
|
||||
}
|
||||
|
||||
if (gbCgbMode) { // banks 2-7 of GBC work ram banks at $10000
|
||||
desc[i].ptr = (void*)gbWram;
|
||||
desc[i].offset = 0x2000;
|
||||
desc[i].start = 0x10000;
|
||||
desc[i].select = 0xFFFF0000;
|
||||
desc[i].len = 0x6000;
|
||||
i++;
|
||||
}
|
||||
|
||||
retromap.descriptors = desc;
|
||||
retromap.num_descriptors = i;
|
||||
environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &retromap);
|
||||
|
@ -1607,8 +1617,6 @@ void systemMessage(int, const char* fmt, ...)
|
|||
va_end(ap);
|
||||
}
|
||||
|
||||
static int rumble_state, rumble_down;
|
||||
|
||||
uint32_t systemReadJoypad(int which)
|
||||
{
|
||||
uint32_t J = 0;
|
||||
|
|
|
@ -0,0 +1,664 @@
|
|||
#ifndef LIBRETRO_CORE_OPTIONS_H__
|
||||
#define LIBRETRO_CORE_OPTIONS_H__
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <libretro.h>
|
||||
#include <retro_inline.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
********************************
|
||||
* Core Option Definitions
|
||||
********************************
|
||||
*/
|
||||
|
||||
/* RETRO_LANGUAGE_ENGLISH */
|
||||
|
||||
/* Default language:
|
||||
* - All other languages must include the same keys and values
|
||||
* - Will be used as a fallback in the event that frontend language
|
||||
* is not available
|
||||
* - Will be used as a fallback for any missing entries in
|
||||
* frontend language definition */
|
||||
|
||||
struct retro_core_option_definition option_defs_us[] = {
|
||||
{
|
||||
"vbam_solarsensor",
|
||||
"Solar sensor level",
|
||||
"Adjusts simulated solar level in Boktai games. L2/R2 buttons can also be used to quickly change levels.",
|
||||
{
|
||||
{ "0", NULL },
|
||||
{ "1", NULL },
|
||||
{ "2", NULL },
|
||||
{ "3", NULL },
|
||||
{ "4", NULL },
|
||||
{ "5", NULL },
|
||||
{ "6", NULL },
|
||||
{ "7", NULL },
|
||||
{ "8", NULL },
|
||||
{ "9", NULL },
|
||||
{ "10", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"0"
|
||||
},
|
||||
{
|
||||
"vbam_usebios",
|
||||
"Use BIOS file if available (Restart)",
|
||||
"Use official bios when available. Core needs to be restarted for changes to apply.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"vbam_soundinterpolation",
|
||||
"Sound Interpolation",
|
||||
"Enable or disable sound filtering.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_soundfiltering",
|
||||
"Sound Filtering",
|
||||
"Sets the amount filtering to use. Higher value reduces more high frequencies.",
|
||||
{
|
||||
{ "0", NULL },
|
||||
{ "1", NULL },
|
||||
{ "2", NULL },
|
||||
{ "3", NULL },
|
||||
{ "4", NULL },
|
||||
{ "5", NULL },
|
||||
{ "6", NULL },
|
||||
{ "7", NULL },
|
||||
{ "8", NULL },
|
||||
{ "9", NULL },
|
||||
{ "10", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"5"
|
||||
},
|
||||
{
|
||||
"vbam_palettes",
|
||||
"(GB) Color Palette",
|
||||
"Set Game Boy palettes.",
|
||||
{
|
||||
{ "black and white", NULL },
|
||||
{ "blue sea", NULL },
|
||||
{ "dark knight", NULL },
|
||||
{ "green forest", NULL },
|
||||
{ "hot desert", NULL },
|
||||
{ "pink dreams", NULL },
|
||||
{ "wierd colors", NULL },
|
||||
{ "original gameboy", NULL },
|
||||
{ "gba sp", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"standard"
|
||||
},
|
||||
{
|
||||
"vbam_gbHardware",
|
||||
"(GB) Emulated Hardware",
|
||||
"Sets the Game Boy hardware type to emulate. Restart core to apply.",
|
||||
{
|
||||
{ "gbc", "Game Boy Color" },
|
||||
{ "auto", "Automatic" },
|
||||
{ "sgb", "Super Game Boy" },
|
||||
{ "gb", "Game Boy" },
|
||||
{ "gba", "Game Boy Advance" },
|
||||
{ "sgb2", "Super Game Boy 2" },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"gbc"
|
||||
},
|
||||
{
|
||||
"vbam_allowcolorizerhack",
|
||||
"(GB) Enable Colorizer Hack (Needs Restart)",
|
||||
"Allows Colorizer hacked GB games (e.g. DX patched games) to normally run in GBC/GBA hardware type. This also disables the use of bios file. NOT RECOMMENDED for use on non-colorized games.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"vbam_showborders",
|
||||
"(GB) Show Borders",
|
||||
"When enabled, if loaded content is SGB compatible, this will show the border from game if available.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ "auto", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"vbam_gbcoloroption",
|
||||
"(GB) Color Correction",
|
||||
"Applies color correction which fixes colors in some games games.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"vbam_turboenable",
|
||||
"Enable Turbo Buttons",
|
||||
"Enable or disable gamepad turbo buttons.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_turbodelay",
|
||||
"Turbo Delay (in frames)",
|
||||
"Repeat rate of turbo triggers in frames. Higher value triggers more.",
|
||||
{
|
||||
{ "1", NULL },
|
||||
{ "2", NULL },
|
||||
{ "3", NULL },
|
||||
{ "4", NULL },
|
||||
{ "5", NULL },
|
||||
{ "6", NULL },
|
||||
{ "7", NULL },
|
||||
{ "8", NULL },
|
||||
{ "9", NULL },
|
||||
{ "10", NULL },
|
||||
{ "11", NULL },
|
||||
{ "12", NULL },
|
||||
{ "13", NULL },
|
||||
{ "14", NULL },
|
||||
{ "15", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"3"
|
||||
},
|
||||
{
|
||||
"vbam_astick_deadzone",
|
||||
"Sensors Deadzone (%)",
|
||||
"Set deadzone (in percent) of analog sticks.",
|
||||
{
|
||||
{ "0", NULL },
|
||||
{ "5", NULL },
|
||||
{ "10", NULL },
|
||||
{ "15", NULL },
|
||||
{ "20", NULL },
|
||||
{ "25", NULL },
|
||||
{ "30", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"15"
|
||||
},
|
||||
{
|
||||
"vbam_gyro_sensitivity",
|
||||
"Sensor Sensitivity (Gyroscope) (%)",
|
||||
"Default bind is left analog. Used to adjust sensitivity level for gyro-enabled games.",
|
||||
{
|
||||
{ "10", NULL },
|
||||
{ "15", NULL },
|
||||
{ "20", NULL },
|
||||
{ "25", NULL },
|
||||
{ "30", NULL },
|
||||
{ "35", NULL },
|
||||
{ "40", NULL },
|
||||
{ "45", NULL },
|
||||
{ "50", NULL },
|
||||
{ "55", NULL },
|
||||
{ "60", NULL },
|
||||
{ "65", NULL },
|
||||
{ "70", NULL },
|
||||
{ "75", NULL },
|
||||
{ "80", NULL },
|
||||
{ "85", NULL },
|
||||
{ "90", NULL },
|
||||
{ "95", NULL },
|
||||
{ "100", NULL },
|
||||
{ "105", NULL },
|
||||
{ "110", NULL },
|
||||
{ "115", NULL },
|
||||
{ "120", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"100"
|
||||
},
|
||||
{
|
||||
"vbam_tilt_sensitivity",
|
||||
"Sensor Sensitivity (Tilt) (%)",
|
||||
"Default bind is right analog. Used to adjust sensitivity level for gyro-enabled games.",
|
||||
{
|
||||
{ "10", NULL },
|
||||
{ "15", NULL },
|
||||
{ "20", NULL },
|
||||
{ "25", NULL },
|
||||
{ "30", NULL },
|
||||
{ "35", NULL },
|
||||
{ "40", NULL },
|
||||
{ "45", NULL },
|
||||
{ "50", NULL },
|
||||
{ "55", NULL },
|
||||
{ "60", NULL },
|
||||
{ "65", NULL },
|
||||
{ "70", NULL },
|
||||
{ "75", NULL },
|
||||
{ "80", NULL },
|
||||
{ "85", NULL },
|
||||
{ "90", NULL },
|
||||
{ "95", NULL },
|
||||
{ "100", NULL },
|
||||
{ "105", NULL },
|
||||
{ "110", NULL },
|
||||
{ "115", NULL },
|
||||
{ "120", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"100"
|
||||
},
|
||||
{
|
||||
"vbam_swap_astick",
|
||||
"Swap Left/Right Analog",
|
||||
"Swaps left and right analog stick function for gyro and tilt.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"vbam_sound_1",
|
||||
"Sound channel 1",
|
||||
"Enables or disables tone & sweep sound channel.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_sound_2",
|
||||
"Sound channel 2",
|
||||
"Enables or disables tone sound channel.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_sound_3",
|
||||
"Sound channel 3",
|
||||
"Enables or disables wave output sound channel.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_sound_4",
|
||||
"Sound channel 4",
|
||||
"Enables or disables noise audio channel.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_sound_5",
|
||||
"Sound DMA channel A",
|
||||
"Enables or disables DMA sound channel A.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_sound_6",
|
||||
"Sound DMA channel B",
|
||||
"Enables or disables DMA sound channel B.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_layer_1",
|
||||
"Show background layer 1",
|
||||
"Shows or hides background layer 1.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_layer_2",
|
||||
"Show background layer 2",
|
||||
"Shows or hides background layer 2.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_layer_3",
|
||||
"Show background layer 3",
|
||||
"Shows or hides background layer 3.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_layer_4",
|
||||
"Show background layer 4",
|
||||
"Shows or hides background layer 4.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_layer_5",
|
||||
"Show sprite layer",
|
||||
"Shows or hides sprite layer.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_layer_6",
|
||||
"Show window layer 1",
|
||||
"Shows or hides window layer 1.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_layer_7",
|
||||
"Show window layer 2",
|
||||
"Shows or hides window layer 2.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"vbam_layer_8",
|
||||
"Show sprite window layer",
|
||||
"Shows or hides sprite window layer.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
|
||||
{ NULL, NULL, NULL, {{0}}, NULL }
|
||||
};
|
||||
|
||||
/* RETRO_LANGUAGE_JAPANESE */
|
||||
|
||||
/* RETRO_LANGUAGE_FRENCH */
|
||||
|
||||
/* RETRO_LANGUAGE_SPANISH */
|
||||
|
||||
/* RETRO_LANGUAGE_GERMAN */
|
||||
|
||||
/* RETRO_LANGUAGE_ITALIAN */
|
||||
|
||||
/* RETRO_LANGUAGE_DUTCH */
|
||||
|
||||
/* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */
|
||||
|
||||
/* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */
|
||||
|
||||
/* RETRO_LANGUAGE_RUSSIAN */
|
||||
|
||||
/* RETRO_LANGUAGE_KOREAN */
|
||||
|
||||
/* RETRO_LANGUAGE_CHINESE_TRADITIONAL */
|
||||
|
||||
/* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */
|
||||
|
||||
/* RETRO_LANGUAGE_ESPERANTO */
|
||||
|
||||
/* RETRO_LANGUAGE_POLISH */
|
||||
|
||||
/* RETRO_LANGUAGE_VIETNAMESE */
|
||||
|
||||
/* RETRO_LANGUAGE_ARABIC */
|
||||
|
||||
/* RETRO_LANGUAGE_GREEK */
|
||||
|
||||
/* RETRO_LANGUAGE_TURKISH */
|
||||
|
||||
/*
|
||||
********************************
|
||||
* Language Mapping
|
||||
********************************
|
||||
*/
|
||||
|
||||
struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = {
|
||||
option_defs_us, /* RETRO_LANGUAGE_ENGLISH */
|
||||
NULL, /* RETRO_LANGUAGE_JAPANESE */
|
||||
NULL, /* RETRO_LANGUAGE_FRENCH */
|
||||
NULL, /* RETRO_LANGUAGE_SPANISH */
|
||||
NULL, /* RETRO_LANGUAGE_GERMAN */
|
||||
NULL, /* RETRO_LANGUAGE_ITALIAN */
|
||||
NULL, /* RETRO_LANGUAGE_DUTCH */
|
||||
NULL, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */
|
||||
NULL, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */
|
||||
NULL, /* RETRO_LANGUAGE_RUSSIAN */
|
||||
NULL, /* RETRO_LANGUAGE_KOREAN */
|
||||
NULL, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */
|
||||
NULL, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */
|
||||
NULL, /* RETRO_LANGUAGE_ESPERANTO */
|
||||
NULL, /* RETRO_LANGUAGE_POLISH */
|
||||
NULL, /* RETRO_LANGUAGE_VIETNAMESE */
|
||||
NULL, /* RETRO_LANGUAGE_ARABIC */
|
||||
NULL, /* RETRO_LANGUAGE_GREEK */
|
||||
NULL, /* RETRO_LANGUAGE_TURKISH */
|
||||
};
|
||||
|
||||
/*
|
||||
********************************
|
||||
* Functions
|
||||
********************************
|
||||
*/
|
||||
|
||||
/* Handles configuration/setting of core options.
|
||||
* Should only be called inside retro_set_environment().
|
||||
* > We place the function body in the header to avoid the
|
||||
* necessity of adding more .c files (i.e. want this to
|
||||
* be as painless as possible for core devs)
|
||||
*/
|
||||
|
||||
static INLINE void libretro_set_core_options(retro_environment_t environ_cb)
|
||||
{
|
||||
unsigned version = 0;
|
||||
|
||||
if (!environ_cb)
|
||||
return;
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version) && (version == 1))
|
||||
{
|
||||
struct retro_core_options_intl core_options_intl;
|
||||
unsigned language = 0;
|
||||
|
||||
core_options_intl.us = option_defs_us;
|
||||
core_options_intl.local = NULL;
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&
|
||||
(language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH))
|
||||
core_options_intl.local = option_defs_intl[language];
|
||||
|
||||
environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_intl);
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t i;
|
||||
size_t num_options = 0;
|
||||
struct retro_variable *variables = NULL;
|
||||
char **values_buf = NULL;
|
||||
|
||||
/* Determine number of options */
|
||||
while (true)
|
||||
{
|
||||
if (option_defs_us[num_options].key)
|
||||
num_options++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/* Allocate arrays */
|
||||
variables = (struct retro_variable *)calloc(num_options + 1, sizeof(struct retro_variable));
|
||||
values_buf = (char **)calloc(num_options, sizeof(char *));
|
||||
|
||||
if (!variables || !values_buf)
|
||||
goto error;
|
||||
|
||||
/* Copy parameters from option_defs_us array */
|
||||
for (i = 0; i < num_options; i++)
|
||||
{
|
||||
const char *key = option_defs_us[i].key;
|
||||
const char *desc = option_defs_us[i].desc;
|
||||
const char *default_value = option_defs_us[i].default_value;
|
||||
struct retro_core_option_value *values = option_defs_us[i].values;
|
||||
size_t buf_len = 3;
|
||||
size_t default_index = 0;
|
||||
|
||||
values_buf[i] = NULL;
|
||||
|
||||
if (desc)
|
||||
{
|
||||
size_t num_values = 0;
|
||||
|
||||
/* Determine number of values */
|
||||
while (true)
|
||||
{
|
||||
if (values[num_values].value)
|
||||
{
|
||||
/* Check if this is the default value */
|
||||
if (default_value)
|
||||
if (strcmp(values[num_values].value, default_value) == 0)
|
||||
default_index = num_values;
|
||||
|
||||
buf_len += strlen(values[num_values].value);
|
||||
num_values++;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/* Build values string */
|
||||
if (num_values > 1)
|
||||
{
|
||||
size_t j;
|
||||
|
||||
buf_len += num_values - 1;
|
||||
buf_len += strlen(desc);
|
||||
|
||||
values_buf[i] = (char *)calloc(buf_len, sizeof(char));
|
||||
if (!values_buf[i])
|
||||
goto error;
|
||||
|
||||
strcpy(values_buf[i], desc);
|
||||
strcat(values_buf[i], "; ");
|
||||
|
||||
/* Default value goes first */
|
||||
strcat(values_buf[i], values[default_index].value);
|
||||
|
||||
/* Add remaining values */
|
||||
for (j = 0; j < num_values; j++)
|
||||
{
|
||||
if (j != default_index)
|
||||
{
|
||||
strcat(values_buf[i], "|");
|
||||
strcat(values_buf[i], values[j].value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variables[i].key = key;
|
||||
variables[i].value = values_buf[i];
|
||||
}
|
||||
|
||||
/* Set variables */
|
||||
environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
|
||||
|
||||
error:
|
||||
|
||||
/* Clean up */
|
||||
if (values_buf)
|
||||
{
|
||||
for (i = 0; i < num_options; i++)
|
||||
{
|
||||
if (values_buf[i])
|
||||
{
|
||||
free(values_buf[i]);
|
||||
values_buf[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
free(values_buf);
|
||||
values_buf = NULL;
|
||||
}
|
||||
|
||||
if (variables)
|
||||
{
|
||||
free(variables);
|
||||
variables = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue