png screenshot support
[drnoksnes] / snapshot.cpp
index f2bb795..d2ee654 100644 (file)
 #include <ctype.h>
 #include <stdlib.h>
 
-#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 "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
@@ -64,7 +57,7 @@
 #include "srtc.h"
 #include "sdd1.h"
 
-extern uint8 *SRAM;
+#define dprintf(...) /* disabled */
 
 #ifdef ZSNES_FX
 START_EXTERN_C
@@ -397,6 +390,8 @@ static STREAM ss_st;
 
 static void Freeze ();
 static int Unfreeze ();
+
+static void FreezeSnapshot (const char *name);
 static void FreezeStruct (const char *name, void *base, FreezeData *fields,
                   int num_fields);
 static void FreezeBlock (const char *name, uint8 *block, int size);
@@ -407,7 +402,7 @@ static int UnfreezeBlock (const char *name, uint8 *block, int size);
 
 bool8 S9xFreezeGame (const char *filename)
 {
-    if(ss_st = OPEN_STREAM(filename, "wb"))
+    if ((ss_st = OPEN_STREAM(filename, "wb")))
     {
                Freeze();
                CLOSE_STREAM(ss_st);
@@ -419,7 +414,7 @@ bool8 S9xFreezeGame (const char *filename)
 
 bool8 S9xUnfreezeGame (const char *filename)
 {
-    if(ss_st = OPEN_STREAM(filename, "rb"))
+    if ((ss_st = OPEN_STREAM(filename, "rb")))
     {
                int result;
                if ((result = Unfreeze()) != SUCCESS)
@@ -470,10 +465,10 @@ static void Freeze ()
        SoundData.channels [i].previous16 [1] = (int16) SoundData.channels [i].previous [1];
     }
     sprintf (buffer, "%s:%04d\n", SNAPSHOT_MAGIC, SNAPSHOT_VERSION);
-    WRITE_STREAM(ss_st, strlen (buffer), 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);
-    WRITE_STREAM(ss_st, strlen (buffer) + 1, buffer);
+    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));
@@ -521,33 +516,32 @@ 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 (READ_STREAM(ss_st, len, buffer) != (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 &&
@@ -555,10 +549,8 @@ static int Unfreeze()
     {
                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
@@ -647,25 +639,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)
@@ -678,7 +672,7 @@ static int Unfreeze()
     return (SUCCESS);
 }
 
-int FreezeSize (int size, int type)
+static int FreezeSize (int size, int type)
 {
     switch (type)
     {
@@ -707,8 +701,7 @@ void FreezeStruct(const char *name, void *base, FreezeData *fields,
                                                  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;
@@ -777,15 +770,15 @@ void FreezeStruct(const char *name, void *base, FreezeData *fields,
 
     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);
-    WRITE_STREAM(ss_st, strlen (buffer), buffer);
-    WRITE_STREAM(ss_st, size, block);
+    WRITE_STREAM(buffer, strlen(buffer), ss_st);
+    WRITE_STREAM(block, size, ss_st);
 }
 
 int UnfreezeStruct (const char *name, void *base, FreezeData *fields,
@@ -804,7 +797,7 @@ 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;
@@ -878,8 +871,8 @@ int UnfreezeStruct (const char *name, void *base, FreezeData *fields,
        }
     }
 
-//    delete block;
-       free(block);
+    delete block;
+
     return (result);
 }
 
@@ -888,13 +881,13 @@ 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 (READ_STREAM(ss_st, 11, buffer) != 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)
@@ -903,16 +896,16 @@ int UnfreezeBlock(const char *name, uint8 *block, int size)
                len = size;
     }
 
-    if (READ_STREAM(ss_st, len, block) != 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);
-               READ_STREAM(ss_st, rem, junk);
+               READ_STREAM(junk, rem, ss_st);
                free(junk);
     }