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;
static int udata_flag=0;
//dump_map(); /* display the register map */
- fprintf(stdout,";dump_sfr \n");
+ //fprintf(stdout,";dump_sfr \n");
if (pic->maxRAMaddress < 0) {
fprintf(stderr, "missing \"#pragma maxram\" setting\n");
return;
(!finalMapping[start].instance) &&
(!finalMapping[start].isSFR)) {
- fprintf(of,"%s\tres\t%i\n",
+ 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;
}
}
void mapRegister(regs *reg)
{
- int i;
+ unsigned i;
int alias;
if(!reg || !reg->size) {
do {
- fprintf(stdout,"mapping %s to address 0x%02x, reg size = %d\n",reg->name, (reg->address+alias+i),reg->size);
+ //fprintf(stdout,"mapping %s to address 0x%02x, reg size = %d\n",reg->name, (reg->address+alias+i),reg->size);
finalMapping[reg->address + alias + i].reg = reg;
finalMapping[reg->address + alias + i].instance = i;
} 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 i;
- fprintf(stderr,"%s - %s start_address = 0x%03x\n",__FUNCTION__,reg->name, start_address);
+ //fprintf(stderr,"%s - %s start_address = 0x%03x\n",__FUNCTION__,reg->name, start_address);
if(reg->isFixed) {
if (validAddress(reg->address,reg->size)) {
for (reg = setFirstItem(regset) ; reg ;
reg = setNextItem(regset)) {
- 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);
-
+ //fprintf(stdout,"assigning %s isFixed=%d, wasUsed=%d\n",reg->name,reg->isFixed,reg->wasUsed);
+
+ 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);
+ }
}
}