X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic%2Fdevice.c;h=62369f1d41eb3c235dbcae329defd2fe62367409;hb=52eb93f73f643bc7175d8f6ea06ec78b1026f001;hp=3cb56d1f72e59b3fe70deb2bacbaf247663a3566;hpb=4310a3fc67a7a7b92b7c7c0640ae8df680da16f7;p=fw%2Fsdcc diff --git a/src/pic/device.c b/src/pic/device.c index 3cb56d1f..62369f1d 100644 --- a/src/pic/device.c +++ b/src/pic/device.c @@ -24,6 +24,7 @@ #include "newalloc.h" +#include "main.h" #include "pcode.h" #include "ralloc.h" #include "device.h" @@ -34,6 +35,9 @@ #define STRCASECMP strcasecmp #endif +extern int Gstack_base_addr; +extern int Gstack_size; + static PIC_device Pics[] = { { {"p16f627", "16f627", "pic16f627", "f627"}, /* processor name */ @@ -58,7 +62,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 +106,9 @@ AssignedMemory *finalMapping=NULL; static unsigned int config_word = DEFAULT_CONFIG_WORD; +extern int is_shared (regs *reg); +extern void emitSymbolToFile (FILE *of, const char *name, const char *section_type, int size, int addr, int useEQU, int globalize); + void addMemRange(memRange *r, int type) { int i; @@ -193,6 +200,16 @@ int REGallBanks(regs *reg) /*-----------------------------------------------------------------* *-----------------------------------------------------------------*/ +int isSFR(int address) +{ + + if( (address > pic->maxRAMaddress) || !finalMapping[address].isSFR) + return 0; + + return 1; + +} + /* * dump_map -- debug stuff */ @@ -218,11 +235,12 @@ void dump_map(void) void dump_sfr(FILE *of) { - +#if 0 int start=-1; - int addr=0; int bank_base; static int udata_flag=0; +#endif + int addr=0; //dump_map(); /* display the register map */ //fprintf(stdout,";dump_sfr \n"); @@ -231,8 +249,27 @@ void dump_sfr(FILE *of) return; } - do { + for (addr = 0; addr <= pic->maxRAMaddress; addr++) + { + regs *reg = finalMapping[addr].reg; + if (reg && !reg->isEmitted) + { + if (pic14_options.isLibrarySource && is_shared (reg)) + { + /* rely on external declarations for the non-fixed stack */ + fprintf (of, "\textern\t%s\n", reg->name); + } else { + emitSymbolToFile (of, reg->name, "udata", reg->size, reg->isFixed ? reg->address : -1, 0, is_shared (reg)); + } + + reg->isEmitted = 1; + } + } // for + +#if 0 + do { + if(finalMapping[addr].reg && !finalMapping[addr].reg->isEmitted) { if(start<0) @@ -270,9 +307,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; } @@ -286,8 +326,9 @@ void dump_sfr(FILE *of) addr++; } while(addr <= pic->maxRAMaddress); - - + + +#endif } /*-----------------------------------------------------------------* @@ -415,16 +456,6 @@ char *processor_base_name(void) return pic->name[0]; } -int isSFR(int address) -{ - - if( (address > pic->maxRAMaddress) || !finalMapping[address].isSFR) - return 0; - - return 1; - -} - /*-----------------------------------------------------------------* *-----------------------------------------------------------------*/ int validAddress(int address, int reg_size) @@ -436,7 +467,8 @@ int validAddress(int address, int reg_size) return 0; } // fprintf(stderr, "validAddress: Checking 0x%04x\n",address); - if(address > pic->maxRAMaddress) + assert (reg_size > 0); + if(address + (reg_size - 1) > pic->maxRAMaddress) return 0; for (i=0; iaddress; } - //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 { @@ -564,9 +596,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; @@ -632,7 +664,7 @@ void setDefMaxRam(void) 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--; ) { + for (i=0; i <= pic->defMaxRAMaddrs; i++) { finalMapping[i].bank = (i>>7); finalMapping[i].isValid = 1; }