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 /*