transform a bunch of iostream stuff into EMUFILE. main savestate and savedata codepaths work, movies may still be borked. ill fix it soon.
This commit is contained in:
parent
fce7cb2701
commit
e05c17dfbb
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
Copyright (C) 2006-2007 Theo Berkau
|
Copyright (C) 2006-2007 Theo Berkau
|
||||||
Copyright (C) 2007 shash
|
Copyright (C) 2007 shash
|
||||||
|
Copyright (C) 2008-2009 DeSmuME team
|
||||||
|
|
||||||
This file is part of DeSmuME
|
This file is part of DeSmuME
|
||||||
|
|
||||||
|
@ -2600,12 +2601,12 @@ void GPU_ligne(NDS_Screen * screen, u16 l, bool skip)
|
||||||
GPU_ligne_MasterBrightness(screen, l);
|
GPU_ligne_MasterBrightness(screen, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gpu_savestate(std::ostream* os)
|
void gpu_savestate(EMUFILE* os)
|
||||||
{
|
{
|
||||||
//version
|
//version
|
||||||
write32le(1,os);
|
write32le(1,os);
|
||||||
|
|
||||||
os->write((char*)GPU_screen,sizeof(GPU_screen));
|
os->fwrite((char*)GPU_screen,sizeof(GPU_screen));
|
||||||
|
|
||||||
write32le(MainScreen.gpu->affineInfo[0].x,os);
|
write32le(MainScreen.gpu->affineInfo[0].x,os);
|
||||||
write32le(MainScreen.gpu->affineInfo[0].y,os);
|
write32le(MainScreen.gpu->affineInfo[0].y,os);
|
||||||
|
@ -2617,10 +2618,10 @@ void gpu_savestate(std::ostream* os)
|
||||||
write32le(SubScreen.gpu->affineInfo[1].y,os);
|
write32le(SubScreen.gpu->affineInfo[1].y,os);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gpu_loadstate(std::istream* is, int size)
|
bool gpu_loadstate(EMUFILE* is, int size)
|
||||||
{
|
{
|
||||||
//read version
|
//read version
|
||||||
int version;
|
u32 version;
|
||||||
|
|
||||||
//sigh.. shouldve used a new version number
|
//sigh.. shouldve used a new version number
|
||||||
if(size == 256*192*2*2)
|
if(size == 256*192*2*2)
|
||||||
|
@ -2636,7 +2637,7 @@ bool gpu_loadstate(std::istream* is, int size)
|
||||||
|
|
||||||
if(version<0||version>1) return false;
|
if(version<0||version>1) return false;
|
||||||
|
|
||||||
is->read((char*)GPU_screen,sizeof(GPU_screen));
|
is->fread((char*)GPU_screen,sizeof(GPU_screen));
|
||||||
|
|
||||||
if(version==1)
|
if(version==1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
Copyright (C) 2006-2007 Theo Berkau
|
Copyright (C) 2006-2007 Theo Berkau
|
||||||
Copyright (C) 2007 shash
|
Copyright (C) 2007 shash
|
||||||
|
Copyright (C) 2009-2009 DeSmuME team
|
||||||
|
|
||||||
This file is part of DeSmuME
|
This file is part of DeSmuME
|
||||||
|
|
||||||
|
@ -36,8 +37,8 @@
|
||||||
//#undef FORCEINLINE
|
//#undef FORCEINLINE
|
||||||
//#define FORCEINLINE
|
//#define FORCEINLINE
|
||||||
|
|
||||||
void gpu_savestate(std::ostream* os);
|
void gpu_savestate(EMUFILE* os);
|
||||||
bool gpu_loadstate(std::istream* is, int size);
|
bool gpu_loadstate(EMUFILE* is, int size);
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
this structure is for display control,
|
this structure is for display control,
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
/* Copyright (C) 2006 yopyop
|
/* Copyright (C) 2006 yopyop
|
||||||
yopyop156@ifrance.com
|
yopyop156@ifrance.com
|
||||||
yopyop156.ifrance.com
|
yopyop156.ifrance.com
|
||||||
|
@ -1507,14 +1506,14 @@ struct TSequenceItem
|
||||||
u32 param;
|
u32 param;
|
||||||
bool enabled;
|
bool enabled;
|
||||||
|
|
||||||
virtual void save(std::ostream* os)
|
virtual void save(EMUFILE* os)
|
||||||
{
|
{
|
||||||
write64le(timestamp,os);
|
write64le(timestamp,os);
|
||||||
write32le(param,os);
|
write32le(param,os);
|
||||||
writebool(enabled,os);
|
writebool(enabled,os);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool load(std::istream* is)
|
virtual bool load(EMUFILE* is)
|
||||||
{
|
{
|
||||||
if(read64le(×tamp,is) != 1) return false;
|
if(read64le(×tamp,is) != 1) return false;
|
||||||
if(read32le(¶m,is) != 1) return false;
|
if(read32le(¶m,is) != 1) return false;
|
||||||
|
@ -1730,7 +1729,7 @@ struct Sequencer
|
||||||
void execHardware();
|
void execHardware();
|
||||||
u64 findNext();
|
u64 findNext();
|
||||||
|
|
||||||
void save(std::ostream* os)
|
void save(EMUFILE* os)
|
||||||
{
|
{
|
||||||
write64le(nds_timer,os);
|
write64le(nds_timer,os);
|
||||||
write64le(nds_arm9_timer,os);
|
write64le(nds_arm9_timer,os);
|
||||||
|
@ -1748,7 +1747,7 @@ struct Sequencer
|
||||||
#undef SAVE
|
#undef SAVE
|
||||||
}
|
}
|
||||||
|
|
||||||
bool load(std::istream* is, int version)
|
bool load(EMUFILE* is, int version)
|
||||||
{
|
{
|
||||||
if(read64le(&nds_timer,is) != 1) return false;
|
if(read64le(&nds_timer,is) != 1) return false;
|
||||||
if(read64le(&nds_arm9_timer,is) != 1) return false;
|
if(read64le(&nds_arm9_timer,is) != 1) return false;
|
||||||
|
@ -2054,10 +2053,10 @@ void Sequencer::execHardware()
|
||||||
|
|
||||||
void execHardware_interrupts();
|
void execHardware_interrupts();
|
||||||
|
|
||||||
static void saveUserInput(std::ostream* os);
|
static void saveUserInput(EMUFILE* os);
|
||||||
static bool loadUserInput(std::istream* is, int version);
|
static bool loadUserInput(EMUFILE* is, int version);
|
||||||
|
|
||||||
void nds_savestate(std::ostream* os)
|
void nds_savestate(EMUFILE* os)
|
||||||
{
|
{
|
||||||
//version
|
//version
|
||||||
write32le(2,os);
|
write32le(2,os);
|
||||||
|
@ -2067,10 +2066,10 @@ void nds_savestate(std::ostream* os)
|
||||||
saveUserInput(os);
|
saveUserInput(os);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool nds_loadstate(std::istream* is, int size)
|
bool nds_loadstate(EMUFILE* is, int size)
|
||||||
{
|
{
|
||||||
//read version
|
//read version
|
||||||
int version;
|
u32 version;
|
||||||
if(read32le(&version,is) != 1) return false;
|
if(read32le(&version,is) != 1) return false;
|
||||||
|
|
||||||
if(version > 2) return false;
|
if(version > 2) return false;
|
||||||
|
@ -2558,17 +2557,17 @@ const UserInput& NDS_getFinalUserInput()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void saveUserInput(std::ostream* os, UserInput& input)
|
static void saveUserInput(EMUFILE* os, UserInput& input)
|
||||||
{
|
{
|
||||||
os->write((const char*)input.buttons.array, 14);
|
os->fwrite((const char*)input.buttons.array, 14);
|
||||||
writebool(input.touch.isTouch, os);
|
writebool(input.touch.isTouch, os);
|
||||||
write16le(input.touch.touchX, os);
|
write16le(input.touch.touchX, os);
|
||||||
write16le(input.touch.touchY, os);
|
write16le(input.touch.touchY, os);
|
||||||
write32le(input.mic.micButtonPressed, os);
|
write32le(input.mic.micButtonPressed, os);
|
||||||
}
|
}
|
||||||
static bool loadUserInput(std::istream* is, UserInput& input, int version)
|
static bool loadUserInput(EMUFILE* is, UserInput& input, int version)
|
||||||
{
|
{
|
||||||
is->read((char*)input.buttons.array, 14);
|
is->fread((char*)input.buttons.array, 14);
|
||||||
readbool(&input.touch.isTouch, is);
|
readbool(&input.touch.isTouch, is);
|
||||||
read16le(&input.touch.touchX, is);
|
read16le(&input.touch.touchX, is);
|
||||||
read16le(&input.touch.touchY, is);
|
read16le(&input.touch.touchY, is);
|
||||||
|
@ -2576,7 +2575,7 @@ static bool loadUserInput(std::istream* is, UserInput& input, int version)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// (userinput is kind of a misnomer, e.g. finalUserInput has to mirror nds.pad, nds.touchX, etc.)
|
// (userinput is kind of a misnomer, e.g. finalUserInput has to mirror nds.pad, nds.touchX, etc.)
|
||||||
static void saveUserInput(std::ostream* os)
|
static void saveUserInput(EMUFILE* os)
|
||||||
{
|
{
|
||||||
saveUserInput(os, finalUserInput);
|
saveUserInput(os, finalUserInput);
|
||||||
saveUserInput(os, intermediateUserInput); // saved in case a savestate is made during input processing (which Lua could do if nothing else)
|
saveUserInput(os, intermediateUserInput); // saved in case a savestate is made during input processing (which Lua could do if nothing else)
|
||||||
|
@ -2584,14 +2583,14 @@ static void saveUserInput(std::ostream* os)
|
||||||
for(int i = 0; i < 14; i++)
|
for(int i = 0; i < 14; i++)
|
||||||
write32le(TurboTime.array[i], os); // saved to make autofire more tolerable to use with re-recording
|
write32le(TurboTime.array[i], os); // saved to make autofire more tolerable to use with re-recording
|
||||||
}
|
}
|
||||||
static bool loadUserInput(std::istream* is, int version)
|
static bool loadUserInput(EMUFILE* is, int version)
|
||||||
{
|
{
|
||||||
bool rv = true;
|
bool rv = true;
|
||||||
rv &= loadUserInput(is, finalUserInput, version);
|
rv &= loadUserInput(is, finalUserInput, version);
|
||||||
rv &= loadUserInput(is, intermediateUserInput, version);
|
rv &= loadUserInput(is, intermediateUserInput, version);
|
||||||
readbool(&validToProcessInput, is);
|
readbool(&validToProcessInput, is);
|
||||||
for(int i = 0; i < 14; i++)
|
for(int i = 0; i < 14; i++)
|
||||||
read32le(&TurboTime.array[i], is);
|
read32le((u32*)&TurboTime.array[i], is);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "SPU.h"
|
#include "SPU.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "wifi.h"
|
#include "wifi.h"
|
||||||
|
#include "emufile.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -295,7 +296,7 @@ struct UserTouch
|
||||||
};
|
};
|
||||||
struct UserMicrophone
|
struct UserMicrophone
|
||||||
{
|
{
|
||||||
BOOL micButtonPressed;
|
u32 micButtonPressed;
|
||||||
};
|
};
|
||||||
struct UserInput
|
struct UserInput
|
||||||
{
|
{
|
||||||
|
@ -347,8 +348,8 @@ void NDS_Reset();
|
||||||
int NDS_ImportSave(const char *filename);
|
int NDS_ImportSave(const char *filename);
|
||||||
bool NDS_ExportSave(const char *filename);
|
bool NDS_ExportSave(const char *filename);
|
||||||
|
|
||||||
void nds_savestate(std::ostream* os);
|
void nds_savestate(EMUFILE* os);
|
||||||
bool nds_loadstate(std::istream* is, int size);
|
bool nds_loadstate(EMUFILE* is, int size);
|
||||||
|
|
||||||
int NDS_WriteBMP(const char *filename);
|
int NDS_WriteBMP(const char *filename);
|
||||||
int NDS_LoadFirmware(const char *filename);
|
int NDS_LoadFirmware(const char *filename);
|
||||||
|
|
|
@ -1242,7 +1242,7 @@ void WAV_WavSoundUpdate(void* soundData, int numSamples)
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void spu_savestate(std::ostream* os)
|
void spu_savestate(EMUFILE* os)
|
||||||
{
|
{
|
||||||
//version
|
//version
|
||||||
write32le(2,os);
|
write32le(2,os);
|
||||||
|
@ -1277,12 +1277,12 @@ void spu_savestate(std::ostream* os)
|
||||||
write64le(double_to_u64(samples),os);
|
write64le(double_to_u64(samples),os);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool spu_loadstate(std::istream* is, int size)
|
bool spu_loadstate(EMUFILE* is, int size)
|
||||||
{
|
{
|
||||||
u64 temp64;
|
u64 temp64;
|
||||||
|
|
||||||
//read version
|
//read version
|
||||||
int version;
|
u32 version;
|
||||||
if(read32le(&version,is) != 1) return false;
|
if(read32le(&version,is) != 1) return false;
|
||||||
|
|
||||||
SPU_struct *spu = SPU_core;
|
SPU_struct *spu = SPU_core;
|
||||||
|
|
|
@ -23,11 +23,13 @@
|
||||||
#ifndef SPU_H
|
#ifndef SPU_H
|
||||||
#define SPU_H
|
#define SPU_H
|
||||||
|
|
||||||
#include "types.h"
|
|
||||||
#include "matrix.h"
|
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include "types.h"
|
||||||
|
#include "matrix.h"
|
||||||
|
#include "emufile.h"
|
||||||
|
|
||||||
|
|
||||||
#define SNDCORE_DEFAULT -1
|
#define SNDCORE_DEFAULT -1
|
||||||
#define SNDCORE_DUMMY 0
|
#define SNDCORE_DUMMY 0
|
||||||
|
@ -73,7 +75,7 @@ struct channel_struct
|
||||||
channel_struct()
|
channel_struct()
|
||||||
: cacheItem(NULL)
|
: cacheItem(NULL)
|
||||||
{}
|
{}
|
||||||
int num;
|
u32 num;
|
||||||
u8 vol;
|
u8 vol;
|
||||||
u8 datashift;
|
u8 datashift;
|
||||||
u8 hold;
|
u8 hold;
|
||||||
|
@ -144,8 +146,8 @@ void SPU_Emulate_user(void);
|
||||||
extern SPU_struct *SPU_core, *SPU_user;
|
extern SPU_struct *SPU_core, *SPU_user;
|
||||||
extern int spu_core_samples;
|
extern int spu_core_samples;
|
||||||
|
|
||||||
void spu_savestate(std::ostream* os);
|
void spu_savestate(EMUFILE* os);
|
||||||
bool spu_loadstate(std::istream* is, int size);
|
bool spu_loadstate(EMUFILE* is, int size);
|
||||||
|
|
||||||
class WavWriter
|
class WavWriter
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,45 +1,249 @@
|
||||||
|
/* Copyright (C) 2009 DeSmuME team
|
||||||
|
*
|
||||||
|
* This file is part of DeSmuME
|
||||||
|
*
|
||||||
|
* DeSmuME is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* DeSmuME is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with DeSmuME; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef EMUFILE_H
|
#ifndef EMUFILE_H
|
||||||
#define EMUFILE_H
|
#define EMUFILE_H
|
||||||
|
|
||||||
class EMUFILE{
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "types.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
class EMUFILE {
|
||||||
|
protected:
|
||||||
|
bool failbit;
|
||||||
|
|
||||||
|
public:
|
||||||
|
EMUFILE()
|
||||||
|
: failbit(false)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual ~EMUFILE() {}
|
||||||
|
|
||||||
|
|
||||||
|
bool fail() { return failbit; }
|
||||||
|
|
||||||
|
void fread(const void *ptr, size_t bytes){
|
||||||
|
_fread(ptr,bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void unget() { fseek(-1,SEEK_CUR); }
|
||||||
|
|
||||||
|
//virtuals
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual FILE *get_fp() = 0;
|
||||||
|
|
||||||
|
virtual int fprintf(const char *format, ...) = 0;
|
||||||
|
|
||||||
|
virtual int fgetc() = 0;
|
||||||
|
virtual int fputc(int c) = 0;
|
||||||
|
|
||||||
|
virtual size_t _fread(const void *ptr, size_t bytes) = 0;
|
||||||
|
|
||||||
|
//removing these return values for now so we can find any code that might be using them and make sure
|
||||||
|
//they handle the return values correctly
|
||||||
|
|
||||||
|
virtual void fwrite(const void *ptr, size_t bytes) = 0;
|
||||||
|
|
||||||
|
virtual int fseek(int offset, int origin) = 0;
|
||||||
|
|
||||||
|
virtual int ftell() = 0;
|
||||||
|
virtual int size() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
//todo - handle read-only specially?
|
||||||
|
class EMUFILE_MEMORY : public EMUFILE {
|
||||||
|
private:
|
||||||
|
std::vector<u8> *vec;
|
||||||
|
s32 pos, len;
|
||||||
|
bool ownvec;
|
||||||
|
|
||||||
|
void reserve(u32 amt) {
|
||||||
|
if(vec->size() < amt)
|
||||||
|
vec->resize(amt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
EMUFILE_MEMORY(std::vector<u8> *underlying) : vec(underlying), ownvec(false), pos(0), len(underlying->size()) { }
|
||||||
|
EMUFILE_MEMORY(u32 preallocate) : vec(new std::vector<u8>()), ownvec(true), pos(0), len(0) { vec->reserve(preallocate); }
|
||||||
|
EMUFILE_MEMORY() : vec(new std::vector<u8>()), ownvec(true), pos(0), len(0) { vec->reserve(1024); }
|
||||||
|
|
||||||
|
~EMUFILE_MEMORY() {
|
||||||
|
if(ownvec) delete vec;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8* buf() { return &(*vec)[0]; }
|
||||||
|
|
||||||
|
virtual FILE *get_fp() { return NULL; }
|
||||||
|
|
||||||
|
virtual int fprintf(const char *format, ...) {
|
||||||
|
va_list argptr;
|
||||||
|
va_start(argptr, format);
|
||||||
|
|
||||||
|
//we dont generate straight into the buffer because it will null terminate (one more byte than we want)
|
||||||
|
int amt = vsnprintf(0,0,format,argptr);
|
||||||
|
char* tempbuf = new char[amt+1];
|
||||||
|
vsprintf(tempbuf,format,argptr);
|
||||||
|
memcpy((char*)buf()+pos,tempbuf,amt);
|
||||||
|
pos += amt;
|
||||||
|
len = std::max(pos,len);
|
||||||
|
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
return amt;
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual int fgetc() {
|
||||||
|
u8 temp;
|
||||||
|
if(_fread(&temp,1) != 1)
|
||||||
|
return EOF;
|
||||||
|
else return temp;
|
||||||
|
}
|
||||||
|
virtual int fputc(int c) {
|
||||||
|
u8 temp = (u8)c;
|
||||||
|
//TODO
|
||||||
|
//if(fwrite(&temp,1)!=1) return EOF;
|
||||||
|
fwrite(&temp,1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual size_t _fread(const void *ptr, size_t bytes){
|
||||||
|
u32 remain = len-pos;
|
||||||
|
u32 todo = std::min(remain,bytes);
|
||||||
|
memcpy((void*)ptr,buf()+pos,todo);
|
||||||
|
pos += todo;
|
||||||
|
if(todo<bytes) failbit = true;
|
||||||
|
return todo;
|
||||||
|
}
|
||||||
|
|
||||||
|
//removing these return values for now so we can find any code that might be using them and make sure
|
||||||
|
//they handle the return values correctly
|
||||||
|
|
||||||
|
virtual void fwrite(const void *ptr, size_t bytes){
|
||||||
|
reserve(pos+bytes);
|
||||||
|
memcpy(buf()+pos,ptr,bytes);
|
||||||
|
pos += bytes;
|
||||||
|
len = std::max(pos,len);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int fseek(int offset, int origin){
|
||||||
|
//work differently for read-only...?
|
||||||
|
switch(origin) {
|
||||||
|
case SEEK_SET:
|
||||||
|
pos = offset;
|
||||||
|
break;
|
||||||
|
case SEEK_CUR:
|
||||||
|
pos += offset;
|
||||||
|
break;
|
||||||
|
case SEEK_END:
|
||||||
|
pos = size()-len;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
reserve(pos);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int ftell() {
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int size() { return (int)len; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class EMUFILE_FILE : public EMUFILE {
|
||||||
private:
|
private:
|
||||||
FILE* fp;
|
FILE* fp;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EMUFILE(const char* fname, const char* mode)
|
|
||||||
|
EMUFILE_FILE(const char* fname, const char* mode)
|
||||||
{
|
{
|
||||||
fp = fopen(fname,mode);
|
fp = fopen(fname,mode);
|
||||||
|
if(!fp) failbit = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
FILE *get_fp(){
|
virtual ~EMUFILE_FILE() {
|
||||||
|
if(NULL != fp)
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual FILE *get_fp() {
|
||||||
return fp;
|
return fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fprintf(const char *format, ...) {
|
virtual int fprintf(const char *format, ...) {
|
||||||
return ::fprintf(fp, format);
|
//TODO - BLEHHHHHHHH
|
||||||
|
char temp[1024];
|
||||||
|
va_list argptr;
|
||||||
|
va_start(argptr, format);
|
||||||
|
int ret = ::vsprintf(temp, format, argptr);
|
||||||
|
if(ret<0 || ret>=1024) {
|
||||||
|
assert(false);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
fwrite(temp,ret);
|
||||||
|
va_end(argptr);
|
||||||
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
int fgetc() {
|
virtual int fgetc() {
|
||||||
return ::fgetc(fp);
|
return ::fgetc(fp);
|
||||||
}
|
}
|
||||||
int fputc(int c) {
|
virtual int fputc(int c) {
|
||||||
return ::fputc(c, fp);
|
return ::fputc(c, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t fread(void *ptr, size_t size, size_t nobj){
|
virtual size_t _fread(const void *ptr, size_t bytes){
|
||||||
return ::fread(ptr, size, nobj, fp);
|
size_t ret = ::fread((void*)ptr, 1, bytes, fp);
|
||||||
|
if(ret < bytes) failbit = true;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t fwrite(void *ptr, size_t size, size_t nobj){
|
//removing these return values for now so we can find any code that might be using them and make sure
|
||||||
return ::fwrite(ptr, size, nobj, fp);
|
//they handle the return values correctly
|
||||||
|
|
||||||
|
virtual void fwrite(const void *ptr, size_t bytes){
|
||||||
|
size_t ret = ::fwrite((void*)ptr, 1, bytes, fp);
|
||||||
|
if(ret < bytes) failbit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fseek(long int offset, int origin){
|
virtual int fseek(int offset, int origin){
|
||||||
return ::fseek(fp, offset, origin);
|
return ::fseek(fp, offset, origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
long int ftell() {
|
virtual int ftell() {
|
||||||
return ::ftell(fp);
|
return (u32)::ftell(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int size() {
|
||||||
|
int oldpos = ftell();
|
||||||
|
fseek(0,SEEK_END);
|
||||||
|
int len = ftell();
|
||||||
|
fseek(oldpos,SEEK_SET);
|
||||||
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -2446,7 +2446,7 @@ SFORMAT SF_GFX3D[]={
|
||||||
};
|
};
|
||||||
|
|
||||||
//-------------savestate
|
//-------------savestate
|
||||||
void gfx3d_savestate(std::ostream* os)
|
void gfx3d_savestate(EMUFILE* os)
|
||||||
{
|
{
|
||||||
//version
|
//version
|
||||||
write32le(2,os);
|
write32le(2,os);
|
||||||
|
@ -2467,7 +2467,7 @@ void gfx3d_savestate(std::ostream* os)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gfx3d_loadstate(std::istream* is, int size)
|
bool gfx3d_loadstate(EMUFILE* is, int size)
|
||||||
{
|
{
|
||||||
int version;
|
int version;
|
||||||
if(read32le(&version,is) != 1) return false;
|
if(read32le(&version,is) != 1) return false;
|
||||||
|
|
|
@ -24,10 +24,12 @@
|
||||||
#ifndef _GFX3D_H_
|
#ifndef _GFX3D_H_
|
||||||
#define _GFX3D_H_
|
#define _GFX3D_H_
|
||||||
|
|
||||||
#include "types.h"
|
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <istream>
|
#include <istream>
|
||||||
|
#include "types.h"
|
||||||
|
#include "emufile.h"
|
||||||
|
|
||||||
|
|
||||||
//produce a 32bpp color from a DS RGB16
|
//produce a 32bpp color from a DS RGB16
|
||||||
#define RGB16TO32(col,alpha) (((alpha)<<24) | ((((col) & 0x7C00)>>7)<<16) | ((((col) & 0x3E0)>>2)<<8) | (((col) & 0x1F)<<3))
|
#define RGB16TO32(col,alpha) (((alpha)<<24) | ((((col) & 0x7C00)>>7)<<16) | ((((col) & 0x3E0)>>2)<<8) | (((col) & 0x1F)<<3))
|
||||||
|
@ -89,8 +91,8 @@ inline u32 gfx3d_extendDepth_15_to_24(u32 depth)
|
||||||
void gfx3d_init();
|
void gfx3d_init();
|
||||||
void gfx3d_reset();
|
void gfx3d_reset();
|
||||||
|
|
||||||
#define OSWRITE(x) os->write((char*)&(x),sizeof((x)));
|
#define OSWRITE(x) os->fwrite((char*)&(x),sizeof((x)));
|
||||||
#define OSREAD(x) is->read((char*)&(x),sizeof((x)));
|
#define OSREAD(x) is->fread((char*)&(x),sizeof((x)));
|
||||||
|
|
||||||
struct POLY {
|
struct POLY {
|
||||||
int type; //tri or quad
|
int type; //tri or quad
|
||||||
|
@ -116,7 +118,7 @@ struct POLY {
|
||||||
|
|
||||||
int getAlpha() { return (polyAttr>>16)&0x1F; }
|
int getAlpha() { return (polyAttr>>16)&0x1F; }
|
||||||
|
|
||||||
void save(std::ostream* os)
|
void save(EMUFILE* os)
|
||||||
{
|
{
|
||||||
OSWRITE(type);
|
OSWRITE(type);
|
||||||
OSWRITE(vertIndexes[0]); OSWRITE(vertIndexes[1]); OSWRITE(vertIndexes[2]); OSWRITE(vertIndexes[3]);
|
OSWRITE(vertIndexes[0]); OSWRITE(vertIndexes[1]); OSWRITE(vertIndexes[2]); OSWRITE(vertIndexes[3]);
|
||||||
|
@ -126,7 +128,7 @@ struct POLY {
|
||||||
OSWRITE(maxy);
|
OSWRITE(maxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
void load(std::istream* is)
|
void load(EMUFILE* is)
|
||||||
{
|
{
|
||||||
OSREAD(type);
|
OSREAD(type);
|
||||||
OSREAD(vertIndexes[0]); OSREAD(vertIndexes[1]); OSREAD(vertIndexes[2]); OSREAD(vertIndexes[3]);
|
OSREAD(vertIndexes[0]); OSREAD(vertIndexes[1]); OSREAD(vertIndexes[2]); OSREAD(vertIndexes[3]);
|
||||||
|
@ -164,14 +166,14 @@ struct VERT {
|
||||||
fcolor[1] = color[1];
|
fcolor[1] = color[1];
|
||||||
fcolor[2] = color[2];
|
fcolor[2] = color[2];
|
||||||
}
|
}
|
||||||
void save(std::ostream* os)
|
void save(EMUFILE* os)
|
||||||
{
|
{
|
||||||
OSWRITE(x); OSWRITE(y); OSWRITE(z); OSWRITE(w);
|
OSWRITE(x); OSWRITE(y); OSWRITE(z); OSWRITE(w);
|
||||||
OSWRITE(u); OSWRITE(v);
|
OSWRITE(u); OSWRITE(v);
|
||||||
OSWRITE(color[0]); OSWRITE(color[1]); OSWRITE(color[2]);
|
OSWRITE(color[0]); OSWRITE(color[1]); OSWRITE(color[2]);
|
||||||
OSWRITE(fcolor[0]); OSWRITE(fcolor[1]); OSWRITE(fcolor[2]);
|
OSWRITE(fcolor[0]); OSWRITE(fcolor[1]); OSWRITE(fcolor[2]);
|
||||||
}
|
}
|
||||||
void load(std::istream* is)
|
void load(EMUFILE* is)
|
||||||
{
|
{
|
||||||
OSREAD(x); OSREAD(y); OSREAD(z); OSREAD(w);
|
OSREAD(x); OSREAD(y); OSREAD(z); OSREAD(w);
|
||||||
OSREAD(u); OSREAD(v);
|
OSREAD(u); OSREAD(v);
|
||||||
|
@ -346,7 +348,7 @@ void gfx3d_GetLineData15bpp(int line, u16** dst);
|
||||||
|
|
||||||
struct SFORMAT;
|
struct SFORMAT;
|
||||||
extern SFORMAT SF_GFX3D[];
|
extern SFORMAT SF_GFX3D[];
|
||||||
void gfx3d_savestate(std::ostream* os);
|
void gfx3d_savestate(EMUFILE* os);
|
||||||
bool gfx3d_loadstate(std::istream* is, int size);
|
bool gfx3d_loadstate(EMUFILE* is, int size);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -226,9 +226,9 @@ u8 fw_transfer(memory_chip_t *mc, u8 data)
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::save_state(std::ostream* os)
|
bool BackupDevice::save_state(EMUFILE* os)
|
||||||
{
|
{
|
||||||
int version = 1;
|
u32 version = 1;
|
||||||
write32le(version,os);
|
write32le(version,os);
|
||||||
write32le(write_enable,os);
|
write32le(write_enable,os);
|
||||||
write32le(com,os);
|
write32le(com,os);
|
||||||
|
@ -241,12 +241,12 @@ bool BackupDevice::save_state(std::ostream* os)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::load_state(std::istream* is)
|
bool BackupDevice::load_state(EMUFILE* is)
|
||||||
{
|
{
|
||||||
int version;
|
u32 version;
|
||||||
if(read32le(&version,is)!=1) return false;
|
if(read32le(&version,is)!=1) return false;
|
||||||
if(version==0 || version==1) {
|
if(version==0 || version==1) {
|
||||||
read32le(&write_enable,is);
|
readbool(&write_enable,is);
|
||||||
read32le(&com,is);
|
read32le(&com,is);
|
||||||
read32le(&addr_size,is);
|
read32le(&addr_size,is);
|
||||||
read32le(&addr_counter,is);
|
read32le(&addr_counter,is);
|
||||||
|
@ -731,10 +731,11 @@ void BackupDevice::loadfile()
|
||||||
if(isMovieMode) return;
|
if(isMovieMode) return;
|
||||||
if(filename.length() ==0) return; //No sense crashing if no filename supplied
|
if(filename.length() ==0) return; //No sense crashing if no filename supplied
|
||||||
|
|
||||||
FILE* inf = fopen(filename.c_str(),"rb");
|
EMUFILE_FILE* inf = new EMUFILE_FILE(filename.c_str(),"rb");
|
||||||
if(!inf)
|
if(inf->fail())
|
||||||
{
|
{
|
||||||
//no dsv found; we need to try auto-importing a file with .sav extension
|
delete inf;
|
||||||
|
//no dsv found; we need to try auto-importing a file with .sav extension
|
||||||
printf("DeSmuME .dsv save file not found. Trying to load an old raw .sav file.\n");
|
printf("DeSmuME .dsv save file not found. Trying to load an old raw .sav file.\n");
|
||||||
|
|
||||||
//change extension to sav
|
//change extension to sav
|
||||||
|
@ -743,13 +744,14 @@ void BackupDevice::loadfile()
|
||||||
tmp[strlen(tmp)-3] = 0;
|
tmp[strlen(tmp)-3] = 0;
|
||||||
strcat(tmp,"sav");
|
strcat(tmp,"sav");
|
||||||
|
|
||||||
inf = fopen(tmp,"rb");
|
inf = new EMUFILE_FILE(tmp,"rb");
|
||||||
if(!inf)
|
if(inf->fail())
|
||||||
{
|
{
|
||||||
|
delete inf;
|
||||||
printf("Missing save file %s\n",filename.c_str());
|
printf("Missing save file %s\n",filename.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fclose(inf);
|
delete inf;
|
||||||
|
|
||||||
if (!load_no_gba(tmp))
|
if (!load_no_gba(tmp))
|
||||||
load_raw(tmp);
|
load_raw(tmp);
|
||||||
|
@ -759,29 +761,29 @@ void BackupDevice::loadfile()
|
||||||
//scan for desmume save footer
|
//scan for desmume save footer
|
||||||
const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie);
|
const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie);
|
||||||
char *sigbuf = new char[cookieLen];
|
char *sigbuf = new char[cookieLen];
|
||||||
fseek(inf, -cookieLen, SEEK_END);
|
inf->fseek(-cookieLen, SEEK_END);
|
||||||
fread(sigbuf,1,cookieLen,inf);
|
inf->fread(sigbuf,cookieLen);
|
||||||
int cmp = memcmp(sigbuf,kDesmumeSaveCookie,cookieLen);
|
int cmp = memcmp(sigbuf,kDesmumeSaveCookie,cookieLen);
|
||||||
delete[] sigbuf;
|
delete[] sigbuf;
|
||||||
if(cmp)
|
if(cmp)
|
||||||
{
|
{
|
||||||
//maybe it is a misnamed raw save file. try loading it that way
|
//maybe it is a misnamed raw save file. try loading it that way
|
||||||
printf("Not a DeSmuME .dsv save file. Trying to load as raw.\n");
|
printf("Not a DeSmuME .dsv save file. Trying to load as raw.\n");
|
||||||
fclose(inf);
|
delete inf;
|
||||||
if (!load_no_gba(filename.c_str()))
|
if (!load_no_gba(filename.c_str()))
|
||||||
load_raw(filename.c_str());
|
load_raw(filename.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//desmume format
|
//desmume format
|
||||||
fseek(inf, -cookieLen, SEEK_END);
|
inf->fseek(-cookieLen, SEEK_END);
|
||||||
fseek(inf, -4, SEEK_CUR);
|
inf->fseek(-4, SEEK_CUR);
|
||||||
u32 version = 0xFFFFFFFF;
|
u32 version = 0xFFFFFFFF;
|
||||||
read32le(&version,inf);
|
read32le(&version,inf);
|
||||||
if(version!=0) {
|
if(version!=0) {
|
||||||
printf("Unknown save file format\n");
|
printf("Unknown save file format\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fseek(inf, -24, SEEK_CUR);
|
inf->fseek(-24, SEEK_CUR);
|
||||||
struct {
|
struct {
|
||||||
u32 size,padSize,type,addr_size,mem_size;
|
u32 size,padSize,type,addr_size,mem_size;
|
||||||
} info;
|
} info;
|
||||||
|
@ -793,14 +795,14 @@ void BackupDevice::loadfile()
|
||||||
|
|
||||||
//establish the save data
|
//establish the save data
|
||||||
data.resize(info.size);
|
data.resize(info.size);
|
||||||
fseek(inf, 0, SEEK_SET);
|
inf->fseek(0, SEEK_SET);
|
||||||
if(info.size>0)
|
if(info.size>0)
|
||||||
fread(&data[0],1,info.size,inf); //read all the raw data we have
|
inf->fread(&data[0],info.size); //read all the raw data we have
|
||||||
state = RUNNING;
|
state = RUNNING;
|
||||||
addr_size = info.addr_size;
|
addr_size = info.addr_size;
|
||||||
//none of the other fields are used right now
|
//none of the other fields are used right now
|
||||||
|
|
||||||
fclose(inf);
|
delete inf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -846,11 +848,11 @@ void BackupDevice::flush()
|
||||||
//never use save files if we are in movie mode
|
//never use save files if we are in movie mode
|
||||||
if(isMovieMode) return;
|
if(isMovieMode) return;
|
||||||
|
|
||||||
FILE* outf = fopen(filename.c_str(),"wb");
|
EMUFILE* outf = new EMUFILE_FILE(filename.c_str(),"wb");
|
||||||
if(outf)
|
if(!outf->fail())
|
||||||
{
|
{
|
||||||
if(data.size()>0)
|
if(data.size()>0)
|
||||||
fwrite(&data[0],1,data.size(),outf);
|
outf->fwrite(&data[0],data.size());
|
||||||
|
|
||||||
//write the footer. we use a footer so that we can maximize the chance of the
|
//write the footer. we use a footer so that we can maximize the chance of the
|
||||||
//save file being recognized as a raw save file by other emulators etc.
|
//save file being recognized as a raw save file by other emulators etc.
|
||||||
|
@ -860,10 +862,10 @@ void BackupDevice::flush()
|
||||||
u32 padSize = pad_up_size(size);
|
u32 padSize = pad_up_size(size);
|
||||||
|
|
||||||
for(u32 i=size;i<padSize;i++)
|
for(u32 i=size;i<padSize;i++)
|
||||||
fputc(kUninitializedSaveDataValue,outf);
|
outf->fputc(kUninitializedSaveDataValue);
|
||||||
|
|
||||||
//this is just for humans to read
|
//this is just for humans to read
|
||||||
fprintf(outf,"|<--Snip above here to create a raw sav by excluding this DeSmuME savedata footer:");
|
outf->fprintf("|<--Snip above here to create a raw sav by excluding this DeSmuME savedata footer:");
|
||||||
|
|
||||||
//and now the actual footer
|
//and now the actual footer
|
||||||
write32le(size,outf); //the size of data that has actually been written
|
write32le(size,outf); //the size of data that has actually been written
|
||||||
|
@ -872,13 +874,13 @@ void BackupDevice::flush()
|
||||||
write32le(addr_size,outf);
|
write32le(addr_size,outf);
|
||||||
write32le(0,outf); //save memory size
|
write32le(0,outf); //save memory size
|
||||||
write32le(0,outf); //version number
|
write32le(0,outf); //version number
|
||||||
fprintf(outf, "%s", kDesmumeSaveCookie); //this is what we'll use to recognize the desmume format save
|
outf->fprintf("%s", kDesmumeSaveCookie); //this is what we'll use to recognize the desmume format save
|
||||||
|
|
||||||
|
delete outf;
|
||||||
fclose(outf);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
delete outf;
|
||||||
printf("Unable to open savefile %s\n",filename.c_str());
|
printf("Unable to open savefile %s\n",filename.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/* Copyright (C) 2006 thoduv
|
/* Copyright (C) 2006 thoduv
|
||||||
Copyright (C) 2006 Theo Berkau
|
Copyright (C) 2006 Theo Berkau
|
||||||
|
Copyright (C) 2008-2009 DeSmuME team
|
||||||
|
|
||||||
This file is part of DeSmuME
|
This file is part of DeSmuME
|
||||||
|
|
||||||
|
@ -25,6 +26,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
#include "emufile.h"
|
||||||
|
|
||||||
#define MC_TYPE_AUTODETECT 0x0
|
#define MC_TYPE_AUTODETECT 0x0
|
||||||
#define MC_TYPE_EEPROM1 0x1
|
#define MC_TYPE_EEPROM1 0x1
|
||||||
|
@ -76,8 +78,8 @@ public:
|
||||||
void reset();
|
void reset();
|
||||||
void close_rom();
|
void close_rom();
|
||||||
|
|
||||||
bool save_state(std::ostream* os);
|
bool save_state(EMUFILE* os);
|
||||||
bool load_state(std::istream* is);
|
bool load_state(EMUFILE* is);
|
||||||
|
|
||||||
//commands from mmu
|
//commands from mmu
|
||||||
void reset_command();
|
void reset_command();
|
||||||
|
@ -110,7 +112,7 @@ public:
|
||||||
void lazy_flush();
|
void lazy_flush();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BOOL write_enable; //is write enabled?
|
bool write_enable; //is write enabled?
|
||||||
u32 com; //persistent command actually handled
|
u32 com; //persistent command actually handled
|
||||||
u32 addr_size, addr_counter;
|
u32 addr_size, addr_counter;
|
||||||
u32 addr;
|
u32 addr;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/* Copyright (C) 2008-2009 DeSmuME team
|
||||||
|
|
||||||
|
This file is part of DeSmuME
|
||||||
|
|
||||||
|
DeSmuME is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
DeSmuME is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with DeSmuME; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef _memorystream_h_
|
#ifndef _memorystream_h_
|
||||||
#define _memorystream_h_
|
#define _memorystream_h_
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ void Mic_Reset();
|
||||||
void Mic_DeInit();
|
void Mic_DeInit();
|
||||||
u8 Mic_ReadSample();
|
u8 Mic_ReadSample();
|
||||||
|
|
||||||
void mic_savestate(std::ostream* os);
|
void mic_savestate(EMUFILE* os);
|
||||||
bool mic_loadstate(std::istream* is, int size);
|
bool mic_loadstate(EMUFILE* is, int size);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -118,7 +118,7 @@ void MovieRecord::parsePad(EMUFILE* fp, u16& pad)
|
||||||
{
|
{
|
||||||
|
|
||||||
char buf[13];
|
char buf[13];
|
||||||
fp->fread(buf,13,1);
|
fp->fread(buf,13);
|
||||||
pad = 0;
|
pad = 0;
|
||||||
for(int i=0;i<13;i++)
|
for(int i=0;i<13;i++)
|
||||||
{
|
{
|
||||||
|
@ -133,14 +133,14 @@ void MovieRecord::parse(MovieData* md, EMUFILE* fp)
|
||||||
//by the time we get in here, the initial pipe has already been extracted
|
//by the time we get in here, the initial pipe has already been extracted
|
||||||
|
|
||||||
//extract the commands
|
//extract the commands
|
||||||
commands = u32DecFromIstream(fp->get_fp());
|
commands = u32DecFromIstream(fp);
|
||||||
|
|
||||||
fp->fgetc(); //eat the pipe
|
fp->fgetc(); //eat the pipe
|
||||||
|
|
||||||
parsePad(fp, pad);
|
parsePad(fp, pad);
|
||||||
touch.x = u32DecFromIstream(fp->get_fp());
|
touch.x = u32DecFromIstream(fp);
|
||||||
touch.y = u32DecFromIstream(fp->get_fp());
|
touch.y = u32DecFromIstream(fp);
|
||||||
touch.touch = u32DecFromIstream(fp->get_fp());
|
touch.touch = u32DecFromIstream(fp);
|
||||||
|
|
||||||
fp->fgetc(); //eat the pipe
|
fp->fgetc(); //eat the pipe
|
||||||
|
|
||||||
|
@ -153,13 +153,13 @@ void MovieRecord::dump(MovieData* md, EMUFILE* fp, int index)
|
||||||
//dump the misc commands
|
//dump the misc commands
|
||||||
//*os << '|' << setw(1) << (int)commands;
|
//*os << '|' << setw(1) << (int)commands;
|
||||||
fp->fputc('|');
|
fp->fputc('|');
|
||||||
putdec<uint8,1,true>(fp->get_fp(),commands);
|
putdec<uint8,1,true>(fp,commands);
|
||||||
|
|
||||||
fp->fputc('|');
|
fp->fputc('|');
|
||||||
dumpPad(fp, pad);
|
dumpPad(fp, pad);
|
||||||
putdec<u8,3,true>(fp->get_fp(),touch.x); fp->fputc(' ');
|
putdec<u8,3,true>(fp,touch.x); fp->fputc(' ');
|
||||||
putdec<u8,3,true>(fp->get_fp(),touch.y); fp->fputc(' ');
|
putdec<u8,3,true>(fp,touch.y); fp->fputc(' ');
|
||||||
putdec<u8,1,true>(fp->get_fp(),touch.touch);
|
putdec<u8,1,true>(fp,touch.touch);
|
||||||
fp->fputc('|');
|
fp->fputc('|');
|
||||||
|
|
||||||
//each frame is on a new line
|
//each frame is on a new line
|
||||||
|
@ -276,7 +276,7 @@ bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader)
|
||||||
//movie must start with "version 1"
|
//movie must start with "version 1"
|
||||||
char buf[9];
|
char buf[9];
|
||||||
curr = fp->ftell();
|
curr = fp->ftell();
|
||||||
fp->fread(buf,9,1);
|
fp->fread(buf,9);
|
||||||
fp->fseek(curr, SEEK_SET);
|
fp->fseek(curr, SEEK_SET);
|
||||||
// if(fp->fail()) return false;
|
// if(fp->fail()) return false;
|
||||||
if(memcmp(buf,"version 1",9))
|
if(memcmp(buf,"version 1",9))
|
||||||
|
@ -444,7 +444,7 @@ const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tas
|
||||||
bool loadedfm2 = false;
|
bool loadedfm2 = false;
|
||||||
bool opened = false;
|
bool opened = false;
|
||||||
// {
|
// {
|
||||||
EMUFILE* fp = new EMUFILE(fname, "rb");
|
EMUFILE* fp = new EMUFILE_FILE(fname, "rb");
|
||||||
// if(fs.is_open())
|
// if(fs.is_open())
|
||||||
// {
|
// {
|
||||||
loadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false);
|
loadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false);
|
||||||
|
@ -506,7 +506,7 @@ const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tas
|
||||||
static void openRecordingMovie(const char* fname)
|
static void openRecordingMovie(const char* fname)
|
||||||
{
|
{
|
||||||
//osRecordingMovie = FCEUD_UTF8_fstream(fname, "wb");
|
//osRecordingMovie = FCEUD_UTF8_fstream(fname, "wb");
|
||||||
osRecordingMovie = new EMUFILE(fname, "wb");
|
osRecordingMovie = new EMUFILE_FILE(fname, "wb");
|
||||||
/*if(!osRecordingMovie)
|
/*if(!osRecordingMovie)
|
||||||
FCEU_PrintError("Error opening movie output file: %s",fname);*/
|
FCEU_PrintError("Error opening movie output file: %s",fname);*/
|
||||||
strcpy(curMovieFilename, fname);
|
strcpy(curMovieFilename, fname);
|
||||||
|
@ -665,7 +665,7 @@ void _CDECL_ FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, s
|
||||||
|
|
||||||
input.touch.touchX = mr->touch.x << 4;
|
input.touch.touchX = mr->touch.x << 4;
|
||||||
input.touch.touchY = mr->touch.y << 4;
|
input.touch.touchY = mr->touch.y << 4;
|
||||||
input.touch.isTouch = mr->touch.touch;
|
input.touch.isTouch = mr->touch.touch != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if we are on the last frame, then pause the emulator if the player requested it
|
//if we are on the last frame, then pause the emulator if the player requested it
|
||||||
|
@ -766,12 +766,12 @@ void mov_savestate(EMUFILE* fp)
|
||||||
//else return 0;
|
//else return 0;
|
||||||
if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)
|
if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)
|
||||||
{
|
{
|
||||||
write32le(kMOVI,fp->get_fp());
|
write32le(kMOVI,fp);
|
||||||
currMovieData.dump(fp, true);
|
currMovieData.dump(fp, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
write32le(kNOMO,fp->get_fp());
|
write32le(kNOMO,fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,7 +784,7 @@ bool mov_loadstate(EMUFILE* fp, int size)
|
||||||
load_successful = false;
|
load_successful = false;
|
||||||
|
|
||||||
u32 cookie;
|
u32 cookie;
|
||||||
if(read32le(&cookie,fp->get_fp()) != 1) return false;
|
if(read32le(&cookie,fp) != 1) return false;
|
||||||
if(cookie == kNOMO)
|
if(cookie == kNOMO)
|
||||||
return true;
|
return true;
|
||||||
else if(cookie != kMOVI)
|
else if(cookie != kMOVI)
|
||||||
|
@ -901,7 +901,7 @@ bool mov_loadstate(EMUFILE* fp, int size)
|
||||||
currMovieData.rerecordCount = currRerecordCount;
|
currMovieData.rerecordCount = currRerecordCount;
|
||||||
|
|
||||||
openRecordingMovie(curMovieFilename);
|
openRecordingMovie(curMovieFilename);
|
||||||
if(!osRecordingMovie->get_fp())
|
if(!osRecordingMovie)
|
||||||
{
|
{
|
||||||
osd->setLineColor(255, 0, 0);
|
osd->setLineColor(255, 0, 0);
|
||||||
osd->addLine("Can't save movie file!");
|
osd->addLine("Can't save movie file!");
|
||||||
|
@ -961,10 +961,10 @@ bool FCEUI_MovieGetInfo(std::istream* fp, MOVIE_INFO& info, bool skipFrameCount)
|
||||||
bool MovieRecord::parseBinary(MovieData* md, EMUFILE* fp)
|
bool MovieRecord::parseBinary(MovieData* md, EMUFILE* fp)
|
||||||
{
|
{
|
||||||
commands=fp->fgetc();
|
commands=fp->fgetc();
|
||||||
fp->fread((char *) &pad, sizeof pad,1);
|
fp->fread((char *) &pad, sizeof pad);
|
||||||
fp->fread((char *) &touch.x, sizeof touch.x,1);
|
fp->fread((char *) &touch.x, sizeof touch.x);
|
||||||
fp->fread((char *) &touch.y, sizeof touch.y,1);
|
fp->fread((char *) &touch.y, sizeof touch.y);
|
||||||
fp->fread((char *) &touch.touch, sizeof touch.touch,1);
|
fp->fread((char *) &touch.touch, sizeof touch.touch);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -972,10 +972,10 @@ bool MovieRecord::parseBinary(MovieData* md, EMUFILE* fp)
|
||||||
void MovieRecord::dumpBinary(MovieData* md, EMUFILE* fp, int index)
|
void MovieRecord::dumpBinary(MovieData* md, EMUFILE* fp, int index)
|
||||||
{
|
{
|
||||||
fp->fputc(md->records[index].commands);
|
fp->fputc(md->records[index].commands);
|
||||||
fp->fwrite((char *) &md->records[index].pad, sizeof md->records[index].pad,1);
|
fp->fwrite((char *) &md->records[index].pad, sizeof md->records[index].pad);
|
||||||
fp->fwrite((char *) &md->records[index].touch.x, sizeof md->records[index].touch.x,1);
|
fp->fwrite((char *) &md->records[index].touch.x, sizeof md->records[index].touch.x);
|
||||||
fp->fwrite((char *) &md->records[index].touch.y, sizeof md->records[index].touch.y,1);
|
fp->fwrite((char *) &md->records[index].touch.y, sizeof md->records[index].touch.y);
|
||||||
fp->fwrite((char *) &md->records[index].touch.touch, sizeof md->records[index].touch.touch,1);
|
fp->fwrite((char *) &md->records[index].touch.touch, sizeof md->records[index].touch.touch);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size)
|
void LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size)
|
||||||
|
@ -1076,7 +1076,7 @@ void FCEUI_MakeBackupMovie(bool dispMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
MovieData md = currMovieData; //Get current movie data
|
MovieData md = currMovieData; //Get current movie data
|
||||||
EMUFILE* outf = new EMUFILE(backupFn.c_str(),"wb"); //FCEUD_UTF8_fstream(backupFn, "wb"); //open/create file
|
EMUFILE* outf = new EMUFILE_FILE(backupFn.c_str(),"wb"); //FCEUD_UTF8_fstream(backupFn, "wb"); //open/create file
|
||||||
md.dump(outf,false); //dump movie data
|
md.dump(outf,false); //dump movie data
|
||||||
// delete outf; //clean up, delete file object
|
// delete outf; //clean up, delete file object
|
||||||
|
|
||||||
|
|
|
@ -23,71 +23,46 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
//well. just for the sake of consistency
|
//well. just for the sake of consistency
|
||||||
int write8le(u8 b, FILE *fp)
|
int write8le(u8 b, EMUFILE*os)
|
||||||
{
|
{
|
||||||
return((fwrite(&b,1,1,fp)<1)?0:1);
|
os->fwrite((char*)&b,1);
|
||||||
}
|
|
||||||
|
|
||||||
//well. just for the sake of consistency
|
|
||||||
int write8le(u8 b, std::ostream *os)
|
|
||||||
{
|
|
||||||
os->write((char*)&b,1);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//well. just for the sake of consistency
|
//well. just for the sake of consistency
|
||||||
int read8le(u8 *Bufo, std::istream *is)
|
int read8le(u8 *Bufo, EMUFILE*is)
|
||||||
{
|
{
|
||||||
if(is->read((char*)Bufo,1).gcount() != 1)
|
if(is->_fread((char*)Bufo,1) != 1)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
///writes a little endian 16bit value to the specified file
|
///writes a little endian 16bit value to the specified file
|
||||||
int write16le(u16 b, FILE *fp)
|
int write16le(u16 b, EMUFILE *fp)
|
||||||
{
|
{
|
||||||
u8 s[2];
|
u8 s[2];
|
||||||
s[0]=(u8)b;
|
s[0]=(u8)b;
|
||||||
s[1]=(u8)(b>>8);
|
s[1]=(u8)(b>>8);
|
||||||
return((fwrite(s,1,2,fp)<2)?0:2);
|
fp->fwrite(s,2);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///writes a little endian 16bit value to the specified file
|
|
||||||
int write16le(u16 b, std::ostream *os)
|
|
||||||
{
|
|
||||||
u8 s[2];
|
|
||||||
s[0]=(u8)b;
|
|
||||||
s[1]=(u8)(b>>8);
|
|
||||||
os->write((char*)&s,2);
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
///writes a little endian 32bit value to the specified file
|
|
||||||
int write32le(u32 b, FILE *fp)
|
|
||||||
{
|
|
||||||
u8 s[4];
|
|
||||||
s[0]=(u8)b;
|
|
||||||
s[1]=(u8)(b>>8);
|
|
||||||
s[2]=(u8)(b>>16);
|
|
||||||
s[3]=(u8)(b>>24);
|
|
||||||
return((fwrite(s,1,4,fp)<4)?0:4);
|
|
||||||
}
|
|
||||||
|
|
||||||
int write32le(u32 b, std::ostream* os)
|
///writes a little endian 32bit value to the specified file
|
||||||
|
int write32le(u32 b, EMUFILE *fp)
|
||||||
{
|
{
|
||||||
u8 s[4];
|
u8 s[4];
|
||||||
s[0]=(u8)b;
|
s[0]=(u8)b;
|
||||||
s[1]=(u8)(b>>8);
|
s[1]=(u8)(b>>8);
|
||||||
s[2]=(u8)(b>>16);
|
s[2]=(u8)(b>>16);
|
||||||
s[3]=(u8)(b>>24);
|
s[3]=(u8)(b>>24);
|
||||||
os->write((char*)&s,4);
|
fp->fwrite(s,4);
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
void writebool(bool b, std::ostream* os) { write32le(b?1:0,os); }
|
void writebool(bool b, EMUFILE* os) { write32le(b?1:0,os); }
|
||||||
|
|
||||||
int write64le(u64 b, std::ostream* os)
|
int write64le(u64 b, EMUFILE* os)
|
||||||
{
|
{
|
||||||
u8 s[8];
|
u8 s[8];
|
||||||
s[0]=(u8)b;
|
s[0]=(u8)b;
|
||||||
|
@ -98,16 +73,15 @@ int write64le(u64 b, std::ostream* os)
|
||||||
s[5]=(u8)(b>>40);
|
s[5]=(u8)(b>>40);
|
||||||
s[6]=(u8)(b>>48);
|
s[6]=(u8)(b>>48);
|
||||||
s[7]=(u8)(b>>56);
|
s[7]=(u8)(b>>56);
|
||||||
os->write((char*)&s,8);
|
os->fwrite((char*)&s,8);
|
||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///reads a little endian 32bit value from the specified file
|
int read32le(u32 *Bufo, EMUFILE *fp)
|
||||||
int read32le(u32 *Bufo, FILE *fp)
|
|
||||||
{
|
{
|
||||||
u32 buf;
|
u32 buf;
|
||||||
if(fread(&buf,1,4,fp)<4)
|
if(fp->_fread(&buf,4)<4)
|
||||||
return 0;
|
return 0;
|
||||||
#ifdef LOCAL_LE
|
#ifdef LOCAL_LE
|
||||||
*(u32*)Bufo=buf;
|
*(u32*)Bufo=buf;
|
||||||
|
@ -117,10 +91,10 @@ int read32le(u32 *Bufo, FILE *fp)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int read16le(u16 *Bufo, std::istream *is)
|
int read16le(u16 *Bufo, EMUFILE *is)
|
||||||
{
|
{
|
||||||
u16 buf;
|
u16 buf;
|
||||||
if(is->read((char*)&buf,2).gcount() != 2)
|
if(is->_fread((char*)&buf,2) != 2)
|
||||||
return 0;
|
return 0;
|
||||||
#ifdef LOCAL_LE
|
#ifdef LOCAL_LE
|
||||||
*Bufo=buf;
|
*Bufo=buf;
|
||||||
|
@ -130,11 +104,10 @@ int read16le(u16 *Bufo, std::istream *is)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
///reads a little endian 64bit value from the specified file
|
int read64le(u64 *Bufo, EMUFILE *is)
|
||||||
int read64le(u64 *Bufo, std::istream *is)
|
|
||||||
{
|
{
|
||||||
u64 buf;
|
u64 buf;
|
||||||
if(is->read((char*)&buf,8).gcount() != 8)
|
if(is->_fread((char*)&buf,8) != 8)
|
||||||
return 0;
|
return 0;
|
||||||
#ifdef LOCAL_LE
|
#ifdef LOCAL_LE
|
||||||
*Bufo=buf;
|
*Bufo=buf;
|
||||||
|
@ -157,7 +130,7 @@ int read32le(u32 *Bufo, std::istream *is)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int readbool(bool *b, std::istream* is)
|
int readbool(bool *b, EMUFILE* is)
|
||||||
{
|
{
|
||||||
u32 temp;
|
u32 temp;
|
||||||
int ret = read32le(&temp,is);
|
int ret = read32le(&temp,is);
|
||||||
|
@ -165,19 +138,19 @@ int readbool(bool *b, std::istream* is)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int readbuffer(std::vector<u8> &vec, std::istream* is)
|
int readbuffer(std::vector<u8> &vec, EMUFILE* is)
|
||||||
{
|
{
|
||||||
u32 size;
|
u32 size;
|
||||||
if(read32le(&size,is) != 1) return 0;
|
if(read32le(&size,is) != 1) return 0;
|
||||||
vec.resize(size);
|
vec.resize(size);
|
||||||
if(size>0) is->read((char*)&vec[0],size);
|
if(size>0) is->fread((char*)&vec[0],size);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int writebuffer(std::vector<u8>& vec, std::ostream* os)
|
int writebuffer(std::vector<u8>& vec, EMUFILE* os)
|
||||||
{
|
{
|
||||||
u32 size = vec.size();
|
u32 size = vec.size();
|
||||||
write32le(size,os);
|
write32le(size,os);
|
||||||
if(size>0) os->write((char*)&vec[0],size);
|
if(size>0) os->fwrite((char*)&vec[0],size);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,49 @@
|
||||||
|
/* Copyright (C) 2008-2009 DeSmuME team
|
||||||
|
*
|
||||||
|
* This file is part of DeSmuME
|
||||||
|
*
|
||||||
|
* DeSmuME is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* DeSmuME is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with DeSmuME; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef _READWRITE_H_
|
#ifndef _READWRITE_H_
|
||||||
#define _READWRITE_H_
|
#define _READWRITE_H_
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
#include "emufile.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
//well. just for the sake of consistency
|
//well. just for the sake of consistency
|
||||||
int write8le(u8 b, FILE *fp);
|
int write8le(u8 b, EMUFILE *fp);
|
||||||
int write8le(u8 b, std::ostream *os);
|
int write16le(u16 b, EMUFILE* os);
|
||||||
int write16le(u16 b, FILE *fp);
|
int write32le(u32 b, EMUFILE* os);
|
||||||
int write16le(u16 b, std::ostream* os);
|
int write64le(u64 b, EMUFILE* os);
|
||||||
int write32le(u32 b, FILE *fp);
|
|
||||||
int write32le(u32 b, std::ostream* os);
|
|
||||||
int write64le(u64 b, std::ostream* os);
|
|
||||||
int read64le(u64 *Bufo, std::istream *is);
|
|
||||||
int read32le(u32 *Bufo, std::istream *is);
|
|
||||||
inline int read32le(int *Bufo, std::istream *is) { return read32le((u32*)Bufo,is); }
|
|
||||||
int read32le(u32 *Bufo, FILE *fp);
|
|
||||||
int read16le(u16 *Bufo, std::istream *is);
|
|
||||||
inline int read16le(s16 *Bufo, std::istream* is) { return read16le((u16*)Bufo,is); }
|
|
||||||
int read8le(u8 *Bufo, std::istream *is);
|
|
||||||
int readbool(bool *b, std::istream* is);
|
|
||||||
void writebool(bool b, std::ostream* os);
|
|
||||||
|
|
||||||
int readbuffer(std::vector<u8> &vec, std::istream* is);
|
int read8le(u8 *Bufo, EMUFILE*is);
|
||||||
int writebuffer(std::vector<u8>& vec, std::ostream* os);
|
int read16le(u16 *Bufo, EMUFILE*is);
|
||||||
|
inline int read16le(s16 *Bufo, EMUFILE*is) { return read16le((u16*)Bufo,is); }
|
||||||
|
int read32le(u32 *Bufo, EMUFILE*is);
|
||||||
|
inline int read32le(s32 *Bufo, EMUFILE*is) { return read32le((u32*)Bufo,is); }
|
||||||
|
int read64le(u64 *Bufo, EMUFILE*is);
|
||||||
|
int read16le(u16 *Bufo, std::istream *is);
|
||||||
|
|
||||||
|
int readbool(bool *b, EMUFILE* is);
|
||||||
|
void writebool(bool b, EMUFILE* os);
|
||||||
|
|
||||||
|
int readbuffer(std::vector<u8> &vec, EMUFILE* is);
|
||||||
|
int writebuffer(std::vector<u8>& vec, EMUFILE* os);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* Copyright (C) 2006 Normmatt
|
/* Copyright (C) 2006 Normmatt
|
||||||
Copyright (C) 2006 Theo Berkau
|
Copyright (C) 2006 Theo Berkau
|
||||||
Copyright (C) 2007 Pascal Giard
|
Copyright (C) 2007 Pascal Giard
|
||||||
|
Copyright (C) 2008-2009 DeSmuME team
|
||||||
|
|
||||||
This file is part of DeSmuME
|
This file is part of DeSmuME
|
||||||
|
|
||||||
|
@ -263,7 +264,7 @@ SFORMAT SF_MOVIE[]={
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static void mmu_savestate(std::ostream* os)
|
static void mmu_savestate(EMUFILE* os)
|
||||||
{
|
{
|
||||||
//version
|
//version
|
||||||
write32le(2,os);
|
write32le(2,os);
|
||||||
|
@ -371,10 +372,10 @@ SFORMAT SF_WIFI[]={
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool mmu_loadstate(std::istream* is, int size)
|
static bool mmu_loadstate(EMUFILE* is, int size)
|
||||||
{
|
{
|
||||||
//read version
|
//read version
|
||||||
int version;
|
u32 version;
|
||||||
if(read32le(&version,is) != 1) return false;
|
if(read32le(&version,is) != 1) return false;
|
||||||
|
|
||||||
if(version == 0 || version == 1)
|
if(version == 0 || version == 1)
|
||||||
|
@ -394,7 +395,7 @@ static bool mmu_loadstate(std::istream* is, int size)
|
||||||
else if(version == 1)
|
else if(version == 1)
|
||||||
{
|
{
|
||||||
//version 1 reinitializes the save system with the type that was saved
|
//version 1 reinitializes the save system with the type that was saved
|
||||||
int bupmem_type;
|
u32 bupmem_type;
|
||||||
if(read32le(&bupmem_type,is) != 1) return false;
|
if(read32le(&bupmem_type,is) != 1) return false;
|
||||||
if(read32le(&bupmem_size,is) != 1) return false;
|
if(read32le(&bupmem_size,is) != 1) return false;
|
||||||
addr_size = BackupDevice::addr_size_for_old_save_type(bupmem_type);
|
addr_size = BackupDevice::addr_size_for_old_save_type(bupmem_type);
|
||||||
|
@ -406,7 +407,7 @@ static bool mmu_loadstate(std::istream* is, int size)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
u8* temp = new u8[bupmem_size];
|
u8* temp = new u8[bupmem_size];
|
||||||
is->read((char*)temp,bupmem_size);
|
is->fread((char*)temp,bupmem_size);
|
||||||
MMU_new.backupDevice.load_old_state(addr_size,temp,bupmem_size);
|
MMU_new.backupDevice.load_old_state(addr_size,temp,bupmem_size);
|
||||||
delete[] temp;
|
delete[] temp;
|
||||||
if(is->fail()) return false;
|
if(is->fail()) return false;
|
||||||
|
@ -420,7 +421,7 @@ static bool mmu_loadstate(std::istream* is, int size)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cp15_saveone(armcp15_t *cp15, std::ostream* os)
|
static void cp15_saveone(armcp15_t *cp15, EMUFILE* os)
|
||||||
{
|
{
|
||||||
write32le(cp15->IDCode,os);
|
write32le(cp15->IDCode,os);
|
||||||
write32le(cp15->cacheType,os);
|
write32le(cp15->cacheType,os);
|
||||||
|
@ -463,7 +464,7 @@ static void cp15_saveone(armcp15_t *cp15, std::ostream* os)
|
||||||
for(int i=0;i<8;i++) write32le(cp15->regionExecuteSet_SYS[i],os);
|
for(int i=0;i<8;i++) write32le(cp15->regionExecuteSet_SYS[i],os);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cp15_savestate(std::ostream* os)
|
static void cp15_savestate(EMUFILE* os)
|
||||||
{
|
{
|
||||||
//version
|
//version
|
||||||
write32le(0,os);
|
write32le(0,os);
|
||||||
|
@ -472,7 +473,7 @@ static void cp15_savestate(std::ostream* os)
|
||||||
cp15_saveone((armcp15_t *)NDS_ARM7.coproc[15],os);
|
cp15_saveone((armcp15_t *)NDS_ARM7.coproc[15],os);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool cp15_loadone(armcp15_t *cp15, std::istream* is)
|
static bool cp15_loadone(armcp15_t *cp15, EMUFILE* is)
|
||||||
{
|
{
|
||||||
if(!read32le(&cp15->IDCode,is)) return false;
|
if(!read32le(&cp15->IDCode,is)) return false;
|
||||||
if(!read32le(&cp15->cacheType,is)) return false;
|
if(!read32le(&cp15->cacheType,is)) return false;
|
||||||
|
@ -517,10 +518,10 @@ static bool cp15_loadone(armcp15_t *cp15, std::istream* is)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool cp15_loadstate(std::istream* is, int size)
|
static bool cp15_loadstate(EMUFILE* is, int size)
|
||||||
{
|
{
|
||||||
//read version
|
//read version
|
||||||
int version;
|
u32 version;
|
||||||
if(read32le(&version,is) != 1) return false;
|
if(read32le(&version,is) != 1) return false;
|
||||||
if(version != 0) return false;
|
if(version != 0) return false;
|
||||||
|
|
||||||
|
@ -729,18 +730,18 @@ static const SFORMAT *CheckS(const SFORMAT *guessSF, const SFORMAT *firstSF, u32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool ReadStateChunk(std::istream* is, const SFORMAT *sf, int size)
|
static bool ReadStateChunk(EMUFILE* is, const SFORMAT *sf, int size)
|
||||||
{
|
{
|
||||||
const SFORMAT *tmp = NULL;
|
const SFORMAT *tmp = NULL;
|
||||||
const SFORMAT *guessSF = NULL;
|
const SFORMAT *guessSF = NULL;
|
||||||
int temp = is->tellg();
|
int temp = is->ftell();
|
||||||
|
|
||||||
while(is->tellg()<temp+size)
|
while(is->ftell()<temp+size)
|
||||||
{
|
{
|
||||||
u32 sz, count;
|
u32 sz, count;
|
||||||
|
|
||||||
char toa[4];
|
char toa[4];
|
||||||
is->read(toa,4);
|
is->fread(toa,4);
|
||||||
if(is->fail())
|
if(is->fail())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -751,15 +752,15 @@ static bool ReadStateChunk(std::istream* is, const SFORMAT *sf, int size)
|
||||||
{
|
{
|
||||||
#ifdef LOCAL_LE
|
#ifdef LOCAL_LE
|
||||||
// no need to ever loop one at a time if not flipping byte order
|
// no need to ever loop one at a time if not flipping byte order
|
||||||
is->read((char *)tmp->v,sz*count);
|
is->fread((char *)tmp->v,sz*count);
|
||||||
#else
|
#else
|
||||||
if(sz == 1) {
|
if(sz == 1) {
|
||||||
//special case: read a huge byte array
|
//special case: read a huge byte array
|
||||||
is->read((char *)tmp->v,count);
|
is->fread((char *)tmp->v,count);
|
||||||
} else {
|
} else {
|
||||||
for(unsigned int i=0;i<count;i++)
|
for(unsigned int i=0;i<count;i++)
|
||||||
{
|
{
|
||||||
is->read((char *)tmp->v + i*sz,sz);
|
is->fread((char *)tmp->v + i*sz,sz);
|
||||||
FlipByteOrder((u8*)tmp->v + i*sz,sz);
|
FlipByteOrder((u8*)tmp->v + i*sz,sz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -768,7 +769,7 @@ static bool ReadStateChunk(std::istream* is, const SFORMAT *sf, int size)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
is->seekg(sz*count,std::ios::cur);
|
is->fseek(sz*count,SEEK_CUR);
|
||||||
guessSF = NULL;
|
guessSF = NULL;
|
||||||
}
|
}
|
||||||
} // while(...)
|
} // while(...)
|
||||||
|
@ -777,7 +778,7 @@ static bool ReadStateChunk(std::istream* is, const SFORMAT *sf, int size)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int SubWrite(std::ostream* os, const SFORMAT *sf)
|
static int SubWrite(EMUFILE* os, const SFORMAT *sf)
|
||||||
{
|
{
|
||||||
uint32 acc=0;
|
uint32 acc=0;
|
||||||
|
|
||||||
|
@ -816,21 +817,21 @@ static int SubWrite(std::ostream* os, const SFORMAT *sf)
|
||||||
|
|
||||||
if(os) //Are we writing or calculating the size of this block?
|
if(os) //Are we writing or calculating the size of this block?
|
||||||
{
|
{
|
||||||
os->write(sf->desc,4);
|
os->fwrite(sf->desc,4);
|
||||||
write32le(sf->size,os);
|
write32le(sf->size,os);
|
||||||
write32le(sf->count,os);
|
write32le(sf->count,os);
|
||||||
|
|
||||||
#ifdef LOCAL_LE
|
#ifdef LOCAL_LE
|
||||||
// no need to ever loop one at a time if not flipping byte order
|
// no need to ever loop one at a time if not flipping byte order
|
||||||
os->write((char *)sf->v,size*count);
|
os->fwrite((char *)sf->v,size*count);
|
||||||
#else
|
#else
|
||||||
if(sz == 1) {
|
if(sz == 1) {
|
||||||
//special case: write a huge byte array
|
//special case: write a huge byte array
|
||||||
os->write((char *)sf->v,count);
|
os->fwrite((char *)sf->v,1,count);
|
||||||
} else {
|
} else {
|
||||||
for(int i=0;i<count;i++) {
|
for(int i=0;i<count;i++) {
|
||||||
FlipByteOrder((u8*)sf->v + i*size, size);
|
FlipByteOrder((u8*)sf->v + i*size, size);
|
||||||
os->write((char*)sf->v + i*size,size);
|
os->fwrite((char*)sf->v + i*size,size);
|
||||||
//Now restore the original byte order.
|
//Now restore the original byte order.
|
||||||
FlipByteOrder((u8*)sf->v + i*size, size);
|
FlipByteOrder((u8*)sf->v + i*size, size);
|
||||||
}
|
}
|
||||||
|
@ -843,11 +844,11 @@ static int SubWrite(std::ostream* os, const SFORMAT *sf)
|
||||||
return(acc);
|
return(acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int savestate_WriteChunk(std::ostream* os, int type, const SFORMAT *sf)
|
static int savestate_WriteChunk(EMUFILE* os, int type, const SFORMAT *sf)
|
||||||
{
|
{
|
||||||
write32le(type,os);
|
write32le(type,os);
|
||||||
if(!sf) return 4;
|
if(!sf) return 4;
|
||||||
int bsize = SubWrite((std::ostream*)0,sf);
|
int bsize = SubWrite((EMUFILE*)0,sf);
|
||||||
write32le(bsize,os);
|
write32le(bsize,os);
|
||||||
|
|
||||||
if(!SubWrite(os,sf))
|
if(!SubWrite(os,sf))
|
||||||
|
@ -857,9 +858,9 @@ static int savestate_WriteChunk(std::ostream* os, int type, const SFORMAT *sf)
|
||||||
return (bsize+8);
|
return (bsize+8);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void savestate_WriteChunk(std::ostream* os, int type, void (*saveproc)(std::ostream* os))
|
static void savestate_WriteChunk(EMUFILE* os, int type, void (*saveproc)(EMUFILE* os))
|
||||||
{
|
{
|
||||||
u32 pos1 = os->tellp();
|
u32 pos1 = os->ftell();
|
||||||
|
|
||||||
//write the type, size(placeholder), and data
|
//write the type, size(placeholder), and data
|
||||||
write32le(type,os);
|
write32le(type,os);
|
||||||
|
@ -867,14 +868,14 @@ static void savestate_WriteChunk(std::ostream* os, int type, void (*saveproc)(st
|
||||||
saveproc(os);
|
saveproc(os);
|
||||||
|
|
||||||
//get the size
|
//get the size
|
||||||
u32 pos2 = os->tellp();
|
u32 pos2 = os->ftell();
|
||||||
assert(pos2 != (u32)-1); // if this assert fails, saveproc did something bad
|
assert(pos2 != (u32)-1); // if this assert fails, saveproc did something bad
|
||||||
u32 size = (pos2 - pos1) - (2 * sizeof(u32));
|
u32 size = (pos2 - pos1) - (2 * sizeof(u32));
|
||||||
|
|
||||||
//fill in the actual size
|
//fill in the actual size
|
||||||
os->seekp(pos1 + sizeof(u32));
|
os->fseek(pos1 + sizeof(u32),SEEK_SET);
|
||||||
write32le(size,os);
|
write32le(size,os);
|
||||||
os->seekp(pos2);
|
os->fseek(pos2,SEEK_SET);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// old version of this function,
|
// old version of this function,
|
||||||
|
@ -896,35 +897,32 @@ static void savestate_WriteChunk(std::ostream* os, int type, void (*saveproc)(st
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writechunks(std::ostream* os);
|
static void writechunks(EMUFILE* os);
|
||||||
|
|
||||||
static bool savestate_save(std::ostream* outstream, int compressionLevel)
|
static bool savestate_save(EMUFILE* outstream, int compressionLevel)
|
||||||
{
|
{
|
||||||
#ifndef HAVE_LIBZ
|
#ifndef HAVE_LIBZ
|
||||||
compressionLevel = Z_NO_COMPRESSION;
|
compressionLevel = Z_NO_COMPRESSION;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
memorystream ms;
|
EMUFILE_MEMORY ms;
|
||||||
std::ostream* os;
|
EMUFILE* os;
|
||||||
|
|
||||||
if(compressionLevel != Z_NO_COMPRESSION)
|
if(compressionLevel != Z_NO_COMPRESSION)
|
||||||
{
|
{
|
||||||
//generate the savestate in memory first
|
//generate the savestate in memory first
|
||||||
os = (std::ostream*)&ms;
|
os = (EMUFILE*)&ms;
|
||||||
writechunks(os);
|
writechunks(os);
|
||||||
ms.flush();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
os = outstream;
|
os = outstream;
|
||||||
os->seekp(32); //skip the header
|
os->fseek(32,SEEK_SET); //skip the header
|
||||||
writechunks(os);
|
writechunks(os);
|
||||||
}
|
}
|
||||||
|
|
||||||
os->flush();
|
|
||||||
|
|
||||||
//save the length of the file
|
//save the length of the file
|
||||||
u32 len = os->tellp();
|
u32 len = os->ftell();
|
||||||
|
|
||||||
u32 comprlen = 0xFFFFFFFF;
|
u32 comprlen = 0xFFFFFFFF;
|
||||||
u8* cbuf;
|
u8* cbuf;
|
||||||
|
@ -933,30 +931,29 @@ static bool savestate_save(std::ostream* outstream, int compressionLevel)
|
||||||
int error = Z_OK;
|
int error = Z_OK;
|
||||||
if(compressionLevel != Z_NO_COMPRESSION)
|
if(compressionLevel != Z_NO_COMPRESSION)
|
||||||
{
|
{
|
||||||
cbuf = (u8*)ms.buf();
|
cbuf = ms.buf();
|
||||||
uLongf comprlen2;
|
uLongf comprlen2;
|
||||||
//worst case compression.
|
//worst case compression.
|
||||||
//zlib says "0.1% larger than sourceLen plus 12 bytes"
|
//zlib says "0.1% larger than sourceLen plus 12 bytes"
|
||||||
comprlen = (len>>9)+12 + len;
|
comprlen = (len>>9)+12 + len;
|
||||||
cbuf = new u8[comprlen];
|
cbuf = new u8[comprlen];
|
||||||
/* Workaround to make it compile under linux 64bit */
|
// Workaround to make it compile under linux 64bit
|
||||||
comprlen2 = comprlen;
|
comprlen2 = comprlen;
|
||||||
error = compress2(cbuf,&comprlen2,(u8*)ms.buf(),len,compressionLevel);
|
error = compress2(cbuf,&comprlen2,ms.buf(),len,compressionLevel);
|
||||||
comprlen = (u32)comprlen2;
|
comprlen = (u32)comprlen2;
|
||||||
}
|
}
|
||||||
|
|
||||||
//dump the header
|
//dump the header
|
||||||
outstream->seekp(0);
|
outstream->fseek(0,SEEK_SET);
|
||||||
outstream->write(magic,16);
|
outstream->fwrite(magic,16);
|
||||||
write32le(SAVESTATE_VERSION,outstream);
|
write32le(SAVESTATE_VERSION,outstream);
|
||||||
write32le(DESMUME_VERSION_NUMERIC,outstream); //desmume version
|
write32le(DESMUME_VERSION_NUMERIC,outstream); //desmume version
|
||||||
write32le(len,outstream); //uncompressed length
|
write32le(len,outstream); //uncompressed length
|
||||||
write32le(comprlen,outstream); //compressed length (-1 if it is not compressed)
|
write32le(comprlen,outstream); //compressed length (-1 if it is not compressed)
|
||||||
outstream->flush();
|
|
||||||
|
|
||||||
if(compressionLevel != Z_NO_COMPRESSION)
|
if(compressionLevel != Z_NO_COMPRESSION)
|
||||||
{
|
{
|
||||||
outstream->write((char*)cbuf,comprlen==(u32)-1?len:comprlen);
|
outstream->fwrite((char*)cbuf,comprlen==(u32)-1?len:comprlen);
|
||||||
delete[] cbuf;
|
delete[] cbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -965,7 +962,7 @@ static bool savestate_save(std::ostream* outstream, int compressionLevel)
|
||||||
|
|
||||||
bool savestate_save (const char *file_name)
|
bool savestate_save (const char *file_name)
|
||||||
{
|
{
|
||||||
memorystream ms;
|
EMUFILE_MEMORY ms;
|
||||||
size_t elems_written;
|
size_t elems_written;
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
if(!savestate_save(&ms, Z_DEFAULT_COMPRESSION))
|
if(!savestate_save(&ms, Z_DEFAULT_COMPRESSION))
|
||||||
|
@ -973,7 +970,6 @@ bool savestate_save (const char *file_name)
|
||||||
if(!savestate_save(&ms, 0))
|
if(!savestate_save(&ms, 0))
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
ms.flush();
|
|
||||||
FILE* file = fopen(file_name,"wb");
|
FILE* file = fopen(file_name,"wb");
|
||||||
if(file)
|
if(file)
|
||||||
{
|
{
|
||||||
|
@ -985,7 +981,7 @@ bool savestate_save (const char *file_name)
|
||||||
|
|
||||||
extern SFORMAT SF_RTC[];
|
extern SFORMAT SF_RTC[];
|
||||||
|
|
||||||
static void writechunks(std::ostream* os) {
|
static void writechunks(EMUFILE* os) {
|
||||||
savestate_WriteChunk(os,1,SF_ARM9);
|
savestate_WriteChunk(os,1,SF_ARM9);
|
||||||
savestate_WriteChunk(os,2,SF_ARM7);
|
savestate_WriteChunk(os,2,SF_ARM7);
|
||||||
savestate_WriteChunk(os,3,cp15_savestate);
|
savestate_WriteChunk(os,3,cp15_savestate);
|
||||||
|
@ -1006,7 +1002,7 @@ static void writechunks(std::ostream* os) {
|
||||||
savestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0);
|
savestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ReadStateChunks(std::istream* is, s32 totalsize)
|
static bool ReadStateChunks(EMUFILE* is, s32 totalsize)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
while(totalsize > 0)
|
while(totalsize > 0)
|
||||||
|
@ -1075,11 +1071,11 @@ static void loadstate()
|
||||||
SetupMMU(nds.debugConsole);
|
SetupMMU(nds.debugConsole);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool savestate_load(std::istream* is)
|
static bool savestate_load(EMUFILE* is)
|
||||||
{
|
{
|
||||||
SAV_silent_fail_flag = false;
|
SAV_silent_fail_flag = false;
|
||||||
char header[16];
|
char header[16];
|
||||||
is->read(header,16);
|
is->fread(header,16);
|
||||||
if(is->fail() || memcmp(header,magic,16))
|
if(is->fail() || memcmp(header,magic,16))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -1091,7 +1087,7 @@ static bool savestate_load(std::istream* is)
|
||||||
|
|
||||||
if(ssversion != SAVESTATE_VERSION) return false;
|
if(ssversion != SAVESTATE_VERSION) return false;
|
||||||
|
|
||||||
std::vector<char> buf(len);
|
std::vector<u8> buf(len);
|
||||||
|
|
||||||
if(comprlen != 0xFFFFFFFF) {
|
if(comprlen != 0xFFFFFFFF) {
|
||||||
#ifndef HAVE_LIBZ
|
#ifndef HAVE_LIBZ
|
||||||
|
@ -1099,7 +1095,7 @@ static bool savestate_load(std::istream* is)
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
std::vector<char> cbuf(comprlen);
|
std::vector<char> cbuf(comprlen);
|
||||||
is->read(&cbuf[0],comprlen);
|
is->fread(&cbuf[0],comprlen);
|
||||||
if(is->fail()) return false;
|
if(is->fail()) return false;
|
||||||
|
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
|
@ -1109,7 +1105,7 @@ static bool savestate_load(std::istream* is)
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
is->read((char*)&buf[0],len);
|
is->fread((char*)&buf[0],len);
|
||||||
}
|
}
|
||||||
|
|
||||||
//GO!! READ THE SAVESTATE
|
//GO!! READ THE SAVESTATE
|
||||||
|
@ -1133,7 +1129,7 @@ static bool savestate_load(std::istream* is)
|
||||||
//gpu3D->NDS_3D_Reset();
|
//gpu3D->NDS_3D_Reset();
|
||||||
//SPU_Reset();
|
//SPU_Reset();
|
||||||
|
|
||||||
memorystream mstemp(&buf);
|
EMUFILE_MEMORY mstemp(&buf);
|
||||||
bool x = ReadStateChunks(&mstemp,(s32)len);
|
bool x = ReadStateChunks(&mstemp,(s32)len);
|
||||||
|
|
||||||
if(!x && !SAV_silent_fail_flag)
|
if(!x && !SAV_silent_fail_flag)
|
||||||
|
@ -1157,15 +1153,14 @@ static bool savestate_load(std::istream* is)
|
||||||
|
|
||||||
bool savestate_load(const char *file_name)
|
bool savestate_load(const char *file_name)
|
||||||
{
|
{
|
||||||
std::ifstream f;
|
EMUFILE_FILE f(file_name,"rb");
|
||||||
f.open(file_name,std::ios_base::binary|std::ios_base::in);
|
if(f.fail()) return false;
|
||||||
if(!f) return false;
|
|
||||||
|
|
||||||
return savestate_load(&f);
|
return savestate_load(&f);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::stack<memorystream*> rewindFreeList;
|
static std::stack<EMUFILE_MEMORY*> rewindFreeList;
|
||||||
static std::vector<memorystream*> rewindbuffer;
|
static std::vector<EMUFILE_MEMORY*> rewindbuffer;
|
||||||
|
|
||||||
int rewindstates = 16;
|
int rewindstates = 16;
|
||||||
int rewindinterval = 4;
|
int rewindinterval = 4;
|
||||||
|
@ -1178,21 +1173,17 @@ void rewindsave () {
|
||||||
//printf("rewindsave"); printf("%d%s", currFrameCounter, "\n");
|
//printf("rewindsave"); printf("%d%s", currFrameCounter, "\n");
|
||||||
|
|
||||||
|
|
||||||
memorystream *ms;
|
EMUFILE_MEMORY *ms;
|
||||||
if(!rewindFreeList.empty()) {
|
if(!rewindFreeList.empty()) {
|
||||||
ms = rewindFreeList.top();
|
ms = rewindFreeList.top();
|
||||||
rewindFreeList.pop();
|
rewindFreeList.pop();
|
||||||
} else {
|
} else {
|
||||||
ms = new memorystream();
|
ms = new EMUFILE_MEMORY(1024*1024*12);
|
||||||
}
|
}
|
||||||
|
|
||||||
ms->getStreambuf().expand(1024*1024*12);
|
|
||||||
|
|
||||||
if(!savestate_save(ms, Z_NO_COMPRESSION))
|
if(!savestate_save(ms, Z_NO_COMPRESSION))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ms->sync();
|
|
||||||
|
|
||||||
rewindbuffer.push_back(ms);
|
rewindbuffer.push_back(ms);
|
||||||
|
|
||||||
if((int)rewindbuffer.size() > rewindstates) {
|
if((int)rewindbuffer.size() > rewindstates) {
|
||||||
|
@ -1220,8 +1211,8 @@ void dorewind()
|
||||||
|
|
||||||
printf("%d", size);
|
printf("%d", size);
|
||||||
|
|
||||||
memorystream* loadms = rewindbuffer[size-1];
|
EMUFILE_MEMORY* loadms = rewindbuffer[size-1];
|
||||||
loadms->seekg(32, std::ios::beg);
|
loadms->fseek(32, SEEK_SET);
|
||||||
|
|
||||||
ReadStateChunks(loadms,loadms->size()-32);
|
ReadStateChunks(loadms,loadms->size()-32);
|
||||||
loadstate();
|
loadstate();
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
//taken from fceux on 10/27/08
|
//taken from fceux on 27-oct-2008
|
||||||
|
//subsequently modified for desmume
|
||||||
|
|
||||||
#ifndef _STRINGUTIL_H_
|
#ifndef _STRINGUTIL_H_
|
||||||
#define _STRINGUTIL_H_
|
#define _STRINGUTIL_H_
|
||||||
|
@ -11,6 +12,7 @@
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
|
#include "emufile.h"
|
||||||
|
|
||||||
|
|
||||||
//definitions for str_strip() flags
|
//definitions for str_strip() flags
|
||||||
|
@ -56,14 +58,14 @@ std::string stditoa(int n);
|
||||||
std::string readNullTerminatedAscii(std::istream* is);
|
std::string readNullTerminatedAscii(std::istream* is);
|
||||||
|
|
||||||
//extracts a decimal uint from an istream
|
//extracts a decimal uint from an istream
|
||||||
template<typename T> T templateIntegerDecFromIstream(std::istream* is)
|
template<typename T> T templateIntegerDecFromIstream(EMUFILE* is)
|
||||||
{
|
{
|
||||||
unsigned int ret = 0;
|
unsigned int ret = 0;
|
||||||
bool pre = true;
|
bool pre = true;
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
int c = is->get();
|
int c = is->fgetc();
|
||||||
if(c == -1) return ret;
|
if(c == -1) return ret;
|
||||||
int d = c - '0';
|
int d = c - '0';
|
||||||
if((d<0 || d>9))
|
if((d<0 || d>9))
|
||||||
|
@ -82,11 +84,11 @@ template<typename T> T templateIntegerDecFromIstream(std::istream* is)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline u32 u32DecFromIstream(std::istream* is) { return templateIntegerDecFromIstream<u32>(is); }
|
inline u32 u32DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream<u32>(is); }
|
||||||
inline u64 u64DecFromIstream(std::istream* is) { return templateIntegerDecFromIstream<u64>(is); }
|
inline u64 u64DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream<u64>(is); }
|
||||||
|
|
||||||
//puts an optionally 0-padded decimal integer of type T into the ostream (0-padding is quicker)
|
//puts an optionally 0-padded decimal integer of type T into the ostream (0-padding is quicker)
|
||||||
template<typename T, int DIGITS, bool PAD> void putdec(std::ostream* os, T dec)
|
template<typename T, int DIGITS, bool PAD> void putdec(EMUFILE* os, T dec)
|
||||||
{
|
{
|
||||||
char temp[DIGITS];
|
char temp[DIGITS];
|
||||||
int ctr = 0;
|
int ctr = 0;
|
||||||
|
@ -102,9 +104,9 @@ template<typename T, int DIGITS, bool PAD> void putdec(std::ostream* os, T dec)
|
||||||
dec = quot;
|
dec = quot;
|
||||||
}
|
}
|
||||||
if(!PAD)
|
if(!PAD)
|
||||||
os->write(temp+DIGITS-ctr-1,ctr+1);
|
os->fwrite(temp+DIGITS-ctr-1,ctr+1);
|
||||||
else
|
else
|
||||||
os->write(temp,DIGITS);
|
os->fwrite(temp,DIGITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement);
|
std::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8.00"
|
Version="8.00"
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
EnableFiberSafeOptimizations="false"
|
EnableFiberSafeOptimizations="false"
|
||||||
WholeProgramOptimization="false"
|
WholeProgramOptimization="false"
|
||||||
AdditionalIncludeDirectories=".;..;"lua\lua-5.1.4\src";"glib-2.20.1\build";"glib-2.20.1\build\glib";.\zlib123;.\zziplib;.\winpcap;userconfig;defaultconfig;.\7z;.\agg\include;.\agg\examples"
|
AdditionalIncludeDirectories=".;..;"lua\lua-5.1.4\src";"glib-2.20.1\build";"glib-2.20.1\build\glib";.\zlib123;.\zziplib;.\winpcap;userconfig;defaultconfig;.\7z;.\agg\include;.\agg\examples"
|
||||||
PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;DEBUG;_CRT_SECURE_NO_DEPRECATE;GLIB_STATIC_COMPILATION;WIN32;SPU_INTERPOLATE;HAVE_LIBZ;HAVE_LIBZZIP;NOMINMAX;EXPERIMENTAL_WIFI"
|
PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;DEBUG;_CRT_SECURE_NO_DEPRECATE;GLIB_STATIC_COMPILATION;WIN32;SPU_INTERPOLATE;HAVE_LIBZ;HAVE_LIBZZIP;NOMINMAX;EXPERIMENTAL_WIFI;_WIN32_WINNT=0x0400"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
BasicRuntimeChecks="0"
|
BasicRuntimeChecks="0"
|
||||||
BufferSecurityCheck="true"
|
BufferSecurityCheck="true"
|
||||||
|
@ -112,6 +112,205 @@
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)\__bins"
|
||||||
|
IntermediateDirectory="$(SolutionDir)\.VS2005\$(ConfigurationName)\$(PlatformName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
CommandLine="defaultconfig\SubWCRev.bat"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="MASM"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="2"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
OmitFramePointers="true"
|
||||||
|
EnableFiberSafeOptimizations="true"
|
||||||
|
WholeProgramOptimization="true"
|
||||||
|
AdditionalIncludeDirectories=".;..;"lua\lua-5.1.4\src";"glib-2.20.1\build";"glib-2.20.1\build\glib";.\zlib123;.\zziplib;.\winpcap;userconfig;defaultconfig;.\7z;.\agg\include;.\agg\examples"
|
||||||
|
PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;GLIB_STATIC_COMPILATION;WIN32;HAVE_LIBZ;HAVE_LIBZZIP;SPU_INTERPOLATE;NOMINMAX;NDEBUG;RELEASE;EXPERIMENTAL_WIFI;_WIN32_WINNT=0x0400"
|
||||||
|
StringPooling="true"
|
||||||
|
ExceptionHandling="1"
|
||||||
|
BasicRuntimeChecks="0"
|
||||||
|
StructMemberAlignment="0"
|
||||||
|
BufferSecurityCheck="false"
|
||||||
|
EnableFunctionLevelLinking="false"
|
||||||
|
EnableEnhancedInstructionSet="2"
|
||||||
|
FloatingPointModel="2"
|
||||||
|
RuntimeTypeInfo="false"
|
||||||
|
WarningLevel="1"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
CallingConvention="0"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="agg-2.5.lib lua-5.1.4-x86.lib glib-2.20.1-x86.lib vfw32.lib winmm.lib opengl32.lib glu32.lib ws2_32.lib user32.lib gdi32.lib directx\dxguid.lib shell32.lib comdlg32.lib directx\dxerr8.lib directx\dsound.lib directx\dinput8.lib directx\ddraw.lib zlib-2005-x32.lib zziplib-2005-x32.lib shlwapi.lib winpcap\wpcap.lib 7zip.lib"
|
||||||
|
OutputFile="$(OutDir)\$(ProjectName)_release.exe"
|
||||||
|
AdditionalLibraryDirectories=".\zlib123;.\zziplib;glib-2.20.1\lib;.\lua\lib;.\7z;agg"
|
||||||
|
DelayLoadDLLs="wpcap.dll"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
GenerateMapFile="true"
|
||||||
|
EnableCOMDATFolding="0"
|
||||||
|
OptimizeForWindows98="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
AdditionalManifestFiles="DeSmuME_x86.manifest"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release FastBuild|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)\__bins"
|
||||||
|
IntermediateDirectory="$(SolutionDir)\.VS2005\$(ConfigurationName)\$(PlatformName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
WholeProgramOptimization="0"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
CommandLine="defaultconfig\SubWCRev.bat"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="MASM"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="2"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
OmitFramePointers="true"
|
||||||
|
EnableFiberSafeOptimizations="true"
|
||||||
|
WholeProgramOptimization="false"
|
||||||
|
AdditionalIncludeDirectories=".;..;"lua\lua-5.1.4\src";"glib-2.20.1\build";"glib-2.20.1\build\glib";.\zlib123;.\zziplib;.\winpcap;userconfig;defaultconfig;.\7z;.\agg\include;.\agg\examples"
|
||||||
|
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;GLIB_STATIC_COMPILATION;WIN32;HAVE_LIBZ;HAVE_LIBZZIP;SPU_INTERPOLATE;NOMINMAX;NDEBUG;RELEASE;EXPERIMENTAL_WIFI;_WIN32_WINNT=0x0400"
|
||||||
|
StringPooling="true"
|
||||||
|
ExceptionHandling="1"
|
||||||
|
BasicRuntimeChecks="0"
|
||||||
|
StructMemberAlignment="0"
|
||||||
|
BufferSecurityCheck="false"
|
||||||
|
EnableFunctionLevelLinking="false"
|
||||||
|
EnableEnhancedInstructionSet="2"
|
||||||
|
FloatingPointModel="2"
|
||||||
|
RuntimeTypeInfo="false"
|
||||||
|
WarningLevel="3"
|
||||||
|
WarnAsError="false"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
CallingConvention="0"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="agg-2.5.lib lua-5.1.4-x86.lib glib-2.20.1-x86.lib vfw32.lib winmm.lib opengl32.lib glu32.lib ws2_32.lib user32.lib gdi32.lib directx\dxguid.lib shell32.lib comdlg32.lib directx\dxerr8.lib directx\dsound.lib directx\dinput8.lib directx\ddraw.lib zlib-2005-x32.lib zziplib-2005-x32.lib shlwapi.lib winpcap\wpcap.lib 7zip.lib"
|
||||||
|
OutputFile="$(OutDir)\$(ProjectName)_releaseFastBuild.exe"
|
||||||
|
AdditionalLibraryDirectories=".\zlib123;.\zziplib;glib-2.20.1\lib;.\lua\lib;.\7z;agg"
|
||||||
|
DelayLoadDLLs="wpcap.dll"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
GenerateMapFile="true"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="0"
|
||||||
|
OptimizeForWindows98="1"
|
||||||
|
LinkTimeCodeGeneration="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
AdditionalManifestFiles="DeSmuME_x86.manifest"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Debug|x64"
|
Name="Debug|x64"
|
||||||
OutputDirectory="$(SolutionDir)\__bins"
|
OutputDirectory="$(SolutionDir)\__bins"
|
||||||
|
@ -206,104 +405,6 @@
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)\__bins"
|
|
||||||
IntermediateDirectory="$(SolutionDir)\.VS2005\$(ConfigurationName)\$(PlatformName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
CommandLine="defaultconfig\SubWCRev.bat"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="MASM"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
FavorSizeOrSpeed="1"
|
|
||||||
OmitFramePointers="true"
|
|
||||||
EnableFiberSafeOptimizations="true"
|
|
||||||
WholeProgramOptimization="true"
|
|
||||||
AdditionalIncludeDirectories=".;..;"lua\lua-5.1.4\src";"glib-2.20.1\build";"glib-2.20.1\build\glib";.\zlib123;.\zziplib;.\winpcap;userconfig;defaultconfig;.\7z;.\agg\include;.\agg\examples"
|
|
||||||
PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;GLIB_STATIC_COMPILATION;WIN32;HAVE_LIBZ;HAVE_LIBZZIP;SPU_INTERPOLATE;NOMINMAX;NDEBUG;RELEASE;EXPERIMENTAL_WIFI"
|
|
||||||
StringPooling="true"
|
|
||||||
ExceptionHandling="1"
|
|
||||||
BasicRuntimeChecks="0"
|
|
||||||
StructMemberAlignment="0"
|
|
||||||
BufferSecurityCheck="false"
|
|
||||||
EnableFunctionLevelLinking="false"
|
|
||||||
EnableEnhancedInstructionSet="2"
|
|
||||||
FloatingPointModel="2"
|
|
||||||
RuntimeTypeInfo="false"
|
|
||||||
WarningLevel="1"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CallingConvention="0"
|
|
||||||
CompileAs="0"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="agg-2.5.lib lua-5.1.4-x86.lib glib-2.20.1-x86.lib vfw32.lib winmm.lib opengl32.lib glu32.lib ws2_32.lib user32.lib gdi32.lib directx\dxguid.lib shell32.lib comdlg32.lib directx\dxerr8.lib directx\dsound.lib directx\dinput8.lib directx\ddraw.lib zlib-2005-x32.lib zziplib-2005-x32.lib shlwapi.lib winpcap\wpcap.lib 7zip.lib"
|
|
||||||
OutputFile="$(OutDir)\$(ProjectName)_release.exe"
|
|
||||||
AdditionalLibraryDirectories=".\zlib123;.\zziplib;glib-2.20.1\lib;.\lua\lib;.\7z;agg"
|
|
||||||
DelayLoadDLLs="wpcap.dll"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
GenerateMapFile="true"
|
|
||||||
EnableCOMDATFolding="0"
|
|
||||||
OptimizeForWindows98="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
AdditionalManifestFiles="DeSmuME_x86.manifest"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Release|x64"
|
Name="Release|x64"
|
||||||
OutputDirectory="$(SolutionDir)\__bins"
|
OutputDirectory="$(SolutionDir)\__bins"
|
||||||
|
@ -404,107 +505,6 @@
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
|
||||||
Name="Release FastBuild|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)\__bins"
|
|
||||||
IntermediateDirectory="$(SolutionDir)\.VS2005\$(ConfigurationName)\$(PlatformName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
WholeProgramOptimization="0"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
CommandLine="defaultconfig\SubWCRev.bat"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="MASM"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
FavorSizeOrSpeed="1"
|
|
||||||
OmitFramePointers="true"
|
|
||||||
EnableFiberSafeOptimizations="true"
|
|
||||||
WholeProgramOptimization="false"
|
|
||||||
AdditionalIncludeDirectories=".;..;"lua\lua-5.1.4\src";"glib-2.20.1\build";"glib-2.20.1\build\glib";.\zlib123;.\zziplib;.\winpcap;userconfig;defaultconfig;.\7z;.\agg\include;.\agg\examples"
|
|
||||||
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;GLIB_STATIC_COMPILATION;WIN32;HAVE_LIBZ;HAVE_LIBZZIP;SPU_INTERPOLATE;NOMINMAX;NDEBUG;RELEASE;EXPERIMENTAL_WIFI"
|
|
||||||
StringPooling="true"
|
|
||||||
ExceptionHandling="1"
|
|
||||||
BasicRuntimeChecks="0"
|
|
||||||
StructMemberAlignment="0"
|
|
||||||
BufferSecurityCheck="false"
|
|
||||||
EnableFunctionLevelLinking="false"
|
|
||||||
EnableEnhancedInstructionSet="2"
|
|
||||||
FloatingPointModel="2"
|
|
||||||
RuntimeTypeInfo="false"
|
|
||||||
WarningLevel="3"
|
|
||||||
WarnAsError="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CallingConvention="0"
|
|
||||||
CompileAs="0"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="agg-2.5.lib lua-5.1.4-x86.lib glib-2.20.1-x86.lib vfw32.lib winmm.lib opengl32.lib glu32.lib ws2_32.lib user32.lib gdi32.lib directx\dxguid.lib shell32.lib comdlg32.lib directx\dxerr8.lib directx\dsound.lib directx\dinput8.lib directx\ddraw.lib zlib-2005-x32.lib zziplib-2005-x32.lib shlwapi.lib winpcap\wpcap.lib 7zip.lib"
|
|
||||||
OutputFile="$(OutDir)\$(ProjectName)_releaseFastBuild.exe"
|
|
||||||
AdditionalLibraryDirectories=".\zlib123;.\zziplib;glib-2.20.1\lib;.\lua\lib;.\7z;agg"
|
|
||||||
DelayLoadDLLs="wpcap.dll"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
GenerateMapFile="true"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="0"
|
|
||||||
OptimizeForWindows98="1"
|
|
||||||
LinkTimeCodeGeneration="0"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
AdditionalManifestFiles="DeSmuME_x86.manifest"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Release FastBuild|x64"
|
Name="Release FastBuild|x64"
|
||||||
OutputDirectory="$(SolutionDir)\__bins"
|
OutputDirectory="$(SolutionDir)\__bins"
|
||||||
|
@ -990,15 +990,6 @@
|
||||||
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
|
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
ObjectFile="$(IntDir)\$(InputName)1.obj"
|
|
||||||
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="Release|Win32"
|
Name="Release|Win32"
|
||||||
>
|
>
|
||||||
|
@ -1009,7 +1000,7 @@
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="Release|x64"
|
Name="Release FastBuild|Win32"
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
|
@ -1018,7 +1009,16 @@
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="Release FastBuild|Win32"
|
Name="Debug|x64"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
ObjectFile="$(IntDir)\$(InputName)1.obj"
|
||||||
|
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|x64"
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
|
@ -1170,7 +1170,7 @@
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="Release|x64"
|
Name="Release FastBuild|Win32"
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
|
@ -1178,7 +1178,7 @@
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="Release FastBuild|Win32"
|
Name="Release|x64"
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
|
@ -1242,6 +1242,10 @@
|
||||||
RelativePath="..\dscard.h"
|
RelativePath="..\dscard.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\emufile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\fat.h"
|
RelativePath="..\fat.h"
|
||||||
>
|
>
|
||||||
|
|
|
@ -239,27 +239,27 @@ u8 Mic_ReadSample()
|
||||||
}
|
}
|
||||||
|
|
||||||
// maybe a bit paranoid...
|
// maybe a bit paranoid...
|
||||||
void mic_savestate(std::ostream* os)
|
void mic_savestate(EMUFILE* os)
|
||||||
{
|
{
|
||||||
//version
|
//version
|
||||||
write32le(0,os);
|
write32le(0,os);
|
||||||
assert(MIC_BUFSIZE == 4096); // else needs new version
|
assert(MIC_BUFSIZE == 4096); // else needs new version
|
||||||
|
|
||||||
os->write((char*)Mic_Buffer[0], MIC_BUFSIZE);
|
os->fwrite((char*)Mic_Buffer[0], MIC_BUFSIZE);
|
||||||
os->write((char*)Mic_Buffer[1], MIC_BUFSIZE);
|
os->fwrite((char*)Mic_Buffer[1], MIC_BUFSIZE);
|
||||||
write16le(Mic_BufPos,os);
|
write16le(Mic_BufPos,os);
|
||||||
write8le(Mic_WriteBuf,os); // seems OK to save...
|
write8le(Mic_WriteBuf,os); // seems OK to save...
|
||||||
write8le(Mic_PlayBuf,os);
|
write8le(Mic_PlayBuf,os);
|
||||||
write32le(micReadSamplePos,os);
|
write32le(micReadSamplePos,os);
|
||||||
}
|
}
|
||||||
bool mic_loadstate(std::istream* is, int size)
|
bool mic_loadstate(EMUFILE* is, int size)
|
||||||
{
|
{
|
||||||
u32 version;
|
u32 version;
|
||||||
if(read32le(&version,is) != 1) return false;
|
if(read32le(&version,is) != 1) return false;
|
||||||
if(version > 0) { is->seekg(size-4, std::ios::cur); return true; }
|
if(version > 0) { is->fseek(size-4, SEEK_CUR); return true; }
|
||||||
|
|
||||||
is->read((char*)Mic_Buffer[0], MIC_BUFSIZE);
|
is->fread((char*)Mic_Buffer[0], MIC_BUFSIZE);
|
||||||
is->read((char*)Mic_Buffer[1], MIC_BUFSIZE);
|
is->fread((char*)Mic_Buffer[1], MIC_BUFSIZE);
|
||||||
read16le(&Mic_BufPos,is);
|
read16le(&Mic_BufPos,is);
|
||||||
read8le(&Mic_WriteBuf,is);
|
read8le(&Mic_WriteBuf,is);
|
||||||
read8le(&Mic_PlayBuf,is);
|
read8le(&Mic_PlayBuf,is);
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
/* Copyright (C) 2008-2009 DeSmuME team
|
||||||
|
|
||||||
|
This file is part of DeSmuME
|
||||||
|
|
||||||
|
DeSmuME is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
DeSmuME is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with DeSmuME; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
@ -98,10 +118,10 @@ static char playfilename[MAX_PATH] = "";
|
||||||
|
|
||||||
void Describe(HWND hwndDlg)
|
void Describe(HWND hwndDlg)
|
||||||
{
|
{
|
||||||
EMUFILE* fp = new EMUFILE(playfilename,"rb");
|
EMUFILE* fp = new EMUFILE_FILE(playfilename,"rb");
|
||||||
MovieData md;
|
MovieData md;
|
||||||
LoadFM2(md, fp, INT_MAX, false);
|
LoadFM2(md, fp, INT_MAX, false);
|
||||||
fs.close();
|
delete fp;
|
||||||
|
|
||||||
u32 num_frames = md.records.size();
|
u32 num_frames = md.records.size();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue