a module can start with a digit
[fw/sdcc] / as / mcs51 / asmain.c
index bb2194286945ad9c698ff7308eb90a69b5c6225b..eed56eac6c3eca6017d27d696ebb57cee40101b9 100644 (file)
@@ -17,6 +17,7 @@
 #include <string.h>
 
 #include "asm.h"
+#include "strcmpi.h"
 
 /*)Module      asmain.c
  *
@@ -799,7 +800,7 @@ loop:
                break;
 
        case S_MODUL:
-               getst(id, -1);
+               getst(id, getnb()); // a module can start with a digit
                if (pass == 0) {
                        if (module[0]) {
                                err('m');
@@ -843,10 +844,6 @@ loop:
                if ((ap = alookup(id)) != NULL) {
                        if (uaf && uf != ap->a_flag)
                                err('m');
-                        if (ap->a_flag & A_OVR) {
-                               ap->a_size = 0; 
-                                ap->a_fuzz=0;
-                       }
                } else {
                        ap = (struct area *) new (sizeof(struct area));
                        ap->a_ap = areap;
@@ -935,7 +932,7 @@ loop:
                {
                    getst(id, -1);
                    
-                   if (!strcmpi(id, "on"))
+                   if (!as_strcmpi(id, "on"))
                    {
                        /* Quick sanity check: size of 
                         * Addr_T must be at least 24 bits.
@@ -953,7 +950,7 @@ loop:
                            flat24Mode = 1;
                        }
                    }
-                   else if (!strcmpi(id, "off"))
+                   else if (!as_strcmpi(id, "off"))
                    {
                        flat24Mode = 0;
                    }
@@ -1114,11 +1111,26 @@ register struct area *nap;
        register struct area *oap;
 
        oap = dot.s_area;
+       /* fprintf (stderr, "%s dot.s_area->a_size: %d dot.s_addr: %d\n",
+            oap->a_id, dot.s_area->a_size, dot.s_addr); */
        oap->a_fuzz = fuzz;
-       oap->a_size = dot.s_addr;
-       fuzz = nap->a_fuzz;
+       if (oap->a_flag & A_OVR) {
+         // the size of an overlay is the biggest size encountered
+         if (oap->a_size < dot.s_addr) {
+           oap->a_size = dot.s_addr;
+         }
+       } else {
+         oap->a_size = dot.s_addr;
+       }
+       if (nap->a_flag & A_OVR) {
+         // a new overlay starts at 0, no fuzz
+         dot.s_addr = 0;
+         fuzz = 0;
+       } else {
+         dot.s_addr = nap->a_size;
+         fuzz = nap->a_fuzz;
+       }
        dot.s_area = nap;
-       dot.s_addr = nap->a_size;
        outall();
 }