#include "naomi_cart.h" #include "cfg/cfg.h" u8* RomPtr; u32 RomSize; #if HOST_OS == OS_WINDOWS typedef HANDLE fd_t; #define INVALID_FD INVALID_HANDLE_VALUE #else typedef int fd_t; #define INVALID_FD -1 #include #include #include #endif fd_t* RomCacheMap; u32 RomCacheMapCount; char SelectedFile[512]; bool naomi_cart_LoadRom(char* file) { printf("\nnullDC-Naomi rom loader v1.2\n"); size_t folder_pos = strlen(file) - 1; while (folder_pos>1 && (file[folder_pos] != '\\' && file[folder_pos] != '/')) folder_pos--; folder_pos++; // FIXME: Data loss if buffer is too small char t[512]; strncpy(t, file, sizeof(t)); t[sizeof(t) - 1] = '\0'; FILE* fl = fopen(t, "r"); if (!fl) return false; char* line = fgets(t, 512, fl); if (!line) { fclose(fl); return false; } char* eon = strstr(line, "\n"); if (!eon) printf("+Loading naomi rom that has no name\n"); else *eon = 0; printf("+Loading naomi rom : %s\n", line); line = fgets(t, 512, fl); if (!line) { fclose(fl); return false; } vector files; vector fstart; vector fsize; u32 setsize = 0; RomSize = 0; while (line) { char filename[512]; u32 addr, sz; sscanf(line, "\"%[^\"]\",%x,%x", filename, &addr, &sz); files.push_back(filename); fstart.push_back(addr); fsize.push_back(sz); setsize += sz; RomSize = max(RomSize, (addr + sz)); line = fgets(t, 512, fl); } fclose(fl); printf("+%d romfiles, %.2f MB set size, %.2f MB set address space\n", files.size(), setsize / 1024.f / 1024.f, RomSize / 1024.f / 1024.f); if (RomCacheMap) { RomCacheMapCount = 0; delete RomCacheMap; } RomCacheMapCount = (u32)files.size(); RomCacheMap = new fd_t[files.size()]; // FIXME: Data loss if buffer is too small strncpy(t, file, sizeof(t)); t[sizeof(t) - 1] = '\0'; t[folder_pos] = 0; strcat(t, "ndcn-composed.cache"); //Allocate space for the ram, so we are sure we have a segment of continius ram #if HOST_OS == OS_WINDOWS RomPtr = (u8*)VirtualAlloc(0, RomSize, MEM_RESERVE, PAGE_NOACCESS); #else RomPtr = (u8*)mmap(0, RomSize, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0); #endif verify(RomPtr != 0); verify(RomPtr != (void*)-1); // FIXME: Data loss if buffer is too small strncpy(t, file, sizeof(t)); t[sizeof(t) - 1] = '\0'; //Create File Mapping Objects for (size_t i = 0; i