| ... | ... |
@@ -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 |
} |