diff options
author | Bad Diode <bd@badd10de.dev> | 2021-05-21 19:30:08 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-05-21 19:30:08 +0200 |
commit | 3924524adf85914bbdb77f002d5443597ef154d8 (patch) | |
tree | 163a045016a19eebb71c20d661e953f8e9441ef2 /src/filesystem.c | |
parent | 0cfa96f83d6c44b318cc0da0ec98e8e3bc97f7f9 (diff) | |
download | uxngba-3924524adf85914bbdb77f002d5443597ef154d8.tar.gz uxngba-3924524adf85914bbdb77f002d5443597ef154d8.zip |
Fix filesystem read issues, load/save rom demo is working
Diffstat (limited to 'src/filesystem.c')
-rw-r--r-- | src/filesystem.c | 33 |
1 files changed, 27 insertions, 6 deletions
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() { | |||
47 | if (filesystem.num_files == 0xFFFF | 47 | if (filesystem.num_files == 0xFFFF |
48 | && filesystem.data_capacity == 0xFFFF | 48 | && filesystem.data_capacity == 0xFFFF |
49 | && filesystem.data_size == 0xFFFF) { | 49 | && filesystem.data_size == 0xFFFF) { |
50 | // Clear SRAM. | ||
51 | for (size_t i = 0; i < KB(64); ++i) { | ||
52 | SRAM[i] = 0; | ||
53 | } | ||
54 | |||
55 | // Initialize filesystem. | ||
50 | filesystem.num_files = 0; | 56 | filesystem.num_files = 0; |
51 | filesystem.data_size = 0; | 57 | filesystem.data_size = 0; |
52 | filesystem.data_capacity = 27 * FILE_MAX_SIZE; | 58 | filesystem.data_capacity = 27 * FILE_MAX_SIZE; |
@@ -57,8 +63,13 @@ fs_init() { | |||
57 | } | 63 | } |
58 | } | 64 | } |
59 | 65 | ||
66 | typedef enum { | ||
67 | OPEN_READ, | ||
68 | OPEN_WRITE, | ||
69 | } OpenMode; | ||
70 | |||
60 | int | 71 | int |
61 | fs_open_file(char *name) { | 72 | fs_open_file(char *name, OpenMode mode) { |
62 | // Try to find an existing file. | 73 | // Try to find an existing file. |
63 | for (size_t i = 0; i < filesystem.num_files; ++i) { | 74 | for (size_t i = 0; i < filesystem.num_files; ++i) { |
64 | // TODO: Replace strcmp with vectorized fixed size char comparison. | 75 | // TODO: Replace strcmp with vectorized fixed size char comparison. |
@@ -66,6 +77,11 @@ fs_open_file(char *name) { | |||
66 | return i; | 77 | return i; |
67 | } | 78 | } |
68 | } | 79 | } |
80 | |||
81 | if (mode == OPEN_READ) { | ||
82 | return -1; | ||
83 | } | ||
84 | |||
69 | // Create a new file if there is space. | 85 | // Create a new file if there is space. |
70 | if (filesystem.num_files < FILE_CAPACITY) { | 86 | if (filesystem.num_files < FILE_CAPACITY) { |
71 | size_t index = filesystem.num_files++; | 87 | size_t index = filesystem.num_files++; |
@@ -89,13 +105,13 @@ fs_open_file(char *name) { | |||
89 | return -1; | 105 | return -1; |
90 | } | 106 | } |
91 | 107 | ||
92 | int | 108 | size_t |
93 | fs_write(u8 *src, size_t n_bytes, u16 file_index, u16 offset, bool append) { | 109 | fs_write(u8 *src, size_t n_bytes, u16 file_index, u16 offset, bool append) { |
94 | File *file = &filesystem.files[file_index]; | 110 | File *file = &filesystem.files[file_index]; |
95 | 111 | ||
96 | // Check if there is enough capacity for this write operation. | 112 | // Check if there is enough capacity for this write operation. |
97 | if (offset + n_bytes >= FILE_MAX_SIZE) { | 113 | if (offset + n_bytes >= FILE_MAX_SIZE) { |
98 | return -1; | 114 | return 0; |
99 | } | 115 | } |
100 | 116 | ||
101 | // Write data to file block. | 117 | // Write data to file block. |
@@ -117,13 +133,18 @@ fs_write(u8 *src, size_t n_bytes, u16 file_index, u16 offset, bool append) { | |||
117 | return n_bytes; | 133 | return n_bytes; |
118 | } | 134 | } |
119 | 135 | ||
120 | int | 136 | size_t |
121 | fs_read(u8 *dst, size_t n_bytes, u16 file_index, u16 offset) { | 137 | fs_read(u8 *dst, size_t n_bytes, u16 file_index, u16 offset) { |
122 | File *file = &filesystem.files[file_index]; | 138 | File *file = &filesystem.files[file_index]; |
123 | 139 | ||
124 | // Check if the offset is within limits. | 140 | // Check if the offset is within limits. |
125 | if (offset + n_bytes >= FILE_MAX_SIZE) { | 141 | if (file->size == 0 || offset >= file->size - 1) { |
126 | return -1; | 142 | return 0; |
143 | } | ||
144 | |||
145 | // Read as much as we can. | ||
146 | if (offset + n_bytes > file->size) { | ||
147 | n_bytes = file->size - offset; | ||
127 | } | 148 | } |
128 | 149 | ||
129 | // Copy n_bytes to destination. | 150 | // Copy n_bytes to destination. |