as: Fix the register+offset 8bit absolute case
authorAlan Cox <alan@linux.intel.com>
Wed, 15 Nov 2017 21:08:11 +0000 (21:08 +0000)
committerAlan Cox <alan@linux.intel.com>
Wed, 15 Nov 2017 21:08:11 +0000 (21:08 +0000)
The simple case is (ix + const) but in theory at least we might have an
absolute symbol.

Applications/MWC/cmd/asz80/as3.c
Applications/MWC/cmd/asz80/as4.c

index 62fc4ad..81e72bc 100644 (file)
@@ -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)
index 2776710..5a1465f 100644 (file)
@@ -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);