loadrom now using fatfs
fixes issues loading roms #14 #18 fixes loading fragmented files
This commit is contained in:
parent
756fbc15ce
commit
8045aea0e0
344
src/main.c
344
src/main.c
@ -1301,182 +1301,202 @@ void loadrom(display_context_t disp, u8 *buff, int fast)
|
|||||||
clearScreen(disp);
|
clearScreen(disp);
|
||||||
display_show(disp);
|
display_show(disp);
|
||||||
|
|
||||||
if (!fast)
|
printText("Loading ROM, Please wait:", 3, 4, disp);
|
||||||
printText("Restoring:", 3, 4, disp);
|
|
||||||
|
|
||||||
//sleep(1000); //needless waiting :>
|
|
||||||
|
|
||||||
TRACE(disp, "timing done");
|
TRACE(disp, "timing done");
|
||||||
|
|
||||||
u8 tmp[32];
|
|
||||||
u8 filename[64];
|
u8 filename[64];
|
||||||
u8 ok = 0;
|
|
||||||
|
|
||||||
sprintf(filename, "%s", buff);
|
sprintf(filename, "%s", buff);
|
||||||
int swapped = 0;
|
|
||||||
|
FRESULT result;
|
||||||
|
FIL file;
|
||||||
|
UINT bytesread = 0;
|
||||||
|
result = f_open(&file, filename, FA_READ);
|
||||||
|
|
||||||
TRACE(disp, buff);
|
if (result == FR_OK)
|
||||||
|
|
||||||
FatRecord rec_tmpf;
|
|
||||||
//not needed any longer :>
|
|
||||||
//file IS there, it's selected at this point
|
|
||||||
ok = fatFindRecord(filename, &rec_tmpf, 0);
|
|
||||||
|
|
||||||
TRACE(disp, "found");
|
|
||||||
|
|
||||||
u8 resp = 0;
|
|
||||||
|
|
||||||
resp = fatOpenFileByName(filename, 0); //err if not found ^^
|
|
||||||
|
|
||||||
TRACE(disp, "opened");
|
|
||||||
|
|
||||||
int mb = file.sec_available / 2048;
|
|
||||||
int file_sectors = file.sec_available;
|
|
||||||
int block_offset = 0;
|
|
||||||
u32 cart_buff_offset = 0;
|
|
||||||
u32 begin_sector = file.sector;
|
|
||||||
|
|
||||||
//filesize -> readfile / 512
|
|
||||||
int fsize = 512; //rom-headersize 4096 but the bootcode is not needed
|
|
||||||
unsigned char headerdata[fsize]; //1*512
|
|
||||||
|
|
||||||
resp = fatReadFile(&headerdata, fsize / 512); //1 cluster
|
|
||||||
|
|
||||||
int sw_type = is_valid_rom(headerdata);
|
|
||||||
|
|
||||||
if (sw_type != 0)
|
|
||||||
{
|
{
|
||||||
if (!fast)
|
int swapped = 0;
|
||||||
printText("byteswapped file", 3, -1, disp);
|
int headerfsize = 512; //rom-headersize 4096 but the bootcode is not needed
|
||||||
|
unsigned char headerdata[headerfsize]; //1*512
|
||||||
|
int fsize = f_size(&file);
|
||||||
|
int fsizeMB = fsize /1048576; //Bytes in a MB
|
||||||
|
|
||||||
swapped = 1;
|
result =
|
||||||
swap_header(headerdata, 512);
|
f_read (
|
||||||
}
|
&file, /* [IN] File object */
|
||||||
|
&headerdata, /* [OUT] Buffer to store read data */
|
||||||
|
headerfsize, /* [IN] Number of bytes to read */
|
||||||
|
&bytesread /* [OUT] Number of bytes read */
|
||||||
|
);
|
||||||
|
|
||||||
//char 32-51 name
|
result = f_close(&file);
|
||||||
unsigned char rom_name[32];
|
|
||||||
|
|
||||||
for (int u = 0; u < 19; u++)
|
int sw_type = is_valid_rom(headerdata);
|
||||||
{
|
|
||||||
if (u != 0)
|
if (sw_type != 0)
|
||||||
sprintf(rom_name, "%s%c", rom_name, headerdata[32 + u]);
|
{
|
||||||
|
swapped = 1;
|
||||||
|
swap_header(headerdata, 512);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fast != 1)
|
||||||
|
{
|
||||||
|
//char 32-51 name
|
||||||
|
unsigned char rom_name[32];
|
||||||
|
|
||||||
|
for (int u = 0; u < 19; u++)
|
||||||
|
{
|
||||||
|
if (u != 0)
|
||||||
|
sprintf(rom_name, "%s%c", rom_name, headerdata[32 + u]);
|
||||||
|
else
|
||||||
|
sprintf(rom_name, "%c", headerdata[32 + u]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//rom name
|
||||||
|
sprintf(rom_name, "%s", trim(rom_name));
|
||||||
|
printText(rom_name, 3, -1, disp);
|
||||||
|
|
||||||
|
//rom size
|
||||||
|
sprintf(rom_name, "Size: %iMB", fsizeMB);
|
||||||
|
printText(rom_name, 3, -1, disp);
|
||||||
|
|
||||||
|
|
||||||
|
//unique cart id for gametype
|
||||||
|
unsigned char cartID_str[12];
|
||||||
|
sprintf(cartID_str, "ID: %c%c%c%c", headerdata[0x3B], headerdata[0x3C], headerdata[0x3D], headerdata[0x3E]);
|
||||||
|
printText(cartID_str, 3, -1, disp);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cic, save;
|
||||||
|
|
||||||
|
cic = get_cic(&headerdata[0x40]);
|
||||||
|
|
||||||
|
unsigned char cartID_short[4];
|
||||||
|
sprintf(cartID_short, "%c%c\0", headerdata[0x3C], headerdata[0x3D]);
|
||||||
|
|
||||||
|
if (get_cic_save(cartID_short, &cic, &save))
|
||||||
|
{
|
||||||
|
if (fast != 1)
|
||||||
|
{
|
||||||
|
printText("found in db", 3, -1, disp);
|
||||||
|
unsigned char save_type_str[12];
|
||||||
|
sprintf(save_type_str, "Save: %s", saveTypeToExtension(save, ext_type));
|
||||||
|
printText(save_type_str, 3, -1, disp);
|
||||||
|
|
||||||
|
unsigned char cic_type_str[12];
|
||||||
|
|
||||||
|
switch (cic)
|
||||||
|
{
|
||||||
|
case 4:
|
||||||
|
sprintf(cic_type_str, "CIC: CIC-5101", cic);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
sprintf(cic_type_str, "CIC: CIC-5167", cic);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf(cic_type_str, "CIC: CIC-610%i", cic);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printText(cic_type_str, 3, -1, disp);
|
||||||
|
}
|
||||||
|
//thanks for the db :>
|
||||||
|
//cart was found, use CIC and SaveRAM type
|
||||||
|
}
|
||||||
|
|
||||||
|
//new rom_config
|
||||||
|
boot_cic = rom_config[1] + 1;
|
||||||
|
boot_save = rom_config[2];
|
||||||
|
force_tv = rom_config[3];
|
||||||
|
cheats_on = rom_config[4];
|
||||||
|
checksum_fix_on = rom_config[5];
|
||||||
|
boot_country = rom_config[7]; //boot_block
|
||||||
|
|
||||||
|
if (gbload == 1)
|
||||||
|
boot_save = 1;
|
||||||
|
|
||||||
|
// TRACE(disp, "Checking SD mode");
|
||||||
|
|
||||||
|
// int resp = evd_isSDMode();
|
||||||
|
|
||||||
|
// TRACEF(disp, "SD mode: %i", resp);
|
||||||
|
// TRACE(disp, "Loading:");
|
||||||
|
|
||||||
|
if (swapped == 1)
|
||||||
|
{
|
||||||
|
while (evd_isDmaBusy())
|
||||||
|
;
|
||||||
|
sleep(400); //Is this necessary?
|
||||||
|
evd_mmcSetDmaSwap(1);
|
||||||
|
|
||||||
|
TRACE(disp, "swapping on");
|
||||||
|
}
|
||||||
|
|
||||||
|
bytesread = 0;
|
||||||
|
result = f_open(&file, filename, FA_READ);
|
||||||
|
if (fsizeMB <= 32)
|
||||||
|
{
|
||||||
|
result =
|
||||||
|
f_read (
|
||||||
|
&file, /* [IN] File object */
|
||||||
|
(void *)0xb0000000, /* [OUT] Buffer to store read data */
|
||||||
|
fsize, /* [IN] Number of bytes to read */
|
||||||
|
&bytesread /* [OUT] Number of bytes read */
|
||||||
|
);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
sprintf(rom_name, "%c", headerdata[32 + u]);
|
{
|
||||||
}
|
result =
|
||||||
//trim right spaces
|
f_read (
|
||||||
//romname=trimmed rom name for filename
|
&file, /* [IN] File object */
|
||||||
sprintf(rom_name, "%s", trim(rom_name));
|
(void *)0xb0000000, /* [OUT] Buffer to store read data */
|
||||||
|
32 * 1048576, /* [IN] Number of bytes to read */
|
||||||
|
&bytesread /* [OUT] Number of bytes read */
|
||||||
|
);
|
||||||
|
if(result == FR_OK)
|
||||||
|
{
|
||||||
|
result =
|
||||||
|
f_read (
|
||||||
|
&file, /* [IN] File object */
|
||||||
|
(void *)0xb2000000, /* [OUT] Buffer to store read data */
|
||||||
|
fsize - bytesread, /* [IN] Number of bytes to read */
|
||||||
|
&bytesread /* [OUT] Number of bytes read */
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!fast)
|
if(result == FR_OK)
|
||||||
printText(rom_name, 3, -1, disp);
|
{
|
||||||
|
printText("Rom loaded", 3, -1, disp);
|
||||||
|
//if (debug) {
|
||||||
|
// for (int i = 0; i < 4; i++)
|
||||||
|
// {
|
||||||
|
// u8 buff[16];
|
||||||
|
// dma_read_s(buff, 0xb0000000 + 0x00100000 * i, 1);
|
||||||
|
|
||||||
|
// unsigned char probe_str[12];
|
||||||
|
// TRACEF(disp, "probe: %hhx", buff[0]);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
//unique cart id for gametype
|
// sleep(1000);
|
||||||
|
|
||||||
sprintf(cartID, "%c%c%c%c", headerdata[0x3B], headerdata[0x3C], headerdata[0x3D], headerdata[0x3E]);
|
if (!fast)
|
||||||
|
{
|
||||||
int cic, save;
|
printText(" ", 3, -1, disp);
|
||||||
|
printText("(C-UP to activate cheats)", 3, -1, disp);
|
||||||
cic = get_cic(&headerdata[0x40]);
|
printText("(C-RIGHT to force menu tv mode)", 3, -1, disp);
|
||||||
|
printText("done: PRESS START", 3, -1, disp);
|
||||||
unsigned char cartID_short[4];
|
}
|
||||||
sprintf(cartID_short, "%c%c\0", headerdata[0x3C], headerdata[0x3D]);
|
else
|
||||||
|
{
|
||||||
if (get_cic_save(cartID_short, &cic, &save))
|
bootRom(disp, 1);
|
||||||
{
|
}
|
||||||
if (!fast)
|
}
|
||||||
printText("found in db", 3, -1, disp);
|
else
|
||||||
//thanks for the db :>
|
{
|
||||||
// cart was found, use CIC and SaveRAM type
|
printText("file open error", 3, -1, disp);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACEF(disp, "Info: cic=%i save=%i", cic, save);
|
|
||||||
|
|
||||||
//new rom_config
|
|
||||||
boot_cic = rom_config[1] + 1;
|
|
||||||
boot_save = rom_config[2];
|
|
||||||
force_tv = rom_config[3];
|
|
||||||
cheats_on = rom_config[4];
|
|
||||||
checksum_fix_on = rom_config[5];
|
|
||||||
boot_country = rom_config[7]; //boot_block
|
|
||||||
|
|
||||||
if (gbload == 1)
|
|
||||||
boot_save = 1;
|
|
||||||
|
|
||||||
else if (resp) //TODO: if response is certain ones we should show the error and stop the boot...
|
|
||||||
{
|
|
||||||
sprintf(tmp, "Response: %i", resp);
|
|
||||||
printText(tmp, 3, -1, disp);
|
|
||||||
sleep(2000);
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE(disp, "Checking SD mode");
|
|
||||||
|
|
||||||
resp = evd_isSDMode();
|
|
||||||
|
|
||||||
TRACEF(disp, "SD mode: %i", resp);
|
|
||||||
TRACEF(disp, "Size: %i", file.sec_available);
|
|
||||||
TRACEF(disp, "File sector: %i", file.sector);
|
|
||||||
TRACE(disp, "Loading:");
|
|
||||||
|
|
||||||
sleep(10);
|
|
||||||
|
|
||||||
if (swapped == 1)
|
|
||||||
{
|
|
||||||
while (evd_isDmaBusy())
|
|
||||||
;
|
|
||||||
sleep(400);
|
|
||||||
evd_mmcSetDmaSwap(1);
|
|
||||||
|
|
||||||
TRACE(disp, "swapping on");
|
|
||||||
|
|
||||||
sleep(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fast)
|
|
||||||
printText("loading please wait...", 3, -1, disp);
|
|
||||||
else
|
|
||||||
printText("loading please wait...", 3, 4, disp);
|
|
||||||
|
|
||||||
sleep(10);
|
|
||||||
|
|
||||||
int lower_half = 2048 * 32;
|
|
||||||
|
|
||||||
if (mb <= 32)
|
|
||||||
{
|
|
||||||
resp = sdRead(begin_sector, (void *)0xb0000000, file_sectors); //2048 cluster 1Mb
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
resp = sdRead(begin_sector, (void *)0xb0000000, lower_half);
|
|
||||||
resp = sdRead(begin_sector + lower_half, (void *)0xb2000000, file_sectors - lower_half);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resp)
|
|
||||||
{
|
|
||||||
TRACEF(disp, "mmcToCart: %i", resp);
|
|
||||||
}
|
|
||||||
|
|
||||||
//if (debug) {
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
u8 buff[16];
|
|
||||||
dma_read_s(buff, 0xb0000000 + 0x00100000 * i, 1);
|
|
||||||
TRACEF(disp, "probe: %hhx", buff[0]);
|
|
||||||
}
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (!fast)
|
|
||||||
{
|
|
||||||
sleep(200);
|
|
||||||
|
|
||||||
printText(" ", 3, -1, disp);
|
|
||||||
printText("(C-UP to activate cheats)", 3, -1, disp);
|
|
||||||
printText("(C-RIGHT to force menu tv mode)", 3, -1, disp);
|
|
||||||
printText("done: PRESS START", 3, -1, disp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bootRom(disp, 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user