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;