X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic16%2Fdevice.h;h=fd06fc4bd6fca46917da5347d7f894bb3a11b3a8;hb=3062f96ccb55d1d05caf9c8782f4961f87b341ce;hp=3c68311351fb57c91072991710c16b07c401b4a2;hpb=fab1b2b01944a97bc9a7275a2df59fe22f42d81f;p=fw%2Fsdcc diff --git a/src/pic16/device.h b/src/pic16/device.h index 3c683113..fd06fc4b 100644 --- a/src/pic16/device.h +++ b/src/pic16/device.h @@ -1,6 +1,7 @@ /*------------------------------------------------------------------------- - device.c - Accomodates subtle variations in PIC16 devices + device.c - Accomodates subtle variations in PIC16 devices + Written By - Scott Dattalo scott@dattalo.com This program is free software; you can redistribute it and/or modify it @@ -29,83 +30,119 @@ #ifndef __DEVICE_H__ #define __DEVICE_H__ -/* memRange - a structure to define a range of valid memory addresses - * - * The Memory of most PICs (and other micros) is a collection of - * disjoint chunks. The memRange structure will define the start - * and end address of one of these chunks. The memory map of a - * particular device is a collection of memRange struct's. - */ - -typedef struct memRange { - int start_address; /* first address in range */ - int end_address; /* last */ - int alias; /* bit mask defining how/if memory range is aliased - * e.g. alias = 0x80 means start_address is identical - * to the memory location at (0x80 | start_address) */ - int bank; /* PIC memory bank this range occupies */ - -} memRange; - -/* AssignedMemory - A structure to keep track of the memory that has been used. - * - * When a register gets assigned an address this struct is used to - * keep track of a few details about the register. There is one of - * these structures for each memory location in the device. - */ - -typedef struct AssignedMemory { - regs *reg; /* Pointer to the register (NULL if this is an invalid address) */ - int instance; /* the i'th byte of a multibyte register */ - int alias; /* Bit mapping of aliased addresses (see memRange) */ - int bank; /* Memory bank of this register */ - int isValid:1; /* True if the address is legal */ - int isSFR:1; /* True if the address is that of a Special Function reg */ - int isEmitted:1; /* True if the register has been written to a cBlock */ - -} AssignedMemory; +#define CONFIGURATION_WORDS 20 +#define IDLOCATION_BYTES 20 +typedef struct { + int sfrLoAddr; + int sfrHiAddr; +} sfrRangeInfo_t; + -/* - * pic16_finalMapping - Dynamically allocated array that records the register assignments - */ +typedef struct { + unsigned int mask; + int emit; + unsigned int value; +} configRegInfo_t; -extern AssignedMemory *pic16_finalMapping; +typedef struct { + int confAddrStart; /* starting address */ + int confAddrEnd; /* ending address */ + configRegInfo_t crInfo[ CONFIGURATION_WORDS ]; +} configWordsInfo_t; -/* - * pic16_finalMappingSize - Size of register assignments that pic16_finalMapping can hold - */ +typedef struct { + unsigned char emit; + unsigned char value; +} idRegInfo_t; -extern int pic16_finalMappingSize; +typedef struct { + int idAddrStart; /* starting ID address */ + int idAddrEnd; /* ending ID address */ + idRegInfo_t irInfo[ IDLOCATION_BYTES ]; +} idBytesInfo_t; #define PROCESSOR_NAMES 4 /* Processor unique attributes */ -typedef struct PIC_device { +typedef struct PIC16_device { char *name[PROCESSOR_NAMES];/* aliases for the processor name */ - memRange *ram; /* RAM memory map */ - memRange *sfr; /* SFR memory map */ - - int maxRAMaddress; /* maximum value for a data address */ - int bankMask; /* Bitmask that is ANDed with address to extract banking bits */ - // int hasAliasedRAM:1; /* True if there are bank independent registers */ - -} PIC_device; + int maxRAMaddress; /* maximum value for a data address */ + int RAMsize; /* size of Data RAM - VR 031120 */ + int acsSplitOfs; /* access bank split offset */ + int extMIface; /* device has external memory interface */ + sfrRangeInfo_t sfrRange; /* SFR range */ + configWordsInfo_t cwInfo; /* configuration words info */ + idBytesInfo_t idInfo; /* ID Locations info */ +} PIC16_device; /* Given a pointer to a register, this macro returns the bank that it is in */ #define REG_ADDR(r) ((r)->isBitField ? (((r)->address)>>3) : (r)->address) -#define REG_BANK(r) (pic16_finalMapping[REG_ADDR(r)].bank) -#define REG_isALIASED(r) (pic16_finalMapping[REG_ADDR(r)].alias != 0) -#define REG_isVALID(r) (pic16_finalMapping[REG_ADDR(r)].isValid) +#define OF_LR_SUPPORT 0x00000001 +#define OF_OPTIMIZE_GOTO 0x00000002 +#define OF_OPTIMIZE_CMP 0x00000004 +#define OF_OPTIMIZE_DF 0x00000008 + +typedef struct { + int no_banksel; + int opt_banksel; + int omit_configw; + int omit_ivt; + int leave_reset; + int stack_model; + int ivt_loc; + int nodefaultlibs; + int dumpcalltree; + char *crt_name; + int no_crt; + int ip_stack; + unsigned long opt_flags; + int gstack; + unsigned int debgen; + int CATregs; +} pic16_options_t; + +extern int xinst; + +#define STACK_MODEL_SMALL (pic16_options.stack_model == 0) +#define STACK_MODEL_LARGE (pic16_options.stack_model == 1) + +extern set *fix_idataSymSet; +extern set *rel_idataSymSet; + +#if 0 +/* This is an experimental code for #pragma inline + and is temporarily disabled for 2.5.0 release */ +extern set *asmInlineMap; +#endif /* 0 */ + +typedef struct { + unsigned long isize; + unsigned long adsize; + unsigned long udsize; + unsigned long idsize; + unsigned long intsize; +} stats_t; + +extern stats_t statistics; + +extern pic16_options_t pic16_options; +extern PIC16_device *pic16; /****************************************/ -void pic16_assignConfigWordValue(int address, int value); -int pic16_getConfigWord(int address); +void pic16_assignConfigWordValue(int address, unsigned int value); +void pic16_assignIdByteValue(int address, char value); int pic16_isREGinBank(regs *reg, int bank); int pic16_REGallBanks(regs *reg); -void pic16_addMemRange(memRange *r, int type); void pic16_setMaxRAM(int size); +int PIC16_IS_CONFIG_ADDRESS(int address); +int PIC16_IS_IDLOC_ADDRESS(int address); +int PIC16_IS_HWREG_ADDRESS(int address); + +int checkAddReg(set **set, regs *reg); +int checkAddSym(set **set, symbol *reg); +int checkSym(set *set, symbol *reg); #endif /* __DEVICE_H__ */