X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=platform%2Flibretro%2Flibretro.c;h=73733fdb21746ff6cc3f36307b9875abe16dadc8;hb=20563b60d0b9526c133289ca9c7b1ba255991916;hp=b9b1414cd862d804eeaf1aa3a6f7a57512383c90;hpb=e8454cb09b4e787ee847ba64936f79b3f08a4ea3;p=picodrive.git diff --git a/platform/libretro/libretro.c b/platform/libretro/libretro.c index b9b1414..73733fd 100644 --- a/platform/libretro/libretro.c +++ b/platform/libretro/libretro.c @@ -1,6 +1,7 @@ /* * libretro core glue for PicoDrive * (C) notaz, 2013 + * (C) aliaspider, 2016 * (C) Daniel De Matteis, 2013 * * This work is licensed under the terms of MAME license. @@ -52,6 +53,7 @@ int _newlib_vm_size_user = 1 << TARGET_SIZE_2; #include #include +#include #include "../common/input_pico.h" #include "../common/version.h" #include "libretro.h" @@ -70,6 +72,8 @@ static const float VOUT_PAR = 0.0; static const float VOUT_4_3 = (224.0f * (4.0f / 3.0f)); static const float VOUT_CRT = (224.0f * 1.29911f); +bool show_overscan = false; + static void *vout_buf; static int vout_width, vout_height, vout_offset; static float user_vout_width = 0.0; @@ -471,6 +475,8 @@ void emu_video_mode_change(int start_line, int line_count, int is_32cols) memset(vout_buf, 0, 320 * 240 * 2); vout_width = is_32cols ? 256 : 320; PicoDrawSetOutBuf(vout_buf, vout_width * 2); + if (show_overscan == true) line_count += 16; + if (show_overscan == true) start_line -= 8; vout_height = line_count; vout_offset = vout_width * start_line; @@ -508,6 +514,7 @@ void retro_set_environment(retro_environment_t cb) { "picodrive_region", "Region; Auto|Japan NTSC|Japan PAL|US|Europe" }, { "picodrive_region_fps", "Region FPS; Auto|NTSC|PAL" }, { "picodrive_aspect", "Core-provided aspect ratio; PAR|4/3|CRT" }, + { "picodrive_overscan", "Show Overscan; disabled|enabled" }, #ifdef DRC_SH2 { "picodrive_drc", "Dynamic recompilers; enabled|disabled" }, #endif @@ -538,7 +545,10 @@ void retro_get_system_info(struct retro_system_info *info) { memset(info, 0, sizeof(*info)); info->library_name = "PicoDrive"; - info->library_version = VERSION; +#ifndef GIT_VERSION +#define GIT_VERSION "" +#endif + info->library_version = VERSION GIT_VERSION; info->valid_extensions = "bin|gen|smd|md|32x|cue|iso|sms"; info->need_fullpath = true; } @@ -552,11 +562,11 @@ void retro_get_system_av_info(struct retro_system_av_info *info) info->geometry.base_height = vout_height; info->geometry.max_width = vout_width; info->geometry.max_height = vout_height; - + float common_width = vout_width; if (user_vout_width != 0) common_width = user_vout_width; - + info->geometry.aspect_ratio = common_width / vout_height; } @@ -683,12 +693,67 @@ bool retro_unserialize(const void *data, size_t size) } /* cheats - TODO */ + void retro_cheat_reset(void) { + int i=0; + unsigned int addr; + + for (i = 0; i < PicoPatchCount; i++) + { + addr = PicoPatches[i].addr; + if (addr < Pico.romsize) + if (PicoPatches[i].active) + *(unsigned short *)(Pico.rom + addr) = PicoPatches[i].data_old; + else + if (PicoPatches[i].active) + m68k_write16(PicoPatches[i].addr,PicoPatches[i].data_old); + } + + PicoPatchUnload(); } -void retro_cheat_set(unsigned index, bool enabled, const char *code) +void retro_cheat_set(unsigned index, bool enabled, const char *buff) { + struct patch + { + unsigned int addr; + unsigned short data; + } pt; + int array_len = 0; + + //TODO: Split multi-line codes properly + + decode(buff, &pt); + if (pt.addr == (unsigned int)-1 || pt.data == (unsigned short)-1){ + log_cb(RETRO_LOG_ERROR,"CHEATS: Invalid code: %s\n",buff); + return; + } + + /* code was good, add it */ + if (array_len < PicoPatchCount + 1) + { + void *ptr; + array_len *= 2; + array_len++; + ptr = realloc(PicoPatches, array_len * sizeof(PicoPatches[0])); + if (ptr == NULL) { + log_cb(RETRO_LOG_ERROR,"CHEATS: Failed to allocate memory for: %s\n",buff); + return; + } + PicoPatches = ptr; + } + strcpy(PicoPatches[PicoPatchCount].code, buff); + + PicoPatches[PicoPatchCount].name[51] = ""; + PicoPatches[PicoPatchCount].active = enabled; + PicoPatches[PicoPatchCount].addr = pt.addr; + PicoPatches[PicoPatchCount].data = pt.data; + if (PicoPatches[PicoPatchCount].addr < Pico.romsize) + PicoPatches[PicoPatchCount].data_old = *(unsigned short *)(Pico.rom + PicoPatches[PicoPatchCount].addr); + else + PicoPatches[PicoPatchCount].data_old = (unsigned short) m68k_read16(PicoPatches[PicoPatchCount].addr); + PicoPatchCount++; } /* multidisk support */ @@ -1053,7 +1118,7 @@ void *retro_get_memory_data(unsigned type) data = NULL; break; } - + return data; } @@ -1061,7 +1126,7 @@ size_t retro_get_memory_size(unsigned type) { unsigned int i; int sum; - + switch(type) { case RETRO_MEMORY_SAVE_RAM: @@ -1078,17 +1143,17 @@ size_t retro_get_memory_size(unsigned type) sum |= SRam.data[i]; return (sum != 0) ? SRam.size : 0; - + case RETRO_MEMORY_SYSTEM_RAM: if (PicoAHW & PAHW_SMS) return sizeof(Pico.vramb); else return sizeof(Pico.ram); - + default: return 0; } - + } void retro_reset(void) @@ -1188,7 +1253,7 @@ static void update_variables(void) else if (strcmp(var.value, "NTSC") == 0) PicoRegionFPSOverride = 1; else if (strcmp(var.value, "PAL") == 0) - PicoRegionFPSOverride = 2; + PicoRegionFPSOverride = 2; } // Update region, fps and sound flags if needed @@ -1209,7 +1274,16 @@ static void update_variables(void) else if (strcmp(var.value, "CRT") == 0) user_vout_width = VOUT_CRT; else - user_vout_width = VOUT_PAR; + user_vout_width = VOUT_PAR; + } + + var.value = NULL; + var.key = "picodrive_overscan"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { + if (strcmp(var.value, "enabled") == 0) + show_overscan = true; + else + show_overscan = false; } if (user_vout_width != old_user_vout_width) @@ -1252,6 +1326,7 @@ void retro_run(void) if (input_state_cb(pad, RETRO_DEVICE_JOYPAD, 0, i)) PicoPad[pad] |= retro_pico_map[i]; + PicoPatchApply(); PicoFrame(); video_cb((short *)vout_buf + vout_offset,