aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core.c57
-rw-r--r--core.h3
-rw-r--r--funkey/fk_instant_play.c1
-rw-r--r--main.c1
-rw-r--r--patches/pcsx_rearmed/1000-trimui-support.patch28
-rw-r--r--scale.c20
6 files changed, 93 insertions, 17 deletions
diff --git a/core.c b/core.c
index 6f28d28..2521b9a 100644
--- a/core.c
+++ b/core.c
@@ -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;
diff --git a/core.h b/core.h
index 8049aa7..33deac1 100644
--- a/core.h
+++ b/core.h
@@ -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);
diff --git a/main.c b/main.c
index 1408a46..3637b59 100644
--- a/main.c
+++ b/main.c
@@ -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;
diff --git a/scale.c b/scale.c
index 842e4ae..5857589 100644
--- a/scale.c
+++ b/scale.c
@@ -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