aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libretro.c3
-rw-r--r--source/snaporig.c470
-rw-r--r--source/snaporig.h399
-rw-r--r--source/snapshot.c1792
-rw-r--r--source/snapshot.h114
5 files changed, 0 insertions, 2778 deletions
diff --git a/libretro.c b/libretro.c
index 68f0ff8..ddd8f46 100644
--- a/libretro.c
+++ b/libretro.c
@@ -645,15 +645,12 @@ bool retro_unserialize(const void* data, size_t size)
memcpy(&rtc_f9, buffer, sizeof(rtc_f9));
buffer += sizeof(rtc_f9);
- // S9xFixCycles();
-
S9xFixSA1AfterSnapshotLoad();
FixROMSpeed();
IPPU.ColorsChanged = TRUE;
IPPU.OBJChanged = TRUE;
CPU.InDMA = FALSE;
S9xFixColourBrightness();
- // IPPU.RenderThisFrame = FALSE;
S9xAPUUnpackStatus();
S9xSA1UnpackStatus();
diff --git a/source/snaporig.c b/source/snaporig.c
deleted file mode 100644
index 1e2e19b..0000000
--- a/source/snaporig.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/*******************************************************************************
- Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
-
- (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
- Jerremy Koot (jkoot@snes9x.com)
-
- (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net)
-
- (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net),
- funkyass (funkyass@spam.shaw.ca),
- Joel Yliluoma (http://iki.fi/bisqwit/)
- Kris Bleakley (codeviolation@hotmail.com),
- Matthew Kendora,
- Nach (n-a-c-h@users.sourceforge.net),
- Peter Bortas (peter@bortas.org) and
- zones (kasumitokoduck@yahoo.com)
-
- C4 x86 assembler and some C emulation code
- (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com),
- _Demo_ (_demo_@zsnes.com), and Nach
-
- C4 C++ code
- (c) Copyright 2003 Brad Jorsch
-
- DSP-1 emulator code
- (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson,
- John Weidman, neviksti (neviksti@hotmail.com),
- Kris Bleakley, Andreas Naive
-
- DSP-2 emulator code
- (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and
- Lord Nightmare (lord_nightmare@users.sourceforge.net
-
- OBC1 emulator code
- (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and
- Kris Bleakley
- Ported from x86 assembler to C by sanmaiwashi
-
- SPC7110 and RTC C++ emulator code
- (c) Copyright 2002 Matthew Kendora with research by
- zsKnight, John Weidman, and Dark Force
-
- S-DD1 C emulator code
- (c) Copyright 2003 Brad Jorsch with research by
- Andreas Naive and John Weidman
-
- S-RTC C emulator code
- (c) Copyright 2001 John Weidman
-
- ST010 C++ emulator code
- (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora
-
- Super FX x86 assembler emulator code
- (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault
-
- Super FX C emulator code
- (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman
-
-
- SH assembler code partly based on x86 assembler code
- (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
-
-
- Specific ports contains the works of other authors. See headers in
- individual files.
-
- Snes9x homepage: http://www.snes9x.com
-
- Permission to use, copy, modify and distribute Snes9x in both binary and
- source form, for non-commercial purposes, is hereby granted without fee,
- providing that this license information and copyright notice appear with
- all copies and any derived work.
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event shall the authors be held liable for any damages
- arising from the use of this software.
-
- Snes9x is freeware for PERSONAL USE only. Commercial users should
- seek permission of the copyright holders first. Commercial use includes
- charging money for Snes9x or software derived from Snes9x.
-
- The copyright holders request that bug fixes and improvements to the code
- should be forwarded to them so everyone can benefit from the modifications
- in future versions.
-
- Super NES and Super Nintendo Entertainment System are trademarks of
- Nintendo Co., Limited and its subsidiary companies.
-*******************************************************************************/
-#include <string.h>
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#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 "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"
-
-struct SOrigPPU OrigPPU;
-struct SOrigDMA OrigDMA [8];
-struct SOrigRegisters OrigRegisters;
-struct SOrigCPUState OrigCPU;
-struct SOrigAPU OrigAPU;
-SOrigSoundData OrigSoundData;
-struct SOrigAPURegisters OrigAPURegisters;
-char ROMFilename [1025];
-
-static int ReadOrigSnapshot(STREAM);
-
-bool8 S9xLoadOrigSnapshot(const char* filename)
-{
- FILE* fp;
-
- fp = fopen(filename, "r");
- if (NULL == fp)
- return (FALSE);
-
- int result;
- if ((result = ReadOrigSnapshot(fp)) != SUCCESS)
- {
- fclose(fp);
- return (FALSE);
- }
-
- fclose(fp);
- return (TRUE);
-}
-
-static int ReadBlock(const char* key, void* block, int max_len, STREAM snap)
-{
- char buffer [20];
- int len = 0;
- int rem = 0;
-
- if (READ_STREAM(buffer, 11, snap) != 11 ||
- strncmp(buffer, key, 4) != 0 ||
- (len = atoi(&buffer [4])) == 0)
- return (WRONG_FORMAT);
-
- if (len > max_len)
- {
- rem = len - max_len;
- len = max_len;
- }
- if (READ_STREAM(block, len, snap) != len)
- return (WRONG_FORMAT);
-
- if (rem)
- {
- char* junk = (char*)malloc(rem);
- READ_STREAM(junk, rem, snap);
- free(junk);
- }
-
- return (SUCCESS);
-}
-
-static int ReadOrigSnapshot(STREAM snap)
-{
- char buffer [_MAX_PATH];
- char rom_filename [_MAX_PATH];
- int result;
- int i;
- int j;
-
- int version;
- int len = strlen(ORIG_SNAPSHOT_MAGIC) + 1 + 4 + 1;
- if (READ_STREAM(buffer, len, snap) != len)
- return (WRONG_FORMAT);
- if (strncmp(buffer, ORIG_SNAPSHOT_MAGIC, strlen(ORIG_SNAPSHOT_MAGIC)) != 0)
- return (WRONG_FORMAT);
- if ((version = atoi(&buffer [strlen(SNAPSHOT_MAGIC) + 1])) >
- ORIG_SNAPSHOT_VERSION)
- return (WRONG_VERSION);
-
- if ((result = ReadBlock("NAM:", rom_filename, _MAX_PATH, snap)) != SUCCESS)
- return (result);
-
- if ((result = ReadBlock("HiR:", buffer, 0x41, snap)) != SUCCESS)
- return (result);
-
- if (strcasecmp(rom_filename, Memory.ROMFilename) != 0 &&
- strcasecmp(S9xBasename(rom_filename), S9xBasename(Memory.ROMFilename)) != 0)
- {
- S9xMessage(S9X_WARNING, S9X_FREEZE_ROM_NAME,
- "Current loaded ROM image doesn't match that required by freeze-game file.");
- }
-
- S9xReset();
- if ((result = ReadBlock("CPU:", &OrigCPU, sizeof(OrigCPU), snap)) != SUCCESS)
- return (result);
- OrigCPU.FastROMSpeed = OrigCPU.FastROMSpeed_old;
- FixROMSpeed();
- if (version == 3)
- {
- OrigCPU.Cycles = OrigCPU.Cycles_old;
- OrigCPU.NextEvent = OrigCPU.NextEvent_old;
- OrigCPU.V_Counter = OrigCPU.V_Counter_old;
- OrigCPU.MemSpeed = OrigCPU.MemSpeed_old;
- OrigCPU.MemSpeedx2 = OrigCPU.MemSpeedx2_old;
- OrigCPU.FastROMSpeed = OrigCPU.FastROMSpeed_old;
- }
- CPU.Flags = OrigCPU.Flags;
- CPU.BranchSkip = OrigCPU.BranchSkip;
- CPU.NMIActive = OrigCPU.NMIActive;
- CPU.IRQActive = OrigCPU.IRQActive;
- CPU.WaitingForInterrupt = OrigCPU.WaitingForInterrupt;
- CPU.WhichEvent = OrigCPU.WhichEvent;
- CPU.Cycles = OrigCPU.Cycles;
- CPU.NextEvent = OrigCPU.NextEvent;
- CPU.V_Counter = OrigCPU.V_Counter;
- CPU.MemSpeed = OrigCPU.MemSpeed;
- CPU.MemSpeedx2 = OrigCPU.MemSpeedx2;
- CPU.FastROMSpeed = OrigCPU.FastROMSpeed;
-
- if ((result = ReadBlock("REG:", &OrigRegisters, sizeof(OrigRegisters),
- snap)) != SUCCESS)
- return (result);
-
- ICPU.Registers = *(SRegisters*) &OrigRegisters;
-
- if ((result = ReadBlock("PPU:", &OrigPPU, sizeof(OrigPPU), snap)) != SUCCESS)
- return (result);
-
- if (version == 2)
- {
- OrigPPU.OBJNameSelect = OrigPPU.OBJNameSelect_old << 13;
- OrigPPU.OBJNameBase <<= 1;
- OrigPPU.OBJNameSelect <<= 13;
- }
- PPU.BGMode = OrigPPU.BGMode;
- PPU.BG3Priority = OrigPPU.BG3Priority;
- PPU.Brightness = OrigPPU.Brightness;
-
- PPU.VMA.High = OrigPPU.VMA.High;
- PPU.VMA.Increment = OrigPPU.VMA.Increment;
- PPU.VMA.Address = OrigPPU.VMA.Address;
- PPU.VMA.Mask1 = OrigPPU.VMA.Mask1;
- PPU.VMA.FullGraphicCount = OrigPPU.VMA.FullGraphicCount;
- PPU.VMA.Shift = OrigPPU.VMA.Shift;
-
- for (i = 0; i < 4; i++)
- {
- PPU.BG[i].SCBase = OrigPPU.BG[i].SCBase;
- PPU.BG[i].VOffset = OrigPPU.BG[i].VOffset;
- PPU.BG[i].HOffset = OrigPPU.BG[i].HOffset;
- PPU.BG[i].BGSize = OrigPPU.BG[i].BGSize;
- PPU.BG[i].NameBase = OrigPPU.BG[i].NameBase;
- PPU.BG[i].SCSize = OrigPPU.BG[i].SCSize;
- }
-
- PPU.CGFLIP = OrigPPU.CGFLIP;
- for (i = 0; i < 256; i++)
- PPU.CGDATA [i] = OrigPPU.CGDATA [i];
- PPU.FirstSprite = OrigPPU.FirstSprite;
- for (i = 0; i < 128; i++)
- {
- PPU.OBJ[i].HPos = OrigPPU.OBJ [i].HPos;
- PPU.OBJ[i].VPos = OrigPPU.OBJ [i].VPos;
- PPU.OBJ[i].Name = OrigPPU.OBJ [i].Name;
- PPU.OBJ[i].VFlip = OrigPPU.OBJ [i].VFlip;
- PPU.OBJ[i].HFlip = OrigPPU.OBJ [i].HFlip;
- PPU.OBJ[i].Priority = OrigPPU.OBJ [i].Priority;
- PPU.OBJ[i].Palette = OrigPPU.OBJ [i].Palette;
- PPU.OBJ[i].Size = OrigPPU.OBJ [i].Size;
- }
- PPU.OAMPriorityRotation = OrigPPU.OAMPriorityRotation;
- PPU.OAMAddr = OrigPPU.OAMAddr;
-
- PPU.OAMFlip = OrigPPU.OAMFlip;
- PPU.OAMTileAddress = OrigPPU.OAMTileAddress;
- PPU.IRQVBeamPos = OrigPPU.IRQVBeamPos;
- PPU.IRQHBeamPos = OrigPPU.IRQHBeamPos;
- PPU.VBeamPosLatched = OrigPPU.VBeamPosLatched;
- PPU.HBeamPosLatched = OrigPPU.HBeamPosLatched;
-
- PPU.HBeamFlip = OrigPPU.HBeamFlip;
- PPU.VBeamFlip = OrigPPU.VBeamFlip;
- PPU.HVBeamCounterLatched = OrigPPU.HVBeamCounterLatched;
-
- PPU.MatrixA = OrigPPU.MatrixA;
- PPU.MatrixB = OrigPPU.MatrixB;
- PPU.MatrixC = OrigPPU.MatrixC;
- PPU.MatrixD = OrigPPU.MatrixD;
- PPU.CentreX = OrigPPU.CentreX;
- PPU.CentreY = OrigPPU.CentreY;
- PPU.Joypad1ButtonReadPos = OrigPPU.Joypad1ButtonReadPos;
- PPU.Joypad2ButtonReadPos = OrigPPU.Joypad2ButtonReadPos;
- PPU.Joypad3ButtonReadPos = OrigPPU.Joypad3ButtonReadPos;
-
- PPU.CGADD = OrigPPU.CGADD;
- PPU.FixedColourRed = OrigPPU.FixedColourRed;
- PPU.FixedColourGreen = OrigPPU.FixedColourGreen;
- PPU.FixedColourBlue = OrigPPU.FixedColourBlue;
- PPU.SavedOAMAddr = OrigPPU.SavedOAMAddr;
- PPU.ScreenHeight = OrigPPU.ScreenHeight;
- PPU.WRAM = OrigPPU.WRAM;
- PPU.ForcedBlanking = OrigPPU.ForcedBlanking;
- PPU.OBJNameSelect = OrigPPU.OBJNameSelect;
- PPU.OBJSizeSelect = OrigPPU.OBJSizeSelect;
- PPU.OBJNameBase = OrigPPU.OBJNameBase;
- PPU.OAMReadFlip = OrigPPU.OAMReadFlip;
- // memmove converted: Different data segments [Neb]
- memcpy(PPU.OAMData, OrigPPU.OAMData, sizeof(PPU.OAMData));
- PPU.VTimerEnabled = OrigPPU.VTimerEnabled;
- PPU.HTimerEnabled = OrigPPU.HTimerEnabled;
- PPU.HTimerPosition = OrigPPU.HTimerPosition;
- PPU.Mosaic = OrigPPU.Mosaic;
- // memmove converted: Different data segments [Neb]
- memcpy(PPU.BGMosaic, OrigPPU.BGMosaic, sizeof(PPU.BGMosaic));
- PPU.Mode7HFlip = OrigPPU.Mode7HFlip;
- PPU.Mode7VFlip = OrigPPU.Mode7VFlip;
- PPU.Mode7Repeat = OrigPPU.Mode7Repeat;
- PPU.Window1Left = OrigPPU.Window1Left;
- PPU.Window1Right = OrigPPU.Window1Right;
- PPU.Window2Left = OrigPPU.Window2Left;
- PPU.Window2Right = OrigPPU.Window2Right;
- for (i = 0; i < 6; i++)
- {
- PPU.ClipWindowOverlapLogic [i] = OrigPPU.ClipWindowOverlapLogic [i];
- PPU.ClipWindow1Enable [i] = OrigPPU.ClipWindow1Enable [i];
- PPU.ClipWindow2Enable [i] = OrigPPU.ClipWindow2Enable [i];
- PPU.ClipWindow1Inside [i] = OrigPPU.ClipWindow1Inside [i];
- PPU.ClipWindow2Inside [i] = OrigPPU.ClipWindow2Inside [i];
- }
- PPU.CGFLIPRead = OrigPPU.CGFLIPRead;
- PPU.Need16x8Mulitply = OrigPPU.Need16x8Mulitply;
-
- IPPU.ColorsChanged = TRUE;
- IPPU.OBJChanged = TRUE;
- S9xFixColourBrightness();
- IPPU.RenderThisFrame = FALSE;
-
- if ((result = ReadBlock("DMA:", OrigDMA, sizeof(OrigDMA), snap)) != SUCCESS)
- return (result);
-
- for (i = 0; i < 8; i++)
- {
- DMA[i].TransferDirection = OrigDMA[i].TransferDirection;
- DMA[i].AAddressFixed = OrigDMA[i].AAddressFixed;
- DMA[i].AAddressDecrement = OrigDMA[i].AAddressDecrement;
- DMA[i].TransferMode = OrigDMA[i].TransferMode;
- DMA[i].ABank = OrigDMA[i].ABank;
- DMA[i].AAddress = OrigDMA[i].AAddress;
- DMA[i].Address = OrigDMA[i].Address;
- DMA[i].BAddress = OrigDMA[i].BAddress;
- DMA[i].TransferBytes = OrigDMA[i].TransferBytes;
- DMA[i].HDMAIndirectAddressing = OrigDMA[i].HDMAIndirectAddressing;
- DMA[i].IndirectAddress = OrigDMA[i].IndirectAddress;
- DMA[i].IndirectBank = OrigDMA[i].IndirectBank;
- DMA[i].Repeat = OrigDMA[i].Repeat;
- DMA[i].LineCount = OrigDMA[i].LineCount;
- DMA[i].FirstLine = OrigDMA[i].FirstLine;
- }
-
- if ((result = ReadBlock("VRA:", Memory.VRAM, 0x10000, snap)) != SUCCESS)
- return (result);
- if ((result = ReadBlock("RAM:", Memory.RAM, 0x20000, snap)) != SUCCESS)
- return (result);
- if ((result = ReadBlock("SRA:", Memory.SRAM, 0x10000, snap)) != SUCCESS)
- return (result);
- if ((result = ReadBlock("FIL:", Memory.FillRAM, 0x8000, snap)) != SUCCESS)
- return (result);
- if (ReadBlock("APU:", &OrigAPU, sizeof(OrigAPU), snap) == SUCCESS)
- {
- APU = *(SAPU*) &OrigAPU;
-
- if ((result = ReadBlock("ARE:", &OrigAPURegisters,
- sizeof(OrigAPURegisters), snap)) != SUCCESS)
- return (result);
- IAPU.Registers = *(SAPURegisters*) &OrigAPURegisters;
- if ((result = ReadBlock("ARA:", IAPU.RAM, 0x10000, snap)) != SUCCESS)
- return (result);
- if ((result = ReadBlock("SOU:", &OrigSoundData,
- sizeof(SOrigSoundData), snap)) != SUCCESS)
- return (result);
-
-
- SoundData.master_volume [0] = OrigSoundData.master_volume_left;
- SoundData.master_volume [1] = OrigSoundData.master_volume_right;
- SoundData.echo_volume [0] = OrigSoundData.echo_volume_left;
- SoundData.echo_volume [1] = OrigSoundData.echo_volume_right;
-
- SoundData.echo_enable = OrigSoundData.echo_enable;
- SoundData.echo_feedback = OrigSoundData.echo_feedback;
- SoundData.echo_ptr = OrigSoundData.echo_ptr;
- SoundData.echo_buffer_size = OrigSoundData.echo_buffer_size;
- SoundData.echo_write_enabled = OrigSoundData.echo_write_enabled;
- SoundData.echo_channel_enable = OrigSoundData.echo_channel_enable;
- SoundData.pitch_mod = OrigSoundData.pitch_mod;
-
- for (i = 0; i < 3; i++)
- SoundData.dummy [i] = OrigSoundData.dummy [i];
- for (i = 0; i < NUM_CHANNELS; i++)
- {
- SoundData.channels [i].state = OrigSoundData.channels [i].state;
- SoundData.channels [i].type = OrigSoundData.channels [i].type;
- SoundData.channels [i].volume_left = OrigSoundData.channels [i].volume_left;
- SoundData.channels [i].volume_right = OrigSoundData.channels [i].volume_right;
- SoundData.channels [i].hertz = OrigSoundData.channels [i].frequency;
- SoundData.channels [i].count = OrigSoundData.channels [i].count;
- SoundData.channels [i].loop = OrigSoundData.channels [i].loop;
- SoundData.channels [i].envx = OrigSoundData.channels [i].envx;
- SoundData.channels [i].left_vol_level =
- OrigSoundData.channels [i].left_vol_level;
- SoundData.channels [i].right_vol_level =
- OrigSoundData.channels [i].right_vol_level;
- SoundData.channels [i].envx_target = OrigSoundData.channels [i].envx_target;
- SoundData.channels [i].env_error = OrigSoundData.channels [i].env_error;
- SoundData.channels [i].erate = OrigSoundData.channels [i].erate;
- SoundData.channels [i].direction = OrigSoundData.channels [i].direction;
- SoundData.channels [i].attack_rate = OrigSoundData.channels [i].attack_rate;
- SoundData.channels [i].decay_rate = OrigSoundData.channels [i].decay_rate;
- SoundData.channels [i].sustain_rate = OrigSoundData.channels [i].sustain_rate;
- SoundData.channels [i].release_rate = OrigSoundData.channels [i].release_rate;
- SoundData.channels [i].sustain_level = OrigSoundData.channels [i].sustain_level;
- SoundData.channels [i].sample = OrigSoundData.channels [i].sample;
- for (j = 0; j < 16; j++)
- SoundData.channels [i].decoded [j] = OrigSoundData.channels [i].decoded [j];
-
- for (j = 0; j < 2; j++)
- SoundData.channels [i].previous [j] = OrigSoundData.channels [i].previous [j];
-
- SoundData.channels [i].sample_number = OrigSoundData.channels [i].sample_number;
- SoundData.channels [i].last_block = OrigSoundData.channels [i].last_block;
- SoundData.channels [i].needs_decode = OrigSoundData.channels [i].needs_decode;
- SoundData.channels [i].block_pointer = OrigSoundData.channels [i].block_pointer;
- SoundData.channels [i].sample_pointer =
- OrigSoundData.channels [i].sample_pointer;
- SoundData.channels [i].mode = OrigSoundData.channels [i].mode;
- }
- IAPU.PC = IAPU.RAM + IAPU.Registers.PC;
- S9xAPUUnpackStatus();
- if (APUCheckDirectPage())
- IAPU.DirectPage = IAPU.RAM + 0x100;
- else
- IAPU.DirectPage = IAPU.RAM;
- Settings.APUEnabled = TRUE;
- IAPU.APUExecuting = TRUE;
- }
- else
- {
- Settings.APUEnabled = FALSE;
- IAPU.APUExecuting = FALSE;
- }
- S9xFixSoundAfterSnapshotLoad();
- ICPU.ShiftedPB = ICPU.Registers.PB << 16;
- ICPU.ShiftedDB = ICPU.Registers.DB << 16;
- S9xSetPCBase(ICPU.ShiftedPB + ICPU.Registers.PC);
- S9xUnpackStatus();
- S9xFixCycles();
- S9xReschedule();
-
- return (SUCCESS);
-}
-
diff --git a/source/snaporig.h b/source/snaporig.h
deleted file mode 100644
index bb7da7d..0000000
--- a/source/snaporig.h
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
-
- (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
- Jerremy Koot (jkoot@snes9x.com)
-
- (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net)
-
- (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net),
- funkyass (funkyass@spam.shaw.ca),
- Joel Yliluoma (http://iki.fi/bisqwit/)
- Kris Bleakley (codeviolation@hotmail.com),
- Matthew Kendora,
- Nach (n-a-c-h@users.sourceforge.net),
- Peter Bortas (peter@bortas.org) and
- zones (kasumitokoduck@yahoo.com)
-
- C4 x86 assembler and some C emulation code
- (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com),
- _Demo_ (_demo_@zsnes.com), and Nach
-
- C4 C++ code
- (c) Copyright 2003 Brad Jorsch
-
- DSP-1 emulator code
- (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson,
- John Weidman, neviksti (neviksti@hotmail.com),
- Kris Bleakley, Andreas Naive
-
- DSP-2 emulator code
- (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and
- Lord Nightmare (lord_nightmare@users.sourceforge.net
-
- OBC1 emulator code
- (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and
- Kris Bleakley
- Ported from x86 assembler to C by sanmaiwashi
-
- SPC7110 and RTC C++ emulator code
- (c) Copyright 2002 Matthew Kendora with research by
- zsKnight, John Weidman, and Dark Force
-
- S-DD1 C emulator code
- (c) Copyright 2003 Brad Jorsch with research by
- Andreas Naive and John Weidman
-
- S-RTC C emulator code
- (c) Copyright 2001 John Weidman
-
- ST010 C++ emulator code
- (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora
-
- Super FX x86 assembler emulator code
- (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault
-
- Super FX C emulator code
- (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman
-
-
- SH assembler code partly based on x86 assembler code
- (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
-
-
- Specific ports contains the works of other authors. See headers in
- individual files.
-
- Snes9x homepage: http://www.snes9x.com
-
- Permission to use, copy, modify and distribute Snes9x in both binary and
- source form, for non-commercial purposes, is hereby granted without fee,
- providing that this license information and copyright notice appear with
- all copies and any derived work.
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event shall the authors be held liable for any damages
- arising from the use of this software.
-
- Snes9x is freeware for PERSONAL USE only. Commercial users should
- seek permission of the copyright holders first. Commercial use includes
- charging money for Snes9x or software derived from Snes9x.
-
- The copyright holders request that bug fixes and improvements to the code
- should be forwarded to them so everyone can benefit from the modifications
- in future versions.
-
- Super NES and Super Nintendo Entertainment System are trademarks of
- Nintendo Co., Limited and its subsidiary companies.
-*******************************************************************************/
-#ifndef _SNAPORIG_H_
-#define _SNAPORIG_H_
-
-#define ORIG_SNAPSHOT_MAGIC "#!snes96"
-#define ORIG_SNAPSHOT_VERSION 4
-
-bool8 S9xLoadOrigSnapshot(const char* filename);
-
-struct SOrigCPUState
-{
- uint32 Flags;
- short Cycles_old;
- short NextEvent_old;
- uint8 CurrentFrame;
- uint8 FastROMSpeed_old_old;
- uint16 V_Counter_old;
- bool8 BranchSkip;
- bool8 NMIActive;
- bool8 IRQActive;
- bool8 WaitingForInterrupt;
- bool8 InDMA;
- uint8 WhichEvent;
- uint8* PC;
- uint8* PCBase;
- uint16 MemSpeed_old;
- uint16 MemSpeedx2_old;
- uint16 FastROMSpeed_old;
- bool8 FastDP;
- uint8* PCAtOpcodeStart;
- uint8* WaitAddress;
- uint32 WaitCounter;
- long Cycles;
- long NextEvent;
- long V_Counter;
- long MemSpeed;
- long MemSpeedx2;
- long FastROMSpeed;
-};
-
-struct SOrigAPU
-{
- uint32 Cycles;
- bool8 ShowROM;
- uint8 Flags;
- uint8 KeyedChannels;
- uint8 OutPorts [4];
- uint8 DSP [0x80];
- uint8 ExtraRAM [64];
- uint16 Timer [3];
- uint16 TimerTarget [3];
- bool8 TimerEnabled [3];
- bool8 TimerValueWritten [3];
-};
-
-typedef union
-{
-#ifdef LSB_FIRST
- struct
- {
- uint8 A, Y;
- } B;
-#else
- struct
- {
- uint8 Y, A;
- } B;
-#endif
- uint16 W;
-} OrigYAndA;
-
-struct SOrigAPURegisters
-{
- uint8 P;
- OrigYAndA YA;
- uint8 X;
- uint8 S;
- uint16 PC;
-};
-
-#define ORIG_MAX_BUFFER_SIZE (1024 * 4)
-#define NUM_CHANNELS 8
-
-typedef struct
-{
- int state;
- int type;
- short volume_left;
- short volume_right;
- int frequency;
- int count;
- signed short wave [ORIG_MAX_BUFFER_SIZE];
- bool8 loop;
- int envx;
- short left_vol_level;
- short right_vol_level;
- short envx_target;
- unsigned long int env_error;
- unsigned long erate;
- int direction;
- unsigned long attack_rate;
- unsigned long decay_rate;
- unsigned long sustain_rate;
- unsigned long release_rate;
- unsigned long sustain_level;
- signed short sample;
- signed short decoded [16];
- signed short previous [2];
- uint16 sample_number;
- bool8 last_block;
- bool8 needs_decode;
- uint32 block_pointer;
- uint32 sample_pointer;
- int* echo_buf_ptr;
- int mode;
- uint32 dummy [8];
-} OrigChannel;
-
-typedef struct
-{
- short master_volume_left;
- short master_volume_right;
- short echo_volume_left;
- short echo_volume_right;
- int echo_enable;
- int echo_feedback;
- int echo_ptr;
- int echo_buffer_size;
- int echo_write_enabled;
- int echo_channel_enable;
- int pitch_mod;
- // Just incase they are needed in the future, for snapshot compatibility.
- uint32 dummy [3];
- OrigChannel channels [NUM_CHANNELS];
-} SOrigSoundData;
-
-struct SOrigOBJ
-{
- short HPos;
- uint16 VPos;
- uint16 Name;
- uint8 VFlip;
- uint8 HFlip;
- uint8 Priority;
- uint8 Palette;
- uint8 Size;
- uint8 Prev;
- uint8 Next;
-};
-
-struct SOrigPPU
-{
- uint8 BGMode;
- uint8 BG3Priority;
- uint8 Brightness;
-
- struct
- {
- bool8 High;
- uint8 Increment;
- uint16 Address;
- uint16 Mask1;
- uint16 FullGraphicCount;
- uint16 Shift;
- } VMA;
-
- struct
- {
- uint8 TileSize;
- uint16 TileAddress;
- uint8 Width;
- uint8 Height;
- uint16 SCBase;
- uint16 VOffset;
- uint16 HOffset;
- bool8 ThroughMain;
- bool8 ThroughSub;
- uint8 BGSize;
- uint16 NameBase;
- uint16 SCSize;
- bool8 Addition;
- } BG [4];
-
- bool8 CGFLIP;
- uint16 CGDATA [256];
- uint8 FirstSprite;
- uint8 LastSprite;
- struct SOrigOBJ OBJ [129];
- uint8 OAMPriorityRotation;
- uint16 OAMAddr;
-
- uint8 OAMFlip;
- uint16 OAMTileAddress;
- uint16 IRQVBeamPos;
- uint16 IRQHBeamPos;
- uint16 VBeamPosLatched;
- uint16 HBeamPosLatched;
-
- uint8 HBeamFlip;
- uint8 VBeamFlip;
- uint8 HVBeamCounterLatched;
-
- short MatrixA;
- short MatrixB;
- short MatrixC;
- short MatrixD;
- short CentreX;
- short CentreY;
- uint8 Joypad1ButtonReadPos;
- uint8 Joypad2ButtonReadPos;
-
- uint8 CGADD;
- uint8 FixedColourRed;
- uint8 FixedColourGreen;
- uint8 FixedColourBlue;
- uint16 SavedOAMAddr;
- uint16 ScreenHeight;
- uint32 WRAM;
- uint8 BG_Forced;
- bool8 ForcedBlanking;
- bool8 OBJThroughMain;
- bool8 OBJThroughSub;
- uint8 OBJSizeSelect;
- uint8 OBJNameSelect_old;
- uint16 OBJNameBase;
- bool8 OBJAddition;
- uint8 OAMReadFlip;
- uint8 OAMData [512 + 32];
- bool8 VTimerEnabled;
- bool8 HTimerEnabled;
- short HTimerPosition;
- uint8 Mosaic;
- bool8 BGMosaic [4];
- bool8 Mode7HFlip;
- bool8 Mode7VFlip;
- uint8 Mode7Repeat;
- uint8 Window1Left;
- uint8 Window1Right;
- uint8 Window2Left;
- uint8 Window2Right;
- uint8 ClipCounts [6];
- uint8 ClipLeftEdges [3][6];
- uint8 ClipRightEdges [3][6];
- uint8 ClipWindowOverlapLogic [6];
- uint8 ClipWindow1Enable [6];
- uint8 ClipWindow2Enable [6];
- bool8 ClipWindow1Inside [6];
- bool8 ClipWindow2Inside [6];
- bool8 RecomputeClipWindows;
- uint8 CGFLIPRead;
- uint16 OBJNameSelect;
- bool8 Need16x8Mulitply;
- uint8 Joypad3ButtonReadPos;
- uint8 MouseSpeed[2];
-};
-
-struct SOrigDMA
-{
- bool8 TransferDirection;
- bool8 AAddressFixed;
- bool8 AAddressDecrement;
- uint8 TransferMode;
-
- uint8 ABank;
- uint16 AAddress;
- uint16 Address;
- uint8 BAddress;
-
- // General DMA only:
- uint16 TransferBytes;
-
- // H-DMA only:
- bool8 HDMAIndirectAddressing;
- uint16 IndirectAddress;
- uint8 IndirectBank;
- uint8 Repeat;
- uint8 LineCount;
- uint8 FirstLine;
- bool8 JustStarted;
-};
-
-typedef union
-{
-#ifdef LSB_FIRST
- struct
- {
- uint8 l, h;
- } B;
-#else
- struct
- {
- uint8 h, l;
- } B;
-#endif
- uint16 W;
-} OrigPair;
-
-struct SOrigRegisters
-{
- uint8 PB;
- uint8 DB;
- OrigPair P;
- OrigPair A;
- OrigPair D;
- OrigPair S;
- OrigPair X;
- OrigPair Y;
- uint16 PC;
-};
-
-#endif
-
diff --git a/source/snapshot.c b/source/snapshot.c
deleted file mode 100644
index 2b1edc0..0000000
--- a/source/snapshot.c
+++ /dev/null
@@ -1,1792 +0,0 @@
-/*******************************************************************************
- Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
-
- (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
- Jerremy Koot (jkoot@snes9x.com)
-
- (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net)
-
- (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net),
- funkyass (funkyass@spam.shaw.ca),
- Joel Yliluoma (http://iki.fi/bisqwit/)
- Kris Bleakley (codeviolation@hotmail.com),
- Matthew Kendora,
- Nach (n-a-c-h@users.sourceforge.net),
- Peter Bortas (peter@bortas.org) and
- zones (kasumitokoduck@yahoo.com)
-
- C4 x86 assembler and some C emulation code
- (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com),
- _Demo_ (_demo_@zsnes.com), and Nach
-
- C4 C++ code
- (c) Copyright 2003 Brad Jorsch
-
- DSP-1 emulator code
- (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson,
- John Weidman, neviksti (neviksti@hotmail.com),
- Kris Bleakley, Andreas Naive
-
- DSP-2 emulator code
- (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and
- Lord Nightmare (lord_nightmare@users.sourceforge.net
-
- OBC1 emulator code
- (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and
- Kris Bleakley
- Ported from x86 assembler to C by sanmaiwashi
-
- SPC7110 and RTC C++ emulator code
- (c) Copyright 2002 Matthew Kendora with research by
- zsKnight, John Weidman, and Dark Force
-
- S-DD1 C emulator code
- (c) Copyright 2003 Brad Jorsch with research by
- Andreas Naive and John Weidman
-
- S-RTC C emulator code
- (c) Copyright 2001 John Weidman
-
- ST010 C++ emulator code
- (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora
-
- Super FX x86 assembler emulator code
- (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault
-
- Super FX C emulator code
- (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman
-
-
- SH assembler code partly based on x86 assembler code
- (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
-
-
- Specific ports contains the works of other authors. See headers in
- individual files.
-
- Snes9x homepage: http://www.snes9x.com
-
- Permission to use, copy, modify and distribute Snes9x in both binary and
- source form, for non-commercial purposes, is hereby granted without fee,
- providing that this license information and copyright notice appear with
- all copies and any derived work.
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event shall the authors be held liable for any damages
- arising from the use of this software.
-
- Snes9x is freeware for PERSONAL USE only. Commercial users should
- seek permission of the copyright holders first. Commercial use includes
- charging money for Snes9x or software derived from Snes9x.
-
- The copyright holders request that bug fixes and improvements to the code
- should be forwarded to them so everyone can benefit from the modifications
- in future versions.
-
- Super NES and Super Nintendo Entertainment System are trademarks of
- Nintendo Co., Limited and its subsidiary companies.
-*******************************************************************************/
-#include <string.h>
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#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 "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"
-#include "sa1.h"
-#include "srtc.h"
-#include "sdd1.h"
-#include "spc7110.h"
-
-extern uint8* SRAM;
-
-bool8 S9xUnfreezeZSNES(const char* filename);
-
-typedef struct
-{
- int offset;
- int size;
- int type;
-} FreezeData;
-
-enum
-{
- INT_V, uint8_ARRAY_V, uint16_ARRAY_V, uint32_ARRAY_V
-};
-
-#define Offset(field,structure) \
-((int) (((char *) (&(((structure)NULL)->field))) - ((char *) NULL)))
-
-#define COUNT(ARRAY) (sizeof (ARRAY) / sizeof (ARRAY[0]))
-
-typedef struct
-{
- uint32 MovieInputDataSize;
-} SnapshotMovieInfo;
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SnapshotMovieInfo *)
-
-static FreezeData SnapMovie [] =
-{
- {OFFSET(MovieInputDataSize), 4, INT_V},
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SCPUState *)
-
-static FreezeData SnapCPU [] =
-{
- {OFFSET(Flags), 4, INT_V},
- {OFFSET(BranchSkip), 1, INT_V},
- {OFFSET(NMIActive), 1, INT_V},
- {OFFSET(IRQActive), 1, INT_V},
- {OFFSET(WaitingForInterrupt), 1, INT_V},
- {OFFSET(WhichEvent), 1, INT_V},
- {OFFSET(Cycles), 4, INT_V},
- {OFFSET(NextEvent), 4, INT_V},
- {OFFSET(V_Counter), 4, INT_V},
- {OFFSET(MemSpeed), 4, INT_V},
- {OFFSET(MemSpeedx2), 4, INT_V},
- {OFFSET(FastROMSpeed), 4, INT_V}
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SRegisters *)
-
-static FreezeData SnapRegisters [] =
-{
- {OFFSET(PB), 1, INT_V},
- {OFFSET(DB), 1, INT_V},
- {OFFSET(P.W), 2, INT_V},
- {OFFSET(A.W), 2, INT_V},
- {OFFSET(D.W), 2, INT_V},
- {OFFSET(S.W), 2, INT_V},
- {OFFSET(X.W), 2, INT_V},
- {OFFSET(Y.W), 2, INT_V},
- {OFFSET(PC), 2, INT_V}
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SPPU *)
-
-static FreezeData SnapPPU [] =
-{
- {OFFSET(BGMode), 1, INT_V},
- {OFFSET(BG3Priority), 1, INT_V},
- {OFFSET(Brightness), 1, INT_V},
- {OFFSET(VMA.High), 1, INT_V},
- {OFFSET(VMA.Increment), 1, INT_V},
- {OFFSET(VMA.Address), 2, INT_V},
- {OFFSET(VMA.Mask1), 2, INT_V},
- {OFFSET(VMA.FullGraphicCount), 2, INT_V},
- {OFFSET(VMA.Shift), 2, INT_V},
- {OFFSET(BG[0].SCBase), 2, INT_V},
- {OFFSET(BG[0].VOffset), 2, INT_V},
- {OFFSET(BG[0].HOffset), 2, INT_V},
- {OFFSET(BG[0].BGSize), 1, INT_V},
- {OFFSET(BG[0].NameBase), 2, INT_V},
- {OFFSET(BG[0].SCSize), 2, INT_V},
-
- {OFFSET(BG[1].SCBase), 2, INT_V},
- {OFFSET(BG[1].VOffset), 2, INT_V},
- {OFFSET(BG[1].HOffset), 2, INT_V},
- {OFFSET(BG[1].BGSize), 1, INT_V},
- {OFFSET(BG[1].NameBase), 2, INT_V},
- {OFFSET(BG[1].SCSize), 2, INT_V},
-
- {OFFSET(BG[2].SCBase), 2, INT_V},
- {OFFSET(BG[2].VOffset), 2, INT_V},
- {OFFSET(BG[2].HOffset), 2, INT_V},
- {OFFSET(BG[2].BGSize), 1, INT_V},
- {OFFSET(BG[2].NameBase), 2, INT_V},
- {OFFSET(BG[2].SCSize), 2, INT_V},
-
- {OFFSET(BG[3].SCBase), 2, INT_V},
- {OFFSET(BG[3].VOffset), 2, INT_V},
- {OFFSET(BG[3].HOffset), 2, INT_V},
- {OFFSET(BG[3].BGSize), 1, INT_V},
- {OFFSET(BG[3].NameBase), 2, INT_V},
- {OFFSET(BG[3].SCSize), 2, INT_V},
-
- {OFFSET(CGFLIP), 1, INT_V},
- {OFFSET(CGDATA), 256, uint16_ARRAY_V},
- {OFFSET(FirstSprite), 1, INT_V},
-#define O(N) \
- {OFFSET (OBJ[N].HPos), 2, INT_V}, \
- {OFFSET (OBJ[N].VPos), 2, INT_V}, \
- {OFFSET (OBJ[N].Name), 2, INT_V}, \
- {OFFSET (OBJ[N].VFlip), 1, INT_V}, \
- {OFFSET (OBJ[N].HFlip), 1, INT_V}, \
- {OFFSET (OBJ[N].Priority), 1, INT_V}, \
- {OFFSET (OBJ[N].Palette), 1, INT_V}, \
- {OFFSET (OBJ[N].Size), 1, INT_V}
-
- O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7),
- O(8), O(9), O(10), O(11), O(12), O(13), O(14), O(15),
- O(16), O(17), O(18), O(19), O(20), O(21), O(22), O(23),
- O(24), O(25), O(26), O(27), O(28), O(29), O(30), O(31),
- O(32), O(33), O(34), O(35), O(36), O(37), O(38), O(39),
- O(40), O(41), O(42), O(43), O(44), O(45), O(46), O(47),
- O(48), O(49), O(50), O(51), O(52), O(53), O(54), O(55),
- O(56), O(57), O(58), O(59), O(60), O(61), O(62), O(63),
- O(64), O(65), O(66), O(67), O(68), O(69), O(70), O(71),
- O(72), O(73), O(74), O(75), O(76), O(77), O(78), O(79),
- O(80), O(81), O(82), O(83), O(84), O(85), O(86), O(87),
- O(88), O(89), O(90), O(91), O(92), O(93), O(94), O(95),
- O(96), O(97), O(98), O(99), O(100), O(101), O(102), O(103),
- O(104), O(105), O(106), O(107), O(108), O(109), O(110), O(111),
- O(112), O(113), O(114), O(115), O(116), O(117), O(118), O(119),
- O(120), O(121), O(122), O(123), O(124), O(125), O(126), O(127),
-#undef O
- {OFFSET(OAMPriorityRotation), 1, INT_V},
- {OFFSET(OAMAddr), 2, INT_V},
- {OFFSET(OAMFlip), 1, INT_V},
- {OFFSET(OAMTileAddress), 2, INT_V},
- {OFFSET(IRQVBeamPos), 2, INT_V},
- {OFFSET(IRQHBeamPos), 2, INT_V},
- {OFFSET(VBeamPosLatched), 2, INT_V},
- {OFFSET(HBeamPosLatched), 2, INT_V},
- {OFFSET(HBeamFlip), 1, INT_V},
- {OFFSET(VBeamFlip), 1, INT_V},
- {OFFSET(HVBeamCounterLatched), 1, INT_V},
- {OFFSET(MatrixA), 2, INT_V},
- {OFFSET(MatrixB), 2, INT_V},
- {OFFSET(MatrixC), 2, INT_V},
- {OFFSET(MatrixD), 2, INT_V},
- {OFFSET(CentreX), 2, INT_V},
- {OFFSET(CentreY), 2, INT_V},
- {OFFSET(Joypad1ButtonReadPos), 1, INT_V},
- {OFFSET(Joypad2ButtonReadPos), 1, INT_V},
- {OFFSET(Joypad3ButtonReadPos), 1, INT_V},
- {OFFSET(CGADD), 1, INT_V},
- {OFFSET(FixedColourRed), 1, INT_V},
- {OFFSET(FixedColourGreen), 1, INT_V},
- {OFFSET(FixedColourBlue), 1, INT_V},
- {OFFSET(SavedOAMAddr), 2, INT_V},
- {OFFSET(ScreenHeight), 2, INT_V},
- {OFFSET(WRAM), 4, INT_V},
- {OFFSET(ForcedBlanking), 1, INT_V},
- {OFFSET(OBJNameSelect), 2, INT_V},
- {OFFSET(OBJSizeSelect), 1, INT_V},
- {OFFSET(OBJNameBase), 2, INT_V},
- {OFFSET(OAMReadFlip), 1, INT_V},
- {OFFSET(VTimerEnabled), 1, INT_V},
- {OFFSET(HTimerEnabled), 1, INT_V},
- {OFFSET(HTimerPosition), 2, INT_V},
- {OFFSET(Mosaic), 1, INT_V},
- {OFFSET(Mode7HFlip), 1, INT_V},
- {OFFSET(Mode7VFlip), 1, INT_V},
- {OFFSET(Mode7Repeat), 1, INT_V},
- {OFFSET(Window1Left), 1, INT_V},
- {OFFSET(Window1Right), 1, INT_V},
- {OFFSET(Window2Left), 1, INT_V},
- {OFFSET(Window2Right), 1, INT_V},
-#define O(N) \
- {OFFSET (ClipWindowOverlapLogic[N]), 1, INT_V}, \
- {OFFSET (ClipWindow1Enable[N]), 1, INT_V}, \
- {OFFSET (ClipWindow2Enable[N]), 1, INT_V}, \
- {OFFSET (ClipWindow1Inside[N]), 1, INT_V}, \
- {OFFSET (ClipWindow2Inside[N]), 1, INT_V}
-
- O(0), O(1), O(2), O(3), O(4), O(5),
-
-#undef O
-
- {OFFSET(CGFLIPRead), 1, INT_V},
- {OFFSET(Need16x8Mulitply), 1, INT_V},
- {OFFSET(BGMosaic), 4, uint8_ARRAY_V},
- {OFFSET(OAMData), 512 + 32, uint8_ARRAY_V},
- {OFFSET(Need16x8Mulitply), 1, INT_V},
- {OFFSET(MouseSpeed), 2, uint8_ARRAY_V}
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SDMA *)
-
-static FreezeData SnapDMA [] =
-{
-#define O(N) \
- {OFFSET (TransferDirection) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (AAddressFixed) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (AAddressDecrement) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (TransferMode) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (ABank) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (AAddress) + N * sizeof (SDMA), 2, INT_V}, \
- {OFFSET (Address) + N * sizeof (SDMA), 2, INT_V}, \
- {OFFSET (BAddress) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (TransferBytes) + N * sizeof (SDMA), 2, INT_V}, \
- {OFFSET (HDMAIndirectAddressing) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (IndirectAddress) + N * sizeof (SDMA), 2, INT_V}, \
- {OFFSET (IndirectBank) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (Repeat) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (LineCount) + N * sizeof (SDMA), 1, INT_V}, \
- {OFFSET (FirstLine) + N * sizeof (SDMA), 1, INT_V}
-
- O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7)
-#undef O
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f, SAPU *)
-
-static FreezeData SnapAPU [] =
-{
- {OFFSET(Cycles), 4, INT_V},
- {OFFSET(ShowROM), 1, INT_V},
- {OFFSET(Flags), 1, INT_V},
- {OFFSET(KeyedChannels), 1, INT_V},
- {OFFSET(OutPorts), 4, uint8_ARRAY_V},
- {OFFSET(DSP), 0x80, uint8_ARRAY_V},
- {OFFSET(ExtraRAM), 64, uint8_ARRAY_V},
- {OFFSET(Timer), 3, uint16_ARRAY_V},
- {OFFSET(TimerTarget), 3, uint16_ARRAY_V},
- {OFFSET(TimerEnabled), 3, uint8_ARRAY_V},
- {OFFSET(TimerValueWritten), 3, uint8_ARRAY_V}
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f, SAPURegisters *)
-
-static FreezeData SnapAPURegisters [] =
-{
- {OFFSET(P), 1, INT_V},
- {OFFSET(YA.W), 2, INT_V},
- {OFFSET(X), 1, INT_V},
- {OFFSET(S), 1, INT_V},
- {OFFSET(PC), 2, INT_V},
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SSoundData *)
-
-static FreezeData SnapSoundData [] =
-{
- {OFFSET(master_volume [0]), 2, INT_V},
- {OFFSET(master_volume [1]), 2, INT_V},
- {OFFSET(echo_volume [0]), 2, INT_V},
- {OFFSET(echo_volume [1]), 2, INT_V},
- {OFFSET(echo_enable), 4, INT_V},
- {OFFSET(echo_feedback), 4, INT_V},
- {OFFSET(echo_ptr), 4, INT_V},
- {OFFSET(echo_buffer_size), 4, INT_V},
- {OFFSET(echo_write_enabled), 4, INT_V},
- {OFFSET(echo_channel_enable), 4, INT_V},
- {OFFSET(pitch_mod), 4, INT_V},
- {OFFSET(dummy), 3, uint32_ARRAY_V},
-#define O(N) \
- {OFFSET (channels [N].state), 4, INT_V}, \
- {OFFSET (channels [N].type), 4, INT_V}, \
- {OFFSET (channels [N].volume_left), 2, INT_V}, \
- {OFFSET (channels [N].volume_right), 2, INT_V}, \
- {OFFSET (channels [N].hertz), 4, INT_V}, \
- {OFFSET (channels [N].count), 4, INT_V}, \
- {OFFSET (channels [N].loop), 1, INT_V}, \
- {OFFSET (channels [N].envx), 4, INT_V}, \
- {OFFSET (channels [N].left_vol_level), 2, INT_V}, \
- {OFFSET (channels [N].right_vol_level), 2, INT_V}, \
- {OFFSET (channels [N].envx_target), 2, INT_V}, \
- {OFFSET (channels [N].env_error), 4, INT_V}, \
- {OFFSET (channels [N].erate), 4, INT_V}, \
- {OFFSET (channels [N].direction), 4, INT_V}, \
- {OFFSET (channels [N].attack_rate), 4, INT_V}, \
- {OFFSET (channels [N].decay_rate), 4, INT_V}, \
- {OFFSET (channels [N].sustain_rate), 4, INT_V}, \
- {OFFSET (channels [N].release_rate), 4, INT_V}, \
- {OFFSET (channels [N].sustain_level), 4, INT_V}, \
- {OFFSET (channels [N].sample), 2, INT_V}, \
- {OFFSET (channels [N].decoded), 16, uint16_ARRAY_V}, \
- {OFFSET (channels [N].previous16), 2, uint16_ARRAY_V}, \
- {OFFSET (channels [N].sample_number), 2, INT_V}, \
- {OFFSET (channels [N].last_block), 1, INT_V}, \
- {OFFSET (channels [N].needs_decode), 1, INT_V}, \
- {OFFSET (channels [N].block_pointer), 4, INT_V}, \
- {OFFSET (channels [N].sample_pointer), 4, INT_V}, \
- {OFFSET (channels [N].mode), 4, INT_V}
-
- O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7)
-#undef O
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SSA1Registers *)
-
-static FreezeData SnapSA1Registers [] =
-{
- {OFFSET(PB), 1, INT_V},
- {OFFSET(DB), 1, INT_V},
- {OFFSET(P.W), 2, INT_V},
- {OFFSET(A.W), 2, INT_V},
- {OFFSET(D.W), 2, INT_V},
- {OFFSET(S.W), 2, INT_V},
- {OFFSET(X.W), 2, INT_V},
- {OFFSET(Y.W), 2, INT_V},
- {OFFSET(PC), 2, INT_V}
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SSA1 *)
-
-static FreezeData SnapSA1 [] =
-{
- {OFFSET(Flags), 4, INT_V},
- {OFFSET(NMIActive), 1, INT_V},
- {OFFSET(IRQActive), 1, INT_V},
- {OFFSET(WaitingForInterrupt), 1, INT_V},
- {OFFSET(op1), 2, INT_V},
- {OFFSET(op2), 2, INT_V},
- {OFFSET(arithmetic_op), 4, INT_V},
- {OFFSET(sum), 8, INT_V},
- {OFFSET(overflow), 1, INT_V}
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,SPC7110Regs *)
-
-static FreezeData SnapSPC7110 [] =
-{
- {OFFSET(reg4800), 1, INT_V},
- {OFFSET(reg4801), 1, INT_V},
- {OFFSET(reg4802), 1, INT_V},
- {OFFSET(reg4803), 1, INT_V},
- {OFFSET(reg4804), 1, INT_V},
- {OFFSET(reg4805), 1, INT_V},
- {OFFSET(reg4806), 1, INT_V},
- {OFFSET(reg4807), 1, INT_V},
- {OFFSET(reg4808), 1, INT_V},
- {OFFSET(reg4809), 1, INT_V},
- {OFFSET(reg480A), 1, INT_V},
- {OFFSET(reg480B), 1, INT_V},
- {OFFSET(reg480C), 1, INT_V},
- {OFFSET(reg4811), 1, INT_V},
- {OFFSET(reg4812), 1, INT_V},
- {OFFSET(reg4813), 1, INT_V},
- {OFFSET(reg4814), 1, INT_V},
- {OFFSET(reg4815), 1, INT_V},
- {OFFSET(reg4816), 1, INT_V},
- {OFFSET(reg4817), 1, INT_V},
- {OFFSET(reg4818), 1, INT_V},
- {OFFSET(reg4820), 1, INT_V},
- {OFFSET(reg4821), 1, INT_V},
- {OFFSET(reg4822), 1, INT_V},
- {OFFSET(reg4823), 1, INT_V},
- {OFFSET(reg4824), 1, INT_V},
- {OFFSET(reg4825), 1, INT_V},
- {OFFSET(reg4826), 1, INT_V},
- {OFFSET(reg4827), 1, INT_V},
- {OFFSET(reg4828), 1, INT_V},
- {OFFSET(reg4829), 1, INT_V},
- {OFFSET(reg482A), 1, INT_V},
- {OFFSET(reg482B), 1, INT_V},
- {OFFSET(reg482C), 1, INT_V},
- {OFFSET(reg482D), 1, INT_V},
- {OFFSET(reg482E), 1, INT_V},
- {OFFSET(reg482F), 1, INT_V},
- {OFFSET(reg4830), 1, INT_V},
- {OFFSET(reg4831), 1, INT_V},
- {OFFSET(reg4832), 1, INT_V},
- {OFFSET(reg4833), 1, INT_V},
- {OFFSET(reg4834), 1, INT_V},
- {OFFSET(reg4840), 1, INT_V},
- {OFFSET(reg4841), 1, INT_V},
- {OFFSET(reg4842), 1, INT_V},
- {OFFSET(AlignBy), 1, INT_V},
- {OFFSET(written), 1, INT_V},
- {OFFSET(offset_add), 1, INT_V},
- {OFFSET(DataRomOffset), 4, INT_V},
- {OFFSET(DataRomSize), 4, INT_V},
- {OFFSET(bank50Internal), 4, INT_V},
- {OFFSET(bank50), 0x10000, uint8_ARRAY_V}
-};
-
-#undef OFFSET
-#define OFFSET(f) Offset(f,struct SPC7110RTC *)
-
-static FreezeData SnapS7RTC [] =
-{
- {OFFSET(reg), 16, uint8_ARRAY_V},
- {OFFSET(index), 2, INT_V},
- {OFFSET(control), 1, INT_V},
- {OFFSET(init), 1, INT_V},
- {OFFSET(last_used), 4, INT_V}
-};
-
-//static char ROMFilename [_MAX_PATH];
-//static char SnapshotFilename [_MAX_PATH];
-
-void FreezeStruct(STREAM stream, const char* name, void* base,
- FreezeData* fields,
- int num_fields);
-void FreezeBlock(STREAM stream, const char* name, uint8* block, int size);
-
-int UnfreezeStruct(STREAM stream, const char* name, void* base,
- FreezeData* fields,
- int num_fields);
-int UnfreezeBlock(STREAM stream, const char* name, uint8* block, int size);
-
-int UnfreezeStructCopy(STREAM stream, const char* name, uint8** block,
- FreezeData* fields, int num_fields);
-
-void UnfreezeStructFromCopy(void* base, FreezeData* fields, int num_fields,
- uint8* block);
-
-int UnfreezeBlockCopy(STREAM stream, const char* name, uint8** block, int size);
-
-bool8 Snapshot(const char* filename)
-{
- return (S9xFreezeGame(filename));
-}
-
-bool8 S9xFreezeGame(const char* filename)
-{
- FILE* fp;
- fp = fopen(filename, "w");
- if (NULL == fp)
- return (FALSE);
-
- fseek(fp, 4, SEEK_SET); //Valid data offset 4 bytes
- S9xFreezeToStream(fp);
- fclose(fp);
-#if 0 //Not support moive now
- if (S9xMovieActive())
- {
- sprintf(String, "Movie snapshot %s", S9xBasename(filename));
- S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, String);
- }
- else
- {
- sprintf(String, "Saved %s", S9xBasename(filename));
- S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, String);
- }
-#endif
- return (TRUE);
-}
-
-bool8 S9xLoadSnapshot(const char* filename)
-{
- return (S9xUnfreezeGame(filename));
-}
-
-bool8 S9xUnfreezeGame(const char* filename)
-{
- if (S9xLoadOrigSnapshot(filename))
- return (TRUE);
-
- if (S9xUnfreezeZSNES(filename))
- return (TRUE);
-
- FILE* fp;
- fp = fopen(filename, "r");
- if (NULL == fp)
- return (FALSE);
-
- fseek(fp, 4, SEEK_SET); //Valid data offset 4 bytes
-
- int result;
- if ((result = S9xUnfreezeFromStream(fp)) != SUCCESS)
- {
-#if 0
- switch (result)
- {
- case WRONG_FORMAT:
- S9xMessage(S9X_ERROR, S9X_WRONG_FORMAT,
- "File not in Snes9x freeze format");
- break;
- case WRONG_VERSION:
- S9xMessage(S9X_ERROR, S9X_WRONG_VERSION,
- "Incompatable Snes9x freeze file format version");
- break;
- case WRONG_MOVIE_SNAPSHOT:
- S9xMessage(S9X_ERROR, S9X_WRONG_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_WRONG_MOVIE);
- break;
- case NOT_A_MOVIE_SNAPSHOT:
- S9xMessage(S9X_ERROR, S9X_NOT_A_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_NOT_MOVIE);
- break;
- default:
- case FILE_NOT_FOUND:
- sprintf(String, "ROM image \"%s\" for freeze file not found",
- ROMFilename);
- S9xMessage(S9X_ERROR, S9X_ROM_NOT_FOUND, String);
- break;
- }
-#endif
- fclose(fp);
- return (FALSE);
- }
-#if 0 //Not support movie now
- if (!S9xMovieActive())
- {
- sprintf(String, "Loaded %s", S9xBasename(filename));
- S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, String);
- }
-#endif
- fclose(fp);
- return (TRUE);
-}
-
-void S9xFreezeToStream(STREAM stream)
-{
- char buffer [1024];
- int i;
-
- S9xUpdateRTC();
- S9xSRTCPreSaveState();
-
- for (i = 0; i < 8; i++)
- {
- SoundData.channels [i].previous16 [0] = (int16)
- SoundData.channels [i].previous [0];
- SoundData.channels [i].previous16 [1] = (int16)
- SoundData.channels [i].previous [1];
- }
- sprintf(buffer, "%s:%04d\n", SNAPSHOT_MAGIC, SNAPSHOT_VERSION);
- WRITE_STREAM(buffer, strlen(buffer), stream);
- sprintf(buffer, "NAM:%06d:%s%c", strlen(Memory.ROMFilename) + 1,
- Memory.ROMFilename, 0);
- WRITE_STREAM(buffer, strlen(buffer) + 1, stream);
- FreezeStruct(stream, "CPU", &CPU, SnapCPU, COUNT(SnapCPU));
- FreezeStruct(stream, "REG", &ICPU.Registers, SnapRegisters,
- COUNT(SnapRegisters));
- FreezeStruct(stream, "PPU", &PPU, SnapPPU, COUNT(SnapPPU));
- FreezeStruct(stream, "DMA", DMA, SnapDMA, COUNT(SnapDMA));
-
- // RAM and VRAM
- FreezeBlock(stream, "VRA", Memory.VRAM, 0x10000);
- FreezeBlock(stream, "RAM", Memory.RAM, 0x20000);
- FreezeBlock(stream, "SRA", Memory.SRAM, 0x20000);
- FreezeBlock(stream, "FIL", Memory.FillRAM, 0x8000);
- if (Settings.APUEnabled)
- {
- // APU
- FreezeStruct(stream, "APU", &APU, SnapAPU, COUNT(SnapAPU));
- FreezeStruct(stream, "ARE", &IAPU.Registers, SnapAPURegisters,
- COUNT(SnapAPURegisters));
- FreezeBlock(stream, "ARA", IAPU.RAM, 0x10000);
- FreezeStruct(stream, "SOU", &SoundData, SnapSoundData,
- COUNT(SnapSoundData));
- }
- if (Settings.SA1)
- {
- SA1.Registers.PC = SA1.PC - SA1.PCBase;
- S9xSA1PackStatus();
- FreezeStruct(stream, "SA1", &SA1, SnapSA1, COUNT(SnapSA1));
- FreezeStruct(stream, "SAR", &SA1.Registers, SnapSA1Registers,
- COUNT(SnapSA1Registers));
- }
-
- if (Settings.SPC7110)
- FreezeStruct(stream, "SP7", &s7r, SnapSPC7110, COUNT(SnapSPC7110));
- if (Settings.SPC7110RTC)
- FreezeStruct(stream, "RTC", &rtc_f9, SnapS7RTC, COUNT(SnapS7RTC));
-}
-
-int S9xUnfreezeFromStream(STREAM stream)
-{
- char buffer [_MAX_PATH + 1];
- char rom_filename [_MAX_PATH + 1];
- int result;
-
- int version;
- unsigned int len = strlen(SNAPSHOT_MAGIC) + 1 + 4 + 1;
- if (READ_STREAM(buffer, len, stream) != len)
- return (WRONG_FORMAT);
- if (strncmp(buffer, SNAPSHOT_MAGIC, strlen(SNAPSHOT_MAGIC)) != 0)
- return (WRONG_FORMAT);
- if ((version = atoi(&buffer [strlen(SNAPSHOT_MAGIC) + 1])) > SNAPSHOT_VERSION)
- return (WRONG_VERSION);
-
- if ((result = UnfreezeBlock(stream, "NAM", (uint8*) rom_filename,
- _MAX_PATH)) != SUCCESS)
- return (result);
-
- if (strcasecmp(rom_filename, Memory.ROMFilename) != 0 &&
- strcasecmp(S9xBasename(rom_filename), S9xBasename(Memory.ROMFilename)) != 0)
- {
- S9xMessage(S9X_WARNING, S9X_FREEZE_ROM_NAME,
- "Current loaded ROM image doesn't match that required by freeze-game file.");
- }
-
- // ## begin load ##
- uint8* local_cpu = NULL;
- uint8* local_registers = NULL;
- uint8* local_ppu = NULL;
- uint8* local_dma = NULL;
- uint8* local_vram = NULL;
- uint8* local_ram = NULL;
- uint8* local_sram = NULL;
- uint8* local_fillram = NULL;
- uint8* local_apu = NULL;
- uint8* local_apu_registers = NULL;
- uint8* local_apu_ram = NULL;
- uint8* local_apu_sounddata = NULL;
- uint8* local_sa1 = NULL;
- uint8* local_sa1_registers = NULL;
- uint8* local_spc = NULL;
- uint8* local_spc_rtc = NULL;
- uint8* local_movie_data = NULL;
-
- do
- {
- if ((result = UnfreezeStructCopy(stream, "CPU", &local_cpu, SnapCPU,
- COUNT(SnapCPU))) != SUCCESS)
- break;
- if ((result = UnfreezeStructCopy(stream, "REG", &local_registers, SnapRegisters,
- COUNT(SnapRegisters))) != SUCCESS)
- break;
- if ((result = UnfreezeStructCopy(stream, "PPU", &local_ppu, SnapPPU,
- COUNT(SnapPPU))) != SUCCESS)
- break;
- if ((result = UnfreezeStructCopy(stream, "DMA", &local_dma, SnapDMA,
- COUNT(SnapDMA))) != SUCCESS)
- break;
- if ((result = UnfreezeBlockCopy(stream, "VRA", &local_vram,
- 0x10000)) != SUCCESS)
- break;
- if ((result = UnfreezeBlockCopy(stream, "RAM", &local_ram, 0x20000)) != SUCCESS)
- break;
- if ((result = UnfreezeBlockCopy(stream, "SRA", &local_sram,
- 0x20000)) != SUCCESS)
- break;
- if ((result = UnfreezeBlockCopy(stream, "FIL", &local_fillram,
- 0x8000)) != SUCCESS)
- break;
- if (UnfreezeStructCopy(stream, "APU", &local_apu, SnapAPU,
- COUNT(SnapAPU)) == SUCCESS)
- {
- if ((result = UnfreezeStructCopy(stream, "ARE", &local_apu_registers,
- SnapAPURegisters, COUNT(SnapAPURegisters))) != SUCCESS)
- break;
- if ((result = UnfreezeBlockCopy(stream, "ARA", &local_apu_ram,
- 0x10000)) != SUCCESS)
- break;
- if ((result = UnfreezeStructCopy(stream, "SOU", &local_apu_sounddata,
- SnapSoundData, COUNT(SnapSoundData))) != SUCCESS)
- break;
- }
- if ((result = UnfreezeStructCopy(stream, "SA1", &local_sa1, SnapSA1,
- COUNT(SnapSA1))) == SUCCESS)
- {
- if ((result = UnfreezeStructCopy(stream, "SAR", &local_sa1_registers,
- SnapSA1Registers, COUNT(SnapSA1Registers))) != SUCCESS)
- break;
- }
-
- if ((result = UnfreezeStructCopy(stream, "SP7", &local_spc, SnapSPC7110,
- COUNT(SnapSPC7110))) != SUCCESS)
- {
- if (Settings.SPC7110)
- break;
- }
- if ((result = UnfreezeStructCopy(stream, "RTC", &local_spc_rtc, SnapS7RTC,
- COUNT(SnapS7RTC))) != SUCCESS)
- {
- if (Settings.SPC7110RTC)
- break;
- }
-
- result = SUCCESS;
-
- }
- while (false);
- // ## end load ##
-
- if (result == SUCCESS)
- {
- uint32 old_flags = CPU.Flags;
- uint32 sa1_old_flags = SA1.Flags;
- S9xReset();
-
- UnfreezeStructFromCopy(&CPU, SnapCPU, COUNT(SnapCPU), local_cpu);
- UnfreezeStructFromCopy(&ICPU.Registers, SnapRegisters, COUNT(SnapRegisters),
- local_registers);
- UnfreezeStructFromCopy(&PPU, SnapPPU, COUNT(SnapPPU), local_ppu);
- UnfreezeStructFromCopy(DMA, SnapDMA, COUNT(SnapDMA), local_dma);
- memcpy(Memory.VRAM, local_vram, 0x10000);
- memcpy(Memory.RAM, local_ram, 0x20000);
- memcpy(Memory.SRAM, local_sram, 0x20000);
- memcpy(Memory.FillRAM, local_fillram, 0x8000);
- if (local_apu)
- {
- UnfreezeStructFromCopy(&APU, SnapAPU, COUNT(SnapAPU), local_apu);
- UnfreezeStructFromCopy(&IAPU.Registers, SnapAPURegisters,
- COUNT(SnapAPURegisters), local_apu_registers);
- memcpy(IAPU.RAM, local_apu_ram, 0x10000);
- UnfreezeStructFromCopy(&SoundData, SnapSoundData, COUNT(SnapSoundData),
- local_apu_sounddata);
- }
- if (local_sa1)
- {
- UnfreezeStructFromCopy(&SA1, SnapSA1, COUNT(SnapSA1), local_sa1);
- UnfreezeStructFromCopy(&SA1.Registers, SnapSA1Registers,
- COUNT(SnapSA1Registers), local_sa1_registers);
- }
- if (local_spc)
- UnfreezeStructFromCopy(&s7r, SnapSPC7110, COUNT(SnapSPC7110), local_spc);
- if (local_spc_rtc)
- UnfreezeStructFromCopy(&rtc_f9, SnapS7RTC, COUNT(SnapS7RTC), local_spc_rtc);
-
- FixROMSpeed();
- CPU.Flags |= old_flags & (DEBUG_MODE_FLAG | TRACE_FLAG |
- SINGLE_STEP_FLAG | FRAME_ADVANCE_FLAG);
-
- IPPU.ColorsChanged = TRUE;
- IPPU.OBJChanged = TRUE;
- CPU.InDMA = FALSE;
- S9xFixColourBrightness();
- IPPU.RenderThisFrame = FALSE;
-
- if (local_apu)
- {
- IAPU.PC = IAPU.RAM + IAPU.Registers.PC;
- S9xAPUUnpackStatus();
- if (APUCheckDirectPage())
- IAPU.DirectPage = IAPU.RAM + 0x100;
- else
- IAPU.DirectPage = IAPU.RAM;
- Settings.APUEnabled = TRUE;
- IAPU.APUExecuting = TRUE;
- }
- else
- {
- Settings.APUEnabled = FALSE;
- IAPU.APUExecuting = FALSE;
- }
-
- if (local_sa1)
- {
- S9xFixSA1AfterSnapshotLoad();
- SA1.Flags |= sa1_old_flags & (TRACE_FLAG);
- }
-
- if (local_spc_rtc)
- S9xUpdateRTC();
-
- S9xFixSoundAfterSnapshotLoad();
-
- uint8 hdma_byte = Memory.FillRAM[0x420c];
- S9xSetCPU(hdma_byte, 0x420c);
-
- if (!Memory.FillRAM[0x4213])
- {
- // most likely an old savestate
- Memory.FillRAM[0x4213] = Memory.FillRAM[0x4201];
- if (!Memory.FillRAM[0x4213])
- Memory.FillRAM[0x4213] = Memory.FillRAM[0x4201] = 0xFF;
- }
-
- ICPU.ShiftedPB = ICPU.Registers.PB << 16;
- ICPU.ShiftedDB = ICPU.Registers.DB << 16;
- S9xSetPCBase(ICPU.ShiftedPB + ICPU.Registers.PC);
- S9xUnpackStatus();
- S9xFixCycles();
- // S9xReschedule (); // <-- this causes desync when recording or playing movies
-
- S9xSRTCPostLoadState();
- if (Settings.SDD1)
- S9xSDD1PostLoadState();
- }
-
- if (local_cpu) free(local_cpu);
- if (local_registers) free(local_registers);
- if (local_ppu) free(local_ppu);
- if (local_dma) free(local_dma);
- if (local_vram) free(local_vram);
- if (local_ram) free(local_ram);
- if (local_sram) free(local_sram);
- if (local_fillram) free(local_fillram);
- if (local_apu) free(local_apu);
- if (local_apu_registers) free(local_apu_registers);
- if (local_apu_ram) free(local_apu_ram);
- if (local_apu_sounddata) free(local_apu_sounddata);
- if (local_sa1) free(local_sa1);
- if (local_sa1_registers) free(local_sa1_registers);
- if (local_spc) free(local_spc);
- if (local_spc_rtc) free(local_spc_rtc);
- if (local_movie_data) free(local_movie_data);
-
- return (result);
-}
-
-int FreezeSize(int size, int type)
-{
- switch (type)
- {
- case uint16_ARRAY_V:
- return (size * 2);
- case uint32_ARRAY_V:
- return (size * 4);
- default:
- return (size);
- }
-}
-
-void FreezeStruct(STREAM stream, const char* name, void* base,
- FreezeData* fields,
- int num_fields)
-{
- // Work out the size of the required block
- int len = 0;
- int i;
- int j;
-
- for (i = 0; i < num_fields; i++)
- {
- if (fields [i].offset + FreezeSize(fields [i].size,
- fields [i].type) > len)
- len = fields [i].offset + FreezeSize(fields [i].size,
- fields [i].type);
- }
-
- uint8* block = (uint8*) malloc(len);
- uint8* ptr = block;
- uint16 word;
- uint32 dword;
- int64 qword;
-
- // Build the block ready to be streamed out
- for (i = 0; i < num_fields; i++)
- {
- switch (fields [i].type)
- {
- case INT_V:
- switch (fields [i].size)
- {
- case 1:
- *ptr++ = *((uint8*) base + fields [i].offset);
- break;
- case 2:
- word = *((uint16*)((uint8*) base + fields [i].offset));
- *ptr++ = (uint8)(word >> 8);
- *ptr++ = (uint8) word;
- break;
- case 4:
- dword = *((uint32*)((uint8*) base + fields [i].offset));
- *ptr++ = (uint8)(dword >> 24);
- *ptr++ = (uint8)(dword >> 16);
- *ptr++ = (uint8)(dword >> 8);
- *ptr++ = (uint8) dword;
- break;
- case 8:
- qword = *((int64*)((uint8*) base + fields [i].offset));
- *ptr++ = (uint8)(qword >> 56);
- *ptr++ = (uint8)(qword >> 48);
- *ptr++ = (uint8)(qword >> 40);
- *ptr++ = (uint8)(qword >> 32);
- *ptr++ = (uint8)(qword >> 24);
- *ptr++ = (uint8)(qword >> 16);
- *ptr++ = (uint8)(qword >> 8);
- *ptr++ = (uint8) qword;
- break;
- }
- break;
- case uint8_ARRAY_V:
- // memmove converted: Different mallocs [Neb]
- memcpy(ptr, (uint8*) base + fields [i].offset, fields [i].size);
- ptr += fields [i].size;
- break;
- case uint16_ARRAY_V:
- for (j = 0; j < fields [i].size; j++)
- {
- word = *((uint16*)((uint8*) base + fields [i].offset + j * 2));
- *ptr++ = (uint8)(word >> 8);
- *ptr++ = (uint8) word;
- }
- break;
- case uint32_ARRAY_V:
- for (j = 0; j < fields [i].size; j++)
- {
- dword = *((uint32*)((uint8*) base + fields [i].offset + j * 4));
- *ptr++ = (uint8)(dword >> 24);
- *ptr++ = (uint8)(dword >> 16);
- *ptr++ = (uint8)(dword >> 8);
- *ptr++ = (uint8) dword;
- }
- break;
- }
- }
-
- FreezeBlock(stream, name, block, len);
- free(block);
-}
-
-void FreezeBlock(STREAM stream, const char* name, uint8* block, int size)
-{
- char buffer [512];
- sprintf(buffer, "%s:%06d:", name, size);
- WRITE_STREAM(buffer, strlen(buffer), stream);
- WRITE_STREAM((char*)block, size, stream);
-
-}
-
-int UnfreezeStruct(STREAM stream, const char* name, void* base,
- FreezeData* fields,
- int num_fields)
-{
- // Work out the size of the required block
- int len = 0;
- int i;
- int j;
-
- for (i = 0; i < num_fields; i++)
- {
- if (fields [i].offset + FreezeSize(fields [i].size,
- fields [i].type) > len)
- len = fields [i].offset + FreezeSize(fields [i].size,
- fields [i].type);
- }
-
- uint8* block = (uint8*) malloc(len);
- uint8* ptr = block;
- uint16 word;
- uint32 dword;
- int64 qword;
- int result;
-
- if ((result = UnfreezeBlock(stream, name, block, len)) != SUCCESS)
- {
- free(block);
- return (result);
- }
-
- // Unpack the block of data into a C structure
- for (i = 0; i < num_fields; i++)
- {
- switch (fields [i].type)
- {
- case INT_V:
- switch (fields [i].size)
- {
- case 1:
- *((uint8*) base + fields [i].offset) = *ptr++;
- break;
- case 2:
- word = *ptr++ << 8;
- word |= *ptr++;
- *((uint16*)((uint8*) base + fields [i].offset)) = word;
- break;
- case 4:
- dword = *ptr++ << 24;
- dword |= *ptr++ << 16;
- dword |= *ptr++ << 8;
- dword |= *ptr++;
- *((uint32*)((uint8*) base + fields [i].offset)) = dword;
- break;
- case 8:
- qword = (int64) * ptr++ << 56;
- qword |= (int64) * ptr++ << 48;
- qword |= (int64) * ptr++ << 40;
- qword |= (int64) * ptr++ << 32;
- qword |= (int64) * ptr++ << 24;
- qword |= (int64) * ptr++ << 16;
- qword |= (int64) * ptr++ << 8;
- qword |= (int64) * ptr++;
- *((int64*)((uint8*) base + fields [i].offset)) = qword;
- break;
- }
- break;
- case uint8_ARRAY_V:
- // memmove converted: Different mallocs [Neb]
- memcpy((uint8*) base + fields [i].offset, ptr, fields [i].size);
- ptr += fields [i].size;
- break;
- case uint16_ARRAY_V:
- for (j = 0; j < fields [i].size; j++)
- {
- word = *ptr++ << 8;
- word |= *ptr++;
- *((uint16*)((uint8*) base + fields [i].offset + j * 2)) = word;
- }
- break;
- case uint32_ARRAY_V:
- for (j = 0; j < fields [i].size; j++)
- {
- dword = *ptr++ << 24;
- dword |= *ptr++ << 16;
- dword |= *ptr++ << 8;
- dword |= *ptr++;
- *((uint32*)((uint8*) base + fields [i].offset + j * 4)) = dword;
- }
- break;
- }
- }
-
- free(block);
- return (result);
-}
-
-int UnfreezeBlock(STREAM stream, const char* name, uint8* block, int size)
-{
- char buffer [20];
- int len = 0;
- int rem = 0;
- int rew_len;
- if (READ_STREAM(buffer, 11, stream) != 11 ||
- strncmp(buffer, name, 3) != 0 || buffer [3] != ':' ||
- (len = atoi(&buffer [4])) == 0)
- {
- REVERT_STREAM(stream, FIND_STREAM(stream) - 11, 0);
- return (WRONG_FORMAT);
- }
-
- if (len > size)
- {
- rem = len - size;
- len = size;
- }
- if ((rew_len = READ_STREAM((char*)block, len, stream)) != len)
- {
- REVERT_STREAM(stream, FIND_STREAM(stream) - 11 - rew_len, 0);
- return (WRONG_FORMAT);
- }
- if (rem)
- {
- char* junk = (char*) malloc(rem);
- READ_STREAM(junk, rem, stream);
- free(junk);
- }
-
- return (SUCCESS);
-}
-
-int UnfreezeStructCopy(STREAM stream, const char* name, uint8** block,
- FreezeData* fields, int num_fields)
-{
- // Work out the size of the required block
- int len = 0;
- int i;
-
- for (i = 0; i < num_fields; i++)
- {
- if (fields [i].offset + FreezeSize(fields [i].size,
- fields [i].type) > len)
- len = fields [i].offset + FreezeSize(fields [i].size,
- fields [i].type);
- }
-
- return (UnfreezeBlockCopy(stream, name, block, len));
-}
-
-void UnfreezeStructFromCopy(void* base, FreezeData* fields, int num_fields,
- uint8* block)
-{
- int i;
- int j;
- uint8* ptr = block;
- uint16 word;
- uint32 dword;
- int64 qword;
-
- // Unpack the block of data into a C structure
- for (i = 0; i < num_fields; i++)
- {
- switch (fields [i].type)
- {
- case INT_V:
- switch (fields [i].size)
- {
- case 1:
- *((uint8*) base + fields [i].offset) = *ptr++;
- break;
- case 2:
- word = *ptr++ << 8;
- word |= *ptr++;
- *((uint16*)((uint8*) base + fields [i].offset)) = word;
- break;
- case 4:
- dword = *ptr++ << 24;
- dword |= *ptr++ << 16;
- dword |= *ptr++ << 8;
- dword |= *ptr++;
- *((uint32*)((uint8*) base + fields [i].offset)) = dword;
- break;
- case 8:
- qword = (int64) * ptr++ << 56;
- qword |= (int64) * ptr++ << 48;
- qword |= (int64) * ptr++ << 40;
- qword |= (int64) * ptr++ << 32;
- qword |= (int64) * ptr++ << 24;
- qword |= (int64) * ptr++ << 16;
- qword |= (int64) * ptr++ << 8;
- qword |= (int64) * ptr++;
- *((int64*)((uint8*) base + fields [i].offset)) = qword;
- break;
- }
- break;
- case uint8_ARRAY_V:
- // memmove required: Source could point within dest [Neb]
- memmove((uint8*) base + fields [i].offset, ptr, fields [i].size);
- ptr += fields [i].size;
- break;
- case uint16_ARRAY_V:
- for (j = 0; j < fields [i].size; j++)
- {
- word = *ptr++ << 8;
- word |= *ptr++;
- *((uint16*)((uint8*) base + fields [i].offset + j * 2)) = word;
- }
- break;
- case uint32_ARRAY_V:
- for (j = 0; j < fields [i].size; j++)
- {
- dword = *ptr++ << 24;
- dword |= *ptr++ << 16;
- dword |= *ptr++ << 8;
- dword |= *ptr++;
- *((uint32*)((uint8*) base + fields [i].offset + j * 4)) = dword;
- }
- break;
- }
- }
-}
-
-int UnfreezeBlockCopy(STREAM stream, const char* name, uint8** block, int size)
-{
- *block = (uint8*) malloc(size);
- int result;
-
- if ((result = UnfreezeBlock(stream, name, *block, size)) != SUCCESS)
- {
- free((*block));
- *block = NULL;
- return (result);
- }
-
- return (result);
-}
-
-extern uint8 spc_dump_dsp[0x100];
-
-bool8 S9xSPCDump(const char* filename)
-{
- return (FALSE);
-#if 0
- static uint8 header [] =
- {
- 'S', 'N', 'E', 'S', '-', 'S', 'P', 'C', '7', '0', '0', ' ',
- 'S', 'o', 'u', 'n', 'd', ' ', 'F', 'i', 'l', 'e', ' ',
- 'D', 'a', 't', 'a', ' ', 'v', '0', '.', '3', '0', 26, 26, 26
- };
- static uint8 version =
- {
- 0x1e
- };
-
- FILE* fs;
-
-
- if (!(fs = fopen(filename, "wb")))
- return (FALSE);
-
- // The SPC file format:
- // 0000: header: 'SNES-SPC700 Sound File Data v0.30',26,26,26
- // 0036: version: $1e
- // 0037: SPC700 PC:
- // 0039: SPC700 A:
- // 0040: SPC700 X:
- // 0041: SPC700 Y:
- // 0042: SPC700 P:
- // 0043: SPC700 S:
- // 0044: Reserved: 0, 0, 0, 0
- // 0048: Title of game: 32 bytes
- // 0000: Song name: 32 bytes
- // 0000: Name of dumper: 32 bytes
- // 0000: Comments: 32 bytes
- // 0000: Date of SPC dump: 4 bytes
- // 0000: Fade out time in milliseconds: 4 bytes
- // 0000: Fade out length in milliseconds: 2 bytes
- // 0000: Default channel enables: 1 bytes
- // 0000: Emulator used to dump .SPC files: 1 byte, 1 == ZSNES
- // 0000: Reserved: 36 bytes
- // 0256: SPC700 RAM: 64K
- // ----: DSP Registers: 256 bytes
-
- if (fwrite(header, sizeof(header), 1, fs) != 1 ||
- fputc(version, fs) == EOF ||
- fseek(fs, 37, SEEK_SET) == EOF ||
- fputc(APURegisters.PC & 0xff, fs) == EOF ||
- fputc(APURegisters.PC >> 8, fs) == EOF ||
- fputc(APURegisters.YA.B.A, fs) == EOF ||
- fputc(APURegisters.X, fs) == EOF ||
- fputc(APURegisters.YA.B.Y, fs) == EOF ||
- fputc(APURegisters.P, fs) == EOF ||
- fputc(APURegisters.S, fs) == EOF ||
- fseek(fs, 256, SEEK_SET) == EOF ||
- fwrite(IAPU.RAM, 0x10000, 1, fs) != 1 ||
- fwrite(spc_dump_dsp, 1, 256, fs) != 256 ||
- fwrite(APU.ExtraRAM, 64, 1, fs) != 1 ||
- fclose(fs) < 0)
- {
- return (FALSE);
- }
- return (TRUE);
-#endif
-}
-
-bool8 S9xUnfreezeZSNES(const char* filename)
-{
- FILE* fs;
- uint8 t [4000];
-
- if (!(fs = fopen(filename, "rb")))
- return (FALSE);
-
- if (fread((char*)t, 64, 1, fs) == 1 &&
- strncmp((char*) t, "ZSNES Save State File V0.6", 26) == 0)
- {
- S9xReset();
-
- // 28 Curr cycle
- CPU.V_Counter = READ_WORD(&t [29]);
- // 33 instrset
- Settings.APUEnabled = t [36];
-
- // 34 bcycpl cycles per scanline
- // 35 cycphb cyclers per hblank
-
- ICPU.Registers.A.W = READ_WORD(&t [41]);
- ICPU.Registers.DB = t [43];
- ICPU.Registers.PB = t [44];
- ICPU.Registers.S.W = READ_WORD(&t [45]);
- ICPU.Registers.D.W = READ_WORD(&t [47]);
- ICPU.Registers.X.W = READ_WORD(&t [49]);
- ICPU.Registers.Y.W = READ_WORD(&t [51]);
- ICPU.Registers.P.W = READ_WORD(&t [53]);
- ICPU.Registers.PC = READ_WORD(&t [55]);
-
- fread((char*)t, 1, 8, fs);
- fread((char*)t, 1, 3019, fs);
- S9xSetCPU(t [2], 0x4200);
- Memory.FillRAM [0x4210] = t [3];
- PPU.IRQVBeamPos = READ_WORD(&t [4]);
- PPU.IRQHBeamPos = READ_WORD(&t [2527]);
- PPU.Brightness = t [6];
- PPU.ForcedBlanking = t [8] >> 7;
-
- int i;
- for (i = 0; i < 544; i++)
- S9xSetPPU(t [0464 + i], 0x2104);
-
- PPU.OBJNameBase = READ_WORD(&t [9]);
- PPU.OBJNameSelect = READ_WORD(&t [13]) - PPU.OBJNameBase;
- switch (t [18])
- {
- case 4:
- if (t [17] == 1)
- PPU.OBJSizeSelect = 0;
- else
- PPU.OBJSizeSelect = 6;
- break;
- case 16:
- if (t [17] == 1)
- PPU.OBJSizeSelect = 1;
- else
- PPU.OBJSizeSelect = 3;
- break;
- default:
- case 64:
- if (t [17] == 1)
- PPU.OBJSizeSelect = 2;
- else if (t [17] == 4)
- PPU.OBJSizeSelect = 4;
- else
- PPU.OBJSizeSelect = 5;
- break;
- }
- PPU.OAMAddr = READ_WORD(&t [25]);
- PPU.SavedOAMAddr = READ_WORD(&t [27]);
- PPU.FirstSprite = t [29];
- PPU.BGMode = t [30];
- PPU.BG3Priority = t [31];
- PPU.BG[0].BGSize = (t [32] >> 0) & 1;
- PPU.BG[1].BGSize = (t [32] >> 1) & 1;
- PPU.BG[2].BGSize = (t [32] >> 2) & 1;
- PPU.BG[3].BGSize = (t [32] >> 3) & 1;
- PPU.Mosaic = t [33] + 1;
- PPU.BGMosaic [0] = (t [34] & 1) != 0;
- PPU.BGMosaic [1] = (t [34] & 2) != 0;
- PPU.BGMosaic [2] = (t [34] & 4) != 0;
- PPU.BGMosaic [3] = (t [34] & 8) != 0;
- PPU.BG [0].SCBase = READ_WORD(&t [35]) >> 1;
- PPU.BG [1].SCBase = READ_WORD(&t [37]) >> 1;
- PPU.BG [2].SCBase = READ_WORD(&t [39]) >> 1;
- PPU.BG [3].SCBase = READ_WORD(&t [41]) >> 1;
- PPU.BG [0].SCSize = t [67];
- PPU.BG [1].SCSize = t [68];
- PPU.BG [2].SCSize = t [69];
- PPU.BG [3].SCSize = t [70];
- PPU.BG[0].NameBase = READ_WORD(&t [71]) >> 1;
- PPU.BG[1].NameBase = READ_WORD(&t [73]) >> 1;
- PPU.BG[2].NameBase = READ_WORD(&t [75]) >> 1;
- PPU.BG[3].NameBase = READ_WORD(&t [77]) >> 1;
- PPU.BG[0].HOffset = READ_WORD(&t [79]);
- PPU.BG[1].HOffset = READ_WORD(&t [81]);
- PPU.BG[2].HOffset = READ_WORD(&t [83]);
- PPU.BG[3].HOffset = READ_WORD(&t [85]);
- PPU.BG[0].VOffset = READ_WORD(&t [89]);
- PPU.BG[1].VOffset = READ_WORD(&t [91]);
- PPU.BG[2].VOffset = READ_WORD(&t [93]);
- PPU.BG[3].VOffset = READ_WORD(&t [95]);
- PPU.VMA.Increment = READ_WORD(&t [97]) >> 1;
- PPU.VMA.High = t [99];
-#ifndef CORRECT_VRAM_READS
- IPPU.FirstVRAMRead = t [100];
-#endif
- S9xSetPPU(t [2512], 0x2115);
- PPU.VMA.Address = READ_DWORD(&t [101]);
- for (i = 0; i < 512; i++)
- S9xSetPPU(t [1488 + i], 0x2122);
-
- PPU.CGADD = (uint8) READ_WORD(&t [105]);
- Memory.FillRAM [0x212c] = t [108];
- Memory.FillRAM [0x212d] = t [109];
- PPU.ScreenHeight = READ_WORD(&t [111]);
- Memory.FillRAM [0x2133] = t [2526];
- Memory.FillRAM [0x4202] = t [113];
- Memory.FillRAM [0x4204] = t [114];
- Memory.FillRAM [0x4205] = t [115];
- Memory.FillRAM [0x4214] = t [116];
- Memory.FillRAM [0x4215] = t [117];
- Memory.FillRAM [0x4216] = t [118];
- Memory.FillRAM [0x4217] = t [119];
- PPU.VBeamPosLatched = READ_WORD(&t [122]);
- PPU.HBeamPosLatched = READ_WORD(&t [120]);
- PPU.Window1Left = t [127];
- PPU.Window1Right = t [128];
- PPU.Window2Left = t [129];
- PPU.Window2Right = t [130];
- S9xSetPPU(t [131] | (t [132] << 4), 0x2123);
- S9xSetPPU(t [133] | (t [134] << 4), 0x2124);
- S9xSetPPU(t [135] | (t [136] << 4), 0x2125);
- S9xSetPPU(t [137], 0x212a);
- S9xSetPPU(t [138], 0x212b);
- S9xSetPPU(t [139], 0x212e);
- S9xSetPPU(t [140], 0x212f);
- S9xSetPPU(t [141], 0x211a);
- PPU.MatrixA = READ_WORD(&t [142]);
- PPU.MatrixB = READ_WORD(&t [144]);
- PPU.MatrixC = READ_WORD(&t [146]);
- PPU.MatrixD = READ_WORD(&t [148]);
- PPU.CentreX = READ_WORD(&t [150]);
- PPU.CentreY = READ_WORD(&t [152]);
- // JoyAPos t[154]
- // JoyBPos t[155]
- Memory.FillRAM [0x2134] = t [156]; // Matrix mult
- Memory.FillRAM [0x2135] = t [157]; // Matrix mult
- Memory.FillRAM [0x2136] = t [158]; // Matrix mult
- PPU.WRAM = READ_DWORD(&t [161]);
-
- for (i = 0; i < 128; i++)
- S9xSetCPU(t [165 + i], 0x4300 + i);
-
- if (t [294])
- CPU.IRQActive |= PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE;
-
- S9xSetCPU(t [296], 0x420c);
- // hdmadata t[297] + 8 * 19
- PPU.FixedColourRed = t [450];
- PPU.FixedColourGreen = t [451];
- PPU.FixedColourBlue = t [452];
- S9xSetPPU(t [454], 0x2130);
- S9xSetPPU(t [455], 0x2131);
- // vraminctype ...
-
- fread((char*)Memory.RAM, 1, 128 * 1024, fs);
- fread((char*)Memory.VRAM, 1, 64 * 1024, fs);
-
- if (Settings.APUEnabled)
- {
- // SNES SPC700 RAM (64K)
- fread((char*)IAPU.RAM, 1, 64 * 1024, fs);
-
- // Junk 16 bytes
- fread((char*)t, 1, 16, fs);
-
- // SNES SPC700 state and internal ZSNES SPC700 emulation state
- fread((char*)t, 1, 304, fs);
-
- IAPU.Registers.PC = READ_DWORD(&t [0]);
- IAPU.Registers.YA.B.A = t [4];
- IAPU.Registers.X = t [8];
- IAPU.Registers.YA.B.Y = t [12];
- IAPU.Registers.P = t [16];
- IAPU.Registers.S = t [24];
-
- APU.Cycles = READ_DWORD(&t [32]);
- APU.ShowROM = (IAPU.RAM [0xf1] & 0x80) != 0;
- APU.OutPorts [0] = t [36];
- APU.OutPorts [1] = t [37];
- APU.OutPorts [2] = t [38];
- APU.OutPorts [3] = t [39];
-
- APU.TimerEnabled [0] = (t [40] & 1) != 0;
- APU.TimerEnabled [1] = (t [40] & 2) != 0;
- APU.TimerEnabled [2] = (t [40] & 4) != 0;
- S9xSetAPUTimer(0xfa, t [41]);
- S9xSetAPUTimer(0xfb, t [42]);
- S9xSetAPUTimer(0xfc, t [43]);
- APU.Timer [0] = t [44];
- APU.Timer [1] = t [45];
- APU.Timer [2] = t [46];
-
- // memmove converted: Different mallocs [Neb]
- memcpy(APU.ExtraRAM, &t [48], 64);
-
- // Internal ZSNES sound DSP state
- fread(t, 1, 1068, fs);
-
- // SNES sound DSP register values
- fread(t, 1, 256, fs);
-
- uint8 saved = IAPU.RAM [0xf2];
-
- for (i = 0; i < 128; i++)
- {
- switch (i)
- {
- case APU_KON:
- case APU_KOFF:
- break;
- case APU_FLG:
- t [i] &= ~APU_SOFT_RESET;
- default:
- IAPU.RAM [0xf2] = i;
- S9xSetAPUDSP(t [i]);
- break;
- }
- }
- IAPU.RAM [0xf2] = APU_KON;
- S9xSetAPUDSP(t [APU_KON]);
- IAPU.RAM [0xf2] = saved;
-
- IAPU.PC = IAPU.RAM + IAPU.Registers.PC;
- S9xAPUUnpackStatus();
- if (APUCheckDirectPage())
- IAPU.DirectPage = IAPU.RAM + 0x100;
- else
- IAPU.DirectPage = IAPU.RAM;
- Settings.APUEnabled = TRUE;
- IAPU.APUExecuting = TRUE;
- }
- else
- {
- Settings.APUEnabled = FALSE;
- IAPU.APUExecuting = FALSE;
- }
-
- if (Settings.SuperFX)
- {
- fread(Memory.SRAM, 1, 64 * 1024, fs);
- fseek(fs, 64 * 1024, SEEK_CUR);
- fread(Memory.FillRAM + 0x7000, 1, 692, fs);
- }
- if (Settings.SA1)
- {
- fread(t, 1, 2741, fs);
- S9xSetSA1(t [4], 0x2200); // Control
- S9xSetSA1(t [12], 0x2203); // ResetV low
- S9xSetSA1(t [13], 0x2204); // ResetV hi
- S9xSetSA1(t [14], 0x2205); // NMI low
- S9xSetSA1(t [15], 0x2206); // NMI hi
- S9xSetSA1(t [16], 0x2207); // IRQ low
- S9xSetSA1(t [17], 0x2208); // IRQ hi
- S9xSetSA1(((READ_DWORD(&t [28]) - (4096 * 1024 - 0x6000))) >> 13, 0x2224);
- S9xSetSA1(t [36], 0x2201);
- S9xSetSA1(t [41], 0x2209);
-
- SA1.Registers.A.W = READ_DWORD(&t [592]);
- SA1.Registers.X.W = READ_DWORD(&t [596]);
- SA1.Registers.Y.W = READ_DWORD(&t [600]);
- SA1.Registers.D.W = READ_DWORD(&t [604]);
- SA1.Registers.DB = t [608];
- SA1.Registers.PB = t [612];
- SA1.Registers.S.W = READ_DWORD(&t [616]);
- SA1.Registers.PC = READ_DWORD(&t [636]);
- SA1.Registers.P.W = t [620] | (t [624] << 8);
-
- // memmove converted: Different mallocs [Neb]
- // DS2 DMA notes: This code path is not used [Neb]
- memcpy(&Memory.FillRAM [0x3000], t + 692, 2 * 1024);
-
- fread(Memory.SRAM, 1, 64 * 1024, fs);
- fseek(fs, 64 * 1024, SEEK_CUR);
- S9xFixSA1AfterSnapshotLoad();
- }
- if (Settings.SPC7110)
- {
- uint32 temp;
- fread(&s7r.bank50, 1, 0x10000, fs);
-
- //NEWSYM SPCMultA, dd 0 4820-23
- fread(&temp, 1, 4, fs);
-
- s7r.reg4820 = temp & (0x0FF);
- s7r.reg4821 = (temp >> 8) & (0x0FF);
- s7r.reg4822 = (temp >> 16) & (0x0FF);
- s7r.reg4823 = (temp >> 24) & (0x0FF);
-
- //NEWSYM SPCMultB, dd 0 4824-5
- fread(&temp, 1, 4, fs);
- s7r.reg4824 = temp & (0x0FF);
- s7r.reg4825 = (temp >> 8) & (0x0FF);
-
-
- //NEWSYM SPCDivEnd, dd 0 4826-7
- fread(&temp, 1, 4, fs);
- s7r.reg4826 = temp & (0x0FF);
- s7r.reg4827 = (temp >> 8) & (0x0FF);
-
- //NEWSYM SPCMulRes, dd 0 4828-B
- fread(&temp, 1, 4, fs);
-
- s7r.reg4828 = temp & (0x0FF);
- s7r.reg4829 = (temp >> 8) & (0x0FF);
- s7r.reg482A = (temp >> 16) & (0x0FF);
- s7r.reg482B = (temp >> 24) & (0x0FF);
-
- //NEWSYM SPCDivRes, dd 0 482C-D
- fread(&temp, 1, 4, fs);
- s7r.reg482C = temp & (0x0FF);
- s7r.reg482D = (temp >> 8) & (0x0FF);
-
- //NEWSYM SPC7110BankA, dd 020100h 4831-3
- fread(&temp, 1, 4, fs);
-
- s7r.reg4831 = temp & (0x0FF);
- s7r.reg4832 = (temp >> 8) & (0x0FF);
- s7r.reg4833 = (temp >> 16) & (0x0FF);
-
- //NEWSYM SPC7110RTCStat, dd 0 4840,init,command, index
- fread(&temp, 1, 4, fs);
-
- s7r.reg4840 = temp & (0x0FF);
-
- //NEWSYM SPC7110RTC, db 00,00,00,00,00,00,01,00,01,00,00,00,00,00,0Fh,00
- fread(&temp, 1, 4, fs);
- if (Settings.SPC7110RTC)
- {
- rtc_f9.reg[0] = temp & (0x0FF);
- rtc_f9.reg[1] = (temp >> 8) & (0x0FF);
- rtc_f9.reg[2] = (temp >> 16) & (0x0FF);
- rtc_f9.reg[3] = (temp >> 24) & (0x0FF);
- }
- fread(&temp, 1, 4, fs);
- if (Settings.SPC7110RTC)
- {
- rtc_f9.reg[4] = temp & (0x0FF);
- rtc_f9.reg[5] = (temp >> 8) & (0x0FF);
- rtc_f9.reg[6] = (temp >> 16) & (0x0FF);
- rtc_f9.reg[7] = (temp >> 24) & (0x0FF);
- }
- fread(&temp, 1, 4, fs);
- if (Settings.SPC7110RTC)
- {
- rtc_f9.reg[8] = temp & (0x0FF);
- rtc_f9.reg[9] = (temp >> 8) & (0x0FF);
- rtc_f9.reg[10] = (temp >> 16) & (0x0FF);
- rtc_f9.reg[11] = (temp >> 24) & (0x0FF);
- }
- fread(&temp, 1, 4, fs);
- if (Settings.SPC7110RTC)
- {
- rtc_f9.reg[12] = temp & (0x0FF);
- rtc_f9.reg[13] = (temp >> 8) & (0x0FF);
- rtc_f9.reg[14] = (temp >> 16) & (0x0FF);
- rtc_f9.reg[15] = (temp >> 24) & (0x0FF);
- }
- //NEWSYM SPC7110RTCB, db 00,00,00,00,00,00,01,00,01,00,00,00,00,01,0Fh,06
- fread(&temp, 1, 4, fs);
- fread(&temp, 1, 4, fs);
- fread(&temp, 1, 4, fs);
- fread(&temp, 1, 4, fs);
-
- //NEWSYM SPCROMPtr, dd 0 4811-4813
- fread(&temp, 1, 4, fs);
-
- s7r.reg4811 = temp & (0x0FF);
- s7r.reg4812 = (temp >> 8) & (0x0FF);
- s7r.reg4813 = (temp >> 16) & (0x0FF);
- //NEWSYM SPCROMtoI, dd SPCROMPtr
- fread(&temp, 1, 4, fs);
- //NEWSYM SPCROMAdj, dd 0 4814-5
- fread(&temp, 1, 4, fs);
- s7r.reg4814 = temp & (0x0FF);
- s7r.reg4815 = (temp >> 8) & (0x0FF);
- //NEWSYM SPCROMInc, dd 0 4816-7
- fread(&temp, 1, 4, fs);
- s7r.reg4816 = temp & (0x0FF);
- s7r.reg4817 = (temp >> 8) & (0x0FF);
- //NEWSYM SPCROMCom, dd 0 4818
- fread(&temp, 1, 4, fs);
-
- s7r.reg4818 = temp & (0x0FF);
- //NEWSYM SPCCompPtr, dd 0 4801-4804 (+b50i) if"manual"
- fread(&temp, 1, 4, fs);
-
- //do table check
-
- s7r.reg4801 = temp & (0x0FF);
- s7r.reg4802 = (temp >> 8) & (0x0FF);
- s7r.reg4803 = (temp >> 16) & (0x0FF);
- s7r.reg4804 = (temp >> 24) & (0x0FF);
- ///NEWSYM SPCDecmPtr, dd 0 4805-6 +b50i
- fread(&temp, 1, 4, fs);
- s7r.reg4805 = temp & (0x0FF);
- s7r.reg4806 = (temp >> 8) & (0x0FF);
- //NEWSYM SPCCompCounter, dd 0 4809-A
- fread(&temp, 1, 4, fs);
- s7r.reg4809 = temp & (0x0FF);
- s7r.reg480A = (temp >> 8) & (0x0FF);
- //NEWSYM SPCCompCommand, dd 0 480B
- fread(&temp, 1, 4, fs);
-
- s7r.reg480B = temp & (0x0FF);
- //NEWSYM SPCCheckFix, dd 0 written(if 1, then set writtne to max value!)
- fread(&temp, 1, 4, fs);
- if (temp & (0x0FF))
- s7r.written = 0x1F;
- else
- s7r.written = 0x00;
- //NEWSYM SPCSignedVal, dd 0 482E
- fread(&temp, 1, 4, fs);
-
- s7r.reg482E = temp & (0x0FF);
-
- }
- fclose(fs);
-
- FixROMSpeed();
- IPPU.ColorsChanged = TRUE;
- IPPU.OBJChanged = TRUE;
- CPU.InDMA = FALSE;
- S9xFixColourBrightness();
- IPPU.RenderThisFrame = FALSE;
-
- S9xFixSoundAfterSnapshotLoad();
- ICPU.ShiftedPB = ICPU.Registers.PB << 16;
- ICPU.ShiftedDB = ICPU.Registers.DB << 16;
- S9xSetPCBase(ICPU.ShiftedPB + ICPU.Registers.PC);
- S9xUnpackStatus();
- S9xFixCycles();
- S9xReschedule();
- return (TRUE);
- }
- fclose(fs);
- return (FALSE);
-}
-
diff --git a/source/snapshot.h b/source/snapshot.h
deleted file mode 100644
index d7af5de..0000000
--- a/source/snapshot.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
-
- (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
- Jerremy Koot (jkoot@snes9x.com)
-
- (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net)
-
- (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net),
- funkyass (funkyass@spam.shaw.ca),
- Joel Yliluoma (http://iki.fi/bisqwit/)
- Kris Bleakley (codeviolation@hotmail.com),
- Matthew Kendora,
- Nach (n-a-c-h@users.sourceforge.net),
- Peter Bortas (peter@bortas.org) and
- zones (kasumitokoduck@yahoo.com)
-
- C4 x86 assembler and some C emulation code
- (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com),
- _Demo_ (_demo_@zsnes.com), and Nach
-
- C4 C++ code
- (c) Copyright 2003 Brad Jorsch
-
- DSP-1 emulator code
- (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson,
- John Weidman, neviksti (neviksti@hotmail.com),
- Kris Bleakley, Andreas Naive
-
- DSP-2 emulator code
- (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and
- Lord Nightmare (lord_nightmare@users.sourceforge.net
-
- OBC1 emulator code
- (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and
- Kris Bleakley
- Ported from x86 assembler to C by sanmaiwashi
-
- SPC7110 and RTC C++ emulator code
- (c) Copyright 2002 Matthew Kendora with research by
- zsKnight, John Weidman, and Dark Force
-
- S-DD1 C emulator code
- (c) Copyright 2003 Brad Jorsch with research by
- Andreas Naive and John Weidman
-
- S-RTC C emulator code
- (c) Copyright 2001 John Weidman
-
- ST010 C++ emulator code
- (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora
-
- Super FX x86 assembler emulator code
- (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault
-
- Super FX C emulator code
- (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman
-
-
- SH assembler code partly based on x86 assembler code
- (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
-
-
- Specific ports contains the works of other authors. See headers in
- individual files.
-
- Snes9x homepage: http://www.snes9x.com
-
- Permission to use, copy, modify and distribute Snes9x in both binary and
- source form, for non-commercial purposes, is hereby granted without fee,
- providing that this license information and copyright notice appear with
- all copies and any derived work.
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event shall the authors be held liable for any damages
- arising from the use of this software.
-
- Snes9x is freeware for PERSONAL USE only. Commercial users should
- seek permission of the copyright holders first. Commercial use includes
- charging money for Snes9x or software derived from Snes9x.
-
- The copyright holders request that bug fixes and improvements to the code
- should be forwarded to them so everyone can benefit from the modifications
- in future versions.
-
- Super NES and Super Nintendo Entertainment System are trademarks of
- Nintendo Co., Limited and its subsidiary companies.
-*******************************************************************************/
-#ifndef _SNAPSHOT_H_
-#define _SNAPSHOT_H_
-
-#include <stdio.h>
-#include "snes9x.h"
-
-#define SNAPSHOT_MAGIC "#!snes9x"
-#define SNAPSHOT_VERSION 1
-
-#define SUCCESS 1
-#define WRONG_FORMAT (-1)
-#define WRONG_VERSION (-2)
-#define FILE_NOT_FOUND (-3)
-#define WRONG_MOVIE_SNAPSHOT (-4)
-#define NOT_A_MOVIE_SNAPSHOT (-5)
-
-bool8 S9xFreezeGame(const char* filename);
-bool8 S9xUnfreezeGame(const char* filename);
-bool8 Snapshot(const char* filename);
-bool8 S9xLoadSnapshot(const char* filename);
-bool8 S9xSPCDump(const char* filename);
-void S9xFreezeToStream(STREAM);
-int S9xUnfreezeFromStream(STREAM);
-
-#endif
-