fix crashy bug in slot2_gbagame and also change it to use EMUFILE while I was at it, like it shouldve been in the first place. but.. i didnt really test it.
This commit is contained in:
parent
f94727dc1e
commit
0445bcc9ee
|
@ -22,6 +22,7 @@
|
||||||
#include "../NDSSystem.h"
|
#include "../NDSSystem.h"
|
||||||
#include "../path.h"
|
#include "../path.h"
|
||||||
#include "../slot2.h"
|
#include "../slot2.h"
|
||||||
|
#include "../emufile.h"
|
||||||
|
|
||||||
#define EEPROM 0x52504545
|
#define EEPROM 0x52504545
|
||||||
#define SRAM_ 0x4D415253
|
#define SRAM_ 0x4D415253
|
||||||
|
@ -40,8 +41,8 @@ static const char *saveTypes[] = {
|
||||||
class Slot2_GbaCart : public ISlot2Interface
|
class Slot2_GbaCart : public ISlot2Interface
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
FILE *fROM;
|
EMUFILE* fROM;
|
||||||
FILE *fSRAM;
|
EMUFILE* fSRAM;
|
||||||
u32 romSize;
|
u32 romSize;
|
||||||
u32 currentROMPos;
|
u32 currentROMPos;
|
||||||
u32 sramSize;
|
u32 sramSize;
|
||||||
|
@ -60,45 +61,44 @@ private:
|
||||||
|
|
||||||
u32 readRom(const u32 pos, const u8 size)
|
u32 readRom(const u32 pos, const u8 size)
|
||||||
{
|
{
|
||||||
if (fROM)
|
if (!fROM) return 0xFFFFFFFF;
|
||||||
{
|
|
||||||
if (currentROMPos != pos)
|
if (currentROMPos != pos)
|
||||||
fseek(fROM, pos, SEEK_SET);
|
fROM->fseek(pos, SEEK_SET);
|
||||||
|
|
||||||
u32 data = 0xFFFFFFFF;
|
u32 data = 0xFFFFFFFF;
|
||||||
u32 readed = fread(&data, 1, size, fROM);
|
u32 readed = fROM->fread(&data, size);
|
||||||
currentROMPos = (pos + readed);
|
currentROMPos = (pos + readed);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
return 0xFFFFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 readSRAM(const u32 pos, const u8 size)
|
u32 readSRAM(const u32 pos, const u8 size)
|
||||||
{
|
{
|
||||||
if (fSRAM)
|
if (!fSRAM)
|
||||||
{
|
return 0xFFFFFFFF;
|
||||||
|
|
||||||
if (currentSRAMPos != pos)
|
if (currentSRAMPos != pos)
|
||||||
fseek(fSRAM, pos, SEEK_SET);
|
fSRAM->fseek(pos, SEEK_SET);
|
||||||
|
|
||||||
u32 data = 0xFFFFFFFF;
|
u32 data = 0xFFFFFFFF;
|
||||||
u32 readed = fread(&data, 1, size, fSRAM);
|
u32 readed = fSRAM->fread(&data, size);
|
||||||
currentSRAMPos = (pos + readed);
|
currentSRAMPos = (pos + readed);
|
||||||
return data;
|
return data;
|
||||||
}
|
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeSRAM(const u32 pos, const u8 *data, u32 size)
|
void writeSRAM(const u32 pos, const u8 *data, u32 size)
|
||||||
{
|
{
|
||||||
if (fSRAM)
|
if (!fSRAM)
|
||||||
{
|
return;
|
||||||
if (currentSRAMPos != pos)
|
|
||||||
fseek(fSRAM, pos, SEEK_SET);
|
|
||||||
|
|
||||||
u32 writed = fwrite(&data, 1, size, fSRAM);
|
if (currentSRAMPos != pos)
|
||||||
|
fSRAM->fseek(pos, SEEK_SET);
|
||||||
|
|
||||||
|
u32 writed = size;
|
||||||
|
fSRAM->fwrite(&data, size);
|
||||||
currentSRAMPos = (pos + writed);
|
currentSRAMPos = (pos + writed);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
u32 getSaveTypeGBA()
|
u32 getSaveTypeGBA()
|
||||||
|
@ -108,24 +108,24 @@ private:
|
||||||
u32 saveROMPos = currentROMPos;
|
u32 saveROMPos = currentROMPos;
|
||||||
u32 tmp = 0;
|
u32 tmp = 0;
|
||||||
|
|
||||||
fseek(fROM, 0, SEEK_SET);
|
fROM->fseek(0, SEEK_SET);
|
||||||
|
|
||||||
while (!feof(fROM))
|
while (!fROM->eof())
|
||||||
{
|
{
|
||||||
u32 readed = fread(&tmp, 1, 4, fROM);
|
u32 readed = fROM->fread(&tmp, 4);
|
||||||
if (readed < 4) break;
|
if (readed < 4) break;
|
||||||
|
|
||||||
switch (tmp)
|
switch (tmp)
|
||||||
{
|
{
|
||||||
case EEPROM: fseek(fROM, saveROMPos, SEEK_SET); return 1;
|
case EEPROM: fROM->fseek(saveROMPos, SEEK_SET); return 1;
|
||||||
case SRAM_: fseek(fROM, saveROMPos, SEEK_SET); return 2;
|
case SRAM_: fROM->fseek(saveROMPos, SEEK_SET); return 2;
|
||||||
case FLASH:
|
case FLASH:
|
||||||
{
|
{
|
||||||
fread(&tmp, 1, 4, fROM);
|
fROM->fread(&tmp, 4);
|
||||||
fseek(fROM, saveROMPos, SEEK_SET);
|
fROM->fseek(saveROMPos, SEEK_SET);
|
||||||
return ((tmp == FLASH1M_)?3:5);
|
return ((tmp == FLASH1M_)?3:5);
|
||||||
}
|
}
|
||||||
case SIIRTC_V: fseek(fROM, saveROMPos, SEEK_SET); return 4;
|
case SIIRTC_V: fROM->fseek(saveROMPos, SEEK_SET); return 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,7 +300,24 @@ private:
|
||||||
return 0xFF;
|
return 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Close()
|
||||||
|
{
|
||||||
|
delete fROM; fROM = NULL;
|
||||||
|
delete fSRAM; fSRAM = NULL;
|
||||||
|
romSize = 0;
|
||||||
|
currentROMPos = 0;
|
||||||
|
sramSize = 0;
|
||||||
|
currentSRAMPos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Slot2_GbaCart()
|
||||||
|
: fROM(NULL)
|
||||||
|
, fSRAM(NULL)
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
virtual Slot2Info const* info()
|
virtual Slot2Info const* info()
|
||||||
{
|
{
|
||||||
static Slot2InfoSimple info("GBA cartridge", "GBA cartridge in slot", 0x03);
|
static Slot2InfoSimple info("GBA cartridge", "GBA cartridge in slot", 0x03);
|
||||||
|
@ -309,9 +326,8 @@ public:
|
||||||
|
|
||||||
virtual void connect()
|
virtual void connect()
|
||||||
{
|
{
|
||||||
if (fROM) fclose(fROM);
|
{
|
||||||
if (fSRAM) fclose(fSRAM);
|
Close();
|
||||||
fROM = NULL; fSRAM = NULL;
|
|
||||||
romSize = 0;
|
romSize = 0;
|
||||||
currentROMPos = 0;
|
currentROMPos = 0;
|
||||||
sramSize = 0;
|
sramSize = 0;
|
||||||
|
@ -324,28 +340,29 @@ public:
|
||||||
|
|
||||||
if (!strlen(GBAgameName)) return;
|
if (!strlen(GBAgameName)) return;
|
||||||
|
|
||||||
printf("GBASlot opening ROM %s", GBAgameName);
|
printf("GBASlot opening ROM: %s", GBAgameName);
|
||||||
|
|
||||||
fROM = fopen(GBAgameName, "rb");
|
fROM = new EMUFILE_FILE(GBAgameName, "rb");
|
||||||
if (fROM)
|
if (fROM->fail())
|
||||||
{
|
goto FAIL;
|
||||||
fseek(fROM, 0, SEEK_END);
|
|
||||||
romSize = ftell(fROM);
|
romSize = fROM->size();
|
||||||
fseek(fROM, 0, SEEK_SET);
|
|
||||||
printf(" - Success (%u bytes)\n", romSize);
|
printf(" - Success (%u bytes)\n", romSize);
|
||||||
|
|
||||||
//try loading the sram
|
//try loading the sram. build the filename from the rom, and expect it to be a .sav
|
||||||
char *dot = strrchr(GBAgameName, '.');
|
char *dot = strrchr(GBAgameName, '.');
|
||||||
if(!dot) return;
|
if(!dot) return;
|
||||||
|
|
||||||
std::string sram_fname = GBAgameName;
|
std::string sram_fname = GBAgameName;
|
||||||
sram_fname.resize(dot-GBAgameName);
|
sram_fname.resize(dot-GBAgameName);
|
||||||
sram_fname += ".sav";
|
sram_fname += ".sav";
|
||||||
fSRAM = fopen(sram_fname.c_str(), "rb+");
|
fSRAM = new EMUFILE_FILE(sram_fname.c_str(), "rb+");
|
||||||
if(!fSRAM) return;
|
if(fSRAM->fail())
|
||||||
fseek(fSRAM, 0, SEEK_END);
|
{
|
||||||
sramSize = ftell(fSRAM);
|
delete fSRAM; fSRAM = NULL;
|
||||||
fseek(fSRAM, 0, SEEK_SET);
|
return;
|
||||||
|
}
|
||||||
|
sramSize = fSRAM->size();
|
||||||
saveType = getSaveTypeGBA();
|
saveType = getSaveTypeGBA();
|
||||||
printf("GBASlot found SRAM %s (%s - %u bytes)\n", sram_fname.c_str(), (saveType == 0xFF)?"Unknown":saveTypes[saveType], sramSize);
|
printf("GBASlot found SRAM %s (%s - %u bytes)\n", sram_fname.c_str(), (saveType == 0xFF)?"Unknown":saveTypes[saveType], sramSize);
|
||||||
gbaFlash.size = sramSize;
|
gbaFlash.size = sramSize;
|
||||||
|
@ -359,20 +376,19 @@ public:
|
||||||
gbaFlash.idDevice = 0x09;
|
gbaFlash.idDevice = 0x09;
|
||||||
gbaFlash.idManufacturer = 0xC2;
|
gbaFlash.idManufacturer = 0xC2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//success!
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
FAIL:
|
||||||
|
Close();
|
||||||
printf(" - Failed\n");
|
printf(" - Failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void disconnect()
|
virtual void disconnect()
|
||||||
{
|
{
|
||||||
if (fROM) fclose(fROM);
|
Close();
|
||||||
if (fSRAM) fclose(fSRAM);
|
|
||||||
fROM = NULL; fSRAM = NULL;
|
|
||||||
romSize = 0;
|
|
||||||
currentROMPos = 0;
|
|
||||||
sramSize = 0;
|
|
||||||
currentSRAMPos = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void writeByte(u8 PROCNUM, u32 addr, u8 val)
|
virtual void writeByte(u8 PROCNUM, u32 addr, u8 val)
|
||||||
|
|
Loading…
Reference in New Issue