* as/hc08/lkaomf51.c (OutputName),
[fw/sdcc] / as / mcs51 / lkaomf51.c
index e7933fe962a5afe237a9a6c9819835e7bb1825f4..7e6503177c03f09a5ad32888e43d073f4be411ac 100644 (file)
@@ -18,6 +18,7 @@
    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 -------------------------------------------------------------------------*/
 
+#include <ctype.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -25,7 +26,7 @@
 
 #define EQ(A,B) !strcmp((A),(B))
 #define MEMSIZE 0x10000
-#define DODUMP 1
+//#define DODUMP 1
 
 typedef struct
 {
@@ -73,7 +74,7 @@ typedef struct
 
 int numlinenum=0;
 _linenum * linenum=NULL;
-
+#if 0
 typedef struct
 {
        char * name;
@@ -85,6 +86,12 @@ _UsageType UsageType[]=
 {
        {"CSEG",                0},
        {"GSINIT",              0},
+       {"GSINIT0",             0},
+       {"GSINIT1",             0},
+       {"GSINIT2",             0},
+       {"GSINIT3",             0},
+       {"GSINIT4",             0},
+       {"GSINIT5",             0},
        {"GSFINAL",             0},
        {"HOME",                0},
        {"XINIT",               0},
@@ -101,7 +108,7 @@ _UsageType UsageType[]=
        {"BSEG",                4},
        {"",                    5} /*A typeless number?*/
 };
-
+#endif
 char * UsageTypeName[]={"CODE", "XDATA", "DATA", "IDATA", "BIT", "NUMBER"};
 int AddNumber;
 unsigned char * ihxBuff=NULL;
@@ -124,7 +131,7 @@ void SaveLinkedFilePath(char * filepath)
 {
        int j;
 
-       if(dflag)
+       if((dflag) && (!rflag))
        {
                infn=realloc(infn, sizeof(_infn)*(numin+1));
 
@@ -221,7 +228,7 @@ void DumpForDebug (void)
 {
        char DumpFileName[PATH_MAX];
        FILE * DumpFile;
-       int j;
+       int j, k;
 
        strcpy(DumpFileName, infn[0].PathName);
        strcat(DumpFileName, ".d51");
@@ -237,14 +244,15 @@ void DumpForDebug (void)
 
        for(j=0; j<numsym; j++)
        {
+               k=symbol[j].UsageType&0xf;
                fprintf(DumpFile, "%s, %s, %s, 0x%04x, %s\n",
                        symbol[j].name,
                        infn[symbol[j].FileNameNumber].PathName,
                        (symbol[j].Procedure>=0)?procedure[symbol[j].Procedure].name:"GLOBAL",
                        symbol[j].Address,
-                       UsageTypeName[symbol[j].UsageType&0xf]);
+                       k<6?UsageTypeName[k]:"???");
        }
-
+       
        fprintf(DumpFile,"\nPROCEDURES:\n");
        for(j=0; j<numproc; j++)
        {
@@ -376,6 +384,7 @@ void OutputAOEMF51(void)
 
                                /*Content Record*/
                                OutputByte(0x06);/*REC TYPE*/
+                               if(procedure[k].EndAdd==-1) procedure[k].EndAdd=HexSize;
                                recsize=procedure[k].EndAdd-procedure[k].BeginAdd+1+4;
                                OutputWord(recsize);/*Record Length*/
                                OutputByte(0x00);/*SEG ID*/
@@ -461,21 +470,29 @@ void OutputAOEMF51(void)
 
        for(j=-1; j<numproc; j++)
        {
-               if(j==-1)
+               if(numproc)
                {
-                       i=HexBegin;
-                       k=procedure[0].BeginAdd;
+                       if(j==-1)
+                       {
+                               i=HexBegin;
+                               k=procedure[0].BeginAdd;
+                       }
+                       else if(j==(numproc-1))
+                       {
+                               i=procedure[j].EndAdd+1;
+                               k=HexSize;
+                       }
+                       else
+                       {
+                               i=procedure[j].EndAdd+1;
+                               k=procedure[j+1].BeginAdd;
+                       }
                }
-               else if(j==(numproc-1))
+               else /*What, no procedures??? Ok, here it is the whole hex file*/
                {
-                       i=procedure[j].EndAdd+1;
+                       i=HexBegin;
                        k=HexSize;
                }
-               else
-               {
-                       i=procedure[j].EndAdd+1;
-                       k=procedure[j+1].BeginAdd;
-               }
 
                if(i<k)
                {
@@ -565,6 +582,8 @@ void CollectInfoFromCDB(void)
                        /* Example:
                        "S:G$actual$0$0({7}ST__00010000:S),E,0,0"
                        "S:Lmain$j$1$1({2}SI:S),E,0,0"
+                       "S:G$DS1306_Reset_SPI$0$0({2}DF,SV:S),C,0,0"
+                       "S:G$main$0$0({2}DF,SV:S),C,0,0"
                        */
 
                        case 'S':
@@ -580,7 +599,7 @@ void CollectInfoFromCDB(void)
                                           &AddressSpace, &c,
                                           &OnStack, &c, 
                                           &StackOffset);
-                               
+
                                i=-1; k=-1;
                                switch(scope[2])
                                {
@@ -622,6 +641,7 @@ void CollectInfoFromCDB(void)
                                        {
                                                case 'C': /*Code*/ 
                                                case 'D': /*Code/static segment*/ 
+                                               case 'Z': /*Functions and undefined code space*/ 
                                                        symbol[numsym].UsageType=0x40;
                                                break;
 
@@ -632,6 +652,7 @@ void CollectInfoFromCDB(void)
 
                                                case 'E': /*Internal ram (lower 128) bytes*/ 
                                                case 'I': /*SFR space*/ 
+                                               case 'R': /*Register Space*/ 
                                                        symbol[numsym].UsageType=0x42;
                                                break;
 
@@ -644,6 +665,10 @@ void CollectInfoFromCDB(void)
                                                case 'J': /*SBIT space*/ 
                                                        symbol[numsym].UsageType=0x44;
                                                break;
+                                               
+                                               default:
+                                                       printf("Unknown scope information for: %s, AddressSpace:%c\n", symbol[numsym].name, AddressSpace);
+                                               break;
                                        }
                                        numsym++;
                                }
@@ -669,7 +694,7 @@ void CollectInfoFromCDB(void)
                                        procedure[numproc].EndAdd=-1;/*To be collected latter*/
                                        numproc++;
                                }
-
+                               
                                /*This function name is also a global symbol*/
                                for(j=0; j<numsym; j++)/*A global symbol may have been already defined*/
                                {
@@ -683,9 +708,9 @@ void CollectInfoFromCDB(void)
                                        symbol[numsym].UsageType=0x00;/*A procedure name symbol*/
                                        symbol[numsym].Procedure=-1; /*Global symbol*/
                                        symbol[numsym].Address=-1;/*Collected later*/
+                                       symbol[numsym].Static=-1; // o_gloom
                                        numsym++;
                                }
-
                        break;
 
                        case 'L':
@@ -694,7 +719,7 @@ void CollectInfoFromCDB(void)
                                        case 'G': /*Example L:G$P0$0$0:80*/
                                                sscanf(buff, "%[^$] %c %[^$] %c %[^:] %c %x",
                                                        scope, &c, name, &c, level, &c, &Address);
-                                               
+
                                                for(j=0; j<numsym; j++)
                                                {
                                                        if(EQ(symbol[j].name, name))
@@ -702,21 +727,23 @@ void CollectInfoFromCDB(void)
                                                                if( (symbol[j].Address==-1) && (symbol[j].Procedure==-1) )
                                                                {
                                                                        symbol[j].Address=Address;
-                                                                       /*If the symbol is the name of a procedure, the address is also
-                                                                       the begining of such procedure*/
-                                                                       if(symbol[j].UsageType==0x00)
+                                                               }
+                                                               
+                                                               /*If the symbol is the name of a procedure, the address is also
+                                                               the begining of such procedure*/
+                                                               if((symbol[j].UsageType&0x0f)==0x00)
+                                                               {
+                                                                       for(k=0; k<numproc; k++)
                                                                        {
-                                                                               for(k=0; k<numproc; k++)
+                                                                               if(EQ(symbol[j].name, procedure[k].name))
                                                                                {
-                                                                                       if(EQ(symbol[j].name, procedure[k].name))
-                                                                                       {
-                                                                                               if(procedure[k].BeginAdd==-1)
-                                                                                                       procedure[k].BeginAdd=Address;
-                                                                                               break;
-                                                                                       }
+                                                                                       if(procedure[k].BeginAdd==-1)
+                                                                                               procedure[k].BeginAdd=Address;
+                                                                                       break;
                                                                                }
                                                                        }
                                                                }
+                                                               
                                                                break;
                                                        }
                                                }
@@ -849,12 +876,12 @@ void CollectInfoFromCDB(void)
        fclose(CDBin);
 }
 
-int hex2dec (char hex_digit)
+int hex2dec (unsigned char hex_digit)
 {
-   int j;
-   j=toupper(hex_digit)-'0';
-   if (j>9) j -= 7;
-   return j;
+   if (isdigit (hex_digit))
+      return hex_digit-'0';
+   else
+      return toupper (hex_digit)-'A'+10;
 }
 
 unsigned char GetByte(char * buffer)
@@ -947,7 +974,7 @@ int ReadHexFile(int * Begin)
 
 void CreateAOMF51(void)
 {
-       if(dflag)
+       if((dflag) && (!rflag))
        {
                CollectInfoFromCDB();
                #ifdef DODUMP