{
#define EQ(A,B) !strcmpi((A),(B))
#define MIN_STACK 16
- #define REPORT_ERROR(A) { fprintf(of, "%s", (A)); \
- printf("%s", (A)); \
- toreturn=1; }
+ #define REPORT_ERROR(A, H) \
+ {\
+ fprintf(of, "%s%s", (H)?"*** ERROR: ":"", (A)); \
+ fprintf(stderr, "%s%s", (H)?"\n?ASlink-Error-":"",(A)); \
+ toreturn=1; \
+ }
- #define REPORT_WARNING(A) { fprintf(of, "%s", (A)); \
- printf("%s", (A));}
+ #define REPORT_WARNING(A, H) \
+ { \
+ fprintf(of, "%s%s", (H)?"*** WARNING: ":"", (A)); \
+ fprintf(stderr, "%s%s",(H)?"\n?ASlink-Warning-":"", (A)); \
+ }
char buff[128];
int j, toreturn=0;
FILE * of;
/*Artifacts used for printing*/
- char start[8], end[8], size[8];
- char format[]=" %-20.20s %-7.7s %-7.7s %-7.7s\n";
+ char start[8], end[8], size[8], max[8];
+ char format[]=" %-16.16s %-7.7s %-7.7s %-7.7s %-7.7s\n";
char line[]="---------------------";
typedef struct
{
unsigned int Start;
unsigned int Size;
+ unsigned int Max;
char Name[NCPS];
unsigned int flag;
} _Mem;
unsigned int dram[0x100];
_Mem Ram[]={
- {0, 8, "REG_BANK_0", 0x0001},
- {0x8, 8, "REG_BANK_1", 0x0002},
- {0x10, 8, "REG_BANK_2", 0x0004},
- {0x18, 8, "REG_BANK_3", 0x0008},
- {0x20, 0, "BSEG_BYTES", 0x0010},
- {0, 0, "UNUSED", 0x0000},
- {0x7f, 0, "DATA", 0x0020},
- {0, 0, "TOTAL:", 0x0000}
+ {0, 8, 8, "REG_BANK_0", 0x0001},
+ {0x8, 8, 8, "REG_BANK_1", 0x0002},
+ {0x10, 8, 8, "REG_BANK_2", 0x0004},
+ {0x18, 8, 8, "REG_BANK_3", 0x0008},
+ {0x20, 0, 16, "BSEG_BYTES", 0x0010},
+ {0, 0, 128, "UNUSED", 0x0000},
+ {0x7f, 0, 128, "DATA", 0x0020},
+ {0, 0, 128, "TOTAL:", 0x0000}
};
- _Mem IRam= {0xff, 0, "INDIRECT RAM", 0x0080};
- _Mem Stack={0xff, 0, "STACK", 0x0000};
- _Mem XRam= {0xffff, 0, "EXTERNAL RAM", 0x0100};
- _Mem Rom= {0xffff, 0, "ROM/EPROM/FLASH", 0x0200};
+ _Mem IRam= {0xff, 0, 128, "INDIRECT RAM", 0x0080};
+ _Mem Stack={0xff, 0, 1, "STACK", 0x0000};
+ _Mem XRam= {0xffff, 0, 65536, "EXTERNAL RAM", 0x0100};
+ _Mem Rom= {0xffff, 0, 65536, "ROM/EPROM/FLASH", 0x0200};
+
+ if((iram_size<=0)||(iram_size>0x100)) /*Default: 8052 like memory*/
+ {
+ Ram[5].Max=0x80;
+ Ram[6].Max=0x80;
+ Ram[7].Max=0x80;
+ IRam.Max=0x80;
+ iram_size=0x100;
+ }
+ else if(iram_size<0x80)
+ {
+ Ram[5].Max=iram_size;
+ Ram[6].Max=iram_size;
+ Ram[7].Max=iram_size;
+ IRam.Max=0;
+ }
+ else
+ {
+ Ram[5].Max=0x80;
+ Ram[6].Max=0x80;
+ Ram[7].Max=0x80;
+ IRam.Max=iram_size-0x80;
+ }
- for(j=0; j<0x100; j++) dram[j]=0;
+ for(j=0; j<(int)iram_size; j++) dram[j]=0;
+ for(; j<0x100; j++) dram[j]=0x8000; /*Memory not available*/
/* Open Memory Summary File*/
of = afile(linkp->f_idp, "mem", 1);
/*Report the Ram totals*/
fprintf(of, "Direct Internal RAM:\n");
- fprintf(of, format, "Name", "Start", "End", "Size");
+ fprintf(of, format, "Name", "Start", "End", "Size", "Max");
for(j=0; j<8; j++)
{
- if((j==0) || (j==7)) fprintf(of, format, line, line, line, line);
+ if((j==0) || (j==7)) fprintf(of, format, line, line, line, line, line);
if((j!=5) || (Ram[j].Size>0))
{
sprintf(start, "0x%02x", Ram[j].Start);
else
sprintf(end, "0x%02x", j==7?Total_Last:Ram[j].Size+Ram[j].Start-1);
sprintf(size, "%5u", Ram[j].Size);
- fprintf(of, format, Ram[j].Name, start, end, size);
+ sprintf(max, "%5u", Ram[j].Max);
+ fprintf(of, format, Ram[j].Name, start, end, size, max);
}
}
{
if(dram[k]!=Ram[6].flag)
{
- sprintf(buff, "*** ERROR: There is a memory overlap starting at 0x%02x.\n", k);
- REPORT_ERROR(buff);
+ sprintf(buff, "Internal memory overlap starting at 0x%02x.\n", k);
+ REPORT_ERROR(buff, 1);
break;
}
}
- if((Ram[6].Start+Ram[6].Size)>0x80)
+ if(Ram[4].Size>Ram[4].Max)
{
- sprintf(buff, "*** ERROR: Insuficient DRAM memory. "
- "%d byte%s short.\n", (Ram[6].Start+Ram[6].Size)-0x80,
- ((Ram[6].Start+Ram[6].Size)==1)?"":"s");
- REPORT_ERROR(buff);
+ k=Ram[4].Size-Ram[4].Max;
+ sprintf(buff, "Insufficient bit addressable memory. "
+ "%d byte%s short.\n", k, (k==1)?"":"s");
+ REPORT_ERROR(buff, 1);
}
if(Ram[5].Size!=0)
{
- sprintf(buff, "*** WARNING: %d bytes in DRAM wasted. "
- "Link could use: --data-loc 0x%02x\n",
+ sprintf(buff, "%d bytes in DRAM wasted. "
+ "SDCC link could use: --data-loc 0x%02x\n",
Ram[5].Size, Ram[6].Start-Ram[5].Size);
- REPORT_WARNING(buff);
+ REPORT_WARNING(buff, 1);
+ }
+
+ if((Ram[6].Start+Ram[6].Size)>Ram[6].Max)
+ {
+ k=(Ram[6].Start+Ram[6].Size)-Ram[6].Max;
+ sprintf(buff, "Insufficient DRAM memory. "
+ "%d byte%s short.\n", k, (k==1)?"":"s");
+ REPORT_ERROR(buff, 1);
}
/*Report the position of the begining of the stack*/
fprintf(of, "\nStack starts at: 0x%02x", Stack.Start);
/*Check that the stack pointer is landing in a safe place:*/
- if(dram[Stack.Start])
+ if( (dram[Stack.Start] & 0x8000) == 0x8000 )
+ {
+ fprintf(of, ".\n");
+ sprintf(buff, "Stack set to unavailable memory.\n");
+ REPORT_ERROR(buff, 1);
+ }
+ else if(dram[Stack.Start])
{
fprintf(of, ".\n");
- sprintf(buff, "*** ERROR: Stack overlaps area ");
- REPORT_ERROR(buff);
+ sprintf(buff, "Stack overlaps area ");
+ REPORT_ERROR(buff, 1);
for(j=0; j<7; j++)
{
if(dram[Stack.Start]&Ram[j].flag)
{
sprintf(buff, "'%s'\n", IRam.Name);
}
- REPORT_ERROR(buff);
+ REPORT_ERROR(buff, 0);
}
else
{
- for(j=Stack.Start, k=0; (j<0x100)&&(dram[j]==0); j++, k++);
+ for(j=Stack.Start, k=0; (j<(int)iram_size)&&(dram[j]==0); j++, k++);
fprintf(of, " with %d bytes available\n", k);
if (k<MIN_STACK)
{
- sprintf(buff, "*** WARNING: Only %d byte%s available for stack.\n",
+ sprintf(buff, "Only %d byte%s available for stack.\n",
k, (k==1)?"":"s");
- REPORT_WARNING(buff);
+ REPORT_WARNING(buff, 1);
}
}
fprintf(of, "\nOther memory:\n");
- fprintf(of, format, "Name", "Start", "End", "Size");
- fprintf(of, format, line, line, line, line);
+ fprintf(of, format, "Name", "Start", "End", "Size", "Max");
+ fprintf(of, format, line, line, line, line, line);
/*Report IRam totals:*/
sprintf(start, "0x%02x", IRam.Start);
else
sprintf(end, "0x%02x", IRam.Size+IRam.Start-1);
sprintf(size, "%5u", IRam.Size);
- fprintf(of, format, IRam.Name, start, end, size);
+ sprintf(max, "%5u", IRam.Max);
+ fprintf(of, format, IRam.Name, start, end, size, max);
/*Report XRam totals:*/
sprintf(start, "0x%04x", XRam.Start);
else
sprintf(end, "0x%04x", XRam.Size+XRam.Start-1);
sprintf(size, "%5u", XRam.Size);
- fprintf(of, format, XRam.Name, start, end, size);
+ sprintf(max, "%5u", XRam.Max);
+ fprintf(of, format, XRam.Name, start, end, size, max);
/*Report Rom/Flash totals:*/
sprintf(start, "0x%04x", Rom.Start);
else
sprintf(end, "0x%04x", Rom.Size+Rom.Start-1);
sprintf(size, "%5u", Rom.Size);
- fprintf(of, format, Rom.Name, start, end, size);
+ sprintf(max, "%5u", Rom.Max);
+ fprintf(of, format, Rom.Name, start, end, size, max);
/*Report any excess:*/
- if(IRam.Size>0x80)
+ if((IRam.Start+IRam.Size)>(IRam.Max+0x80))
{
- sprintf(buff, "*** ERROR: Insuficient INDIRECT RAM memory.\n");
- REPORT_ERROR(buff);
+ sprintf(buff, "Insufficient INDIRECT RAM memory.\n");
+ REPORT_ERROR(buff, 1);
}
- if(XRam.Size>0x10000)
+ if((XRam.Start+XRam.Size)>XRam.Max)
{
- sprintf(buff, "*** ERROR: Insuficient EXTERNAL RAM memory.\n");
- REPORT_ERROR(buff);
+ sprintf(buff, "Insufficient EXTERNAL RAM memory.\n");
+ REPORT_ERROR(buff, 1);
}
- if(Rom.Size>0x10000)
+ if((Rom.Start+Rom.Size)>Rom.Max)
{
- sprintf(buff, "*** ERROR: Insuficient ROM/EPROM/FLASH memory.\n");
- REPORT_ERROR(buff);
+ sprintf(buff, "Insufficient ROM/EPROM/FLASH memory.\n");
+ REPORT_ERROR(buff, 1);
}
fclose(of);