From 7e4c430efbffd05900beb28561aff3e6645597c9 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Wed, 15 Nov 2017 21:08:11 +0000 Subject: [PATCH] as: Fix the register+offset 8bit absolute case The simple case is (ix + const) but in theory at least we might have an absolute symbol. --- Applications/MWC/cmd/asz80/as3.c | 11 +++++++++++ Applications/MWC/cmd/asz80/as4.c | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/Applications/MWC/cmd/asz80/as3.c b/Applications/MWC/cmd/asz80/as3.c index 62fc4add..81e72bc4 100644 --- a/Applications/MWC/cmd/asz80/as3.c +++ b/Applications/MWC/cmd/asz80/as3.c @@ -45,6 +45,16 @@ static void chkabsolute(ADDR *a) static void chksegment(ADDR *left, ADDR *right, int op) { + uint16_t m = (left->a_type & TMMODE); + if (m == TBR || m == TWR) { + if (op != '+') + aerr(MUST_BE_ABSOLUTE); + if ((right->a_type & TMMODE) == TUSER) { + left->a_segment = right->a_segment; + return; + } + aerr(MUST_BE_ABSOLUTE); + } /* Not symbols, doesn't matter */ if ((left->a_type & TMMODE) != TUSER ||(right->a_type & TMMODE) != TUSER) return; @@ -219,6 +229,7 @@ void expr2(ADDR *ap) if (mode==TBR || mode==TWR || mode==TSR || mode==TCC) { ap->a_type = mode|sp->s_value; ap->a_value = 0; + ap->a_segment = UNKNOWN; return; } if (mode != TNEW && mode != TUSER) diff --git a/Applications/MWC/cmd/asz80/as4.c b/Applications/MWC/cmd/asz80/as4.c index 27767104..5a1465fe 100644 --- a/Applications/MWC/cmd/asz80/as4.c +++ b/Applications/MWC/cmd/asz80/as4.c @@ -182,6 +182,12 @@ void outrabrel(ADDR *a) void outrab(ADDR *a) { int s = 0; + uint16_t mode = (a->a_type & TMMODE); + if (mode == TBR || mode == TWR) { + a->a_flags |= A_LOW; + if (a->a_segment != ABSOLUTE) + aerr(MUST_BE_ABSOLUTE); + } if (a->a_segment != ABSOLUTE) { check_store_allowed(segment, 1); outbyte(REL_ESC); -- 2.34.1