aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore/new_dynarec/emu_if.c
diff options
context:
space:
mode:
authornotaz2014-12-22 04:10:25 +0200
committernotaz2014-12-23 03:48:01 +0200
commit03f55e6b49eb81d099f33b67ee6b5fa4620a54bc (patch)
tree5ac09a554aea8b2302980a0e819db75bb8ae6348 /libpcsxcore/new_dynarec/emu_if.c
parentde5a60c397c1ec31ed2a133230011fe241b2b953 (diff)
downloadpcsx_rearmed-03f55e6b49eb81d099f33b67ee6b5fa4620a54bc.tar.gz
pcsx_rearmed-03f55e6b49eb81d099f33b67ee6b5fa4620a54bc.tar.bz2
pcsx_rearmed-03f55e6b49eb81d099f33b67ee6b5fa4620a54bc.zip
drc: implement block addr list saving
should give better experience after savestate load
Diffstat (limited to 'libpcsxcore/new_dynarec/emu_if.c')
-rw-r--r--libpcsxcore/new_dynarec/emu_if.c50
1 files changed, 48 insertions, 2 deletions
diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c
index 89e2bd6..b7a2489 100644
--- a/libpcsxcore/new_dynarec/emu_if.c
+++ b/libpcsxcore/new_dynarec/emu_if.c
@@ -122,7 +122,7 @@ void pcsx_mtc0_ds(u32 reg, u32 val)
MTC0(reg, val);
}
-void new_dyna_save(void)
+void new_dyna_before_save(void)
{
psxRegs.interrupt &= ~(1 << PSXINT_RCNT); // old savestate compat
@@ -134,7 +134,7 @@ void new_dyna_after_save(void)
psxRegs.interrupt |= 1 << PSXINT_RCNT;
}
-void new_dyna_restore(void)
+static void new_dyna_restore(void)
{
int i;
for (i = 0; i < PSXINT_COUNT; i++)
@@ -147,6 +147,50 @@ void new_dyna_restore(void)
new_dyna_pcsx_mem_load_state();
}
+void new_dyna_freeze(void *f, int mode)
+{
+ const char header_save[8] = "ariblks";
+ uint32_t addrs[1024 * 4];
+ int32_t size = 0;
+ int bytes;
+ char header[8];
+
+ if (mode != 0) { // save
+ size = new_dynarec_save_blocks(addrs, sizeof(addrs));
+ if (size == 0)
+ return;
+
+ SaveFuncs.write(f, header_save, sizeof(header_save));
+ SaveFuncs.write(f, &size, sizeof(size));
+ SaveFuncs.write(f, addrs, size);
+ }
+ else {
+ new_dyna_restore();
+
+ bytes = SaveFuncs.read(f, header, sizeof(header));
+ if (bytes != sizeof(header) || strcmp(header, header_save)) {
+ if (bytes > 0)
+ SaveFuncs.seek(f, -bytes, SEEK_CUR);
+ return;
+ }
+ SaveFuncs.read(f, &size, sizeof(size));
+ if (size <= 0)
+ return;
+ if (size > sizeof(addrs)) {
+ bytes = size - sizeof(addrs);
+ SaveFuncs.seek(f, bytes, SEEK_CUR);
+ size = sizeof(addrs);
+ }
+ bytes = SaveFuncs.read(f, addrs, size);
+ if (bytes != size)
+ return;
+
+ new_dynarec_load_blocks(addrs, size);
+ }
+
+ //printf("drc: %d block info entries %s\n", size/8, mode ? "saved" : "loaded");
+}
+
/* GTE stuff */
void *gte_handlers[64];
@@ -407,6 +451,8 @@ void new_dyna_pcsx_mem_init(void) {}
void new_dyna_pcsx_mem_reset(void) {}
void new_dyna_pcsx_mem_load_state(void) {}
void new_dyna_pcsx_mem_shutdown(void) {}
+int new_dynarec_save_blocks(void *save, int size) { return 0; }
+void new_dynarec_load_blocks(const void *save, int size) {}
#endif
#ifdef DRC_DBG