From 3924524adf85914bbdb77f002d5443597ef154d8 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 21 May 2021 19:30:08 +0200 Subject: Fix filesystem read issues, load/save rom demo is working --- src/filesystem.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'src/filesystem.c') diff --git a/src/filesystem.c b/src/filesystem.c index 1521d69..69e23f7 100644 --- a/src/filesystem.c +++ b/src/filesystem.c @@ -47,6 +47,12 @@ fs_init() { if (filesystem.num_files == 0xFFFF && filesystem.data_capacity == 0xFFFF && filesystem.data_size == 0xFFFF) { + // Clear SRAM. + for (size_t i = 0; i < KB(64); ++i) { + SRAM[i] = 0; + } + + // Initialize filesystem. filesystem.num_files = 0; filesystem.data_size = 0; filesystem.data_capacity = 27 * FILE_MAX_SIZE; @@ -57,8 +63,13 @@ fs_init() { } } +typedef enum { + OPEN_READ, + OPEN_WRITE, +} OpenMode; + int -fs_open_file(char *name) { +fs_open_file(char *name, OpenMode mode) { // Try to find an existing file. for (size_t i = 0; i < filesystem.num_files; ++i) { // TODO: Replace strcmp with vectorized fixed size char comparison. @@ -66,6 +77,11 @@ fs_open_file(char *name) { return i; } } + + if (mode == OPEN_READ) { + return -1; + } + // Create a new file if there is space. if (filesystem.num_files < FILE_CAPACITY) { size_t index = filesystem.num_files++; @@ -89,13 +105,13 @@ fs_open_file(char *name) { return -1; } -int +size_t fs_write(u8 *src, size_t n_bytes, u16 file_index, u16 offset, bool append) { File *file = &filesystem.files[file_index]; // Check if there is enough capacity for this write operation. if (offset + n_bytes >= FILE_MAX_SIZE) { - return -1; + return 0; } // Write data to file block. @@ -117,13 +133,18 @@ fs_write(u8 *src, size_t n_bytes, u16 file_index, u16 offset, bool append) { return n_bytes; } -int +size_t fs_read(u8 *dst, size_t n_bytes, u16 file_index, u16 offset) { File *file = &filesystem.files[file_index]; // Check if the offset is within limits. - if (offset + n_bytes >= FILE_MAX_SIZE) { - return -1; + if (file->size == 0 || offset >= file->size - 1) { + return 0; + } + + // Read as much as we can. + if (offset + n_bytes > file->size) { + n_bytes = file->size - offset; } // Copy n_bytes to destination. -- cgit v1.2.1