0x180,
},
+ {
+ {"p16f819", "16f819", "pic16f819", "f819"},
+ (memRange *)NULL,
+ (memRange *)NULL,
+ 0,
+ 0x80,
+ },
+
};
static int num_of_supported_PICS = sizeof(Pics)/sizeof(PIC_device);
if(!reg || !pic)
return 0;
- if(((reg->address | reg->alias) & pic->bankMask & bank) == bank)
+ if((int)((reg->address | reg->alias) & pic->bankMask & bank) == bank)
return 1;
return 0;
}
-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;
* 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].instance)
- fprintf(of,"_%d",finalMapping[start].instance);
-
-
- fputc('\n',of);
-
- //finalMapping[start].reg->isEmitted = 1;
+ if((finalMapping[start].reg) &&
+ (!finalMapping[start].reg->isEmitted) &&
+ (!finalMapping[start].instance) &&
+ (!finalMapping[start].isSFR)) {
+
+ if (finalMapping[start].reg->isFixed) {
+ unsigned i;
+ for (i=0; i<finalMapping[start].reg->size; i++) {
+ fprintf(of,"%s\tEQU\t0x%04x\n",
+ finalMapping[start].reg->name,
+ finalMapping[start].reg->address+i);
+ }
+ } else {
+ fprintf(of,"%s\tres\t%i\n",
+ finalMapping[start].reg->name,
+ finalMapping[start].reg->size);
+ }
+ finalMapping[start].reg->isEmitted = 1;
}
}
- fprintf(of," endc\n");
-
start = -1;
}
void mapRegister(regs *reg)
{
- int i;
+ unsigned i;
int alias;
if(!reg || !reg->size) {
} 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;
//fprintf(stdout,"assigning %s isFixed=%d, wasUsed=%d\n",reg->name,reg->isFixed,reg->wasUsed);
- if((!reg->isFixed) && ( used || reg->wasUsed))
- address = assignRegister(reg,address);
-
+ if((!reg->isFixed) && ( used || reg->wasUsed)) {
+ /* If register have been reused then shall not print it a second time. */
+// Undefine REUSE_GPR in files pcode.c & device.c to prevent local function registers being reused.
+#define REUSE_GPR
+#ifdef REUSE_GPR
+ set *s;
+ int done = 0;
+ for (s = regset; s; s = s->next) {
+ regs *r;
+ r = s->item;
+ if (r == reg)
+ break;
+ if((!r->isFixed) && ( used || r->wasUsed)) {
+ if (r->rIdx == reg->rIdx) {
+ reg->address = r->address;
+ done = 1;
+ break;
+ }
+ }
+ }
+ if (!done)
+#endif // REUSE_GPR
+ address = assignRegister(reg,address);
+ }
}
}