comparison src/insn_gen.c @ 65:31d8e85706e7

Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
author lost
date Mon, 05 Jan 2009 01:40:01 +0000
parents da1337724ecd
children a338d496350e
comparison
equal deleted inserted replaced
64:aaddd47219b4 65:31d8e85706e7
36 const char *optr2; 36 const char *optr2;
37 int v1, tv, rval; 37 int v1, tv, rval;
38 lwasm_expr_stack_t *s; 38 lwasm_expr_stack_t *s;
39 int f8 = 0; 39 int f8 = 0;
40 int f16 = 0; 40 int f16 = 0;
41 41 int isdp = 0;
42
42 optr2 = *optr; 43 optr2 = *optr;
43 while (*optr2 && !isspace(*optr2) && *optr2 != ',') optr2++ 44 while (*optr2 && !isspace(*optr2) && *optr2 != ',') optr2++
44 /* do nothing */ ; 45 /* do nothing */ ;
45 46
46 if (*optr2 != ',' && **optr != '[') 47 if (*optr2 != ',' && **optr != '[')
65 if (!s) 66 if (!s)
66 { 67 {
67 register_error(as, l, 1, "Bad expression"); 68 register_error(as, l, 1, "Bad expression");
68 return; 69 return;
69 } 70 }
70 if (!lwasm_expr_is_constant(s)) 71 if (!lwasm_expr_is_constant(s) && as -> passnum == 1)
71 { 72 {
72 f16 = 1; 73 f16 = 1;
73 l -> fsize = 2; 74 l -> fsize = 2;
74 register_error(as, l, 2, "Incomplete reference"); 75 register_error(as, l, 2, "Incomplete reference");
75 } 76 }
76 v1 = lwasm_expr_get_value(s); 77 v1 = lwasm_expr_get_value(s);
77 lwasm_expr_stack_free(s); 78 lwasm_expr_stack_free(s);
79
80 if (((v1 >> 8) & 0xff) == (as -> dpval & 0xff))
81 isdp = 1;
78 82
79 if (f8 || (!f16 && v1 >= -128 && v1 <= 255)) 83 if (f8 || (!f16 && isdp))
80 { 84 {
81 v1 = v1 & 0xffff; 85 v1 = v1 & 0xffff;
82 tv = v1 - ((as -> dpval) << 8); 86 tv = v1 - ((as -> dpval) << 8);
83 if (tv < 0 || tv > 0xff) 87 if (tv < 0 || tv > 0xff)
84 { 88 {