#include "plugin.h"
#include "plugin_lib.h"
#include "omap.h"
+#include "pandora.h"
#include "pcnt.h"
+#include "arm_utils.h"
#include "common/plat.h"
+#include "common/input.h"
+#include "linux/in_evdev.h"
#include "../libpcsxcore/misc.h"
#include "../libpcsxcore/cdrom.h"
#include "../libpcsxcore/psemu_plugin_defs.h"
// propagate menu settings to the emu vars
static void menu_sync_config(void)
{
+ static int allow_abs_only_old;
+
Config.PsxAuto = 1;
if (region > 0) {
Config.PsxAuto = 0;
Config.PsxType = region - 1;
}
in_type = in_type_sel ? PSE_PAD_TYPE_ANALOGPAD : PSE_PAD_TYPE_STANDARD;
+ if (in_evdev_allow_abs_only != allow_abs_only_old) {
+ pandora_rescan_inputs();
+ allow_abs_only_old = in_evdev_allow_abs_only;
+ }
pl_frame_interval = Config.PsxType ? 20000 : 16667;
// used by P.E.Op.S. frameskip code
region = 0;
in_type_sel = 0;
+ in_evdev_allow_abs_only = 0;
Config.Xa = Config.Cdda = Config.Sio =
Config.SpuIrq = Config.RCntFix = Config.VSyncWA = 0;
CE_INTVAL_V(iSPUIRQWait, 2),
CE_INTVAL(iUseTimer),
CE_INTVAL(warned_about_bios),
+ CE_INTVAL(in_evdev_allow_abs_only),
};
static char *get_cd_label(void)
// a bit of black magic here
static void draw_savestate_bg(int slot)
{
- extern void bgr555_to_rgb565(void *dst, void *src, int bytes);
static const int psx_widths[8] = { 256, 368, 320, 384, 512, 512, 640, 640 };
int x, y, w, h;
char fname[MAXPATHLEN];
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)
{ "Prev Save Slot ", 1 << SACTION_PREV_SSLOT },
{ "Next Save Slot ", 1 << SACTION_NEXT_SSLOT },
{ "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP },
+ { "Take Screenshot ", 1 << SACTION_SCREENSHOT },
{ "Enter Menu ", 1 << SACTION_ENTER_MENU },
{ NULL, 0 }
};
lprintf("config: unhandled action \"%s\"\n", act);
}
}
+ in_clean_binds();
}
static int key_config_loop_wrap(int id, int keys)
return 1;
}
+static int mh_input_rescan(int id, int keys)
+{
+ //menu_sync_config();
+ pandora_rescan_inputs();
+ me_update_msg("rescan complete.");
+
+ return 0;
+}
+
static const char *men_in_type_sel[] = { "Standard (SCPH-1080)", "Analog (SCPH-1150)", NULL };
+static const char h_nub_btns[] = "Experimental, keep this OFF if unsure. Select rescan after change.";
static menu_entry e_menu_keyconfig[] =
{
mee_handler_id("Emulator controls", MA_CTRL_EMU, key_config_loop_wrap),
mee_label (""),
mee_enum ("Controller", 0, in_type_sel, men_in_type_sel),
+ mee_onoff_h ("Nubs as buttons", 0, in_evdev_allow_abs_only, 1, h_nub_btns),
mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg),
mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg),
+ mee_handler ("Rescan devices", mh_input_rescan),
mee_label (""),
mee_label ("Input devices:"),
mee_label_mk (MA_CTRL_DEV_FIRST, mgn_dev_name),
*/
static const char h_restore_def[] = "Switches back to default / recommended\n"
"configuration";
+static const char h_frameskip[] = "Warning: frameskip sometimes causes glitches\n";
static menu_entry e_menu_options[] =
{
// mee_range ("Save slot", 0, state_slot, 0, 9),
// mee_enum_h ("Confirm savestate", 0, dummy, men_confirm_save, h_confirm_save),
- mee_onoff ("Frameskip", 0, UseFrameSkip, 1),
+ mee_onoff_h ("Frameskip", 0, UseFrameSkip, 1, h_frameskip),
mee_onoff ("Show FPS", 0, g_opts, OPT_SHOWFPS),
mee_enum ("Region", 0, region, men_region),
mee_range ("CPU clock", MA_OPT_CPU_CLOCKS, cpu_clock, 20, 5000),
// ------------ debug menu ------------
-static void draw_frame_debug(void)
+static void draw_frame_debug(GPUFreeze_t *gpuf)
{
+ int w = min(g_menuscreen_w, 1024);
+ int h = min(g_menuscreen_h, 512);
+ u16 *d = g_menuscreen_ptr;
+ u16 *s = (u16 *)gpuf->psxVRam;
+ char buff[64];
+ int ty = 1;
+
+ gpuf->ulFreezeVersion = 1;
+ if (GPU_freeze != NULL)
+ GPU_freeze(1, gpuf);
+
+ for (; h > 0; h--, d += g_menuscreen_w, s += 1024)
+ bgr555_to_rgb565(d, s, w * 2);
+
smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc);
+ snprintf(buff, sizeof(buff), "GPU sr: %08x", gpuf->ulStatus);
+ smalltext_out16(4, (ty += me_sfont_h), buff, 0xe7fc);
+ snprintf(buff, sizeof(buff), "PC/SP: %08x %08x", psxRegs.pc, psxRegs.GPR.n.sp);
+ smalltext_out16(4, (ty += me_sfont_h), buff, 0xe7fc);
}
static void debug_menu_loop(void)
{
+ GPUFreeze_t *gpuf;
int inp;
+ gpuf = malloc(sizeof(*gpuf));
+ if (gpuf == NULL)
+ return;
+
while (1)
{
- menu_draw_begin(1);
- draw_frame_debug();
+ menu_draw_begin(0);
+ draw_frame_debug(gpuf);
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)
- return;
+ break;
}
+
+ free(gpuf);
}
// ------------ main menu ------------
while (1)
{
- menu_draw_begin(1);
draw_menu_message(msg, NULL);
- menu_draw_end();
inp = in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
if (inp & (PBTN_MBACK|PBTN_MOK))
case SCALE_CUSTOM:
break;
}
- apply_filter(filter);
- apply_cpu_clock();
psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec;
if (psxCpu != prev_cpu)
CDR_stop();
menu_sync_config();
+ apply_lcdrate(Config.PsxType);
+ apply_filter(filter);
+ apply_cpu_clock();
if (GPU_open != NULL) {
int ret = GPU_open(&gpuDisp, "PCSX", NULL);