| ... | ... |
@@ -256,12 +256,6 @@ int |
| 256 | 256 |
walktoken(char *w) |
| 257 | 257 |
{
|
| 258 | 258 |
Macro *m; |
| 259 |
- if((m = findmacro(w))) {
|
|
| 260 |
- int i, res = 0; |
|
| 261 |
- for(i = 0; i < m->len; ++i) |
|
| 262 |
- res += walktoken(m->items[i]); |
|
| 263 |
- return res; |
|
| 264 |
- } |
|
| 265 | 259 |
if(findopcode(w) || scmp(w, "BRK", 4)) |
| 266 | 260 |
return 1; |
| 267 | 261 |
switch(w[0]) {
|
| ... | ... |
@@ -274,6 +268,12 @@ walktoken(char *w) |
| 274 | 268 |
case '-': /* signed negative */ |
| 275 | 269 |
case '#': return (slen(w + 1) == 2 ? 2 : 3); |
| 276 | 270 |
} |
| 271 |
+ if((m = findmacro(w))) {
|
|
| 272 |
+ int i, res = 0; |
|
| 273 |
+ for(i = 0; i < m->len; ++i) |
|
| 274 |
+ res += walktoken(m->items[i]); |
|
| 275 |
+ return res; |
|
| 276 |
+ } |
|
| 277 | 277 |
return error("Unknown label in first pass", w);
|
| 278 | 278 |
} |
| 279 | 279 |
|
| ... | ... |
@@ -293,38 +293,32 @@ parsetoken(char *w) |
| 293 | 293 |
pushbyte((Sint8)(l->addr - p.ptr - 3), 1); |
| 294 | 294 |
l->refs++; |
| 295 | 295 |
return 1; |
| 296 |
- } |
|
| 297 |
- if(w[0] == '=' && (l = findlabel(w + 1))) {
|
|
| 296 |
+ } else if(w[0] == '=' && (l = findlabel(w + 1))) {
|
|
| 298 | 297 |
if(!findlabellen(w + 1) || findlabellen(w + 1) > 2) |
| 299 |
- return error("Invalid load helper", w);
|
|
| 298 |
+ return error("Invalid store helper", w);
|
|
| 300 | 299 |
pushshort(findlabeladdr(w + 1), 1); |
| 301 | 300 |
pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR2" : "STR"), 0); |
| 302 | 301 |
l->refs++; |
| 303 | 302 |
return 1; |
| 304 |
- } |
|
| 305 |
- if(w[0] == '~' && (l = findlabel(w + 1))) {
|
|
| 303 |
+ } else if(w[0] == '~' && (l = findlabel(w + 1))) {
|
|
| 306 | 304 |
if(!findlabellen(w + 1) || findlabellen(w + 1) > 2) |
| 307 | 305 |
return error("Invalid load helper", w);
|
| 308 | 306 |
pushshort(findlabeladdr(w + 1), 1); |
| 309 | 307 |
pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR2" : "LDR"), 0); |
| 310 | 308 |
l->refs++; |
| 311 | 309 |
return 1; |
| 312 |
- } |
|
| 313 |
- if((op = findopcode(w)) || scmp(w, "BRK", 4)) {
|
|
| 310 |
+ } else if((op = findopcode(w)) || scmp(w, "BRK", 4)) {
|
|
| 314 | 311 |
pushbyte(op, 0); |
| 315 | 312 |
return 1; |
| 316 |
- } |
|
| 317 |
- if(w[0] == '.' && (l = findlabel(w + 1))) {
|
|
| 313 |
+ } else if(w[0] == '.' && (l = findlabel(w + 1))) {
|
|
| 318 | 314 |
pushshort(findlabeladdr(w + 1), 0); |
| 319 | 315 |
l->refs++; |
| 320 | 316 |
return 1; |
| 321 |
- } |
|
| 322 |
- if(w[0] == ',' && (l = findlabel(w + 1))) {
|
|
| 317 |
+ } else if(w[0] == ',' && (l = findlabel(w + 1))) {
|
|
| 323 | 318 |
pushshort(findlabeladdr(w + 1), 1); |
| 324 | 319 |
l->refs++; |
| 325 | 320 |
return 1; |
| 326 |
- } |
|
| 327 |
- if(w[0] == '#' && sihx(w + 1)) {
|
|
| 321 |
+ } else if(w[0] == '#' && sihx(w + 1)) {
|
|
| 328 | 322 |
if(slen(w + 1) == 2) |
| 329 | 323 |
pushbyte(shex(w + 1), 1); |
| 330 | 324 |
else if(slen(w + 1) == 4) |
| ... | ... |
@@ -332,18 +326,14 @@ parsetoken(char *w) |
| 332 | 326 |
else |
| 333 | 327 |
return 0; |
| 334 | 328 |
return 1; |
| 335 |
- } |
|
| 336 |
- |
|
| 337 |
- if(w[0] == '+' && sihx(w + 1)) {
|
|
| 329 |
+ } else if(w[0] == '+' && sihx(w + 1)) {
|
|
| 338 | 330 |
if(slen(w + 1) == 2) |
| 339 | 331 |
pushbyte((Sint8)shex(w + 1), 1); |
| 340 | 332 |
else if(slen(w + 1) == 4) |
| 341 | 333 |
pushshort((Sint16)shex(w + 1), 1); |
| 342 | 334 |
else |
| 343 | 335 |
return 0; |
| 344 |
- } |
|
| 345 |
- |
|
| 346 |
- if(w[0] == '-' && sihx(w + 1)) {
|
|
| 336 |
+ } else if(w[0] == '-' && sihx(w + 1)) {
|
|
| 347 | 337 |
if(slen(w + 1) == 2) |
| 348 | 338 |
pushbyte((Sint8)(shex(w + 1) * -1), 1); |
| 349 | 339 |
else if(slen(w + 1) == 4) |
| ... | ... |
@@ -351,17 +341,13 @@ parsetoken(char *w) |
| 351 | 341 |
else |
| 352 | 342 |
return 0; |
| 353 | 343 |
return 1; |
| 354 |
- } |
|
| 355 |
- |
|
| 356 |
- if((m = findmacro(w))) {
|
|
| 357 |
- int i, res = 0; |
|
| 358 |
- for(i = 0; i < m->len; ++i) {
|
|
| 344 |
+ } else if((m = findmacro(w))) {
|
|
| 345 |
+ int i; |
|
| 346 |
+ for(i = 0; i < m->len; ++i) |
|
| 359 | 347 |
if(!parsetoken(m->items[i])) |
| 360 | 348 |
return 0; |
| 361 |
- } |
|
| 362 | 349 |
return 1; |
| 363 | 350 |
} |
| 364 |
- |
|
| 365 | 351 |
return 0; |
| 366 | 352 |
} |
| 367 | 353 |
|
| ... | ... |
@@ -399,9 +385,8 @@ pass1(FILE *f) |
| 399 | 385 |
if(shex(w + 1) < addr) |
| 400 | 386 |
return error("Memory Overwrite", w);
|
| 401 | 387 |
addr = shex(w + 1); |
| 402 |
- } else {
|
|
| 388 |
+ } else |
|
| 403 | 389 |
addr += walktoken(w); |
| 404 |
- } |
|
| 405 | 390 |
} |
| 406 | 391 |
rewind(f); |
| 407 | 392 |
return 1; |
| ... | ... |
@@ -20,5 +20,5 @@ cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werr |
| 20 | 20 |
# cc uxn.c emulator.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -L/usr/local/lib -lSDL2 -o bin/emulator |
| 21 | 21 |
|
| 22 | 22 |
# run |
| 23 |
-./bin/assembler projects/software/left.usm bin/boot.rom |
|
| 23 |
+./bin/assembler projects/software/nasu.usm bin/boot.rom |
|
| 24 | 24 |
./bin/emulator bin/boot.rom |