Added a new peep rule to handle carry logic (optimizes src/regression/nestfor.c).
[fw/sdcc] / src / pic / device.c
index 7c6d28a5339c857f7b95eab3ddd5efa9df8e14ef..e41b1b02d9d06073fa2af50142e0a52d8a9555d8 100644 (file)
@@ -102,7 +102,7 @@ void addMemRange(memRange *r, int type)
 
   do {
     for (i=r->start_address; i<= r->end_address; i++) {
-      if (i <= pic->maxRAMaddress) {
+      if ((i|alias) <= pic->maxRAMaddress) {
        finalMapping[i | alias].isValid = 1;
        finalMapping[i | alias].alias = r->alias;
        finalMapping[i | alias].bank  = r->bank;
@@ -112,6 +112,9 @@ void addMemRange(memRange *r, int type)
        } else {
          finalMapping[i | alias].isSFR  = 0;
        }
+      } else {
+       fprintf(stderr, "WARNING: %s:%s memory at 0x%x is beyond max ram = 0x%x\n",
+               __FILE__,__FUNCTION__,(i|alias), pic->maxRAMaddress);
       }
     }
 
@@ -200,14 +203,16 @@ void dump_map(void)
 
 }
 
-void dump_cblock(FILE *of)
+void dump_sfr(FILE *of)
 {
+
   int start=-1;
   int addr=0;
   int bank_base;
+  static int udata_flag=0;
 
   //dump_map();   /* display the register map */
-
+  //fprintf(stdout,";dump_sfr  \n");
   if (pic->maxRAMaddress < 0) {
     fprintf(stderr, "missing \"#pragma maxram\" setting\n");
     return;
@@ -233,29 +238,25 @@ void dump_cblock(FILE *of)
         * assumes that the first register in the contiguous group
         * of registers represents the bank for the whole group */
 
-       fprintf(of,"  cblock  0X%04X\t; Bank %d\n",start,finalMapping[start].bank);
+       if ( (start != addr) && (!udata_flag) ) {
+         udata_flag = 1;
+          //fprintf(of,"\tudata\n");
+       }
 
        for( ; start < addr; start++) {
-         if((finalMapping[start].reg) && !finalMapping[start].reg->isEmitted ) {
-           fprintf(of,"\t%s",finalMapping[start].reg->name);
-
-           /* If this register is aliased in multiple banks, then
-            * mangle the variable name with the alias address: */
-           if(finalMapping[start].alias & start)
-             fprintf(of,"_%x",bank_base);
+         if((finalMapping[start].reg) && 
+             (!finalMapping[start].reg->isEmitted) &&
+             (!finalMapping[start].instance) && 
+            (!finalMapping[start].isSFR)) {
 
-           if(finalMapping[start].instance)
-             fprintf(of,"_%d",finalMapping[start].instance);
+           fprintf(of,"%s\tres\t%i\n",
+                    finalMapping[start].reg->name, 
+                    finalMapping[start].reg->size);
 
-           
-           fputc('\n',of);
-
-           //finalMapping[start].reg->isEmitted = 1;
+           finalMapping[start].reg->isEmitted = 1;
          }
        }
 
-       fprintf(of,"  endc\n");
-
        start = -1;
       }
 
@@ -403,6 +404,8 @@ int isSFR(int address)
 
 }
 
+/*-----------------------------------------------------------------*
+ *-----------------------------------------------------------------*/
 int validAddress(int address, int reg_size)
 {
   int i;
@@ -411,7 +414,7 @@ int validAddress(int address, int reg_size)
     fprintf(stderr, "missing \"#pragma maxram\" setting\n");
     return 0;
   }
-
+  //  fprintf(stderr, "validAddress: Checking 0x%04x\n",address);
   if(address > pic->maxRAMaddress)
     return 0;
 
@@ -424,6 +427,8 @@ int validAddress(int address, int reg_size)
   return 1;
 }
 
+/*-----------------------------------------------------------------*
+ *-----------------------------------------------------------------*/
 void mapRegister(regs *reg)
 {
 
@@ -461,12 +466,14 @@ void mapRegister(regs *reg)
     } while (alias>=0);
   }
 
-  //  fprintf(stderr,"%s - %s addr = 0x%03x, size %d\n",__FUNCTION__,reg->name, reg->address,reg->size);
+  //fprintf(stderr,"%s - %s addr = 0x%03x, size %d\n",__FUNCTION__,reg->name, reg->address,reg->size);
 
   reg->isMapped = 1;
 
 }
 
+/*-----------------------------------------------------------------*
+ *-----------------------------------------------------------------*/
 int assignRegister(regs *reg, int start_address)
 {
   int i;
@@ -475,7 +482,7 @@ int assignRegister(regs *reg, int start_address)
   if(reg->isFixed) {
 
     if (validAddress(reg->address,reg->size)) {
-      fprintf(stderr,"%s -  %s address = 0x%03x\n",__FUNCTION__,reg->name, reg->address);
+      //fprintf(stderr,"%s -  %s address = 0x%03x\n",__FUNCTION__,reg->name, reg->address);
       mapRegister(reg);
       return reg->address;
     }
@@ -484,8 +491,9 @@ int assignRegister(regs *reg, int start_address)
       mapRegister(reg);
       return reg->address;
     }
-    fprintf(stderr, "WARNING: Ignoring Out of Range register assignment at fixed address %d, %s\n",
-           reg->address, reg->name);
+
+    //fprintf(stderr, "WARNING: Ignoring Out of Range register assignment at fixed address %d, %s\n",
+    //    reg->address, reg->name);
 
   } else {
 
@@ -502,13 +510,15 @@ int assignRegister(regs *reg, int start_address)
       }
     }
 
-    fprintf(stderr, "WARNING: No more RAM available\n");
+    fprintf(stderr, "WARNING: No more RAM available for %s\n",reg->name);
 
   }
 
   return -1;
 }
 
+/*-----------------------------------------------------------------*
+ *-----------------------------------------------------------------*/
 void assignFixedRegisters(set *regset)
 {
   regs *reg;
@@ -522,6 +532,8 @@ void assignFixedRegisters(set *regset)
 
 }
 
+/*-----------------------------------------------------------------*
+ *-----------------------------------------------------------------*/
 void assignRelocatableRegisters(set *regset, int used)
 {