* device/lib/Makefile.in: removed comment line with model-pic16,
[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
41 typedef struct {
42         int mask;
43         int emit;
44         int value;
45 } configRegInfo;
46
47 typedef struct {
48         int confAddrStart;      /* starting address */
49         int confAddrEnd;        /* ending address */
50         configRegInfo crInfo[ CONFIGURATION_WORDS ];
51 } configWordsInfo;
52
53
54
55 #define PROCESSOR_NAMES    4
56 /* Processor unique attributes */
57 typedef struct PIC16_device {
58   char *name[PROCESSOR_NAMES];/* aliases for the processor name */
59
60   int maxRAMaddress;          /* maximum value for a data address */
61   int bankMask;               /* Bitmask that is ANDed with address to extract banking bits */
62   int RAMsize;                /* size of Data RAM - VR 031120 */
63   int extMIface;               /* device has external memory interface */
64   configWordsInfo cwInfo;       /* configuration words info */
65 } PIC16_device;
66
67 /* Given a pointer to a register, this macro returns the bank that it is in */
68 #define REG_ADDR(r)        ((r)->isBitField ? (((r)->address)>>3) : (r)->address)
69 //#define REG_BANK(r)        (pic16_finalMapping[REG_ADDR(r)].bank)
70 //#define REG_isALIASED(r)   (pic16_finalMapping[REG_ADDR(r)].alias != 0)
71 //#define REG_isVALID(r)     (pic16_finalMapping[REG_ADDR(r)].isValid)
72
73
74 typedef struct {
75         int no_banksel;
76         int opt_banksel;
77         int omit_configw;
78         int omit_ivt;
79         int leave_reset;
80         int stack_model;
81 } pic16_options_t;
82
83 #define STACK_MODEL_SMALL       (pic16_options.stack_model == 0)
84 #define STACK_MODEL_LARGE       (pic16_options.stack_model == 1)
85
86 extern set *fix_idataSymSet;
87 extern set *rel_idataSymSet;
88
89 extern pic16_options_t pic16_options;
90 extern PIC16_device *pic16;
91
92 /****************************************/
93 void pic16_assignConfigWordValue(int address, int value);
94 int pic16_getConfigWord(int address);
95 int pic16_isREGinBank(regs *reg, int bank);
96 int pic16_REGallBanks(regs *reg);
97 void pic16_setMaxRAM(int size);
98 int PIC16_IS_CONFIG_ADDRESS(int address);
99
100 int checkAddReg(set **set, regs *reg);
101 int checkAddSym(set **set, symbol *reg);
102
103 #endif  /* __DEVICE_H__ */