#include "config.h"
#include "plugin.h"
#include "plugin_lib.h"
-#include "omap.h"
#include "plat.h"
#include "pcnt.h"
-#include "cspace.h"
-#include "common/plat.h"
-#include "common/input.h"
-#include "linux/in_evdev.h"
+#include "libpicofe/plat.h"
+#include "libpicofe/input.h"
+#include "libpicofe/linux/in_evdev.h"
+#include "libpicofe/plat.h"
#include "../libpcsxcore/misc.h"
#include "../libpcsxcore/cdrom.h"
#include "../libpcsxcore/cdriso.h"
-#include "../libpcsxcore/psemu_plugin_defs.h"
+#include "../libpcsxcore/cheat.h"
#include "../libpcsxcore/new_dynarec/new_dynarec.h"
-#include "../plugins/dfinput/main.h"
+#include "../plugins/dfinput/externals.h"
+#include "../plugins/gpulib/cspace.h"
+#include "psemu_plugin_defs.h"
#include "revision.h"
#define REARMED_BIRTHDAY_TIME 1293306830 /* 25 Dec 2010 */
MA_MAIN_SWAP_CD_MULTI,
MA_MAIN_RUN_BIOS,
MA_MAIN_RUN_EXE,
+ MA_MAIN_LOAD_CHEATS,
+ MA_MAIN_CHEATS,
MA_MAIN_CONTROLS,
MA_MAIN_CREDITS,
MA_MAIN_EXIT,
MA_OPT_SAVECFG,
MA_OPT_SAVECFG_GAME,
MA_OPT_CPU_CLOCKS,
- MA_OPT_FILTERING,
MA_OPT_DISP_OPTS,
+ MA_OPT_VARSCALER,
+ MA_OPT_VARSCALER_C,
+ MA_OPT_SCALER2,
+ MA_OPT_HWFILTER,
+ MA_OPT_SWFILTER,
+ MA_OPT_GAMMA,
+ MA_OPT_VIDOVERLAY,
} menu_id;
-enum {
- SCALE_1_1,
- SCALE_4_3,
- SCALE_4_3v2,
- SCALE_FULLSCREEN,
- SCALE_CUSTOM,
-};
-
-static int last_psx_w, last_psx_h, last_psx_bpp;
-static int scaling, filter, cpu_clock, cpu_clock_st, volume_boost, frameskip;
+static int last_vout_w, last_vout_h, last_vout_bpp;
+static int cpu_clock, cpu_clock_st, volume_boost, frameskip;
static char rom_fname_reload[MAXPATHLEN];
static char last_selected_fname[MAXPATHLEN];
-static int warned_about_bios, region, in_type_sel1, in_type_sel2;
+static int config_save_counter, region, in_type_sel1, in_type_sel2;
static int psx_clock;
static int memcard1_sel, memcard2_sel;
-int g_opts;
-int analog_deadzone; // for Caanoo
+int g_opts, g_scaler, g_gamma = 100;
+int soft_scaling, analog_deadzone; // for Caanoo
+int g_use_overlay, g_fullscreen;
+int filter, soft_filter;
#ifdef __ARM_ARCH_7A__
#define DEFAULT_PSX_CLOCK 57
extern int iUseReverb;
extern int iUseInterpolation;
extern int iXAPitch;
-extern int iSPUIRQWait;
-extern int iUseTimer;
extern int iVolume;
static const char *bioses[24];
static const char *memcards[32];
static int bios_sel, gpu_plugsel, spu_plugsel;
+#ifndef UI_FEATURES_H
+#define MENU_BIOS_PATH "bios/"
+#define MENU_SHOW_VARSCALER 0
+#define MENU_SHOW_VIDOVERLAY 1
+#define MENU_SHOW_SCALER2 0
+#define MENU_SHOW_NUBS_BTNS 0
+#define MENU_SHOW_VIBRATION 0
+#define MENU_SHOW_DEADZONE 0
+#define MENU_SHOW_MINIMIZE 0
+#define MENU_SHOW_FULLSCREEN 1
+#define MENU_SHOW_VOLUME 0
+#endif
static int min(int x, int y) { return x < y ? x : y; }
static int max(int x, int y) { return x > y ? x : y; }
emu_set_default_config();
g_opts = 0;
- scaling = SCALE_4_3;
+ g_scaler = SCALE_4_3;
volume_boost = 0;
frameskip = 0;
analog_deadzone = 50;
+ soft_scaling = 1;
+ soft_filter = 0;
+ g_use_overlay = 1;
+ g_fullscreen = 0;
psx_clock = DEFAULT_PSX_CLOCK;
region = 0;
#define CE_INTVAL(val) \
{ #val, sizeof(val), &val }
+#define CE_INTVAL_N(name, val) \
+ { name, sizeof(val), &val }
+
#define CE_INTVAL_P(val) \
{ #val, sizeof(pl_rearmed_cbs.val), &pl_rearmed_cbs.val }
void *val;
} config_data[] = {
CE_CONFIG_STR(Bios),
- CE_CONFIG_STR_V(Gpu, 2),
+ CE_CONFIG_STR_V(Gpu, 3),
CE_CONFIG_STR(Spu),
// CE_CONFIG_STR(Cdr),
CE_CONFIG_VAL(Xa),
CE_CONFIG_VAL(Cpu),
CE_CONFIG_VAL(CdrReschedule),
CE_INTVAL(region),
- CE_INTVAL_V(scaling, 2),
+ CE_INTVAL_V(g_scaler, 2),
CE_INTVAL(g_layer_x),
CE_INTVAL(g_layer_y),
CE_INTVAL(g_layer_w),
CE_INTVAL(g_layer_h),
CE_INTVAL(filter),
+ CE_INTVAL(soft_filter),
+ CE_INTVAL(g_use_overlay),
+ CE_INTVAL(g_fullscreen),
CE_INTVAL(state_slot),
CE_INTVAL(cpu_clock),
CE_INTVAL(g_opts),
CE_INTVAL(in_type_sel1),
CE_INTVAL(in_type_sel2),
CE_INTVAL(analog_deadzone),
+ CE_INTVAL_N("adev0_is_nublike", in_adev_is_nublike[0]),
+ CE_INTVAL_N("adev1_is_nublike", in_adev_is_nublike[1]),
CE_INTVAL_V(frameskip, 3),
CE_INTVAL_P(gpu_peops.iUseDither),
CE_INTVAL_P(gpu_peops.dwActFixes),
CE_INTVAL_P(gpu_unai.abe_hack),
CE_INTVAL_P(gpu_unai.no_light),
CE_INTVAL_P(gpu_unai.no_blend),
+ CE_INTVAL_P(gpu_neon.allow_interlace),
+ CE_INTVAL_P(gpu_neon.enhancement_enable),
+ CE_INTVAL_P(gpu_neon.enhancement_no_main),
+ CE_INTVAL_P(gpu_peopsgl.bDrawDither),
+ CE_INTVAL_P(gpu_peopsgl.iFilterType),
+ CE_INTVAL_P(gpu_peopsgl.iFrameTexType),
+ CE_INTVAL_P(gpu_peopsgl.iUseMask),
+ CE_INTVAL_P(gpu_peopsgl.bOpaquePass),
+ CE_INTVAL_P(gpu_peopsgl.bAdvancedBlend),
+ CE_INTVAL_P(gpu_peopsgl.bUseFastMdec),
+ CE_INTVAL_P(gpu_peopsgl.iVRamSize),
+ CE_INTVAL_P(gpu_peopsgl.iTexGarbageCollection),
+ CE_INTVAL_P(gpu_peopsgl.dwActFixes),
CE_INTVAL_V(iUseReverb, 3),
CE_INTVAL_V(iXAPitch, 3),
CE_INTVAL_V(iUseInterpolation, 3),
- CE_INTVAL_V(iSPUIRQWait, 3),
- CE_INTVAL_V(iUseTimer, 3),
- CE_INTVAL(warned_about_bios),
+ CE_INTVAL(config_save_counter),
CE_INTVAL(in_evdev_allow_abs_only),
CE_INTVAL(volume_boost),
CE_INTVAL(psx_clock),
}
static void keys_write_all(FILE *f);
+static char *mystrip(char *str);
static int menu_write_config(int is_game)
{
FILE *f;
int i;
+ config_save_counter++;
+
make_cfg_fname(cfgfile, sizeof(cfgfile), is_game);
f = fopen(cfgfile, "w");
if (f == NULL) {
break;
default:
printf("menu_write_config: unhandled len %d for %s\n",
- config_data[i].len, config_data[i].name);
+ (int)config_data[i].len, config_data[i].name);
break;
}
}
- if (!is_game)
- fprintf(f, "lastcdimg = %s\n", last_selected_fname);
-
keys_write_all(f);
fclose(f);
return 0;
}
+static int menu_do_last_cd_img(int is_get)
+{
+ char path[256];
+ FILE *f;
+ int ret;
+
+ snprintf(path, sizeof(path), "." PCSX_DOT_DIR "lastcdimg.txt");
+ f = fopen(path, is_get ? "r" : "w");
+ if (f == NULL)
+ return -1;
+
+ if (is_get) {
+ ret = fread(last_selected_fname, 1, sizeof(last_selected_fname) - 1, f);
+ last_selected_fname[ret] = 0;
+ mystrip(last_selected_fname);
+ }
+ else
+ fprintf(f, "%s\n", last_selected_fname);
+ fclose(f);
+
+ return 0;
+}
+
static void parse_str_val(char *cval, const char *src)
{
char *tmp;
break;
default:
printf("menu_load_config: unhandled len %d for %s\n",
- config_data[i].len, config_data[i].name);
+ (int)config_data[i].len, config_data[i].name);
break;
}
}
#define MENU_X2 0
#endif
-#define menu_init menu_init_common
-#include "common/menu.c"
-#undef menu_init
+#include "libpicofe/menu.c"
// a bit of black magic here
static void draw_savestate_bg(int slot)
x = gpu->ulControl[5] & 0x3ff;
y = (gpu->ulControl[5] >> 10) & 0x1ff;
- s = (u16 *)gpu->psxVRam + y * 1024 + (x & ~1);
w = psx_widths[(gpu->ulStatus >> 16) & 7];
tmp = gpu->ulControl[7];
h = ((tmp >> 10) & 0x3ff) - (tmp & 0x3ff);
if (gpu->ulStatus & 0x80000) // doubleheight
h *= 2;
+ if (h <= 0 || h > 512)
+ goto out;
+ if (y > 512 - 64)
+ y = 0;
+ if (y + h > 512)
+ h = 512 - y;
+ s = (u16 *)gpu->psxVRam + y * 1024 + x;
x = max(0, g_menuscreen_w - w) & ~3;
y = max(0, g_menuscreen_h / 2 - h / 2);
bgr888_to_rgb565(d, s, w * 3);
else
bgr555_to_rgb565(d, s, w * 2);
-#ifndef __ARM_ARCH_7A__
- // better darken this on small screens
- menu_darken_bg(d, d, w * 2, 0);
-#endif
+
+ // darken this so that menu text is visible
+ if (g_menuscreen_w - w < 320)
+ menu_darken_bg(d, d, w * 2, 0);
}
out:
free(gpu);
}
-// ---------- XXX: pandora specific -----------
-
-static const char pnd_script_base[] = "sudo -n /usr/pandora/scripts";
-static char **pnd_filter_list;
-
-static void apply_filter(int which)
-{
- static int old = -1;
- char buf[128];
- int i;
-
- if (pnd_filter_list == NULL || which == old)
- return;
-
- for (i = 0; i < which; i++)
- if (pnd_filter_list[i] == NULL)
- return;
-
- if (pnd_filter_list[i] == NULL)
- return;
-
- snprintf(buf, sizeof(buf), "%s/op_videofir.sh %s", pnd_script_base, pnd_filter_list[i]);
- system(buf);
- old = which;
-}
-
-static void apply_lcdrate(int pal)
-{
- static int old = -1;
- char buf[128];
-
- if (pal == old)
- return;
-
- snprintf(buf, sizeof(buf), "%s/op_lcdrate.sh %d",
- pnd_script_base, pal ? 50 : 60);
- system(buf);
- old = pal;
-}
-
-static menu_entry e_menu_gfx_options[];
-
-static void pnd_menu_init(void)
-{
- struct dirent *ent;
- int i, count = 0;
- char **mfilters;
- char buff[64];
- DIR *dir;
-
- cpu_clock_st = cpu_clock = plat_cpu_clock_get();
-
- dir = opendir("/etc/pandora/conf/dss_fir");
- if (dir == NULL) {
- perror("filter opendir");
- return;
- }
-
- while (1) {
- errno = 0;
- ent = readdir(dir);
- if (ent == NULL) {
- if (errno != 0)
- perror("readdir");
- break;
- }
-
- if (ent->d_type != DT_REG && ent->d_type != DT_LNK)
- continue;
-
- count++;
- }
-
- if (count == 0)
- return;
-
- mfilters = calloc(count + 1, sizeof(mfilters[0]));
- if (mfilters == NULL)
- return;
-
- rewinddir(dir);
- for (i = 0; (ent = readdir(dir)); ) {
- size_t len;
-
- if (ent->d_type != DT_REG && ent->d_type != DT_LNK)
- continue;
-
- len = strlen(ent->d_name);
-
- // skip pre-HF5 extra files
- if (len >= 3 && strcmp(ent->d_name + len - 3, "_v3") == 0)
- continue;
- if (len >= 3 && strcmp(ent->d_name + len - 3, "_v5") == 0)
- continue;
-
- // have to cut "_up_h" for pre-HF5
- if (len > 5 && strcmp(ent->d_name + len - 5, "_up_h") == 0)
- len -= 5;
-
- if (len > sizeof(buff) - 1)
- continue;
-
- strncpy(buff, ent->d_name, len);
- buff[len] = 0;
- mfilters[i] = strdup(buff);
- if (mfilters[i] != NULL)
- i++;
- }
- closedir(dir);
-
- i = me_id2offset(e_menu_gfx_options, MA_OPT_FILTERING);
- e_menu_gfx_options[i].data = (void *)mfilters;
- pnd_filter_list = mfilters;
-}
-
-void menu_finish(void)
-{
- plat_cpu_clock_apply(cpu_clock_st);
-}
-
// -------------- key config --------------
me_bind_action me_ctrl_actions[] =
{ "Next Save Slot ", 1 << SACTION_NEXT_SSLOT },
{ "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP },
{ "Take Screenshot ", 1 << SACTION_SCREENSHOT },
+ { "Show/Hide FPS ", 1 << SACTION_TOGGLE_FPS },
+#ifdef __ARM_ARCH_7A__
+ { "Switch Renderer ", 1 << SACTION_SWITCH_DISPMODE },
+#endif
+ { "Fast Forward ", 1 << SACTION_FAST_FORWARD },
+#if MENU_SHOW_MINIMIZE
+ { "Minimize ", 1 << SACTION_MINIMIZE },
+#endif
+#if MENU_SHOW_FULLSCREEN
+ { "Toggle fullscreen", 1 << SACTION_TOGGLE_FULLSCREEN },
+#endif
{ "Enter Menu ", 1 << SACTION_ENTER_MENU },
{ "Gun Trigger ", 1 << SACTION_GUN_TRIGGER },
{ "Gun A button ", 1 << SACTION_GUN_A },
{ "Gun B button ", 1 << SACTION_GUN_B },
{ "Gun Offscreen Trigger", 1 << SACTION_GUN_TRIGGER2 },
-#ifndef __ARM_ARCH_7A__ /* XXX */
+#if MENU_SHOW_VOLUME
{ "Volume Up ", 1 << SACTION_VOLUME_UP },
{ "Volume Down ", 1 << SACTION_VOLUME_DOWN },
#endif
len = strlen(str);
for (i = len - 1; i >= 0; i--)
- if (str[i] != ' ') break;
+ if (str[i] != ' ' && str[i] != '\r' && str[i] != '\n') break;
str[i+1] = 0;
return str;
return 0;
}
+static const char h_nubmode[] = "Maps nub-like analog controls to PSX ones better\n"
+ "Might cause problems with real analog sticks";
static const char *adevnames[IN_MAX_DEVS + 2];
static int stick_sel[2];
static menu_entry e_menu_keyconfig_analog[] =
{
- mee_enum ("Left stick (L3)", 0, stick_sel[0], adevnames),
- mee_range(" X axis", 0, in_adev_axis[0][0], 0, 7),
- mee_range(" Y axis", 0, in_adev_axis[0][1], 0, 7),
- mee_enum ("Right stick (R3)", 0, stick_sel[1], adevnames),
- mee_range(" X axis", 0, in_adev_axis[1][0], 0, 7),
- mee_range(" Y axis", 0, in_adev_axis[1][1], 0, 7),
+ mee_enum ("Left stick (L3)", 0, stick_sel[0], adevnames),
+ mee_range (" X axis", 0, in_adev_axis[0][0], 0, 7),
+ mee_range (" Y axis", 0, in_adev_axis[0][1], 0, 7),
+ mee_onoff_h(" nub mode", 0, in_adev_is_nublike[0], 1, h_nubmode),
+ mee_enum ("Right stick (R3)", 0, stick_sel[1], adevnames),
+ mee_range (" X axis", 0, in_adev_axis[1][0], 0, 7),
+ mee_range (" Y axis", 0, in_adev_axis[1][1], 0, 7),
+ mee_onoff_h(" nub mode", 0, in_adev_is_nublike[1], 1, h_nubmode),
mee_end,
};
static int mh_savecfg(int id, int keys)
{
if (menu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0) == 0)
- me_update_msg("config saved");
+ menu_update_msg("config saved");
else
- me_update_msg("failed to write config");
+ menu_update_msg("failed to write config");
return 1;
}
{
//menu_sync_config();
in_probe();
- me_update_msg("rescan complete.");
+ menu_update_msg("rescan complete.");
return 0;
}
// ------------ gfx options menu ------------
static const char *men_scaler[] = { "1x1", "scaled 4:3", "integer scaled 4:3", "fullscreen", "custom", NULL };
+static const char *men_soft_filter[] = { "None",
+#ifdef __ARM_NEON__
+ "scale2x", "eagle2x",
+#endif
+ NULL };
+static const char *men_dummy[] = { NULL };
static const char h_cscaler[] = "Displays the scaler layer, you can resize it\n"
"using d-pad or move it using R+d-pad";
-static const char *men_dummy[] = { NULL };
+static const char h_overlay[] = "Overlay provides hardware accelerated scaling";
+static const char h_soft_filter[] = "Works only if game uses low resolution modes";
+static const char h_gamma[] = "Gamma/brightness adjustment (default 100)";
static int menu_loop_cscaler(int id, int keys)
{
unsigned int inp;
- scaling = SCALE_CUSTOM;
+ g_scaler = SCALE_CUSTOM;
- omap_enable_layer(1);
+ plat_gvideo_open(Config.PsxType);
for (;;)
{
- menu_draw_begin(0);
+ menu_draw_begin(0, 1);
memset(g_menuscreen_ptr, 4, g_menuscreen_w * g_menuscreen_h * 2);
text_out16(2, 2, "%d,%d", g_layer_x, g_layer_y);
text_out16(2, 480 - 18, "%dx%d | d-pad: resize, R+d-pad: move", g_layer_w, g_layer_h);
menu_draw_end();
- inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_R|PBTN_MOK|PBTN_MBACK, 40);
+ inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT
+ |PBTN_R|PBTN_MOK|PBTN_MBACK, NULL, 40);
if (inp & PBTN_UP) g_layer_y--;
if (inp & PBTN_DOWN) g_layer_y++;
if (inp & PBTN_LEFT) g_layer_x--;
g_layer_w = 800 - g_layer_x;
if (g_layer_y + g_layer_h > 480)
g_layer_h = 480 - g_layer_y;
- omap_enable_layer(1);
+ // resize the layer
+ plat_gvideo_open(Config.PsxType);
}
}
- omap_enable_layer(0);
+ plat_gvideo_close();
return 0;
}
static menu_entry e_menu_gfx_options[] =
{
- mee_enum ("Scaler", 0, scaling, men_scaler),
- mee_enum ("Filter", MA_OPT_FILTERING, filter, men_dummy),
+ mee_enum ("Scaler", MA_OPT_VARSCALER, g_scaler, men_scaler),
+ mee_onoff_h ("Use video overlay", MA_OPT_VIDOVERLAY, g_use_overlay, 1, h_overlay),
+ mee_onoff ("Software Scaling", MA_OPT_SCALER2, soft_scaling, 1),
+ mee_enum ("Hardware Filter", MA_OPT_HWFILTER, filter, men_dummy),
+ mee_enum_h ("Software Filter", MA_OPT_SWFILTER, soft_filter, men_soft_filter, h_soft_filter),
+ mee_range_h ("Gamma adjustment", MA_OPT_GAMMA, g_gamma, 1, 200, h_gamma),
// mee_onoff ("Vsync", 0, vsync, 1),
- mee_cust_h ("Setup custom scaler", 0, menu_loop_cscaler, NULL, h_cscaler),
+ mee_cust_h ("Setup custom scaler", MA_OPT_VARSCALER_C, menu_loop_cscaler, NULL, h_cscaler),
mee_end,
};
// ------------ bios/plugins ------------
+#ifdef __ARM_NEON__
+
+static const char h_gpu_neon[] =
+ "Configure built-in NEON GPU plugin";
+static const char h_gpu_neon_enhanced[] =
+ "Renders in double resolution at the cost of lower performance\n"
+ "(not available for high resolution games)";
+static const char h_gpu_neon_enhanced_hack[] =
+ "Speed hack for above option (glitches some games)";
+static const char *men_gpu_interlace[] = { "Off", "On", "Auto", NULL };
+
+static menu_entry e_menu_plugin_gpu_neon[] =
+{
+ mee_enum ("Enable interlace mode", 0, pl_rearmed_cbs.gpu_neon.allow_interlace, men_gpu_interlace),
+ mee_onoff_h ("Enhanced resolution (slow)", 0, pl_rearmed_cbs.gpu_neon.enhancement_enable, 1, h_gpu_neon_enhanced),
+ mee_onoff_h ("Enhanced res. speed hack", 0, pl_rearmed_cbs.gpu_neon.enhancement_no_main, 1, h_gpu_neon_enhanced_hack),
+ mee_end,
+};
+
+static int menu_loop_plugin_gpu_neon(int id, int keys)
+{
+ static int sel = 0;
+ me_loop(e_menu_plugin_gpu_neon, &sel);
+ return 0;
+}
+
+#endif
+
static menu_entry e_menu_plugin_gpu_unai[] =
{
mee_onoff ("Skip every 2nd line", 0, pl_rearmed_cbs.gpu_unai.lineskip, 1),
}
static const char *men_gpu_dithering[] = { "None", "Game dependant", "Always", NULL };
-static const char h_gpu_0[] = "Needed for Chrono Cross";
+//static const char h_gpu_0[] = "Needed for Chrono Cross";
static const char h_gpu_1[] = "Capcom fighting games";
static const char h_gpu_2[] = "Black screens in Lunar";
static const char h_gpu_3[] = "Compatibility mode";
static const char h_gpu_6[] = "Pandemonium 2";
-static const char h_gpu_7[] = "Skip every second frame";
+//static const char h_gpu_7[] = "Skip every second frame";
static const char h_gpu_8[] = "Needed by Dark Forces";
static const char h_gpu_9[] = "better g-colors, worse textures";
static const char h_gpu_10[] = "Toggle busy flags after drawing";
static menu_entry e_menu_plugin_gpu_peops[] =
{
mee_enum ("Dithering", 0, pl_rearmed_cbs.gpu_peops.iUseDither, men_gpu_dithering),
- mee_onoff_h ("Odd/even bit hack", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<0, h_gpu_0),
+// mee_onoff_h ("Odd/even bit hack", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<0, h_gpu_0),
mee_onoff_h ("Expand screen width", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<1, h_gpu_1),
mee_onoff_h ("Ignore brightness color", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<2, h_gpu_2),
mee_onoff_h ("Disable coordinate check", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<3, h_gpu_3),
mee_onoff_h ("Lazy screen update", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<6, h_gpu_6),
- mee_onoff_h ("Old frame skipping", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<7, h_gpu_7),
+// mee_onoff_h ("Old frame skipping", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<7, h_gpu_7),
mee_onoff_h ("Repeated flat tex triangles ",0,pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<8, h_gpu_8),
mee_onoff_h ("Draw quads with triangles", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<9, h_gpu_9),
mee_onoff_h ("Fake 'gpu busy' states", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<10, h_gpu_10),
return 0;
}
+static const char *men_peopsgl_texfilter[] = { "None", "Standard", "Extended",
+ "Standard-sprites", "Extended-sprites", "Standard+sprites", "Extended+sprites", NULL };
+static const char *men_peopsgl_fbtex[] = { "Emulated VRam", "Black", "Card", "Card+soft" };
+
+static menu_entry e_menu_plugin_gpu_peopsgl[] =
+{
+ mee_onoff ("Dithering", 0, pl_rearmed_cbs.gpu_peopsgl.bDrawDither, 1),
+ mee_enum ("Texture Filtering", 0, pl_rearmed_cbs.gpu_peopsgl.iFilterType, men_peopsgl_texfilter),
+ mee_enum ("Framebuffer Textures", 0, pl_rearmed_cbs.gpu_peopsgl.iFrameTexType, men_peopsgl_fbtex),
+ mee_onoff ("Mask Detect", 0, pl_rearmed_cbs.gpu_peopsgl.iUseMask, 1),
+ mee_onoff ("Opaque Pass", 0, pl_rearmed_cbs.gpu_peopsgl.bOpaquePass, 1),
+ mee_onoff ("Advanced Blend", 0, pl_rearmed_cbs.gpu_peopsgl.bAdvancedBlend, 1),
+ mee_onoff ("Use Fast Mdec", 0, pl_rearmed_cbs.gpu_peopsgl.bUseFastMdec, 1),
+ mee_range ("Texture RAM size (MB)", 0, pl_rearmed_cbs.gpu_peopsgl.iVRamSize, 4, 128),
+ mee_onoff ("Texture garbage collection", 0, pl_rearmed_cbs.gpu_peopsgl.iTexGarbageCollection, 1),
+ mee_label ("Fixes/hacks:"),
+ mee_onoff ("FF7 cursor", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<0),
+ mee_onoff ("Direct FB updates", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<1),
+ mee_onoff ("Black brightness", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<2),
+ mee_onoff ("Swap front detection", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<3),
+ mee_onoff ("Disable coord check", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<4),
+ mee_onoff ("No blue glitches (LoD)", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<5),
+ mee_onoff ("Soft FB access", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<6),
+ mee_onoff ("FF9 rect", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<9),
+ mee_onoff ("No subtr. blending", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<10),
+ mee_onoff ("Lazy upload (DW7)", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<11),
+ mee_onoff ("Additional uploads", 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<15),
+ mee_end,
+};
+
+static int menu_loop_plugin_gpu_peopsgl(int id, int keys)
+{
+ static int sel = 0;
+ me_loop(e_menu_plugin_gpu_peopsgl, &sel);
+ return 0;
+}
+
static const char *men_spu_interp[] = { "None", "Simple", "Gaussian", "Cubic", NULL };
static const char h_spu_volboost[] = "Large values cause distortion";
-static const char h_spu_irq_wait[] = "Wait for CPU (recommended set to ON)";
-static const char h_spu_thread[] = "Run sound emulation in main thread (recommended)";
static menu_entry e_menu_plugin_spu[] =
{
mee_onoff ("Reverb", 0, iUseReverb, 2),
mee_enum ("Interpolation", 0, iUseInterpolation, men_spu_interp),
mee_onoff ("Adjust XA pitch", 0, iXAPitch, 1),
- mee_onoff_h ("SPU IRQ Wait", 0, iSPUIRQWait, 1, h_spu_irq_wait),
- mee_onoff_h ("Sound in main thread", 0, iUseTimer, 2, h_spu_thread),
mee_end,
};
static const char h_bios[] = "HLE is simulated BIOS. BIOS selection is saved in\n"
"savestates and can't be changed there. Must save\n"
"config and reload the game for change to take effect";
-static const char h_plugin_xpu[] = "Must save config and reload the game\n"
- "for plugin change to take effect";
+static const char h_plugin_gpu[] =
+#ifdef __ARM_NEON__
+ "builtin_gpu is the NEON GPU, very fast and accurate\n"
+#endif
+ "gpu_peops is Pete's soft GPU, slow but accurate\n"
+ "gpu_unai is GPU from PCSX4ALL, fast but glitchy\n"
+ "gpu_gles Pete's hw GPU, uses 3D chip but is glitchy\n"
+ "must save config and reload the game if changed";
+static const char h_plugin_spu[] = "spunull effectively disables sound\n"
+ "must save config and reload the game if changed";
static const char h_gpu_peops[] = "Configure P.E.Op.S. SoftGL Driver V1.17";
+static const char h_gpu_peopsgl[]= "Configure P.E.Op.S. MesaGL Driver V1.78";
static const char h_gpu_unai[] = "Configure Unai/PCSX4ALL Team GPU plugin";
static const char h_spu[] = "Configure built-in P.E.Op.S. Sound Driver V1.7";
static menu_entry e_menu_plugin_options[] =
{
mee_enum_h ("BIOS", 0, bios_sel, bioses, h_bios),
- mee_enum_h ("GPU plugin", 0, gpu_plugsel, gpu_plugins, h_plugin_xpu),
- mee_enum_h ("SPU plugin", 0, spu_plugsel, spu_plugins, h_plugin_xpu),
+ mee_enum_h ("GPU plugin", 0, gpu_plugsel, gpu_plugins, h_plugin_gpu),
+ mee_enum_h ("SPU plugin", 0, spu_plugsel, spu_plugins, h_plugin_spu),
+#ifdef __ARM_NEON__
+ mee_handler_h ("Configure built-in GPU plugin", menu_loop_plugin_gpu_neon, h_gpu_neon),
+#endif
mee_handler_h ("Configure gpu_peops plugin", menu_loop_plugin_gpu_peops, h_gpu_peops),
- mee_handler_h ("Configure PCSX4ALL GPU plugin", menu_loop_plugin_gpu_unai, h_gpu_unai),
+ mee_handler_h ("Configure gpu_unai GPU plugin", menu_loop_plugin_gpu_unai, h_gpu_unai),
+ mee_handler_h ("Configure gpu_gles GPU plugin", menu_loop_plugin_gpu_peopsgl, h_gpu_peopsgl),
mee_handler_h ("Configure built-in SPU plugin", menu_loop_plugin_spu, h_spu),
mee_end,
};
// ------------ adv options menu ------------
-static const char h_cfg_psxclk[] = "Over/under-clock the PSX, default is " DEFAULT_PSX_CLOCK_S "\n";
+static const char h_cfg_psxclk[] = "Over/under-clock the PSX, default is " DEFAULT_PSX_CLOCK_S "\n"
+ "(lower value - less work for the emu, may be faster)";
static const char h_cfg_nosmc[] = "Will cause crashes when loading, break memcards";
static const char h_cfg_gteunn[] = "May cause graphical glitches";
static const char h_cfg_gteflgs[] = "Will cause graphical glitches";
static int mh_restore_defaults(int id, int keys)
{
menu_set_defconfig();
- me_update_msg("defaults restored");
+ menu_update_msg("defaults restored");
return 1;
}
int i;
i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS);
- e_menu_options[i].enabled = cpu_clock != 0 ? 1 : 0;
+ e_menu_options[i].enabled = cpu_clock_st > 0 ? 1 : 0;
me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]);
me_loop(e_menu_options, &sel);
// ------------ debug menu ------------
-static void draw_frame_debug(GPUFreeze_t *gpuf)
+static void draw_frame_debug(GPUFreeze_t *gpuf, int x, int y)
{
int w = min(g_menuscreen_w, 1024);
int h = min(g_menuscreen_h, 512);
u16 *d = g_menuscreen_ptr;
- u16 *s = (u16 *)gpuf->psxVRam;
+ u16 *s = (u16 *)gpuf->psxVRam + y * 1024 + x;
char buff[64];
int ty = 1;
static void debug_menu_loop(void)
{
+ int inp, df_x = 0, df_y = 0;
GPUFreeze_t *gpuf;
- int inp;
gpuf = malloc(sizeof(*gpuf));
if (gpuf == NULL)
while (1)
{
- menu_draw_begin(0);
- draw_frame_debug(gpuf);
+ menu_draw_begin(0, 1);
+ draw_frame_debug(gpuf, df_x, df_y);
menu_draw_end();
inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R |
- PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 70);
- if (inp & PBTN_MBACK)
- break;
+ PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, NULL, 10);
+ if (inp & PBTN_MBACK) break;
+ else if (inp & PBTN_UP) { if (df_y > 0) df_y--; }
+ else if (inp & PBTN_DOWN) { if (df_y < 512 - g_menuscreen_h) df_y++; }
+ else if (inp & PBTN_LEFT) { if (df_x > 0) df_x -= 2; }
+ else if (inp & PBTN_RIGHT) { if (df_x < 1024 - g_menuscreen_w) df_x += 2; }
}
free(gpuf);
GetMcdBlockInfo(2, i + 1, &blocks2[i]);
}
- menu_draw_begin(1);
+ menu_draw_begin(1, 1);
memcpy(g_menuscreen_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2);
return 0;
}
+// ------------ cheats menu ------------
+
+static void draw_cheatlist(int sel)
+{
+ int max_cnt, start, i, pos, active;
+
+ max_cnt = g_menuscreen_h / me_sfont_h;
+ start = max_cnt / 2 - sel;
+
+ menu_draw_begin(1, 1);
+
+ for (i = 0; i < NumCheats; i++) {
+ pos = start + i;
+ if (pos < 0) continue;
+ if (pos >= max_cnt) break;
+ active = Cheats[i].Enabled;
+ smalltext_out16(14, pos * me_sfont_h,
+ active ? "ON " : "OFF", active ? 0xfff6 : 0xffff);
+ smalltext_out16(14 + me_sfont_w*4, pos * me_sfont_h,
+ Cheats[i].Descr, active ? 0xfff6 : 0xffff);
+ }
+ pos = start + i;
+ if (pos < max_cnt)
+ smalltext_out16(14, pos * me_sfont_h, "done", 0xffff);
+
+ text_out16(5, max_cnt / 2 * me_sfont_h, ">");
+ menu_draw_end();
+}
+
+static void menu_loop_cheats(void)
+{
+ static int menu_sel = 0;
+ int inp;
+
+ for (;;)
+ {
+ draw_cheatlist(menu_sel);
+ inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_L|PBTN_R
+ |PBTN_MOK|PBTN_MBACK, NULL, 33);
+ if (inp & PBTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = NumCheats; }
+ if (inp & PBTN_DOWN) { menu_sel++; if (menu_sel > NumCheats) menu_sel = 0; }
+ if (inp &(PBTN_LEFT|PBTN_L)) { menu_sel-=10; if (menu_sel < 0) menu_sel = 0; }
+ if (inp &(PBTN_RIGHT|PBTN_R)) { menu_sel+=10; if (menu_sel > NumCheats) menu_sel = NumCheats; }
+ if (inp & PBTN_MOK) { // action
+ if (menu_sel < NumCheats)
+ Cheats[menu_sel].Enabled = !Cheats[menu_sel].Enabled;
+ else break;
+ }
+ if (inp & PBTN_MBACK)
+ break;
+ }
+}
+
// --------- main menu help ----------
static void menu_bios_warn(void)
static const char msg[] =
"You don't seem to have copied any BIOS\n"
"files to\n"
-#ifdef __ARM_ARCH_7A__ // XXX
- "<SD card>/pandora/appdata/pcsx_rearmed/bios/\n\n"
-#else
- "pcsx_rearmed/bios/\n\n"
-#endif
+ MENU_BIOS_PATH "\n\n"
+
"While many games work fine with fake\n"
"(HLE) BIOS, others (like MGS and FF8)\n"
"require BIOS to work.\n"
"The file is usually named SCPH1001.BIN,\n"
"but other not compressed files can be\n"
"used too.\n\n"
- "Press (B) or (X) to continue";
+ "Press %s or %s to continue";
+ char tmp_msg[sizeof(msg) + 64];
+ snprintf(tmp_msg, sizeof(tmp_msg), msg,
+ in_get_key_name(-1, -PBTN_MOK), in_get_key_name(-1, -PBTN_MBACK));
while (1)
{
- draw_menu_message(msg, NULL);
+ draw_menu_message(tmp_msg, NULL);
- inp = in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
+ inp = in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70);
if (inp & (PBTN_MBACK|PBTN_MOK))
return;
}
// ------------ main menu ------------
+static menu_entry e_menu_main[];
void OnFile_Exit();
static void draw_frame_main(void)
{
struct tm *tmp;
time_t ltime;
+ int capacity;
char ltime_s[16];
char buff[64];
+ char *out;
if (CdromId[0] != 0) {
snprintf(buff, sizeof(buff), "%.32s/%.9s (running as %s, with %s)",
}
if (ready_to_go) {
+ capacity = plat_target_bat_capacity_get();
ltime = time(NULL);
tmp = localtime(<ime);
strftime(ltime_s, sizeof(ltime_s), "%H:%M", tmp);
- snprintf(buff, sizeof(buff), "%s %3d%%", ltime_s, plat_get_bat_capacity());
- smalltext_out16(4, 1 + me_sfont_h, buff, 0x105f);
+ if (capacity >= 0) {
+ snprintf(buff, sizeof(buff), "%s %3d%%", ltime_s, capacity);
+ out = buff;
+ }
+ else
+ out = ltime_s;
+ smalltext_out16(4, 1 + me_sfont_h, out, 0x105f);
}
}
static void draw_frame_credits(void)
{
- smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc);
+ smalltext_out16(4, 1, "build: " __DATE__ " " __TIME__ " " REV, 0xe7fc);
}
static const char credits_text[] =
"(C) 2009-2011 PCSX-Reloaded Team\n\n"
"ARM recompiler (C) 2009-2011 Ari64\n"
#ifdef __ARM_NEON__
- "ARM NEON GPU (c) 2011 Exophase\n"
+ "ARM NEON GPU (c) 2011-2012 Exophase\n"
#endif
"PEOpS GPU and SPU by Pete Bernert\n"
" and the P.E.Op.S. team\n"
"PCSX4ALL plugin by PCSX4ALL team\n"
" Chui, Franxis, Unai\n\n"
"integration, optimization and\n"
- " frontend (C) 2010-2011 notaz\n";
+ " frontend (C) 2010-2012 notaz\n";
static int reset_game(void)
{
pcnt_hook_plugins();
NetOpened = 0;
if (OpenPlugins() == -1) {
- me_update_msg("failed to open plugins");
+ menu_update_msg("failed to open plugins");
return -1;
}
plugin_call_rearmed_cbs();
SysReset();
if (Load(fname) != 0) {
- me_update_msg("exe load failed, bad file?");
+ menu_update_msg("exe load failed, bad file?");
printf("meh\n");
return -1;
}
if (CheckCdrom() == -1) {
// Only check the CD if we are starting the console with a CD
ClosePlugins();
- me_update_msg("unsupported/invalid CD image");
+ menu_update_msg("unsupported/invalid CD image");
return -1;
}
// Read main executable directly from CDRom and start it
if (LoadCdrom() == -1) {
ClosePlugins();
- me_update_msg("failed to load CD image");
+ menu_update_msg("failed to load CD image");
return -1;
}
+ emu_on_new_cd(1);
ready_to_go = 1;
- snprintf(hud_msg, sizeof(hud_msg), "Booting up...");
- hud_new_msg = 2;
+
return 0;
}
return -1;
}
- if (Config.HLE)
- printf("note: running without BIOS, expect compatibility problems\n");
-
strcpy(last_selected_fname, rom_fname_reload);
+ menu_do_last_cd_img(0);
return 0;
}
set_cd_image(fname);
if (ReloadCdromPlugin() < 0) {
- me_update_msg("failed to load cdr plugin");
+ menu_update_msg("failed to load cdr plugin");
return -1;
}
if (CDR_open() < 0) {
- me_update_msg("failed to open cdr plugin");
+ menu_update_msg("failed to open cdr plugin");
return -1;
}
CDR_close();
if (CDR_open() < 0) {
- me_update_msg("failed to open cdr plugin");
+ menu_update_msg("failed to open cdr plugin");
return -1;
}
return 0;
}
+static void load_pcsx_cht(void)
+{
+ char path[256];
+ char *fname;
+
+ path[0] = 0;
+ fname = menu_loop_romsel(path, sizeof(path));
+ if (fname == NULL)
+ return;
+
+ printf("selected cheat file: %s\n", fname);
+ LoadCheats(fname);
+
+ if (NumCheats == 0 && NumCodes == 0)
+ menu_update_msg("failed to load cheats");
+ else {
+ snprintf(path, sizeof(path), "%d cheat(s) loaded", NumCheats + NumCodes);
+ menu_update_msg(path);
+ }
+ me_enable(e_menu_main, MA_MAIN_CHEATS, ready_to_go && NumCheats);
+}
+
static int main_menu_handler(int id, int keys)
{
switch (id)
if (run_exe() == 0)
return 1;
break;
+ case MA_MAIN_CHEATS:
+ menu_loop_cheats();
+ break;
+ case MA_MAIN_LOAD_CHEATS:
+ load_pcsx_cht();
+ break;
case MA_MAIN_CREDITS:
draw_menu_message(credits_text, draw_frame_credits);
- in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
+ in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70);
break;
case MA_MAIN_EXIT:
OnFile_Exit();
mee_handler_id("Run BIOS", MA_MAIN_RUN_BIOS, main_menu_handler),
mee_handler_id("Run EXE", MA_MAIN_RUN_EXE, main_menu_handler),
mee_handler ("Memcard manager", menu_loop_memcards),
+ mee_handler_id("Load PCSX cheats..", MA_MAIN_LOAD_CHEATS, main_menu_handler),
mee_end,
};
me_enable(e_menu_main2, MA_MAIN_SWAP_CD, ready_to_go);
me_enable(e_menu_main2, MA_MAIN_SWAP_CD_MULTI, ready_to_go && cdrIsoMultidiskCount > 1);
me_enable(e_menu_main2, MA_MAIN_RUN_BIOS, bios_sel != 0);
+ me_enable(e_menu_main2, MA_MAIN_LOAD_CHEATS, ready_to_go);
return me_loop_d(e_menu_main2, &sel, NULL, draw_frame_main);
}
mee_handler_id("Load CD image", MA_MAIN_LOAD_ROM, main_menu_handler),
mee_handler ("Options", menu_loop_options),
mee_handler ("Controls", menu_loop_keyconfig),
+ mee_handler_id("Cheats", MA_MAIN_CHEATS, main_menu_handler),
mee_handler_h ("Extra stuff", main_menu2_handler, h_extra),
mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler),
mee_handler_id("Exit", MA_MAIN_EXIT, main_menu_handler),
void menu_loop(void)
{
+ static int warned_about_bios = 0;
static int sel = 0;
menu_leave_emu();
- if (bioses[1] == NULL && !warned_about_bios) {
- menu_bios_warn();
- warned_about_bios = 1;
+ if (config_save_counter == 0) {
+ // assume first run
+ if (bioses[1] != NULL) {
+ // autoselect BIOS to make user's life easier
+ snprintf(Config.Bios, sizeof(Config.Bios), "%s", bioses[1]);
+ bios_sel = 1;
+ }
+ else if (!warned_about_bios) {
+ menu_bios_warn();
+ warned_about_bios = 1;
+ }
}
me_enable(e_menu_main, MA_MAIN_RESUME_GAME, ready_to_go);
me_enable(e_menu_main, MA_MAIN_SAVE_STATE, ready_to_go && CdromId[0]);
me_enable(e_menu_main, MA_MAIN_LOAD_STATE, ready_to_go && CdromId[0]);
me_enable(e_menu_main, MA_MAIN_RESET_GAME, ready_to_go);
+ me_enable(e_menu_main, MA_MAIN_CHEATS, ready_to_go && NumCheats);
in_set_config_int(0, IN_CFG_BLOCKING, 1);
} while (!ready_to_go);
/* wait until menu, ok, back is released */
- while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK))
+ while (in_menu_wait_any(NULL, 50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK))
;
in_set_config_int(0, IN_CFG_BLOCKING, 0);
void menu_init(void)
{
char buff[MAXPATHLEN];
+ int i;
strcpy(last_selected_fname, "/media");
+ cpu_clock_st = cpu_clock = plat_target_cpu_clock_get();
+
scan_bios_plugins();
- pnd_menu_init();
- menu_init_common();
+ menu_init_base();
menu_set_defconfig();
menu_load_config(0);
- last_psx_w = 320;
- last_psx_h = 240;
- last_psx_bpp = 16;
+ menu_do_last_cd_img(1);
+ last_vout_w = 320;
+ last_vout_h = 240;
+ last_vout_bpp = 16;
g_menubg_src_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1);
- if (g_menubg_src_ptr == NULL)
+ g_menubg_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1);
+ if (g_menubg_src_ptr == NULL || g_menubg_ptr == NULL) {
+ fprintf(stderr, "OOM\n");
exit(1);
+ }
+
emu_make_path(buff, "skin/background.png", sizeof(buff));
readpng(g_menubg_src_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h);
-#ifndef __ARM_ARCH_7A__ /* XXX */
- me_enable(e_menu_options, MA_OPT_DISP_OPTS, 0);
- me_enable(e_menu_keyconfig, MA_CTRL_NUBS_BTNS, 0);
-#else
- me_enable(e_menu_keyconfig, MA_CTRL_VIBRATION, 0);
- me_enable(e_menu_keyconfig, MA_CTRL_DEADZONE, 0);
+ i = plat_target.cpu_clock_set != NULL
+ && plat_target.cpu_clock_get != NULL && cpu_clock_st > 0;
+ me_enable(e_menu_gfx_options, MA_OPT_CPU_CLOCKS, i);
+
+ i = me_id2offset(e_menu_gfx_options, MA_OPT_HWFILTER);
+ e_menu_gfx_options[i].data = plat_target.hwfilters;
+ me_enable(e_menu_gfx_options, MA_OPT_HWFILTER,
+ plat_target.hwfilters != NULL);
+
+ me_enable(e_menu_gfx_options, MA_OPT_GAMMA,
+ plat_target.gamma_set != NULL);
+
+#ifndef __ARM_ARCH_7A__
+ me_enable(e_menu_gfx_options, MA_OPT_SWFILTER, 0);
#endif
+ me_enable(e_menu_gfx_options, MA_OPT_VARSCALER, MENU_SHOW_VARSCALER);
+ me_enable(e_menu_gfx_options, MA_OPT_VIDOVERLAY, MENU_SHOW_VIDOVERLAY);
+ me_enable(e_menu_gfx_options, MA_OPT_VARSCALER_C, MENU_SHOW_VARSCALER);
+ me_enable(e_menu_gfx_options, MA_OPT_SCALER2, MENU_SHOW_SCALER2);
+ me_enable(e_menu_keyconfig, MA_CTRL_NUBS_BTNS, MENU_SHOW_NUBS_BTNS);
+ me_enable(e_menu_keyconfig, MA_CTRL_VIBRATION, MENU_SHOW_VIBRATION);
+ me_enable(e_menu_keyconfig, MA_CTRL_DEADZONE, MENU_SHOW_DEADZONE);
}
void menu_notify_mode_change(int w, int h, int bpp)
{
- float mult;
- int imult;
-
- last_psx_w = w;
- last_psx_h = h;
- last_psx_bpp = bpp;
-
- switch (scaling) {
- case SCALE_1_1:
- g_layer_w = w; g_layer_h = h;
- break;
-
- case SCALE_4_3v2:
- if (h > g_menuscreen_h || (240 < h && h <= 360))
- goto fractional_4_3;
-
- // 4:3 that prefers integer scaling
- imult = g_menuscreen_h / h;
- g_layer_w = w * imult;
- g_layer_h = h * imult;
- mult = (float)g_layer_w / (float)g_layer_h;
- if (mult < 1.25f || mult > 1.666f)
- g_layer_w = 4.0f/3.0f * (float)g_layer_h;
- printf(" -> %dx%d %.1f\n", g_layer_w, g_layer_h, mult);
- break;
-
- fractional_4_3:
- case SCALE_4_3:
- mult = 240.0f / (float)h * 4.0f / 3.0f;
- if (h > 256)
- mult *= 2.0f;
- g_layer_w = mult * (float)g_menuscreen_h;
- g_layer_h = g_menuscreen_h;
- printf(" -> %dx%d %.1f\n", g_layer_w, g_layer_h, mult);
- break;
-
- case SCALE_FULLSCREEN:
- g_layer_w = g_menuscreen_w;
- g_layer_h = g_menuscreen_h;
- break;
-
- default:
- break;
- }
-
- g_layer_x = g_menuscreen_w / 2 - g_layer_w / 2;
- g_layer_y = g_menuscreen_h / 2 - g_layer_h / 2;
- if (g_layer_x < 0) g_layer_x = 0;
- if (g_layer_y < 0) g_layer_y = 0;
- if (g_layer_w > g_menuscreen_w) g_layer_w = g_menuscreen_w;
- if (g_layer_h > g_menuscreen_h) g_layer_w = g_menuscreen_h;
+ last_vout_w = w;
+ last_vout_h = h;
+ last_vout_bpp = bpp;
}
static void menu_leave_emu(void)
plat_video_menu_enter(ready_to_go);
memcpy(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2);
- if (pl_vout_buf != NULL && ready_to_go && last_psx_bpp == 16) {
- int x = max(0, g_menuscreen_w - last_psx_w);
- int y = max(0, g_menuscreen_h / 2 - last_psx_h / 2);
- int w = min(g_menuscreen_w, last_psx_w);
- int h = min(g_menuscreen_h, last_psx_h);
+ if (pl_vout_buf != NULL && ready_to_go) {
+ int x = max(0, g_menuscreen_w - last_vout_w);
+ int y = max(0, g_menuscreen_h / 2 - last_vout_h / 2);
+ int w = min(g_menuscreen_w, last_vout_w);
+ int h = min(g_menuscreen_h, last_vout_h);
u16 *d = (u16 *)g_menubg_ptr + g_menuscreen_w * y + x;
- u16 *s = pl_vout_buf;
+ char *s = pl_vout_buf;
- for (; h > 0; h--, d += g_menuscreen_w, s += last_psx_w)
- menu_darken_bg(d, s, w, 0);
+ if (last_vout_bpp == 16) {
+ for (; h > 0; h--, d += g_menuscreen_w, s += last_vout_w * 2)
+ menu_darken_bg(d, s, w, 0);
+ }
+ else {
+ for (; h > 0; h--, d += g_menuscreen_w, s += last_vout_w * 3) {
+ rgb888_to_rgb565(d, s, w * 3);
+ menu_darken_bg(d, d, w, 0);
+ }
+ }
}
if (ready_to_go)
- cpu_clock = plat_cpu_clock_get();
+ cpu_clock = plat_target_cpu_clock_get();
}
void menu_prepare_emu(void)
plat_video_menu_leave();
- menu_notify_mode_change(last_psx_w, last_psx_h, last_psx_bpp);
-
psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec;
if (psxCpu != prev_cpu)
// note that this does not really reset, just clears drc caches
CDR_stop();
menu_sync_config();
- apply_lcdrate(Config.PsxType);
- apply_filter(filter);
- plat_cpu_clock_apply(cpu_clock);
+ if (cpu_clock > 0)
+ plat_target_cpu_clock_set(cpu_clock);
// push config to GPU plugin
plugin_call_rearmed_cbs();
dfinput_activate();
}
-void me_update_msg(const char *msg)
+void menu_update_msg(const char *msg)
{
strncpy(menu_error_msg, msg, sizeof(menu_error_msg));
menu_error_msg[sizeof(menu_error_msg) - 1] = 0;
lprintf("msg: %s\n", menu_error_msg);
}
+void menu_finish(void)
+{
+ if (cpu_clock_st > 0)
+ plat_target_cpu_clock_set(cpu_clock_st);
+}