work on fatfs functions

fixed issue with debug corrupting display buffer #16
This commit is contained in:
Robin Jones 2017-10-25 10:40:17 +01:00
parent af6c2380ad
commit 20c4993cdf
3 changed files with 126 additions and 84 deletions

View File

@ -11,7 +11,7 @@
#define TRACE(disp, text) printText(text, 3, -1, disp);
#else
#define TRACEF(disp, text, ...) do { if (0) dbg_printf(disp, text, __VA_ARGS__); } while (0)
#define TRACE(disp, text) do { if (0) printText(text, 3, -1, disp); } while (0)
#define TRACE(disp, text) do { if (0) printText(text, 3, -1, disp); } didplay_show(disp); while (0)
#endif
void dbg_printf(display_context_t disp, const char *fmt, ...);

View File

@ -7,7 +7,7 @@
void dbg_printf(display_context_t disp, const char *fmt, ...)
{
char buf[32];
char buf[256] = {0};
setbuf(stderr, buf);
va_list args;
@ -15,7 +15,8 @@ void dbg_printf(display_context_t disp, const char *fmt, ...)
vfprintf(stderr, fmt, args);
va_end(args);
u8 tmp[32];
u8 tmp[256] = {0};
sprintf(tmp, "%s", buf);
printText(tmp, 3, -1, disp);
display_show(disp);
}

View File

