From ce306fa365924a4475ee3065fd71b0fa0b594051 Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Mon, 18 Apr 2005 00:44:59 +0000 Subject: [PATCH] Fixed SRAM load from compressed ZST. --- zsnes/src/zmovie.c | 5 +++-- zsnes/src/zstate.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/zsnes/src/zmovie.c b/zsnes/src/zmovie.c index 4d36f975..ba33cbeb 100644 --- a/zsnes/src/zmovie.c +++ b/zsnes/src/zmovie.c @@ -58,6 +58,7 @@ extern bool romispal; void GUIDoReset(); void powercycle(bool); void zst_sram_load(FILE *); +void zst_sram_load_compressed(FILE *); void zst_save(FILE *, bool, bool); bool zst_load(FILE *, size_t); bool zst_compressed_loader(FILE *); @@ -931,13 +932,13 @@ static bool zmv_open(char *filename) break; case zmv_sm_power: powercycle(false); - zst_sram_load(zmv_vars.fp); + zst_sram_load_compressed(zmv_vars.fp); break; case zmv_sm_reset: GUIReset = 1; asm_call(GUIDoReset); ReturnFromSPCStall = 0; - zst_sram_load(zmv_vars.fp); + zst_sram_load_compressed(zmv_vars.fp); break; case zmv_sm_clear_all: powercycle(false); diff --git a/zsnes/src/zstate.c b/zsnes/src/zstate.c index 2db60f0b..688c208c 100755 --- a/zsnes/src/zstate.c +++ b/zsnes/src/zstate.c @@ -719,6 +719,49 @@ void zst_sram_load(FILE *fp) if (ramsize) { fread(sram, 1, ramsize, fp); } // normal sram } +void zst_sram_load_compressed(FILE *fp) +{ + size_t compressed_size = fread3(fp); + if (compressed_size & 0x00800000) + { + zst_sram_load(fp); + } + else + { + unsigned long data_size = cur_zst_size - (sizeof(zst_header_cur)-1); + unsigned char *buffer = 0; + + if ((buffer = (unsigned char *)malloc(data_size))) + { + unsigned char *compressed_buffer = 0; + if ((compressed_buffer = (unsigned char *)malloc(compressed_size))) + { + fread(compressed_buffer, 1, compressed_size, fp); + if (uncompress(buffer, &data_size, compressed_buffer, compressed_size) == Z_OK) + { + unsigned char *data = buffer + PH65816regsize + 199635; + if (spcon) { data += PHspcsave + PHdspsave + sizeof(DSPMem); } + if (C4Enable) { data += 8192; } + if (SFXEnable) { data += PHnum2writesfxreg + 131072; } + if (SA1Enable) + { + data += PHnum2writesa1reg; + memcpyrinc(&data, SA1RAMArea, 131072); // SA-1 sram + data += 15; + } + if (DSP1Type) { data += 2874; } + if (SETAEnable) { memcpyrinc(&data, setaramdata, 4096); } // SETA sram + if (SPC7110Enable) { data += PHnum2writespc7110reg + 65536; } + data += 227; + if (ramsize) { memcpyrinc(&data, sram, ramsize); } // normal sram + } + free(compressed_buffer); + } + free(buffer); + } + } +} + void stateloader (unsigned char *statename, unsigned char keycheck, unsigned char xfercheck) { #ifdef __LINUX__