New save state format

This commit is contained in:
Flyinghead 2018-10-29 15:11:34 +01:00
parent 3c375b84bb
commit 8a56710841
4 changed files with 107 additions and 40 deletions

View File

@ -526,7 +526,8 @@ void rend_end_render()
#if !defined(TARGET_NO_THREADS)
re.Wait();
#else
renderer->Present();
if (renderer != NULL)
renderer->Present();
#endif
}
}

View File

@ -47,6 +47,8 @@ int sh4_sched_elapsed(int id);
*/
void sh4_sched_tick(int cycles);
void sh4_sched_ffts();
extern u32 sh4_sched_intr;
struct sched_list

View File

@ -16,8 +16,9 @@
#include "webui/server.h"
#include "hw/naomi/naomi_cart.h"
#include "reios/reios.h"
#include "hw/sh4/dyna/blockmanager.h"
#include "hw/sh4/sh4_sched.h"
#include "hw/pvr/Renderer_if.h"
#include "hw/pvr/spg.h"
settings_t settings;
static bool performed_serialization = false;
@ -759,7 +760,10 @@ void* dc_loadstate_thread(void* p)
data_ptr = data ;
bm_Reset() ;
sh4_cpu.ResetCache();
#if FEAT_AREC == DYNAREC_JIT
FlushCache();
#endif
if ( ! dc_unserialize(&data_ptr, &total_size) )
{
@ -768,7 +772,10 @@ void* dc_loadstate_thread(void* p)
return NULL;
}
cleanup_serialize(data) ;
sh4_sched_ffts();
CalculateSync();
cleanup_serialize(data) ;
printf("Loaded state from %s size %d\n", filename.c_str(), total_size) ;
rend_cancel_emu_wait();

View File

