ad8a890d9909c063e8a273ca89e9d2132046b0d9
[fw/sdcc] / src / pic / device.h
1 /*-------------------------------------------------------------------------
2
3    device.c - Accomodates subtle variations in PIC devices
4    Written By -  Scott Dattalo scott@dattalo.com
5
6    This program is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by the
8    Free Software Foundation; either version 2, or (at your option) any
9    later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 -------------------------------------------------------------------------*/
20
21 /*
22   PIC device abstraction
23
24   There are dozens of variations of PIC microcontrollers. This include
25   file attempts to abstract those differences so that SDCC can easily
26   deal with them.
27 */
28
29 #ifndef  __DEVICE_H__
30 #define  __DEVICE_H__
31
32 /* memRange - a structure to define a range of valid memory addresses 
33  * 
34  * The Memory of most PICs (and other micros) is a collection of
35  * disjoint chunks. The memRange structure will define the start
36  * and end address of one of these chunks. The memory map of a
37  * particular device is a collection of memRange struct's.
38  */
39
40 typedef struct memRange {
41         int start_address;      /* first address in range */
42         int end_address;        /* last */
43         int alias;              /* bit mask defining how/if memory range is aliased 
44                                  * e.g. alias = 0x80 means start_address is identical
45                                  * to the memory location at (0x80 | start_address) */
46         int bank;               /* PIC memory bank this range occupies */
47
48 } memRange;
49
50 /* AssignedMemory - A structure to keep track of the memory that has been used.
51  *
52  * When a register gets assigned an address this struct is used to
53  * keep track of a few details about the register. There is one of
54  * these structures for each memory location in the device.
55  */
56
57 typedef struct AssignedMemory {
58         regs *reg;        /* Pointer to the register (NULL if this is an invalid address) */
59         int  instance;    /* the i'th byte of a multibyte register */
60         int  alias;       /* Bit mapping of aliased addresses (see memRange) */
61         int  bank;        /* Memory bank of this register */
62         int  isValid:1;   /* True if the address is legal */
63         int  isSFR:1;     /* True if the address is that of a Special Function reg */
64         int  isEmitted:1; /* True if the register has been written to a cBlock */
65
66 } AssignedMemory;
67
68
69 /*
70  * finalMapping - Dynamically allocated array that records the register assignments
71  */
72
73 extern AssignedMemory *finalMapping;
74 /* Processor unique attributes */
75 typedef struct PIC_device {
76         char *name;                 /* the processor name */
77
78         memRange *ram;              /* RAM memory map */
79         memRange *sfr;              /* SFR memory map */
80
81         int maxRAMaddress;          /* maximum value for a data address */
82         int defMaxRAMaddrs;         /* default maximum value for a data address */
83         int bankMask;               /* Bitmask that is ANDed with address to extract banking bits */
84         //  int hasAliasedRAM:1;        /* True if there are bank independent registers */
85         int hasSecondConfigReg;     /* True if there is a second configuration register */
86         
87         int programMemSize;         /* program memory size in words - for device listing only */
88         int dataMemSize;            /* data (RAM) memory size in bytes - for device listing only */
89         int eepromMemSize;          /* EEPROM memory size in bytes - for device listing only */
90         int ioPins;                 /* number of I/O pins - for device listing only */
91
92 } PIC_device;
93
94 /* Given a pointer to a register, this macro returns the bank that it is in */
95 #define REG_ADDR(r)        ((r)->isBitField ? (((r)->address)>>3) : (r)->address)
96 #define REG_BANK(r)        (finalMapping[REG_ADDR(r)].bank)
97 #define REG_isALIASED(r)   (finalMapping[REG_ADDR(r)].alias != 0)
98 #define REG_isVALID(r)     (finalMapping[REG_ADDR(r)].isValid)
99
100
101 /****************************************/
102 void assignConfigWordValue(int address, int value);
103 int getConfigWord(int address);
104 int isREGinBank(regs *reg, int bank);
105 int REGallBanks(regs *reg);
106 void addMemRange(memRange *r, int type);
107 void setMaxRAM(int size);
108 void setDefMaxRam(void);
109
110 void pic14_assignConfigWordValue(int address, int value);
111 int pic14_emitConfigWord (FILE * vFile);
112 int pic14_getConfigWord(int address);
113 unsigned pic14_getMaxRam(void);
114 int pic14_getHasSecondConfigReg(void);
115 int pic14_getSharebankSize(void);
116 int pic14_getSharebankAddress(void);
117 PIC_device * pic14_getPIC(void);
118
119 #endif  /* __DEVICE_H__ */