Merge pull request #253 from retro-wertz/libretro

Libretro Updates
This commit is contained in:
Zach Bacon 2018-06-14 06:08:12 -04:00 committed by GitHub
commit 0047fa1a69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 155 additions and 81 deletions

View File

@ -482,7 +482,7 @@ void BIOS_EReader_ScanCard(int swi_num)
} }
dotcodepointer++; dotcodepointer++;
if ((dotcodepointer == dotcodeinterleave)) { if (dotcodepointer == dotcodeinterleave) {
switch (dotcodeinterleave) { switch (dotcodeinterleave) {
case 0x1C: case 0x1C:
j = 0x724; j = 0x724;

View File

@ -29,7 +29,7 @@ int cpuSaveType = 0;
int skipSaveGameBattery = 0; int skipSaveGameBattery = 0;
int skipSaveGameCheats = 0; int skipSaveGameCheats = 0;
int useBios = 0; int useBios = 0;
int cheatsEnabled = 1; int cheatsEnabled = 0;
int layerSettings = 0xff00; int layerSettings = 0xff00;
int layerEnable = 0xff00; int layerEnable = 0xff00;
bool speedup = false; bool speedup = false;

View File

@ -40,9 +40,8 @@ static retro_environment_t environ_cb;
static bool enableRtc; static bool enableRtc;
static bool can_dupe; static bool can_dupe;
unsigned device_type = 0;
int emulating = 0; int emulating = 0;
static int controller_layout[2] = { 0, 0 }; static unsigned controller_layout = 0;
uint8_t libretro_save_buf[0x20000 + 0x2000]; /* Workaround for broken-by-design GBA save semantics. */ uint8_t libretro_save_buf[0x20000 + 0x2000]; /* Workaround for broken-by-design GBA save semantics. */
@ -65,9 +64,6 @@ int systemFrameSkip = 0;
int systemSaveUpdateCounter = SYSTEM_SAVE_NOT_UPDATED; int systemSaveUpdateCounter = SYSTEM_SAVE_NOT_UPDATED;
int systemSpeed = 0; int systemSpeed = 0;
//uint64_t startTime = 0;
//uint32_t renderedFrames = 0;
void (*dbgOutput)(const char* s, uint32_t addr); void (*dbgOutput)(const char* s, uint32_t addr);
void (*dbgSignal)(int sig, int number); void (*dbgSignal)(int sig, int number);
@ -75,10 +71,10 @@ void* retro_get_memory_data(unsigned id)
{ {
if (id == RETRO_MEMORY_SAVE_RAM) if (id == RETRO_MEMORY_SAVE_RAM)
return libretro_save_buf; return libretro_save_buf;
if (id == RETRO_MEMORY_SYSTEM_RAM) if (id == RETRO_MEMORY_SYSTEM_RAM)
return workRAM; return workRAM;
if (id == RETRO_MEMORY_VIDEO_RAM) if (id == RETRO_MEMORY_VIDEO_RAM)
return vram; return vram;
return NULL; return NULL;
} }
@ -87,10 +83,10 @@ size_t retro_get_memory_size(unsigned id)
{ {
if (id == RETRO_MEMORY_SAVE_RAM) if (id == RETRO_MEMORY_SAVE_RAM)
return libretro_save_size; return libretro_save_size;
if (id == RETRO_MEMORY_SYSTEM_RAM) if (id == RETRO_MEMORY_SYSTEM_RAM)
return 0x40000; return 0x40000;
if (id == RETRO_MEMORY_VIDEO_RAM) if (id == RETRO_MEMORY_VIDEO_RAM)
return 0x20000; return 0x20000;
return 0; return 0;
} }
@ -164,22 +160,24 @@ void retro_set_input_state(retro_input_state_t cb)
void retro_set_controller_port_device(unsigned port, unsigned device) void retro_set_controller_port_device(unsigned port, unsigned device)
{ {
if (port > 0) return; // GBA Only supports 1 controller
log_cb(RETRO_LOG_INFO, "Controller %d'\n", device); log_cb(RETRO_LOG_INFO, "Controller %d'\n", device);
switch (device) { switch (device) {
case RETRO_DEVICE_JOYPAD: case RETRO_DEVICE_JOYPAD:
case RETRO_DEVICE_GBA: case RETRO_DEVICE_GBA:
default: default:
controller_layout[port] = 0; controller_layout = 0;
break; break;
case RETRO_DEVICE_GBA_ALT1: case RETRO_DEVICE_GBA_ALT1:
controller_layout[port] = 1; controller_layout = 1;
break; break;
case RETRO_DEVICE_GBA_ALT2: case RETRO_DEVICE_GBA_ALT2:
controller_layout[port] = 2; controller_layout = 2;
break; break;
case RETRO_DEVICE_NONE: case RETRO_DEVICE_NONE:
controller_layout[port] = -1; controller_layout = -1;
break; break;
} }
} }
@ -189,6 +187,7 @@ void retro_set_environment(retro_environment_t cb)
environ_cb = cb; environ_cb = cb;
struct retro_variable variables[] = { 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_usebios", "Use BIOS file (Restart); disabled|enabled" },
{ "vbam_layer_1", "Show layer 1; enabled|disabled" }, { "vbam_layer_1", "Show layer 1; enabled|disabled" },
{ "vbam_layer_2", "Show layer 2; enabled|disabled" }, { "vbam_layer_2", "Show layer 2; enabled|disabled" },
@ -205,12 +204,11 @@ void retro_set_environment(retro_environment_t cb)
{ "GBA Joypad", RETRO_DEVICE_GBA }, { "GBA Joypad", RETRO_DEVICE_GBA },
{ "Alt Joypad YB", RETRO_DEVICE_GBA_ALT1 }, { "Alt Joypad YB", RETRO_DEVICE_GBA_ALT1 },
{ "Alt Joypad AB", RETRO_DEVICE_GBA_ALT2 }, { "Alt Joypad AB", RETRO_DEVICE_GBA_ALT2 },
{ NULL, 0 },
}; };
static const struct retro_controller_info ports[] = {{ port_1, 3 },{ NULL,0 }}; static const struct retro_controller_info ports[] = {{ port_1, 3 },{ NULL,0 }};
cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports);
} }
@ -446,6 +444,7 @@ static void gba_init(void)
flashSize = 0x10000; flashSize = 0x10000;
enableRtc = false; enableRtc = false;
mirroringEnable = false; mirroringEnable = false;
#ifdef FRONTEND_SUPPORTS_RGB565 #ifdef FRONTEND_SUPPORTS_RGB565
systemColorDepth = 16; systemColorDepth = 16;
systemRedShift = 11; systemRedShift = 11;
@ -476,10 +475,7 @@ static void gba_init(void)
soundInit(); soundInit();
soundSetSampleRate(32000); soundSetSampleRate(32000);
if (usebios && biosfile[0]) CPUInit(biosfile, usebios);
CPUInit(biosfile, true);
else
CPUInit(0, false);
CPUReset(); CPUReset();
@ -504,46 +500,51 @@ void retro_reset(void)
CPUReset(); CPUReset();
} }
static const unsigned binds[] = { #define MAX_BUTTONS 10
RETRO_DEVICE_ID_JOYPAD_A, static const unsigned binds[3][MAX_BUTTONS] = {
RETRO_DEVICE_ID_JOYPAD_B, {
RETRO_DEVICE_ID_JOYPAD_SELECT, RETRO_DEVICE_ID_JOYPAD_A,
RETRO_DEVICE_ID_JOYPAD_START, RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_RIGHT, RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_LEFT, RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_UP, RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_DOWN, RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_R, RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_L RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_L
},
{
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_Y,
RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_L
},
{
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_A,
RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_L
}
}; };
static const unsigned binds1[] = { static void systemUpdateSolarSensor(int level);
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_Y,
RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_L
};
static const unsigned binds2[] = {
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_A,
RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_L
};
static unsigned has_frame; static unsigned has_frame;
static uint8_t sensorDarkness = 0xE8;
static uint8_t sensorDarknessLevel = 0; // so we can adjust sensor from gamepad
static void update_variables(void) static void update_variables(void)
{ {
@ -575,6 +576,15 @@ static void update_variables(void)
bool newval = (strcmp(var.value, "enabled") == 0); bool newval = (strcmp(var.value, "enabled") == 0);
usebios = newval; usebios = newval;
} }
var.key = "vbam_solarsensor";
var.value = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
sensorDarknessLevel = atoi(var.value);
systemUpdateSolarSensor(sensorDarknessLevel);
}
} }
#ifdef FINAL_VERSION #ifdef FINAL_VERSION
@ -586,11 +596,37 @@ static void update_variables(void)
void retro_run(void) void retro_run(void)
{ {
bool updated = false; bool updated = false;
static bool buttonpressed = false;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated)
update_variables(); update_variables();
poll_cb(); poll_cb();
// Update solar sensor level by gamepad buttons, default L2/R2
if (buttonpressed)
{
buttonpressed = input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2) ||
input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2);
}
else
{
if (input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2))
{
sensorDarknessLevel++;
if (sensorDarknessLevel > 10)
sensorDarknessLevel = 10;
systemUpdateSolarSensor(sensorDarknessLevel);
buttonpressed = true;
}
else if (input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2))
{
if (sensorDarknessLevel)
sensorDarknessLevel--;
systemUpdateSolarSensor(sensorDarknessLevel);
buttonpressed = true;
}
} // end of solar sensor update
has_frame = 0; has_frame = 0;
do { do {
@ -615,6 +651,7 @@ bool retro_unserialize(const void* data, size_t size)
void retro_cheat_reset(void) void retro_cheat_reset(void)
{ {
cheatsEnabled = 1;
cheatsDeleteAll(false); cheatsDeleteAll(false);
} }
@ -724,6 +761,8 @@ bool retro_load_game(const struct retro_game_info *game)
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "Solar Sensor (Darker)" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Solar Sensor (Lighter)" },
{ 0 }, { 0 },
}; };
@ -765,10 +804,11 @@ bool retro_load_game(const struct retro_game_info *game)
} }
bool retro_load_game_special( bool retro_load_game_special(
unsigned game_type, unsigned game_type,
const struct retro_game_info *info, size_t num_info const struct retro_game_info *info, size_t num_info)
) {
{ return false; } return false;
}
extern unsigned g_audio_frames; extern unsigned g_audio_frames;
static unsigned g_video_frames; static unsigned g_video_frames;
@ -791,8 +831,15 @@ void systemOnWriteDataToSoundBuffer(const uint16_t* finalWave, int length)
{ {
} }
void systemOnSoundShutdown() {} void systemOnSoundShutdown()
bool systemCanChangeSoundQuality() { return true; } {
}
bool systemCanChangeSoundQuality()
{
return true;
}
#ifdef FRONTEND_SUPPORTS_RGB565 #ifdef FRONTEND_SUPPORTS_RGB565
#define BPP 2 #define BPP 2
@ -853,27 +900,55 @@ uint32_t systemReadJoypad(int which)
if (which == -1) if (which == -1)
which = 0; which = 0;
unsigned ControllerLayout = controller_layout;
uint32_t J = 0; uint32_t J = 0;
for (unsigned i = 0; i < 10; i++) { for (unsigned i = 0; i < MAX_BUTTONS; i++)
if (controller_layout[0] == 1) J |= input_cb(which, RETRO_DEVICE_JOYPAD, 0, binds[ControllerLayout][i]) << i;
J |= input_cb(which, RETRO_DEVICE_JOYPAD, 0, binds1[i]) << i;
else if (controller_layout[0] == 2) // Do not allow opposing directions
J |= input_cb(which, RETRO_DEVICE_JOYPAD, 0, binds2[i]) << i; if ((J & 0x30) == 0x30)
else if (controller_layout[0] == -1) J &= ~(0x30);
break; else if ((J & 0xC0) == 0xC0)
else J &= ~(0xC0);
J |= input_cb(which, RETRO_DEVICE_JOYPAD, 0, binds[i]) << i;
}
return J; return J;
} }
bool systemReadJoypads() { return true; } static void systemUpdateSolarSensor(int v)
{
int value = 0;
switch (v)
{
case 1: value = 0x06; break;
case 2: value = 0x0E; break;
case 3: value = 0x18; break;
case 4: value = 0x20; break;
case 5: value = 0x28; break;
case 6: value = 0x38; break;
case 7: value = 0x48; break;
case 8: value = 0x60; break;
case 9: value = 0x78; break;
case 10: value = 0x98; break;
default: break;
}
void systemUpdateMotionSensor() {} sensorDarkness = 0xE8 - value;
}
uint8_t systemGetSensorDarkness() { return 0; } bool systemReadJoypads()
{
return true;
}
void systemUpdateMotionSensor()
{
}
uint8_t systemGetSensorDarkness()
{
return sensorDarkness;
}
void systemCartridgeRumble(bool) void systemCartridgeRumble(bool)
{ {
@ -900,6 +975,5 @@ uint32_t systemGetClock()
SoundDriver* systemSoundInit() SoundDriver* systemSoundInit()
{ {
soundShutdown(); soundShutdown();
return new SoundRetro(); return new SoundRetro();
} }