Fixed SRAM load from compressed ZST.

This commit is contained in:
n-a-c-h
2005-04-18 00:44:59 +00:00
parent c9500d784b
commit ce306fa365
2 changed files with 46 additions and 2 deletions

View File

@@ -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);

View File

@@ -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__