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 +++++++++++++++++++++++++++------ src/main.c | 5 +---- 2 files changed, 28 insertions(+), 10 deletions(-) (limited to 'src') 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. diff --git a/src/main.c b/src/main.c index a65b1fe..a414558 100644 --- a/src/main.c +++ b/src/main.c @@ -104,19 +104,16 @@ datetime_talk(Device *d, Uint8 b0, Uint8 w) { void file_talk(Device *d, Uint8 b0, Uint8 w) { Uint8 read = b0 == 0xd; - txt_printf("FILE TALK\n"); // DEBUG: Remove when done if(w && (read || b0 == 0xf)) { char *name = (char *)&d->mem[mempeek16(d->dat, 0x8)]; Uint16 result = 0, length = mempeek16(d->dat, 0xa); Uint16 offset = mempeek16(d->dat, 0x4); Uint16 addr = mempeek16(d->dat, b0 - 1); - int file_idx = fs_open_file(name); + int file_idx = fs_open_file(name, read ? OPEN_READ : OPEN_WRITE); if (file_idx >= 0) { if (read) { - txt_printf("READING\n"); // DEBUG: Remove when done result = fs_read(&d->mem[addr], length, file_idx, offset); } else { - txt_printf("WRITING\n"); // DEBUG: Remove when done result = fs_write(&d->mem[addr], length, file_idx, offset, offset > 0); } } -- cgit v1.2.1