orbspace
@@ -24,7 +24,8 @@ | ||
24 | 24 | "Syntax error", |
25 | 25 | "Image file error", |
26 | 26 | "IPL file error", |
27 | - "File error" | |
27 | + "File error", | |
28 | + "Ball error" | |
28 | 29 | }; |
29 | 30 | |
30 | 31 | void print_error(int no) |
@@ -38,10 +39,37 @@ | ||
38 | 39 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
39 | 40 | }; |
40 | 41 | |
42 | +unsigned char *getcmd(unsigned char *arg) | |
43 | +{ | |
44 | + if (strncmp(arg, "+File", 4) == 0) { | |
45 | + return "Type=File"; | |
46 | + } else if (strncmp(arg, "+Func", 4) == 0) { | |
47 | + return "Type=Func"; | |
48 | + } else if (strncmp(arg, "+Ball", 4) == 0) { | |
49 | + return "Type=Ball"; | |
50 | + } | |
51 | + return 0; | |
52 | +} | |
53 | + | |
54 | +unsigned char *ballname_check(unsigned char **arg) | |
55 | +{ | |
56 | + unsigned char *p; | |
57 | + | |
58 | + if (**arg != '[') { | |
59 | + return 0; | |
60 | + } | |
61 | + for (p = ++*arg; **arg && **arg != ']'; ++*arg); | |
62 | + if (**arg != ']') { | |
63 | + print_error(0); | |
64 | + } | |
65 | + *(*arg)++ = 0; | |
66 | + return p; | |
67 | +} | |
68 | + | |
41 | 69 | int main(int argc, char **argv) |
42 | 70 | { |
43 | 71 | FILE *fp; |
44 | - unsigned char *buf, *name, *p; | |
72 | + unsigned char *buf, *name, *bname, *p; | |
45 | 73 | int size, n, m, i; |
46 | 74 | |
47 | 75 | if (argc < 4) { |
@@ -66,36 +94,54 @@ | ||
66 | 94 | orbfs_init(); |
67 | 95 | |
68 | 96 | for (n = 4; n < argc;) { |
69 | - if (strncmp(argv[n], "+File", 4) == 0 || | |
70 | - strncmp(argv[n], "+Func", 4) == 0) { | |
97 | + if (getcmd(argv[n]) != 0) { | |
71 | 98 | for (m = ++n; m < argc && argv[m][0] != '+'; m++); |
72 | - if ((fp = fopen(argv[n], "rb")) == 0) { | |
73 | - print_error(3); | |
74 | - } | |
75 | - fseek(fp, 0, SEEK_END); | |
76 | - size = ftell(fp); | |
77 | - fseek(fp, 0, SEEK_SET); | |
78 | - buf = (unsigned char *) malloc(size); | |
79 | - fread(buf, 1, size, fp); | |
80 | - for (name = p = argv[n]; *p; p++) { | |
81 | - if (*p == '\\') { | |
82 | - name = p + 1; | |
99 | + if (getcmd(argv[n - 1])[5] == 'B') { | |
100 | + name = argv[n]; | |
101 | + size = 0; | |
102 | + buf = 0; | |
103 | + } else { | |
104 | + if ((fp = fopen(argv[n], "rb")) == 0) { | |
105 | + print_error(3); | |
83 | 106 | } |
107 | + fseek(fp, 0, SEEK_END); | |
108 | + size = ftell(fp); | |
109 | + fseek(fp, 0, SEEK_SET); | |
110 | + buf = (unsigned char *) malloc(size); | |
111 | + fread(buf, 1, size, fp); | |
112 | + for (name = p = argv[n]; *p; p++) { | |
113 | + if (*p == '\\') { | |
114 | + name = p + 1; | |
115 | + } | |
116 | + } | |
84 | 117 | } |
85 | 118 | if (orbfs_create(name, size, buf) != 0) { |
86 | 119 | print_error(3); |
87 | 120 | } |
88 | - if (orbfs_meta_add(name, | |
89 | - strncmp(argv[n - 1], "+File", 4) == 0 ? "Type=File" : "Type=Func") != 0) { | |
121 | + if (orbfs_meta_add(name, getcmd(argv[n - 1])) != 0) { | |
90 | 122 | print_error(3); |
91 | 123 | } |
92 | - for (i = n + 1; i < m; i++) { | |
124 | + i = n + 1; | |
125 | + if (argv[i][0] == '[') { | |
126 | + if (!(getcmd(argv[n - 1])[6] == 'i')) { | |
127 | + print_error(0); | |
128 | + } | |
129 | + p = argv[i]; | |
130 | + for (i++; (bname = ballname_check(&p)) != 0;) { | |
131 | + if (orbfs_ball_add(bname, name) != 0) { | |
132 | + print_error(4); | |
133 | + } | |
134 | + } | |
135 | + } | |
136 | + for (; i < m; i++) { | |
93 | 137 | if (orbfs_meta_add(name, argv[i]) != 0) { |
94 | 138 | print_error(3); |
95 | 139 | } |
96 | 140 | } |
97 | - free(buf); | |
98 | - fclose(fp); | |
141 | + if (!(getcmd(argv[n - 1])[5] == 'B')) { | |
142 | + free(buf); | |
143 | + fclose(fp); | |
144 | + } | |
99 | 145 | n = m; |
100 | 146 | } else { |
101 | 147 | print_error(0); |
@@ -50,8 +50,8 @@ | ||
50 | 50 | +File orbspace\orbspace.sys \ |
51 | 51 | +Ball orbspace Color=0xff0000 \ |
52 | 52 | +Ball orbfs Color=0x00ff00 \ |
53 | - +File [orbspace]orbspace\main.c Author=tatsu Keyword=orbspace \ | |
54 | - +File [orbspace][orbfs]orbspace\orbfs.c Author=tatsu Keyword=orbspace \ | |
53 | + +File orbspace\main.c [orbspace] Author=tatsu Keyword=orbspace \ | |
54 | + +File orbspace\orbfs.c [orbspace][orbfs] Author=tatsu Keyword=orbspace \ | |
55 | 55 | +Func search.orb Color=0x0000ff |
56 | 56 | > |
57 | 57 |
@@ -8,8 +8,11 @@ | ||
8 | 8 | orbspace.img: $(MKORBFS) orbspace\ipl.bin Makefile |
9 | 9 | $(MKORBFS) orbspace.img 131072 orbspace\ipl.bin \ |
10 | 10 | +File orbspace\ipl.bin Author=tatsu Keyword=orbspace \ |
11 | - +File orbspace\ipl.nas Author=tatsu Keyword=orbspace \ | |
12 | - +Func search.orb Color=0xff0000 | |
11 | + +Ball orbspace Color=0x00ff00 \ | |
12 | + +Ball orbfs Color=0xff0000 \ | |
13 | + +File orbspace\ipl.nas [orbspace] Author=tatsu Keyword=orbspace \ | |
14 | + +File mkorbfs\mkorbfs.c [orbspace][orbfs]Author=tatsu Keyword=orbspace \ | |
15 | + +Func search.orb Color=0x0000ff | |
13 | 16 | |
14 | 17 | clean: |
15 | 18 | make -C mkorbfs clean |
@@ -8,3 +8,4 @@ | ||
8 | 8 | void orbfs_init(void); |
9 | 9 | int orbfs_create(unsigned char *name, unsigned int size, unsigned char *fbuf); |
10 | 10 | int orbfs_meta_add(unsigned char *name, unsigned char *str); |
11 | +int orbfs_ball_add(unsigned char *bname, unsigned char *name); |
@@ -32,11 +32,13 @@ | ||
32 | 32 | p < (orbsat + 0x1c00) && *p && *p < no; p += 2); |
33 | 33 | if (p == (orbsat + 0x1c00)) { |
34 | 34 | return 0; |
35 | + } else if (*p == no && !*(p + 1)) { | |
36 | + break; | |
35 | 37 | } else { |
36 | - no = *(p + 1) ? *(p + 1) : no + 1; | |
38 | + no = (*p == no) ? *(p + 1) : no + 1; | |
37 | 39 | } |
38 | 40 | } |
39 | - return no * 512 + 0x1e00; | |
41 | + return (no - 1) * 512 + 0x1e00; | |
40 | 42 | } |
41 | 43 | |
42 | 44 | unsigned int *orbsat_add(unsigned int no, unsigned int next) |
@@ -48,9 +50,9 @@ | ||
48 | 50 | return 0; |
49 | 51 | } |
50 | 52 | if (*p) { |
51 | - for (q = orbsat + 0x1c00; p < q; q -= 2) { | |
53 | + for (q = orbsat + 0x1bfc / 4; p <= q; q -= 2) { | |
52 | 54 | *q = *(q - 2); |
53 | - *(q - 1) = *(q - 3); | |
55 | + *(q + 1) = *(q - 1); | |
54 | 56 | } |
55 | 57 | } |
56 | 58 | *p = no; |
@@ -60,6 +62,7 @@ | ||
60 | 62 | |
61 | 63 | unsigned int orbfs_search(unsigned char *name) |
62 | 64 | { |
65 | + struct entry *ent; | |
63 | 66 | #ifdef ORBSPACE |
64 | 67 | #else |
65 | 68 | unsigned char *buf = (unsigned char *) malloc(512); |
@@ -69,19 +72,19 @@ | ||
69 | 72 | if (!*orbsat) { |
70 | 73 | return 0; |
71 | 74 | } |
75 | + ent = (struct entry *) buf; | |
72 | 76 | for (addr = 0x1e00;;){ |
73 | 77 | io_read(buf, addr, 512); |
74 | - if (strncmp((unsigned char *) (buf + 4), name, 12) == 0) { | |
78 | + if (strncmp((unsigned char *) ent->name, name, 12) == 0) { | |
75 | 79 | #ifdef ORBSPACE |
76 | 80 | #else |
77 | 81 | free(buf); |
78 | 82 | #endif |
79 | 83 | return addr; |
80 | - } else if (!*(buf + 4)) { | |
84 | + } else if (!ent->name[0]) { | |
81 | 85 | break; |
82 | 86 | } |
83 | - if ((addr = orbsat_getnext(addr, | |
84 | - ((unsigned int) *buf + 512 + 511) / 512 * 512)) == 0) { | |
87 | + if ((addr = orbsat_getnext(addr, ent->size + 1024)) == 0) { | |
85 | 88 | break; |
86 | 89 | } |
87 | 90 | } |
@@ -129,8 +132,8 @@ | ||
129 | 132 | strncpy(ent->name, name, 12); |
130 | 133 | memset(ent->meta, 0, 496); |
131 | 134 | io_write(buf, addr, 512); |
132 | - for (addr += 512;; size -= 512) { | |
133 | - io_read(buf, addr, 512); | |
135 | + for (addr += 512; size; size -= 512) { | |
136 | + memset(buf, 0, 512); | |
134 | 137 | memcpy(buf, fbuf, size > 512 ? 512 : size); |
135 | 138 | io_write(buf, addr, 512); |
136 | 139 | if (size <= 512) { |
@@ -173,3 +176,80 @@ | ||
173 | 176 | #endif |
174 | 177 | return 0; |
175 | 178 | } |
179 | + | |
180 | +unsigned char *orbfs_meta_get(unsigned char *meta, unsigned char *key, | |
181 | + unsigned char *buf, unsigned int size) | |
182 | +{ | |
183 | + unsigned char *base = meta; | |
184 | + unsigned int len = strlen(key), i; | |
185 | + | |
186 | + for (; *meta && (base - meta) < 496;) { | |
187 | + if (strncmp(meta, key, len) == 0) { | |
188 | + for (; *meta++ != '=';); | |
189 | + for (i = 0; *meta != 0x0a && i < size; i++) { | |
190 | + buf[i] = *meta++; | |
191 | + } | |
192 | + return buf; | |
193 | + } | |
194 | + for (; *meta++ != '=';); | |
195 | + for (; *meta++ != 0x0a;); | |
196 | + } | |
197 | + return 0; | |
198 | +} | |
199 | + | |
200 | +int orbfs_ball_add(unsigned char *bname, unsigned char *name) | |
201 | +{ | |
202 | + struct entry *ent; | |
203 | + unsigned char val[4], *buf; | |
204 | + unsigned int *sat, addr, no, i, j; | |
205 | + | |
206 | +#ifdef ORBSPACE | |
207 | +#else | |
208 | + buf = (unsigned char *) malloc(512); | |
209 | +#endif | |
210 | + if ((no = (orbfs_search(name) - 0x1e00) / 512 + 1) == 0) { | |
211 | + return 1; | |
212 | + } | |
213 | + if ((addr = orbfs_search(bname)) == 0) { | |
214 | + return 1; | |
215 | + } | |
216 | + io_read(buf, addr, 512); | |
217 | + ent = (struct entry *) buf; | |
218 | + if (orbfs_meta_get(ent->meta, "Type", val, 4) != 0 && | |
219 | + strncmp(val, "Ball", 4) != 0) { | |
220 | + return 1; | |
221 | + } | |
222 | + if (((ent->size + 511) / 512) != ((ent->size + 2 + 511) / 512)) { | |
223 | + for (sat = orbsat; sat < (orbsat + 0x1c00) && *sat; sat++); | |
224 | + if (sat == (orbsat + 0x1c00)) { | |
225 | + return 1; | |
226 | + } else if (sat-- == orbsat) { | |
227 | + sat = orbsat; | |
228 | + } | |
229 | + i = (addr - 0x1e00) / 512 + 1; | |
230 | + j = ++*sat - 1; | |
231 | + if (orbsat_add(i, j) == 0) { | |
232 | + return 1; | |
233 | + } | |
234 | + if (orbsat_add(j, i + 1) == 0) { | |
235 | + return 1; | |
236 | + } | |
237 | + if (orbsat_add(j - 1, j + 1) == 0) { | |
238 | + return 1; | |
239 | + } | |
240 | + io_write((unsigned char *) orbsat, 0x200, 7168); | |
241 | + } else { | |
242 | + j = (orbsat_getnext(addr, 513) - 0x1e00) / 512 + 1; | |
243 | + } | |
244 | + i = ent->size; | |
245 | + ent->size += 4; | |
246 | + io_write(buf, addr, 512); | |
247 | + io_read(buf, (j - 1) * 512 + 0x1e00, 512); | |
248 | + *((unsigned int *) (buf + i)) = no; | |
249 | + io_write(buf, (j - 1) * 512 + 0x1e00, 512); | |
250 | +#ifdef ORBSPACE | |
251 | +#else | |
252 | + free(buf); | |
253 | +#endif | |
254 | + return 0; | |
255 | +} |