* as/link/mcs51/lkarea.c (lnkarea2): handle absolute areas, restructured
authorMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 21 Dec 2006 20:46:09 +0000 (20:46 +0000)
committerMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 21 Dec 2006 20:46:09 +0000 (20:46 +0000)
   BSEG handling,
  (lnksect2): use --data-loc and --idata-loc as lower bound for ramstart,
   corrected overlayed areax addresses, warn about memory overlaps
* as/mcs51/asmain.c (asmbl): create a new area for every .org directive
* src/avr/main.c,
* src/ds390/main.c,
* src/hc08/main.c,
* src/mcs51/main.c,
* src/pic16/main.c,
* src/pic/main.c,
* src/xa51/main.c,
* src/z80/main.c,
* src/port.h: added xabs_name and iabs_name
* src/SDCCglue.c (emitRegularMap): allocate for absolutes with initializer
  (glue, emitMaps): create and emit maps d_abs and i_abs
* src/SDCCglue.h: cosmetic changes
* src/SDCCmain.c (setDefaultOptions): idata can start below 0x80
* src/SDCCmem.h,
* src/SDCCmem.c (initMem): added x_abs, i_abs and d_abs
  (allocDefault): put absolute, initialized globals in them
* support/regression/tests/absolute.c: added absolute bdata test
* device/lib/printf_large.c (output_float): moved fpBuffer to stack/xdata

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4521 4a8a32a2-be11-0410-ad9d-d568d2c75423

19 files changed:
ChangeLog
as/link/mcs51/lkarea.c
as/mcs51/asmain.c
device/lib/printf_large.c
src/SDCCglue.c
src/SDCCglue.h
src/SDCCmain.c
src/SDCCmem.c
src/SDCCmem.h
src/avr/main.c
src/ds390/main.c
src/hc08/main.c
src/mcs51/main.c
src/pic/main.c
src/pic16/main.c
src/port.h
src/xa51/main.c
src/z80/main.c
support/regression/tests/absolute.c

index 45ae76dc0ac95f1561d933e028f216ab6ff9c1cc..6649830a59faa1fc088918d5ee07403f51bab0d3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2006-12-21 Maarten Brock <sourceforge.brock AT dse.nl>
+
+       * as/link/mcs51/lkarea.c (lnkarea2): handle absolute areas, restructured
+          BSEG handling,
+         (lnksect2): use --data-loc and --idata-loc as lower bound for ramstart,
+          corrected overlayed areax addresses, warn about memory overlaps
+       * as/mcs51/asmain.c (asmbl): create a new area for every .org directive
+       * src/avr/main.c,
+       * src/ds390/main.c,
+       * src/hc08/main.c,
+       * src/mcs51/main.c,
+       * src/pic16/main.c,
+       * src/pic/main.c,
+       * src/xa51/main.c,
+       * src/z80/main.c,
+       * src/port.h: added xabs_name and iabs_name
+       * src/SDCCglue.c (emitRegularMap): allocate for absolutes with initializer
+         (glue, emitMaps): create and emit maps d_abs and i_abs
+       * src/SDCCglue.h: cosmetic changes
+       * src/SDCCmain.c (setDefaultOptions): idata can start below 0x80
+       * src/SDCCmem.h,
+       * src/SDCCmem.c (initMem): added x_abs, i_abs and d_abs
+         (allocDefault): put absolute, initialized globals in them
+       * support/regression/tests/absolute.c: added absolute bdata test
+       * device/lib/printf_large.c (output_float): moved fpBuffer to stack/xdata
+
 2006-12-20 Borut Razem <borut.razem AT siol.net>
 
        * support/cpp2/cpphash.h, support/cpp2/cpplex.c: fixed bug #982435
index a227b71f185f07cf5afb81e80f40b59c3966b4ca..e779836d28056b3600dada6502668bf377ed4ae0 100644 (file)
@@ -493,6 +493,8 @@ Addr_T lnksect2 (struct area *tap, int locIndex);
 char idatamap[256];
 unsigned long codemap[524288];
 unsigned long xdatamap[131072];
+struct area *dseg_ap = NULL;
+struct area *iseg_ap = NULL;
 
 /*Modified version of the functions for packing variables in internal data memory*/
 VOID lnkarea2 (void)
@@ -503,7 +505,7 @@ VOID lnkarea2 (void)
     char temp[NCPS];
     struct sym *sp;
     int j;
-    struct area *dseg_ap = NULL;
+    struct area *bseg_ap = NULL;
     struct area *abs_ap = NULL;
     struct area *gs0_ap = NULL;
     struct sym *sp_dseg_s=NULL, *sp_dseg_l=NULL;
@@ -534,8 +536,13 @@ VOID lnkarea2 (void)
     /* next accumulate all GSINITx/GSFINAL area sizes
        into GSINIT so they stay together */
     ap = areap;
+    abs_ap = areap;
     while (ap)
     {
+        if (ap->a_flag & A_ABS)
+        {
+            abs_ap = ap; /* Remember the last abs area */
+        }
         if (!strncmp(ap->a_id, "GS", 2))
         {/* GSxxxxx area */
             if (ap->a_size == 0)
@@ -553,6 +560,27 @@ VOID lnkarea2 (void)
                 gs0_ap = ap;
             }
         }
