94 lines
2.7 KiB
C
Raw Normal View History

2016-04-04 22:45:49 +02:00
#include "image.h"
2016-05-02 11:22:49 +02:00
#include "platform.h"
#include "ff.h"
2016-04-04 22:45:49 +02:00
2016-05-02 11:22:49 +02:00
static u8* ramdrv_buffer = NULL;
static u32 ramdrv_size = 0;
static FIL mount_file;
static u32 mount_state = 0;
2016-04-04 22:45:49 +02:00
2016-11-26 14:25:10 +01:00
int ReadImageBytes(u8* buffer, u32 offset, u32 count) {
2016-04-04 22:45:49 +02:00
UINT bytes_read;
UINT ret;
if (!count) return -1;
2016-05-01 15:41:11 +02:00
if (mount_state == IMG_RAMDRV) {
2016-11-26 14:25:10 +01:00
if ((offset + count) > ramdrv_size) return -1;
memcpy(buffer, ramdrv_buffer + (offset), count);
2016-05-01 15:41:11 +02:00
return 0;
}
2016-04-04 22:45:49 +02:00
if (!mount_state) return FR_INVALID_OBJECT;
2016-11-26 14:25:10 +01:00
if (f_tell(&mount_file) != offset) {
if (f_size(&mount_file) < offset) return -1;
f_lseek(&mount_file, offset);
}
2016-11-26 14:25:10 +01:00
ret = f_read(&mount_file, buffer, count, &bytes_read);
return (ret != 0) ? (int) ret : (bytes_read != count) ? -1 : 0;
2016-04-04 22:45:49 +02:00
}
2016-11-26 14:25:10 +01:00
int WriteImageBytes(const u8* buffer, u32 offset, u32 count) {
2016-04-04 22:45:49 +02:00
UINT bytes_written;
UINT ret;
if (!count) return -1;
2016-05-01 15:41:11 +02:00
if (mount_state == IMG_RAMDRV) {
2016-11-26 14:25:10 +01:00
if ((offset + count) > ramdrv_size) return -1;
memcpy(ramdrv_buffer + (offset), buffer, count);
2016-05-01 15:41:11 +02:00
return 0;
}
2016-04-04 22:45:49 +02:00
if (!mount_state) return FR_INVALID_OBJECT;
2016-11-26 14:25:10 +01:00
if (f_tell(&mount_file) != offset)
f_lseek(&mount_file, offset);
ret = f_write(&mount_file, buffer, count, &bytes_written);
return (ret != 0) ? (int) ret : (bytes_written != count) ? -1 : 0;
}
int ReadImageSectors(u8* buffer, u32 sector, u32 count) {
return ReadImageBytes(buffer, sector * 0x200, count * 0x200);
}
int WriteImageSectors(const u8* buffer, u32 sector, u32 count) {
return WriteImageBytes(buffer, sector * 0x200, count * 0x200);
2016-04-04 22:45:49 +02:00
}
int SyncImage(void) {
2016-05-01 15:41:11 +02:00
return (mount_state == IMG_RAMDRV) ? FR_OK :
mount_state ? f_sync(&mount_file) : FR_INVALID_OBJECT;
2016-04-04 22:45:49 +02:00
}
u64 GetMountSize(void) {
2016-05-02 11:22:49 +02:00
return (mount_state == IMG_RAMDRV) ? ramdrv_size :
2016-05-01 15:41:11 +02:00
mount_state ? f_size(&mount_file) : 0;
2016-04-04 22:45:49 +02:00
}
u32 GetMountState(void) {
return mount_state;
}
2016-05-01 15:41:11 +02:00
u32 MountRamDrive(void) {
if (mount_state && (mount_state != IMG_RAMDRV))
2016-05-02 11:22:49 +02:00
f_close(&mount_file);
if (GetUnitPlatform() == PLATFORM_3DS) {
ramdrv_buffer = RAMDRV_BUFFER_O3DS;
ramdrv_size = RAMDRV_SIZE_O3DS;
} else {
ramdrv_buffer = RAMDRV_BUFFER_N3DS;
ramdrv_size = RAMDRV_SIZE_N3DS;
}
2016-05-01 15:41:11 +02:00
return (mount_state = IMG_RAMDRV);
}
2016-04-04 22:45:49 +02:00
u32 MountImage(const char* path) {
2016-11-25 13:34:01 +01:00
u32 type = IdentifyFileType(path);
2016-04-04 22:45:49 +02:00
if (mount_state) {
2016-05-01 15:41:11 +02:00
if (mount_state != IMG_RAMDRV) f_close(&mount_file);
mount_state = 0;
2016-04-04 22:45:49 +02:00
}
2016-11-25 13:34:01 +01:00
if (!path || !type) return 0;
2016-04-04 22:45:49 +02:00
if (f_open(&mount_file, path, FA_READ | FA_WRITE | FA_OPEN_EXISTING) != FR_OK)
return 0;
2016-04-04 22:45:49 +02:00
f_lseek(&mount_file, 0);
f_sync(&mount_file);
2016-11-25 13:34:01 +01:00
return (mount_state = type);
2016-04-04 22:45:49 +02:00
}