* src/pic16/ralloc.c (pic16_allocDirReg): use device specific
[fw/sdcc] / src / pic / device.c
index d66bbdfb550745a5306fed5bd9b6b26dd0674f5e..1b9fd8e96690a98038d20fb07a3cce0cd50cb45c 100644 (file)
@@ -58,7 +58,7 @@ static PIC_device Pics[] = {
                        (memRange *)NULL,
                        (memRange *)NULL,
                        0,
-                       0xcf,
+                       0x4f, /* 68 register available 0x0C to 0x4F (0x8C to 0xCF mapped to bank 0) */
                        0x80,
        },
        
@@ -102,6 +102,8 @@ AssignedMemory *finalMapping=NULL;
 
 static unsigned int config_word = DEFAULT_CONFIG_WORD;
 
+extern void emitSymbolToFile (FILE *of, const char *name, int size);
+
 void addMemRange(memRange *r, int type)
 {
        int i;
@@ -159,6 +161,7 @@ void setMaxRAM(int size)
        for(i=0; i<=pic->maxRAMaddress; i++) {
                finalMapping[i].reg = NULL;
                finalMapping[i].isValid = 0;
+               finalMapping[i].bank = (i>>7);
        }
 }
 
@@ -239,9 +242,9 @@ void dump_sfr(FILE *of)
                } else {
                        if(start>=0) {
                                
-                       /* clear the lower 7-bits of the start address of the first
-                       * variable declared in this bank. The upper bits for the mid
-                       * range pics are the bank select bits.
+                               /* clear the lower 7-bits of the start address of the first
+                               * variable declared in this bank. The upper bits for the mid
+                               * range pics are the bank select bits.
                                */
                                
                                bank_base = start & 0xfff8;
@@ -269,9 +272,12 @@ void dump_sfr(FILE *of)
                                                                        finalMapping[start].reg->address+i);
                                                        }
                                                } else {
+                                                       emitSymbolToFile (of, finalMapping[start].reg->name, finalMapping[start].reg->size);
+#if 0
                                                        fprintf(of,"%s\tres\t%i\n",
                                                                finalMapping[start].reg->name, 
                                                                finalMapping[start].reg->size);
+#endif
                                                }
                                                finalMapping[start].reg->isEmitted = 1;
                                        }
@@ -563,9 +569,9 @@ void assignRelocatableRegisters(set *regset, int used)
        for (reg = setFirstItem(regset) ; reg ; 
        reg = setNextItem(regset)) {
                
-               //fprintf(stdout,"assigning %s isFixed=%d, wasUsed=%d\n",reg->name,reg->isFixed,reg->wasUsed);
+               //fprintf(stdout,"assigning %s (%d) isFixed=%d, wasUsed=%d\n",reg->name,reg->size,reg->isFixed,reg->wasUsed);
                
-               if((!reg->isFixed) && ( used || reg->wasUsed)) {
+               if((!reg->isExtern) && (!reg->isFixed) && ( used || reg->wasUsed)) {
                        /* If register have been reused then shall not print it a second time. */
                        set *s;
                        int done = 0;
@@ -628,7 +634,13 @@ int getConfigWord(int address)
 *-----------------------------------------------------------------*/
 void setDefMaxRam(void)
 {
-       setMaxRAM(pic->defMaxRAMaddrs); // Max RAM has not been included, so use default setting
+       unsigned i;
+       setMaxRAM(pic->defMaxRAMaddrs); /* Max RAM has not been included, so use default setting */
+       /* Validate full memory range for use by general purpose RAM */
+       for (i=pic->defMaxRAMaddrs; i--; ) {
+               finalMapping[i].bank = (i>>7);
+               finalMapping[i].isValid = 1;
+       }
 }
 
 /*-----------------------------------------------------------------*