diff options
author | hizzlekizzle | 2019-03-10 15:56:16 -0500 |
---|---|---|
committer | GitHub | 2019-03-10 15:56:16 -0500 |
commit | e21479a6d304e6c3eed69e2b6385ed674500e8d4 (patch) | |
tree | f823e88a2ff072eb9e910b7d4ecd93808f178b5d | |
parent | 4f8453cb9d67aa7aac5fc1395faa21f07cb2fdc9 (diff) | |
parent | bc1fc5f30082236c61800444c9b945e8e2095b29 (diff) | |
download | pcsx_rearmed-e21479a6d304e6c3eed69e2b6385ed674500e8d4.tar.gz pcsx_rearmed-e21479a6d304e6c3eed69e2b6385ed674500e8d4.tar.bz2 pcsx_rearmed-e21479a6d304e6c3eed69e2b6385ed674500e8d4.zip |
Merge pull request #240 from retro-wertz/core_options
PSX clock and BIOS core options, memcard2 fix etc
-rw-r--r-- | frontend/libretro.c | 143 | ||||
-rw-r--r-- | libpcsxcore/psxbios.c | 27 | ||||
-rw-r--r-- | libpcsxcore/sio.c | 6 | ||||
-rw-r--r-- | libpcsxcore/sio.h | 1 |
4 files changed, 124 insertions, 53 deletions
diff --git a/frontend/libretro.c b/frontend/libretro.c index bc56ff8..89b5ae2 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -466,16 +466,17 @@ void retro_set_environment(retro_environment_t cb) { static const struct retro_variable vars[] = { { "pcsx_rearmed_frameskip", "Frameskip; 0|1|2|3" }, + { "pcsx_rearmed_bios", "Use BIOS; auto|HLE" }, { "pcsx_rearmed_region", "Region; auto|NTSC|PAL" }, { "pcsx_rearmed_memcard2", "Enable second memory card; disabled|enabled" }, - { "pcsx_rearmed_pad1type", "Pad 1 Type; default|none|standard|analog|dualshock|negcon" }, - { "pcsx_rearmed_pad2type", "Pad 2 Type; default|none|standard|analog|dualshock|negcon" }, - { "pcsx_rearmed_pad3type", "Pad 3 Type; default|none|standard|analog|dualshock|negcon" }, - { "pcsx_rearmed_pad4type", "Pad 4 Type; default|none|standard|analog|dualshock|negcon" }, - { "pcsx_rearmed_pad5type", "Pad 5 Type; default|none|standard|analog|dualshock|negcon" }, - { "pcsx_rearmed_pad6type", "Pad 6 Type; default|none|standard|analog|dualshock|negcon" }, - { "pcsx_rearmed_pad7type", "Pad 7 Type; default|none|standard|analog|dualshock|negcon" }, - { "pcsx_rearmed_pad8type", "Pad 8 Type; default|none|standard|analog|dualshock|negcon" }, + { "pcsx_rearmed_pad1type", "Pad 1 Type; standard|analog|dualshock|negcon|none" }, + { "pcsx_rearmed_pad2type", "Pad 2 Type; standard|analog|dualshock|negcon|none" }, + { "pcsx_rearmed_pad3type", "Pad 3 Type; none|standard|analog|dualshock|negcon" }, + { "pcsx_rearmed_pad4type", "Pad 4 Type; none|standard|analog|dualshock|negcon" }, + { "pcsx_rearmed_pad5type", "Pad 5 Type; none|standard|analog|dualshock|negcon" }, + { "pcsx_rearmed_pad6type", "Pad 6 Type; none|standard|analog|dualshock|negcon" }, + { "pcsx_rearmed_pad7type", "Pad 7 Type; none|standard|analog|dualshock|negcon" }, + { "pcsx_rearmed_pad8type", "Pad 8 Type; none|standard|analog|dualshock|negcon" }, { "pcsx_rearmed_multitap1", "Multitap 1; auto|disabled|enabled" }, { "pcsx_rearmed_multitap2", "Multitap 2; auto|disabled|enabled" }, { "pcsx_rearmed_negcon_deadzone", "NegCon Twist Deadzone (percent); 0|5|10|15|20|25|30" }, @@ -484,6 +485,11 @@ void retro_set_environment(retro_environment_t cb) { "pcsx_rearmed_dithering", "Enable Dithering; enabled|disabled" }, #ifndef DRC_DISABLE { "pcsx_rearmed_drc", "Dynamic recompiler; enabled|disabled" }, +#ifdef HAVE_PRE_ARMV7 + { "pcsx_rearmed_psxclock", "PSX cpu clock (default 50); 50|51|52|53|54|55|5657|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49" }, +#else + { "pcsx_rearmed_psxclock", "PSX cpu clock (default 57); 57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56" }, +#endif #endif #ifdef __ARM_NEON__ { "pcsx_rearmed_neon_interlace_enable", "Enable interlacing mode(s); disabled|enabled" }, @@ -813,7 +819,7 @@ void retro_cheat_set(unsigned index, bool enabled, const char *code) // cheat funcs are destructive, need a copy.. strncpy(buf, code, sizeof(buf)); buf[sizeof(buf) - 1] = 0; - + //Prepare buffered cheat for PCSX's AddCheat fucntion. int cursor=0; int nonhexdec=0; @@ -827,7 +833,7 @@ void retro_cheat_set(unsigned index, bool enabled, const char *code) } cursor++; } - + if (index < NumCheats) ret = EditCheat(index, "", buf); @@ -1575,7 +1581,7 @@ static void update_variables(bool in_flight) } else{ //not yet running - + //bootlogo display hack if (found_bios) { var.value = "NULL"; @@ -1588,6 +1594,15 @@ static void update_variables(bool in_flight) Config.SlowBoot = 0; } } +#ifndef DRC_DISABLE + var.value = "NULL"; + var.key = "pcsx_rearmed_psxclock"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) + { + int psxclock = atoi(var.value); + cycle_multiplier = 10000 / psxclock; + } +#endif } } @@ -1634,7 +1649,7 @@ void retro_run(void) // skip BIOS logos psxRegs.pc = psxRegs.GPR.n.ra; } - } + } input_poll_cb(); @@ -1866,9 +1881,12 @@ static int init_memcards(void) struct retro_variable var = { .key="pcsx_rearmed_memcard2", .value=NULL }; static const char CARD2_FILE[] = "pcsx-card2.mcd"; - McdDisable[0] = 0; - // Disable memcard 2 by default - McdDisable[1] = 1; + // Memcard2 will be handled and is re-enabled if needed using core + // operations. + // Memcard1 is handled by libretro, doing this will set core to + // skip file io operations for memcard1 like SaveMcd + snprintf(Config.Mcd1, sizeof(Config.Mcd1), "none"); + snprintf(Config.Mcd2, sizeof(Config.Mcd2), "none"); init_memcard(Mcd1Data); // Memcard 2 is managed by the emulator on the filesystem, // There is no need to initialize Mcd2Data like Mcd1Data. @@ -1894,18 +1912,67 @@ static int init_memcards(void) return ret; } -void retro_init(void) +static void loadPSXBios(void) { - struct retro_rumble_interface rumble; + const char *dir; + char path[256]; + unsigned useHLE = 0; + const char *bios[] = { "SCPH101", "SCPH7001", "SCPH5501", "SCPH1001", "scph101", "scph7001", "scph5501", "scph1001" }; - const char *dir; - char path[256]; - int i, ret; - - found_bios = false; + + struct retro_variable var = { + .key = "pcsx_rearmed_bios", + .value = NULL + }; + + found_bios = 0; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { + if (!strcmp(var.value, "HLE")) + useHLE = 1; + } + + if (!useHLE) + { + if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir) + { + unsigned i; + snprintf(Config.BiosDir, sizeof(Config.BiosDir), "%s", dir); + + for (i = 0; i < sizeof(bios) / sizeof(bios[0]); i++) { + snprintf(path, sizeof(path), "%s%c%s.bin", dir, SLASH, bios[i]); + found_bios = try_use_bios(path); + if (found_bios) + break; + } + + if (!found_bios) + found_bios = find_any_bios(dir, path, sizeof(path)); + } + if (found_bios) { + SysPrintf("found BIOS file: %s\n", Config.Bios); + } + } + + if (useHLE || !found_bios) + { + SysPrintf("no BIOS files found.\n"); + struct retro_message msg = + { + "No PlayStation BIOS file found - add for better compatibility", + 180 + }; + environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void*)&msg); + } +} + +void retro_init(void) +{ + struct retro_rumble_interface rumble; + int ret; #ifdef __MACH__ // magic sauce to make the dynarec work on iOS @@ -1923,7 +1990,7 @@ void retro_init(void) psxUnmapHook = pl_vita_munmap; #endif ret = emu_core_preinit(); -#ifdef _3DS +#ifdef _3DS /* emu_core_preinit sets the cpu to dynarec */ if(!__ctr_svchax) Config.Cpu = CPU_INTERPRETER; @@ -1943,36 +2010,10 @@ void retro_init(void) #else vout_buf = malloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2); #endif - - vout_buf_ptr = vout_buf; - - if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir) - { - snprintf(Config.BiosDir, sizeof(Config.BiosDir), "%s", dir); - for (i = 0; i < sizeof(bios) / sizeof(bios[0]); i++) { - snprintf(path, sizeof(path), "%s%c%s.bin", dir, SLASH, bios[i]); - found_bios = try_use_bios(path); - if (found_bios) - break; - } + vout_buf_ptr = vout_buf; - if (!found_bios) - found_bios = find_any_bios(dir, path, sizeof(path)); - } - if (found_bios) { - SysPrintf("found BIOS file: %s\n", Config.Bios); - } - else - { - SysPrintf("no BIOS files found.\n"); - struct retro_message msg = - { - "No PlayStation BIOS file found - add for better compatibility", - 180 - }; - environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void*)&msg); - } + loadPSXBios(); environ_cb(RETRO_ENVIRONMENT_GET_CAN_DUPE, &vout_can_dupe); environ_cb(RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE, &disk_control); diff --git a/libpcsxcore/psxbios.c b/libpcsxcore/psxbios.c index d5ed725..a684601 100644 --- a/libpcsxcore/psxbios.c +++ b/libpcsxcore/psxbios.c @@ -26,6 +26,7 @@ #include "psxbios.h" #include "psxhw.h" #include "gpu.h" +#include "sio.h" #include <zlib.h> #undef SysPrintf @@ -261,7 +262,7 @@ static int CardState = -1; static TCB Thread[8]; static int CurThread = 0; static FileDesc FDesc[32]; -static u32 card_active_chan; +static u32 card_active_chan = 0; boolean hleSoftCall = FALSE; @@ -1271,14 +1272,35 @@ void psxBios_SetMem() { // 9f } void psxBios__card_info() { // ab + u8 ret, port; #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0); #endif card_active_chan = a0; + port = card_active_chan >> 4; + + switch (port) { + case 0x0: + case 0x1: + ret = 0x2; + if (McdDisable[port & 1]) + ret = 0x8; + break; + default: +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: UNKNOWN PORT 0x%x\n", biosA0n[0xab], card_active_chan); +#endif + ret = 0x11; + break; + } + + if (McdDisable[0] && McdDisable[1]) + ret = 0x8; // DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 - DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004 +// DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004 + DeliverEvent(0x81, ret); // 0xf4000001, 0x0004 v0 = 1; pc0 = ra; } @@ -2643,6 +2665,7 @@ void psxBiosInit() { CardState = -1; CurThread = 0; memset(FDesc, 0, sizeof(FDesc)); + card_active_chan = 0; psxMu32ref(0x0150) = SWAPu32(0x160); psxMu32ref(0x0154) = SWAPu32(0x320); diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c index d251fa7..c2390bf 100644 --- a/libpcsxcore/sio.c +++ b/libpcsxcore/sio.c @@ -423,6 +423,12 @@ void LoadMcd(int mcd, char *str) { } McdDisable[mcd - 1] = 0; +#ifdef HAVE_LIBRETRO + // memcard1 is handled by libretro + if (mcd == 1) + return; +#endif + if (str == NULL || strcmp(str, "none") == 0) { McdDisable[mcd - 1] = 1; return; diff --git a/libpcsxcore/sio.h b/libpcsxcore/sio.h index eff1746..a554c2b 100644 --- a/libpcsxcore/sio.h +++ b/libpcsxcore/sio.h @@ -34,6 +34,7 @@ extern "C" { #define MCD_SIZE (1024 * 8 * 16) extern char Mcd1Data[MCD_SIZE], Mcd2Data[MCD_SIZE]; +extern char McdDisable[2]; void sioWrite8(unsigned char value); void sioWriteStat16(unsigned short value); |