X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=snapshot.cpp;h=b968a097b914e9692f8febd26750ad42678b44e7;hb=8f46190aa1d041567c69ff34f8ad8d430f902e01;hp=6851514cb8bf1374dfff6db4de49ccde773b47bc;hpb=3ddd6d5ea2811b783bf349c8947cf1bbaaf3c8b9;p=drnoksnes diff --git a/snapshot.cpp b/snapshot.cpp index 6851514..b968a09 100644 --- a/snapshot.cpp +++ b/snapshot.cpp @@ -39,11 +39,10 @@ * Nintendo Co., Limited and its subsidiary companies. */ -#ifndef __GP32__ #include #include #include -#endif + #if defined(__unix) || defined(__linux) || defined(__sun) || defined(__DJGPP) #include #include @@ -51,13 +50,11 @@ #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 @@ -66,13 +63,7 @@ #include "srtc.h" #include "sdd1.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)(); +#define dprintf(...) /* disabled */ extern uint8 *SRAM; @@ -81,11 +72,10 @@ 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; @@ -404,30 +394,24 @@ static FreezeData SnapSA1 [] = { }; #endif -//static char ROMFilename [_MAX_PATH]; -//static char SnapshotFilename [_MAX_PATH]; +static STREAM ss_st; static void Freeze (); static int Unfreeze (); -void FreezeStruct (char *name, void *base, FreezeData *fields, +static void FreezeStruct (const char *name, void *base, FreezeData *fields, int num_fields); -void FreezeBlock (char *name, uint8 *block, int size); +static void FreezeBlock (const char *name, uint8 *block, int size); -int UnfreezeStruct (char *name, void *base, FreezeData *fields, +static int UnfreezeStruct (const char *name, void *base, FreezeData *fields, int num_fields); -int UnfreezeBlock (char *name, uint8 *block, int size); - -bool8 Snapshot (const char *filename) -{ - return (S9xFreezeGame (filename)); -} +static int UnfreezeBlock (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); @@ -436,7 +420,7 @@ bool8 S9xFreezeGame (const char *filename) bool8 S9xUnfreezeGame (const char *filename) { - if(statef_open(filename, "rb")) + if ((ss_st = OPEN_STREAM(filename, "rb"))) { int result; if ((result = Unfreeze()) != SUCCESS) @@ -457,15 +441,15 @@ bool8 S9xUnfreezeGame (const char *filename) // 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 () @@ -487,10 +471,10 @@ 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)); @@ -538,44 +522,41 @@ static void Freeze () 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 && - strcasecmp (S9xBasename (rom_filename), S9xBasename (Memory.ROMFilename)) != 0) + strcasecmp (PathBasename(rom_filename), PathBasename(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 @@ -664,25 +645,27 @@ static int Unfreeze() 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) @@ -708,7 +691,7 @@ int FreezeSize (int size, int type) } } -void FreezeStruct(char *name, void *base, FreezeData *fields, +void FreezeStruct(const char *name, void *base, FreezeData *fields, int num_fields) { // Work out the size of the required block @@ -797,15 +780,15 @@ void FreezeStruct(char *name, void *base, FreezeData *fields, free(block); } -void FreezeBlock (char *name, uint8 *block, int size) +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 (char *name, void *base, FreezeData *fields, +int UnfreezeStruct (const char *name, void *base, FreezeData *fields, int num_fields) { // Work out the size of the required block @@ -900,18 +883,18 @@ int UnfreezeStruct (char *name, void *base, FreezeData *fields, return (result); } -int UnfreezeBlock(char *name, uint8 *block, int size) +int UnfreezeBlock(const char *name, uint8 *block, int size) { 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\r\n",name); - return (WRONG_FORMAT); + dprintf("%s: %s: Invalid block header\n", __func__, name); + return WRONG_FORMAT; } if (len > size) @@ -919,21 +902,21 @@ int UnfreezeBlock(char *name, uint8 *block, int size) rem = len - size; len = size; } - - if (statef_read(block, len) != len) + + if (READ_STREAM(block, len, ss_st) != len) { - printf("UnfreezeBlock err2\r\n",name); - return (WRONG_FORMAT); + dprintf("%s: Invalid block\n", __func__); + return WRONG_FORMAT; } if (rem) { char *junk = (char*)malloc(rem); - statef_read(junk, rem); + READ_STREAM(junk, rem, ss_st); free(junk); } - - return (SUCCESS); + + return SUCCESS; }