Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-------------------------------------------------------------------------*/
+#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define EQ(A,B) !strcmp((A),(B))
#define MEMSIZE 0x10000
-#define DODUMP 1
+//#define DODUMP 1
typedef struct
{
{
int j;
- if(dflag)
+ if((dflag) && (!rflag))
{
infn=realloc(infn, sizeof(_infn)*(numin+1));
{
char DumpFileName[PATH_MAX];
FILE * DumpFile;
- int j;
+ int j, k;
strcpy(DumpFileName, infn[0].PathName);
strcat(DumpFileName, ".d51");
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++)
{
/*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*/
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)
{
/* 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':
&AddressSpace, &c,
&OnStack, &c,
&StackOffset);
-
+
i=-1; k=-1;
switch(scope[2])
{
{
case 'C': /*Code*/
case 'D': /*Code/static segment*/
+ case 'Z': /*Functions and undefined code space*/
symbol[numsym].UsageType=0x40;
break;
case 'E': /*Internal ram (lower 128) bytes*/
case 'I': /*SFR space*/
+ case 'R': /*Register Space*/
symbol[numsym].UsageType=0x42;
break;
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++;
}
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*/
{
symbol[numsym].Address=-1;/*Collected later*/
numsym++;
}
-
break;
case 'L':
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))
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;
}
}
void CreateAOMF51(void)
{
- if(dflag)
+ if((dflag) && (!rflag))
{
CollectInfoFromCDB();
#ifdef DODUMP