]
[fw/sdcc] / src / pic16 / device.c
index b7eb78657786f8251a8c1edf38396ff1051e0bb7..eb66b6e4a9b4028e6fba752c4abb88e56be74a0f 100644 (file)
 #include "ralloc.h"
 #include "device.h"
 
-#if defined(__BORLANDC__) || defined(_MSC_VER)
-#define STRCASECMP stricmp
-#else
-#define STRCASECMP strcasecmp
-#endif
 
-static PIC_device Pics[] = {
+static PIC16_device Pics16[] = {
   {
     {"p18f242", "18f242", "pic18f242", "f242"},                // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x300,                                             // bank mask
     0x300,                                             // RAMsize
@@ -58,8 +51,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f252", "18f252", "pic18f252", "f252"},                // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x600,                                             // bank mask
     0x600,                                             // RAMsize
@@ -68,8 +59,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f442", "18f442", "pic18f442", "f442"},                // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x300,                                             // bank mask
     0x300,                                             // RAMsize
@@ -78,8 +67,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f452", "18f452", "pic18f452", "f452"},                // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x600,                                             // bank mask
     0x600,                                             // RAMsize
@@ -88,8 +75,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f248", "18f248", "pic18f248", "f248"},                // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x300,                                             // bank mask
     0x300,                                             // RAMsize
@@ -98,8 +83,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f258", "18f258", "pic18f258", "f258"},                // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x600,                                             // bank mask
     0x600,                                             // RAMsize
@@ -108,8 +91,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f448", "18f448", "pic18f448", "f448"},                // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x300,                                             // bank mask
     0x300,                                             // RAMsize
@@ -118,8 +99,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f458", "18f458", "pic18f458", "f458"},                // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x600,                                             // bank mask
     0x600,                                             // RAMsize
@@ -128,8 +107,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f6520", "18f6520", "pic18f6520", "f6520"},    // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x800,                                             // bank mask
     0x800,                                             // RAMsize
@@ -138,8 +115,6 @@ static PIC_device Pics[] = {
 
   {
     {"p18f6620", "18f6620", "pic18f6620", "f6620"},    // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0xf00,                                             // bank mask
     0xf00,                                             // RAMsize
@@ -147,8 +122,6 @@ static PIC_device Pics[] = {
   },
   {
     {"p18f6680", "18f6680", "pic18f6680", "f6680"},    // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0xc00,                                             // bank mask
     0xc00,                                             // RAMsize
@@ -156,8 +129,6 @@ static PIC_device Pics[] = {
   },
   {
     {"p18f6720", "18f6720", "pic18f6720", "f6720"},    // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0xf00,                                             // bank mask
     0xf00,                                             // RAMsize
@@ -165,8 +136,6 @@ static PIC_device Pics[] = {
   },
   {
     {"p18f8520", "18f8520", "pic18f8520", "f8520"},    // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0x800,                                             // bank mask
     0x800,                                             // RAMsize
@@ -174,8 +143,6 @@ static PIC_device Pics[] = {
   },
   {
     {"p18f8620", "18f8620", "pic18f8620", "f8620"},    // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0xf00,                                             // bank mask
     0xf00,                                             // RAMsize
@@ -183,8 +150,6 @@ static PIC_device Pics[] = {
   },
   {
     {"p18f8680", "18f8680", "pic18f8680", "f8680"},    // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0xc00,                                             // bank mask
     0x800,                                             // RAMsize
@@ -192,8 +157,6 @@ static PIC_device Pics[] = {
   },
   {
     {"p18f8720", "18f8720", "pic18f8720", "f8720"},    // aliases
-    (memRange *)NULL,                                  // ram memory map
-    (memRange *)NULL,                                  // sfr memory map
     0,
     0xf00,                                             // bank mask
     0xf00,                                             // RAMsize
@@ -202,14 +165,11 @@ static PIC_device Pics[] = {
 
 };
 
-static int num_of_supported_PICS = sizeof(Pics)/sizeof(PIC_device);
+static int num_of_supported_PICS = sizeof(Pics16)/sizeof(PIC16_device);
 
 #define DEFAULT_PIC "452"
 
-static PIC_device *pic=NULL;
-
-//AssignedMemory *pic16_finalMapping=NULL;
-//int pic16_finalMappingSize=0;
+PIC16_device *pic16=NULL;
 
 #define DEFAULT_CONFIG_BYTE 0xff
 
@@ -260,107 +220,93 @@ static unsigned int config7h_word = DEFAULT_CONFIG7H_WORD;
 
 unsigned int stackPos = 0;
 
+extern regs* newReg(short type, short pc_type, int rIdx, char *name, int size, int alias, operand *refop);
+
 void pic16_setMaxRAM(int size)
 {
-  pic->maxRAMaddress = size;
-  stackPos = pic->RAMsize-1;
-
-  if (pic->maxRAMaddress < 0) {
-    fprintf(stderr, "invalid \"#pragma maxram 0x%x\" setting\n",
-           pic->maxRAMaddress);
-    return;
-  }
-
-//  pic16_finalMapping = Safe_calloc(1+pic->maxRAMaddress,
-//                          sizeof(AssignedMemory));
-
-  /* Now initialize the pic16_finalMapping array */
+       pic16->maxRAMaddress = size;
+       stackPos = pic16->RAMsize-1;
 
-//  for(i=0; i<=pic->maxRAMaddress; i++) {
-//    pic16_finalMapping[i].reg = NULL;
-//    pic16_finalMapping[i].isValid = 0;
-//  }
+       if (pic16->maxRAMaddress < 0) {
+               fprintf(stderr, "invalid \"#pragma maxram 0x%x\" setting\n",
+                       pic16->maxRAMaddress);
+         return;
+       }
 }
 
-/*-----------------------------------------------------------------*
- *-----------------------------------------------------------------*/
-#if 0
-int pic16_isREGinBank(regs *reg, int bank)
-{
+extern char *iComments2;
 
-  if(!reg || !pic)
-    return 0;
-
-  if(pic16_finalMapping[reg->address].bank == bank)
-    return 1;
-
-  return 0;
-}
-#endif
-/*-----------------------------------------------------------------*
- *-----------------------------------------------------------------*/
-int pic16_REGallBanks(regs *reg)
+void pic16_dump_equates(FILE *of, set *equs)
 {
+  regs *r;
 
-  if(!reg || !pic)
-    return 0;
-
-  if ((int)reg->address > pic->maxRAMaddress)
-    return 0;
-
-  return 1;
-
+       r = setFirstItem(equs);
+       if(!r)return;
+       
+       fprintf(of, "%s", iComments2);
+       fprintf(of, ";\tEquates to used internal registers\n");
+       fprintf(of, "%s", iComments2);
+       
+       for(; r; r = setNextItem(equs)) {
+               fprintf(of, "%s\tequ\t0x%02x\n", r->name, r->address);
+       }
 }
 
-/*-----------------------------------------------------------------*
- *-----------------------------------------------------------------*/
 
-/*
- *  pic16_dump_map -- debug stuff
- */
-#if 0
-void pic16_dump_map(void)
+int regCompare(const void *a, const void *b)
 {
-  int i;
+  const regs *const *i = a;
+  const regs *const *j = b;
 
-  for(i=0; i<=pic->maxRAMaddress; i++) {
-    //fprintf(stdout , "addr 0x%02x is %s\n", i, ((pic16_finalMapping[i].isValid) ? "valid":"invalid"));
+       /* sort primarily by the address */
+       if( (*i)->address > (*j)->address)return 1;
+       if( (*i)->address < (*j)->address)return -1;
+       
+       /* and secondarily by size */
+       if( (*i)->size > (*j)->size)return 1;
+       if( (*i)->size < (*j)->size)return -1;
 
-    if(pic16_finalMapping[i].isValid) {
-      fprintf(stderr,"addr: 0x%02x",i);
-      if(pic16_finalMapping[i].isSFR)
-       fprintf(stderr," isSFR");
-      if(pic16_finalMapping[i].reg) 
-       fprintf( stderr, "  reg %s", pic16_finalMapping[i].reg->name);
-      fprintf(stderr, "\n");
-    }
-  }
 
+  return 0;
 }
-#endif
 
-
-void pic16_dump_section(FILE *of, char *sname, set *section, int fix)
+void pic16_dump_section(FILE *of, set *section, int fix)
 {
   static int abs_section_no=0;
   regs *r, *rprev;
-  int init_addr;
+  int init_addr, i;
+  regs **rlist;
+
+       /* put all symbols in an array */
+       rlist = Safe_calloc(elementsInSet(section), sizeof(regs *));
+       r = rlist[0]; i = 0;
+       for(rprev = setFirstItem(section); rprev; rprev = setNextItem(section)) {
+               rlist[i] = rprev; i++;
+       }
+       
+       if(!i) {
+               if(rlist)free(rlist);
+         return;
+       }
 
+       /* sort symbols according to their address */
+       qsort(rlist, i  /*elementsInSet(section)*/, sizeof(regs *), regCompare);
+       
        if(!fix) {
                fprintf(of, "\n\n\tudata\n");
                for(r = setFirstItem(section); r; r = setNextItem(section)) {
                        fprintf(of, "%s\tres\t%d\n", r->name, r->size);
                }
        } else {
-               r = setFirstItem(section);
-               if(!r)return;
-               init_addr = r->address;
-               fprintf(of, "\n\nstatic_%s_%02d\tudata\t0X%04X\n", moduleName, abs_section_no++, init_addr);
-               
+         int j=0;
+                 
                rprev = NULL;
-               for(; r; r = setNextItem(section)) {
+               init_addr = rlist[j]->address;
+               fprintf(of, "\n\nstatic_%s_%02d\tudata\t0X%04X\n", moduleName, abs_section_no++, init_addr);
+       
+               for(j=0;j<i;j++) {
+                       r = rlist[j];
                        init_addr = r->address;
-
                        if(rprev && (init_addr != (rprev->address + rprev->size))) {
                                fprintf(of, "\nstatic_%s_%02d\tudata\t0X%04X\n", moduleName, abs_section_no++, init_addr);
                        }
@@ -369,9 +315,167 @@ void pic16_dump_section(FILE *of, char *sname, set *section, int fix)
                        rprev = r;
                }
        }
+       free(rlist);
+}
+
+void pic16_dump_int_registers(FILE *of, set *section)
+{
+  regs *r, *rprev;
+  int i;
+  regs **rlist;
+
+       /* put all symbols in an array */
+       rlist = Safe_calloc(elementsInSet(section), sizeof(regs *));
+       r = rlist[0]; i = 0;
+       for(rprev = setFirstItem(section); rprev; rprev = setNextItem(section)) {
+               rlist[i] = rprev; i++;
+       }
+
+       /* sort symbols according to their address */
+       qsort(rlist, elementsInSet(section), sizeof(regs *), regCompare);
+       
+       if(!i) {
+               if(rlist)free(rlist);
+         return;
+       }
+       
+       fprintf(of, "\n\n; Internal registers\n");
+       
+       fprintf(of, "%s\tudata_ovr\t0x0000\n", ".registers");
+       for(r = setFirstItem(section); r; r = setNextItem(section))
+               fprintf(of, "%s\tres\t%d\n", r->name, r->size);
+
+       free(rlist);
 }
 
 
+#ifdef WORDS_BIGENDIAN
+  #define _ENDIAN(x)  (3-x)
+#else
+  #define _ENDIAN(x)  (x)
+#endif
+
+#define BYTE_IN_LONG(x,b) ((x>>(8*_ENDIAN(b)))&0xff)
+
+/*-----------------------------------------------------------------*/
+/* printIvalType - generates ival for int/char                     */
+/*-----------------------------------------------------------------*/
+void print_idataType (FILE *of, symbol *sym, sym_link * type, initList * ilist)
+{
+  value *val;
+  unsigned long ulval;
+
+  //fprintf(stderr, "%s\n",__FUNCTION__);
+
+  /* if initList is deep */
+  if (ilist->type == INIT_DEEP)
+    ilist = ilist->init.deep;
+
+  if (!IS_AGGREGATE(sym->type) && getNelements(type, ilist)>1) {
+    werror (W_EXCESS_INITIALIZERS, "scalar", sym->name, sym->lineDef);
+  }
+
+  if (!(val = list2val (ilist))) {
+    // assuming a warning has been thrown
+    val=constVal("0");
+  }
+
+  if (val->type != type) {
+    val = valCastLiteral(type, floatFromVal(val));
+  }
+
+  if(val) 
+    ulval = (unsigned long) floatFromVal (val);
+  else
+    ulval =0;
+
+  switch (getSize (type)) {
+    case 1:
+       fprintf(of, "%s\tdata\t0x%02x\n", sym->name, (unsigned char)BYTE_IN_LONG(ulval, 0));
+//     pic16_addpCode2pBlock(pb,pic16_newpCode(POC_RETLW,pic16_newpCodeOpLit(BYTE_IN_LONG(ulval,0))));
+       break;
+
+    case 2:
+//     fprintf(of, "%s\tdw\t0x%04x\n", sym->name, (unsigned int)(BYTE_IN_LONG(ulval, 0)
+//                                     + (BYTE_IN_LONG(ulval, 1) << 8)));
+       fprintf(of, "%s\tdata\t0x%02x,0x%02x\n", sym->name, (unsigned char)BYTE_IN_LONG(ulval, 0),
+                                       (unsigned char)(BYTE_IN_LONG(ulval, 1) << 8));
+//     pic16_addpCode2pBlock(pb,pic16_newpCode(POC_RETLW,pic16_newpCodeOpLit(BYTE_IN_LONG(ulval,0))));
+//     pic16_addpCode2pBlock(pb,pic16_newpCode(POC_RETLW,pic16_newpCodeOpLit(BYTE_IN_LONG(ulval,1))));
+       break;
+
+    case 4:
+       fprintf(of, "%s\tdw\t0x%04x,0x%04x\n", sym->name, (unsigned int)(BYTE_IN_LONG(ulval, 0)
+                                       + (BYTE_IN_LONG(ulval, 1) << 8)),
+                                       (unsigned)(BYTE_IN_LONG(ulval, 2)
+                                       + (BYTE_IN_LONG(ulval, 3) << 8)));
+//     pic16_addpCode2pBlock(pb,pic16_newpCode(POC_RETLW,pic16_newpCodeOpLit(BYTE_IN_LONG(ulval,0))));
+//     pic16_addpCode2pBlock(pb,pic16_newpCode(POC_RETLW,pic16_newpCodeOpLit(BYTE_IN_LONG(ulval,1))));
+//     pic16_addpCode2pBlock(pb,pic16_newpCode(POC_RETLW,pic16_newpCodeOpLit(BYTE_IN_LONG(ulval,2))));
+//     pic16_addpCode2pBlock(pb,pic16_newpCode(POC_RETLW,pic16_newpCodeOpLit(BYTE_IN_LONG(ulval,3))));
+       break;
+  }
+}
+
+
+
+/*-----------------------------------------------------------------*/
+/* printIval - generates code for initial value                    */
+/*-----------------------------------------------------------------*/
+void print_idata(FILE *of, symbol * sym, sym_link * type, initList * ilist)
+{
+  if (!ilist)
+    return;
+
+  /* if structure then    */
+  if (IS_STRUCT (type))
+    {
+      //fprintf(stderr,"%s struct\n",__FUNCTION__);
+      //printIvalStruct (sym, type, ilist, oFile);
+      return;
+    }
+
+  /* if this is a pointer */
+  if (IS_PTR (type))
+    {
+      //fprintf(stderr,"%s pointer\n",__FUNCTION__);
+      //printIvalPtr (sym, type, ilist, oFile);
+      return;
+    }
+
+  /* if this is an array   */
+  if (IS_ARRAY (type))
+    {
+      //fprintf(stderr,"%s array\n",__FUNCTION__);
+//      printIvalArray (sym, type, ilist, pb);
+      return;
+    }
+
+  /* if type is SPECIFIER */
+  if (IS_SPEC (type))
+    {
+//     fprintf(stderr,"%s spec\n",__FUNCTION__);
+      print_idataType(of, sym, type, ilist);
+      return;
+    }
+}
+
+
+void pic16_dump_idata(FILE *of, set *idataSymSet)
+{
+  int i;
+  symbol *ids;
+  
+
+       i = elementsInSet(idataSymSet);
+       if(!i)return;
+       
+       fprintf(of, "\n\n; Initialised data (idata)\n");
+       fprintf(of, "\tidata\n");
+       for(ids = setFirstItem(idataSymSet); ids; ids = setNextItem(idataSymSet))
+             print_idata(of, ids, ids->type, ids->ival);
+
+}
 
 
 /*-----------------------------------------------------------------*
@@ -390,7 +494,7 @@ void pic16_list_valid_pics(int ncols, int list_alias)
   int i,j,k,l;
 
   if(list_alias)
-    list_alias = sizeof(Pics[0].name) / sizeof(Pics[0].name[0]);
+    list_alias = sizeof(Pics16[0].name) / sizeof(Pics16[0].name[0]);
 
   /* decrement the column number if it's greater than zero */
   ncols = (ncols > 1) ? ncols-1 : 4;
@@ -398,7 +502,7 @@ void pic16_list_valid_pics(int ncols, int list_alias)
   /* Find the device with the longest name */
   for(i=0,longest=0; i<num_of_supported_PICS; i++) {
     for(j=0; j<=list_alias; j++) {
-      k = strlen(Pics[i].name[j]);
+      k = strlen(Pics16[i].name[j]);
       if(k>longest)
        longest = k;
     }
@@ -410,9 +514,9 @@ void pic16_list_valid_pics(int ncols, int list_alias)
     j = 0;
     do {
 
-      fprintf(stderr,"%s", Pics[i].name[j]);
+      fprintf(stderr,"%s", Pics16[i].name[j]);
       if(col<ncols) {
-       l = longest + 2 - strlen(Pics[i].name[j]);
+       l = longest + 2 - strlen(Pics16[i].name[j]);
        for(k=0; k<l; k++)
          fputc(' ',stderr);
 
@@ -434,7 +538,7 @@ void pic16_list_valid_pics(int ncols, int list_alias)
 /*-----------------------------------------------------------------*
  *  
  *-----------------------------------------------------------------*/
-PIC_device *pic16_find_device(char *name)
+PIC16_device *pic16_find_device(char *name)
 {
 
   int i,j;
@@ -445,8 +549,8 @@ PIC_device *pic16_find_device(char *name)
   for(i = 0; i<num_of_supported_PICS; i++) {
 
     for(j=0; j<PROCESSOR_NAMES; j++)
-      if(!STRCASECMP(Pics[i].name[j], name) )
-       return &Pics[i];
+      if(!STRCASECMP(Pics16[i].name[j], name) )
+       return &Pics16[i];
   }
 
   /* not found */
@@ -458,9 +562,9 @@ PIC_device *pic16_find_device(char *name)
  *-----------------------------------------------------------------*/
 void pic16_init_pic(char *pic_type)
 {
-       pic = pic16_find_device(pic_type);
+       pic16 = pic16_find_device(pic_type);
 
-       if(!pic) {
+       if(!pic16) {
                if(pic_type)
                        fprintf(stderr, "'%s' was not found.\n", pic_type);
                else
@@ -481,7 +585,7 @@ void pic16_init_pic(char *pic_type)
  *-----------------------------------------------------------------*/
 int pic16_picIsInitialized(void)
 {
-  if(pic && pic->maxRAMaddress > 0)
+  if(pic16 && pic16->maxRAMaddress > 0)
     return 1;
 
   return 0;
@@ -494,53 +598,71 @@ int pic16_picIsInitialized(void)
 char *pic16_processor_base_name(void)
 {
 
-  if(!pic)
+  if(!pic16)
     return NULL;
 
-  return pic->name[0];
+  return pic16->name[0];
 }
 
+#define DEBUG_CHECK    0
 
-#if 0
-/*-----------------------------------------------------------------*
- *-----------------------------------------------------------------*/
-static int validAddress(int address, int reg_size)
+/*
+ * return 1 if register wasn't found and added, 0 otherwise
+ */
+int checkAddReg(set **set, regs *reg)
 {
-  int i;
+  regs *tmp;
 
-#if 0
-  if (pic->maxRAMaddress < 0) {
-    fprintf(stderr, "missing \"#pragma maxram\" setting\n");
-    return 0;
-  }
-//  fprintf(stderr, "validAddress: Checking 0x%04x (max=0x%04x) (reg_size = %d)\n",address, pic->maxRAMaddress, reg_size);
-  if(address > pic->maxRAMaddress)
-    return 0;
+#if DEBUG_CHECK
+       fprintf(stderr, "%s: about to insert REGister: %s ... ", __FUNCTION__, reg->name);
+#endif
 
-  for (i=0; i<reg_size; i++)
-    if(!pic16_finalMapping[address + i].isValid || 
-       pic16_finalMapping[address+i].reg ||
-       pic16_finalMapping[address+i].isSFR )
-      return 0;
+       for(tmp = setFirstItem(*set); tmp; tmp = setNextItem(*set)) {
+               if(!strcmp(tmp->name, reg->name))break;
+       }
+       
+       if(!tmp) {
+               addSet(set, reg);
+#if DEBUG_CHECK
+               fprintf(stderr, "added\n");
 #endif
+               return 1;
+       }
 
-  return 1;
-}
+#if DEBUG_CHECK
+       fprintf(stderr, "already added\n");
 #endif
+  return 0;
+}
 
-void checkAddReg(set **set, regs *reg)
+int checkAddSym(set **set, symbol *sym)
 {
-  regs *tmp;
+  symbol *tmp;
 
+#if DEBUG_CHECK
+       fprintf(stderr, "%s: about to add SYMbol: %s ... ", __FUNCTION__, sym->name);
+#endif
 
-       for(tmp = setFirstItem(*set); tmp; tmp = setNextItem(*set)) {
-               if(!strcmp(tmp->name, reg->name))break;
+       for(tmp = setFirstItem( *set ); tmp; tmp = setNextItem(*set)) {
+               if(!strcmp(tmp->name, sym->name))break;
        }
        
-       if(!tmp)
-               addSet(set, reg);
+       if(!tmp) {
+               addSet(set, sym);
+#if DEBUG_CHECK
+               fprintf(stderr, "added\n");
+#endif
+               return 1;
+       }
+
+#if DEBUG_CHECK
+       fprintf(stderr, "already added\n");
+#endif
+
+  return 0;
 }
 
+
 /*-----------------------------------------------------------------*
  * void pic16_groupRegistersInSection - add each register to its   *
  *     corresponding section                                      *
@@ -550,13 +672,27 @@ void pic16_groupRegistersInSection(set *regset)
   regs *reg;
 
        for(reg=setFirstItem(regset); reg; reg = setNextItem(regset)) {
+
+//             fprintf(stderr, "%s:%d group registers in section, reg: %s\n", __FILE__, __LINE__, reg->name);
+
                if(reg->wasUsed
                        && !(reg->regop && SPEC_EXTR(OP_SYM_ETYPE(reg->regop)))) {
-                       if(reg->isFixed)
+
+//                     fprintf(stderr, "%s:%d register %s alias:%d fix:%d\n",
+//                             __FILE__, __LINE__, reg->name, reg->alias, reg->isFixed);
+
+                       if(reg->alias) {
+                               checkAddReg(&pic16_equ_data, reg);
+                       } else
+                       if(reg->isFixed) {
                                checkAddReg(&pic16_fix_udata, reg);
-               
-                       if(!reg->isFixed)
-                               checkAddReg(&pic16_rel_udata, reg);
+                       } else
+                       if(!reg->isFixed) {
+                               if(reg->pc_type == PO_GPR_TEMP)
+                                       checkAddReg(&pic16_int_regs, reg);
+                               else
+                                       checkAddReg(&pic16_rel_udata, reg);
+                       }
                }
        }
 }
@@ -651,3 +787,4 @@ int pic16_getConfigWord(int address)
     return 0;
   }
 }
+