#ifndef __DEVICE_H__
#define __DEVICE_H__
+#include "common.h"
+
+/*
+ * Imports
+ */
+extern char *iComments2;
+
/* memRange - a structure to define a range of valid memory addresses
*
* The Memory of most PICs (and other micros) is a collection of
*/
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 */
+ 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 */
+ struct memRange *next; /* linked list */
} 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;
-
-
-/*
- * finalMapping - Dynamically allocated array that records the register assignments
- */
-
-extern AssignedMemory *finalMapping;
-#define PROCESSOR_NAMES 4
/* Processor unique attributes */
typedef struct PIC_device {
- char *name[PROCESSOR_NAMES];/* aliases for the processor name */
+ char *name; /* the processor name */
+
+ memRange *ram; /* RAM memory map */
+ memRange *sfr; /* SFR memory map */
+
+ int maxRAMaddress; /* maximum value for a data address */
+ int defMaxRAMaddrs; /* default 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 */
+ int hasSecondConfigReg; /* True if there is a second configuration register */
+
+ int programMemSize; /* program memory size in words - for device listing only */
+ int dataMemSize; /* data (RAM) memory size in bytes - for device listing only */
+ int eepromMemSize; /* EEPROM memory size in bytes - for device listing only */
+ int ioPins; /* number of I/O pins - for device listing only */
- memRange *ram; /* RAM memory map */
- memRange *sfr; /* SFR memory map */
+} PIC_device;
- int maxRAMaddress; /* maximum value for a data address */
- // int hasAliasedRAM:1; /* True if there are bank independent registers */
-} PIC_device;
+PIC_device *init_pic(char *pic_type);
+int picIsInitialized(void);
+char *processor_base_name(void);
+int IS_CONFIG_ADDRESS(int addr);
+void pic14_assignConfigWordValue(int address, int value);
+int pic14_emitConfigWord(FILE *vFile);
-/* Given a pointer to a register, this macro returns the bank that it is in */
-#define REG_BANK(r) (finalMapping[(r)->address].bank)
-#define REG_isALIASED(r) (finalMapping[(r)->address].alias != 0)
-#define REG_isVALID(r) (finalMapping[(r)->address].isValid)
+int pic14_allRAMShared(void);
+int pic14_getSharedStack(int *low, int *high, int *size);
+PIC_device * pic14_getPIC(void);
#endif /* __DEVICE_H__ */