diff options
-rw-r--r-- | core.c | 57 | ||||
-rw-r--r-- | core.h | 3 | ||||
-rw-r--r-- | funkey/fk_instant_play.c | 1 | ||||
-rw-r--r-- | main.c | 1 | ||||
-rw-r--r-- | patches/pcsx_rearmed/1000-trimui-support.patch | 28 | ||||
-rw-r--r-- | scale.c | 20 |
6 files changed, 93 insertions, 17 deletions
@@ -114,6 +114,61 @@ void sram_read(void) { fclose(sram_file); } +void rtc_write(void) { + char filename[MAX_PATH]; + FILE *rtc_file = NULL; + void *rtc; + + size_t rtc_size = current_core.retro_get_memory_size(RETRO_MEMORY_RTC); + if (!rtc_size) { + return; + } + + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".rtc"); + + rtc_file = fopen(filename, "w"); + if (!rtc_file) { + PA_ERROR("Error opening RTC file: %s\n", strerror(errno)); + return; + } + + rtc = current_core.retro_get_memory_data(RETRO_MEMORY_RTC); + + if (!rtc || rtc_size != fwrite(rtc, 1, rtc_size, rtc_file)) { + PA_ERROR("Error writing RTC data to file\n"); + } + + fclose(rtc_file); + + sync(); +} + +void rtc_read(void) { + char filename[MAX_PATH]; + FILE *rtc_file = NULL; + void *rtc; + + size_t rtc_size = current_core.retro_get_memory_size(RETRO_MEMORY_RTC); + if (!rtc_size) { + return; + } + + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".rtc"); + + rtc_file = fopen(filename, "r"); + if (!rtc_file) { + return; + } + + rtc = current_core.retro_get_memory_data(RETRO_MEMORY_RTC); + + if (!rtc || !fread(rtc, 1, rtc_size, rtc_file)) { + PA_ERROR("Error reading RTC data\n"); + } + + fclose(rtc_file); +} + bool state_allowed(void) { return current_core.retro_serialize_size() > 0; } @@ -675,6 +730,7 @@ int core_load_content(struct content *content) { } sram_read(); + rtc_read(); if (!strcmp(core_name, "fmsx") && current_core.retro_set_controller_port_device) { /* fMSX works best with joypad + keyboard */ @@ -769,6 +825,7 @@ void core_run_frame(void) { void core_unload_content(void) { sram_write(); + rtc_write(); cheats_free(cheats); cheats = NULL; @@ -48,6 +48,9 @@ void save_relative_path(char *buf, size_t len, const char *basename); void sram_read(void); void sram_write(void); +void rtc_read(void); +void rtc_write(void); + bool state_allowed(void); void state_file_name(char *name, size_t size, int slot); bool state_exists(int slot); diff --git a/funkey/fk_instant_play.c b/funkey/fk_instant_play.c index a0d9451..261821b 100644 --- a/funkey/fk_instant_play.c +++ b/funkey/fk_instant_play.c @@ -84,6 +84,7 @@ void FK_Suspend(void) FK_Autosave(); sram_write(); + rtc_write(); save_config(CONFIG_TYPE_AUTO); PA_INFO("Suspending with %s %s %s %s %s\n", SHELL_CMD_INSTANT_PLAY, "save", prog_name, core_path, content->path); @@ -389,6 +389,7 @@ static void perform_emu_action(void) { case EACTION_MENU: toggle_fast_forward(1); /* Force FF off */ sram_write(); + rtc_write(); in_menu = true; #if defined(MMENU) if (mmenu && content && strlen(content->path)) { diff --git a/patches/pcsx_rearmed/1000-trimui-support.patch b/patches/pcsx_rearmed/1000-trimui-support.patch index d751ac1..5e442dd 100644 --- a/patches/pcsx_rearmed/1000-trimui-support.patch +++ b/patches/pcsx_rearmed/1000-trimui-support.patch @@ -1,5 +1,5 @@ diff --git a/Makefile b/Makefile -index ff8d1bb..8eef4a7 100644 +index 9b5d245..ae7745c 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,8 @@ TARGET ?= pcsx @@ -12,10 +12,10 @@ index ff8d1bb..8eef4a7 100644 ifeq ($(platform), $(filter $(platform), vita ctr)) CFLAGS += -O3 -DNDEBUG diff --git a/Makefile.libretro b/Makefile.libretro -index 069290c..692d998 100644 +index d3a3530..7711b07 100644 --- a/Makefile.libretro +++ b/Makefile.libretro -@@ -394,6 +394,27 @@ else ifeq ($(platform), rpi4_64) +@@ -458,6 +458,27 @@ else ifeq ($(platform), rpi4_64) fpic := -fPIC CFLAGS += -march=armv8-a+crc+simd -mtune=cortex-a72 -ftree-vectorize @@ -43,7 +43,7 @@ index 069290c..692d998 100644 # Classic Platforms #################### # Platform affix = classic_<ISA>_<µARCH> # Help at https://modmyclassic.com/comp -@@ -519,6 +540,13 @@ CFLAGS += $(fpic) +@@ -590,6 +611,13 @@ CFLAGS += $(fpic) MAIN_LDFLAGS += -shared MAIN_LDLIBS += $(LIBPTHREAD) $(LIBM) $(LIBDL) $(LIBZ) @@ -58,10 +58,10 @@ index 069290c..692d998 100644 ifeq ($(shell $(CC) -E -dD $(CFLAGS) include/arm_features.h | grep __SIZEOF_LONG__ | awk '{print $$3}'),4) CFLAGS += -D_FILE_OFFSET_BITS=64 diff --git a/frontend/libretro.c b/frontend/libretro.c -index 938b8e5..dcc16ef 100644 +index 1808c5e..35ce1d1 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c -@@ -3057,7 +3057,7 @@ void retro_init(void) +@@ -3748,7 +3748,7 @@ void retro_init(void) * we have to do this because cache misses and some IO penalties * are not emulated. Warning: changing this may break compatibility. */ Config.cycle_multiplier = CYCLE_MULT_DEFAULT; @@ -71,19 +71,19 @@ index 938b8e5..dcc16ef 100644 #endif pl_rearmed_cbs.gpu_peops.iUseDither = 1; diff --git a/frontend/libretro_core_options.h b/frontend/libretro_core_options.h -index 4165237..c34008a 100644 +index 7c33b08..c522995 100644 --- a/frontend/libretro_core_options.h +++ b/frontend/libretro_core_options.h -@@ -203,7 +203,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { - "PSX CPU Clock Speed", +@@ -222,7 +222,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { + "PSX CPU Clock Speed (%)", NULL, - "Overclock or under-clock the PSX CPU. Try adjusting this if the game is too slow, too fast or hangs." + "Overclock or under-clock the PSX CPU. The value has to be lower than 100 because of some slowdowns (cache misses, hw access penalties, etc.) that are not emulated. Try adjusting this if the game is too slow, too fast or hangs." -#if defined(HAVE_PRE_ARMV7) && !defined(_3DS) +#if defined(HAVE_PRE_ARMV7) && !defined(_3DS) && !defined(_TRIMUI) " Default is 50." #else " Default is 57." -@@ -285,7 +285,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { +@@ -304,7 +304,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { { "100", NULL }, { NULL, NULL }, }, @@ -92,7 +92,7 @@ index 4165237..c34008a 100644 "50", #else "57", -@@ -303,7 +303,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { +@@ -322,7 +322,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { { "enabled", NULL }, { NULL, NULL }, }, @@ -102,10 +102,10 @@ index 4165237..c34008a 100644 #else "enabled", diff --git a/frontend/main.c b/frontend/main.c -index cf015a4..beaee12 100644 +index 65114e3..2ad3c69 100644 --- a/frontend/main.c +++ b/frontend/main.c -@@ -165,7 +165,7 @@ void emu_set_default_config(void) +@@ -164,7 +164,7 @@ void emu_set_default_config(void) spu_config.iTempo = 0; // may cause issues, no effect if only 1 core is detected spu_config.iUseThread = 0; @@ -186,7 +186,19 @@ static void scale_blend(unsigned w, unsigned h, size_t pitch, const void *src, v if (!lines) pnext -= (pitch / sizeof(uint16_t)); - if (dy > rat_dst_h - bh[0]) { + if (dy <= bh[0] && dy + rat_h > (rat_dst_h + rat_dst_h - bh[0])) { + /* Will miss next line, blend in instead */ + const uint32_t *src32 = (const uint32_t *)src; + const uint32_t *pnext32 = (const uint32_t *)pnext; + uint32_t *pblend32 = (uint32_t *)pblend; + int count = w / 2; + + while(count--) { + *pblend32++ = AVERAGE32(*src32, *pnext32); + src32++; + pnext32++; + } + } else if (dy > rat_dst_h - bh[0]) { pblend = pnext; } else if (dy <= bh[0]) { /* Drops const, won't get touched later though */ @@ -227,15 +239,17 @@ static void scale_blend(unsigned w, unsigned h, size_t pitch, const void *src, v while (dx < rat_dst_w) { if (a == b) { out = a; + } else if (dx <= bw[0] && dx + rat_w > (rat_dst_w + rat_dst_w - bw[0])) { + out = AVERAGE16_NOCHK(a, b); // will miss next pixel, blend in instead } else if (dx > rat_dst_w - bw[0]) { // top quintile, bbbb out = b; } else if (dx <= bw[0]) { // last quintile, aaaa out = a; } else { if (dx > rat_dst_w - bw[1]) { // 2nd quintile, abbb - a = AVERAGE16_NOCHK(a,b); + a = AVERAGE16_NOCHK(a, b); } else if (dx <= bw[1]) { // 4th quintile, aaab - b = AVERAGE16_NOCHK(a,b); + b = AVERAGE16_NOCHK(a, b); } out = AVERAGE16_NOCHK(a, b); // also 3rd quintile, aabb |