aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c58
1 files changed, 39 insertions, 19 deletions
diff --git a/src/main.c b/src/main.c
index 296373f..c3a1115 100644
--- a/src/main.c
+++ b/src/main.c
@@ -20,6 +20,7 @@ WITH REGARD TO THIS SOFTWARE.
20#include "uxn.c" 20#include "uxn.c"
21#include "ppu.c" 21#include "ppu.c"
22#include "apu.c" 22#include "apu.c"
23#include "file.c"
23#include "text.h" 24#include "text.h"
24 25
25// 26//
@@ -220,27 +221,46 @@ datetime_talk(Device *d, u8 b0, u8 w) {
220 221
221void 222void
222file_talk(Device *d, u8 b0, u8 w) { 223file_talk(Device *d, u8 b0, u8 w) {
223 u8 read = b0 == 0xd; 224 if (w) {
224 if(w && (read || b0 == 0xf)) { 225 u16 a, b, res;
225 char *name = (char *)&d->mem[mempeek16(d->dat, 0x8)]; 226 switch(b0) {
226 u16 result = 0, length = mempeek16(d->dat, 0xa); 227 case 0x5: {
227 u16 offset = mempeek16(d->dat, 0x4); 228 DEVPEEK16(a, 0x4);
228 u16 addr = mempeek16(d->dat, b0 - 1); 229 DEVPEEK16(b, 0xa);
229 OpenMode mode = FS_OPEN_READ; 230 if(b > 0x10000 - a) {
230 if (!read) { 231 b = 0x10000 - a;
231 mode = offset ? FS_OPEN_APPEND : FS_OPEN_WRITE;
232 }
233 File file = fs_open_file(name, mode);
234 if (file.index != FS_NULL) {
235 if(fs_seek(&file, offset, SEEK_SET) != -1) {
236 if (read) {
237 result = fs_read(&d->mem[addr], length, &file);
238 } else {
239 result = fs_write(&d->mem[addr], length, &file);
240 } 232 }
241 } 233 res = file_stat(&d->mem[a], b);
234 DEVPOKE16(0x2, res);
235 } break;
236 case 0x6: {
237 // res = file_delete();
238 // DEVPOKE16(0x2, res);
239 } break;
240 case 0x9: {
241 DEVPEEK16(a, 0x8);
242 res = file_init(&d->mem[a]);
243 DEVPOKE16(0x2, res);
244 } break;
245 case 0xd: {
246 DEVPEEK16(a, 0xc);
247 DEVPEEK16(b, 0xa);
248 if(b > 0x10000 - a) {
249 b = 0x10000 - a;
250 }
251 res = file_read(&d->mem[a], b);
252 DEVPOKE16(0x2, res);
253 } break;
254 case 0xf: {
255 DEVPEEK16(a, 0xe);
256 DEVPEEK16(b, 0xa);
257 if(b > 0x10000 - a) {
258 b = 0x10000 - a;
259 }
260 res = file_write(&d->mem[a], b, d->dat[0x7]);
261 DEVPOKE16(0x2, res);
262 } break;
242 } 263 }
243 mempoke16(d->dat, 0x2, result);
244 } 264 }
245} 265}
246 266