add files into the DLDI volume

This commit is contained in:
Arisotura 2021-09-21 23:15:52 +02:00
parent 2aa1f81301
commit bfb4769f6f
4 changed files with 83 additions and 22 deletions

View File

@ -121,7 +121,7 @@ if (ENABLE_OGLRENDERER)
target_include_directories(core PRIVATE ${EPOXY_INCLUDE_DIRS})
if (WIN32)
target_link_libraries(core ole32 comctl32 ws2_32 shlwapi ${EPOXY_LIBRARIES})
target_link_libraries(core ole32 comctl32 ws2_32 ${EPOXY_LIBRARIES})
elseif (APPLE)
target_link_libraries(core ${EPOXY_LIBRARIES})
else()
@ -129,7 +129,7 @@ if (ENABLE_OGLRENDERER)
endif()
else()
if (WIN32)
target_link_libraries(core ole32 comctl32 ws2_32 shlwapi)
target_link_libraries(core ole32 comctl32 ws2_32)
else()
target_link_libraries(core rt)
endif()

View File

@ -17,7 +17,7 @@
*/
#ifdef __WIN32__
#include <shlwapi.h>
#include <windows.h>
#else
#include <sys/types.h>
#endif // __WIN32__
@ -28,11 +28,14 @@
#include "Platform.h"
static int GetDirEntryType(struct dirent* entry)
static int GetDirEntryType(const char* path, struct dirent* entry)
{
#ifdef __WIN32__
BOOL res = PathIsDirectoryA(entry->d_name);
return res ? 1:0;
DWORD res = GetFileAttributesA(path);
if (res == INVALID_FILE_ATTRIBUTES) return -1;
if (res & FILE_ATTRIBUTE_DIRECTORY) return 1;
if (res & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DEVICE | FILE_ATTRIBUTE_VIRTUAL)) return -1;
return 0;
#else
if (entry->d_type == DT_DIR) return 1;
if (entry->d_type == DT_REG) return 0;
@ -44,7 +47,7 @@ static int GetDirEntryType(struct dirent* entry)
FATStorage::FATStorage()
{
printf("FATStorage begin\n");
bool res = Build(".", 0x40000000, "melonDLDI.bin");
bool res = Build("dldi", 0x20000000, "melonDLDI.bin");
printf("FATStorage result: %d\n", res);
}
@ -107,6 +110,47 @@ UINT FATStorage::FF_WriteStorage(BYTE* buf, LBA_t sector, UINT num)
}
bool FATStorage::ImportFile(const char* path, const char* in)
{
FIL file;
FILE* fin;
FRESULT res;
fin = fopen(in, "rb");
if (!fin)
return false;
fseek(fin, 0, SEEK_END);
u32 len = (u32)ftell(fin);
fseek(fin, 0, SEEK_SET);
res = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE);
if (res != FR_OK)
{
fclose(fin);
return false;
}
u8 buf[0x1000];
for (u32 i = 0; i < len; i += 0x1000)
{
u32 blocklen;
if ((i + 0x1000) > len)
blocklen = len - i;
else
blocklen = 0x1000;
u32 nwrite;
fread(buf, blocklen, 1, fin);
f_write(&file, buf, blocklen, &nwrite);
}
fclose(fin);
f_close(&file);
return true;
}
bool FATStorage::BuildSubdirectory(const char* sourcedir, const char* path, int level)
{
if (level >= 32)
@ -116,7 +160,7 @@ bool FATStorage::BuildSubdirectory(const char* sourcedir, const char* path, int
}
char fullpath[1024] = {0};
snprintf(fullpath, 1023, "%s/%s", sourcedir, path);
snprintf(fullpath, 1023, "%s%s", sourcedir, path);
DIR* dir = opendir(fullpath);
if (!dir) return false;
@ -138,23 +182,30 @@ bool FATStorage::BuildSubdirectory(const char* sourcedir, const char* path, int
if (entry->d_name[1] == '.' && entry->d_name[2] == '\0') continue;
}
int entrytype = GetDirEntryType(entry);
snprintf(fullpath, 1023, "%s%s/%s", sourcedir, path, entry->d_name);
int entrytype = GetDirEntryType(fullpath, entry);
if (entrytype == -1) continue;
if (entrytype == 1) // directory
{
snprintf(fullpath, 1023, "%s/%s", path, entry->d_name);
printf("DIR: %s/%s\n", sourcedir, fullpath);
if (!BuildSubdirectory(sourcedir, fullpath, level+1))
snprintf(fullpath, 1023, "0:%s/%s", path, entry->d_name);
FRESULT fres = f_mkdir(fullpath);
if (fres == FR_OK)
{
if (!BuildSubdirectory(sourcedir, &fullpath[2], level+1))
res = false;
}
else
res = false;
}
else // file
{
snprintf(fullpath, 1023, "%s/%s/%s", sourcedir, path, entry->d_name);
printf("FILE: %s\n", fullpath);
char importpath[1024] = {0};
snprintf(importpath, 1023, "0:%s/%s", path, entry->d_name);
printf("importing %s to %s\n", fullpath, importpath);
if (!ImportFile(importpath, fullpath))
res = false;
}
}
@ -167,7 +218,7 @@ bool FATStorage::Build(const char* sourcedir, u64 size, const char* filename)
{
filesize = size;
FF_File = Platform::OpenLocalFile(filename, "wb");
FF_File = Platform::OpenLocalFile(filename, "w+b");
if (!FF_File)
return false;
@ -176,8 +227,11 @@ bool FATStorage::Build(const char* sourcedir, u64 size, const char* filename)
FRESULT res;
// TODO: determine proper FAT type!
// for example: libfat tries to determine the FAT type from the number of clusters
// which doesn't match the way fatfs handles autodetection
MKFS_PARM fsopt;
fsopt.fmt = FM_FAT | FM_FAT32;
fsopt.fmt = FM_FAT;// | FM_FAT32;
fsopt.au_size = 0;
fsopt.align = 1;
fsopt.n_fat = 1;
@ -187,8 +241,14 @@ bool FATStorage::Build(const char* sourcedir, u64 size, const char* filename)
res = f_mkfs("0:", &fsopt, workbuf, sizeof(workbuf));
printf("MKFS RES %d\n", res);
FATFS fs;
res = f_mount(&fs, "0:", 0);
printf("MOUNT RES %d\n", res);
BuildSubdirectory(sourcedir, "", 0);
f_unmount("0:");
ff_disk_close();
fclose(FF_File);
FF_File = nullptr;

View File

@ -40,6 +40,7 @@ private:
static UINT FF_ReadStorage(BYTE* buf, LBA_t sector, UINT num);
static UINT FF_WriteStorage(BYTE* buf, LBA_t sector, UINT num);
bool ImportFile(const char* path, const char* in);
bool BuildSubdirectory(const char* sourcedir, const char* path, int level);
bool Build(const char* sourcedir, u64 size, const char* filename);
};