@ -182,7 +182,7 @@ int save_after_reboot = 0;
unsigned char cartID[4];
char curr_dirname[64];
char pwd[64];
char rom_filename[256];
TCHAR rom_filename[256];
u32 rom_buff[128]; //rom buffer
u8 *rom_buff8; //rom buffer
@ -905,7 +905,7 @@ void clearScreen(display_context_t disp)
void romInfoScreen(display_context_t disp, u8 *buff, int silent)
{
u8 filename[64];
TCHAR filename[64];
sprintf(filename, "%s", buff);
int swapped = 0;
@ -1044,7 +1044,7 @@ void romInfoScreen(display_context_t disp, u8 *buff, int silent)
sprite_t *loadPng(u8 *png_filename)
{
u8 *filename = (u8 *)malloc(slen(png_filename));
TCHAR *filename = (TCHAR *)malloc(slen(png_filename));
sprintf(filename, "%s", png_filename);
FRESULT result;
@ -1084,7 +1084,7 @@ void loadgbrom(display_context_t disp, u8 *buff)
fr = f_stat("/ED64/gblite.z64", &fno);
if (fr == FR_OK)
{
u8 gb_sram_file[64];
TCHAR gb_sram_file[64];
sprintf(gb_sram_file, "/ED64/%s/gblite.SRM", save_path);
@ -1122,7 +1122,7 @@ void loadgbrom(display_context_t disp, u8 *buff)
}
}
void loadmsx2rom(display_context_t disp, u8 *rom_path)
void loadmsx2rom(display_context_t disp, TCHAR *rom_path)
{
FRESULT romresult;
@ -1193,7 +1193,7 @@ void loadmsx2rom(display_context_t disp, u8 *rom_path)
}
}
void loadggrom(display_context_t disp, u8 *rom_path) //TODO: this could be merged with MSX
void loadggrom(display_context_t disp, TCHAR *rom_path) //TODO: this could be merged with MSX
{
FRESULT romresult;
@ -1281,7 +1281,7 @@ void rom_load_y(void)
}
}
void loadnesrom(display_context_t disp, u8 *rom_path)
void loadnesrom(display_context_t disp, TCHAR *rom_path)
{
FRESULT result;
FIL emufile;
@ -1340,7 +1340,7 @@ void loadrom(display_context_t disp, u8 *buff, int fast)
printText("Loading ROM, Please wait:", 3, 4, disp);
u8 filename[64];
TCHAR filename[64];
sprintf(filename, "%s", buff);
FRESULT result;
@ -1461,7 +1461,6 @@ void loadrom(display_context_t disp, u8 *buff, int fast)
{
while (evd_isDmaBusy())
;
sleep(400); //Is this necessary?
evd_mmcSetDmaSwap(1);
TRACE(disp, "swapping on");
@ -1538,17 +1537,17 @@ void loadrom(display_context_t disp, u8 *buff, int fast)
int backupSaveData(display_context_t disp)
{
//backup cart-save on sd after reboot
u8 config_file_path[32];
sprintf(config_file_path, "/ED64/%s/LAST.CRT", save_path);
TCHAR config_file_path[32];
sprintf(config_file_path, "/ED64/%s/LASTROM.CFG", save_path);
int save_format;
uint8_t cfg_data[512]; //TODO: this should be a strut?
u8 save_format;
u8 cfg_data[2]; //TODO: this should be a strut?
FRESULT result;
FIL file;
UINT bytesread;
result = f_open(&file, config_file_path, FA_READ | FA_WRITE | FA_OPEN_ALWAYS);
result = f_open(&file, config_file_path, FA_READ);
if (result == FR_OK)
{
@ -1560,41 +1559,47 @@ int backupSaveData(display_context_t disp)
result =
f_read (
&file, /* [IN] File object */
cfg_data, /* [OUT] Buffer to store read data */
fsize, /* [IN] Number of bytes to read */
&cfg_data, /* [OUT] Buffer to store read data */
2, /* [IN] Number of bytes to read */
&bytesread /* [OUT] Number of bytes read */
);
//split in save type and cart-id
save_format = cfg_data[0];
TRACEF(disp, "save=%i", save_format);
sleep(3000);
int last_cic = cfg_data[1];
scopy(cfg_data + 2, rom_filename); //string copy
TRACEF(disp, "cic=%i", last_cic);
sleep(3000);
f_gets(rom_filename, 256, &file);
TRACEF(disp, "File: %s", rom_filename);
TRACE(disp, "copied last played game string");
f_close(&file);
//set savetype to 0 disable for next boot
if (save_format != 0)
{
result = f_open(&file, config_file_path, FA_WRITE | FA_OPEN_EXISTING);
//set savetype to off
cfg_data[0] = 0;
result = f_lseek(&file, 0);
UINT bw;
result = f_write (
&file, /* [IN] Pointer to the file object structure */
cfg_data, /* [IN] Pointer to the data to be written */
512, /* [IN] Number of bytes to write */
&cfg_data, /* [IN] Pointer to the data to be written */
1, /* [IN] Number of bytes to write */
&bw /* [OUT] Pointer to the variable to return number of bytes written */
);
);
f_close(&file);
TRACE(disp, "Disabling save for subsequent system reboots");
TRACEF(disp, "FAT_WriteFile returned: %i", result);
volatile u8 save_config_state = 0;
evd_readReg(0);
int cfgreg = evd_readReg(REG_CFG);
save_config_state = evd_readReg(REG_SAV_CFG);
if (save_config_state != 0 || evd_getFirmVersion() >= 0x0300)
@ -1607,21 +1612,18 @@ int backupSaveData(display_context_t disp)
}
else
{
f_close(&file);
TRACE(disp, "Save not required.");
printText("...ready", 3, -1, disp);
display_show(disp);
return 1;
}
}
f_close(&file);
}
else
{
TRACE(disp, "No previous ROM loaded!");
printText("...ready", 3, -1, disp);
display_show(disp);
return 0;
}
@ -1643,7 +1645,8 @@ int backupSaveData(display_context_t disp)
TRACE(disp, "no reset - save request");
printText("...done", 3, -1, disp);
}
display_show(disp);
sleep(2000);
return 1;
}
@ -1652,10 +1655,17 @@ int backupSaveData(display_context_t disp)
int saveTypeFromSd(display_context_t disp, char *rom_name, int stype)
{
rom_load_y();
u8 fname[256];
TRACE(disp, rom_filename);
TCHAR fname[256] = {0};
sprintf(fname, "/ED64/%s/%s.%s", save_path, rom_name, saveTypeToExtension(stype, ext_type));
TCHAR fname1[50] = {0};
sprintf(fname1, "/ED64/%s/", save_path);
printText(fname1, 3, -1, disp);
TCHAR fname2[50] = {0};
sprintf(fname2, "%s.%s", rom_name, saveTypeToExtension(stype, ext_type));
printText(fname2, 3, -1, disp);
int size = saveTypeToSize(stype); // int byte
uint8_t cartsave_data[size];
@ -1680,9 +1690,38 @@ int saveTypeFromSd(display_context_t disp, char *rom_name, int stype)
}
else
{
printText(fname, 3, -1, disp);
switch(result)
{
case FR_NOT_READY:
printText("not ready error", 11, -1, disp);
break;
case FR_NO_FILE:
printText("no file error", 11, -1, disp);
break;
case FR_NO_PATH:
printText("no path error", 11, -1, disp);
break;
case FR_INVALID_NAME:
printText("invalid name error", 11, -1, disp);
break;
case FR_DENIED:
printText("denied error", 11, -1, disp);
break;
case FR_EXIST:
printText("exist error", 11, -1, disp);
break;
case FR_TIMEOUT:
printText("timeout error", 11, -1, disp);
break;
case FR_LOCKED:
printText("locked error", 11, -1, disp);
break;
default:
break;
}
printText("no save found", 3, -1, disp);
sleep(1000);
sleep(5000);
//todo: clear memory area
return 0;
@ -1706,10 +1745,19 @@ int saveTypeFromSd(display_context_t disp, char *rom_name, int stype)
int saveTypeToSd(display_context_t disp, char *rom_name, int stype)
{
rom_load_y();
//after reset create new savefile
u8 fname[128]; //TODO: change filename buffers to 256!!!
TCHAR fname[256]; //TODO: change filename buffers to 256!!!
TRACEF(disp, "rname=%s", rom_name);
sleep(3000);
TRACEF(disp, "savetype=%i /n", stype);
sleep(5000);
TRACEF(disp, "ext=%s", saveTypeToExtension(stype, ext_type));
sleep(3000);
sprintf(fname, "/ED64/%s/%s.%s", save_path, rom_name, saveTypeToExtension(stype, ext_type));
TRACEF(disp, "fname=%s", fname);
sleep(3000);
int size = saveTypeToSize(stype); // int byte
TRACEF(disp, "size for save=%i", size);
@ -1754,12 +1802,16 @@ int saveTypeToSd(display_context_t disp, char *rom_name, int stype)
return 0;
}
}
else
{
TRACE(disp, "COULDNT CREATE FILE :-(");
}
}
//check out the userfriendly ini file for config-information
int readConfigFile(void)
{
u8 filename[32];
TCHAR filename[32];
sprintf(filename, "/ED64/ALT64.INI");
FRESULT result;
@ -1841,9 +1893,8 @@ uint32_t translate_color(char *hexstring)
//init fat filesystem after everdrive init and before sdcard access
void initFilesystem(void)
{
sleep(1000);
evd_ulockRegs();
sleep(1000);
sleep(10);
fs = malloc(sizeof (FATFS)); /* Get work area for the volume */
FRESULT result = f_mount(fs,"",1);
@ -1864,9 +1915,6 @@ void initFilesystem(void)
//prints the sdcard-filesystem content
void readSDcard(display_context_t disp, char *directory)
{
//todo: check out the minimal sleeping needs
//color test
FatRecord *frec;
u8 cresp = 0;
count = 1;
@ -1995,7 +2043,7 @@ void readSDcard(display_context_t disp, char *directory)
* - One for the "at boot" cheats
* - Another for the "in-game" cheats
*/
int readCheatFile(char *filename, u32 *cheat_lists[2])
int readCheatFile(TCHAR *filename, u32 *cheat_lists[2])
{
// YAML parser
yaml_parser_t parser;
@ -2219,10 +2267,10 @@ void bootRom(display_context_t disp, int silent)
{
if (boot_save != 0)
{
u8 cfg_file[32];
TCHAR cfg_file[32];
//set cfg file with last loaded cart info and save-type
sprintf(cfg_file, "/ED64/%s/LAST.CRT", save_path);
sprintf(cfg_file, "/ED64/%s/LASTROM.CFG", save_path);
FRESULT result;
FIL file;
@ -2230,23 +2278,18 @@ void bootRom(display_context_t disp, int silent)
if (result == FR_OK)
{
static uint8_t cfg_file_data[512] = {0};
cfg_file_data[0] = boot_save;
cfg_file_data[1] = boot_cic;
scopy(rom_filename, cfg_file_data + 2);
uint8_t cfg_data[2] = {boot_save, boot_cic};
UINT bw;
result =
f_write (
result = f_write (
&file, /* [IN] Pointer to the file object structure */
cfg_file_data, /* [IN] Pointer to the data to be written */
sizeof(cfg_file_data), /* [IN] Number of bytes to write */
&bw /* [OUT] Pointer to the variable to return number of bytes written */
&cfg_data, /* [IN] Pointer to the data to be written */
2, /* [IN] Number of bytes to write */
&bw /* [OUT] Pointer to the variable to return number of bytes written */
);
// f_putc(boot_save, &file);
// f_putc(boot_cic, &file);
// f_puts(rom_filename, &file);
f_puts(rom_filename, &file);
f_close(&file);
@ -2312,7 +2355,7 @@ void bootRom(display_context_t disp, int silent)
f_mount(0, "", 0); /* Unmount the default drive */
free(fs); /* Here the work area can be discarded */
sleep(3000);
simulate_boot(boot_cic, bios_cic, cheat_lists); // boot_cic
}
}
@ -2409,7 +2452,7 @@ void drawShortInfoBox(display_context_t disp, char *text, u8 mode)
void readRomConfig(display_context_t disp, char *short_filename, char *full_filename)
{
char cfg_filename[256];
TCHAR cfg_filename[256];
sprintf(rom_filename, "%s", short_filename);
rom_filename[strlen(rom_filename) - 4] = '\0'; // cut extension
sprintf(cfg_filename, "/ED64/CFG/%s.CFG", rom_filename);
@ -2647,7 +2690,7 @@ void drawToplistBox(display_context_t disp, int line)
// if (res != FR_OK) break;
// path[i] = 0;
} else { /* It is a file. */
u8 rom_cfg_file[128];
TCHAR rom_cfg_file[128];
//set rom_cfg
sprintf(rom_cfg_file, path, fno.fname);
@ -2662,7 +2705,7 @@ void drawToplistBox(display_context_t disp, int line)
static uint8_t cfg_file_data[512] = {0};
int fsize = f_size(&file);
int fsize = f_size(&file) + 1;
result =
f_read (
@ -3476,8 +3519,6 @@ void handleInput(display_context_t disp, sprite_t *contr)
//quick boot
if (quick_boot)
{
uint8_t lastrom_cfg_data[512];
FRESULT result;
FIL file;
UINT bytesread;
@ -3485,7 +3526,8 @@ void handleInput(display_context_t disp, sprite_t *contr)
if (result == FR_OK)
{
int fsize = f_size(&file);
int fsize = f_size(&file) + 1; //extra char needed for null terminator '/0'
uint8_t lastrom_cfg_data[fsize];
// result =
// f_read (
@ -3499,7 +3541,7 @@ void handleInput(display_context_t disp, sprite_t *contr)
f_close(&file);
u8 *end_chr = strrchr(lastrom_cfg_data, '/');
u8 *file_name = strrchr(lastrom_cfg_data, '/');
while (!(disp = display_lock()))
;
@ -3509,14 +3551,16 @@ void handleInput(display_context_t disp, sprite_t *contr)
sleep(100);
select_mode = 9;
//short fullpath
readRomConfig(disp, end_chr + 1, lastrom_cfg_data);
//short fullpath
readRomConfig(disp, file_name + 1, lastrom_cfg_data);
loadrom(disp, lastrom_cfg_data, 1);
display_show(disp);
}
drawShortInfoBox(disp, " rom not found", 0);
else
{
drawShortInfoBox(disp, " rom not found", 0);
}
}
else if (list[cursor].type != DT_DIR && empty == 0)
{
@ -3947,16 +3991,15 @@ void handleInput(display_context_t disp, sprite_t *contr)
drawBoxNumber(disp, 3); //rominfo
u16 msg = 0;
sleep(300);
sleep(10);
evd_ulockRegs();
sleep(300);
sleep(10);
sprintf(rom_filename, "%s", list[cursor].filename);
romInfoScreen(disp, name_file, 0);
if (sound_on)
playSound(2);
sleep(500);
input_mapping = abort_screen;
}
else if (!strcmp(extension, "MPK"))
@ -3974,7 +4017,6 @@ void handleInput(display_context_t disp, sprite_t *contr)
if (sound_on)
playSound(2);
sleep(500);
input_mapping = abort_screen;
}
} //mapping and not dir
@ -4102,7 +4144,7 @@ void handleInput(display_context_t disp, sprite_t *contr)
else
sprintf(name_file, "%s/%s", pwd, list[cursor].filename);
u8 rom_cfg_file[128];
TCHAR rom_cfg_file[128];
u8 resp = 0;
@ -4356,7 +4398,7 @@ int main(void)
configure();
//fast boot for backup-save data
//int sj = evd_readReg(REG_CFG); // not sure if this is needed!
int sj = evd_readReg(REG_CFG); // not sure if this is needed!
int save_job = evd_readReg(REG_SAV_CFG); //TODO: or the firmware is V3
if (save_job != 0)
@ -4367,7 +4409,6 @@ int main(void)
//filesystem on
initFilesystem();
sleep(200);
readConfigFile();
//n64 initialization