X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Flibretro.c;h=aaeb624200a39106d74191235e119e125599a74d;hb=f730f194726374a7f9bccc030632635d5d4a8c83;hp=b611e84e9963ee09422254e0aadb2a01a82f6019;hpb=b3480be8a40914a51ad3d404fa79db706fe9c886;p=pcsx_rearmed.git diff --git a/frontend/libretro.c b/frontend/libretro.c index b611e84e..aaeb6242 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -28,6 +28,12 @@ #include "revision.h" #include "libretro.h" +#ifdef _3DS +#include "3ds.h" +#include "3ds/3ds_utils.h" +int ctr_svchack_init_success = 0; +#endif + static retro_video_refresh_t video_cb; static retro_input_poll_t input_poll_cb; static retro_input_state_t input_state_cb; @@ -165,8 +171,87 @@ static void vout_close(void) { } -static void *pl_mmap(unsigned int size) +#ifdef _3DS +typedef struct +{ + void* buffer; + uint32_t target_map; + size_t size; + enum psxMapTag tag; +}psx_map_t; + +psx_map_t custom_psx_maps[] = { + {NULL, 0x13000000, 0x210000, MAP_TAG_RAM}, // 0x80000000 + {NULL, 0x12800000, 0x010000, MAP_TAG_OTHER}, // 0x1f800000 + {NULL, 0x12c00000, 0x080000, MAP_TAG_OTHER}, // 0x1fc00000 + {NULL, 0x11000000, 0x800000, MAP_TAG_LUTS}, // 0x08000000 + {NULL, 0x12000000, 0x200000, MAP_TAG_VRAM}, // 0x00000000 +}; + +void* pl_3ds_mmap(unsigned long addr, size_t size, int is_fixed, + enum psxMapTag tag) { + (void)is_fixed; + (void)addr; + + if (ctr_svchack_init_success) + { + psx_map_t* custom_map = custom_psx_maps; + + for (; custom_map->size; custom_map++) + { + if ((custom_map->size == size) && (custom_map->tag == tag)) + { + uint32_t ptr_aligned, tmp; + + custom_map->buffer = malloc(size + 0x1000); + ptr_aligned = (((u32)custom_map->buffer) + 0xFFF) & ~0xFFF; + + if(svcControlMemory(&tmp, custom_map->target_map, ptr_aligned, size, MEMOP_MAP, 0x3) < 0) + { + SysPrintf("could not map memory @0x%08X\n", custom_map->target_map); + exit(1); + } + + return (void*)custom_map->target_map; + } + } + } + + return malloc(size); +} + +void pl_3ds_munmap(void *ptr, size_t size, enum psxMapTag tag) +{ + (void)tag; + + if (ctr_svchack_init_success) + { + psx_map_t* custom_map = custom_psx_maps; + + for (; custom_map->size; custom_map++) + { + if ((custom_map->target_map == (uint32_t)ptr)) + { + uint32_t ptr_aligned, tmp; + + ptr_aligned = (((u32)custom_map->buffer) + 0xFFF) & ~0xFFF; + + svcControlMemory(&tmp, custom_map->target_map, ptr_aligned, size, MEMOP_UNMAP, 0x3); + + free(custom_map->buffer); + custom_map->buffer = NULL; + return; + } + } + } + + free(ptr); +} +#endif + +static void *pl_mmap(unsigned int size) +{ return psxMap(0, size, 0, MAP_TAG_VRAM); } @@ -244,8 +329,8 @@ 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" }, - { "pcsx_rearmed_pad2type", "Pad 2 Type; standard|analog" }, + { "pcsx_rearmed_pad1type", "Pad 1 Type; standard|analog|negcon" }, + { "pcsx_rearmed_pad2type", "Pad 2 Type; standard|analog|negcon" }, #ifndef DRC_DISABLE { "pcsx_rearmed_drc", "Dynamic recompiler; enabled|disabled" }, #endif @@ -982,6 +1067,8 @@ static void update_variables(bool in_flight) in_type1 = PSE_PAD_TYPE_STANDARD; if (strcmp(var.value, "analog") == 0) in_type1 = PSE_PAD_TYPE_ANALOGPAD; + if (strcmp(var.value, "negcon") == 0) + in_type1 = PSE_PAD_TYPE_NEGCON; } var.value = NULL; @@ -992,6 +1079,9 @@ static void update_variables(bool in_flight) in_type2 = PSE_PAD_TYPE_STANDARD; if (strcmp(var.value, "analog") == 0) in_type2 = PSE_PAD_TYPE_ANALOGPAD; + if (strcmp(var.value, "negcon") == 0) + in_type2 = PSE_PAD_TYPE_NEGCON; + } #ifdef __ARM_NEON__ @@ -1048,6 +1138,11 @@ static void update_variables(bool in_flight) { R3000Acpu *prev_cpu = psxCpu; +#ifdef _3DS + if(!ctr_svchack_init_success) + Config.Cpu = CPU_INTERPRETER; + else +#endif if (strcmp(var.value, "disabled") == 0) Config.Cpu = CPU_INTERPRETER; else if (strcmp(var.value, "enabled") == 0) @@ -1125,7 +1220,7 @@ static void update_variables(bool in_flight) void retro_run(void) { - int i; + int i, val; input_poll_cb(); @@ -1142,6 +1237,7 @@ void retro_run(void) if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i)) in_keystate |= retro_psx_map[i]; + if (in_type1 == PSE_PAD_TYPE_ANALOGPAD) { in_a1[0] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / 256) + 128; @@ -1158,6 +1254,60 @@ void retro_run(void) in_a4[1] = (input_state_cb(1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / 256) + 128; } + + if (in_type1 == PSE_PAD_TYPE_NEGCON) + { + /* left brake */ + if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, 12)) + in_a1[1] = 255; + else + in_a1[1] = 0; + + /* steer */ + in_a2[0] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / 256) + 128; + + /* thrust and fire */ + val = ((input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / 127)); + if(val < -2) { + in_a1[0] = 256 - val; + } + if (val > 2) { + in_a2[1] = val; + } + if(val >= -2 && val <= 2) + { + in_a2[1] = 0; + in_a1[0] = 0; + } + } + + if (in_type2 == PSE_PAD_TYPE_NEGCON) + { + /* left brake */ + if(input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, 12)) + in_a3[1] = 255; + else + in_a3[1] = 0; + + /* steer */ + in_a4[0] = (input_state_cb(1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / 256) + 128; + + /* thrust and fire */ + val = ((input_state_cb(1, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / 127)); + if(val < -2) { + in_a3[0] = 256 - val; + } + if (val > 2) { + in_a4[1] = val; + } + if(val >= -2 && val <= 2) + { + in_a4[1] = 0; + in_a3[0] = 0; + } + } + + stop = 0; psxCpu->Execute(); @@ -1190,7 +1340,7 @@ static bool try_use_bios(const char *path) return true; } -#if 1 +#ifndef VITA #include #include @@ -1234,14 +1384,26 @@ void retro_init(void) int i, ret; bool found_bios = false; +#ifdef _3DS + ctr_svchack_init_success = ctr_svchack_init(); + psxMapHook = pl_3ds_mmap; + psxUnmapHook = pl_3ds_munmap; +#endif ret = emu_core_preinit(); +#ifdef _3DS + /* emu_core_preinit sets the cpu to dynarec */ + if(!ctr_svchack_init_success) + Config.Cpu = CPU_INTERPRETER; +#endif ret |= emu_core_init(); if (ret != 0) { SysPrintf("PCSX init failed.\n"); exit(1); } -#if defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) +#ifdef _3DS + vout_buf = linearMemAlign(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2, 0x80); +#elif defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && !defined(VITA) posix_memalign(&vout_buf, 16, VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2); #else vout_buf = malloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2); @@ -1249,7 +1411,7 @@ void retro_init(void) if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir) { - snprintf(Config.BiosDir, sizeof(Config.BiosDir), "%s/", dir); + snprintf(Config.BiosDir, sizeof(Config.BiosDir), "%s", dir); for (i = 0; i < sizeof(bios) / sizeof(bios[0]); i++) { snprintf(path, sizeof(path), "%s/%s.bin", dir, bios[i]); @@ -1307,6 +1469,18 @@ void retro_init(void) void retro_deinit(void) { SysClose(); +#ifdef _3DS + linearFree(vout_buf); +#else free(vout_buf); +#endif vout_buf = NULL; } + +#ifdef VITA +#include +int usleep (unsigned long us) +{ + sceKernelDelayThread(us); +} +#endif