X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Flibretro.c;h=1e8650918cd06725e1a276b07444e8cdb62049d3;hb=9766e77ddec3157cbf8b7da407b99f47467a8f72;hp=bdce90ee1a9f2579d1ec58ac26d9914d4886a5a3;hpb=3b1a5e21b399fcb38c5d8ead3c16603f566d7ffa;p=pcsx_rearmed.git diff --git a/frontend/libretro.c b/frontend/libretro.c index bdce90ee..1e865091 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -10,6 +10,10 @@ #include #include #include +#ifdef __MACH__ +#include +#include +#endif #include "../libpcsxcore/misc.h" #include "../libpcsxcore/psxcounters.h" @@ -33,6 +37,8 @@ #include "3ds/3ds_utils.h" #endif +#define PORTS_NUMBER 8 + static retro_video_refresh_t video_cb; static retro_input_poll_t input_poll_cb; static retro_input_state_t input_state_cb; @@ -54,13 +60,13 @@ extern char Mcd1Data[MCD_SIZE]; extern char McdDisable[2]; /* PCSX ReARMed core calls and stuff */ -int in_type[8] = { PSE_PAD_TYPE_STANDARD, PSE_PAD_TYPE_STANDARD, - PSE_PAD_TYPE_STANDARD, PSE_PAD_TYPE_STANDARD, - PSE_PAD_TYPE_STANDARD, PSE_PAD_TYPE_STANDARD, - PSE_PAD_TYPE_STANDARD, PSE_PAD_TYPE_STANDARD }; +int in_type[8] = { PSE_PAD_TYPE_NONE, PSE_PAD_TYPE_NONE, + PSE_PAD_TYPE_NONE, PSE_PAD_TYPE_NONE, + PSE_PAD_TYPE_NONE, PSE_PAD_TYPE_NONE, + PSE_PAD_TYPE_NONE, PSE_PAD_TYPE_NONE }; int in_analog_left[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }}; int in_analog_right[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }}; -unsigned short in_keystate[8]; +unsigned short in_keystate[PORTS_NUMBER]; int multitap1 = 0; int multitap2 = 0; int in_enable_vibration = 1; @@ -254,6 +260,85 @@ void pl_3ds_munmap(void *ptr, size_t size, enum psxMapTag tag) } #endif +#ifdef VITA +typedef struct +{ + void* buffer; + uint32_t target_map; + size_t size; + enum psxMapTag tag; +}psx_map_t; + +psx_map_t custom_psx_maps[] = { + {NULL, NULL, 0x210000, MAP_TAG_RAM}, // 0x80000000 + {NULL, NULL, 0x010000, MAP_TAG_OTHER}, // 0x1f800000 + {NULL, NULL, 0x080000, MAP_TAG_OTHER}, // 0x1fc00000 + {NULL, NULL, 0x800000, MAP_TAG_LUTS}, // 0x08000000 + {NULL, NULL, 0x200000, MAP_TAG_VRAM}, // 0x00000000 +}; + +void* pl_vita_mmap(unsigned long addr, size_t size, int is_fixed, + enum psxMapTag tag) +{ + (void)is_fixed; + (void)addr; + + + psx_map_t* custom_map = custom_psx_maps; + + for (; custom_map->size; custom_map++) + { + if ((custom_map->size == size) && (custom_map->tag == tag)) + { + int block, ret; + char blockname[32]; + sprintf(blockname, "CODE 0x%08X",tag); + + block = sceKernelAllocMemBlock(blockname, size + 0x1000); + if(block<=0){ + sceClibPrintf("could not alloc mem block @0x%08X 0x%08X \n", block, tag); + exit(1); + } + + // get base address + ret = sceKernelGetMemBlockBase(block, &custom_map->buffer); + if (ret < 0) + { + sceClibPrintf("could get address @0x%08X 0x%08X 0x%08X \n", block, ret, tag); + exit(1); + } + custom_map->buffer = (((u32)custom_map->buffer) + 0xFFF) & ~0xFFF; + custom_map->target_map = block; + + return custom_map->buffer; + } + } + + + return malloc(size); +} + +void pl_vita_munmap(void *ptr, size_t size, enum psxMapTag tag) +{ + (void)tag; + + psx_map_t* custom_map = custom_psx_maps; + + for (; custom_map->size; custom_map++) + { + if ((custom_map->buffer == ptr)) + { + sceKernelFreeMemBlock(custom_map->target_map); + custom_map->buffer = NULL; + custom_map->target_map = NULL; + return; + } + } + + free(ptr); +} +#endif + static void *pl_mmap(unsigned int size) { return psxMap(0, size, 0, MAP_TAG_VRAM); @@ -333,16 +418,16 @@ void retro_set_environment(retro_environment_t cb) static const struct retro_variable vars[] = { { "pcsx_rearmed_frameskip", "Frameskip; 0|1|2|3" }, { "pcsx_rearmed_region", "Region; Auto|NTSC|PAL" }, - { "pcsx_rearmed_pad1type", "Pad 1 Type; standard|analog|negcon" }, - { "pcsx_rearmed_pad2type", "Pad 2 Type; standard|analog|negcon" }, - { "pcsx_rearmed_pad3type", "Pad 3 Type; standard|analog|negcon" }, - { "pcsx_rearmed_pad4type", "Pad 4 Type; standard|analog|negcon" }, - { "pcsx_rearmed_pad5type", "Pad 5 Type; standard|analog|negcon" }, - { "pcsx_rearmed_pad6type", "Pad 6 Type; standard|analog|negcon" }, - { "pcsx_rearmed_pad7type", "Pad 7 Type; standard|analog|negcon" }, - { "pcsx_rearmed_pad8type", "Pad 8 Type; standard|analog|negcon" }, - { "pcsx_rearmed_multitap1", "Multitap 1; disabled|enabled" }, - { "pcsx_rearmed_multitap2", "Multitap 2; disabled|enabled" }, + { "pcsx_rearmed_pad1type", "Pad 1 Type; default|none|standard|analog|negcon" }, + { "pcsx_rearmed_pad2type", "Pad 2 Type; default|none|standard|analog|negcon" }, + { "pcsx_rearmed_pad3type", "Pad 3 Type; default|none|standard|analog|negcon" }, + { "pcsx_rearmed_pad4type", "Pad 4 Type; default|none|standard|analog|negcon" }, + { "pcsx_rearmed_pad5type", "Pad 5 Type; default|none|standard|analog|negcon" }, + { "pcsx_rearmed_pad6type", "Pad 6 Type; default|none|standard|analog|negcon" }, + { "pcsx_rearmed_pad7type", "Pad 7 Type; default|none|standard|analog|negcon" }, + { "pcsx_rearmed_pad8type", "Pad 8 Type; default|none|standard|analog|negcon" }, + { "pcsx_rearmed_multitap1", "Multitap 1; auto|disabled|enabled" }, + { "pcsx_rearmed_multitap2", "Multitap 2; auto|disabled|enabled" }, #ifndef DRC_DISABLE { "pcsx_rearmed_drc", "Dynamic recompiler; enabled|disabled" }, #endif @@ -375,9 +460,160 @@ unsigned retro_api_version(void) return RETRO_API_VERSION; } +static int controller_port_variable(unsigned port, struct retro_variable *var) +{ + if (port >= PORTS_NUMBER) + return 0; + + if (!environ_cb) + return 0; + + var->value = NULL; + switch (port) { + case 0: + var->key = "pcsx_rearmed_pad1type"; + break; + case 1: + var->key = "pcsx_rearmed_pad2type"; + break; + case 2: + var->key = "pcsx_rearmed_pad3type"; + break; + case 3: + var->key = "pcsx_rearmed_pad4type"; + break; + case 4: + var->key = "pcsx_rearmed_pad5type"; + break; + case 5: + var->key = "pcsx_rearmed_pad6type"; + break; + case 6: + var->key = "pcsx_rearmed_pad7type"; + break; + case 7: + var->key = "pcsx_rearmed_pad8type"; + break; + } + + return environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, var) || var->value; +} + +static void update_controller_port_variable(unsigned port) +{ + if (port >= PORTS_NUMBER) + return; + + struct retro_variable var; + + if (controller_port_variable(port, &var)) + { + if (strcmp(var.value, "standard") == 0) + in_type[0] = PSE_PAD_TYPE_STANDARD; + else if (strcmp(var.value, "analog") == 0) + in_type[0] = PSE_PAD_TYPE_ANALOGPAD; + else if (strcmp(var.value, "negcon") == 0) + in_type[0] = PSE_PAD_TYPE_NEGCON; + else if (strcmp(var.value, "none") == 0) + in_type[0] = PSE_PAD_TYPE_NONE; + // else 'default' case, do nothing + } +} + +static void update_controller_port_device(unsigned port, unsigned device) +{ + if (port >= PORTS_NUMBER) + return; + + struct retro_variable var; + + if (!controller_port_variable(port, &var)) + return; + + if (strcmp(var.value, "default") != 0) + return; + + switch (device) + { + case RETRO_DEVICE_JOYPAD: + in_type[port] = PSE_PAD_TYPE_STANDARD; + break; + case RETRO_DEVICE_ANALOG: + in_type[port] = PSE_PAD_TYPE_ANALOGPAD; + break; + case RETRO_DEVICE_MOUSE: + in_type[port] = PSE_PAD_TYPE_MOUSE; + break; + case RETRO_DEVICE_LIGHTGUN: + in_type[port] = PSE_PAD_TYPE_GUN; + break; + case RETRO_DEVICE_NONE: + default: + in_type[port] = PSE_PAD_TYPE_NONE; + } +} + +static void update_multitap() +{ + struct retro_variable var; + int auto_case, port; + + var.value = NULL; + var.key = "pcsx_rearmed_multitap1"; + auto_case = 0; + if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)) + { + if (strcmp(var.value, "enabled") == 0) + multitap1 = 1; + else if (strcmp(var.value, "disabled") == 0) + multitap1 = 0; + else // 'auto' case + auto_case = 1; + } + else + auto_case = 1; + + if (auto_case) + { + // If a gamepad is plugged after port 2, we need a first multitap. + multitap1 = 0; + for (port = 2; port < PORTS_NUMBER; port++) + multitap1 |= in_type[port] != PSE_PAD_TYPE_NONE; + } + + var.value = NULL; + var.key = "pcsx_rearmed_multitap2"; + auto_case = 0; + if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)) + { + if (strcmp(var.value, "enabled") == 0) + multitap2 = 1; + else if (strcmp(var.value, "disabled") == 0) + multitap2 = 0; + else // 'auto' case + auto_case = 1; + } + else + auto_case = 1; + + if (auto_case) + { + // If a gamepad is plugged after port 4, we need a second multitap. + multitap2 = 0; + for (port = 4; port < PORTS_NUMBER; port++) + multitap2 |= in_type[port] != PSE_PAD_TYPE_NONE; + } +} + void retro_set_controller_port_device(unsigned port, unsigned device) { SysPrintf("port %u device %u",port,device); + + if (port >= PORTS_NUMBER) + return; + + update_controller_port_device(port, device); + update_multitap(); } void retro_get_system_info(struct retro_system_info *info) @@ -1051,6 +1287,7 @@ static const unsigned short retro_psx_map[] = { static void update_variables(bool in_flight) { struct retro_variable var; + int i; var.value = NULL; var.key = "pcsx_rearmed_frameskip"; @@ -1070,111 +1307,10 @@ static void update_variables(bool in_flight) Config.PsxType = 1; } - var.value = NULL; - var.key = "pcsx_rearmed_pad1type"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - in_type[0] = PSE_PAD_TYPE_STANDARD; - if (strcmp(var.value, "analog") == 0) - in_type[0] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[0] = PSE_PAD_TYPE_NEGCON; - } - - var.value = NULL; - var.key = "pcsx_rearmed_pad2type"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - in_type[1] = PSE_PAD_TYPE_STANDARD; - if (strcmp(var.value, "analog") == 0) - in_type[1] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[1] = PSE_PAD_TYPE_NEGCON; - } - - var.value = NULL; - var.key = "pcsx_rearmed_pad3type"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - in_type[2] = PSE_PAD_TYPE_STANDARD; - if (strcmp(var.value, "analog") == 0) - in_type[2] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[2] = PSE_PAD_TYPE_NEGCON; - } + for (i = 0; i < PORTS_NUMBER; i++) + update_controller_port_variable(i); - var.value = NULL; - var.key = "pcsx_rearmed_pad4type"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - in_type[3] = PSE_PAD_TYPE_STANDARD; - if (strcmp(var.value, "analog") == 0) - in_type[3] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[3] = PSE_PAD_TYPE_NEGCON; - } - - var.value = NULL; - var.key = "pcsx_rearmed_pad5type"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - in_type[4] = PSE_PAD_TYPE_STANDARD; - if (strcmp(var.value, "analog") == 0) - in_type[4] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[4] = PSE_PAD_TYPE_NEGCON; - } - - var.value = NULL; - var.key = "pcsx_rearmed_pad6type"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - in_type[5] = PSE_PAD_TYPE_STANDARD; - if (strcmp(var.value, "analog") == 0) - in_type[5] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[5] = PSE_PAD_TYPE_NEGCON; - } - - var.value = NULL; - var.key = "pcsx_rearmed_pad7type"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - in_type[6] = PSE_PAD_TYPE_STANDARD; - if (strcmp(var.value, "analog") == 0) - in_type[6] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[6] = PSE_PAD_TYPE_NEGCON; - } - - var.value = NULL; - var.key = "pcsx_rearmed_pad8type"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - in_type[7] = PSE_PAD_TYPE_STANDARD; - if (strcmp(var.value, "analog") == 0) - in_type[7] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[7] = PSE_PAD_TYPE_NEGCON; - } - - var.value = NULL; - var.key = "pcsx_rearmed_multitap1"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - if (strcmp(var.value, "enabled") == 0) - multitap1 = 1; - else multitap1 = 0; - } - - var.value = NULL; - var.key = "pcsx_rearmed_multitap2"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - if (strcmp(var.value, "enabled") == 0) - multitap2 = 1; - else multitap2 = 0; - } + update_multitap(); #ifdef __ARM_NEON__ var.value = "NULL"; @@ -1322,8 +1458,12 @@ void retro_run(void) // reset all keystate, query libretro for keystate int j; - for(i = 0; i < 8; i++) { + for(i = 0; i < PORTS_NUMBER; i++) { in_keystate[i] = 0; + + if (in_type[i] == PSE_PAD_TYPE_NONE) + continue; + // query libretro for keystate for (j = 0; j < RETRO_PSX_MAP_LEN; j++) if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, j)) @@ -1414,9 +1554,18 @@ void retro_init(void) int i, ret; bool found_bios = false; +#ifdef __MACH__ + // magic sauce to make the dynarec work on iOS + syscall(SYS_ptrace, 0 /*PTRACE_TRACEME*/, 0, 0, 0); +#endif + #ifdef _3DS psxMapHook = pl_3ds_mmap; psxUnmapHook = pl_3ds_munmap; +#endif +#ifdef VITA + psxMapHook = pl_vita_mmap; + psxUnmapHook = pl_vita_munmap; #endif ret = emu_core_preinit(); #ifdef _3DS