diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /src/pic16/device.h | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'src/pic16/device.h')
| -rw-r--r-- | src/pic16/device.h | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/pic16/device.h b/src/pic16/device.h new file mode 100644 index 0000000..cdfbba0 --- /dev/null +++ b/src/pic16/device.h @@ -0,0 +1,147 @@ +/*------------------------------------------------------------------------- + + device.c - Accomodates subtle variations in PIC16 devices + + Written By - Scott Dattalo scott@dattalo.com + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +-------------------------------------------------------------------------*/ + +/* + PIC device abstraction + + There are dozens of variations of PIC microcontrollers. This include + file attempts to abstract those differences so that SDCC can easily + deal with them. +*/ + +#ifndef __DEVICE_H__ +#define __DEVICE_H__ + +#define CONFIGURATION_WORDS 20 +#define IDLOCATION_BYTES 20 + +typedef struct { + unsigned int mask; + int emit; + unsigned int value; + unsigned int andmask; +} configRegInfo_t; + +typedef struct { + int confAddrStart; /* starting address */ + int confAddrEnd; /* ending address */ + configRegInfo_t crInfo[ CONFIGURATION_WORDS ]; +} configWordsInfo_t; + +typedef struct { + unsigned char emit; + unsigned char value; +} idRegInfo_t; + +typedef struct { + int idAddrStart; /* starting ID address */ + int idAddrEnd; /* ending ID address */ + idRegInfo_t irInfo[ IDLOCATION_BYTES ]; +} idBytesInfo_t; + + +#define PROCESSOR_NAMES 4 +/* Processor unique attributes */ +typedef struct PIC16_device { + char *name[PROCESSOR_NAMES]; /* aliases for the processor name */ + /* RAMsize *must* be the first item to copy for 'using' */ + unsigned int RAMsize; /* size of Data RAM - VR 031120 */ + unsigned int acsSplitOfs; /* access bank split offset */ + configWordsInfo_t cwInfo; /* configuration words info */ + idBytesInfo_t idInfo; /* ID Locations info */ + int xinst; /* device supports XINST */ + /* next *must* be the first field NOT being copied via 'using' */ + struct PIC16_device *next; /* linked list */ +} PIC16_device; + +extern PIC16_device *pic16; + +/* Given a pointer to a register, this macro returns the bank that it is in */ +#define REG_ADDR(r) ((r)->isBitField ? (((r)->address)>>3) : (r)->address) + +#define OF_LR_SUPPORT 0x00000001 +#define OF_NO_OPTIMIZE_GOTO 0x00000002 +#define OF_OPTIMIZE_CMP 0x00000004 +#define OF_OPTIMIZE_DF 0x00000008 + +typedef struct { + int no_banksel; + int opt_banksel; + int omit_configw; + int omit_ivt; + int leave_reset; + int stack_model; + int ivt_loc; + int nodefaultlibs; + int dumpcalltree; + char *crt_name; + int no_crt; + int ip_stack; + unsigned long opt_flags; + int gstack; + unsigned int debgen; + int xinst; + int no_warn_non_free; +} pic16_options_t; + +extern pic16_options_t pic16_options; + +#define STACK_MODEL_SMALL (pic16_options.stack_model == 0) +#define STACK_MODEL_LARGE (pic16_options.stack_model == 1) + +extern set *fix_idataSymSet; +extern set *rel_idataSymSet; + +#if 0 +/* This is an experimental code for #pragma inline + and is temporarily disabled for 2.5.0 release */ +extern set *asmInlineMap; +#endif /* 0 */ + +typedef struct { + unsigned long isize; + unsigned long adsize; + unsigned long udsize; + unsigned long idsize; + unsigned long intsize; +} stats_t; + +extern stats_t statistics; + +typedef struct pic16_config_options_s { + char *config_str; + struct pic16_config_options_s *next; +} pic16_config_options_t; + +extern pic16_config_options_t *pic16_config_options; + +/****************************************/ +const char *pic16_processor_base_name(void); +void pic16_assignConfigWordValue(int address, unsigned int value); +void pic16_assignIdByteValue(int address, char value); +int pic16_isREGinBank(reg_info *reg, int bank); +int pic16_REGallBanks(reg_info *reg); + +int checkAddReg(set **set, reg_info *reg); +int checkAddSym(set **set, symbol *reg); +int checkSym(set *set, symbol *reg); + +#endif /* __DEVICE_H__ */ |
