X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Fmcs51%2Fasexpr.c;h=4bef55948427a1de54690abb81d8efd427ac4094;hb=fbccf8c34a545513634c74ff2218b3e1441b3324;hp=8eb5519fa94f1a0dc6883363e58da1c64977b51a;hpb=3dcb1e6361650ece3cf41a821b5a66e798817744;p=fw%2Fsdcc diff --git a/as/mcs51/asexpr.c b/as/mcs51/asexpr.c index 8eb5519f..4bef5594 100644 --- a/as/mcs51/asexpr.c +++ b/as/mcs51/asexpr.c @@ -1,4 +1,4 @@ - /* asexpr.c */ +/* asexpr.c */ /* * (C) Copyright 1989-1995 @@ -88,7 +88,7 @@ expr(register struct expr *esp, int n) term(esp); while (ctype[c = getnb()] & BINOP) { /* - * Handle binary operators + - * / & | % ^ << >> + * Handle binary operators + - * / & | % ^ << >> [ */ if ((p = oprio(c)) <= n) break; @@ -217,6 +217,21 @@ expr(register struct expr *esp, int n) abscheck(esp); esp->e_addr >>= re.e_addr; break; + case '[': + /* MB added [ for bit access in bdata */ + abscheck(&re); + if (getnb() != ']') + qerr(); + + /* if the left is a relative address then */ + if (esp->e_base.e_ap) { + esp->e_addr |= (re.e_addr | 0x80) << 8; + break; + } + else if ((esp->e_addr & 0x87) == 0x80) { + esp->e_addr |= re.e_addr; + break; + } default: qerr(); @@ -505,6 +520,11 @@ term(register struct expr *esp) esp->e_mode = sp->s_type; esp->e_addr = sp->s_addr; esp->e_base.e_ap = sp->s_area; + /* MB: abused bit 15 of s_addr to indicate bit-addressable bytes */ + if ((sp->s_addr & 0x8000) && sp->s_area && + (!strcmp(sp->s_area->a_id, "BSEG_BYTES") || !strcmp(sp->s_area->a_id, "BIT_BANK"))) { + esp->e_rlcf |= R_BIT | R_BYT2; + } } return; } @@ -658,6 +678,8 @@ is_abs (register struct expr *esp) int oprio(register int c) { + if (c == '[') + return (12); if (c == '*' || c == '/' || c == '%') return (10); if (c == '+' || c == '-')