png screenshot support
[drnoksnes] / snapshot.cpp
index 14229bd..d2ee654 100644 (file)
  * 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
 #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)();
-
-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;
@@ -404,11 +386,12 @@ static FreezeData SnapSA1 [] = {
 };
 #endif
 
-//static char ROMFilename [_MAX_PATH];
-//static char SnapshotFilename [_MAX_PATH];
+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);
@@ -419,10 +402,10 @@ 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);
@@ -431,7 +414,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)
@@ -452,15 +435,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 ()
@@ -482,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);
-    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));
@@ -533,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 (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 &&
@@ -567,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
@@ -659,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)
@@ -690,7 +672,7 @@ static int Unfreeze()
     return (SUCCESS);
 }
 
-int FreezeSize (int size, int type)
+static int FreezeSize (int size, int type)
 {
     switch (type)
     {
@@ -719,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;
@@ -789,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);
-    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,
@@ -816,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;
@@ -890,8 +871,8 @@ int UnfreezeStruct (const char *name, void *base, FreezeData *fields,
        }
     }
 
-//    delete block;
-       free(block);
+    delete block;
+
     return (result);
 }
 
@@ -900,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 (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)
@@ -914,21 +895,21 @@ int UnfreezeBlock(const 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\n");
-               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;
 }