... | ... |
@@ -6,60 +6,87 @@ |
6 | 6 |
|
7 | 7 |
( variables ) |
8 | 8 |
|
9 |
-;slime { color 1 } |
|
9 |
+@slime [ |
|
10 |
+ &color 00 |
|
11 |
+ &end |
|
12 |
+] |
|
10 | 13 |
|
11 | 14 |
( devices ) |
12 | 15 |
|
13 |
-|0100 ;System { vector 2 pad 6 r 2 g 2 b 2 } |
|
14 |
-|0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 } |
|
15 |
-|0140 ;Controller { vector 2 button 1 key 1 } |
|
16 |
+|0100 @System [ |
|
17 |
+ &vector 0000 |
|
18 |
+ &pad 0000 |
|
19 |
+ 0000 |
|
20 |
+ 0000 |
|
21 |
+ &r 0000 |
|
22 |
+ &g 0000 |
|
23 |
+ &b 0000 |
|
24 |
+ &end |
|
25 |
+] |
|
26 |
+|0120 @Screen [ |
|
27 |
+ &vector 0000 |
|
28 |
+ &width 0000 |
|
29 |
+ &height 0000 |
|
30 |
+ &pad 0000 |
|
31 |
+ &x 0000 |
|
32 |
+ &y 0000 |
|
33 |
+ &addr 0000 |
|
34 |
+ &color 00 |
|
35 |
+ &end |
|
36 |
+] |
|
37 |
+|0140 @Controller [ |
|
38 |
+ &vector 0000 |
|
39 |
+ &button 00 |
|
40 |
+ &key 00 |
|
41 |
+ &end |
|
42 |
+] |
|
16 | 43 |
|
17 | 44 |
|0200 |
18 | 45 |
|
19 |
- ( theme ) #0daf =System.r #02ff =System.g #035f =System.b |
|
20 |
- ( vectors ) ,FRAME =Screen.vector |
|
46 |
+ ( theme ) #0daf =System/r #02ff =System/g #035f =System/b |
|
47 |
+ ( vectors ) ,on-frame =Screen/vector |
|
21 | 48 |
|
22 | 49 |
( set origin ) |
23 |
- ~Screen.width 2/ =Screen.x |
|
24 |
- ~Screen.height 2/ =Screen.y |
|
25 |
- ,default_icn =Screen.addr |
|
26 |
- #31 =Screen.color |
|
27 |
- #2a =slime |
|
50 |
+ ~Screen/width 2/ =Screen/x |
|
51 |
+ ~Screen/height 2/ =Screen/y |
|
52 |
+ ,default_icn =Screen/addr |
|
53 |
+ #31 =Screen/color |
|
54 |
+ #2a =slime/color |
|
28 | 55 |
|
29 | 56 |
BRK |
30 | 57 |
|
31 |
-@FRAME |
|
58 |
+@on-frame |
|
32 | 59 |
|
33 |
- #2a =slime |
|
34 |
- ,default_icn =Screen.addr |
|
60 |
+ #2a =slime/color |
|
61 |
+ ,default_icn =Screen/addr |
|
35 | 62 |
|
36 | 63 |
( hold ctrl key to change slime color ) |
37 | 64 |
|
38 |
- ~Controller.button #0f AND |
|
39 |
- DUP #01 NEQ ^$no-ctrl JNZ #25 =slime $no-ctrl |
|
40 |
- DUP #02 NEQ ^$no-alt JNZ #2f =slime $no-alt |
|
65 |
+ ~Controller/button #0f AND |
|
66 |
+ DUP #01 NEQ ^$no-ctrl JNZ #25 =slime/color $no-ctrl |
|
67 |
+ DUP #02 NEQ ^$no-alt JNZ #2f =slime/color $no-alt |
|
41 | 68 |
POP |
42 | 69 |
|
43 |
- ( clear ) #30 =Screen.color |
|
70 |
+ ( clear ) #30 =Screen/color |
|
44 | 71 |
|
45 | 72 |
( detect movement ) |
46 |
- ~Controller.button #f0 AND |
|
73 |
+ ~Controller/button #f0 AND |
|
47 | 74 |
DUP #04 SFT #01 AND #01 NEQ ^$no-up JNZ |
48 |
- ( move ) ~Screen.y -- =Screen.y ,up_icn =Screen.addr $no-up |
|
75 |
+ ( move ) ~Screen/y -- =Screen/y ,up_icn =Screen/addr $no-up |
|
49 | 76 |
DUP #05 SFT #01 AND #01 NEQ ^$no-down JNZ |
50 |
- ( move ) ~Screen.y ++ =Screen.y ,down_icn =Screen.addr $no-down |
|
77 |
+ ( move ) ~Screen/y ++ =Screen/y ,down_icn =Screen/addr $no-down |
|
51 | 78 |
DUP #06 SFT #01 AND #01 NEQ ^$no-left JNZ |
52 |
- ( move ) ~Screen.x -- =Screen.x ,left_icn =Screen.addr $no-left |
|
79 |
+ ( move ) ~Screen/x -- =Screen/x ,left_icn =Screen/addr $no-left |
|
53 | 80 |
DUP #07 SFT #01 AND #01 NEQ ^$no-right JNZ |
54 |
- ( move ) ~Screen.x ++ =Screen.x ,right_icn =Screen.addr $no-right |
|
81 |
+ ( move ) ~Screen/x ++ =Screen/x ,right_icn =Screen/addr $no-right |
|
55 | 82 |
POP |
56 | 83 |
|
57 | 84 |
( draw face ) |
58 |
- #31 =Screen.color |
|
85 |
+ #31 =Screen/color |
|
59 | 86 |
|
60 | 87 |
( draw slime ) |
61 |
- ,slime_icn =Screen.addr |
|
62 |
- ~slime =Screen.color |
|
88 |
+ ,slime_icn =Screen/addr |
|
89 |
+ ~slime/color =Screen/color |
|
63 | 90 |
|
64 | 91 |
BRK |
65 | 92 |
|
... | ... |
@@ -13,7 +13,6 @@ WITH REGARD TO THIS SOFTWARE. |
13 | 13 |
|
14 | 14 |
#define WORDLENMAX 32 |
15 | 15 |
#define MACROMAX 64 |
16 |
-#define OFFSET 0x0200 |
|
17 | 16 |
|
18 | 17 |
typedef unsigned char Uint8; |
19 | 18 |
typedef signed char Sint8; |
... | ... |
@@ -132,22 +131,6 @@ findlabeladdr(char *s) |
132 | 131 |
return 0; |
133 | 132 |
} |
134 | 133 |
|
135 |
-Uint8 |
|
136 |
-findlabellen(char *s) |
|
137 |
-{ |
|
138 |
- int i; |
|
139 |
- char *param; |
|
140 |
- Label *l = findlabel(s); |
|
141 |
- if(scin(s, '.') < 1) |
|
142 |
- return l->map[0].size; |
|
143 |
- param = s + scin(s, '.') + 1; |
|
144 |
- for(i = 0; i < l->maps; ++i) |
|
145 |
- if(scmp(l->map[i].name, param, 64)) |
|
146 |
- return l->map[i].size; |
|
147 |
- printf("!!! Warning %s.%s\n", l->name, param); |
|
148 |
- return 0; |
|
149 |
-} |
|
150 |
- |
|
151 | 134 |
Uint8 |
152 | 135 |
findopcode(char *s) |
153 | 136 |
{ |
... | ... |
@@ -175,7 +158,7 @@ char * |
175 | 158 |
sublabel(char *src, char *scope, char *name) |
176 | 159 |
{ |
177 | 160 |
scpy(scope, src, 64); |
178 |
- scpy("-", src + slen(src), 64); |
|
161 |
+ scpy("/", src + slen(src), 64); |
|
179 | 162 |
scpy(name, src + slen(src), 64); |
180 | 163 |
return src; |
181 | 164 |
} |
... | ... |
@@ -225,6 +208,13 @@ makelabel(char *name, Uint16 addr) |
225 | 208 |
return error("Label name is hex number", name); |
226 | 209 |
if(findopcode(name)) |
227 | 210 |
return error("Label name is invalid", name); |
211 |
+ /* set length of last label */ |
|
212 |
+ if(p.llen) { |
|
213 |
+ l = &p.labels[p.llen - 1]; |
|
214 |
+ l->len = addr - l->addr; |
|
215 |
+ printf(" Set length of #%d \n", l->len); |
|
216 |
+ } |
|
217 |
+ /* make new label */ |
|
228 | 218 |
l = &p.labels[p.llen++]; |
229 | 219 |
l->addr = addr; |
230 | 220 |
l->refs = 0; |
... | ... |
@@ -233,25 +223,6 @@ makelabel(char *name, Uint16 addr) |
233 | 223 |
return 1; |
234 | 224 |
} |
235 | 225 |
|
236 |
-int |
|
237 |
-makevariable(char *name, Uint16 *addr, FILE *f) |
|
238 |
-{ |
|
239 |
- Label *l; |
|
240 |
- char word[64]; |
|
241 |
- if(!makelabel(name, *addr)) |
|
242 |
- return error("Could not create variable", name); |
|
243 |
- l = findlabel(name); |
|
244 |
- while(fscanf(f, "%s", word)) { |
|
245 |
- if(word[0] == '{') continue; |
|
246 |
- if(word[0] == '}') break; |
|
247 |
- scpy(word, l->map[l->maps].name, 64); |
|
248 |
- fscanf(f, "%02x", &l->map[l->maps].size); |
|
249 |
- *addr += l->map[l->maps].size; |
|
250 |
- l->len += l->map[l->maps++].size; |
|
251 |
- } |
|
252 |
- return 1; |
|
253 |
-} |
|
254 |
- |
|
255 | 226 |
int |
256 | 227 |
skipblock(char *w, int *cap, char a, char b) |
257 | 228 |
{ |
... | ... |
@@ -303,25 +274,25 @@ parsetoken(char *w) |
303 | 274 |
pushbyte((Sint8)(l->addr - p.ptr - 3), 1); |
304 | 275 |
return ++l->refs; |
305 | 276 |
} else if(w[0] == '=' && (l = findlabel(w + 1))) { |
306 |
- if(!findlabellen(w + 1) || findlabellen(w + 1) > 2) |
|
277 |
+ if(!l->len || l->len > 2) |
|
307 | 278 |
return error("Invalid store helper", w); |
308 | 279 |
if(findlabeladdr(w + 1) < 0x0100) { |
309 | 280 |
pushbyte(findlabeladdr(w + 1), 1); |
310 |
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR" : "POK"), 0); |
|
281 |
+ pushbyte(findopcode(l->len == 2 ? "STR" : "POK"), 0); |
|
311 | 282 |
} else { |
312 | 283 |
pushshort(findlabeladdr(w + 1), 1); |
313 |
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR2" : "POK2"), 0); |
|
284 |
+ pushbyte(findopcode(l->len == 2 ? "STR2" : "POK2"), 0); |
|
314 | 285 |
} |
315 | 286 |
return ++l->refs; |
316 | 287 |
} else if(w[0] == '~' && (l = findlabel(w + 1))) { |
317 |
- if(!findlabellen(w + 1) || findlabellen(w + 1) > 2) |
|
288 |
+ if(!l->len || l->len > 2) |
|
318 | 289 |
return error("Invalid load helper", w); |
319 | 290 |
if(findlabeladdr(w + 1) < 0x0100) { |
320 | 291 |
pushbyte(findlabeladdr(w + 1), 1); |
321 |
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR" : "PEK"), 0); |
|
292 |
+ pushbyte(findopcode(l->len == 2 ? "LDR" : "PEK"), 0); |
|
322 | 293 |
} else { |
323 | 294 |
pushshort(findlabeladdr(w + 1), 1); |
324 |
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR2" : "PEK2"), 0); |
|
295 |
+ pushbyte(findopcode(l->len == 2 ? "LDR2" : "PEK2"), 0); |
|
325 | 296 |
} |
326 | 297 |
return ++l->refs; |
327 | 298 |
} else if(w[0] == '.' && (l = findlabel(w + 1))) { |
... | ... |
@@ -363,7 +334,10 @@ pass1(FILE *f) |
363 | 334 |
printf("Pass 1\n"); |
364 | 335 |
while(fscanf(f, "%s", w) == 1) { |
365 | 336 |
if(skipblock(w, &ccmnt, '(', ')')) continue; |
366 |
- if(skipblock(w, &cbits, '[', ']')) { |
|
337 |
+ if(w[0] == '&') { |
|
338 |
+ if(!makelabel(sublabel(subw, scope, w + 1), addr)) |
|
339 |
+ return error("Pass1 failed", w); |
|
340 |
+ } else if(skipblock(w, &cbits, '[', ']')) { |
|
367 | 341 |
if(w[0] == '[' || w[0] == ']') |
368 | 342 |
continue; |
369 | 343 |
if(slen(w) == 4 && sihx(w)) |
... | ... |
@@ -383,9 +357,6 @@ pass1(FILE *f) |
383 | 357 |
} else if(w[0] == '$') { |
384 | 358 |
if(!makelabel(sublabel(subw, scope, w + 1), addr)) |
385 | 359 |
return error("Pass1 failed", w); |
386 |
- } else if(w[0] == ';') { |
|
387 |
- if(!makevariable(w + 1, &addr, f)) |
|
388 |
- return error("Pass1 failed", w); |
|
389 | 360 |
} else if(w[0] == '|') { |
390 | 361 |
if(shex(w + 1) < addr) |
391 | 362 |
return error("Memory Overwrite", w); |
... | ... |
@@ -406,6 +377,7 @@ pass2(FILE *f) |
406 | 377 |
while(fscanf(f, "%s", w) == 1) { |
407 | 378 |
if(w[0] == '$') continue; |
408 | 379 |
if(w[0] == '%') continue; |
380 |
+ if(w[0] == '&') continue; |
|
409 | 381 |
if(skipblock(w, &ccmnt, '(', ')')) continue; |
410 | 382 |
if(skipblock(w, &ctemplate, '{', '}')) continue; |
411 | 383 |
if(w[0] == ';') { |
... | ... |
@@ -440,7 +412,7 @@ void |
440 | 412 |
cleanup(char *filename) |
441 | 413 |
{ |
442 | 414 |
int i; |
443 |
- printf("Assembled %s(%0.2fkb), %d labels, %d macros.\n\n", filename, (p.ptr - OFFSET) / 1000.0, p.llen, p.mlen); |
|
415 |
+ printf("Assembled %s(%0.2fkb), %d labels, %d macros.\n\n", filename, p.ptr / 1000.0, p.llen, p.mlen); |
|
444 | 416 |
for(i = 0; i < p.llen; ++i) |
445 | 417 |
if(!p.labels[i].refs) |
446 | 418 |
printf("--- Unused label: %s\n", p.labels[i].name); |
... | ... |
@@ -459,7 +431,7 @@ main(int argc, char *argv[]) |
459 | 431 |
return !error("Open", "Failed"); |
460 | 432 |
if(!pass1(f) || !pass2(f)) |
461 | 433 |
return !error("Assembly", "Failed"); |
462 |
- fwrite(p.data + OFFSET, p.ptr - OFFSET, 1, fopen(argv[2], "wb")); |
|
434 |
+ fwrite(p.data, p.ptr, 1, fopen(argv[2], "wb")); |
|
463 | 435 |
fclose(f); |
464 | 436 |
cleanup(argv[2]); |
465 | 437 |
return 0; |
... | ... |
@@ -166,7 +166,7 @@ loaduxn(Uxn *u, char *filepath) |
166 | 166 |
FILE *f; |
167 | 167 |
if(!(f = fopen(filepath, "rb"))) |
168 | 168 |
return haltuxn(u, "Missing input rom.", 0); |
169 |
- fread(u->ram.dat + PAGE_PROGRAM, sizeof(u->ram.dat) - PAGE_PROGRAM, 1, f); |
|
169 |
+ fread(u->ram.dat + LOAD_OFFSET, sizeof(u->ram.dat) - LOAD_OFFSET, 1, f); |
|
170 | 170 |
printf("Uxn loaded[%s].\n", filepath); |
171 | 171 |
return 1; |
172 | 172 |
} |