#include <stdlib.h>
#include <string.h>
#include <strings.h>
+#ifdef __MACH__
+#include <unistd.h>
+#include <sys/syscall.h>
+#endif
#include "../libpcsxcore/misc.h"
#include "../libpcsxcore/psxcounters.h"
static struct retro_rumble_interface rumble;
static void *vout_buf;
+static void * vout_buf_ptr;
static int vout_width, vout_height;
static int vout_doffs_old, vout_fb_dirty;
static bool vout_can_dupe;
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[PORTS_NUMBER];
{
vout_width = w;
vout_height = h;
+
+ struct retro_framebuffer fb = {0};
+
+ fb.width = vout_width;
+ fb.height = vout_height;
+ fb.access_flags = RETRO_MEMORY_ACCESS_WRITE;
+
+ vout_buf_ptr = vout_buf;
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER, &fb) && fb.format == RETRO_PIXEL_FORMAT_RGB565)
+ {
+ vout_buf_ptr = (uint16_t*)fb.data;
+ }
+
}
#ifndef FRONTEND_SUPPORTS_RGB565
static void vout_flip(const void *vram, int stride, int bgr24, int w, int h)
{
- unsigned short *dest = vout_buf;
+ unsigned short *dest = vout_buf_ptr;
const unsigned short *src = vram;
int dstride = vout_width, h1 = h;
int doffs;
if (vram == NULL) {
// blanking
- memset(vout_buf, 0, dstride * h * 2);
+ memset(vout_buf_ptr, 0, dstride * h * 2);
goto out;
}
doffs += (dstride - w) / 2 & ~1;
if (doffs != vout_doffs_old) {
// clear borders
- memset(vout_buf, 0, dstride * h * 2);
+ memset(vout_buf_ptr, 0, dstride * h * 2);
vout_doffs_old = doffs;
}
dest += doffs;
out:
#ifndef FRONTEND_SUPPORTS_RGB565
- convert(vout_buf, vout_width * vout_height * 2);
+ convert(vout_buf_ptr, vout_width * vout_height * 2);
#endif
vout_fb_dirty = 1;
pl_rearmed_cbs.flip_cnt++;
}
#endif
+#ifdef VITA
+typedef struct
+{
+ void* buffer;
+ uint32_t target_map;
+ size_t size;
+ enum psxMapTag tag;
+}psx_map_t;
+
+void* addr = NULL;
+
+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
+};
+
+int init_vita_mmap(){
+ int n;
+ void * tmpaddr;
+ addr = malloc(64*1024*1024);
+ if(addr==NULL)
+ return -1;
+ tmpaddr = ((u32)(addr+0xFFFFFF))&~0xFFFFFF;
+ custom_psx_maps[0].buffer=tmpaddr+0x2000000;
+ custom_psx_maps[1].buffer=tmpaddr+0x1800000;
+ custom_psx_maps[2].buffer=tmpaddr+0x1c00000;
+ custom_psx_maps[3].buffer=tmpaddr+0x0000000;
+ custom_psx_maps[4].buffer=tmpaddr+0x1000000;
+#if 0
+ for(n = 0; n < 5; n++){
+ sceClibPrintf("addr reserved %x\n",custom_psx_maps[n].buffer);
+ }
+#endif
+ return 0;
+}
+
+void deinit_vita_mmap(){
+ free(addr);
+}
+
+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))
+ {
+ 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))
+ {
+ return;
+ }
+ }
+
+ free(ptr);
+}
+#endif
+
static void *pl_mmap(unsigned int size)
{
return psxMap(0, size, 0, MAP_TAG_VRAM);
return RETRO_API_VERSION;
}
-static void update_controller_port_device(unsigned port, unsigned device)
+static int controller_port_variable(unsigned port, struct retro_variable *var)
{
if (port >= PORTS_NUMBER)
- return;
+ return 0;
- struct retro_variable var;
- int default_case = 0;
+ if (!environ_cb)
+ return 0;
- var.value = NULL;
+ var->value = NULL;
switch (port) {
case 0:
- var.key = "pcsx_rearmed_pad1type";
+ var->key = "pcsx_rearmed_pad1type";
break;
case 1:
- var.key = "pcsx_rearmed_pad2type";
+ var->key = "pcsx_rearmed_pad2type";
break;
case 2:
- var.key = "pcsx_rearmed_pad3type";
+ var->key = "pcsx_rearmed_pad3type";
break;
case 3:
- var.key = "pcsx_rearmed_pad4type";
+ var->key = "pcsx_rearmed_pad4type";
break;
case 4:
- var.key = "pcsx_rearmed_pad5type";
+ var->key = "pcsx_rearmed_pad5type";
break;
case 5:
- var.key = "pcsx_rearmed_pad6type";
+ var->key = "pcsx_rearmed_pad6type";
break;
case 6:
- var.key = "pcsx_rearmed_pad7type";
+ var->key = "pcsx_rearmed_pad7type";
break;
case 7:
- var.key = "pcsx_rearmed_pad8type";
+ var->key = "pcsx_rearmed_pad8type";
break;
}
- if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value))
+ 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;
in_type[0] = PSE_PAD_TYPE_NEGCON;
else if (strcmp(var.value, "none") == 0)
in_type[0] = PSE_PAD_TYPE_NONE;
- else // 'default' case
- default_case = 1;
+ // else 'default' case, do nothing
}
- else
- default_case = 1;
+}
- if (default_case)
- 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_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;
+ int auto_case, port;
var.value = NULL;
var.key = "pcsx_rearmed_multitap1";
auto_case = 1;
}
else
- auto_case == 1;
+ auto_case = 1;
if (auto_case)
{
// If a gamepad is plugged after port 2, we need a first multitap.
multitap1 = 0;
- for (int port = 2; port < PORTS_NUMBER; port++)
+ for (port = 2; port < PORTS_NUMBER; port++)
multitap1 |= in_type[port] != PSE_PAD_TYPE_NONE;
}
auto_case = 1;
}
else
- auto_case == 1;
+ auto_case = 1;
if (auto_case)
{
// If a gamepad is plugged after port 4, we need a second multitap.
multitap2 = 0;
- for (int port = 4; port < PORTS_NUMBER; port++)
+ for (port = 4; port < PORTS_NUMBER; port++)
multitap2 |= in_type[port] != PSE_PAD_TYPE_NONE;
}
}
{
memset(info, 0, sizeof(*info));
info->library_name = "PCSX-ReARMed";
- info->library_version = "r22";
+#ifndef GIT_VERSION
+#define GIT_VERSION ""
+#endif
+ info->library_version = "r22" GIT_VERSION;
info->valid_extensions = "bin|cue|img|mdf|pbp|toc|cbn|m3u";
info->need_fullpath = true;
}
static void update_variables(bool in_flight)
{
struct retro_variable var;
+ int i;
var.value = NULL;
var.key = "pcsx_rearmed_frameskip";
Config.PsxType = 1;
}
- for (int i = 0; i < PORTS_NUMBER; i++)
- update_controller_port_device(i, RETRO_DEVICE_NONE);
+ for (i = 0; i < PORTS_NUMBER; i++)
+ update_controller_port_variable(i);
update_multitap();
}
}
+static int min(int a, int b)
+{
+ return a < b ? a : b;
+}
+
void retro_run(void)
{
int i;
if (in_type[i] == PSE_PAD_TYPE_ANALOGPAD)
{
- in_analog_left[i][0] = (input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / 256) + 128;
- in_analog_left[i][1] = (input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / 256) + 128;
- in_analog_right[i][0] = (input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / 256) + 128;
- in_analog_right[i][1] = (input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / 256) + 128;
+ in_analog_left[i][0] = min((input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / 255) + 128, 255);
+ in_analog_left[i][1] = min((input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / 255) + 128, 255);
+ in_analog_right[i][0] = min((input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / 255) + 128, 255);
+ in_analog_right[i][1] = min((input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / 255) + 128, 255);
}
}
stop = 0;
psxCpu->Execute();
- video_cb((vout_fb_dirty || !vout_can_dupe || !duping_enable) ? vout_buf : NULL,
+ video_cb((vout_fb_dirty || !vout_can_dupe || !duping_enable) ? vout_buf_ptr : NULL,
vout_width, vout_height, vout_width * 2);
vout_fb_dirty = 0;
}
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
+ if(init_vita_mmap()<0)
+ abort();
+ psxMapHook = pl_vita_mmap;
+ 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;
#endif
+
ret |= emu_core_init();
if (ret != 0) {
SysPrintf("PCSX init failed.\n");
#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);
free(vout_buf);
#endif
vout_buf = NULL;
+
+#ifdef VITA
+ deinit_vita_mmap();
+#endif
}
#ifdef VITA