View File

@ -1168,8 +1168,8 @@ CartHomebrew::CartHomebrew(u8* rom, u32 len, u32 chipid) : CartCommon(rom, len,
if (Config::DLDIEnable)
{
ApplyDLDIPatch(melonDLDI, sizeof(melonDLDI));
SDFile = Platform::OpenLocalFile(Config::DLDISDPath, "r+b");
test = new FATStorage();
SDFile = Platform::OpenLocalFile(/*Config::DLDISDPath*/"melonDLDI.bin", "r+b");
}
else
SDFile = nullptr;
@ -1188,7 +1188,7 @@ void CartHomebrew::Reset()
if (SDFile) fclose(SDFile);
if (Config::DLDIEnable)
SDFile = Platform::OpenLocalFile(Config::DLDISDPath, "r+b");
SDFile = Platform::OpenLocalFile(/*Config::DLDISDPath*/"melonDLDI.bin", "r+b");
else
SDFile = nullptr;
}
@ -1224,7 +1224,7 @@ int CartHomebrew::ROMCommandStart(u8* cmd, u8* data, u32 len)
{
u32 sector = (cmd[1]<<24) | (cmd[2]<<16) | (cmd[3]<<8) | cmd[4];
u64 addr = sector * 0x200ULL;
//printf("SD READ: %08X, %p\n", sector, SDFile);
if (SDFile)
{
fseek(SDFile, addr, SEEK_SET);