return;
}
/* Subtraction within segment produces an absolute */
- if (left->a_segment == right->a_segment && op == '-') {
- left->a_segment = ABSOLUTE;
- left->a_sym = NULL;
- return;
+ if (op == '-') {
+ /* Unknown symbols may get segment forced as a result */
+ if (left->a_segment == -1) {
+ left->a_segment = right->a_segment;
+ if (left->a_sym)
+ left->a_sym->s_segment = left->a_segment;
+ }
+ if (right->a_segment == -1) {
+ right->a_segment = left->a_segment;
+ if (right->a_sym)
+ right->a_sym->s_segment = right->a_segment;
+ }
+ if (left->a_segment == right->a_segment && op == '-') {
+ left->a_segment = ABSOLUTE;
+ left->a_sym = NULL;
+ return;
+ }
}
left->a_sym = NULL;
aerr(MUST_BE_ABSOLUTE);
expr3(ap, c);
return;
}
- if (isalpha(c)) {
+ if (isalpha(c) || c == '_') {
getid(id, c);
if ((sp=lookup(id, uhash, 0)) == NULL
&& (sp=lookup(id, phash, 0)) == NULL)
else {
if (s->s_type & TPUBLIC)
flag |= S_PUBLIC;
- flag |= s->s_segment;
}
+ /* 0 absolute, 1-n segments, -1 don't care */
+ flag |= (s->s_segment & S_SEGMENT);
putc(flag, ofp);
fwrite(s->s_id, 16, 1, ofp);
putc(s->s_value, ofp);