mirror of https://github.com/bsnes-emu/bsnes.git
libretro: allow changing model at runtime again, also do not reset both gameboys on model change in dual mode
This commit is contained in:
parent
ca9249d4db
commit
d6879c4f8a
|
@ -233,7 +233,7 @@ static const struct retro_variable vars_single[] = {
|
||||||
{ "sameboy_dual", "Single cart dual mode (reload); disabled|enabled" },
|
{ "sameboy_dual", "Single cart dual mode (reload); disabled|enabled" },
|
||||||
{ "sameboy_color_correction_mode", "Color correction; off|correct curves|emulate hardware|preserve brightness" },
|
{ "sameboy_color_correction_mode", "Color correction; off|correct curves|emulate hardware|preserve brightness" },
|
||||||
{ "sameboy_high_pass_filter_mode", "High-pass filter; off|accurate|remove dc offset" },
|
{ "sameboy_high_pass_filter_mode", "High-pass filter; off|accurate|remove dc offset" },
|
||||||
{ "sameboy_model", "Emulated model (reload); Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
{ "sameboy_model", "Emulated model; Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -244,8 +244,8 @@ static const struct retro_variable vars_single_dual[] = {
|
||||||
/*{ "sameboy_ir", "Infrared Sensor Emulation; disabled|enabled" },*/
|
/*{ "sameboy_ir", "Infrared Sensor Emulation; disabled|enabled" },*/
|
||||||
{ "sameboy_screen_layout", "Screen layout; top-down|left-right" },
|
{ "sameboy_screen_layout", "Screen layout; top-down|left-right" },
|
||||||
{ "sameboy_audio_output", "Audio output; Game Boy #1|Game Boy #2" },
|
{ "sameboy_audio_output", "Audio output; Game Boy #1|Game Boy #2" },
|
||||||
{ "sameboy_model_1", "Emulated model for Game Boy #1 (reload); Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
{ "sameboy_model_1", "Emulated model for Game Boy #1; Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
||||||
{ "sameboy_model_2", "Emulated model for Game Boy #2 (reload); Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
{ "sameboy_model_2", "Emulated model for Game Boy #2; Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
||||||
{ "sameboy_color_correction_mode_1", "Color correction for Game Boy #1; off|correct curves|emulate hardware|preserve brightness" },
|
{ "sameboy_color_correction_mode_1", "Color correction for Game Boy #1; off|correct curves|emulate hardware|preserve brightness" },
|
||||||
{ "sameboy_color_correction_mode_2", "Color correction for Game Boy #2; off|correct curves|emulate hardware|preserve brightness" },
|
{ "sameboy_color_correction_mode_2", "Color correction for Game Boy #2; off|correct curves|emulate hardware|preserve brightness" },
|
||||||
{ "sameboy_high_pass_filter_mode_1", "High-pass filter for Game Boy #1; off|accurate|remove dc offset" },
|
{ "sameboy_high_pass_filter_mode_1", "High-pass filter for Game Boy #1; off|accurate|remove dc offset" },
|
||||||
|
@ -259,8 +259,8 @@ static const struct retro_variable vars_dual[] = {
|
||||||
/*{ "sameboy_ir", "Infrared Sensor Emulation; disabled|enabled" },*/
|
/*{ "sameboy_ir", "Infrared Sensor Emulation; disabled|enabled" },*/
|
||||||
{ "sameboy_screen_layout", "Screen layout; top-down|left-right" },
|
{ "sameboy_screen_layout", "Screen layout; top-down|left-right" },
|
||||||
{ "sameboy_audio_output", "Audio output; Game Boy #1|Game Boy #2" },
|
{ "sameboy_audio_output", "Audio output; Game Boy #1|Game Boy #2" },
|
||||||
{ "sameboy_model_1", "Emulated model for Game Boy #1 (reload); Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
{ "sameboy_model_1", "Emulated model for Game Boy #1; Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
||||||
{ "sameboy_model_2", "Emulated model for Game Boy #2 (reload); Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
{ "sameboy_model_2", "Emulated model for Game Boy #2; Game Boy Color|Game Boy Advance|Auto|Game Boy" },
|
||||||
{ "sameboy_color_correction_mode_1", "Color correction for Game Boy #1; off|correct curves|emulate hardware|preserve brightness" },
|
{ "sameboy_color_correction_mode_1", "Color correction for Game Boy #1; off|correct curves|emulate hardware|preserve brightness" },
|
||||||
{ "sameboy_color_correction_mode_2", "Color correction for Game Boy #2; off|correct curves|emulate hardware|preserve brightness" },
|
{ "sameboy_color_correction_mode_2", "Color correction for Game Boy #2; off|correct curves|emulate hardware|preserve brightness" },
|
||||||
{ "sameboy_high_pass_filter_mode_1", "High-pass filter for Game Boy #1; off|accurate|remove dc offset" },
|
{ "sameboy_high_pass_filter_mode_1", "High-pass filter for Game Boy #1; off|accurate|remove dc offset" },
|
||||||
|
@ -310,40 +310,37 @@ static void set_link_cable_state(bool state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_for_current_model(void)
|
static void init_for_current_model(unsigned id)
|
||||||
{
|
{
|
||||||
unsigned i = 0;
|
unsigned i = id;
|
||||||
enum model effective_model[2];
|
enum model effective_model;
|
||||||
for (i=0; i < emulated_devices; i++)
|
|
||||||
{
|
effective_model = model[i];
|
||||||
effective_model[i] = model[i];
|
if (effective_model == MODEL_AUTO) {
|
||||||
if (effective_model[i] == MODEL_AUTO) {
|
effective_model = auto_model;
|
||||||
effective_model[i] = auto_model;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < emulated_devices; i++)
|
|
||||||
{
|
|
||||||
if (GB_is_inited(&gameboy[i])) {
|
|
||||||
GB_switch_model_and_reset(&gameboy[i], libretro_to_internal_model[effective_model[i]]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
GB_init(&gameboy[i], libretro_to_internal_model[effective_model[i]]);
|
|
||||||
}
|
|
||||||
const char *model_name = (const char *[]){"dmg", "cgb", "agb"}[effective_model[i]];
|
|
||||||
const unsigned char *boot_code = (const unsigned char *[]){dmg_boot, cgb_boot, agb_boot}[effective_model[i]];
|
|
||||||
unsigned boot_length = (unsigned []){dmg_boot_length, cgb_boot_length, agb_boot_length}[effective_model[i]];
|
|
||||||
|
|
||||||
char buf[256];
|
if (GB_is_inited(&gameboy[i])) {
|
||||||
snprintf(buf, sizeof(buf), "%s%c%s_boot.bin", retro_system_directory, slash, model_name);
|
GB_switch_model_and_reset(&gameboy[i], libretro_to_internal_model[effective_model]);
|
||||||
log_cb(RETRO_LOG_INFO, "Loading boot image: %s\n", buf);
|
|
||||||
if (GB_load_boot_rom(&gameboy[i], buf))
|
|
||||||
GB_load_boot_rom_from_buffer(&gameboy[i], boot_code, boot_length);
|
|
||||||
GB_set_user_data(&gameboy[i], (void*)NULL);
|
|
||||||
GB_set_pixels_output(&gameboy[i],(unsigned int*)(frame_buf + i * VIDEO_PIXELS));
|
|
||||||
GB_set_rgb_encode_callback(&gameboy[i], rgb_encode);
|
|
||||||
GB_set_sample_rate(&gameboy[i], AUDIO_FREQUENCY);
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
GB_init(&gameboy[i], libretro_to_internal_model[effective_model]);
|
||||||
|
}
|
||||||
|
const char *model_name = (const char *[]){"dmg", "cgb", "agb"}[effective_model];
|
||||||
|
const unsigned char *boot_code = (const unsigned char *[]){dmg_boot, cgb_boot, agb_boot}[effective_model];
|
||||||
|
unsigned boot_length = (unsigned []){dmg_boot_length, cgb_boot_length, agb_boot_length}[effective_model];
|
||||||
|
|
||||||
|
char buf[256];
|
||||||
|
snprintf(buf, sizeof(buf), "%s%c%s_boot.bin", retro_system_directory, slash, model_name);
|
||||||
|
log_cb(RETRO_LOG_INFO, "Initializing as model: %s\n", model_name);
|
||||||
|
log_cb(RETRO_LOG_INFO, "Loading boot image: %s\n", buf);
|
||||||
|
if (GB_load_boot_rom(&gameboy[i], buf))
|
||||||
|
GB_load_boot_rom_from_buffer(&gameboy[i], boot_code, boot_length);
|
||||||
|
GB_set_user_data(&gameboy[i], (void*)NULL);
|
||||||
|
GB_set_pixels_output(&gameboy[i],(unsigned int*)(frame_buf + i * VIDEO_PIXELS));
|
||||||
|
GB_set_rgb_encode_callback(&gameboy[i], rgb_encode);
|
||||||
|
GB_set_sample_rate(&gameboy[i], AUDIO_FREQUENCY);
|
||||||
|
|
||||||
/* todo: attempt to make these more generic */
|
/* todo: attempt to make these more generic */
|
||||||
GB_set_vblank_callback(&gameboy[0], (GB_vblank_callback_t) vblank1);
|
GB_set_vblank_callback(&gameboy[0], (GB_vblank_callback_t) vblank1);
|
||||||
|
@ -401,7 +398,6 @@ static void init_for_current_model(void)
|
||||||
static void check_variables(bool link)
|
static void check_variables(bool link)
|
||||||
{
|
{
|
||||||
struct retro_variable var = {0};
|
struct retro_variable var = {0};
|
||||||
|
|
||||||
if (!link)
|
if (!link)
|
||||||
{
|
{
|
||||||
var.key = "sameboy_color_correction_mode";
|
var.key = "sameboy_color_correction_mode";
|
||||||
|
@ -445,6 +441,7 @@ static void check_variables(bool link)
|
||||||
new_model = MODEL_AUTO;
|
new_model = MODEL_AUTO;
|
||||||
|
|
||||||
model[0] = new_model;
|
model[0] = new_model;
|
||||||
|
init_for_current_model(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -515,7 +512,11 @@ static void check_variables(bool link)
|
||||||
else
|
else
|
||||||
new_model = MODEL_AUTO;
|
new_model = MODEL_AUTO;
|
||||||
|
|
||||||
model[0] = new_model;
|
if (model[0] != new_model)
|
||||||
|
{
|
||||||
|
model[0] = new_model;
|
||||||
|
init_for_current_model(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "sameboy_model_2";
|
var.key = "sameboy_model_2";
|
||||||
|
@ -532,7 +533,11 @@ static void check_variables(bool link)
|
||||||
else
|
else
|
||||||
new_model = MODEL_AUTO;
|
new_model = MODEL_AUTO;
|
||||||
|
|
||||||
model[1] = new_model;
|
if (model[1] != new_model)
|
||||||
|
{
|
||||||
|
model[1] = new_model;
|
||||||
|
init_for_current_model(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -790,6 +795,7 @@ bool retro_load_game(const struct retro_game_info *info)
|
||||||
{
|
{
|
||||||
environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void *)vars_single);
|
environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void *)vars_single);
|
||||||
check_variables(false);
|
check_variables(false);
|
||||||
|
|
||||||
if (sameboy_dual)
|
if (sameboy_dual)
|
||||||
{
|
{
|
||||||
emulated_devices = 2;
|
emulated_devices = 2;
|
||||||
|
@ -816,10 +822,9 @@ bool retro_load_game(const struct retro_game_info *info)
|
||||||
auto_model = (info->path[strlen(info->path) - 1] & ~0x20) == 'C' ? MODEL_CGB : MODEL_DMG;
|
auto_model = (info->path[strlen(info->path) - 1] & ~0x20) == 'C' ? MODEL_CGB : MODEL_DMG;
|
||||||
snprintf(retro_game_path, sizeof(retro_game_path), "%s", info->path);
|
snprintf(retro_game_path, sizeof(retro_game_path), "%s", info->path);
|
||||||
|
|
||||||
init_for_current_model();
|
|
||||||
|
|
||||||
for (int i = 0; i < emulated_devices; i++)
|
for (int i = 0; i < emulated_devices; i++)
|
||||||
{
|
{
|
||||||
|
init_for_current_model(i);
|
||||||
if (GB_load_rom(&gameboy[i],info->path))
|
if (GB_load_rom(&gameboy[i],info->path))
|
||||||
{
|
{
|
||||||
log_cb(RETRO_LOG_INFO, "Failed to load ROM at %s\n", info->path);
|
log_cb(RETRO_LOG_INFO, "Failed to load ROM at %s\n", info->path);
|
||||||
|
@ -905,9 +910,9 @@ bool retro_load_game_special(unsigned type, const struct retro_game_info *info,
|
||||||
auto_model = (info->path[strlen(info->path) - 1] & ~0x20) == 'C' ? MODEL_CGB : MODEL_DMG;
|
auto_model = (info->path[strlen(info->path) - 1] & ~0x20) == 'C' ? MODEL_CGB : MODEL_DMG;
|
||||||
snprintf(retro_game_path, sizeof(retro_game_path), "%s", info->path);
|
snprintf(retro_game_path, sizeof(retro_game_path), "%s", info->path);
|
||||||
|
|
||||||
init_for_current_model();
|
|
||||||
for (int i = 0; i < emulated_devices; i++)
|
for (int i = 0; i < emulated_devices; i++)
|
||||||
{
|
{
|
||||||
|
init_for_current_model(i);
|
||||||
if (GB_load_rom(&gameboy[i], info[i].path))
|
if (GB_load_rom(&gameboy[i], info[i].path))
|
||||||
{
|
{
|
||||||
log_cb(RETRO_LOG_INFO, "Failed to load ROM\n");
|
log_cb(RETRO_LOG_INFO, "Failed to load ROM\n");
|
||||||
|
|
Loading…
Reference in New Issue