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:
zeromus 2009-08-26 08:54:48 +00:00
parent fce7cb2701
commit e05c17dfbb
21 changed files with 730 additions and 488 deletions

View File

@ -4,6 +4,7 @@
Copyright (C) 2006-2007 Theo Berkau
Copyright (C) 2007 shash
Copyright (C) 2008-2009 DeSmuME team
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);
}
void gpu_savestate(std::ostream* os)
void gpu_savestate(EMUFILE* os)
{
//version
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].y,os);
@ -2617,10 +2618,10 @@ void gpu_savestate(std::ostream* 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
int version;
u32 version;
//sigh.. shouldve used a new version number
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;
is->read((char*)GPU_screen,sizeof(GPU_screen));
is->fread((char*)GPU_screen,sizeof(GPU_screen));
if(version==1)
{

View File

@ -4,6 +4,7 @@
Copyright (C) 2006-2007 Theo Berkau
Copyright (C) 2007 shash
Copyright (C) 2009-2009 DeSmuME team
This file is part of DeSmuME
@ -36,8 +37,8 @@
//#undef FORCEINLINE
//#define FORCEINLINE
void gpu_savestate(std::ostream* os);
bool gpu_loadstate(std::istream* is, int size);
void gpu_savestate(EMUFILE* os);
bool gpu_loadstate(EMUFILE* is, int size);
/*******************************************************************************
this structure is for display control,

View File

@ -1,4 +1,3 @@
/* Copyright (C) 2006 yopyop
yopyop156@ifrance.com
yopyop156.ifrance.com
@ -1507,14 +1506,14 @@ struct TSequenceItem
u32 param;
bool enabled;
virtual void save(std::ostream* os)
virtual void save(EMUFILE* os)
{
write64le(timestamp,os);
write32le(param,os);
writebool(enabled,os);
}
virtual bool load(std::istream* is)
virtual bool load(EMUFILE* is)
{
if(read64le(&timestamp,is) != 1) return false;
if(read32le(&param,is) != 1) return false;
@ -1730,7 +1729,7 @@ struct Sequencer
void execHardware();
u64 findNext();
void save(std::ostream* os)
void save(EMUFILE* os)
{
write64le(nds_timer,os);
write64le(nds_arm9_timer,os);
@ -1748,7 +1747,7 @@ struct Sequencer
#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_arm9_timer,is) != 1) return false;
@ -2054,10 +2053,10 @@ void Sequencer::execHardware()
void execHardware_interrupts();
static void saveUserInput(std::ostream* os);
static bool loadUserInput(std::istream* is, int version);
static void saveUserInput(EMUFILE* os);
static bool loadUserInput(EMUFILE* is, int version);
void nds_savestate(std::ostream* os)
void nds_savestate(EMUFILE* os)
{
//version
write32le(2,os);
@ -2067,10 +2066,10 @@ void nds_savestate(std::ostream* os)
saveUserInput(os);
}
bool nds_loadstate(std::istream* is, int size)
bool nds_loadstate(EMUFILE* is, int size)
{
//read version
int version;
u32 version;
if(read32le(&version,is) != 1) 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);
write16le(input.touch.touchX, os);
write16le(input.touch.touchY, 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);
read16le(&input.touch.touchX, is);
read16le(&input.touch.touchY, is);
@ -2576,7 +2575,7 @@ static bool loadUserInput(std::istream* is, UserInput& input, int version)
return true;
}
// (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, 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++)
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;
rv &= loadUserInput(is, finalUserInput, version);
rv &= loadUserInput(is, intermediateUserInput, version);
readbool(&validToProcessInput, is);
for(int i = 0; i < 14; i++)
read32le(&TurboTime.array[i], is);
read32le((u32*)&TurboTime.array[i], is);
return rv;
}

View File

@ -32,6 +32,7 @@
#include "SPU.h"
#include "mem.h"
#include "wifi.h"
#include "emufile.h"
#include <string>
@ -295,7 +296,7 @@ struct UserTouch
};
struct UserMicrophone
{
BOOL micButtonPressed;
u32 micButtonPressed;
};
struct UserInput
{
@ -347,8 +348,8 @@ void NDS_Reset();
int NDS_ImportSave(const char *filename);
bool NDS_ExportSave(const char *filename);
void nds_savestate(std::ostream* os);
bool nds_loadstate(std::istream* is, int size);
void nds_savestate(EMUFILE* os);
bool nds_loadstate(EMUFILE* is, int size);
int NDS_WriteBMP(const char *filename);
int NDS_LoadFirmware(const char *filename);

View File

@ -1242,7 +1242,7 @@ void WAV_WavSoundUpdate(void* soundData, int numSamples)
//////////////////////////////////////////////////////////////////////////////
void spu_savestate(std::ostream* os)
void spu_savestate(EMUFILE* os)
{
//version
write32le(2,os);
@ -1277,12 +1277,12 @@ void spu_savestate(std::ostream* os)
write64le(double_to_u64(samples),os);
}
bool spu_loadstate(std::istream* is, int size)
bool spu_loadstate(EMUFILE* is, int size)
{
u64 temp64;
//read version
int version;
u32 version;
if(read32le(&version,is) != 1) return false;
SPU_struct *spu = SPU_core;

View File

@ -23,11 +23,13 @@
#ifndef SPU_H
#define SPU_H
#include "types.h"
#include "matrix.h"
#include <iosfwd>
#include <string>
#include <assert.h>
#include "types.h"
#include "matrix.h"
#include "emufile.h"
#define SNDCORE_DEFAULT -1
#define SNDCORE_DUMMY 0
@ -73,7 +75,7 @@ struct channel_struct
channel_struct()
: cacheItem(NULL)
{}
int num;
u32 num;
u8 vol;
u8 datashift;
u8 hold;
@ -144,8 +146,8 @@ void SPU_Emulate_user(void);
extern SPU_struct *SPU_core, *SPU_user;
extern int spu_core_samples;
void spu_savestate(std::ostream* os);
bool spu_loadstate(std::istream* is, int size);
void spu_savestate(EMUFILE* os);
bool spu_loadstate(EMUFILE* is, int size);
class WavWriter
{

View File

@ -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
#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:
FILE* fp;
public:
EMUFILE(const char* fname, const char* mode)
EMUFILE_FILE(const char* fname, const char* 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;
}
int fprintf(const char *format, ...) {
return ::fprintf(fp, format);
virtual int fprintf(const char *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);
}
int fputc(int c) {
virtual int fputc(int c) {
return ::fputc(c, fp);
}
size_t fread(void *ptr, size_t size, size_t nobj){
return ::fread(ptr, size, nobj, fp);
virtual size_t _fread(const void *ptr, size_t bytes){
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){
return ::fwrite(ptr, size, nobj, fp);
//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){
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);
}
long int ftell() {
return ::ftell(fp);
virtual int ftell() {
return (u32)::ftell(fp);
}
virtual int size() {
int oldpos = ftell();
fseek(0,SEEK_END);
int len = ftell();
fseek(oldpos,SEEK_SET);
return len;
}
};

View File

@ -2446,7 +2446,7 @@ SFORMAT SF_GFX3D[]={
};
//-------------savestate
void gfx3d_savestate(std::ostream* os)
void gfx3d_savestate(EMUFILE* os)
{
//version
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;
if(read32le(&version,is) != 1) return false;

View File

@ -24,10 +24,12 @@
#ifndef _GFX3D_H_
#define _GFX3D_H_
#include "types.h"
#include <iosfwd>
#include <ostream>
#include <istream>
#include "types.h"
#include "emufile.h"
//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))
@ -89,8 +91,8 @@ inline u32 gfx3d_extendDepth_15_to_24(u32 depth)
void gfx3d_init();
void gfx3d_reset();
#define OSWRITE(x) os->write((char*)&(x),sizeof((x)));
#define OSREAD(x) is->read((char*)&(x),sizeof((x)));
#define OSWRITE(x) os->fwrite((char*)&(x),sizeof((x)));
#define OSREAD(x) is->fread((char*)&(x),sizeof((x)));
struct POLY {
int type; //tri or quad
@ -116,7 +118,7 @@ struct POLY {
int getAlpha() { return (polyAttr>>16)&0x1F; }
void save(std::ostream* os)
void save(EMUFILE* os)
{
OSWRITE(type);
OSWRITE(vertIndexes[0]); OSWRITE(vertIndexes[1]); OSWRITE(vertIndexes[2]); OSWRITE(vertIndexes[3]);
@ -126,7 +128,7 @@ struct POLY {
OSWRITE(maxy);
}
void load(std::istream* is)
void load(EMUFILE* is)
{
OSREAD(type);
OSREAD(vertIndexes[0]); OSREAD(vertIndexes[1]); OSREAD(vertIndexes[2]); OSREAD(vertIndexes[3]);
@ -164,14 +166,14 @@ struct VERT {
fcolor[1] = color[1];
fcolor[2] = color[2];
}
void save(std::ostream* os)
void save(EMUFILE* os)
{
OSWRITE(x); OSWRITE(y); OSWRITE(z); OSWRITE(w);
OSWRITE(u); OSWRITE(v);
OSWRITE(color[0]); OSWRITE(color[1]); OSWRITE(color[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(u); OSREAD(v);
@ -346,7 +348,7 @@ void gfx3d_GetLineData15bpp(int line, u16** dst);
struct SFORMAT;
extern SFORMAT SF_GFX3D[];
void gfx3d_savestate(std::ostream* os);
bool gfx3d_loadstate(std::istream* is, int size);
void gfx3d_savestate(EMUFILE* os);
bool gfx3d_loadstate(EMUFILE* is, int size);
#endif

View File

@ -226,9 +226,9 @@ u8 fw_transfer(memory_chip_t *mc, u8 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(write_enable,os);
write32le(com,os);
@ -241,12 +241,12 @@ bool BackupDevice::save_state(std::ostream* os)
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(version==0 || version==1) {
read32le(&write_enable,is);
readbool(&write_enable,is);
read32le(&com,is);
read32le(&addr_size,is);
read32le(&addr_counter,is);
@ -731,10 +731,11 @@ void BackupDevice::loadfile()
if(isMovieMode) return;
if(filename.length() ==0) return; //No sense crashing if no filename supplied
FILE* inf = fopen(filename.c_str(),"rb");
if(!inf)
EMUFILE_FILE* inf = new EMUFILE_FILE(filename.c_str(),"rb");
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");
//change extension to sav
@ -743,13 +744,14 @@ void BackupDevice::loadfile()
tmp[strlen(tmp)-3] = 0;
strcat(tmp,"sav");
inf = fopen(tmp,"rb");
if(!inf)
inf = new EMUFILE_FILE(tmp,"rb");
if(inf->fail())
{
delete inf;
printf("Missing save file %s\n",filename.c_str());
return;
}
fclose(inf);
delete inf;
if (!load_no_gba(tmp))
load_raw(tmp);
@ -759,29 +761,29 @@ void BackupDevice::loadfile()
//scan for desmume save footer
const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie);
char *sigbuf = new char[cookieLen];
fseek(inf, -cookieLen, SEEK_END);
fread(sigbuf,1,cookieLen,inf);
inf->fseek(-cookieLen, SEEK_END);
inf->fread(sigbuf,cookieLen);
int cmp = memcmp(sigbuf,kDesmumeSaveCookie,cookieLen);
delete[] sigbuf;
if(cmp)
{
//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");
fclose(inf);
delete inf;
if (!load_no_gba(filename.c_str()))
load_raw(filename.c_str());
return;
}
//desmume format
fseek(inf, -cookieLen, SEEK_END);
fseek(inf, -4, SEEK_CUR);
inf->fseek(-cookieLen, SEEK_END);
inf->fseek(-4, SEEK_CUR);
u32 version = 0xFFFFFFFF;
read32le(&version,inf);
if(version!=0) {
printf("Unknown save file format\n");
return;
}
fseek(inf, -24, SEEK_CUR);
inf->fseek(-24, SEEK_CUR);
struct {
u32 size,padSize,type,addr_size,mem_size;
} info;
@ -793,14 +795,14 @@ void BackupDevice::loadfile()
//establish the save data
data.resize(info.size);
fseek(inf, 0, SEEK_SET);
inf->fseek(0, SEEK_SET);
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;
addr_size = info.addr_size;
//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
if(isMovieMode) return;
FILE* outf = fopen(filename.c_str(),"wb");
if(outf)
EMUFILE* outf = new EMUFILE_FILE(filename.c_str(),"wb");
if(!outf->fail())
{
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
//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);
for(u32 i=size;i<padSize;i++)
fputc(kUninitializedSaveDataValue,outf);
outf->fputc(kUninitializedSaveDataValue);
//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
write32le(size,outf); //the size of data that has actually been written
@ -872,13 +874,13 @@ void BackupDevice::flush()
write32le(addr_size,outf);
write32le(0,outf); //save memory size
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
fclose(outf);
delete outf;
}
else
{
delete outf;
printf("Unable to open savefile %s\n",filename.c_str());
}
}

View File

@ -1,5 +1,6 @@
/* Copyright (C) 2006 thoduv
Copyright (C) 2006 Theo Berkau
Copyright (C) 2008-2009 DeSmuME team
This file is part of DeSmuME
@ -25,6 +26,7 @@
#include <vector>
#include <string>
#include "types.h"
#include "emufile.h"
#define MC_TYPE_AUTODETECT 0x0
#define MC_TYPE_EEPROM1 0x1
@ -76,8 +78,8 @@ public:
void reset();
void close_rom();
bool save_state(std::ostream* os);
bool load_state(std::istream* is);
bool save_state(EMUFILE* os);
bool load_state(EMUFILE* is);
//commands from mmu
void reset_command();
@ -110,7 +112,7 @@ public:
void lazy_flush();
private:
BOOL write_enable; //is write enabled?
bool write_enable; //is write enabled?
u32 com; //persistent command actually handled
u32 addr_size, addr_counter;
u32 addr;

View File

@ -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_
#define _memorystream_h_

View File

@ -38,7 +38,7 @@ void Mic_Reset();
void Mic_DeInit();
u8 Mic_ReadSample();
void mic_savestate(std::ostream* os);
bool mic_loadstate(std::istream* is, int size);
void mic_savestate(EMUFILE* os);
bool mic_loadstate(EMUFILE* is, int size);
#endif

View File

@ -118,7 +118,7 @@ void MovieRecord::parsePad(EMUFILE* fp, u16& pad)
{
char buf[13];
fp->fread(buf,13,1);
fp->fread(buf,13);
pad = 0;
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
//extract the commands
commands = u32DecFromIstream(fp->get_fp());
commands = u32DecFromIstream(fp);
fp->fgetc(); //eat the pipe
parsePad(fp, pad);
touch.x = u32DecFromIstream(fp->get_fp());
touch.y = u32DecFromIstream(fp->get_fp());
touch.touch = u32DecFromIstream(fp->get_fp());
touch.x = u32DecFromIstream(fp);
touch.y = u32DecFromIstream(fp);
touch.touch = u32DecFromIstream(fp);
fp->fgetc(); //eat the pipe
@ -153,13 +153,13 @@ void MovieRecord::dump(MovieData* md, EMUFILE* fp, int index)
//dump the misc commands
//*os << '|' << setw(1) << (int)commands;
fp->fputc('|');
putdec<uint8,1,true>(fp->get_fp(),commands);
putdec<uint8,1,true>(fp,commands);
fp->fputc('|');
dumpPad(fp, pad);
putdec<u8,3,true>(fp->get_fp(),touch.x); fp->fputc(' ');
putdec<u8,3,true>(fp->get_fp(),touch.y); fp->fputc(' ');
putdec<u8,1,true>(fp->get_fp(),touch.touch);
putdec<u8,3,true>(fp,touch.x); fp->fputc(' ');
putdec<u8,3,true>(fp,touch.y); fp->fputc(' ');
putdec<u8,1,true>(fp,touch.touch);
fp->fputc('|');
//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"
char buf[9];
curr = fp->ftell();
fp->fread(buf,9,1);
fp->fread(buf,9);
fp->fseek(curr, SEEK_SET);
// if(fp->fail()) return false;
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 opened = false;
// {
EMUFILE* fp = new EMUFILE(fname, "rb");
EMUFILE* fp = new EMUFILE_FILE(fname, "rb");
// if(fs.is_open())
// {
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)
{
//osRecordingMovie = FCEUD_UTF8_fstream(fname, "wb");
osRecordingMovie = new EMUFILE(fname, "wb");
osRecordingMovie = new EMUFILE_FILE(fname, "wb");
/*if(!osRecordingMovie)
FCEU_PrintError("Error opening movie output file: %s",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.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
@ -766,12 +766,12 @@ void mov_savestate(EMUFILE* fp)
//else return 0;
if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)
{
write32le(kMOVI,fp->get_fp());
write32le(kMOVI,fp);
currMovieData.dump(fp, true);
}
else
{
write32le(kNOMO,fp->get_fp());
write32le(kNOMO,fp);
}
}
@ -784,7 +784,7 @@ bool mov_loadstate(EMUFILE* fp, int size)
load_successful = false;
u32 cookie;
if(read32le(&cookie,fp->get_fp()) != 1) return false;
if(read32le(&cookie,fp) != 1) return false;
if(cookie == kNOMO)
return true;
else if(cookie != kMOVI)
@ -901,7 +901,7 @@ bool mov_loadstate(EMUFILE* fp, int size)
currMovieData.rerecordCount = currRerecordCount;
openRecordingMovie(curMovieFilename);
if(!osRecordingMovie->get_fp())
if(!osRecordingMovie)
{
osd->setLineColor(255, 0, 0);
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)
{
commands=fp->fgetc();
fp->fread((char *) &pad, sizeof pad,1);
fp->fread((char *) &touch.x, sizeof touch.x,1);
fp->fread((char *) &touch.y, sizeof touch.y,1);
fp->fread((char *) &touch.touch, sizeof touch.touch,1);
fp->fread((char *) &pad, sizeof pad);
fp->fread((char *) &touch.x, sizeof touch.x);
fp->fread((char *) &touch.y, sizeof touch.y);
fp->fread((char *) &touch.touch, sizeof touch.touch);
return true;
}
@ -972,10 +972,10 @@ bool MovieRecord::parseBinary(MovieData* md, EMUFILE* fp)
void MovieRecord::dumpBinary(MovieData* md, EMUFILE* fp, int index)
{
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].touch.x, sizeof md->records[index].touch.x,1);
fp->fwrite((char *) &md->records[index].touch.y, sizeof md->records[index].touch.y,1);
fp->fwrite((char *) &md->records[index].touch.touch, sizeof md->records[index].touch.touch,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);
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);
}
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
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
// delete outf; //clean up, delete file object

View File

@ -23,71 +23,46 @@
#include "types.h"
//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);
}
//well. just for the sake of consistency
int write8le(u8 b, std::ostream *os)
{
os->write((char*)&b,1);
os->fwrite((char*)&b,1);
return 1;
}
//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 1;
}
///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];
s[0]=(u8)b;
s[1]=(u8)(b>>8);
return((fwrite(s,1,2,fp)<2)?0: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);
fp->fwrite(s,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];
s[0]=(u8)b;
s[1]=(u8)(b>>8);
s[2]=(u8)(b>>16);
s[3]=(u8)(b>>24);
os->write((char*)&s,4);
fp->fwrite(s,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];
s[0]=(u8)b;
@ -98,16 +73,15 @@ int write64le(u64 b, std::ostream* os)
s[5]=(u8)(b>>40);
s[6]=(u8)(b>>48);
s[7]=(u8)(b>>56);
os->write((char*)&s,8);
os->fwrite((char*)&s,8);
return 8;
}
///reads a little endian 32bit value from the specified file
int read32le(u32 *Bufo, FILE *fp)
int read32le(u32 *Bufo, EMUFILE *fp)
{
u32 buf;
if(fread(&buf,1,4,fp)<4)
if(fp->_fread(&buf,4)<4)
return 0;
#ifdef LOCAL_LE
*(u32*)Bufo=buf;
@ -117,10 +91,10 @@ int read32le(u32 *Bufo, FILE *fp)
return 1;
}
int read16le(u16 *Bufo, std::istream *is)
int read16le(u16 *Bufo, EMUFILE *is)
{
u16 buf;
if(is->read((char*)&buf,2).gcount() != 2)
if(is->_fread((char*)&buf,2) != 2)
return 0;
#ifdef LOCAL_LE
*Bufo=buf;
@ -130,11 +104,10 @@ int read16le(u16 *Bufo, std::istream *is)
return 1;
}
///reads a little endian 64bit value from the specified file
int read64le(u64 *Bufo, std::istream *is)
int read64le(u64 *Bufo, EMUFILE *is)
{
u64 buf;
if(is->read((char*)&buf,8).gcount() != 8)
if(is->_fread((char*)&buf,8) != 8)
return 0;
#ifdef LOCAL_LE
*Bufo=buf;
@ -157,7 +130,7 @@ int read32le(u32 *Bufo, std::istream *is)
return 1;
}
int readbool(bool *b, std::istream* is)
int readbool(bool *b, EMUFILE* is)
{
u32 temp;
int ret = read32le(&temp,is);
@ -165,19 +138,19 @@ int readbool(bool *b, std::istream* is)
return ret;
}
int readbuffer(std::vector<u8> &vec, std::istream* is)
int readbuffer(std::vector<u8> &vec, EMUFILE* is)
{
u32 size;
if(read32le(&size,is) != 1) return 0;
vec.resize(size);
if(size>0) is->read((char*)&vec[0],size);
if(size>0) is->fread((char*)&vec[0],size);
return 1;
}
int writebuffer(std::vector<u8>& vec, std::ostream* os)
int writebuffer(std::vector<u8>& vec, EMUFILE* os)
{
u32 size = vec.size();
write32le(size,os);
if(size>0) os->write((char*)&vec[0],size);
if(size>0) os->fwrite((char*)&vec[0],size);
return 1;
}

View File

@ -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_
#define _READWRITE_H_
#include "types.h"
#include "emufile.h"
#include <iostream>
#include <cstdio>
#include <vector>
//well. just for the sake of consistency
int write8le(u8 b, FILE *fp);
int write8le(u8 b, std::ostream *os);
int write16le(u16 b, FILE *fp);
int write16le(u16 b, std::ostream* 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 write8le(u8 b, EMUFILE *fp);
int write16le(u16 b, EMUFILE* os);
int write32le(u32 b, EMUFILE* os);
int write64le(u64 b, EMUFILE* os);
int readbuffer(std::vector<u8> &vec, std::istream* is);
int writebuffer(std::vector<u8>& vec, std::ostream* os);
int read8le(u8 *Bufo, EMUFILE*is);
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

View File

@ -1,6 +1,7 @@
/* Copyright (C) 2006 Normmatt
Copyright (C) 2006 Theo Berkau
Copyright (C) 2007 Pascal Giard
Copyright (C) 2008-2009 DeSmuME team
This file is part of DeSmuME
@ -263,7 +264,7 @@ SFORMAT SF_MOVIE[]={
{ 0 }
};
static void mmu_savestate(std::ostream* os)
static void mmu_savestate(EMUFILE* os)
{
//version
write32le(2,os);
@ -371,10 +372,10 @@ SFORMAT SF_WIFI[]={
{ 0 }
};
static bool mmu_loadstate(std::istream* is, int size)
static bool mmu_loadstate(EMUFILE* is, int size)
{
//read version
int version;
u32 version;
if(read32le(&version,is) != 1) return false;
if(version == 0 || version == 1)
@ -394,7 +395,7 @@ static bool mmu_loadstate(std::istream* is, int size)
else if(version == 1)
{
//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_size,is) != 1) return false;
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;
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);
delete[] temp;
if(is->fail()) return false;
@ -420,7 +421,7 @@ static bool mmu_loadstate(std::istream* is, int size)
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->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);
}
static void cp15_savestate(std::ostream* os)
static void cp15_savestate(EMUFILE* os)
{
//version
write32le(0,os);
@ -472,7 +473,7 @@ static void cp15_savestate(std::ostream* 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->cacheType,is)) return false;
@ -517,10 +518,10 @@ static bool cp15_loadone(armcp15_t *cp15, std::istream* is)
return true;
}
static bool cp15_loadstate(std::istream* is, int size)
static bool cp15_loadstate(EMUFILE* is, int size)
{
//read version
int version;
u32 version;
if(read32le(&version,is) != 1) 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 *guessSF = NULL;
int temp = is->tellg();
int temp = is->ftell();
while(is->tellg()<temp+size)
while(is->ftell()<temp+size)
{
u32 sz, count;
char toa[4];
is->read(toa,4);
is->fread(toa,4);
if(is->fail())
return false;
@ -751,15 +752,15 @@ static bool ReadStateChunk(std::istream* is, const SFORMAT *sf, int size)
{
#ifdef LOCAL_LE
// 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
if(sz == 1) {
//special case: read a huge byte array
is->read((char *)tmp->v,count);
is->fread((char *)tmp->v,count);
} else {
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);
}
}
@ -768,7 +769,7 @@ static bool ReadStateChunk(std::istream* is, const SFORMAT *sf, int size)
}
else
{
is->seekg(sz*count,std::ios::cur);
is->fseek(sz*count,SEEK_CUR);
guessSF = NULL;
}
} // 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;
@ -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?
{
os->write(sf->desc,4);
os->fwrite(sf->desc,4);
write32le(sf->size,os);
write32le(sf->count,os);
#ifdef LOCAL_LE
// 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
if(sz == 1) {
//special case: write a huge byte array
os->write((char *)sf->v,count);
os->fwrite((char *)sf->v,1,count);
} else {
for(int i=0;i<count;i++) {
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.
FlipByteOrder((u8*)sf->v + i*size, size);
}
@ -843,11 +844,11 @@ static int SubWrite(std::ostream* os, const SFORMAT *sf)
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);
if(!sf) return 4;
int bsize = SubWrite((std::ostream*)0,sf);
int bsize = SubWrite((EMUFILE*)0,sf);
write32le(bsize,os);
if(!SubWrite(os,sf))
@ -857,9 +858,9 @@ static int savestate_WriteChunk(std::ostream* os, int type, const SFORMAT *sf)
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
write32le(type,os);
@ -867,14 +868,14 @@ static void savestate_WriteChunk(std::ostream* os, int type, void (*saveproc)(st
saveproc(os);
//get the size
u32 pos2 = os->tellp();
u32 pos2 = os->ftell();
assert(pos2 != (u32)-1); // if this assert fails, saveproc did something bad
u32 size = (pos2 - pos1) - (2 * sizeof(u32));
//fill in the actual size
os->seekp(pos1 + sizeof(u32));
os->fseek(pos1 + sizeof(u32),SEEK_SET);
write32le(size,os);
os->seekp(pos2);
os->fseek(pos2,SEEK_SET);
/*
// 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
compressionLevel = Z_NO_COMPRESSION;
#endif
memorystream ms;
std::ostream* os;
EMUFILE_MEMORY ms;
EMUFILE* os;
if(compressionLevel != Z_NO_COMPRESSION)
{
//generate the savestate in memory first
os = (std::ostream*)&ms;
os = (EMUFILE*)&ms;
writechunks(os);
ms.flush();
}
else
{
os = outstream;
os->seekp(32); //skip the header
os->fseek(32,SEEK_SET); //skip the header
writechunks(os);
}
os->flush();
//save the length of the file
u32 len = os->tellp();
u32 len = os->ftell();
u32 comprlen = 0xFFFFFFFF;
u8* cbuf;
@ -933,30 +931,29 @@ static bool savestate_save(std::ostream* outstream, int compressionLevel)
int error = Z_OK;
if(compressionLevel != Z_NO_COMPRESSION)
{
cbuf = (u8*)ms.buf();
cbuf = ms.buf();
uLongf comprlen2;
//worst case compression.
//zlib says "0.1% larger than sourceLen plus 12 bytes"
comprlen = (len>>9)+12 + len;
cbuf = new u8[comprlen];
/* Workaround to make it compile under linux 64bit */
// Workaround to make it compile under linux 64bit
comprlen2 = comprlen;
error = compress2(cbuf,&comprlen2,(u8*)ms.buf(),len,compressionLevel);
error = compress2(cbuf,&comprlen2,ms.buf(),len,compressionLevel);
comprlen = (u32)comprlen2;
}
//dump the header
outstream->seekp(0);
outstream->write(magic,16);
outstream->fseek(0,SEEK_SET);
outstream->fwrite(magic,16);
write32le(SAVESTATE_VERSION,outstream);
write32le(DESMUME_VERSION_NUMERIC,outstream); //desmume version
write32le(len,outstream); //uncompressed length
write32le(comprlen,outstream); //compressed length (-1 if it is not compressed)
outstream->flush();
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;
}
@ -965,7 +962,7 @@ static bool savestate_save(std::ostream* outstream, int compressionLevel)
bool savestate_save (const char *file_name)
{
memorystream ms;
EMUFILE_MEMORY ms;
size_t elems_written;
#ifdef HAVE_LIBZ
if(!savestate_save(&ms, Z_DEFAULT_COMPRESSION))
@ -973,7 +970,6 @@ bool savestate_save (const char *file_name)
if(!savestate_save(&ms, 0))
#endif
return false;
ms.flush();
FILE* file = fopen(file_name,"wb");
if(file)
{
@ -985,7 +981,7 @@ bool savestate_save (const char *file_name)
extern SFORMAT SF_RTC[];
static void writechunks(std::ostream* os) {
static void writechunks(EMUFILE* os) {
savestate_WriteChunk(os,1,SF_ARM9);
savestate_WriteChunk(os,2,SF_ARM7);
savestate_WriteChunk(os,3,cp15_savestate);
@ -1006,7 +1002,7 @@ static void writechunks(std::ostream* os) {
savestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0);
}
static bool ReadStateChunks(std::istream* is, s32 totalsize)
static bool ReadStateChunks(EMUFILE* is, s32 totalsize)
{
bool ret = true;
while(totalsize > 0)
@ -1075,11 +1071,11 @@ static void loadstate()
SetupMMU(nds.debugConsole);
}
static bool savestate_load(std::istream* is)
static bool savestate_load(EMUFILE* is)
{
SAV_silent_fail_flag = false;
char header[16];
is->read(header,16);
is->fread(header,16);
if(is->fail() || memcmp(header,magic,16))
return false;
@ -1091,7 +1087,7 @@ static bool savestate_load(std::istream* is)
if(ssversion != SAVESTATE_VERSION) return false;
std::vector<char> buf(len);
std::vector<u8> buf(len);
if(comprlen != 0xFFFFFFFF) {
#ifndef HAVE_LIBZ
@ -1099,7 +1095,7 @@ static bool savestate_load(std::istream* is)
return false;
#endif
std::vector<char> cbuf(comprlen);
is->read(&cbuf[0],comprlen);
is->fread(&cbuf[0],comprlen);
if(is->fail()) return false;
#ifdef HAVE_LIBZ
@ -1109,7 +1105,7 @@ static bool savestate_load(std::istream* is)
return false;
#endif
} else {
is->read((char*)&buf[0],len);
is->fread((char*)&buf[0],len);
}
//GO!! READ THE SAVESTATE
@ -1133,7 +1129,7 @@ static bool savestate_load(std::istream* is)
//gpu3D->NDS_3D_Reset();
//SPU_Reset();
memorystream mstemp(&buf);
EMUFILE_MEMORY mstemp(&buf);
bool x = ReadStateChunks(&mstemp,(s32)len);
if(!x && !SAV_silent_fail_flag)
@ -1157,15 +1153,14 @@ static bool savestate_load(std::istream* is)
bool savestate_load(const char *file_name)
{
std::ifstream f;
f.open(file_name,std::ios_base::binary|std::ios_base::in);
if(!f) return false;
EMUFILE_FILE f(file_name,"rb");
if(f.fail()) return false;
return savestate_load(&f);
}
static std::stack<memorystream*> rewindFreeList;
static std::vector<memorystream*> rewindbuffer;
static std::stack<EMUFILE_MEMORY*> rewindFreeList;
static std::vector<EMUFILE_MEMORY*> rewindbuffer;
int rewindstates = 16;
int rewindinterval = 4;
@ -1178,21 +1173,17 @@ void rewindsave () {
//printf("rewindsave"); printf("%d%s", currFrameCounter, "\n");
memorystream *ms;
EMUFILE_MEMORY *ms;
if(!rewindFreeList.empty()) {
ms = rewindFreeList.top();
rewindFreeList.pop();
} else {
ms = new memorystream();
ms = new EMUFILE_MEMORY(1024*1024*12);
}
ms->getStreambuf().expand(1024*1024*12);
if(!savestate_save(ms, Z_NO_COMPRESSION))
return;
ms->sync();
rewindbuffer.push_back(ms);
if((int)rewindbuffer.size() > rewindstates) {
@ -1220,8 +1211,8 @@ void dorewind()
printf("%d", size);
memorystream* loadms = rewindbuffer[size-1];
loadms->seekg(32, std::ios::beg);
EMUFILE_MEMORY* loadms = rewindbuffer[size-1];
loadms->fseek(32, SEEK_SET);
ReadStateChunks(loadms,loadms->size()-32);
loadstate();

View File

@ -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_
#define _STRINGUTIL_H_
@ -11,6 +12,7 @@
#include <cstdio>
#include "../types.h"
#include "emufile.h"
//definitions for str_strip() flags
@ -56,14 +58,14 @@ std::string stditoa(int n);
std::string readNullTerminatedAscii(std::istream* is);
//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;
bool pre = true;
for(;;)
{
int c = is->get();
int c = is->fgetc();
if(c == -1) return ret;
int d = c - '0';
if((d<0 || d>9))
@ -82,11 +84,11 @@ template<typename T> T templateIntegerDecFromIstream(std::istream* is)
return ret;
}
inline u32 u32DecFromIstream(std::istream* is) { return templateIntegerDecFromIstream<u32>(is); }
inline u64 u64DecFromIstream(std::istream* is) { return templateIntegerDecFromIstream<u64>(is); }
inline u32 u32DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream<u32>(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)
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];
int ctr = 0;
@ -102,9 +104,9 @@ template<typename T, int DIGITS, bool PAD> void putdec(std::ostream* os, T dec)
dec = quot;
}
if(!PAD)
os->write(temp+DIGITS-ctr-1,ctr+1);
os->fwrite(temp+DIGITS-ctr-1,ctr+1);
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);

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="shift_jis"?>
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
@ -55,7 +55,7 @@
EnableFiberSafeOptimizations="false"
WholeProgramOptimization="false"
AdditionalIncludeDirectories=".;..;&quot;lua\lua-5.1.4\src&quot;;&quot;glib-2.20.1\build&quot;;&quot;glib-2.20.1\build\glib&quot;;.\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"
BasicRuntimeChecks="0"
BufferSecurityCheck="true"
@ -112,6 +112,205 @@
Name="VCPostBuildEventTool"
/>
</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=".;..;&quot;lua\lua-5.1.4\src&quot;;&quot;glib-2.20.1\build&quot;;&quot;glib-2.20.1\build\glib&quot;;.\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=".;..;&quot;lua\lua-5.1.4\src&quot;;&quot;glib-2.20.1\build&quot;;&quot;glib-2.20.1\build\glib&quot;;.\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
Name="Debug|x64"
OutputDirectory="$(SolutionDir)\__bins"
@ -206,104 +405,6 @@
Name="VCPostBuildEventTool"
/>
</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=".;..;&quot;lua\lua-5.1.4\src&quot;;&quot;glib-2.20.1\build&quot;;&quot;glib-2.20.1\build\glib&quot;;.\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
Name="Release|x64"
OutputDirectory="$(SolutionDir)\__bins"
@ -404,107 +505,6 @@
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=".;..;&quot;lua\lua-5.1.4\src&quot;;&quot;glib-2.20.1\build&quot;;&quot;glib-2.20.1\build\glib&quot;;.\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
Name="Release FastBuild|x64"
OutputDirectory="$(SolutionDir)\__bins"
@ -990,15 +990,6 @@
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
@ -1009,7 +1000,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Release FastBuild|Win32"
>
<Tool
Name="VCCLCompilerTool"
@ -1018,7 +1009,16 @@
/>
</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
Name="VCCLCompilerTool"
@ -1170,7 +1170,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Release FastBuild|Win32"
>
<Tool
Name="VCCLCompilerTool"
@ -1178,7 +1178,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release FastBuild|Win32"
Name="Release|x64"
>
<Tool
Name="VCCLCompilerTool"
@ -1242,6 +1242,10 @@
RelativePath="..\dscard.h"
>
</File>
<File
RelativePath="..\emufile.h"
>
</File>
<File
RelativePath="..\fat.h"
>

View File

@ -239,27 +239,27 @@ u8 Mic_ReadSample()
}
// maybe a bit paranoid...
void mic_savestate(std::ostream* os)
void mic_savestate(EMUFILE* os)
{
//version
write32le(0,os);
assert(MIC_BUFSIZE == 4096); // else needs new version
os->write((char*)Mic_Buffer[0], MIC_BUFSIZE);
os->write((char*)Mic_Buffer[1], MIC_BUFSIZE);
os->fwrite((char*)Mic_Buffer[0], MIC_BUFSIZE);
os->fwrite((char*)Mic_Buffer[1], MIC_BUFSIZE);
write16le(Mic_BufPos,os);
write8le(Mic_WriteBuf,os); // seems OK to save...
write8le(Mic_PlayBuf,os);
write32le(micReadSamplePos,os);
}
bool mic_loadstate(std::istream* is, int size)
bool mic_loadstate(EMUFILE* is, int size)
{
u32 version;
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->read((char*)Mic_Buffer[1], MIC_BUFSIZE);
is->fread((char*)Mic_Buffer[0], MIC_BUFSIZE);
is->fread((char*)Mic_Buffer[1], MIC_BUFSIZE);
read16le(&Mic_BufPos,is);
read8le(&Mic_WriteBuf,is);
read8le(&Mic_PlayBuf,is);

View File

@ -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 <fstream>
#include "resource.h"
@ -98,10 +118,10 @@ static char playfilename[MAX_PATH] = "";
void Describe(HWND hwndDlg)
{
EMUFILE* fp = new EMUFILE(playfilename,"rb");
EMUFILE* fp = new EMUFILE_FILE(playfilename,"rb");
MovieData md;
LoadFM2(md, fp, INT_MAX, false);
fs.close();
delete fp;
u32 num_frames = md.records.size();