+        /*Since area BSEG is defined just before BSEG_BYTES, use the bit size of BSEG
+        to compute the byte size of BSEG_BYTES: */
+        else if (!strcmp(ap->a_id, "BSEG"))
+        {
+            bseg_ap = ap->a_ap;            //BSEG_BYTES
+            for (axp=ap->a_axp; axp; axp=axp->a_axp)
+                ap->a_size += axp->a_size;
+            bseg_ap->a_axp->a_size = ((ap->a_addr + ap->a_size + 7)/8); /*Bits to bytes*/
+            ap->a_ap = bseg_ap->a_ap;      //removed BSEG_BYTES from list
+            bseg_ap->a_ap = abs_ap->a_ap;
+            abs_ap->a_ap = bseg_ap;        //inserted BSEG_BYTES after abs
+            bseg_ap = ap;                  //BSEG
+        }
+        else if (!strcmp(ap->a_id, "DSEG"))
+        {
+            dseg_ap = ap; /*Need it later*/
+        }
+        else if (!strcmp(ap->a_id, "ISEG"))
+        {
+            iseg_ap = ap; /*Need it later*/
+        }
         ap = ap->a_ap;
     }
     if (gs0_ap)
@@ -582,6 +610,10 @@ VOID lnkarea2 (void)
             rloc[locIndex] = lnksect2(ap, locIndex);
         }
 
+        if (!strcmp(ap->a_id, "BSEG_BYTES"))
+        {
+            bseg_ap->a_addr = (ap->a_axp->a_addr - 0x20) * 8; /*Bytes to bits*/
+        }
         /*
          * Create symbols called:
          *  s_<areaname>    the start address of the area
@@ -595,7 +627,7 @@ VOID lnkarea2 (void)
 
             *temp = 's';
             sp = lkpsym(temp, 1);
-            sp->s_addr = ap->a_addr ;
+            sp->s_addr = ap->a_addr;
             sp->s_type |= S_DEF;
             if (!strcmp(ap->a_id, "DSEG")) sp_dseg_s=sp;
 
@@ -607,16 +639,6 @@ VOID lnkarea2 (void)
             if (!strcmp(ap->a_id, "DSEG")) sp_dseg_l=sp;
         }
 
-        /*Since area BSEG is defined just before BSEG_BYTES, use the bit size of BSEG
-        to compute the byte size of BSEG_BYTES: */
-        if (!strcmp(ap->a_id, "BSEG"))
-        {
-            ap->a_ap->a_axp->a_size = ((ap->a_addr + ap->a_size + 7)/8); /*Bits to bytes*/
-        }
-        else if (!strcmp(ap->a_id, "DSEG"))
-        {
-            dseg_ap=ap; /*Need it later to set its correct size*/
-        }
         ap = ap->a_ap;
     }
 
