From e7cd6e1598c8fa0b11b4ddc23b9037be7749e920 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 16 May 2022 19:01:52 +0200 Subject: Update file device to support multiple file devs --- src/file.c | 69 ++++++++++++++++++++++++++++++++------------------------------ src/main.c | 10 +++++---- 2 files changed, 42 insertions(+), 37 deletions(-) diff --git a/src/file.c b/src/file.c index a45d59f..6dba2f9 100644 --- a/src/file.c +++ b/src/file.c @@ -13,65 +13,68 @@ WITH REGARD TO THIS SOFTWARE. #include "posprintf.h" -static File f = {0}; -static char *current_filename = ""; +typedef struct { + File f; + char *filename; + enum { + IDLE, + FILE_READ, + FILE_WRITE, + } state; +} UxnFile; -static enum { - IDLE, - FILE_READ, - FILE_WRITE, -} file_state; +static UxnFile uxn_file[2]; void -file_reset(void) { - f = (File){0}; - file_state = IDLE; +file_reset(UxnFile *f) { + f->f = (File){0}; + f->state = IDLE; } u16 -file_init(void *filename) { - file_reset(); - current_filename = filename; +file_init(UxnFile *f, void *filename) { + file_reset(f); + f->filename = filename; return 0; } u16 -file_read(void *dest, u16 len) { - if(file_state != FILE_READ) { - file_reset(); - f = fs_open_file(current_filename, FS_OPEN_READ); - file_state = FILE_READ; +file_read(UxnFile *f, void *dest, u16 len) { + if(f->state != FILE_READ) { + file_reset(f); + f->f = fs_open_file(f->filename, FS_OPEN_READ); + f->state = FILE_READ; } - if (f.index == FS_NULL) { + if (f->f.index == FS_NULL) { return 0; } - return fs_read(dest, len, &f); + return fs_read(dest, len, &f->f); } u16 -file_write(void *src, u16 len, u8 flags) { - if(file_state != FILE_WRITE) { - file_reset(); +file_write(UxnFile *f, void *src, u16 len, u8 flags) { + if(f->state != FILE_WRITE) { + file_reset(f); OpenMode mode = (flags & 0x01) ? FS_OPEN_APPEND : FS_OPEN_WRITE; - f = fs_open_file(current_filename, mode); - file_state = FILE_WRITE; + f->f = fs_open_file(f->filename, mode); + f->state = FILE_WRITE; } - if (f.index == FS_NULL) { + if (f->f.index == FS_NULL) { return 0; } - return fs_write(src, len, &f); + return fs_write(src, len, &f->f); } u16 -file_stat(void *dest, u16 len) { - if(len < strlen(current_filename) + 7) { +file_stat(UxnFile *f, void *dest, u16 len) { + if(len < strlen(f->filename) + 7) { return 0; } - if (f.index == FS_NULL) { - posprintf(dest, "!!!! %s\n", current_filename); + if (f->f.index == FS_NULL) { + posprintf(dest, "!!!! %s\n", f->filename); } else { - u16 file_size = fs_file_size(&f); - posprintf(dest, "%04x %s\n", (unsigned int)file_size, current_filename); + u16 file_size = fs_file_size(&f->f); + posprintf(dest, "%04x %s\n", (unsigned int)file_size, f->filename); } return 0; } diff --git a/src/main.c b/src/main.c index 1acae1b..21bc2a7 100644 --- a/src/main.c +++ b/src/main.c @@ -223,6 +223,7 @@ void file_talk(Device *d, u8 b0, u8 w) { if (w) { u16 a, b, res; + UxnFile *f = &uxn_file[d - &d->u->dev[0xa]]; switch(b0) { case 0x5: { DEVPEEK16(a, 0x4); @@ -230,16 +231,17 @@ file_talk(Device *d, u8 b0, u8 w) { if(b > 0x10000 - a) { b = 0x10000 - a; } - res = file_stat(&d->mem[a], b); + res = file_stat(f, &d->mem[a], b); DEVPOKE16(0x2, res); } break; case 0x6: { + // TODO: no file deletion for now // res = file_delete(); // DEVPOKE16(0x2, res); } break; case 0x9: { DEVPEEK16(a, 0x8); - res = file_init(&d->mem[a]); + res = file_init(f, &d->mem[a]); DEVPOKE16(0x2, res); } break; case 0xd: { @@ -248,7 +250,7 @@ file_talk(Device *d, u8 b0, u8 w) { if(b > 0x10000 - a) { b = 0x10000 - a; } - res = file_read(&d->mem[a], b); + res = file_read(f, &d->mem[a], b); DEVPOKE16(0x2, res); } break; case 0xf: { @@ -257,7 +259,7 @@ file_talk(Device *d, u8 b0, u8 w) { if(b > 0x10000 - a) { b = 0x10000 - a; } - res = file_write(&d->mem[a], b, d->dat[0x7]); + res = file_write(f, &d->mem[a], b, d->dat[0x7]); DEVPOKE16(0x2, res); } break; } -- cgit v1.2.1