#include "SDCCmacro.h"
#include "MySystem.h"
#include "glue.h"
+#include "dbuf_string.h"
+#include <errno.h>
//#include "gen.h"
pic14_options_t pic14_options;
+#define ARG_STACKLOC "--stack-loc"
+#define ARG_STACKSIZ "--stack-size"
+
extern int debug_verbose; /* from pcode.c */
static OPTION _pic14_poptions[] = {
{ 0 , "--debug-xtra", &debug_verbose, "show more debug info in assembly output" },
{ 0 , "--no-pcode-opt", &pic14_options.disable_df, "disable (slightly faulty) optimization on pCode" },
+ { 0 , ARG_STACKLOC, NULL, "sets the lowest address of the argument passing stack" },
+ { 0 , ARG_STACKSIZ, NULL, "sets the size if the argument passing stack (default: 16, minimum: 4)" },
{ 0 , NULL, NULL, NULL }
};
return 1;
}
-static int
-_process_pragma(const char *sz)
-{
- static const char *WHITE = " \t";
- char *ptr = strtok((char *)sz, WHITE);
-
- if (startsWith (ptr, "memmap"))
- {
- char *start;
- char *end;
- char *type;
- char *alias;
-
- start = strtok((char *)NULL, WHITE);
- end = strtok((char *)NULL, WHITE);
- type = strtok((char *)NULL, WHITE);
- alias = strtok((char *)NULL, WHITE);
-
- if (start != (char *)NULL
- && end != (char *)NULL
- && type != (char *)NULL) {
- value *startVal = constVal(start);
- value *endVal = constVal(end);
- value *aliasVal;
- memRange r;
-
- if (alias == (char *)NULL) {
- aliasVal = constVal(0);
- } else {
- aliasVal = constVal(alias);
- }
-
- r.start_address = (int)floatFromVal(startVal);
- r.end_address = (int)floatFromVal(endVal);
- r.alias = (int)floatFromVal(aliasVal);
- r.bank = (r.start_address >> 7) & 3;
-
- if (strcmp(type, "RAM") == 0) {
- addMemRange(&r, 0);
- } else if (strcmp(type, "SFR") == 0) {
- addMemRange(&r, 1);
- } else {
- return 1;
- }
- }
-
- return 0;
- } else if (startsWith (ptr, "maxram")) {
- // not used any more - comes from device config file pic14devices.txt instead
- return 0;
- }
- return 1;
-}
-
extern char *udata_section_name;
static bool
if(!strncmp(buf, argv[ *i ], strlen(buf))) {
if(strlen(argv[ *i ]) <= strlen(buf)+1) {
fprintf(stderr, "WARNING: no `%s' entered\n", buf+2);
- exit(-1);
+ exit(EXIT_FAILURE);
} else {
udata_section_name = strdup( strchr(argv[*i], '=') + 1 );
}
if(!name) {
- name = "p16f877";
+ name = "16f877";
fprintf(stderr,"WARNING: No Pic has been selected, defaulting to %s\n",name);
}
- fprintf (of, "\tlist\tp=%s\n",&name[1]);
+ fprintf (of, "\tlist\tp=%s\n",name);
fprintf (of, "\tradix dec\n");
- fprintf (of, "\tinclude \"%s.inc\"\n",name);
+ fprintf (of, "\tinclude \"p%s.inc\"\n",name);
}
/* Generate interrupt vector table. */
static int
-_pic14_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts)
+_pic14_genIVT (struct dbuf_s * oBuf, symbol ** interrupts, int maxInterrupts)
{
int i;
return FALSE;
}
- fprintf (of, "\t;ajmp\t__sdcc_gsinit_startup\n");
+ dbuf_printf (oBuf, "\t;ajmp\t__sdcc_gsinit_startup\n");
/* now for the other interrupts */
for (i = 0; i < maxInterrupts; i++)
{
if (interrupts[i])
{
- fprintf (of, "\t;ljmp\t%s\n\t.ds\t4\n", interrupts[i]->rname);
+ dbuf_printf (oBuf, "\t;ljmp\t%s\n\t.ds\t4\n", interrupts[i]->rname);
}
else
{
- fprintf (of, "\t;reti\n\t.ds\t7\n");
+ dbuf_printf (oBuf, "\t;reti\n\t.ds\t7\n");
}
}
*/
static const char *_linkCmd[] =
{
- "gplink", "$l", "-o \"$2\"", "\"$1\"", "$3", NULL
+ "gplink", "$l", "-w", "-r", "-o \"$2\"", "\"$1\"", "$3", NULL
};
static const char *_asmCmd[] =
char temp[128];
set *tSet=NULL;
int ret;
+ char * procName;
/*
* link command format:
*
*/
- sprintf(lfrm, "{linker} {incdirs} {sysincdirs} {lflags} -o {outfile} {user_ofile} {spec_ofiles} {ofiles} {libs}");
+ sprintf(lfrm, "{linker} {incdirs} {sysincdirs} {lflags} -w -r -o {outfile} {user_ofile} {spec_ofiles} {ofiles} {libs}");
shash_add(&linkValues, "linker", "gplink");
shash_add(&linkValues, "lflags", joinStrSet(linkOptionsSet));
- shash_add(&linkValues, "outfile", dstFileName);
+ shash_add(&linkValues, "outfile", fullDstFileName ? fullDstFileName : dstFileName);
if(fullSrcFileName) {
- sprintf(temp, "%s.o", dstFileName);
+ sprintf(temp, "%s.o", fullDstFileName ? fullDstFileName : dstFileName );
shash_add(&linkValues, "user_ofile", temp);
}
shash_add(&linkValues, "ofiles", joinStrSet(relFilesSet));
/* LIBRARIES */
+ procName = processor_base_name();
+ if (!procName) {
+ procName = "16f877";
+ }
+
addSet(&libFilesSet, "libsdcc.lib");
- SNPRINTF(&temp[0], 128, "pic%s.lib", port->processor);
+ SNPRINTF(&temp[0], 128, "pic%s.lib", procName);
addSet(&libFilesSet, temp);
shash_add(&linkValues, "libs", joinStrSet(libFilesSet));
16f877)
*/
},
+ /* tags for generic pointers */
+ { 0x00, 0x00, 0x00, 0x80 }, /* far, near, xstack, code */
{
"XSEG (XDATA)",
"STACK (DATA)",
NULL, // xidata
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
NULL, /* genInitStartup */
_pic14_reset_regparm,
_pic14_regparm,
- _process_pragma, /* process a pragma */
+ NULL, /* process a pragma */
NULL,
_hasNativeMulFor,
hasExtBitOp, /* hasExtBitOp */