@@ -714,7 +736,7 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
 {
     register Addr_T size, addr;
     register struct areax *taxp;
-    int j, k, ramlimit;
+    int j, k, ramlimit, ramstart;
     char fchar=' ', dchar='a';
     char ErrMsg[]="?ASlink-Error-Could not get %d consecutive byte%s"
                   " in internal RAM for area %s.\n";
@@ -724,17 +746,27 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
     /*Notice that only ISEG and SSEG can be in the indirectly addressable internal RAM*/
     if( (!strcmp(tap->a_id, "ISEG")) || (!strcmp(tap->a_id, "SSEG")) )
     {
-        if((iram_size<=0)||(iram_size>0x100))
-            ramlimit=0x100;
+        if (iseg_ap)
+            ramstart = iseg_ap->a_addr;
         else
-            ramlimit=iram_size;
+            ramstart = 0;
+
+        if ((iram_size <= 0) || (ramstart + iram_size > 0x100))
+            ramlimit = 0x100;
+        else
+            ramlimit = ramstart + iram_size;
     }
     else
     {
-        if((iram_size<=0)||(iram_size>0x80))
-            ramlimit=0x80;
+        if (dseg_ap)
+            ramstart = dseg_ap->a_addr;
+        else
+            ramstart = 0;
+
+        if ((iram_size <= 0) || (ramstart + iram_size > 0x80))
+            ramlimit = 0x80;
         else
-            ramlimit=iram_size;
+            ramlimit = ramstart + iram_size;
     }
 
     size = 0;
@@ -790,28 +822,35 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
     {
         while (taxp)
         {
+            if(taxp->a_size == 0)
+            {
+                taxp = taxp->a_axp;
+                continue;
+            }
+
             if ( (fchar=='0')||(fchar=='1')||(fchar=='2')||(fchar=='3') ) /*Reg banks*/
             {
                 addr=(fchar-'0')*8;
                 taxp->a_addr=addr;
                 size=taxp->a_size;
-                for(j=addr; (j<(int)(addr+taxp->a_size)) && (j<ramlimit); j++)
+                for(j=addr; (j<(int)(addr+size)) && (j<ramlimit); j++)
                     idatamap[j]=fchar;
             }
             else if( (fchar=='S') || (fchar=='Q') ) /*Overlay and stack in internal RAM*/
             {
                 /*Find the size of the space currently used for this areax overlay*/
-                for(j=0, size=0; j<ramlimit; j++)
+                for(j=ramstart, size=0; j<ramlimit; j++)
                     if(idatamap[j]==fchar) size++;
 
                 if( (fchar=='S') && (stacksize==0) )
                 {
                    /*Search for the largest space available and use it for stack*/
-                    for(j=0, k=0, taxp->a_size=0; j<ramlimit; j++)
+                    for(j=ramstart, k=0, taxp->a_size=0; j<ramlimit; j++)
                     {
                         if(idatamap[j]==' ')
                         {
-                            if((++k)>(int)taxp->a_size) taxp->a_size=k;
+                            if((++k)>(int)taxp->a_size)
+                                taxp->a_size=k;
                         }
                         else
                         {
@@ -827,37 +866,26 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
                 {
                     size=(int)taxp->a_size;
 
-                    for(j=0; j<ramlimit; j++)
+                    for(j=ramstart; j<ramlimit; j++)
                         if(idatamap[j]==fchar) idatamap[j]=' ';
 
                     /*Search for a space large enough in data memory for this overlay areax*/
-                    for(j=0, k=0; j<ramlimit; j++)
+                    for(j=ramstart, k=0; j<ramlimit; j++)
                     {
                         if(idatamap[j]==' ')
                             k++;
                         else
                             k=0;
-                        if(k==(int)taxp->a_size) break;
-                    }
-
                     if(k==(int)taxp->a_size)
-                    {
-                        taxp->a_addr = j-k+1;
-                        if(addr<(unsigned int)ramlimit)
-                        {
-                            for(j=ramlimit-1; (j>=0)&&(idatamap[j]==' '); j--);
-                            if(j>=0) addr=j+1;
-                        }
+                            break;
                     }
 
                     /*Mark the memory used for overlay*/
                     if(k==(int)taxp->a_size)
                     {
-                        for(j=taxp->a_addr; (j<(int)(taxp->a_addr+taxp->a_size)) && (j<ramlimit); j++)
+                        addr = j-k+1;
+                        for(j=addr; (j<(int)(addr+size)); j++)
                             idatamap[j]=fchar;
-
-                        /*Set the new size of the data memory area*/
-                        size=ramlimit-addr;
                     }
                     else /*Couldn't find a chunk big enough: report the problem.*/
                     {
@@ -866,23 +894,12 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
                         lkerr++;
                     }
                 }
-
-                for(j=0; j<ramlimit; j++)
-                {
-                    if (idatamap[j]==fchar)
-                    {
-                        addr=j;
-                        tap->a_addr=addr;
-                        taxp->a_addr=addr;
-                        break;
-                    }
-                }
             }
             else if (fchar=='T') /*Bit addressable bytes in internal RAM*/
             {
                 /*Find the size of the space currently used for this areax overlay*/
-                for(j=0x20, size=0; j<0x30; j++)
-                    if(idatamap[j]==fchar) size++;
+//              for(j=0x20, size=0; j<0x30; j++)
+//                  if(idatamap[j]==fchar) size++;
 
                 /*If more space required, release the previously allocated areax in
                 internal RAM and search for a bigger one*/
@@ -900,27 +917,16 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
                             k++;
                         else
                             k=0;
-                        if(k==(int)taxp->a_size) break;
-                    }
-
-                    if(k==(int)taxp->a_size)
-                    {
-                        taxp->a_addr = j-k+1;
-                        if(addr<(unsigned int)0x30)
-                        {
-                            for(j=0x2F; (j>=0x20)&&(idatamap[j]==' '); j--);
-                            if(j>=0x20) addr=j+1;
-                        }
+                        if(k==(int)taxp->a_size)
+                            break;
                     }
 
                     /*Mark the memory used for overlay*/
-                    if(k==(int)taxp->a_size)
+                    if(k==(int)size)
                     {
-                        for(j=taxp->a_addr; (j<(int)(taxp->a_addr+taxp->a_size)) && (j<0x30); j++)
+                        addr = j-k+1;
+                        for(j=addr; (j<(int)(addr+size)); j++)
                             idatamap[j]=fchar;
-
-                        /*Set the new size of the data memory area*/
-                        size=ramlimit-addr;
                     }
                     else /*Couldn't find a chunk big enough: report the problem.*/
                     {
@@ -929,17 +935,6 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
                         lkerr++;
                     }
                 }
-
-                for(j=0x20; j<0x30; j++)
-                {
-                    if (idatamap[j]==fchar)
-                    {
-                        addr=j;
-                        tap->a_addr=addr;
-                        taxp->a_addr=addr;
-                        break;
-                    }
-                }
             }
             else /*Overlay areas not in internal ram*/
             {
@@ -948,6 +943,13 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
             }
             taxp = taxp->a_axp;
         }
+        /*Now set all overlayed areax to the same start address*/
+        taxp = tap->a_axp;
+        while (taxp)
+        {
+            taxp->a_addr = addr;
+            taxp = taxp->a_axp;
+        }
     }
     else if (tap->a_flag & A_ABS) /* Absolute sections */
     {
@@ -955,14 +957,19 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
         {
             if (locIndex == 0)
             {
-                for (j=taxp->a_addr; (j<(int)(taxp->a_addr+taxp->a_size)) && (j<ramlimit); j++)
-                    idatamap[j] = 'A';
+                for (j=taxp->a_addr; (j<(int)(taxp->a_addr+taxp->a_size)) && (j<256); j++)
+                {
+                    if (idatamap[j] == ' ')
+                        idatamap[j] = 'A';
+                    else
+                        fprintf(stderr, "memory overlap at 0x%X for %s\n", j, tap->a_id);
+                }
             }
-            if (locIndex == 1)
+            else if (locIndex == 1)
             {
                 allocate_space(taxp->a_addr, taxp->a_size, tap->a_id, codemap);
             }
-            if (locIndex == 2)
+            else if (locIndex == 2)
             {
                 allocate_space(taxp->a_addr, taxp->a_size, tap->a_id, xdatamap);
             }
@@ -988,24 +995,21 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
                 if(taxp->a_size)
                 {
                     /*Search for a space large enough in internal RAM for this areax*/
-                    for(j=0, k=0; j<ramlimit; j++)
+                    for(j=ramstart, k=0; j<ramlimit; j++)
                     {
                         if(idatamap[j]==' ')
                             k++;
                         else
                             k=0;
-                        if(k==(int)taxp->a_size) break;
+                        if(k==(int)taxp->a_size)
+                            break;
                     }
 
                     if(k==(int)taxp->a_size)
                     {
                         taxp->a_addr = j-k+1;
-                        if(addr<(unsigned int)ramlimit)
-                        {
-                            for(j=ramlimit-1; (j>=0)&&(idatamap[j]==' '); j--);
-                            if(j>=0) addr=j+1;
-                            size=ramlimit-addr;
-                        }
+
+                        size += taxp->a_size;
 
                         for(j=taxp->a_addr; (j<(int)(taxp->a_addr+taxp->a_size)) && (j<ramlimit); j++)
                             idatamap[j]=(fchar=='D')?dchar:fchar;
@@ -1028,12 +1032,30 @@ Addr_T lnksect2 (struct area *tap, int locIndex)
             {
                 if(taxp->a_size!=0)
                 {
-                    for(j=addr; j<((int)(addr+taxp->a_size)); j++)
+                    /*Search for a space large enough in data memory for this areax*/
+                    for(j=0x20, k=0; j<0x30; j++)
+                    {
+                        if(idatamap[j]==' ')
+                            k++;
+                        else
+                            k=0;
+                        if(k==(int)taxp->a_size) break;
+                    }
+
+                    /*Mark the memory used*/
+                    if(k==(int)taxp->a_size)
+                    {
+                        taxp->a_addr = j-k+1;
+                        for(j=taxp->a_addr; (j<(int)(taxp->a_addr+taxp->a_size)) && (j<0x30); j++)
                         idatamap[j]=fchar;
+                    }
+                    else /*Couldn't find a chunk big enough: report the problem.*/
+                    {
+                        tap->a_unaloc=taxp->a_size;
+                        fprintf(stderr, ErrMsg, taxp->a_size, taxp->a_size>1?"s":"", tap->a_id);
+                        lkerr++;
+                    }
                 }
-
-                taxp->a_addr = addr;
-                addr += taxp->a_size;
                 size += taxp->a_size;
                 taxp = taxp->a_axp;
             }
index 86d0da26690eced7f019a28a75d2355a081c1008..a333cceae75c6568295119f5308125a712a600c6 100644 (file)
@@ -483,6 +483,7 @@ asmbl()
        char fn[PATH_MAX];
        char *p;
        int d, n, uaf, uf;
+       static struct area *abs_ap; /* pointer to current absolute area structure */
 
        laddr = dot.s_addr;
        lmode = SLIST;
@@ -870,18 +871,31 @@ loop:
                }
                newdot(ap);
                lmode = SLIST;
+               if (dot.s_area->a_flag & A_ABS)
+                       abs_ap = ap;
                break;
 
        case S_ORG:
                if (dot.s_area->a_flag & A_ABS) {
-                       outall();
-                       dot.s_area->a_size += dot.s_addr - dot.s_org;
-                       laddr = dot.s_addr = dot.s_org = absexpr();
+                       char buf[NCPS];
+                       laddr = absexpr();
+                       sprintf(buf, "%s%x", abs_ap->a_id, laddr);
+                       if ((ap = alookup(buf)) == NULL) {
+                               ap = (struct area *) new (sizeof(struct area));
+                               *ap = *areap;
+                               ap->a_ap = areap;
+                               strncpy(ap->a_id, buf, NCPS);
+                               ap->a_ref = areap->a_ref + 1;
+                               ap->a_size = 0;
+                               ap->a_fuzz = 0;
+                               areap = ap;
+                       }
+                       newdot(ap);
+                       lmode = ALIST;
+                       dot.s_addr = dot.s_org = laddr;
                } else {
                        err('o');
                }
-               outall();
-               lmode = ALIST;
                break;
 
        case S_RADIX:
index 235015100226bbcbb0bb12f2652f7954da9bf3c7..7d42abc25f3b79692bebd9ad9dab5a953be01505 100644 (file)
@@ -211,6 +211,7 @@ output_float (float f, unsigned char reqWidth,
               pfn_outputchar output_char, void* p)
 {
   unsigned char charsOutputted = 0;
+  char fpBuffer[128];
 #else
 #define OUTPUT_FLOAT(F, W, D, L, Z, S, P)      output_float(F, W, D, L, Z, S, P)
 static void
@@ -218,11 +219,11 @@ output_float (float f, unsigned char reqWidth,
               signed char reqDecimals,
               BOOL left, BOOL zero, BOOL sign, BOOL space)
 {
+  xdata char fpBuffer[128];
 #endif //SDCC_STACK_AUTO
   BOOL negative = 0;
   unsigned long integerPart;
   float decimalPart;
-  char fpBuffer[128];
   char fpBI=0, fpBD;
   unsigned char minWidth, i;
 
index a4b8d4f8cf7a9891105d0afb1d8857bce73949db..704656eb518010f1f3e12b75cfed7ba4dce8ee6f 100644 (file)
@@ -281,7 +281,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
       /* if it has an initial value then do it only if
          it is a global variable */
       if (sym->ival && sym->level == 0) {
-        if (SPEC_OCLS(sym->etype)==xidata) {
+        if ((SPEC_OCLS(sym->etype)==xidata) && !SPEC_ABSA (sym->etype)) {
           /* create a new "XINIT (CODE)" symbol, that will be emitted later
              in the static seg */
           newSym=copySymbol (sym);
@@ -309,8 +309,6 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
               printIval (sym, sym->type, sym->ival, tmpFile);
               noAlloc--;
             }
-
-          sym->ival=NULL;
         } else {
           if (IS_AGGREGATE (sym->type)) {
             ival = initAggregates (sym, sym->ival, NULL);
@@ -338,12 +336,11 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
             allocInfo = 1;
           }
         }         
-        sym->ival = NULL;
       }
 
       /* if it has an absolute address then generate
          an equate for this no need to allocate space */
-      if (SPEC_ABSA (sym->etype))
+      if (SPEC_ABSA (sym->etype) && !sym->ival)
         {
           char *equ="=";
           if (options.debug) {
@@ -370,13 +367,17 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
           if (options.debug) {
             fprintf (map->oFile, "==.\n");
           }
+          if (SPEC_ABSA (sym->etype))
+            {
+              tfprintf (map->oFile, "\t!org\n", SPEC_ADDR (sym->etype));
+            }
           if (IS_STATIC (sym->etype) || sym->level)
             tfprintf (map->oFile, "!slabeldef\n", sym->rname);
           else
             tfprintf (map->oFile, "!labeldef\n", sym->rname);           
-          tfprintf (map->oFile, "\t!ds\n", 
-                    (unsigned int)  size & 0xffff);
+          tfprintf (map->oFile, "\t!ds\n", (unsigned int) size & 0xffff);
         }
+      sym->ival = NULL;
     }
 }
 
@@ -1346,6 +1347,8 @@ emitMaps (void)
      data, idata & bit & xdata */
   emitRegularMap (data, TRUE, TRUE);
   emitRegularMap (idata, TRUE, TRUE);
+  emitRegularMap (d_abs, TRUE, TRUE);
+  emitRegularMap (i_abs, TRUE, TRUE);
   emitRegularMap (bit, TRUE, TRUE);
   emitRegularMap (pdata, TRUE, TRUE);
   emitRegularMap (xdata, TRUE, TRUE);
@@ -1793,6 +1796,15 @@ glue (void)
     copyFile (asmFile, idata->oFile);
   }
 
+  /* create the absolute idata/data segment */
+  if ( (i_abs) && (mcs51_like) ) {
+    fprintf (asmFile, "%s", iComments2);
+    fprintf (asmFile, "; absolute internal ram data\n");
+    fprintf (asmFile, "%s", iComments2);
+    copyFile (asmFile, d_abs->oFile);
+    copyFile (asmFile, i_abs->oFile);
+  }
+
   /* copy the bit segment */
   if (mcs51_like) {
     fprintf (asmFile, "%s", iComments2);
index 0f078d2dae4e3ac6970a21204d05796f5c40f980..2113213cb608853b03af3e2e419d71efcb541ba8 100644 (file)
@@ -41,7 +41,6 @@ extern set *pipeSet;
 extern set *tmpfileNameSet;
 
 void rm_tmpfiles (void);
-int 
-pointerTypeToGPByte (const int p_type, const char *iname, const char *oname);
+int pointerTypeToGPByte (const int p_type, const char *iname, const char *oname);
 
 #endif
index a04aa579de21549c9ab99546e09bd3c08bc955ca..8e9f367ffaae8c2ecbe8e201d278cc86200ab663 100644 (file)
@@ -567,7 +567,7 @@ setDefaultOptions (void)
   options.code_loc = 0;           /* code starts at 0 */
   options.data_loc = 0;           /* JCF: By default let the linker locate data */
   options.xdata_loc = 0;
-  options.idata_loc = 0x80;
+  options.idata_loc = 0;          /* MB: No need to limit idata to 0x80-0xFF */
   options.nopeep = 0;
   options.model = port->general.default_model;
   options.nostdlib = 0;
@@ -679,7 +679,7 @@ processFile (char *s)
     }
 
   /* if the extention is type .rel or .r or .REL or .R
-     addtional object file will be passed to the linker */
+     additional object file will be passed to the linker */
   if (strcmp (fext, ".r") == 0 || strcmp (fext, ".rel") == 0 ||
       strcmp (fext, ".R") == 0 || strcmp (fext, ".REL") == 0 ||
       strcmp (fext, port->linker.rel_ext) == 0)
index 3be821aecc8012fe238d1ea340260d2e6f5f9c65..cb5833881fff1e37042a1e8f586359986bb25535 100644 (file)
@@ -17,6 +17,9 @@ memmap *idata = NULL;           /* internal data upto 256      */
 memmap *bit = NULL;             /* bit addressable space       */
 memmap *statsg = NULL;          /* the constant data segment   */
 memmap *c_abs = NULL;           /* constant absolute data      */
+memmap *x_abs = NULL;           /* absolute xdata/pdata        */
+memmap *i_abs = NULL;           /* absolute idata upto 256     */
+memmap *d_abs = NULL;           /* absolute data upto 128      */
 memmap *sfr = NULL;             /* register space              */
 memmap *reg = NULL;             /* register space              */
 memmap *sfrbit = NULL;          /* sfr bit space               */
@@ -135,7 +138,7 @@ initMem ()
      DEBUG-NAME     -   'C'
      POINTER-TYPE   -   CPOINTER
    */
-  home = allocMap (0, 1, 0, 0, 0, 1, options.code_loc, CODE_NAME, 'C', CPOINTER);
+  home = allocMap (0, 1, 0, 0, 0, 1, options.code_loc, HOME_NAME, 'C', CPOINTER);
 
   /* Static segment (code for variables );
      SFRSPACE       -   NO
@@ -173,6 +176,22 @@ initMem ()
    */
   data = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER);
 
+  /* Absolute internal storage segment ;
+     SFRSPACE       -   NO
+     FAR-SPACE      -   NO
+     PAGED          -   NO
+     DIRECT-ACCESS  -   YES
+     BIT-ACCESS     -   NO
+     CODE-ACCESS    -   NO
+     DEBUG-NAME     -   'E'
+     POINTER-TYPE   -   POINTER
+   */
+  if (IABS_NAME) {
+    d_abs = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, IABS_NAME, 'E', POINTER);
+  } else {
+    d_abs = NULL;
+  }
+
   /* overlay segment - same as internal storage segment ;
      SFRSPACE       -   NO
      FAR-SPACE      -   NO
@@ -236,6 +255,22 @@ initMem ()
     idata=NULL;
   }
 
+  /* Indirectly addressed absolute internal segment
+     SFRSPACE       -   NO
+     FAR-SPACE      -   NO
+     PAGED          -   NO
+     DIRECT-ACCESS  -   NO
+     BIT-ACCESS     -   NO
+     CODE-ACCESS    -   NO
+     DEBUG-NAME     -   'E'
+     POINTER-TYPE   -   IPOINTER
+   */
+  if (IABS_NAME) {
+    i_abs = allocMap (0, 0, 0, 0, 0, 0, options.data_loc, IABS_NAME, 'E', IPOINTER);
+  } else {
+    i_abs = NULL;
+  }
+
   /* Bit space ;
      SFRSPACE       -   NO
      FAR-SPACE      -   NO
@@ -343,7 +378,7 @@ allocDefault (symbol * sym)
       if (sym->_isparm)
         return FALSE;
       /* if code change to constant */
-      if (sym->ival && (sym->level==0) && SPEC_ABSA(sym->etype)) {
+      if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) {
         SPEC_OCLS(sym->etype) = c_abs;
       } else {
         SPEC_OCLS (sym->etype) = statsg;
@@ -352,17 +387,27 @@ allocDefault (symbol * sym)
     case S_XDATA:
       // should we move this to the initialized data segment?
       if (port->genXINIT &&
-          sym->ival && (sym->level==0) && !SPEC_ABSA(sym->etype)) {
+          sym->ival && (sym->level==0) && !SPEC_ABSA (sym->etype)) {
         SPEC_OCLS(sym->etype) = xidata;
       } else {
         SPEC_OCLS (sym->etype) = xdata;
       }
       break;
     case S_DATA:
-      SPEC_OCLS (sym->etype) = data;
+      /* absolute initialized global */
+      if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) {
+        SPEC_OCLS(sym->etype) = d_abs;
+      } else {
+        SPEC_OCLS (sym->etype) = data;
+      }
       break;
     case S_IDATA:
-      SPEC_OCLS (sym->etype) = idata;
+      /* absolute initialized global */
+      if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) {
+        SPEC_OCLS(sym->etype) = i_abs;
+      } else {
+        SPEC_OCLS (sym->etype) = idata;
+      }
       sym->iaccess = 1;
       break;
     case S_PDATA:
index a10d9e9bbffaae692e772a42e6ba0fde8fafa6dd..9b212424d6d996d2e0007df9f757b79a3d54ee62 100644 (file)
@@ -47,6 +47,8 @@ extern FILE *junkFile;
 #define  OVERLAY_NAME  port->mem.overlay_name
 #define  CONST_NAME    port->mem.const_name
 #define  CABS_NAME     port->mem.cabs_name
+#define  XABS_NAME     port->mem.xabs_name
+#define  IABS_NAME     port->mem.iabs_name
 
 /* forward definition for variables */
 extern memmap *xstack;         /* xternal stack data           */
@@ -61,13 +63,15 @@ extern memmap *idata;               /* internal data upto 256       */
 extern memmap *bit;            /* bit addressable space        */
 extern memmap *statsg;         /* static code segment          */
 extern memmap *c_abs;          /* constant absolute data       */
+extern memmap *x_abs;          /* absolute xdata/pdata         */
+extern memmap *i_abs;          /* absolute idata upto 256      */
+extern memmap *d_abs;          /* absolute data upto 128       */
 extern memmap *sfr;            /* register space               */
 extern memmap *sfrbit;         /* sfr bit space                */
 extern memmap *reg;            /* register space               */
 extern memmap *generic;                /* unknown                      */
 extern memmap *overlay;                /* the overlay segment          */
-extern memmap *eeprom;         /* eepromp space                */
-extern memmap *eeprom;         /* eepromp space                */
+extern memmap *eeprom;         /* eeprom space                 */
 extern memmap *home;           /* Non-banked home space        */
 
 extern int fatalError;
index c2ea6a0c73b9063700cfa7fb09d9afbf27482102..982bc5c5c1a3b002e1b54c6444fd5310c96478c7 100644 (file)
@@ -221,7 +221,10 @@ PORT avr_port = {
         "HOME",
         NULL, // initialized xdata
         NULL, // a code copy of xiseg
-        "CONST   (CODE)",              // const_name - const data (code or not)
+        "CONST   (CODE)",           // const_name - const data (code or not)
+        "CABS    (ABS,CODE)",       // cabs_name - const absolute data (code or not)
+        "XABS    (ABS,XDATA)",      // xabs_name - absolute xdata/pdata
+        "IABS    (ABS,DATA)",       // iabs_name - absolute idata/data
         NULL,
         NULL,
         0,
index dad9b7488824e013267a6e0fe56f8f2e80ac6313..11f515c3b07609282a1848f196e7e2345f9b4ef2 100644 (file)
@@ -883,6 +883,8 @@ PORT ds390_port =
     "XINIT   (CODE)",          // a code copy of xiseg
     "CONST   (CODE)",          // const_name - const data (code or not)
     "CABS    (ABS,CODE)",      // cabs_name - const absolute data (code or not)
+    "XABS    (ABS,XDATA)",     // xabs_name - absolute xdata/pdata
+    "IABS    (ABS,DATA)",      // iabs_name - absolute idata/data
     NULL,
     NULL,
     1
@@ -1200,6 +1202,8 @@ PORT tininative_port =
     NULL,
     "CONST   (CODE)",          // const_name - const data (code or not)
     "CABS    (ABS,CODE)",      // cabs_name - const absolute data (code or not)
+    "XABS    (ABS,XDATA)",     // xabs_name - absolute xdata/pdata
+    "IABS    (ABS,DATA)",      // iabs_name - absolute idata/data
     NULL,
     NULL,
     1
@@ -1433,6 +1437,8 @@ PORT ds400_port =
     "XINIT   (CODE)", // a code copy of xiseg
     "CONST   (CODE)",          // const_name - const data (code or not)
     "CABS    (ABS,CODE)",      // cabs_name - const absolute data (code or not)
+    "XABS    (ABS,XDATA)",     // xabs_name - absolute xdata/pdata
+    "IABS    (ABS,DATA)",      // iabs_name - absolute idata/data
     NULL,
     NULL,
     1
index b4f62c89c252ffc4501c1ecbccd5d49e05a84930..cd6eb0c021496647b5155a011f06c2407a6af886 100644 (file)
@@ -438,8 +438,10 @@ PORT hc08_port =
     "HOME (CODE)",
     "XISEG", // initialized xdata
     "XINIT", // a code copy of xiseg
-    "CONST   (CODE)", // const_name - const data (code or not)
+    "CONST   (CODE)",     // const_name - const data (code or not)
     "CABS    (ABS,CODE)", // cabs_name - const absolute data (code or not)
+    "XABS    (ABS)",      // xabs_name - absolute xdata
+    "IABS    (ABS)",      // iabs_name - absolute data
     NULL,
     NULL,
     1
index 6f122abc394f6b0093cd2e9458eac629bbcdc19b..8f7e4f61d29234eec69a22842c2027c043e8f76f 100644 (file)
@@ -755,6 +755,8 @@ PORT mcs51_port =
     "XINIT   (CODE)",           // xinit_name - a code copy of xiseg
     "CONST   (CODE)",           // const_name - const data (code or not)
     "CABS    (ABS,CODE)",       // cabs_name - const absolute data (code or not)
+    "XABS    (ABS,XDATA)",      // xabs_name - absolute xdata/pdata
+    "IABS    (ABS,DATA)",       // iabs_name - absolute idata/data
     NULL,
     NULL,
     1
index ad5e3b300b01d21bc41ef22d04c4eccabd1ebc95..40a130b351bffe7386a6723d433737e9d67d0922 100644 (file)
@@ -512,6 +512,8 @@ PORT pic_port =
                NULL, // xinit
                "CONST   (CODE)",               // const_name - const data (code or not)
                "CABS    (ABS,CODE)",   // cabs_name - const absolute data (code or not)
+               "XABS    (ABS,XDATA)",  // xabs_name - absolute xdata
+               "IABS    (ABS,DATA)",   // iabs_name - absolute data
                NULL,
                NULL,
                1        // code is read only
index 2a6e06784e1faffa6a125a2342dd8a432612e110..ba45634fe6d3bc73370f4d1ce29713a45462fd26 100644 (file)
@@ -1281,6 +1281,8 @@ PORT pic16_port =
     NULL,                      // xinit
     "CONST   (CODE)",          // const_name - const data (code or not)
     "CABS    (ABS,CODE)",      // cabs_name - const absolute data (code or not)
+    "XABS    (ABS,XDATA)",     // xabs_name - absolute xdata
+    "IABS    (ABS,DATA)",      // iabs_name - absolute data
     NULL,                      // default location for auto vars
     NULL,                      // default location for global vars
     1                          // code is read only 1=yes
index 0b0ae7580e45a6c8109c2a5807fe23508dc047e4..e07d7a95ee00eda51d910c82275240e18723fc39 100644 (file)
@@ -38,9 +38,9 @@
 /* definition of builtin functions */
 typedef struct builtins
   {
-    char *name;                 /* name of builtin function */
-    char *rtype;                /* return type as string : see typefromStr */
-    int  nParms;                /* number of parms : max 8 */
+    char *name;                         /* name of builtin function */
+    char *rtype;                        /* return type as string : see typefromStr */
+    int  nParms;                        /* number of parms : max 8 */
     char *parm_types[MAX_BUILTIN_ARGS]; /* each parm type as string : see typeFromStr */
   } builtins;
 
@@ -180,6 +180,8 @@ typedef struct
         const char *xinit_name; // a code copy of xidata
         const char *const_name; // const data (code or not)
         const char *cabs_name; // const absolute data (code or not)
+       const char *xabs_name; // absolute xdata/pdata
+       const char *iabs_name; // absolute idata/data
         struct memmap *default_local_map; // default location for auto vars
         struct memmap *default_globl_map; // default location for globl vars
         int code_ro;            /* code space read-only 1=yes */
index d7353dee9ae108f1c6b9460770fded58b6bd0853..5ec0b74b448d06ae915aeca13e3212856ebf2337 100755 (executable)
@@ -289,6 +289,8 @@ PORT xa51_port =
     "XINIT   (CODE)", // a code copy of xiseg
     "CONST   (CODE)",          // const_name - const data (code or not)
     "CABS    (ABS,CODE)",      // cabs_name - const absolute data (code or not)
+    "XABS    (ABS,XDATA)",     // xabs_name - absolute xdata
+    "IABS    (ABS,DATA)",      // iabs_name - absolute data
     NULL, // default local map
     NULL, // default global map
     1
index 17451417a6272194d4b4f740044a0c9e1dc70157..0a5592a157de6ed9e2f36fc540b8089cb5f2d0f6 100644 (file)
@@ -678,6 +678,8 @@ PORT z80_port =
     NULL, /* xinit */
     NULL, /* const_name */
     "CABS", /* cabs_name */
+    NULL, /* xabs_name */
+    NULL, /* iabs_name */
     NULL,
     NULL,
     1
@@ -798,6 +800,8 @@ PORT gbz80_port =
     NULL, /* xinit */
     NULL, /* const_name */
     "CABS", /* cabs_name */
+    NULL, /* xabs_name */
+    NULL, /* iabs_name */
     NULL,
     NULL,
     1
index 40f35d2c44f22187ba1875919e765abdc66e9f8b..528ea543a519b5e0a05d8493f3b1e5fb345b35a2 100644 (file)
@@ -24,3 +24,21 @@ testAbsolute(void)
   ASSERT(pI[0] == 0x1234);\r
 #endif\r
 }\r
+\r
+#if defined(SDCC_mcs51) || defined(SDCC_ds390)\r
+volatile data at(0x20) unsigned char Byte0 = 0x00;\r
+volatile data at(0x22) unsigned char Byte1 = 0x00;\r
+volatile bit Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Bit8;\r
+#endif\r
+\r
+void\r
+testAbsBdata(void)\r
+{\r
+#if defined(SDCC_mcs51) || defined(SDCC_ds390)\r
+  Bit0 = 1;\r
+  ASSERT(Byte0 == 0x00);\r
+  Byte0 = 0xFF;\r
+  Bit0 = 0;\r
+  ASSERT(Byte0 == 0xFF);\r
+#endif\r
+}\r