* Nintendo Co., Limited and its subsidiary companies.
*/
-#ifndef __GP32__
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
-#endif
-#if defined(__unix) || defined(__linux) || defined(__sun) || defined(__DJGPP)
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#endif
#include "snapshot.h"
-//#include "snaporig.h"
#include "memmap.h"
#include "snes9x.h"
#include "65c816.h"
#include "ppu.h"
#include "cpuexec.h"
-#include "display.h"
#include "apu.h"
#include "soundux.h"
#ifdef USE_SA1
#endif
#include "srtc.h"
#include "sdd1.h"
+#include "screenshot.h"
-
-// notaz: file i/o function pointers for states,
-// changing funcs will allow to enable/disable gzipped saves
-extern int (*statef_open)(const char *fname, const char *mode);
-extern int (*statef_read)(void *p, int l);
-extern int (*statef_write)(void *p, int l);
-extern void (*statef_close)();
-
-extern uint8 *SRAM;
+#define dprintf(...) /* disabled */
#ifdef ZSNES_FX
START_EXTERN_C
void S9xSuperFXPreSaveState ();
void S9xSuperFXPostSaveState ();
void S9xSuperFXPostLoadState ();
+//bool8 S9xUnfreezeZSNES (const char *filename);
END_EXTERN_C
#endif
-//bool8 S9xUnfreezeZSNES (const char *filename);
-
typedef struct {
int offset;
int size;
};
#endif
-//static char ROMFilename [_MAX_PATH];
-//static char SnapshotFilename [_MAX_PATH];
+static STREAM ss_st;
static void Freeze ();
static int Unfreeze ();
+
static void FreezeStruct (const char *name, void *base, FreezeData *fields,
int num_fields);
static void FreezeBlock (const char *name, uint8 *block, int size);
bool8 S9xFreezeGame (const char *filename)
{
- if(statef_open(filename, "wb"))
+ if ((ss_st = OPEN_STREAM(filename, "wb")))
{
Freeze();
- statef_close();
+ CLOSE_STREAM(ss_st);
return (TRUE);
}
return (FALSE);
bool8 S9xUnfreezeGame (const char *filename)
{
- if(statef_open(filename, "rb"))
+ if ((ss_st = OPEN_STREAM(filename, "rb")))
{
int result;
if ((result = Unfreeze()) != SUCCESS)
// should never happen
break;
}
- statef_close();
- return (FALSE);
+ CLOSE_STREAM(ss_st);
+ return FALSE;
}
- statef_close();
- return (TRUE);
+ CLOSE_STREAM(ss_st);
+ return TRUE;
}
- return (FALSE);
+ return FALSE;
}
static void Freeze ()
SoundData.channels [i].previous16 [1] = (int16) SoundData.channels [i].previous [1];
}
sprintf (buffer, "%s:%04d\n", SNAPSHOT_MAGIC, SNAPSHOT_VERSION);
- statef_write(buffer, strlen (buffer));
- sprintf (buffer, "NAM:%06d:%s%c", strlen (Memory.ROMFilename) + 1,
+ WRITE_STREAM(buffer, strlen(buffer), ss_st);
+ sprintf (buffer, "NAM:%06zu:%s%c", strlen(Memory.ROMFilename) + 1,
Memory.ROMFilename, 0);
- statef_write(buffer, strlen (buffer) + 1);
+ WRITE_STREAM(buffer, strlen(buffer) + 1, ss_st);
FreezeStruct ("CPU", &CPU, SnapCPU, COUNT (SnapCPU));
FreezeStruct ("REG", &Registers, SnapRegisters, COUNT (SnapRegisters));
FreezeStruct ("PPU", &PPU, SnapPPU, COUNT (SnapPPU));
if (Settings.SuperFX)
S9xSuperFXPostSaveState ();
#endif
+#ifdef CONF_PNG
+ /* Save a PNG screenshot for convenience. */
+ size_t png_size;
+ uint8 *png = (uint8*) S9xScreenshot(&png_size);
+ if (png) {
+ FreezeBlock("PNG", png, png_size);
+ free(png);
+ }
+#endif
}
static int Unfreeze()
{
- // notaz: overflowing the damn Symbian stack again
- char buffer [16];
- char rom_filename [512];
+ char buffer[16];
+ char rom_filename[1024];
int result;
int version;
- unsigned int len = strlen (SNAPSHOT_MAGIC) + 1 + 4 + 1;
- if (statef_read(buffer, len) != (int)len)
+ int len = strlen (SNAPSHOT_MAGIC) + 1 + 4 + 1;
+ if (READ_STREAM(buffer, len, ss_st) != len)
{
- printf("failed to read header\r\n");
- return (WRONG_FORMAT);
+ printf("%s: Failed to read header\n", __func__);
+ return WRONG_FORMAT;
}
if (strncmp (buffer, SNAPSHOT_MAGIC, strlen (SNAPSHOT_MAGIC)) != 0)
{
- printf("read header not correct\r\n");
- return (WRONG_FORMAT);
+ printf("%s: Read header not correct\n", __func__);
+ return WRONG_FORMAT;
}
if ((version = atoi (&buffer [strlen (SNAPSHOT_MAGIC) + 1])) > SNAPSHOT_VERSION)
{
- printf("Wrong version\r\n");
- return (WRONG_VERSION);
+ printf("%s: Wrong version\n", __func__);
+ return WRONG_VERSION;
}
-
- if ((result = UnfreezeBlock("NAM", (uint8 *) rom_filename, 512)) != SUCCESS)
+
+ if ((result = UnfreezeBlock("NAM", (uint8 *) rom_filename, 1024)) != SUCCESS)
{
- printf("UnfreezeBlock NAM failed\r\n");
- return (result);
+ printf("%s: UnfreezeBlock NAM failed (corrupt)\n", __func__);
+ return result;
}
if (strcasecmp (rom_filename, Memory.ROMFilename) != 0 &&
{
S9xMessage (S9X_WARNING, S9X_FREEZE_ROM_NAME,
"Current loaded ROM image doesn't match that required by freeze-game file.");
- printf("filename mismatch\r\n");
}
-
-
+
uint32 old_flags = CPU.Flags;
#ifdef USE_SA1
S9xSetSoundMute (TRUE);
}
#ifdef USE_SA1
- if ((result = UnfreezeStruct ("SA1", &SA1, SnapSA1,
+ if ((result = UnfreezeStruct ("SA1", &SA1, SnapSA1,
COUNT(SnapSA1))) == SUCCESS)
- {
- if ((result = UnfreezeStruct ("SAR", &SA1Registers,
- SnapSA1Registers, COUNT (SnapSA1Registers))) != SUCCESS)
- return (result);
+ {
+ if ((result = UnfreezeStruct ("SAR", &SA1Registers,
+ SnapSA1Registers, COUNT (SnapSA1Registers))) != SUCCESS)
+ return result;
- S9xFixSA1AfterSnapshotLoad ();
- SA1.Flags |= sa1_old_flags & (TRACE_FLAG);
- }
+ S9xFixSA1AfterSnapshotLoad ();
+ SA1.Flags |= sa1_old_flags & (TRACE_FLAG);
+ }
#endif
S9xFixSoundAfterSnapshotLoad ();
ICPU.ShiftedPB = Registers.PB << 16;
ICPU.ShiftedDB = Registers.DB << 16;
S9xSetPCBase (ICPU.ShiftedPB + Registers.PC);
-
-
- //S9xUnpackStatus (); // not needed
- //S9xFixCycles (); // also not needed?
+
+#if !CONF_BUILD_ASM_CPU
+ S9xUnpackStatus ();
+ S9xFixCycles ();
+#endif
+
S9xReschedule ();
#ifdef ZSNES_FX
if (Settings.SuperFX)
return (SUCCESS);
}
-int FreezeSize (int size, int type)
+static int FreezeSize (int size, int type)
{
switch (type)
{
fields [i].type);
}
-// uint8 *block = new uint8 [len];
- uint8 *block = (uint8*)malloc(len);
+ uint8 *block = new uint8[len];
uint8 *ptr = block;
uint16 word;
uint32 dword;
FreezeBlock (name, block, len);
- free(block);
+ delete[] block;
}
void FreezeBlock (const char *name, uint8 *block, int size)
{
char buffer [512];
sprintf (buffer, "%s:%06d:", name, size);
- statef_write(buffer, strlen (buffer));
- statef_write(block, size);
+ WRITE_STREAM(buffer, strlen(buffer), ss_st);
+ WRITE_STREAM(block, size, ss_st);
}
int UnfreezeStruct (const char *name, void *base, FreezeData *fields,
fields [i].type);
}
- uint8 *block = (uint8*)malloc(len);
+ uint8 *block = new uint8 [len];
uint8 *ptr = block;
uint16 word;
uint32 dword;
if ((result = UnfreezeBlock (name, block, len)) != SUCCESS)
{
- free(block);
+ delete[] block;
return (result);
}
}
}
-// delete block;
- free(block);
+ delete[] block;
+
return (result);
}
char buffer [20];
int len = 0;
int rem = 0;
- printf("UnfreezeBlock: %s\r\n",name);
- if (statef_read(buffer, 11) != 11 ||
+
+ if (READ_STREAM(buffer, 11, ss_st) != 11 ||
strncmp (buffer, name, 3) != 0 || buffer [3] != ':' ||
(len = atoi (&buffer [4])) == 0)
{
- printf("UnfreezeBlock err1\n");
- return (WRONG_FORMAT);
+ dprintf("%s: %s: Invalid block header\n", __func__, name);
+ return WRONG_FORMAT;
}
if (len > size)
rem = len - size;
len = size;
}
-
- if (statef_read(block, len) != len)
+
+ if (READ_STREAM(block, len, ss_st) != len)
{
- printf("UnfreezeBlock err2\n");
- return (WRONG_FORMAT);
+ dprintf("%s: Invalid block\n", __func__);
+ return WRONG_FORMAT;
}
if (rem)
{
- char *junk = (char*)malloc(rem);
- statef_read(junk, rem);
- free(junk);
+ char *junk = new char [rem];
+ READ_STREAM(junk, rem, ss_st);
+ delete[] junk;
}
-
- return (SUCCESS);
+
+ return SUCCESS;
}