@ -30,7 +30,9 @@
extern "C" void DYNACALL TAWriteSQ(u32 address,u8* sqb);
enum serialize_version_enum {
V1
V1,
V2,
V3
} ;
//./core/hw/arm7/arm_mem.cpp
@ -215,13 +217,14 @@ extern bool EEPROM_loaded;
//./core/hw/maple/maple_if.o
//one time set
//extern int maple_sched;
extern int maple_schid;
//incremented but never read
//extern u32 dmacount;
extern bool maple_ddt_pending_reset;
//./core/hw/modem/modem.cpp
extern int modem_sched;
@ -436,7 +439,7 @@ extern u32 old_dn;
extern u64 sh4_sched_ffb;
extern u32 sh4_sched_intr;
extern vector<sched_list> list;
extern int sh4_sched_next_id;
//extern int sh4_sched_next_id;
@ -799,7 +802,7 @@ bool dc_serialize(void **data, unsigned int *total_size)
{
int i = 0;
int j = 0;
serialize_version_enum version = V1 ;
serialize_version_enum version = V3 ;
*total_size = 0 ;
@ -837,7 +840,6 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_S(VREG);
REICAST_S(ARMRST);
REICAST_S(rtc_EN);
REICAST_S(dma_sched_id);
REICAST_SA(aica_reg,0x8000);
@ -883,8 +885,6 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_SA(reply_11,16) ;
REICAST_S(gdrom_schid);
REICAST_S(sns_asc);
REICAST_S(sns_ascq);
REICAST_S(sns_key);
@ -909,7 +909,6 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_S(SecNumber);
REICAST_S(GDStatus);
REICAST_S(ByteCount);
REICAST_S(i); // GDROM_TICKS
REICAST_SA(EEPROM,0x100);
@ -941,9 +940,6 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_S(vblk_cnt);
REICAST_S(Line_Cycles);
REICAST_S(Frame_Cycles);
REICAST_S(render_end_schid);
REICAST_S(vblank_schid);
REICAST_S(time_sync);
REICAST_S(speed_load_mspdf);
REICAST_S(mips_counter);
REICAST_S(full_rps);
@ -1020,20 +1016,52 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_S(sh4_sched_ffb);
REICAST_S(sh4_sched_intr);
REICAST_S(sh4_sched_next_id);
//this list is populated during initialization so the size will always be the same
//extern vector<sched_list> list;
for ( i = 0 ; i < list.size() ; i++ )
REICAST_S(list[aica_schid].tag) ;
REICAST_S(list[aica_schid].start) ;
REICAST_S(list[aica_schid].end) ;
REICAST_S(list[rtc_schid].tag) ;
REICAST_S(list[rtc_schid].start) ;
REICAST_S(list[rtc_schid].end) ;
REICAST_S(list[gdrom_schid].tag) ;
REICAST_S(list[gdrom_schid].start) ;
REICAST_S(list[gdrom_schid].end) ;
REICAST_S(list[maple_schid].tag) ;
REICAST_S(list[maple_schid].start) ;
REICAST_S(list[maple_schid].end) ;
REICAST_S(list[dma_sched_id].tag) ;
REICAST_S(list[dma_sched_id].start) ;
REICAST_S(list[dma_sched_id].end) ;
for (int i = 0; i < 3; i++)
{
REICAST_S(list[i].tag) ;
REICAST_S(list[i].start) ;
REICAST_S(list[i].end) ;
REICAST_S(list[tmu_sched[i]].tag) ;
REICAST_S(list[tmu_sched[i]].start) ;
REICAST_S(list[tmu_sched[i]].end) ;
}
REICAST_S(list[render_end_schid].tag) ;
REICAST_S(list[render_end_schid].start) ;
REICAST_S(list[render_end_schid].end) ;
REICAST_S(list[vblank_schid].tag) ;
REICAST_S(list[vblank_schid].start) ;
REICAST_S(list[vblank_schid].end) ;
REICAST_S(list[time_sync].tag) ;
REICAST_S(list[time_sync].start) ;
REICAST_S(list[time_sync].end) ;
REICAST_S(list[modem_sched].tag) ;
REICAST_S(list[modem_sched].start) ;
REICAST_S(list[modem_sched].end) ;
REICAST_S(aica_schid);
REICAST_S(rtc_schid);
REICAST_S(SCIF_SCFSR2);
@ -1050,7 +1078,6 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_SA(tmu_mask,3);
REICAST_SA(tmu_mask64,3);
REICAST_SA(old_mode,3);
REICAST_SA(tmu_sched,3);
REICAST_SA(tmu_ch_base,3);
REICAST_SA(tmu_ch_base64,3);
@ -1166,6 +1193,11 @@ bool dc_unserialize(void **data, unsigned int *total_size)
*total_size = 0 ;
REICAST_US(version) ;
if (version != V3)
{
fprintf(stderr, "Save State version not supported: %d\n", version);
return false;
}
REICAST_US(aica_interr) ;
REICAST_US(aica_reg_L) ;
REICAST_US(e68k_out) ;
@ -1195,7 +1227,6 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_US(VREG);
REICAST_US(ARMRST);
REICAST_US(rtc_EN);
REICAST_US(dma_sched_id);
REICAST_USA(aica_reg,0x8000);
@ -1243,7 +1274,6 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_US(gdrom_schid);
REICAST_US(sns_asc);
REICAST_US(sns_ascq);
REICAST_US(sns_key);
@ -1268,7 +1298,6 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_US(SecNumber);
REICAST_US(GDStatus);
REICAST_US(ByteCount);
REICAST_US(i); // GDROM_TICKS
REICAST_USA(EEPROM,0x100);
@ -1301,9 +1330,6 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_US(vblk_cnt);
REICAST_US(Line_Cycles);
REICAST_US(Frame_Cycles);
REICAST_US(render_end_schid);
REICAST_US(vblank_schid);
REICAST_US(time_sync);
REICAST_US(speed_load_mspdf);
REICAST_US(mips_counter);
REICAST_US(full_rps);
@ -1381,20 +1407,52 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_US(sh4_sched_ffb);
REICAST_US(sh4_sched_intr);
REICAST_US(sh4_sched_next_id);
//this list is populated during initialization so the size will always be the same
//extern vector<sched_list> list;
for ( i = 0 ; i < list.size() ; i++ )
REICAST_US(list[aica_schid].tag) ;
REICAST_US(list[aica_schid].start) ;
REICAST_US(list[aica_schid].end) ;
REICAST_US(list[rtc_schid].tag) ;
REICAST_US(list[rtc_schid].start) ;
REICAST_US(list[rtc_schid].end) ;
REICAST_US(list[gdrom_schid].tag) ;
REICAST_US(list[gdrom_schid].start) ;
REICAST_US(list[gdrom_schid].end) ;
REICAST_US(list[maple_schid].tag) ;
REICAST_US(list[maple_schid].start) ;
REICAST_US(list[maple_schid].end) ;
REICAST_US(list[dma_sched_id].tag) ;
REICAST_US(list[dma_sched_id].start) ;
REICAST_US(list[dma_sched_id].end) ;
for (int i = 0; i < 3; i++)
{
REICAST_US(list[i].tag) ;
REICAST_US(list[i].start) ;
REICAST_US(list[i].end) ;
REICAST_US(list[tmu_sched[i]].tag) ;
REICAST_US(list[tmu_sched[i]].start) ;
REICAST_US(list[tmu_sched[i]].end) ;
}
REICAST_US(list[render_end_schid].tag) ;
REICAST_US(list[render_end_schid].start) ;
REICAST_US(list[render_end_schid].end) ;
REICAST_US(list[vblank_schid].tag) ;
REICAST_US(list[vblank_schid].start) ;
REICAST_US(list[vblank_schid].end) ;
REICAST_US(list[time_sync].tag) ;
REICAST_US(list[time_sync].start) ;
REICAST_US(list[time_sync].end) ;
REICAST_US(list[modem_sched].tag) ;
REICAST_US(list[modem_sched].start) ;
REICAST_US(list[modem_sched].end) ;
REICAST_US(aica_schid);
REICAST_US(rtc_schid);
REICAST_US(SCIF_SCFSR2);
@ -1411,7 +1469,6 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_USA(tmu_mask,3);
REICAST_USA(tmu_mask64,3);
REICAST_USA(old_mode,3);
REICAST_USA(tmu_sched,3);
REICAST_USA(tmu_ch_base,3);
REICAST_USA(tmu_ch_base64,3);