varA = (varB > CONSTANT); Was not compiling correctly.
[fw/sdcc] / src / pic / main.c
index d7771302d949bd267229986bb8f0e1f0c847f509..61485148ae29afc66af81a7498eb613555a4022e 100644 (file)
@@ -8,6 +8,7 @@
 #include "main.h"
 #include "ralloc.h"
 #include "device.h"
+#include "SDCCutil.h"
 //#include "gen.h"
 
 
@@ -75,6 +76,70 @@ _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;
+}
+
 static bool
 _pic14_parseOptions (int *pargc, char **argv, int *i)
 {
@@ -175,6 +240,7 @@ _pic14_genAssemblerPreamble (FILE * of)
 
   fprintf (of, "\tlist\tp=%s\n",&name[1]);
   fprintf (of, "\t__CONFIG 0x%x\n",getConfigWord(0x2007));
+  fprintf (of, "\tradix dec");
   fprintf (of, "\ninclude \"%s.inc\"\n",name);
 }
 
@@ -307,7 +373,7 @@ PORT pic_port =
   },
   {
        /* 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, 1, 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)
@@ -354,7 +420,7 @@ PORT pic_port =
   NULL, // _pic14_genXINIT
   _pic14_reset_regparm,
   _pic14_regparm,
-  NULL,
+  _process_pragma,                             /* process a pragma */
   NULL,
   _hasNativeMulFor,
   FALSE,