From 9a21654872efd5ff063d8ab46ce0d55873e8c944 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Tue, 31 Oct 2017 12:27:45 +0000 Subject: [PATCH] asz80: improve handling of segment type clashes --- Applications/MWC/cmd/asz80/as3.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Applications/MWC/cmd/asz80/as3.c b/Applications/MWC/cmd/asz80/as3.c index 6585d97c..25e7df06 100644 --- a/Applications/MWC/cmd/asz80/as3.c +++ b/Applications/MWC/cmd/asz80/as3.c @@ -18,6 +18,21 @@ void istuser(ADDR *ap) aerr(ADDR_REQUIRED); } +/* + * A segment needs to meet a rule. Make sure that we don't have + * internmal inconsistency + */ +static void setsegment(SYM *s, int seg) +{ + if (seg == UNKNOWN) + return; + + if (s->s_segment == UNKNOWN || s->s_segment == seg) { + s->s_segment = seg; + return; + } + aerr(SEGMENT_CLASH); +} static void chkabsolute(ADDR *a) { @@ -55,12 +70,12 @@ static void chksegment(ADDR *left, ADDR *right, int op) if (left->a_segment == -1) { left->a_segment = right->a_segment; if (left->a_sym) - left->a_sym->s_segment = left->a_segment; + setsegment(left->a_sym, 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; + setsegment(right->a_sym, right->a_segment); } if (left->a_segment == right->a_segment && op == '-') { left->a_segment = ABSOLUTE; -- 2.34.1