pic16 progress by Vangelis
[fw/sdcc] / src / pic16 / device.h
1 /*-------------------------------------------------------------------------
2
3    device.c - Accomodates subtle variations in PIC16 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  * pic16_finalMapping - Dynamically allocated array that records the register assignments
71  */
72
73 extern AssignedMemory *pic16_finalMapping;
74
75 /*
76  * pic16_finalMappingSize - Size of register assignments that pic16_finalMapping can hold
77  */
78
79 extern int pic16_finalMappingSize;
80
81
82 #define PROCESSOR_NAMES    4
83 /* Processor unique attributes */
84 typedef struct PIC_device {
85   char *name[PROCESSOR_NAMES];/* aliases for the processor name */
86
87   memRange *ram;              /* RAM memory map */
88   memRange *sfr;              /* SFR memory map */
89
90   int maxRAMaddress;          /* maximum value for a data address */
91   int bankMask;               /* Bitmask that is ANDed with address to extract banking bits */
92   //  int hasAliasedRAM:1;        /* True if there are bank independent registers */
93
94 } PIC_device;
95
96 /* Given a pointer to a register, this macro returns the bank that it is in */
97 #define REG_ADDR(r)        ((r)->isBitField ? (((r)->address)>>3) : (r)->address)
98 #define REG_BANK(r)        (pic16_finalMapping[REG_ADDR(r)].bank)
99 #define REG_isALIASED(r)   (pic16_finalMapping[REG_ADDR(r)].alias != 0)
100 #define REG_isVALID(r)     (pic16_finalMapping[REG_ADDR(r)].isValid)
101
102
103 /****************************************/
104 void pic16_assignConfigWordValue(int address, int value);
105 int pic16_getConfigWord(int address);
106 int pic16_isREGinBank(regs *reg, int bank);
107 int pic16_REGallBanks(regs *reg);
108 void pic16_addMemRange(memRange *r, int type);
109 void pic16_setMaxRAM(int size);
110
111 #endif  /* __DEVICE_H__ */