Skip to content

Commit c94f38a

Browse files
committed
Everdrive saves fix
1 parent 35b2c05 commit c94f38a

File tree

1 file changed

+24
-29
lines changed

1 file changed

+24
-29
lines changed

FdsKey/Core/Src/fdsemu.c

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,6 @@ static void fds_stop_writing();
4141
static void fds_reset_reading();
4242
static void fds_stop();
4343

44-
/*
45-
// debug dumping
46-
void fds_dump(char *filename)
47-
{
48-
FIL fp;
49-
unsigned int l;
50-
51-
f_open(&fp, filename, FA_CREATE_ALWAYS | FA_WRITE);
52-
f_write(&fp, (uint8_t*) fds_raw_data, FDS_MAX_SIDE_SIZE, &l);
53-
f_close(&fp);
54-
}
55-
*/
56-
5744
// calculate block CRC
5845
// source: https://forums.nesdev.org/viewtopic.php?p=194867#p194867
5946
static uint16_t fds_crc(uint8_t *data, unsigned size)
@@ -530,8 +517,7 @@ FRESULT fds_load_side(char *filename, uint8_t side, uint8_t ro)
530517
// start ready state waiting before file loaded
531518
fds_not_ready_time = HAL_GetTick();
532519

533-
strncpy(fds_filename, filename, sizeof(fds_filename) - 1);
534-
filename[sizeof(fds_filename) - 1] = 0;
520+
strlcpy(fds_filename, filename, sizeof(fds_filename));
535521
fds_side = side;
536522

537523
if (fdskey_settings.backup_original != SAVES_EVERDRIVE)
@@ -540,7 +526,6 @@ FRESULT fds_load_side(char *filename, uint8_t side, uint8_t ro)
540526
} else {
541527
// everdrive-style saves
542528
char alt_filename[_MAX_LFN + 1];
543-
alt_filename[sizeof(alt_filename) - 1] = 0;
544529
FILINFO fno;
545530
char* filename_no_path = fds_filename + strlen(fds_filename);
546531
while (filename_no_path >= fds_filename)
@@ -553,9 +538,9 @@ FRESULT fds_load_side(char *filename, uint8_t side, uint8_t ro)
553538
if (filename_no_path > fds_filename)
554539
filename_no_path--;
555540
}
556-
strncpy(alt_filename, "EDN8\\gamedata\\", _MAX_LFN);
557-
strncat(alt_filename, filename_no_path, _MAX_LFN);
558-
strncat(alt_filename, "\\bram.srm", _MAX_LFN);
541+
strlcpy(alt_filename, "EDN8\\gamedata\\", sizeof(alt_filename));
542+
strlcat(alt_filename, filename_no_path, sizeof(alt_filename));
543+
strlcat(alt_filename, "\\bram.srm", sizeof(alt_filename));
559544
fr = f_stat(alt_filename, &fno);
560545
if (fr == FR_OK)
561546
fr = f_open(&fp, alt_filename, FA_READ);
@@ -745,15 +730,14 @@ FRESULT fds_save()
745730
}
746731

747732
char alt_filename[_MAX_LFN + 1];
748-
alt_filename[sizeof(alt_filename) - 1] = 0;
749733
if (fdskey_settings.backup_original == SAVES_REWRITE_BACKUP || fdskey_settings.backup_original == SAVES_EVERDRIVE)
750734
{
751735
// combine backup filename
752736
if (fdskey_settings.backup_original == SAVES_REWRITE_BACKUP)
753737
{
754-
// just add ".bad" to filename
755-
strncpy(alt_filename, fds_filename, _MAX_LFN);
756-
strncat(alt_filename, ".bak", _MAX_LFN);
738+
// just add ".bak" to filename
739+
strlcpy(alt_filename, fds_filename, sizeof(alt_filename));
740+
strlcat(alt_filename, ".bak", sizeof(alt_filename));
757741
} else {
758742
// get filename without path
759743
char* filename_no_path = fds_filename + strlen(fds_filename);
@@ -781,16 +765,16 @@ FRESULT fds_save()
781765
return fr;
782766
}
783767
// this directory name contains filename
784-
strncpy(alt_filename, "EDN8\\gamedata\\", _MAX_LFN);
785-
strncat(alt_filename, filename_no_path, _MAX_LFN);
768+
strlcpy(alt_filename, "EDN8\\gamedata\\", sizeof(alt_filename));
769+
strlcat(alt_filename, filename_no_path, sizeof(alt_filename));
786770
fr = f_mkdir(alt_filename);
787771
if (fr != FR_OK && fr != FR_EXIST)
788772
{
789773
fds_state = FDS_IDLE;
790774
return fr;
791775
}
792776
// add save filename
793-
strncat(alt_filename, "\\bram.srm", _MAX_LFN);
777+
strlcat(alt_filename, "\\bram.srm", sizeof(alt_filename));
794778
}
795779
// check if exists
796780
fr = f_stat(alt_filename, &fno);
@@ -810,17 +794,28 @@ FRESULT fds_save()
810794
fds_state = FDS_IDLE;
811795
return fr;
812796
}
813-
if ((fno.fsize % FDS_ROM_SIDE_SIZE == FDS_ROM_HEADER_SIZE) && (fdskey_settings.backup_original == SAVES_EVERDRIVE))
797+
if (fdskey_settings.backup_original == SAVES_EVERDRIVE)
814798
{
815-
// skip header if any for everdrive save
816-
fr = f_lseek(&fp, FDS_ROM_HEADER_SIZE);
799+
fr = f_stat(fds_filename, &fno);
817800
if (fr != FR_OK)
818801
{
819802
f_close(&fp);
820803
f_close(&fp_backup);
821804
fds_state = FDS_IDLE;
822805
return fr;
823806
}
807+
if (fno.fsize % FDS_ROM_SIDE_SIZE == FDS_ROM_HEADER_SIZE)
808+
{
809+
// skip header if any for everdrive save
810+
fr = f_lseek(&fp, FDS_ROM_HEADER_SIZE);
811+
if (fr != FR_OK)
812+
{
813+
f_close(&fp);
814+
f_close(&fp_backup);
815+
fds_state = FDS_IDLE;
816+
return fr;
817+
}
818+
}
824819
}
825820
// copy file
826821
do

0 commit comments

Comments
 (0)