mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
libretro, various fixes (input handling, aspect ratio)
This commit is contained in:
parent
495fe1fdad
commit
e86583124e
3 changed files with 29 additions and 66 deletions
|
@ -94,9 +94,7 @@ static const float VOUT_PAR = 0.0;
|
|||
static const float VOUT_4_3 = (4.0f / 3.0f);
|
||||
static const float VOUT_CRT = (1.29911f);
|
||||
|
||||
static bool show_overscan = false;
|
||||
|
||||
/* Required to allow on the fly changes to 'show overscan' */
|
||||
/* Required to allow on the fly changes to 'renderer' */
|
||||
static int vm_current_start_line = -1;
|
||||
static int vm_current_line_count = -1;
|
||||
static int vm_current_start_col = -1;
|
||||
|
@ -657,17 +655,9 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co
|
|||
if (vout_16bit)
|
||||
PicoDrawSetOutBuf(vout_buf, vout_width * 2);
|
||||
|
||||
if (show_overscan)
|
||||
{
|
||||
vout_height = line_count + (start_line * 2);
|
||||
vout_offset = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
vout_height = line_count;
|
||||
/* Note: We multiply by 2 here to account for pitch */
|
||||
vout_offset = vout_width * start_line * 2;
|
||||
}
|
||||
|
||||
/* Redundant sanity check... */
|
||||
vout_height = (vout_height > VOUT_MAX_HEIGHT) ?
|
||||
|
@ -764,7 +754,7 @@ void retro_get_system_info(struct retro_system_info *info)
|
|||
|
||||
void retro_get_system_av_info(struct retro_system_av_info *info)
|
||||
{
|
||||
int common_height;
|
||||
float tv_height = (vout_height > 144 ? Pico.m.pal ? 240 : 224 : 144);
|
||||
float common_width;
|
||||
|
||||
memset(info, 0, sizeof(*info));
|
||||
|
@ -776,11 +766,10 @@ void retro_get_system_av_info(struct retro_system_av_info *info)
|
|||
info->geometry.max_height = vout_height;
|
||||
|
||||
common_width = vout_width;
|
||||
common_height = vout_height >= 192 && vout_height <= 224 ? 224 : vout_height;
|
||||
if (vout_aspect != 0)
|
||||
common_width = vout_aspect * common_height;
|
||||
common_width = vout_aspect * tv_height;
|
||||
|
||||
info->geometry.aspect_ratio = common_width / common_height;
|
||||
info->geometry.aspect_ratio = common_width / vout_height;
|
||||
}
|
||||
|
||||
/* savestates */
|
||||
|
@ -1312,6 +1301,8 @@ bool retro_load_game(const struct retro_game_info *info)
|
|||
PsndRerate(0);
|
||||
|
||||
PicoDrawSetOutFormat(vout_format, 0);
|
||||
if (vout_format == PDF_8BIT)
|
||||
PicoDrawSetOutBuf(Pico.est.Draw2FB, 328);
|
||||
|
||||
/* Setup retro memory maps */
|
||||
set_memory_maps();
|
||||
|
@ -1407,18 +1398,18 @@ void retro_reset(void)
|
|||
}
|
||||
|
||||
static const unsigned short retro_pico_map[] = {
|
||||
1 << GBTN_B,
|
||||
1 << GBTN_A,
|
||||
1 << GBTN_MODE,
|
||||
1 << GBTN_START,
|
||||
1 << GBTN_UP,
|
||||
1 << GBTN_DOWN,
|
||||
1 << GBTN_LEFT,
|
||||
1 << GBTN_RIGHT,
|
||||
1 << GBTN_C,
|
||||
1 << GBTN_Y,
|
||||
1 << GBTN_X,
|
||||
1 << GBTN_Z,
|
||||
[RETRO_DEVICE_ID_JOYPAD_B] = 1 << GBTN_B,
|
||||
[RETRO_DEVICE_ID_JOYPAD_Y] = 1 << GBTN_A,
|
||||
[RETRO_DEVICE_ID_JOYPAD_SELECT] = 1 << GBTN_MODE,
|
||||
[RETRO_DEVICE_ID_JOYPAD_START] = 1 << GBTN_START,
|
||||
[RETRO_DEVICE_ID_JOYPAD_UP] = 1 << GBTN_UP,
|
||||
[RETRO_DEVICE_ID_JOYPAD_DOWN] = 1 << GBTN_DOWN,
|
||||
[RETRO_DEVICE_ID_JOYPAD_LEFT] = 1 << GBTN_LEFT,
|
||||
[RETRO_DEVICE_ID_JOYPAD_RIGHT] = 1 << GBTN_RIGHT,
|
||||
[RETRO_DEVICE_ID_JOYPAD_A] = 1 << GBTN_C,
|
||||
[RETRO_DEVICE_ID_JOYPAD_X] = 1 << GBTN_Y,
|
||||
[RETRO_DEVICE_ID_JOYPAD_L] = 1 << GBTN_X,
|
||||
[RETRO_DEVICE_ID_JOYPAD_R] = 1 << GBTN_Z,
|
||||
};
|
||||
#define RETRO_PICO_MAP_LEN (sizeof(retro_pico_map) / sizeof(retro_pico_map[0]))
|
||||
|
||||
|
@ -1451,7 +1442,6 @@ static void update_variables(bool first_run)
|
|||
double new_sound_rate;
|
||||
unsigned short old_snd_filter;
|
||||
int32_t old_snd_filter_range;
|
||||
bool old_show_overscan;
|
||||
|
||||
var.value = NULL;
|
||||
var.key = "picodrive_input1";
|
||||
|
@ -1579,15 +1569,6 @@ static void update_variables(bool first_run)
|
|||
PicoIn.opt &= ~POPT_DIS_SPRITE_LIM;
|
||||
}
|
||||
|
||||
old_show_overscan = show_overscan;
|
||||
var.value = NULL;
|
||||
var.key = "picodrive_overscan";
|
||||
show_overscan = false;
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
|
||||
if (strcmp(var.value, "enabled") == 0)
|
||||
show_overscan = true;
|
||||
}
|
||||
|
||||
var.value = NULL;
|
||||
var.key = "picodrive_overclk68k";
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
|
||||
|
@ -1664,6 +1645,8 @@ static void update_variables(bool first_run)
|
|||
if (vout_format == PDF_NONE)
|
||||
PicoIn.opt |= POPT_ALT_RENDERER;
|
||||
PicoDrawSetOutFormat(vout_format, 0);
|
||||
if (vout_format == PDF_8BIT)
|
||||
PicoDrawSetOutBuf(Pico.est.Draw2FB, 328);
|
||||
}
|
||||
|
||||
var.value = NULL;
|
||||
|
@ -1681,7 +1664,7 @@ static void update_variables(bool first_run)
|
|||
}
|
||||
|
||||
/* setup video if required */
|
||||
if (show_overscan != old_show_overscan || vout_format != old_vout_format)
|
||||
if (vout_format != old_vout_format)
|
||||
{
|
||||
if ((vm_current_start_line != -1) &&
|
||||
(vm_current_line_count != -1) &&
|
||||
|
@ -1819,15 +1802,15 @@ void retro_run(void)
|
|||
* with the fast renderer this is improving performance, at the expense of accuracy.
|
||||
*/
|
||||
/* This section is mostly copied from pemu_finalize_frame in platform/linux/emu.c */
|
||||
unsigned short *pd = (unsigned short *)vout_buf;
|
||||
unsigned short *pd = (unsigned short *)((char *)vout_buf + vout_offset);
|
||||
/* Skip the leftmost 8 columns (it is used as an overlap area for rendering) */
|
||||
unsigned char *ps = Pico.est.Draw2FB + 8;
|
||||
unsigned char *ps = Pico.est.Draw2FB + vm_current_start_line * 328 + 8;
|
||||
unsigned short *pal = Pico.est.HighPal;
|
||||
int x;
|
||||
if (Pico.m.dirtyPal)
|
||||
PicoDrawUpdateHighPal();
|
||||
/* Copy up to the max height to include the overscan area, and skip the leftmost 8 columns again */
|
||||
for (i = 0; i < VOUT_MAX_HEIGHT; i++, ps += 8) {
|
||||
/* Copy, and skip the leftmost 8 columns again */
|
||||
for (i = 0; i < vout_height; i++, ps += 8) {
|
||||
for (x = 0; x < vout_width; x+=4) {
|
||||
*pd++ = pal[*ps++];
|
||||
*pd++ = pal[*ps++];
|
||||
|
@ -1842,7 +1825,7 @@ void retro_run(void)
|
|||
unsigned short *pd = (unsigned short *)vout_buf;
|
||||
unsigned short *ps = (unsigned short *)vout_ghosting_buf;
|
||||
int y;
|
||||
for (y = 0; y < VOUT_MAX_HEIGHT; y++) {
|
||||
for (y = 0; y < vout_height; y++) {
|
||||
if (vout_ghosting == 1)
|
||||
v_blend(pd, ps, vout_width, p_075_round);
|
||||
else
|
||||
|
|
|
@ -174,17 +174,6 @@ struct retro_core_option_definition option_defs_us[] = {
|
|||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"picodrive_overscan",
|
||||
"Show Overscan",
|
||||
"Crop out the potentially random glitchy video output that would have been hidden by the bezel around the edge of a standard-definition television screen.",
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"picodrive_overclk68k",
|
||||
"68K Overclock",
|
||||
|
|
|
@ -139,15 +139,6 @@ struct retro_core_option_definition option_defs_tr[] = {
|
|||
},
|
||||
"PAR"
|
||||
},
|
||||
{
|
||||
"picodrive_overscan",
|
||||
"Tarama Taşmasını Göster",
|
||||
"Standart tanımlı bir televizyon ekranının kenar çevresinde, çerçeve tarafından gizlenmiş olabilecek rastgele video çıkışını kesin.",
|
||||
{
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"picodrive_overclk68k",
|
||||
"68K Hızaşırtma",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue