* device/include/z180.h,
[fw/sdcc] / src / pic / main.c
index cec44669a969b8613c790784c16c7fccf96c9c51..dcb0aca0b107f5633b6ab04dca61dc7abb345c6b 100644 (file)
@@ -7,6 +7,9 @@
 #include "common.h"
 #include "main.h"
 #include "ralloc.h"
+#include "device.h"
+#include "SDCCutil.h"
+#include "glue.h"
 //#include "gen.h"
 
 
@@ -74,12 +77,96 @@ _pic14_regparm (sym_link * l)
   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")) {
+      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;
+    }
+  return 1;
+}
+
+extern char *udata_section_name;
+
 static bool
 _pic14_parseOptions (int *pargc, char **argv, int *i)
 {
+  char buf[128];
+
   /* TODO: allow port-specific command line options to specify
    * segment names here.
    */
+
+       /* This is a temporary hack, to solve problems with some processors
+        * that do not have udata section. It will be changed when a more
+        * robust solution is figured out -- VR 27-11-2003 FIXME
+        */
+       strcpy(buf, "--udata-section-name");
+       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);
+               } else {
+                       udata_section_name = strdup( strchr(argv[*i], '=') + 1 );
+               }
+               return 1;
+       }
+   
   return FALSE;
 }
 
@@ -173,7 +260,7 @@ _pic14_genAssemblerPreamble (FILE * of)
   }
 
   fprintf (of, "\tlist\tp=%s\n",&name[1]);
-  fprintf (of, "\t__config _wdt_off\n");
+  fprintf (of, "\tradix dec");
   fprintf (of, "\ninclude \"%s.inc\"\n",name);
 }
 
@@ -210,8 +297,10 @@ _pic14_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts)
 static bool
 _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right)
 {
+/*
   sym_link *test = NULL;
   value *val;
+*/
 
   fprintf(stderr,"checking for native mult\n");
 
@@ -251,6 +340,32 @@ _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right)
 */
 }
 
+/* Indicate which extended bit operations this port supports */
+static bool
+hasExtBitOp (int op, int size)
+{
+  if (op == RRC
+      || op == RLC
+      /* || op == GETHBIT */ /* GETHBIT doesn't look complete for PIC */
+     )
+    return TRUE;
+  else
+    return FALSE;
+}
+
+/* Indicate the expense of an access to an output storage class */
+static int
+oclsExpense (struct memmap *oclass)
+{
+  /* The IN_FARSPACE test is compatible with historical behaviour, */
+  /* but I don't think it is applicable to PIC. If so, please feel */
+  /* free to remove this test -- EEP */
+  if (IN_FARSPACE(oclass))
+    return 1;
+    
+  return 0;
+}
+
 /** $1 is always the basename.
     $2 is always the output file.
     $3 varies
@@ -259,16 +374,12 @@ _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right)
 */
 static const char *_linkCmd[] =
 {
-  "aslink", "-nf", "$1", NULL
+  "gplink", "-o $2", "\"$1.o\"", "$l", NULL
 };
 
-/* Sigh. This really is not good. For now, I recommend:
- * sdcc -S -mpic14 file.c
- * the -S option does not compile or link
- */
 static const char *_asmCmd[] =
 {
-  "gpasm", "-c  -I /usr/local/share/gpasm/header", "$1.asm", NULL
+  "gpasm", "$l", "-c", "\"$1.asm\"", NULL
 
 };
 
@@ -278,8 +389,9 @@ PORT pic_port =
   TARGET_ID_PIC,
   "pic14",
   "MCU pic",                   /* Target name */
-  "p16f877",                    /* Processor */
+  "",                    /* Processor */
   {
+    picglue,
     TRUE,                      /* Emit glue around main */
     MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24,
     MODEL_SMALL
@@ -299,14 +411,15 @@ PORT pic_port =
     _linkCmd,
     NULL,
     NULL,
-    ".rel"
+    ".o",
+    0
   },
   {
     _defaultRules
   },
   {
        /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
-    1, 2, 2, 4, 1, 2, 1, 1, 4, 4
+    1, 2, 2, 4, 2, 2, 2, 1, 4, 4
        /* TSD - I changed the size of gptr from 3 to 1. However, it should be
           2 so that we can accomodate the PIC's with 4 register banks (like the
           16f877)
@@ -315,14 +428,14 @@ PORT pic_port =
   {
     "XSEG    (XDATA)",
     "STACK   (DATA)",
-    "CSEG    (CODE)",
+    "code",
     "DSEG    (DATA)",
     "ISEG    (DATA)",
     "XSEG    (XDATA)",
     "BSEG    (BIT)",
     "RSEG    (DATA)",
     "GSINIT  (CODE)",
-    "OSEG    (OVR,DATA)",
+    "udata_ovr",
     "GSFINAL (CODE)",
     "HOME       (CODE)",
     NULL, // xidata
@@ -331,6 +444,7 @@ PORT pic_port =
     NULL,
     1        // code is read only
   },
+  { NULL, NULL },
   {
     +1, 1, 4, 1, 1, 0
   },
@@ -353,10 +467,13 @@ PORT pic_port =
   NULL, // _pic14_genXINIT
   _pic14_reset_regparm,
   _pic14_regparm,
-  NULL,
+  _process_pragma,                             /* process a pragma */
   NULL,
   _hasNativeMulFor,
+  hasExtBitOp,                 /* hasExtBitOp */
+  oclsExpense,                 /* oclsExpense */
   FALSE,
+  TRUE,                                /* little endian */
   0,                           /* leave lt */
   0,                           /* leave gt */
   1,                           /* transform <= to ! > */