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