Mercurial > hg-old > index.cgi
comparison lwasm/pseudo.c @ 389:fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
author | lost@l-w.ca |
---|---|
date | Wed, 14 Jul 2010 22:33:55 -0600 |
parents | a741d2e4869f |
children | c1d83336e1d1 |
comparison
equal
deleted
inserted
replaced
388:8991eb507d2d | 389:fbb7bfed8076 |
---|---|
27 #include "instab.h" | 27 #include "instab.h" |
28 #include "input.h" | 28 #include "input.h" |
29 | 29 |
30 #include "lw_string.h" | 30 #include "lw_string.h" |
31 | 31 |
32 extern void register_struct_entry(asmstate_t *as, line_t *l, int size, structtab_t *ss); | |
33 | |
32 // for "end" | 34 // for "end" |
33 PARSEFUNC(pseudo_parse_end) | 35 PARSEFUNC(pseudo_parse_end) |
34 { | 36 { |
35 lw_expr_t addr; | 37 lw_expr_t addr; |
36 | 38 |
300 expr = lwasm_parse_expr(as, p); | 302 expr = lwasm_parse_expr(as, p); |
301 if (!expr) | 303 if (!expr) |
302 { | 304 { |
303 lwasm_register_error(as, l, "Bad expression"); | 305 lwasm_register_error(as, l, "Bad expression"); |
304 } | 306 } |
307 | |
308 if (as -> instruct) | |
309 { | |
310 lwasm_reduce_expr(as, expr); | |
311 if (!lw_expr_istype(expr, lw_expr_type_int)) | |
312 { | |
313 lwasm_register_error(as, l, "Expression must be constant at parse time"); | |
314 } | |
315 else | |
316 { | |
317 int e; | |
318 e = lw_expr_intval(expr); | |
319 register_struct_entry(as, l, e, NULL); | |
320 l -> len = 0; | |
321 } | |
322 } | |
305 | 323 |
306 lwasm_save_expr(l, 0, expr); | 324 lwasm_save_expr(l, 0, expr); |
307 } | 325 } |
308 | 326 |
309 RESOLVEFUNC(pseudo_resolve_rmb) | 327 RESOLVEFUNC(pseudo_resolve_rmb) |
335 if (!expr) | 353 if (!expr) |
336 { | 354 { |
337 lwasm_register_error(as, l, "Bad expression"); | 355 lwasm_register_error(as, l, "Bad expression"); |
338 } | 356 } |
339 | 357 |
358 if (as -> instruct) | |
359 { | |
360 lwasm_reduce_expr(as, expr); | |
361 if (!lw_expr_istype(expr, lw_expr_type_int)) | |
362 { | |
363 lwasm_register_error(as, l, "Expression must be constant at parse time"); | |
364 } | |
365 else | |
366 { | |
367 int e; | |
368 e = lw_expr_intval(expr) * 2; | |
369 register_struct_entry(as, l, e, NULL); | |
370 l -> len = 0; | |
371 } | |
372 } | |
340 lwasm_save_expr(l, 0, expr); | 373 lwasm_save_expr(l, 0, expr); |
341 } | 374 } |
342 | 375 |
343 RESOLVEFUNC(pseudo_resolve_rmd) | 376 RESOLVEFUNC(pseudo_resolve_rmd) |
344 { | 377 { |
369 expr = lwasm_parse_expr(as, p); | 402 expr = lwasm_parse_expr(as, p); |
370 if (!expr) | 403 if (!expr) |
371 { | 404 { |
372 lwasm_register_error(as, l, "Bad expression"); | 405 lwasm_register_error(as, l, "Bad expression"); |
373 } | 406 } |
407 if (as -> instruct) | |
408 { | |
409 lwasm_reduce_expr(as, expr); | |
410 if (!lw_expr_istype(expr, lw_expr_type_int)) | |
411 { | |
412 lwasm_register_error(as, l, "Expression must be constant at parse time"); | |
413 } | |
414 else | |
415 { | |
416 int e; | |
417 e = lw_expr_intval(expr) * 4; | |
418 register_struct_entry(as, l, e, NULL); | |
419 l -> len = 0; | |
420 } | |
421 } | |
374 | 422 |
375 lwasm_save_expr(l, 0, expr); | 423 lwasm_save_expr(l, 0, expr); |
376 } | 424 } |
377 | 425 |
378 RESOLVEFUNC(pseudo_resolve_rmq) | 426 RESOLVEFUNC(pseudo_resolve_rmq) |
561 return; | 609 return; |
562 } | 610 } |
563 | 611 |
564 register_symbol(as, l, l -> sym, e, symbol_flag_none); | 612 register_symbol(as, l, l -> sym, e, symbol_flag_none); |
565 l -> symset = 1; | 613 l -> symset = 1; |
614 l -> dptr = lookup_symbol(as, l, l -> sym); | |
566 } | 615 } |
567 | 616 |
568 PARSEFUNC(pseudo_parse_set) | 617 PARSEFUNC(pseudo_parse_set) |
569 { | 618 { |
570 lw_expr_t e; | 619 lw_expr_t e; |
584 return; | 633 return; |
585 } | 634 } |
586 | 635 |
587 register_symbol(as, l, l -> sym, e, symbol_flag_set); | 636 register_symbol(as, l, l -> sym, e, symbol_flag_set); |
588 l -> symset = 1; | 637 l -> symset = 1; |
638 l -> dptr = lookup_symbol(as, l, l -> sym); | |
589 } | 639 } |
590 | 640 |
591 PARSEFUNC(pseudo_parse_setdp) | 641 PARSEFUNC(pseudo_parse_setdp) |
592 { | 642 { |
593 lw_expr_t e; | 643 lw_expr_t e; |
611 { | 661 { |
612 lwasm_register_error(as, l, "SETDP must be constant on pass 1"); | 662 lwasm_register_error(as, l, "SETDP must be constant on pass 1"); |
613 return; | 663 return; |
614 } | 664 } |
615 l -> dpval = lw_expr_intval(e) & 0xff; | 665 l -> dpval = lw_expr_intval(e) & 0xff; |
666 l -> dshow = l -> dpval; | |
667 l -> dsize = 1; | |
616 } | 668 } |
617 | 669 |
618 PARSEFUNC(pseudo_parse_ifp1) | 670 PARSEFUNC(pseudo_parse_ifp1) |
619 { | 671 { |
620 l -> len = 0; | 672 l -> len = 0; |