mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-24 14:49:42 -06:00
MemcardManager and GCMemcard fixes/code cleanup
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1518 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -220,6 +220,7 @@ GCMemcard::GCMemcard(const char *filename)
|
||||
(size == 0x0020) || (size == 0x0010) ||
|
||||
(size == 0x0008) || (size == 0x0004))
|
||||
{
|
||||
maxBlock = size * 0x10;
|
||||
mc_data_size = (((u32)size * 16) - 5) * 0x2000;
|
||||
mc_data = new u8[mc_data_size];
|
||||
|
||||
@ -406,7 +407,7 @@ u16 GCMemcard::GetFirstBlock(u32 index)
|
||||
{
|
||||
if (!mcdFile) return 0xFFFF;
|
||||
u16 block = BE16(dir.Dir[index].FirstBlock);
|
||||
if (block > MAXBLOCK) return 0xFFFF;
|
||||
if (block > (u16) maxBlock) return 0xFFFF;
|
||||
return block;
|
||||
}
|
||||
|
||||
@ -415,7 +416,7 @@ u16 GCMemcard::GetFileSize(u32 index) //index in the directory array
|
||||
if (!mcdFile) return 0xFFFF;
|
||||
|
||||
u16 blocks = BE16(dir.Dir[index].BlockCount);
|
||||
if (blocks > (u16) MAXBLOCK) return 0xFFFF;
|
||||
if (blocks > (u16) maxBlock) return 0xFFFF;
|
||||
return blocks;
|
||||
}
|
||||
|
||||
@ -434,7 +435,7 @@ bool GCMemcard::GetComment1(u32 index, char *fn) //index in the directory array
|
||||
|
||||
u32 Comment1 = BE32(dir.Dir[index].CommentsAddr);
|
||||
u32 DataBlock = BE16(dir.Dir[index].FirstBlock) - 5;
|
||||
if ((DataBlock > MAXBLOCK) || (Comment1 == 0xFFFFFFFF))
|
||||
if ((DataBlock > maxBlock) || (Comment1 == 0xFFFFFFFF))
|
||||
{
|
||||
fn[0] = 0;
|
||||
return false;
|
||||
@ -451,7 +452,7 @@ bool GCMemcard::GetComment2(u32 index, char *fn) //index in the directory array
|
||||
u32 Comment1 = BE32(dir.Dir[index].CommentsAddr);
|
||||
u32 Comment2 = Comment1 + 32;
|
||||
u32 DataBlock = BE16(dir.Dir[index].FirstBlock) - 5;
|
||||
if ((DataBlock > MAXBLOCK) || (Comment1 == 0xFFFFFFFF))
|
||||
if ((DataBlock > maxBlock) || (Comment1 == 0xFFFFFFFF))
|
||||
{
|
||||
fn[0] = 0;
|
||||
return false;
|
||||
@ -703,7 +704,7 @@ u32 GCMemcard::CopyFrom(GCMemcard& source, u32 index)
|
||||
}
|
||||
}
|
||||
|
||||
s32 GCMemcard::ImportGci(const char *fileName, std::string fileName2)
|
||||
u32 GCMemcard::ImportGci(const char *fileName, std::string fileName2)
|
||||
{
|
||||
if (fileName2.empty() && !mcdFile) return OPENFAIL;
|
||||
|
||||
@ -826,7 +827,7 @@ s32 GCMemcard::ImportGci(const char *fileName, std::string fileName2)
|
||||
u32 GCMemcard::ExportGci(u32 index, const char *fileName)
|
||||
{
|
||||
FILE *gci = fopen(fileName, "wb");
|
||||
if (!gci) return NOFILE;
|
||||
if (!gci) return OPENFAIL;
|
||||
bool completeWrite = true;
|
||||
|
||||
fseek(gci, 0, SEEK_SET);
|
||||
@ -877,7 +878,7 @@ bool GCMemcard::ReadBannerRGBA8(u32 index, u32* buffer)
|
||||
u32 DataOffset = BE32(dir.Dir[index].ImageOffset);
|
||||
u32 DataBlock = BE16(dir.Dir[index].FirstBlock) - 5;
|
||||
|
||||
if ((DataBlock > MAXBLOCK) || (DataOffset == 0xFFFFFFFF))
|
||||
if ((DataBlock > maxBlock) || (DataOffset == 0xFFFFFFFF))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -914,7 +915,7 @@ u32 GCMemcard::ReadAnimRGBA8(u32 index, u32* buffer, u8 *delays)
|
||||
u32 DataOffset = BE32(dir.Dir[index].ImageOffset);
|
||||
u32 DataBlock = BE16(dir.Dir[index].FirstBlock) - 5;
|
||||
|
||||
if ((DataBlock > MAXBLOCK) || (DataOffset == 0xFFFFFFFF))
|
||||
if ((DataBlock > maxBlock) || (DataOffset == 0xFFFFFFFF))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -983,3 +984,4 @@ u32 GCMemcard::ReadAnimRGBA8(u32 index, u32* buffer, u8 *delays)
|
||||
|
||||
return frames;
|
||||
}
|
||||
|
||||
|
@ -22,11 +22,9 @@
|
||||
|
||||
enum
|
||||
{
|
||||
LENGTHFAIL = -4,
|
||||
GCSFAIL,
|
||||
SAVFAIL,
|
||||
OPENFAIL,
|
||||
GCI,
|
||||
GCI = 0,
|
||||
SUCCESS,
|
||||
NOMEMCARD,
|
||||
HDR_READ_ERROR,
|
||||
DIR_READ_ERROR,
|
||||
DIR_BAK_READ_ERROR,
|
||||
@ -38,18 +36,18 @@ enum
|
||||
DATA_READ_FAIL,
|
||||
HDR_SIZE_FFFF,
|
||||
NOTRAWORGCP,
|
||||
SAV = 0x80,
|
||||
GCS = 0x110,
|
||||
OPENFAIL,
|
||||
OUTOFBLOCKS,
|
||||
OUTOFDIRENTRIES,
|
||||
NOMEMCARD,
|
||||
NOFILE,
|
||||
LENGTHFAIL,
|
||||
INVALIDFILESIZE,
|
||||
TITLEPRESENT,
|
||||
SUCCESS = 0x2000,
|
||||
SAV = 0x80,
|
||||
SAVFAIL,
|
||||
GCS = 0x110,
|
||||
GCSFAIL,
|
||||
FAIL,
|
||||
WRITEFAIL,
|
||||
MAXBLOCK = 0x2049
|
||||
};
|
||||
|
||||
class GCMemcard
|
||||
@ -57,6 +55,7 @@ class GCMemcard
|
||||
private:
|
||||
void* mcdFile;
|
||||
|
||||
u32 maxBlock;
|
||||
u32 mc_data_size;
|
||||
u8* mc_data;
|
||||
|
||||
@ -157,11 +156,11 @@ public:
|
||||
bool Save();
|
||||
|
||||
void calc_checksumsBE(u16 *buf, u32 num, u16 *c1, u16 *c2);
|
||||
u32 TestChecksums();
|
||||
u32 TestChecksums();
|
||||
bool FixChecksums();
|
||||
|
||||
// get number of file entries in the directory
|
||||
u32 GetNumFiles();
|
||||
u32 GetNumFiles();
|
||||
|
||||
// get the free blocks from bat
|
||||
u16 GetFreeBlocks(void);
|
||||
@ -169,12 +168,11 @@ public:
|
||||
// Returns true if title already on memcard
|
||||
bool TitlePresent(DEntry d);
|
||||
|
||||
|
||||
// get first block for file
|
||||
u16 GetFirstBlock(u32 index);
|
||||
|
||||
// get file length in blocks
|
||||
u16 GetFileSize(u32 index);
|
||||
u16 GetFileSize(u32 index);
|
||||
|
||||
// buffer needs to be a char[32] or bigger
|
||||
bool GetFileName(u32 index, char* buffer);
|
||||
@ -196,16 +194,16 @@ public:
|
||||
|
||||
// adds the file to the directory and copies its contents
|
||||
// if remove > 0 it will pad bat.map with 0's sifeof remove
|
||||
u32 ImportFile(DEntry& direntry, u8* contents, int remove);
|
||||
u32 ImportFile(DEntry& direntry, u8* contents, int remove);
|
||||
|
||||
// delete a file from the directory
|
||||
u32 RemoveFile(u32 index);
|
||||
|
||||
// reads a save from another memcard, and imports the data into this memcard
|
||||
u32 CopyFrom(GCMemcard& source, u32 index);
|
||||
u32 CopyFrom(GCMemcard& source, u32 index);
|
||||
|
||||
// reads a .gci/.gcs/.sav file and calls ImportFile or saves out a gci file
|
||||
s32 ImportGci(const char* fileName, std::string fileName2);
|
||||
u32 ImportGci(const char* fileName, std::string fileName2);
|
||||
|
||||
// writes a .gci file to disk containing index
|
||||
u32 ExportGci(u32 index, const char* fileName);
|
||||
@ -214,8 +212,5 @@ public:
|
||||
bool ReadBannerRGBA8(u32 index, u32* buffer);
|
||||
|
||||
// reads the animation frames
|
||||
u32 ReadAnimRGBA8(u32 index, u32* buffer, u8 *delays);
|
||||
|
||||
|
||||
|
||||
u32 ReadAnimRGBA8(u32 index, u32* buffer, u8 *delays);
|
||||
};
|
||||
|
Reference in New Issue
Block a user