From 1e87357d524cffa0fe5d9dc2bb22de1da4719f1e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 12 Apr 2023 10:17:48 +0200 Subject: Override file_deo to avoid segfault --- src/main.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/src/main.c b/src/main.c index c47e68b..47edfc1 100644 --- a/src/main.c +++ b/src/main.c @@ -535,7 +535,6 @@ load_uxn_rom(char *file_name) { u8 uxn_dei(Uxn *u, u8 addr) { u8 p = addr & 0x0f, d = addr & 0xf0; - // printf("DEI: %x\n", d); switch(d) { case 0x20: return screen_dei(&u->dev[d], p); case 0xc0: return datetime_dei(u, p); @@ -543,6 +542,47 @@ uxn_dei(Uxn *u, u8 addr) { return u->dev[addr]; } +void +file_deo_2(Uint8 id, Uint8 *ram, Uint8 *d, Uint8 port) { + UxnFile *c = &uxn_file[id]; + Uint16 addr, len, res; + switch(port) { + case 0x5: + addr = PEEK2(d + 0x4); + len = PEEK2(d + 0xa); + if(len > 0x10000 - addr) + len = 0x10000 - addr; + res = file_stat(c, &ram[addr], len); + POKE2(d + 0x2, res); + break; + case 0x6: + res = file_delete(c); + POKE2(d + 0x2, res); + break; + case 0x9: + addr = PEEK2(d + 0x8); + res = file_init(c, (char *)&ram[addr], 0x10000 - addr, 1); + POKE2(d + 0x2, res); + break; + case 0xd: + addr = PEEK2(d + 0xc); + len = PEEK2(d + 0xa); + if(len > 0x10000 - addr) + len = 0x10000 - addr; + res = file_read(c, &ram[addr], len); + POKE2(d + 0x2, res); + break; + case 0xf: + addr = PEEK2(d + 0xe); + len = PEEK2(d + 0xa); + if(len > 0x10000 - addr) + len = 0x10000 - addr; + res = file_write(c, &ram[addr], len, d[0x7]); + POKE2(d + 0x2, res); + break; + } +} + void uxn_deo(Uxn *u, u8 addr) { u8 p = addr & 0x0f, d = addr & 0xf0; @@ -555,9 +595,8 @@ uxn_deo(Uxn *u, u8 addr) { break; case 0x10: console_deo(&u->dev[d], p); break; case 0x20: screen_deo(u->ram, &u->dev[d], p); break; - // TODO: crash on file? - // case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break; - // case 0xb0: file_deo(1, u->ram, &u->dev[d], p); break; + case 0xa0: file_deo_2(0, u->ram, &u->dev[d], p); break; + case 0xb0: file_deo_2(1, u->ram, &u->dev[d], p); break; } } -- cgit v1.2.1