ada8cd6db2ec80f27a281f01be93c1cb9d2da8c6
[fw/sdcc] / src / pic16 / device.h
1 /*-------------------------------------------------------------------------
2
3   device.c - Accomodates subtle variations in PIC16 devices
4
5    Written By -  Scott Dattalo scott@dattalo.com
6
7    This program is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published by the
9    Free Software Foundation; either version 2, or (at your option) any
10    later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 -------------------------------------------------------------------------*/
21
22 /*
23   PIC device abstraction
24
25   There are dozens of variations of PIC microcontrollers. This include
26   file attempts to abstract those differences so that SDCC can easily
27   deal with them.
28 */
29
30 #ifndef  __DEVICE_H__
31 #define  __DEVICE_H__
32
33 #if defined(__BORLANDC__) || defined(_MSC_VER)
34 #define STRCASECMP stricmp
35 #else
36 #define STRCASECMP strcasecmp
37 #endif
38
39 #define CONFIGURATION_WORDS     20
40 #define IDLOCATION_BYTES        20
41
42 typedef struct {
43         int sfrLoAddr;
44         int sfrHiAddr;
45 } sfrRangeInfo_t;
46         
47
48 typedef struct {
49         unsigned int mask;
50         int emit;
51         unsigned int value;
52 } configRegInfo_t;
53
54 typedef struct {
55         int confAddrStart;      /* starting address */
56         int confAddrEnd;        /* ending address */
57         configRegInfo_t crInfo[ CONFIGURATION_WORDS ];
58 } configWordsInfo_t;
59
60 typedef struct {
61         unsigned char emit;
62         unsigned char value;
63 } idRegInfo_t;
64
65 typedef struct {
66         int idAddrStart;        /* starting ID address */
67         int idAddrEnd;          /* ending ID address */
68         idRegInfo_t irInfo[ IDLOCATION_BYTES ];
69 } idBytesInfo_t;
70
71
72 #define PROCESSOR_NAMES    4
73 /* Processor unique attributes */
74 typedef struct PIC16_device {
75   char *name[PROCESSOR_NAMES];/* aliases for the processor name */
76
77   int maxRAMaddress;            /* maximum value for a data address */
78   int RAMsize;                  /* size of Data RAM - VR 031120 */
79   int acsSplitOfs;              /* access bank split offset */
80   int extMIface;                /* device has external memory interface */
81   sfrRangeInfo_t sfrRange;      /* SFR range */
82   configWordsInfo_t cwInfo;     /* configuration words info */
83   idBytesInfo_t idInfo;         /* ID Locations info */
84 } PIC16_device;
85
86 /* Given a pointer to a register, this macro returns the bank that it is in */
87 #define REG_ADDR(r)        ((r)->isBitField ? (((r)->address)>>3) : (r)->address)
88
89 #define OF_LR_SUPPORT           0x00000001
90 #define OF_OPTIMIZE_GOTO        0x00000002
91 #define OF_OPTIMIZE_CMP         0x00000004
92 #define OF_OPTIMIZE_DF          0x00000008
93
94 typedef struct {
95   int no_banksel;
96   int opt_banksel;
97   int omit_configw;
98   int omit_ivt;
99   int leave_reset;
100   int stack_model;
101   int ivt_loc;
102   int nodefaultlibs;
103   int dumpcalltree;
104   char *crt_name;
105   int no_crt;
106   int ip_stack;
107   unsigned long opt_flags;
108   int gstack;
109   unsigned int debgen;
110   int CATregs;
111 } pic16_options_t;
112
113 extern int xinst;
114
115 #define STACK_MODEL_SMALL       (pic16_options.stack_model == 0)
116 #define STACK_MODEL_LARGE       (pic16_options.stack_model == 1)
117
118 extern set *fix_idataSymSet;
119 extern set *rel_idataSymSet;
120
121 #if 0
122 /* This is an experimental code for #pragma inline
123    and is temporarily disabled for 2.5.0 release */
124 extern set *asmInlineMap;
125 #endif  /* 0 */
126
127 typedef struct {
128   unsigned long isize;
129   unsigned long adsize;
130   unsigned long udsize;
131   unsigned long idsize;
132   unsigned long intsize;
133 } stats_t;
134
135 extern stats_t statistics;
136
137 extern pic16_options_t pic16_options;
138 extern PIC16_device *pic16;
139
140 /****************************************/
141 void pic16_assignConfigWordValue(int address, unsigned int value);
142 void pic16_assignIdByteValue(int address, char value);
143 int pic16_isREGinBank(regs *reg, int bank);
144 int pic16_REGallBanks(regs *reg);
145 void pic16_setMaxRAM(int size);
146 int PIC16_IS_CONFIG_ADDRESS(int address);
147 int PIC16_IS_IDLOC_ADDRESS(int address);
148 int PIC16_IS_HWREG_ADDRESS(int address);
149
150 int checkAddReg(set **set, regs *reg);
151 int checkAddSym(set **set, symbol *reg);
152 int checkSym(set *set, symbol *reg);
153
154 #endif  /* __DEVICE_H__ */