add loaded ROM to DLDI volume, pass path via argv
This commit is contained in:
parent
c9b36017b1
commit
239499f6a4
|
@ -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)
|
||||
{
|
||||
return ReadSectorsInternal(File, FileSize, start, num, data);
|
||||
|
@ -957,7 +1000,16 @@ printf("IMAGE FILE NEW: %d\n", isnew);
|
|||
if (hasdir)
|
||||
{
|
||||
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
|
||||
FileSize = 0x20000000ULL; // 512MB
|
||||
|
|
|
@ -37,6 +37,8 @@ public:
|
|||
bool Open();
|
||||
void Close();
|
||||
|
||||
bool InjectFile(std::string path, u8* data, u32 len);
|
||||
|
||||
u32 ReadSectors(u32 start, u32 num, u8* data);
|
||||
u32 WriteSectors(u32 start, u32 num, u8* data);
|
||||
|
||||
|
|
|
@ -52,6 +52,7 @@ u32 TransferDir;
|
|||
u8 TransferCmd[8];
|
||||
|
||||
bool CartInserted;
|
||||
char CartName[256];
|
||||
u8* CartROM;
|
||||
u32 CartROMSize;
|
||||
u32 CartID;
|
||||
|
@ -202,7 +203,7 @@ void CartCommon::SetupDirectBoot()
|
|||
{
|
||||
CmdEncMode = 2;
|
||||
DataEncMode = 2;
|
||||
DSiMode = false; // TODO!!
|
||||
DSiMode = IsDSi && NDS::ConsoleType==1;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
ReadOnly = false; // TODO
|
||||
|
||||
//if (Config::DLDIEnable)
|
||||
if (true)
|
||||
{
|
||||
ApplyDLDIPatch(melonDLDI, sizeof(melonDLDI), false);
|
||||
SD = new FATStorage("melonDLDI.bin", 0, false, "dldi");
|
||||
ApplyDLDIPatch(melonDLDI, sizeof(melonDLDI), ReadOnly);
|
||||
SD = new FATStorage("melonDLDI.bin", 0, ReadOnly, "dldi");
|
||||
SD->Open();
|
||||
|
||||
// fat:/rom.nds
|
||||
}
|
||||
else
|
||||
SD = nullptr;
|
||||
|
@ -1191,6 +1196,40 @@ void CartHomebrew::Reset()
|
|||
// 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)
|
||||
{
|
||||
CartCommon::DoSavestate(file);
|
||||
|
@ -1244,7 +1283,7 @@ void CartHomebrew::ROMCommandFinish(u8* cmd, u8* data, u32 len)
|
|||
case 0xC1:
|
||||
{
|
||||
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;
|
||||
|
||||
|
@ -1675,6 +1714,16 @@ bool LoadROM(const char* path, const char* sram, bool direct)
|
|||
|
||||
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);
|
||||
u32 len = (u32)ftell(f);
|
||||
|
||||
|
@ -1696,6 +1745,9 @@ bool LoadROM(const u8* romdata, u32 filelength, const char *sram, bool direct)
|
|||
{
|
||||
NDS::Reset();
|
||||
|
||||
// TODO: make it more meaningful?
|
||||
strncpy(CartName, "rom.nds", 256);
|
||||
|
||||
u32 len = filelength;
|
||||
CartROMSize = 0x200;
|
||||
while (CartROMSize < len)
|
||||
|
|
|
@ -172,6 +172,7 @@ public:
|
|||
~CartHomebrew() override;
|
||||
|
||||
void Reset() override;
|
||||
void SetupDirectBoot() override;
|
||||
|
||||
void DoSavestate(Savestate* file) override;
|
||||
|
||||
|
@ -183,6 +184,7 @@ private:
|
|||
void ReadROM_B7(u32 addr, u32 len, u8* data, u32 offset);
|
||||
|
||||
FATStorage* SD;
|
||||
bool ReadOnly;
|
||||
};
|
||||
|
||||
extern u16 SPICnt;
|
||||
|
|
Loading…
Reference in New Issue