commit 45a9c87

Devine Lu Linvega  ·  2025-01-22 03:58:18 +0000 UTC
parent 74b387b
(file.c) Cache length in register
3 files changed,  +24, -25
+24, -20
  1@@ -57,19 +57,15 @@ typedef struct {
  2 	int outside_sandbox;
  3 } UxnFile;
  4 
  5-static UxnFile uxn_file[POLYFILEY];
  6+static UxnFile uxn_file[2];
  7 
  8 static void
  9-reset(UxnFile *c)
 10+file_reset(UxnFile *c)
 11 {
 12-	if(c->f != NULL) {
 13-		fclose(c->f);
 14-		c->f = NULL;
 15-	}
 16-	if(c->dir != NULL) {
 17-		closedir(c->dir);
 18-		c->dir = NULL;
 19-	}
 20+	if(c->f != NULL)
 21+		fclose(c->f), c->f = NULL;
 22+	if(c->dir != NULL)
 23+		closedir(c->dir), c->dir = NULL;
 24 	c->de = NULL;
 25 	c->state = IDLE;
 26 	c->outside_sandbox = 0;
 27@@ -180,7 +176,7 @@ file_init(UxnFile *c, char *filename, size_t max_len, int override_sandbox)
 28 {
 29 	char *p = c->current_filename;
 30 	size_t len = sizeof(c->current_filename);
 31-	reset(c);
 32+	file_reset(c);
 33 	if(len > max_len) len = max_len;
 34 	while(len) {
 35 		if((*p++ = *filename++) == '\0') {
 36@@ -199,7 +195,7 @@ file_read(UxnFile *c, void *dest, int len)
 37 {
 38 	if(c->outside_sandbox) return 0;
 39 	if(c->state != FILE_READ && c->state != DIR_READ) {
 40-		reset(c);
 41+		file_reset(c);
 42 		if((c->dir = opendir(c->current_filename)) != NULL)
 43 			c->state = DIR_READ;
 44 		else if((c->f = fopen(c->current_filename, "rb")) != NULL)
 45@@ -251,7 +247,7 @@ file_write(UxnFile *c, void *src, Uint16 len, Uint8 flags)
 46 	if(c->outside_sandbox) return 0;
 47 	ensure_parent_dirs(c->current_filename);
 48 	if(c->state != FILE_WRITE && c->state != DIR_WRITE) {
 49-		reset(c);
 50+		file_reset(c);
 51 		if(is_dir_path(c->current_filename))
 52 			c->state = DIR_WRITE;
 53 		else if((c->f = fopen(c->current_filename, (flags & 0x01) ? "ab" : "wb")) != NULL)
 54@@ -308,7 +304,9 @@ file_delete(UxnFile *c)
 55 	return c->outside_sandbox ? 0 : unlink(c->current_filename);
 56 }
 57 
 58-/* IO */
 59+/* file registers */
 60+
 61+static int rL1, rL2;
 62 
 63 void
 64 file_deo(Uint8 port)
 65@@ -317,7 +315,7 @@ file_deo(Uint8 port)
 66 	switch(port) {
 67 	case 0xa5:
 68 		addr = PEEK2(&uxn.dev[0xa4]);
 69-		len = PEEK2(&uxn.dev[0xaa]);
 70+		len = rL1;
 71 		if(len > 0x10000 - addr)
 72 			len = 0x10000 - addr;
 73 		res = file_stat(&uxn_file[0], &uxn.ram[addr], len);
 74@@ -332,9 +330,12 @@ file_deo(Uint8 port)
 75 		res = file_init(&uxn_file[0], (char *)&uxn.ram[addr], 0x10000 - addr, 0);
 76 		POKE2(&uxn.dev[0xa2], res);
 77 		break;
 78+	case 0xab:
 79+		rL1 = PEEK2(&uxn.dev[0xaa]);
 80+		break;
 81 	case 0xad:
 82 		addr = PEEK2(&uxn.dev[0xac]);
 83-		len = PEEK2(&uxn.dev[0xaa]);
 84+		len = rL1;
 85 		if(len > 0x10000 - addr)
 86 			len = 0x10000 - addr;
 87 		res = file_read(&uxn_file[0], &uxn.ram[addr], len);
 88@@ -342,7 +343,7 @@ file_deo(Uint8 port)
 89 		break;
 90 	case 0xaf:
 91 		addr = PEEK2(&uxn.dev[0xae]);
 92-		len = PEEK2(&uxn.dev[0xaa]);
 93+		len = rL1;
 94 		if(len > 0x10000 - addr)
 95 			len = 0x10000 - addr;
 96 		res = file_write(&uxn_file[0], &uxn.ram[addr], len, uxn.dev[0xa7]);
 97@@ -351,7 +352,7 @@ file_deo(Uint8 port)
 98 	/* File 2 */
 99 	case 0xb5:
100 		addr = PEEK2(&uxn.dev[0xb4]);
101-		len = PEEK2(&uxn.dev[0xba]);
102+		len = rL2;
103 		if(len > 0x10000 - addr)
104 			len = 0x10000 - addr;
105 		res = file_stat(&uxn_file[1], &uxn.ram[addr], len);
106@@ -366,9 +367,12 @@ file_deo(Uint8 port)
107 		res = file_init(&uxn_file[1], (char *)&uxn.ram[addr], 0x10000 - addr, 0);
108 		POKE2(&uxn.dev[0xb2], res);
109 		break;
110+	case 0xbb:
111+		rL2 = PEEK2(&uxn.dev[0xba]);
112+		break;
113 	case 0xbd:
114 		addr = PEEK2(&uxn.dev[0xbc]);
115-		len = PEEK2(&uxn.dev[0xba]);
116+		len = rL2;
117 		if(len > 0x10000 - addr)
118 			len = 0x10000 - addr;
119 		res = file_read(&uxn_file[1], &uxn.ram[addr], len);
120@@ -376,7 +380,7 @@ file_deo(Uint8 port)
121 		break;
122 	case 0xbf:
123 		addr = PEEK2(&uxn.dev[0xbe]);
124-		len = PEEK2(&uxn.dev[0xba]);
125+		len = rL2;
126 		if(len > 0x10000 - addr)
127 			len = 0x10000 - addr;
128 		res = file_write(&uxn_file[1], &uxn.ram[addr], len, uxn.dev[0xb7]);
+0, -3
1@@ -9,7 +9,4 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
2 WITH REGARD TO THIS SOFTWARE.
3 */
4 
5-#define POLYFILEY 2
6-#define DEV_FILE0 0xa
7-
8 void file_deo(Uint8 port);
+0, -2
1@@ -1,8 +1,6 @@
2 #include <stdio.h>
3-#include <stdlib.h>
4 
5 #include "../uxn.h"
6-
7 #include "system.h"
8 
9 /*