fix import backup memory
This commit is contained in:
parent
6cdd10b84a
commit
88e34db3e7
|
@ -173,7 +173,7 @@ bool BackupDevice::load_state(EMUFILE* is)
|
||||||
state = (STATE)temp;
|
state = (STATE)temp;
|
||||||
readbuffer(data,is);
|
readbuffer(data,is);
|
||||||
fsize = data.size();
|
fsize = data.size();
|
||||||
#ifdef _DONT_SAVE_BACKUP
|
#ifndef _DONT_SAVE_BACKUP
|
||||||
fpMC->fseek(0, SEEK_SET);
|
fpMC->fseek(0, SEEK_SET);
|
||||||
fwrite((char*)&data[0], 1, fsize, fpMC->get_fp());
|
fwrite((char*)&data[0], 1, fsize, fpMC->get_fp());
|
||||||
ensure(data.size(), fpMC);
|
ensure(data.size(), fpMC);
|
||||||
|
@ -344,6 +344,7 @@ BackupDevice::BackupDevice()
|
||||||
}
|
}
|
||||||
|
|
||||||
addr_size = info.addr_size;
|
addr_size = info.addr_size;
|
||||||
|
info.padSize = fsize;
|
||||||
//none of the other fields are used right now
|
//none of the other fields are used right now
|
||||||
|
|
||||||
if (CommonSettings.autodetectBackupMethod != 1 && info.type == 0)
|
if (CommonSettings.autodetectBackupMethod != 1 && info.type == 0)
|
||||||
|
@ -480,8 +481,14 @@ void BackupDevice::writeLong(u32 addr, u32 val)
|
||||||
fpMC->write32le(val);
|
fpMC->write32le(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::saveBuffer(u8 *data, u32 size)
|
bool BackupDevice::saveBuffer(u8 *data, u32 size, bool _rewind, bool _truncate)
|
||||||
{
|
{
|
||||||
|
if (_rewind)
|
||||||
|
{
|
||||||
|
fpMC->fseek(0, SEEK_SET);
|
||||||
|
if (_truncate)
|
||||||
|
fpMC->truncate(0);
|
||||||
|
}
|
||||||
fsize = size;
|
fsize = size;
|
||||||
fwrite(data, 1, size, fpMC->get_fp());
|
fwrite(data, 1, size, fpMC->get_fp());
|
||||||
ensure(size, fpMC);
|
ensure(size, fpMC);
|
||||||
|
@ -829,15 +836,16 @@ void BackupDevice::ensure(u32 addr, u8 val, EMUFILE_FILE *fpOut)
|
||||||
|
|
||||||
EMUFILE_FILE *fp = fpOut?fpOut:fpMC;
|
EMUFILE_FILE *fp = fpOut?fpOut:fpMC;
|
||||||
|
|
||||||
#ifdef _DONT_SAVE_BACKUP
|
#ifndef _DONT_SAVE_BACKUP
|
||||||
fp->fseek(fsize, SEEK_SET);
|
fp->fseek(fsize, SEEK_SET);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
u32 padSize = pad_up_size(addr);
|
u32 padSize = pad_up_size(addr);
|
||||||
u32 size = padSize - fsize;
|
u32 size = padSize - fsize;
|
||||||
fsize = padSize;
|
fsize = padSize;
|
||||||
|
info.padSize = fsize;
|
||||||
|
|
||||||
#ifdef _DONT_SAVE_BACKUP
|
#ifndef _DONT_SAVE_BACKUP
|
||||||
u8 *tmp = new u8[size];
|
u8 *tmp = new u8[size];
|
||||||
memset(tmp, val, size);
|
memset(tmp, val, size);
|
||||||
fwrite(tmp, 1, size, fp->get_fp());
|
fwrite(tmp, 1, size, fp->get_fp());
|
||||||
|
@ -936,17 +944,20 @@ u32 BackupDevice::importDataSize(const char *filename)
|
||||||
|
|
||||||
u32 BackupDevice::importData(const char *filename, u32 force_size)
|
u32 BackupDevice::importData(const char *filename, u32 force_size)
|
||||||
{
|
{
|
||||||
if (strlen(filename) < 4) return 0;
|
u32 res = 0;
|
||||||
|
if (strlen(filename) < 4) return res;
|
||||||
|
|
||||||
if (memcmp(filename + strlen(filename) - 4, ".duc", 4) == 0)
|
if (memcmp(filename + strlen(filename) - 4, ".duc", 4) == 0)
|
||||||
return load_duc(filename, force_size);
|
res = import_duc(filename, force_size);
|
||||||
else
|
else
|
||||||
if (load_no_gba(filename, force_size))
|
if (import_no_gba(filename, force_size))
|
||||||
return 1;
|
res = 1;
|
||||||
else
|
else
|
||||||
return load_raw(filename, force_size);
|
res = import_raw(filename, force_size);
|
||||||
|
|
||||||
return 0;
|
NDS_Reset();
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::exportData(const char *filename)
|
bool BackupDevice::exportData(const char *filename)
|
||||||
|
@ -960,11 +971,11 @@ bool BackupDevice::exportData(const char *filename)
|
||||||
memset(tmp, 0, MAX_PATH);
|
memset(tmp, 0, MAX_PATH);
|
||||||
strcpy(tmp, filename);
|
strcpy(tmp, filename);
|
||||||
tmp[strlen(tmp)-1] = 0;
|
tmp[strlen(tmp)-1] = 0;
|
||||||
return save_no_gba(tmp);
|
return export_no_gba(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (memcmp(filename + strlen(filename) - 4, ".sav", 4) == 0)
|
if (memcmp(filename + strlen(filename) - 4, ".sav", 4) == 0)
|
||||||
return save_raw(filename);
|
return export_raw(filename);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1119,7 +1130,7 @@ static u32 no_gba_fillLeft(u32 size)
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::load_no_gba(const char *fname, u32 force_size)
|
bool BackupDevice::import_no_gba(const char *fname, u32 force_size)
|
||||||
{
|
{
|
||||||
FILE *fsrc = fopen(fname, "rb");
|
FILE *fsrc = fopen(fname, "rb");
|
||||||
u8 *in_buf = NULL;
|
u8 *in_buf = NULL;
|
||||||
|
@ -1151,7 +1162,7 @@ bool BackupDevice::load_no_gba(const char *fname, u32 force_size)
|
||||||
size = no_gba_fillLeft(size);
|
size = no_gba_fillLeft(size);
|
||||||
//printf("--- new size after fill %i byte(s)\n", size);
|
//printf("--- new size after fill %i byte(s)\n", size);
|
||||||
raw_applyUserSettings(size, (force_size > 0));
|
raw_applyUserSettings(size, (force_size > 0));
|
||||||
saveBuffer(out_buf, size);
|
saveBuffer(out_buf, size, true, true);
|
||||||
|
|
||||||
if (in_buf) delete [] in_buf;
|
if (in_buf) delete [] in_buf;
|
||||||
if (out_buf) delete [] out_buf;
|
if (out_buf) delete [] out_buf;
|
||||||
|
@ -1189,7 +1200,7 @@ bool BackupDevice::no_gba_unpack(u8 *&buf, u32 &size)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::save_no_gba(const char* fname)
|
bool BackupDevice::export_no_gba(const char* fname)
|
||||||
{
|
{
|
||||||
std::vector<u8> data(fsize);
|
std::vector<u8> data(fsize);
|
||||||
u32 pos = fpMC->ftell();
|
u32 pos = fpMC->ftell();
|
||||||
|
@ -1217,7 +1228,7 @@ bool BackupDevice::save_no_gba(const char* fname)
|
||||||
//======================================================================= end
|
//======================================================================= end
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//======================================================================= no$GBA
|
//======================================================================= no$GBA
|
||||||
bool BackupDevice::save_raw(const char* filename)
|
bool BackupDevice::export_raw(const char* filename)
|
||||||
{
|
{
|
||||||
std::vector<u8> data(fsize);
|
std::vector<u8> data(fsize);
|
||||||
u32 pos = fpMC->ftell();
|
u32 pos = fpMC->ftell();
|
||||||
|
@ -1289,7 +1300,7 @@ u32 BackupDevice::get_save_raw_size(const char* fname)
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::load_raw(const char* filename, u32 force_size)
|
bool BackupDevice::import_raw(const char* filename, u32 force_size)
|
||||||
{
|
{
|
||||||
FILE* inf = fopen(filename,"rb");
|
FILE* inf = fopen(filename,"rb");
|
||||||
|
|
||||||
|
@ -1316,12 +1327,14 @@ bool BackupDevice::load_raw(const char* filename, u32 force_size)
|
||||||
raw_applyUserSettings(size, (force_size > 0));
|
raw_applyUserSettings(size, (force_size > 0));
|
||||||
|
|
||||||
u8 *data = new u8[size];
|
u8 *data = new u8[size];
|
||||||
|
u32 sz = (size-left);
|
||||||
|
|
||||||
fread(&data[0],1,size-left,inf);
|
bool res = (fread(data, 1, sz, inf) == sz);
|
||||||
fclose(inf);
|
fclose(inf);
|
||||||
|
|
||||||
saveBuffer(data, size);
|
if (res)
|
||||||
delete data;
|
saveBuffer(data, sz, true, true);
|
||||||
|
delete [] data;
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1339,29 +1352,29 @@ u32 BackupDevice::get_save_duc_size(const char* fname)
|
||||||
return (size - 500);
|
return (size - 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::load_duc(const char* filename, u32 force_size)
|
bool BackupDevice::import_duc(const char* filename, u32 force_size)
|
||||||
{
|
{
|
||||||
u32 size;
|
u32 size;
|
||||||
char id[16];
|
char id[16];
|
||||||
FILE* file = fopen(filename, "rb");
|
FILE* file = fopen(filename, "rb");
|
||||||
|
|
||||||
if(!file) return false;
|
|
||||||
|
|
||||||
fseek(file, 0, SEEK_END);
|
if(!file) return false;
|
||||||
size = (u32)ftell(file) - 500;
|
|
||||||
fseek(file, 0, SEEK_SET);
|
|
||||||
|
|
||||||
// Make sure we really have the right file
|
fseek(file, 0, SEEK_END);
|
||||||
fread((void *)id, sizeof(char), 16, file);
|
size = (u32)ftell(file) - 500;
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
if (memcmp(id, "ARDS000000000001", 16) != 0)
|
// Make sure we really have the right file
|
||||||
{
|
fread((void *)id, sizeof(char), 16, file);
|
||||||
|
|
||||||
|
if (memcmp(id, "ARDS000000000001", 16) != 0)
|
||||||
|
{
|
||||||
printf("Not recognized as a valid DUC file\n");
|
printf("Not recognized as a valid DUC file\n");
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Skip the rest of the header since we don't need it
|
// Skip the rest of the header since we don't need it
|
||||||
fseek(file, 500, SEEK_SET);
|
fseek(file, 500, SEEK_SET);
|
||||||
|
|
||||||
u32 left = 0;
|
u32 left = 0;
|
||||||
if (force_size > 0)
|
if (force_size > 0)
|
||||||
|
@ -1376,17 +1389,19 @@ bool BackupDevice::load_duc(const char* filename, u32 force_size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_applyUserSettings(size, (force_size > 0));
|
raw_applyUserSettings(size, (force_size > 0));
|
||||||
|
|
||||||
u8 *data = new u8[size];
|
u8 *data = new u8[size];
|
||||||
|
u32 sz = (size-left);
|
||||||
|
|
||||||
fread(data, 1, (size-left), file);
|
bool res = (fread(data, 1, sz, file) == sz);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
saveBuffer(data, size);
|
if (res)
|
||||||
delete data;
|
saveBuffer(data, sz, true, true);
|
||||||
|
delete [] data;
|
||||||
|
|
||||||
return true;
|
return res;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,16 +104,17 @@ public:
|
||||||
static u32 pad_up_size(u32 startSize);
|
static u32 pad_up_size(u32 startSize);
|
||||||
void raw_applyUserSettings(u32& size, bool manual = false);
|
void raw_applyUserSettings(u32& size, bool manual = false);
|
||||||
|
|
||||||
bool load_duc(const char* filename, u32 force_size = 0);
|
|
||||||
bool no_gba_unpack(u8 *&buf, u32 &size);
|
|
||||||
bool load_no_gba(const char *fname, u32 force_size = 0);
|
|
||||||
bool save_no_gba(const char* fname);
|
|
||||||
bool load_raw(const char* filename, u32 force_size = 0);
|
|
||||||
bool save_raw(const char* filename);
|
|
||||||
bool load_movie(EMUFILE* is);
|
|
||||||
u32 get_save_duc_size(const char* filename);
|
u32 get_save_duc_size(const char* filename);
|
||||||
u32 get_save_nogba_size(const char* filename);
|
u32 get_save_nogba_size(const char* filename);
|
||||||
u32 get_save_raw_size(const char* filename);
|
u32 get_save_raw_size(const char* filename);
|
||||||
|
bool import_duc(const char* filename, u32 force_size = 0);
|
||||||
|
bool import_no_gba(const char *fname, u32 force_size = 0);
|
||||||
|
bool import_raw(const char* filename, u32 force_size = 0);
|
||||||
|
bool export_no_gba(const char* fname);
|
||||||
|
bool export_raw(const char* filename);
|
||||||
|
bool no_gba_unpack(u8 *&buf, u32 &size);
|
||||||
|
|
||||||
|
bool load_movie(EMUFILE* is);
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
u32 size,padSize,type,addr_size,mem_size;
|
u32 size,padSize,type,addr_size,mem_size;
|
||||||
|
@ -132,7 +133,7 @@ private:
|
||||||
int readFooter();
|
int readFooter();
|
||||||
bool write(u8 val);
|
bool write(u8 val);
|
||||||
u8 read();
|
u8 read();
|
||||||
bool saveBuffer(u8 *data, u32 size);
|
bool saveBuffer(u8 *data, u32 size, bool _rewind, bool _truncate = false);
|
||||||
|
|
||||||
bool write_enable;
|
bool write_enable;
|
||||||
bool reset_command_state;
|
bool reset_command_state;
|
||||||
|
|
Loading…
Reference in New Issue