diff options
-rw-r--r-- | Makefile.libretro | 6 | ||||
-rw-r--r-- | frontend/libretro.c | 43 | ||||
-rw-r--r-- | libpcsxcore/misc.c | 2 | ||||
-rw-r--r-- | libpcsxcore/psxcommon.h | 1 |
4 files changed, 37 insertions, 15 deletions
diff --git a/Makefile.libretro b/Makefile.libretro index a8c8c4a..28a47fd 100644 --- a/Makefile.libretro +++ b/Makefile.libretro @@ -36,6 +36,7 @@ LIBDL := -lroot -lnetwork else LIBDL := -ldl endif +LIBM := -lm MMAP_WIN32=0 EXTRA_LDFLAGS = @@ -54,6 +55,7 @@ else ifeq ($(platform), linux-portable) LIBZ := LIBPTHREAD := LIBDL := + LIBM := NO_UNDEF_CHECK = 1 # OS X @@ -215,6 +217,7 @@ else ifeq ($(platform), qnx) MAIN_LDLIBS += -lsocket LIBPTHREAD := LIBDL := + LIBM := #Raspberry Pi 2 else ifeq ($(platform), rpi2) @@ -317,11 +320,12 @@ else MAIN_LDLIBS += -lws2_32 LIBPTHREAD := LIBDL := + LIBM := endif CFLAGS += $(fpic) MAIN_LDFLAGS += -shared -MAIN_LDLIBS += $(LIBPTHREAD) $(LIBDL) $(LIBZ) +MAIN_LDLIBS += $(LIBPTHREAD) $(LIBM) $(LIBDL) $(LIBZ) # try to autodetect stuff for the lazy ifndef ARCH diff --git a/frontend/libretro.c b/frontend/libretro.c index 7fa63cb..bc56ff8 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -22,6 +22,7 @@ #include "../libpcsxcore/cdrom.h" #include "../libpcsxcore/cdriso.h" #include "../libpcsxcore/cheat.h" +#include "../libpcsxcore/r3000a.h" #include "../plugins/dfsound/out.h" #include "../plugins/dfsound/spu_config.h" #include "../plugins/dfinput/externals.h" @@ -57,7 +58,7 @@ static retro_input_poll_t input_poll_cb; static retro_input_state_t input_state_cb; static retro_environment_t environ_cb; static retro_audio_sample_batch_t audio_batch_cb; -static struct retro_rumble_interface rumble; +static retro_set_rumble_state_t rumble_cb; static struct retro_log_callback logging; static retro_log_printf_t log_cb; @@ -430,10 +431,13 @@ void pl_timing_prepare(int is_pal) void plat_trigger_vibrate(int pad, int low, int high) { - if(in_enable_vibration) + if (!rumble_cb) + return; + + if (in_enable_vibration) { - rumble.set_rumble_state(pad, RETRO_RUMBLE_STRONG, high << 8); - rumble.set_rumble_state(pad, RETRO_RUMBLE_WEAK, low ? 0xffff : 0x0); + rumble_cb(pad, RETRO_RUMBLE_STRONG, high << 8); + rumble_cb(pad, RETRO_RUMBLE_WEAK, low ? 0xffff : 0x0); } } @@ -1286,7 +1290,10 @@ bool retro_load_game(const struct retro_game_info *info) return false; } - SysReset(); + /* TODO: Calling SysReset() outside retro_run for some system + * causes RetroArch to freeze, e.g Ludo */ + //SysReset(); + rebootemu = 1; if (LoadCdrom() == -1) { log_cb(RETRO_LOG_INFO, "could not load CD\n"); @@ -1576,7 +1583,9 @@ static void update_variables(bool in_flight) if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) { if (strcmp(var.value, "enabled") == 0) - rebootemu = 1; + Config.SlowBoot = 1; + else + Config.SlowBoot = 0; } } } @@ -1616,11 +1625,15 @@ static uint16_t get_analog_button(retro_input_state_t input_state_cb, int player void retro_run(void) { - int i; - //SysReset must be run while core is running,Not in menu (Locks up Retroarch) - if(rebootemu != 0){ - rebootemu = 0; - SysReset(); + int i; + //SysReset must be run while core is running,Not in menu (Locks up Retroarch) + if (rebootemu != 0) { + rebootemu = 0; + SysReset(); + if (!Config.HLE && !Config.SlowBoot) { + // skip BIOS logos + psxRegs.pc = psxRegs.GPR.n.ra; + } } input_poll_cb(); @@ -1883,6 +1896,7 @@ static int init_memcards(void) void retro_init(void) { + struct retro_rumble_interface rumble; const char *bios[] = { "SCPH101", "SCPH7001", "SCPH5501", "SCPH1001", "scph101", "scph7001", "scph5501", "scph1001" @@ -1931,7 +1945,7 @@ void retro_init(void) #endif vout_buf_ptr = vout_buf; - + if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir) { snprintf(Config.BiosDir, sizeof(Config.BiosDir), "%s", dir); @@ -1962,7 +1976,10 @@ void retro_init(void) environ_cb(RETRO_ENVIRONMENT_GET_CAN_DUPE, &vout_can_dupe); environ_cb(RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE, &disk_control); - environ_cb(RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE, &rumble); + + rumble_cb = NULL; + if (environ_cb(RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE, &rumble)) + rumble_cb = rumble.set_rumble_state; /* Set how much slower PSX CPU runs * 100 (so that 200 is 2 times) * we have to do this because cache misses and some IO penalties diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c index 58170cf..bb34e5b 100644 --- a/libpcsxcore/misc.c +++ b/libpcsxcore/misc.c @@ -180,7 +180,7 @@ int LoadCdrom() { // is just below, do it here fake_bios_gpu_setup(); - if (!Config.HLE) { + if (!Config.HLE && !Config.SlowBoot) { // skip BIOS logos psxRegs.pc = psxRegs.GPR.n.ra; return 0; diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h index 9f5444e..a7dd6ae 100644 --- a/libpcsxcore/psxcommon.h +++ b/libpcsxcore/psxcommon.h @@ -119,6 +119,7 @@ typedef struct { boolean PsxAuto; boolean Cdda; boolean HLE; + boolean SlowBoot; boolean Debug; boolean PsxOut; boolean SpuIrq; |