libretro: Update input descriptors for 4-player SGB and cleanup...
- Updates descriptors for 4-player SGB - Remove alternate gamepad layouts for GBA - Prevent crash when SGB border option executes at startup when GB is not initialized yet - Update input turbo function for 4-player support - Minor cleanups (texts, style nits, etc)...
This commit is contained in:
parent
9d058abb41
commit
a2b3dd76a1
|
@ -31,10 +31,6 @@
|
||||||
#include "../gb/gbSGB.h"
|
#include "../gb/gbSGB.h"
|
||||||
#include "../gb/gbSound.h"
|
#include "../gb/gbSound.h"
|
||||||
|
|
||||||
#define RETRO_DEVICE_GBA RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 0)
|
|
||||||
#define RETRO_DEVICE_GBA_ALT1 RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1)
|
|
||||||
#define RETRO_DEVICE_GBA_ALT2 RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 2)
|
|
||||||
|
|
||||||
static retro_log_printf_t log_cb;
|
static retro_log_printf_t log_cb;
|
||||||
static retro_video_refresh_t video_cb;
|
static retro_video_refresh_t video_cb;
|
||||||
static retro_input_poll_t poll_cb;
|
static retro_input_poll_t poll_cb;
|
||||||
|
@ -48,7 +44,7 @@ static float sndFiltering = 0.5f;
|
||||||
static bool sndInterpolation = true;
|
static bool sndInterpolation = true;
|
||||||
static bool can_dupe = false;
|
static bool can_dupe = false;
|
||||||
static bool usebios = false;
|
static bool usebios = false;
|
||||||
static unsigned retropad_layout = 1;
|
static unsigned retropad_device[4] = {0};
|
||||||
|
|
||||||
static const double FramesPerSecond = (16777216.0 / 280896.0); // 59.73
|
static const double FramesPerSecond = (16777216.0 / 280896.0); // 59.73
|
||||||
static const long SampleRate = 32768;
|
static const long SampleRate = 32768;
|
||||||
|
@ -348,30 +344,116 @@ void retro_set_input_state(retro_input_state_t cb)
|
||||||
|
|
||||||
static void update_input_descriptors(void);
|
static void update_input_descriptors(void);
|
||||||
|
|
||||||
|
static struct retro_input_descriptor input_gba[] = {
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Turbo B" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo A" },
|
||||||
|
{ 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_L2, "Solar Sensor (Darker)" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Solar Sensor (Lighter)" },
|
||||||
|
{ 0, 0, 0, 0, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct retro_input_descriptor input_gb[] = {
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo B" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Turbo A" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" },
|
||||||
|
{ 0, 0, 0, 0, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct retro_input_descriptor input_sgb[] = {
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo B" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Turbo A" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" },
|
||||||
|
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo B" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Turbo A" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" },
|
||||||
|
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo B" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Turbo A" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" },
|
||||||
|
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo B" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Turbo A" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" },
|
||||||
|
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" },
|
||||||
|
{ 0, 0, 0, 0, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct retro_controller_description port_gba[] = {
|
||||||
|
{ "GBA Joypad", RETRO_DEVICE_JOYPAD },
|
||||||
|
{ NULL, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct retro_controller_description port_gb[] = {
|
||||||
|
{ "GB Joypad", RETRO_DEVICE_JOYPAD },
|
||||||
|
{ NULL, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct retro_controller_info ports_gba[] = {
|
||||||
|
{ port_gba, 1},
|
||||||
|
{ NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct retro_controller_info ports_gb[] = {
|
||||||
|
{ port_gb, 1},
|
||||||
|
{ NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct retro_controller_info ports_sgb[] = {
|
||||||
|
{ port_gb, 1},
|
||||||
|
{ port_gb, 1},
|
||||||
|
{ port_gb, 1},
|
||||||
|
{ port_gb, 1},
|
||||||
|
{ NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
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
|
if (port > 3) return;
|
||||||
|
|
||||||
log_cb(RETRO_LOG_INFO, "Controller %d'\n", device);
|
retropad_device[port] = device;
|
||||||
switch (device) {
|
log_cb(RETRO_LOG_INFO, "Controller %d device: %d\n", port + 1, device);
|
||||||
|
|
||||||
case RETRO_DEVICE_JOYPAD:
|
|
||||||
case RETRO_DEVICE_GBA:
|
|
||||||
default:
|
|
||||||
retropad_layout = 1;
|
|
||||||
break;
|
|
||||||
case RETRO_DEVICE_GBA_ALT1:
|
|
||||||
retropad_layout = 2;
|
|
||||||
break;
|
|
||||||
case RETRO_DEVICE_GBA_ALT2:
|
|
||||||
retropad_layout = 3;
|
|
||||||
break;
|
|
||||||
case RETRO_DEVICE_NONE:
|
|
||||||
retropad_layout = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
update_input_descriptors();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void retro_set_environment(retro_environment_t cb)
|
void retro_set_environment(retro_environment_t cb)
|
||||||
|
@ -404,20 +486,7 @@ void retro_set_environment(retro_environment_t cb)
|
||||||
{ NULL, NULL },
|
{ NULL, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct retro_controller_description port_1[] = {
|
|
||||||
{ "GBA Joypad", RETRO_DEVICE_JOYPAD },
|
|
||||||
{ "Alt Joypad YB", RETRO_DEVICE_GBA_ALT1 },
|
|
||||||
{ "Alt Joypad AB", RETRO_DEVICE_GBA_ALT2 },
|
|
||||||
{ 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void retro_get_system_info(struct retro_system_info *info)
|
void retro_get_system_info(struct retro_system_info *info)
|
||||||
|
@ -700,7 +769,6 @@ static void update_colormaps(void)
|
||||||
log("Color Depth = %d\n", systemColorDepth);
|
log("Color Depth = %d\n", systemColorDepth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static const char SLASH = '\\';
|
static const char SLASH = '\\';
|
||||||
#else
|
#else
|
||||||
|
@ -796,14 +864,14 @@ static void gb_init(void)
|
||||||
crc16 -= gbRom[0x14e] + gbRom[0x14f];
|
crc16 -= gbRom[0x14e] + gbRom[0x14f];
|
||||||
log("Checksum : %04x (%04x)\n", crc16, gbRom[0x14e] * 256 + gbRom[0x14f]);
|
log("Checksum : %04x (%04x)\n", crc16, gbRom[0x14e] * 256 + gbRom[0x14f]);
|
||||||
|
|
||||||
if (gb_hasbattery)
|
if (gb_hasbattery())
|
||||||
log(": Game supports battery save ram.\n");
|
log("Game supports battery save ram.\n");
|
||||||
if (gbRom[0x143] == 0xc0)
|
if (gbRom[0x143] == 0xc0)
|
||||||
log(": Game works on CGB only\n");
|
log("Game works on CGB only\n");
|
||||||
else if (gbRom[0x143] == 0x80)
|
else if (gbRom[0x143] == 0x80)
|
||||||
log(": Game supports GBC functions, GB compatible.\n");
|
log("Game supports GBC functions, GB compatible.\n");
|
||||||
if (gbRom[0x146] == 0x03)
|
if (gbRom[0x146] == 0x03)
|
||||||
log(": Game supports SGB functions\n");
|
log("Game supports SGB functions\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gba_soundchanged(void)
|
static void gba_soundchanged(void)
|
||||||
|
@ -827,66 +895,28 @@ void retro_reset(void)
|
||||||
eepromSize = tmp;
|
eepromSize = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_PLAYERS 4
|
||||||
#define MAX_BUTTONS 10
|
#define MAX_BUTTONS 10
|
||||||
static const unsigned binds[4][MAX_BUTTONS] = {
|
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // placeholder for no input
|
|
||||||
{
|
|
||||||
RETRO_DEVICE_ID_JOYPAD_A,
|
|
||||||
RETRO_DEVICE_ID_JOYPAD_B,
|
|
||||||
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_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
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#define TURBO_BUTTONS 2
|
#define TURBO_BUTTONS 2
|
||||||
static bool turbo_enable = false;
|
static bool turbo_enable = false;
|
||||||
static int turbo_delay = 3;
|
static unsigned turbo_delay = 3;
|
||||||
static int turbo_delay_counter[TURBO_BUTTONS] = {0};
|
static unsigned turbo_delay_counter[MAX_PLAYERS][TURBO_BUTTONS] = {{0}, {0}};
|
||||||
|
static const unsigned binds[MAX_BUTTONS] = {
|
||||||
|
RETRO_DEVICE_ID_JOYPAD_A,
|
||||||
|
RETRO_DEVICE_ID_JOYPAD_B,
|
||||||
|
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 turbo_binds[4][TURBO_BUTTONS] = {
|
static const unsigned turbo_binds[TURBO_BUTTONS] = {
|
||||||
{ 0, 0 }, // placeholder for no input
|
RETRO_DEVICE_ID_JOYPAD_X,
|
||||||
{
|
RETRO_DEVICE_ID_JOYPAD_Y
|
||||||
RETRO_DEVICE_ID_JOYPAD_X,
|
|
||||||
RETRO_DEVICE_ID_JOYPAD_Y
|
|
||||||
},
|
|
||||||
{
|
|
||||||
RETRO_DEVICE_ID_JOYPAD_A,
|
|
||||||
RETRO_DEVICE_ID_JOYPAD_X
|
|
||||||
},
|
|
||||||
{
|
|
||||||
RETRO_DEVICE_ID_JOYPAD_Y,
|
|
||||||
RETRO_DEVICE_ID_JOYPAD_X
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void systemGbBorderOff(void);
|
static void systemGbBorderOff(void);
|
||||||
|
@ -894,7 +924,7 @@ static void systemUpdateSolarSensor(int level);
|
||||||
static uint8_t sensorDarkness = 0xE8;
|
static uint8_t sensorDarkness = 0xE8;
|
||||||
static uint8_t sensorDarknessLevel = 0; // so we can adjust sensor from gamepad
|
static uint8_t sensorDarknessLevel = 0; // so we can adjust sensor from gamepad
|
||||||
|
|
||||||
static void update_variables(void)
|
static void update_variables(bool startup)
|
||||||
{
|
{
|
||||||
bool sound_changed = false;
|
bool sound_changed = false;
|
||||||
char key[256];
|
char key[256];
|
||||||
|
@ -921,7 +951,7 @@ static void update_variables(void)
|
||||||
key[strlen("vbam_sound_")] = '1' + i;
|
key[strlen("vbam_sound_")] = '1' + i;
|
||||||
var.value = NULL;
|
var.value = NULL;
|
||||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && var.value[0] == 'd') {
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && var.value[0] == 'd') {
|
||||||
unsigned which = (i < 4) ? (1 << i) : (0x100 << (i - 4));
|
int which = (i < 4) ? (1 << i) : (0x100 << (i - 4));
|
||||||
sound_enabled &= ~(which);
|
sound_enabled &= ~(which);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -990,7 +1020,8 @@ static void update_variables(void)
|
||||||
gbBorderAutomatic = 0;
|
gbBorderAutomatic = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((type == IMAGE_GB) && (oldval != ((gbBorderOn << 1) | gbBorderAutomatic))) {
|
if ((type == IMAGE_GB) &&
|
||||||
|
(oldval != ((gbBorderOn << 1) | gbBorderAutomatic)) && !startup) {
|
||||||
if (gbBorderOn) {
|
if (gbBorderOn) {
|
||||||
systemGbBorderOn();
|
systemGbBorderOn();
|
||||||
gbSgbRenderBorder();
|
gbSgbRenderBorder();
|
||||||
|
@ -1040,8 +1071,9 @@ void retro_run(void)
|
||||||
{
|
{
|
||||||
bool updated = false;
|
bool updated = false;
|
||||||
static bool buttonpressed = 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(false);
|
||||||
|
|
||||||
poll_cb();
|
poll_cb();
|
||||||
|
|
||||||
|
@ -1175,82 +1207,22 @@ void retro_cheat_set(unsigned index, bool enabled, const char* code)
|
||||||
|
|
||||||
static void update_input_descriptors(void)
|
static void update_input_descriptors(void)
|
||||||
{
|
{
|
||||||
struct retro_input_descriptor input_gba[] = {
|
if (type == IMAGE_GB) {
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
if (gbSgbMode) {
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports_sgb);
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, input_sgb);
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
} else {
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" },
|
environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports_gb);
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" },
|
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, input_gb);
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" },
|
}
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" },
|
} else if (type == IMAGE_GBA) {
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Turbo B" },
|
environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports_gba);
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo A" },
|
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, input_gba);
|
||||||
{ 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_L2, "Solar Sensor (Darker)" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Solar Sensor (Lighter)" },
|
|
||||||
|
|
||||||
{ 0, 0, 0, 0, NULL },
|
|
||||||
};
|
|
||||||
|
|
||||||
struct retro_input_descriptor input_gba_alt1[] = {
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "B" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo B" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Turbo A" },
|
|
||||||
{ 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_L2, "Solar Sensor (Darker)" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Solar Sensor (Lighter)" },
|
|
||||||
|
|
||||||
{ 0, 0, 0, 0, NULL },
|
|
||||||
};
|
|
||||||
|
|
||||||
struct retro_input_descriptor input_gba_alt2[] = {
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Turbo B" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Turbo A" },
|
|
||||||
{ 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_L2, "Solar Sensor (Darker)" },
|
|
||||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Solar Sensor (Lighter)" },
|
|
||||||
|
|
||||||
{ 0, 0, 0, 0, NULL },
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (retropad_layout)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, input_gba);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, input_gba_alt1);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, input_gba_alt2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool retro_load_game(const struct retro_game_info *game)
|
bool retro_load_game(const struct retro_game_info *game)
|
||||||
{
|
{
|
||||||
update_variables();
|
|
||||||
update_input_descriptors();
|
|
||||||
|
|
||||||
type = utilFindType((const char *)game->path);
|
type = utilFindType((const char *)game->path);
|
||||||
|
|
||||||
if (type == IMAGE_UNKNOWN) {
|
if (type == IMAGE_UNKNOWN) {
|
||||||
|
@ -1258,6 +1230,7 @@ bool retro_load_game(const struct retro_game_info *game)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_variables(true);
|
||||||
update_colormaps();
|
update_colormaps();
|
||||||
soundInit();
|
soundInit();
|
||||||
|
|
||||||
|
@ -1315,26 +1288,25 @@ bool retro_load_game(const struct retro_game_info *game)
|
||||||
|
|
||||||
memset(desc, 0, sizeof(desc));
|
memset(desc, 0, sizeof(desc));
|
||||||
// the GB's memory is divided into 16 parts with 4096 bytes each == 65536
|
// the GB's memory is divided into 16 parts with 4096 bytes each == 65536
|
||||||
|
// $FFFF Interrupt Enable Flag
|
||||||
|
// $FF80-$FFFE Zero Page - 127 bytes
|
||||||
|
// $FF00-$FF7F Hardware I/O Registers
|
||||||
|
// $FEA0-$FEFF Unusable Memory
|
||||||
|
// $FE00-$FE9F OAM - Object Attribute Memory
|
||||||
|
// $E000-$FDFF Echo RAM - Reserved, Do Not Use
|
||||||
|
// $D000-$DFFF Internal RAM - Bank 1-7 (switchable - CGB only)
|
||||||
|
// $C000-$CFFF Internal RAM - Bank 0 (fixed)
|
||||||
|
// $A000-$BFFF Cartridge RAM (If Available)
|
||||||
|
// $9C00-$9FFF BG Map Data 2
|
||||||
|
// $9800-$9BFF BG Map Data 1
|
||||||
|
// $8000-$97FF Character RAM
|
||||||
|
// $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx
|
||||||
|
// $0150-$3FFF Cartridge ROM - Bank 0 (fixed)
|
||||||
|
// $0100-$014F Cartridge Header Area
|
||||||
|
// $0000-$00FF Restart and Interrupt Vectors
|
||||||
|
// http://gameboy.mongenel.com/dmg/asmmemmap.html
|
||||||
for (addr = 0, i = 0; addr < 16; addr++) {
|
for (addr = 0, i = 0; addr < 16; addr++) {
|
||||||
if (gbMemoryMap[addr] != NULL) {
|
if (gbMemoryMap[addr] != NULL) {
|
||||||
// $FFFF Interrupt Enable Flag
|
|
||||||
// $FF80-$FFFE Zero Page - 127 bytes
|
|
||||||
// $FF00-$FF7F Hardware I/O Registers
|
|
||||||
// $FEA0-$FEFF Unusable Memory
|
|
||||||
// $FE00-$FE9F OAM - Object Attribute Memory
|
|
||||||
// $E000-$FDFF Echo RAM - Reserved, Do Not Use
|
|
||||||
// $D000-$DFFF Internal RAM - Bank 1-7 (switchable - CGB only)
|
|
||||||
// $C000-$CFFF Internal RAM - Bank 0 (fixed)
|
|
||||||
// $A000-$BFFF Cartridge RAM (If Available)
|
|
||||||
// $9C00-$9FFF BG Map Data 2
|
|
||||||
// $9800-$9BFF BG Map Data 1
|
|
||||||
// $8000-$97FF Character RAM
|
|
||||||
// $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx
|
|
||||||
// $0150-$3FFF Cartridge ROM - Bank 0 (fixed)
|
|
||||||
// $0100-$014F Cartridge Header Area
|
|
||||||
// $0000-$00FF Restart and Interrupt Vectors
|
|
||||||
// http://gameboy.mongenel.com/dmg/asmmemmap.html
|
|
||||||
|
|
||||||
desc[i].ptr = gbMemoryMap[addr];
|
desc[i].ptr = gbMemoryMap[addr];
|
||||||
desc[i].start = addr * 0x1000;
|
desc[i].start = addr * 0x1000;
|
||||||
desc[i].len = 4096;
|
desc[i].len = 4096;
|
||||||
|
@ -1351,6 +1323,8 @@ bool retro_load_game(const struct retro_game_info *game)
|
||||||
if (!core)
|
if (!core)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
update_input_descriptors(); // Initialize input descriptors and info
|
||||||
|
update_variables(false);
|
||||||
uint8_t* state_buf = (uint8_t*)malloc(2000000);
|
uint8_t* state_buf = (uint8_t*)malloc(2000000);
|
||||||
serialize_size = core->emuWriteState(state_buf, 2000000);
|
serialize_size = core->emuWriteState(state_buf, 2000000);
|
||||||
free(state_buf);
|
free(state_buf);
|
||||||
|
@ -1470,29 +1444,29 @@ int systemGetSensorZ(void)
|
||||||
|
|
||||||
uint32_t systemReadJoypad(int which)
|
uint32_t systemReadJoypad(int which)
|
||||||
{
|
{
|
||||||
|
uint32_t J = 0;
|
||||||
|
unsigned i, buttons = MAX_BUTTONS - ((type == IMAGE_GB) ? 2 : 0); // gb only has 8 buttons
|
||||||
|
|
||||||
if (which == -1)
|
if (which == -1)
|
||||||
which = 0;
|
which = 0;
|
||||||
|
|
||||||
uint32_t J = 0;
|
if (retropad_device[which] == RETRO_DEVICE_JOYPAD) {
|
||||||
|
for (i = 0; i < buttons; i++)
|
||||||
if (retropad_layout) {
|
J |= input_cb(which, RETRO_DEVICE_JOYPAD, 0, binds[i]) << i;
|
||||||
int i;
|
|
||||||
for (i = 0; i < MAX_BUTTONS; i++)
|
|
||||||
J |= input_cb(which, RETRO_DEVICE_JOYPAD, 0, binds[retropad_layout][i]) << i;
|
|
||||||
|
|
||||||
if (turbo_enable) {
|
if (turbo_enable) {
|
||||||
/* Handle Turbo A & B buttons */
|
/* Handle Turbo A & B buttons */
|
||||||
for (i = 0; i < TURBO_BUTTONS; i++) {
|
for (i = 0; i < TURBO_BUTTONS; i++) {
|
||||||
if (input_cb(which, RETRO_DEVICE_JOYPAD, 0, turbo_binds[retropad_layout][i])) {
|
if (input_cb(which, RETRO_DEVICE_JOYPAD, 0, turbo_binds[i])) {
|
||||||
if (!turbo_delay_counter[i])
|
if (!turbo_delay_counter[which][i])
|
||||||
J |= 1 << i;
|
J |= 1 << i;
|
||||||
turbo_delay_counter[i]++;
|
turbo_delay_counter[which][i]++;
|
||||||
if (turbo_delay_counter[i] > turbo_delay)
|
if (turbo_delay_counter[which][i] > turbo_delay)
|
||||||
/* Reset the toggle if delay value is reached */
|
/* Reset the toggle if delay value is reached */
|
||||||
turbo_delay_counter[i] = 0;
|
turbo_delay_counter[which][i] = 0;
|
||||||
} else
|
} else
|
||||||
/* If the button is not pressed, just reset the toggle */
|
/* If the button is not pressed, just reset the toggle */
|
||||||
turbo_delay_counter[i] = 0;
|
turbo_delay_counter[which][i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue