mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-26 07:39:56 -06:00
add loaded ROM to DLDI volume, pass path via argv
This commit is contained in:
@ -55,6 +55,49 @@ void FATStorage::Close()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool FATStorage::InjectFile(std::string path, u8* data, u32 len)
|
||||||
|
{
|
||||||
|
if (!File) return false;
|
||||||
|
if (FF_File) return false;
|
||||||
|
|
||||||
|
FF_File = File;
|
||||||
|
FF_FileSize = FileSize;
|
||||||
|
ff_disk_open(FF_ReadStorage, FF_WriteStorage, (LBA_t)(FileSize>>9));
|
||||||
|
|
||||||
|
FRESULT res;
|
||||||
|
FATFS fs;
|
||||||
|
|
||||||
|
res = f_mount(&fs, "0:", 1);
|
||||||
|
if (res != FR_OK)
|
||||||
|
{
|
||||||
|
ff_disk_close();
|
||||||
|
FF_File = nullptr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
path = "0:/" + path;
|
||||||
|
FF_FIL file;
|
||||||
|
res = f_open(&file, path.c_str(), FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
|
if (res != FR_OK)
|
||||||
|
{
|
||||||
|
f_unmount("0:");
|
||||||
|
ff_disk_close();
|
||||||
|
FF_File = nullptr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 nwrite;
|
||||||
|
f_write(&file, data, len, &nwrite);
|
||||||
|
f_close(&file);
|
||||||
|
printf("burped hard: %d/%d\n", nwrite, len);
|
||||||
|
|
||||||
|
f_unmount("0:");
|
||||||
|
ff_disk_close();
|
||||||
|
FF_File = nullptr;
|
||||||
|
return nwrite==len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
u32 FATStorage::ReadSectors(u32 start, u32 num, u8* data)
|
u32 FATStorage::ReadSectors(u32 start, u32 num, u8* data)
|
||||||
{
|
{
|
||||||
return ReadSectorsInternal(File, FileSize, start, num, data);
|
return ReadSectorsInternal(File, FileSize, start, num, data);
|
||||||
@ -957,7 +1000,16 @@ printf("IMAGE FILE NEW: %d\n", isnew);
|
|||||||
if (hasdir)
|
if (hasdir)
|
||||||
{
|
{
|
||||||
FileSize = GetDirectorySize(sourcedir);
|
FileSize = GetDirectorySize(sourcedir);
|
||||||
FileSize += 0x4000000ULL; // 64MB leeway
|
FileSize += 0x8000000ULL; // 128MB leeway
|
||||||
|
|
||||||
|
// make it a power of two
|
||||||
|
FileSize |= (FileSize >> 1);
|
||||||
|
FileSize |= (FileSize >> 2);
|
||||||
|
FileSize |= (FileSize >> 4);
|
||||||
|
FileSize |= (FileSize >> 8);
|
||||||
|
FileSize |= (FileSize >> 16);
|
||||||
|
FileSize |= (FileSize >> 32);
|
||||||
|
FileSize++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
FileSize = 0x20000000ULL; // 512MB
|
FileSize = 0x20000000ULL; // 512MB
|
||||||
|
@ -37,6 +37,8 @@ public:
|
|||||||
bool Open();
|
bool Open();
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
|
bool InjectFile(std::string path, u8* data, u32 len);
|
||||||
|
|
||||||
u32 ReadSectors(u32 start, u32 num, u8* data);
|
u32 ReadSectors(u32 start, u32 num, u8* data);
|
||||||
u32 WriteSectors(u32 start, u32 num, u8* data);
|
u32 WriteSectors(u32 start, u32 num, u8* data);
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ u32 TransferDir;
|
|||||||
u8 TransferCmd[8];
|
u8 TransferCmd[8];
|
||||||
|
|
||||||
bool CartInserted;
|
bool CartInserted;
|
||||||
|
char CartName[256];
|
||||||
u8* CartROM;
|
u8* CartROM;
|
||||||
u32 CartROMSize;
|
u32 CartROMSize;
|
||||||
u32 CartID;
|
u32 CartID;
|
||||||
@ -202,7 +203,7 @@ void CartCommon::SetupDirectBoot()
|
|||||||
{
|
{
|
||||||
CmdEncMode = 2;
|
CmdEncMode = 2;
|
||||||
DataEncMode = 2;
|
DataEncMode = 2;
|
||||||
DSiMode = false; // TODO!!
|
DSiMode = IsDSi && NDS::ConsoleType==1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CartCommon::DoSavestate(Savestate* file)
|
void CartCommon::DoSavestate(Savestate* file)
|
||||||
@ -1164,12 +1165,16 @@ u8 CartRetailBT::SPIWrite(u8 val, u32 pos, bool last)
|
|||||||
|
|
||||||
CartHomebrew::CartHomebrew(u8* rom, u32 len, u32 chipid) : CartCommon(rom, len, chipid)
|
CartHomebrew::CartHomebrew(u8* rom, u32 len, u32 chipid) : CartCommon(rom, len, chipid)
|
||||||
{
|
{
|
||||||
|
ReadOnly = false; // TODO
|
||||||
|
|
||||||
//if (Config::DLDIEnable)
|
//if (Config::DLDIEnable)
|
||||||
if (true)
|
if (true)
|
||||||
{
|
{
|
||||||
ApplyDLDIPatch(melonDLDI, sizeof(melonDLDI), false);
|
ApplyDLDIPatch(melonDLDI, sizeof(melonDLDI), ReadOnly);
|
||||||
SD = new FATStorage("melonDLDI.bin", 0, false, "dldi");
|
SD = new FATStorage("melonDLDI.bin", 0, ReadOnly, "dldi");
|
||||||
SD->Open();
|
SD->Open();
|
||||||
|
|
||||||
|
// fat:/rom.nds
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
SD = nullptr;
|
SD = nullptr;
|
||||||
@ -1191,6 +1196,40 @@ void CartHomebrew::Reset()
|
|||||||
// TODO??? something about the FATStorage thing?
|
// TODO??? something about the FATStorage thing?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CartHomebrew::SetupDirectBoot()
|
||||||
|
{
|
||||||
|
CartCommon::SetupDirectBoot();
|
||||||
|
|
||||||
|
if (SD)
|
||||||
|
{
|
||||||
|
// add the ROM to the SD volume
|
||||||
|
|
||||||
|
if (!SD->InjectFile(CartName, CartROM, CartROMSize))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// setup argv command line
|
||||||
|
|
||||||
|
char argv[512] = {0};
|
||||||
|
int argvlen;
|
||||||
|
|
||||||
|
strncpy(argv, "fat:/", 511);
|
||||||
|
strncat(argv, CartName, 511);
|
||||||
|
argvlen = strlen(argv);
|
||||||
|
|
||||||
|
void (*writefn)(u32,u32) = (NDS::ConsoleType==1) ? DSi::ARM9Write32 : NDS::ARM9Write32;
|
||||||
|
|
||||||
|
u32 argvbase = Header.ARM9RAMAddress + Header.ARM9Size;
|
||||||
|
argvbase = (argvbase + 0xF) & ~0xF;
|
||||||
|
|
||||||
|
for (u32 i = 0; i <= argvlen; i+=4)
|
||||||
|
writefn(argvbase+i, *(u32*)&argv[i]);
|
||||||
|
|
||||||
|
writefn(0x02FFFE70, 0x5F617267);
|
||||||
|
writefn(0x02FFFE74, argvbase);
|
||||||
|
writefn(0x02FFFE78, argvlen+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CartHomebrew::DoSavestate(Savestate* file)
|
void CartHomebrew::DoSavestate(Savestate* file)
|
||||||
{
|
{
|
||||||
CartCommon::DoSavestate(file);
|
CartCommon::DoSavestate(file);
|
||||||
@ -1244,7 +1283,7 @@ void CartHomebrew::ROMCommandFinish(u8* cmd, u8* data, u32 len)
|
|||||||
case 0xC1:
|
case 0xC1:
|
||||||
{
|
{
|
||||||
u32 sector = (cmd[1]<<24) | (cmd[2]<<16) | (cmd[3]<<8) | cmd[4];
|
u32 sector = (cmd[1]<<24) | (cmd[2]<<16) | (cmd[3]<<8) | cmd[4];
|
||||||
if (SD && true) SD->WriteSectors(sector, len>>9, data);
|
if (SD && (!ReadOnly)) SD->WriteSectors(sector, len>>9, data);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1675,6 +1714,16 @@ bool LoadROM(const char* path, const char* sram, bool direct)
|
|||||||
|
|
||||||
NDS::Reset();
|
NDS::Reset();
|
||||||
|
|
||||||
|
char* romname = strrchr(path, '/');
|
||||||
|
if (!romname)
|
||||||
|
{
|
||||||
|
romname = strrchr(path, '\\');
|
||||||
|
if (!romname)
|
||||||
|
romname = (char*)&path[-1];
|
||||||
|
}
|
||||||
|
romname++;
|
||||||
|
strncpy(CartName, romname, 255); CartName[255] = '\0';
|
||||||
|
|
||||||
fseek(f, 0, SEEK_END);
|
fseek(f, 0, SEEK_END);
|
||||||
u32 len = (u32)ftell(f);
|
u32 len = (u32)ftell(f);
|
||||||
|
|
||||||
@ -1696,6 +1745,9 @@ bool LoadROM(const u8* romdata, u32 filelength, const char *sram, bool direct)
|
|||||||
{
|
{
|
||||||
NDS::Reset();
|
NDS::Reset();
|
||||||
|
|
||||||
|
// TODO: make it more meaningful?
|
||||||
|
strncpy(CartName, "rom.nds", 256);
|
||||||
|
|
||||||
u32 len = filelength;
|
u32 len = filelength;
|
||||||
CartROMSize = 0x200;
|
CartROMSize = 0x200;
|
||||||
while (CartROMSize < len)
|
while (CartROMSize < len)
|
||||||
|
@ -172,6 +172,7 @@ public:
|
|||||||
~CartHomebrew() override;
|
~CartHomebrew() override;
|
||||||
|
|
||||||
void Reset() override;
|
void Reset() override;
|
||||||
|
void SetupDirectBoot() override;
|
||||||
|
|
||||||
void DoSavestate(Savestate* file) override;
|
void DoSavestate(Savestate* file) override;
|
||||||
|
|
||||||
@ -183,6 +184,7 @@ private:
|
|||||||
void ReadROM_B7(u32 addr, u32 len, u8* data, u32 offset);
|
void ReadROM_B7(u32 addr, u32 len, u8* data, u32 offset);
|
||||||
|
|
||||||
FATStorage* SD;
|
FATStorage* SD;
|
||||||
|
bool ReadOnly;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern u16 SPICnt;
|
extern u16 SPICnt;
|
||||||
|
Reference in New Issue
Block a user