* src/pic/device.h: removed AssignedMemory structure and macros
[fw/sdcc] / src / pic / main.c
index 976a2e4794e183548d0b3592a050b3dd7f535b68..c194fbe3986a0041d60cba421aaf034545067cc2 100644 (file)
@@ -12,6 +12,7 @@
 #include "SDCCmacro.h"
 #include "MySystem.h"
 #include "glue.h"
+#include <errno.h>
 //#include "gen.h"
 
 
@@ -21,11 +22,11 @@ static char _defaultRules[] =
        ""
 };
 
-/* list of key words used by msc51 */
+/* list of key words used by pic14 */
 static char *_pic14_keywords[] =
 {
        "at",
-       "bit",
+       //"bit",
        "code",
        "critical",
        "data",
@@ -36,7 +37,7 @@ static char *_pic14_keywords[] =
        "pdata",
        "reentrant",
        "sfr",
-       "sbit",
+       //"sbit",
        "using",
        "xdata",
        "_data",
@@ -51,10 +52,15 @@ static char *_pic14_keywords[] =
 
 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 }
 };
 
@@ -72,7 +78,6 @@ static void
 _pic14_init (void)
 {
        asm_addTree (&asm_asxxxx_mapping);
-       pCodeInitRegisters();
        memset (&pic14_options, 0, sizeof (pic14_options));
 }
 
@@ -97,64 +102,10 @@ _pic14_regparm (sym_link * l, bool reentrant)
 static int
 _process_pragma(const char *sz)
 {
+#if 0
        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")) {
-               char *maxRAM = strtok((char *)NULL, WHITE);
-               
-               if (maxRAM != (char *)NULL) {
-                       int     maxRAMaddress;
-                       value   *maxRAMVal;
-                       
-                       maxRAMVal = constVal(maxRAM);
-                       maxRAMaddress = (int)floatFromVal(maxRAMVal);
-                       setMaxRAM(maxRAMaddress);
-               }
-               
-               return 0;
-       }
+#endif 
        return 1;
 }
 
@@ -177,7 +128,7 @@ _pic14_parseOptions (int *pargc, char **argv, int *i)
        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 );
                }
@@ -187,9 +138,42 @@ _pic14_parseOptions (int *pargc, char **argv, int *i)
        return FALSE;
 }
 
+extern set *dataDirsSet;
+extern set *includeDirsSet;
+/* pic14 port uses include/pic and lib/pic instead of
+ * include/pic14 and lib/pic14 as indicated by SDCCmain.c's
+ * setIncludePaths routine. */
+static void
+_pic14_initPaths (void)
+{
+  char *p;
+  char *p2=NULL;
+  set *tempSet=NULL;
+
+  if (options.nostdinc)
+      return;
+
+  tempSet = appendStrSet(dataDirsSet, NULL, INCLUDE_DIR_SUFFIX DIR_SEPARATOR_STRING "pic");
+  mergeSets(&includeDirsSet, tempSet);
+
+  if ((p = getenv(SDCC_INCLUDE_NAME)) != NULL)
+  {
+    addSetHead(&includeDirsSet, p);
+    p2=Safe_alloc(strlen(p)+strlen(DIR_SEPARATOR_STRING)+strlen("pic")+1);
+    if(p2!=NULL)
+    {
+        strcpy(p2, p);
+        strcat(p2, DIR_SEPARATOR_STRING);
+        strcat(p2, "pic");
+        addSetHead(&includeDirsSet, p2);
+    }
+  }
+}
+
 static void
 _pic14_finaliseOptions (void)
 {
+       pCodeInitRegisters();
        
        port->mem.default_local_map = data;
        port->mem.default_globl_map = data;
@@ -272,13 +256,13 @@ _pic14_genAssemblerPreamble (FILE * of)
        
        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. */
@@ -397,7 +381,7 @@ MUST be terminated with a NULL.
 */
 static const char *_linkCmd[] =
 {
-       "gplink", "$l", "-o \"$2\"", "\"$1\"", "$3", NULL
+       "gplink", "$l", "-w", "-r", "-o \"$2\"", "\"$1\"", "$3", NULL
 };
 
 static const char *_asmCmd[] =
@@ -415,7 +399,7 @@ extern set *dataDirsSetSet;
 extern set *relFilesSet;
 extern set *linkOptionsSet;
 
-static void _pic14_do_link ()
+static void _pic14_do_link (void)
 {
   hTab *linkValues=NULL;
   char lfrm[256];
@@ -423,6 +407,7 @@ static void _pic14_do_link ()
   char temp[128];
   set *tSet=NULL;
   int ret;
+  char * procName;
   
   /*
    * link command format:
@@ -430,7 +415,7 @@ static void _pic14_do_link ()
    *
    */
 
-  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");
 
@@ -445,17 +430,24 @@ static void _pic14_do_link ()
   
   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", procName);
+  addSet(&libFilesSet, temp);
   shash_add(&linkValues, "libs", joinStrSet(libFilesSet));
 
   lcmd = msprintf(linkValues, lfrm);
@@ -510,6 +502,8 @@ PORT pic_port =
                   16f877)
                 */
        },
+       /* tags for generic pointers */
+       { 0x00, 0x00, 0x00, 0x80 },             /* far, near, xstack, code */
        {
                "XSEG    (XDATA)",
                "STACK   (DATA)",
@@ -527,6 +521,7 @@ PORT pic_port =
                NULL, // xidata
                NULL, // xinit
                "CONST   (CODE)",               // const_name - const data (code or not)
+               "CABS    (ABS,CODE)",   // cabs_name - const absolute data (code or not)
                NULL,
                NULL,
                1        // code is read only
@@ -556,7 +551,7 @@ PORT pic_port =
        _pic14_init,
        _pic14_parseOptions,
        _pic14_poptions,
-       NULL,
+       _pic14_initPaths,
        _pic14_finaliseOptions,
        _pic14_setDefaultOptions,
        pic14_assignRegisters,