File: gpprocessor.h

package info (click to toggle)
gputils 1.5.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 159,960 kB
  • sloc: pascal: 1,459,440; ansic: 319,705; sh: 4,323; makefile: 2,134; lex: 1,755; yacc: 1,595
file content (465 lines) | stat: -rw-r--r-- 20,603 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
/* GNU PIC processor definitions
   Copyright (C) 2001, 2002, 2003, 2004, 2005
   Craig Franklin

    Copyright (C) 2014-2016 Molnar Karoly

This file is part of gputils.

gputils 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.

gputils 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 gputils; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

#ifndef __GPPROCESSOR_H__
#define __GPPROCESSOR_H__

/******************************************
        PIC12 definitions
******************************************/

#define PIC12_BANK_SHIFT            5
#define PIC12_BANK_SIZE             (1 << PIC12_BANK_SHIFT)             /* 32 */
#define PIC12_BANK_MASK             (PIC12_BANK_SIZE - 1)
#define PIC12_RAM_ADDR_BITS         PIC12_BANK_SHIFT
#define PIC12_BMSK_BANK             0x007
#define PIC12_PAGE_SHIFT            9
#define PIC12_PAGE_SIZE             (1 << PIC12_PAGE_SHIFT)             /* 512 */
#define PIC12_PAGE_MASK             (PIC12_PAGE_SIZE - 1)
#define PIC12_PAGE_BITS             (PIC12_PC_MASK ^ PIC12_PAGE_MASK)

#define PIC12_REG_STATUS            0x03

#define PIC12_BIT_STATUS_PA0        5
#define PIC12_BIT_STATUS_PA1        6
#define PIC12_BIT_STATUS_PA2        7

#define PIC12_REG_FSR               0x04

#define PIC12_BIT_FSR_RP0           5
#define PIC12_BIT_FSR_RP1           6
#define PIC12_BIT_FSR_RP2           7

#define PIC12_IDLOCS_SIZE           4

/******************************************
        PIC12E definitions
******************************************/

#define PIC12E_BMSK_BANK            0x007

/******************************************
        SX definitions
******************************************/

#define MASK_SX_PAGE                0x007
#define SX_PAGE_BITS                (SX_PC_MASK ^ PIC12_PAGE_MASK)

/******************************************
        PIC14 definitions
******************************************/

#define PIC14_BANK_SHIFT            7
#define PIC14_BANK_SIZE             (1 << PIC14_BANK_SHIFT)             /* 128 */
#define PIC14_BANK_MASK             (PIC14_BANK_SIZE - 1)
#define PIC14_RAM_ADDR_BITS         PIC14_BANK_SHIFT
#define PIC14_PAGE_SHIFT            11
#define PIC14_PAGE_SIZE             (1 << PIC14_PAGE_SHIFT)             /* 2048 */
#define PIC14_PAGE_MASK             (PIC14_PAGE_SIZE - 1)
#define PIC14_PAGE_BITS             (PIC14_PC_MASK ^ PIC14_PAGE_MASK)

#define PIC14_BMSK_BANK             0x0003
#define PIC14_BMSK_PAGE             0x0003

#define PIC14_REG_STATUS            0x03

#define PIC14_BIT_STATUS_RP0        5
#define PIC14_BIT_STATUS_RP1        6
#define PIC14_BIT_STATUS_IRP        7

#define PIC14_REG_PCLATH            0x0A

#define PIC14_BIT_PCLATH_3          3
#define PIC14_BIT_PCLATH_4          4

#define PIC14_IDLOCS_SIZE           PIC12_IDLOCS_SIZE

/******************************************
        PIC14E definitions
******************************************/

#define PIC14E_BMSK_BANK            0x001F
#define PIC14E_BMSK_PAGE512         0x007F
#define PIC14E_PAGE_BITS            (PIC14E_PC_MASK ^ PIC14_PAGE_MASK)
#define PIC14E_PAGE512_SHIFT        8

#define PIC14E_REG_INDF0            0x00
#define PIC14E_REG_FSR0             0x04
#define PIC14E_REG_FSR0L            0x04
#define PIC14E_REG_FSR0H            0x05

#define PIC14E_REG_INDF1            0x01
#define PIC14E_REG_FSR1             0x06
#define PIC14E_REG_FSR1L            0x06
#define PIC14E_REG_FSR1H            0x07
#define PIC14E_REG_BSR              0x08
#define PIC14E_REG_WREG             0x09

    /* Flash (program) memory select bit in FSR0H and FSR1H registers. */
#define PIC14E_FSRxH_FLASH_SEL      0x80

/******************************************
        PIC14EX definitions
******************************************/

#define PIC14EX_BMSK_BANK           0x003F

/******************************************
        PIC16 definitions
******************************************/

#define PIC16_BANK_SHIFT            8
#define PIC16_BANK_SIZE             (1 << PIC16_BANK_SHIFT)             /* 256 */
#define PIC16_BANK_MASK             (PIC16_BANK_SIZE - 1)
#define PIC16_RAM_ADDR_BITS         PIC16_BANK_SHIFT
#define PIC16_PAGE_SHIFT            13
#define PIC16_PAGE_SIZE             (1 << PIC16_PAGE_SHIFT)             /* 8192 */
#define PIC16_PAGE_MASK             (PIC16_PAGE_SIZE - 1)
#define PIC16_PAGE_BITS             (PIC16_PC_MASK ^ PIC16_PAGE_MASK)

#define PIC16_BMSK_BANK             0x00FF
#define PIC16_BMSK_PAGE             0x00FF

#define PIC16_REG_PCLATH            0x03
#define PIC16_REG_WREG              0x0A
#define PIC16_REG_BSR               0x0F

/******************************************
        PIC16E definitions
******************************************/

    /* Call and goto address mask for lower 8 bits. */
#define PIC16E_BMSK_BRANCH_LOWER    0x00FF
    /* Call and goto address mask for higher 12 bits. */
#define PIC16E_BMSK_BRANCH_HIGHER   0x0FFF

#define PIC16E_BMSK_SEC_INSN_WORD   0xF000

#define PIC16E_BMSK_BANK            0x000F

#define PIC16E_REG_BSR              0xFE0
#define PIC16E_REG_WREG             0xFE8
#define PIC16E_REG_PCL              0xFF9
#define PIC16E_REG_TOSL             0xFFD
#define PIC16E_REG_TOSH             0xFFE
#define PIC16E_REG_TOSU             0xFFF

#define PIC16E_IDLOCS_SIZE          8

/******************************************************************************/

struct px;
struct gp_section;

typedef struct _core_sfr_ {
  int         address;
  const char *name;
} core_sfr_t;

typedef struct _vector_ {
  int         address;
  const char *name;
} vector_t;

struct proc_class {
  /* Instruction used in making initialization data sections. */
  unsigned int          retlw;
  /* Value in COFF header. */
  unsigned int          rom_width;
  /* The page size of the program memory. */
  unsigned int          page_size;
  /* The bank size of the RAM memory. */
  unsigned int          bank_size;
  /* The shift value of bank bits in a RAM address. */
  unsigned int          bank_bits_shift;
  /* The number of address bits inside a bank. */
  int                   addr_bits_in_bank;
  /* Bits to shift assembly code address for the COFF file byte address. */
  unsigned int          org_to_byte_shift;
  /* Mask of address bits for the Program Counter. */
  unsigned int          pc_mask;
  /* Mask of address bits for pages. */
  unsigned int          page_mask;
  /* Mask of address bits for banks. */
  unsigned int          bank_mask;
  /* Bitmask of bits that can be stored in the code section address. */
  unsigned int          core_mask;
  /* Bitmask of bits that can be stored in the config section address. */
  unsigned int          config_mask;
  /* Number of digits of the maximum possible flash address. */
  int                   addr_digits;
  /* Number of digits of the instruction word. */
  int                   word_digits;
  /* Number of digits of the config word. */
  int                   config_digits;
  /* These SFRs exist in each MCU which fall within into the PIC1xx family. */
  const core_sfr_t     *core_sfr_table;
  /* Number of the core SFRs. */
  unsigned int          core_sfr_number;
  /* This table contains traits of the interrupt vectors. */
  const vector_t       *vector_table;
  /* Number of the interrupt vectors. */
  unsigned int          vector_number;
  /* Get the start address for ID location. */
  unsigned int        (*id_location)(const struct px *Processor);

  /* Determine which bank of data memory the address is located. */
  int                 (*bank_from_addr)(int Address);

  /* Set the bank bits, return the number of instructions required. */
  unsigned int        (*set_bank)(unsigned int Num_banks, unsigned int Bank, MemBlock_t *M,
                                  unsigned int Byte_address, gp_boolean Mpasm_compatible);

  unsigned int        (*banksel_byte_length)(unsigned int Num_banks, gp_boolean Mpasm_compatible);

  /* Determine which ibank of data memory the address is located. */
  int                 (*check_ibank)(int Address);

  /* Set the ibank bits, return the number of instructions required. */
  unsigned int        (*set_ibank)(unsigned int Num_banks, unsigned int Bank, MemBlock_t *M,
                                   unsigned int Byte_address);

  /* Determine which page of program memory the address is located. */
  unsigned int        (*check_page)(unsigned int Insn_address);

  /* Set the page bits, return the number of instructions required. */
  unsigned int        (*set_page)(unsigned int Num_pages, unsigned int Page, MemBlock_t *M,
                                  unsigned int Byte_address, gp_boolean Use_wreg);

  unsigned int        (*pagesel_byte_length)(unsigned int Num_pages, gp_boolean Use_wreg);

  unsigned int        (*page_addr)(unsigned int Insn_address);

  unsigned int        (*addr_from_page_bits)(unsigned int Bits);

  /* These return the bits to set in instruction for given address. */
  unsigned int        (*reloc_call)(unsigned int Insn_address);
  unsigned int        (*reloc_goto)(unsigned int Insn_address);
  unsigned int        (*reloc_f)(unsigned int Address);
  unsigned int        (*reloc_tris)(unsigned int Address);
  unsigned int        (*reloc_movlb)(unsigned int Address);
  unsigned int        (*reloc_bra)(const struct gp_section *Section, unsigned int Value,
                                   unsigned int Byte_address);

  unsigned int        (*reloc_high)(gp_boolean Is_code, unsigned int Value);

  const insn_t         *instructions;
  const unsigned int   *num_instructions;
  const insn_t       *(*find_insn)(const struct proc_class *Class, unsigned int Opcode);

  unsigned int        (*i_memory_get)(const MemBlock_t *M, unsigned int Byte_address, uint16_t *Word,
                                      const char **Section_name, const char **Symbol_name);

  void                (*i_memory_put)(MemBlock_t *M, unsigned int Byte_address, uint16_t Value,
                                      const char *Section_name, const char *Symbol_name);

  void                (*patch_strict)(void);
};

typedef const struct proc_class *proc_class_t;

#define PROC_CLASS_UNKNOWN          ((proc_class_t)0)   /* Unknown device. */

extern const struct proc_class proc_class_eeprom8;   /* 8 bit EEPROM */
extern const struct proc_class proc_class_eeprom16;  /* 16 bit EEPROM */
extern const struct proc_class proc_class_generic;   /* 12 bit device */
extern const struct proc_class proc_class_pic12;     /* 12 bit devices */
extern const struct proc_class proc_class_pic12e;    /* extended 12 bit devices */
extern const struct proc_class proc_class_pic12i;    /* extended 12 bit devices */
extern const struct proc_class proc_class_sx;        /* 12 bit devices */
extern const struct proc_class proc_class_pic14;     /* 14 bit devices */
extern const struct proc_class proc_class_pic14e;    /* enhanced 14 bit devices */
extern const struct proc_class proc_class_pic14ex;   /* enhanced 14 bit devices */
extern const struct proc_class proc_class_pic16;     /* 16 bit devices */
extern const struct proc_class proc_class_pic16e;    /* enhanced 16 bit devices */

#define PROC_CLASS_EEPROM8          (&proc_class_eeprom8)
#define PROC_CLASS_EEPROM16         (&proc_class_eeprom16)
#define PROC_CLASS_GENERIC          (&proc_class_generic)
#define PROC_CLASS_PIC12            (&proc_class_pic12)
#define PROC_CLASS_PIC12E           (&proc_class_pic12e)
#define PROC_CLASS_PIC12I           (&proc_class_pic12i)
#define PROC_CLASS_SX               (&proc_class_sx)
#define PROC_CLASS_PIC14            (&proc_class_pic14)
#define PROC_CLASS_PIC14E           (&proc_class_pic14e)
#define PROC_CLASS_PIC14EX          (&proc_class_pic14ex)
#define PROC_CLASS_PIC16            (&proc_class_pic16)
#define PROC_CLASS_PIC16E           (&proc_class_pic16e)

#define IS_EEPROM8                  state.device.class == PROC_CLASS_EEPROM8
#define IS_EEPROM16                 state.device.class == PROC_CLASS_EEPROM16
#define IS_PIC12_CORE               state.device.class == PROC_CLASS_PIC12
#define IS_PIC12E_CORE              state.device.class == PROC_CLASS_PIC12E
#define IS_PIC12I_CORE              state.device.class == PROC_CLASS_PIC12I
#define IS_SX_CORE                  state.device.class == PROC_CLASS_SX
#define IS_PIC14_CORE               state.device.class == PROC_CLASS_PIC14
#define IS_PIC14E_CORE              state.device.class == PROC_CLASS_PIC14E
#define IS_PIC14EX_CORE             state.device.class == PROC_CLASS_PIC14EX
#define IS_PIC16_CORE               state.device.class == PROC_CLASS_PIC16
#define IS_PIC16E_CORE              state.device.class == PROC_CLASS_PIC16E

#define MAX_NAMES                   3          /* Maximum number of names a processor can have. */
#define MAX_BADROM                  (1 * 2)    /* Maximum number of BADROM ranges a processor can be initialized with. */

#define CPU_HAVE_EXTINST            (1 << 0)   /* The device supports the 16 bit extended instruction set. */
#define CPU_18FJ_FAMILY             (1 << 1)   /* The device member of the "J" series. (18f..J..) */
#define CPU_NO_OPTION_INSN          (1 << 2)   /* This - 14 bits - MCU not have the "option" instruction. */

struct px {
  proc_class_t  class;
  const char   *defined_as;
  const char   *names[MAX_NAMES];
  uint32_t      coff_type;
  int           num_pages;
  int           num_banks;
  /* These bank bits exists in the reality. */
  int           bank_bits;
  /* The bounds of common (access) RAM, if exist in the PIC12, PIC12E, PIC12I, PIC14, PIC14E, PIC14EX, PIC16 and PIC16E families. */
  int           common_ram_addrs[2];
  int           common_ram_max;
  /* The bounds of linear RAM in the PIC14E family. */
  int           linear_ram_addrs[2];
  /* These are in org to make it easier to fill from the datasheet. */
  int           maxram;
  int           maxrom;
  int           prog_mem_size;
  int           badrom[MAX_BADROM];
  int           idlocs_addrs[2];
  int           config_addrs[2];
  int           eeprom_addrs[2];
  /* This is an OR mask for the PIC12, PIC12E, PIC12I, PIC14, PIC14E and PIC14EX families. PIC12x: 0x0FF0, PIC14x: 0x3F80 */
  int           idlocs_mask;
  /* Use the gpdasm. */
  const char   *header;
  const char   *script;
  unsigned int  cpu_flags;
};

typedef const struct px *pic_processor_t;

/* CONFIG addresses for the 18xx parts */
#define CONFIG1L                    0x300000
#define CONFIG1H                    0x300001
#define CONFIG2L                    0x300002
#define CONFIG2H                    0x300003
#define CONFIG3L                    0x300004
#define CONFIG3H                    0x300005
#define CONFIG4L                    0x300006
#define CONFIG4H                    0x300007
#define CONFIG5L                    0x300008
#define CONFIG5H                    0x300009
#define CONFIG6L                    0x30000a
#define CONFIG6H                    0x30000b
#define CONFIG7L                    0x30000c
#define CONFIG7H                    0x30000d

#define DEVID1                      0x3ffffe
#define DEVID2                      0x3fffff

extern void gp_dump_processor_list(gp_boolean List_all, proc_class_t Class0, proc_class_t Class1,
                                   proc_class_t Class2);

extern void gp_processor_invoke_custom_lister(proc_class_t Class0, proc_class_t Class1, proc_class_t Class2,
                                              void (*Custom_lister)(pic_processor_t));

extern pic_processor_t gp_find_processor(const char *Name);
extern proc_class_t gp_processor_class(pic_processor_t Processor);
extern const char *gp_processor_class_to_str(proc_class_t Class);
extern unsigned int gp_processor_bsr_boundary(pic_processor_t Processor);
extern uint32_t gp_processor_coff_type(pic_processor_t Processor);
extern unsigned int gp_processor_num_pages(pic_processor_t Processor);
extern unsigned int gp_processor_num_banks(pic_processor_t Processor);
extern pic_processor_t gp_processor_coff_proc(uint32_t Coff_type);
extern const char *gp_processor_name(pic_processor_t Processor, unsigned int Choice);
extern const char *gp_processor_coff_name(uint32_t Coff_type, unsigned int Choice);
extern const char *gp_processor_header(pic_processor_t Processor);
extern const char *gp_processor_script(pic_processor_t Processor);
extern unsigned int gp_processor_id_location(pic_processor_t Processor);

extern int gp_byte_from_insn(unsigned int Shift, int Insn_address);
extern int gp_insn_from_byte(unsigned int Shift, int Byte_address);

extern int gp_processor_reg_offs(pic_processor_t Processor, int Address);
extern int gp_processor_bank_addr(pic_processor_t Processor, int Address);
extern int gp_processor_bank_num(pic_processor_t Processor, int Address);
extern int gp_processor_addr_from_bank_num(pic_processor_t Processor, int Number);

extern const int *gp_processor_common_ram_exist(pic_processor_t Processor);
extern int gp_processor_is_common_ram_addr(pic_processor_t Processor, int Address);

extern gp_boolean gp_processor_is_p16e_access_low(pic_processor_t Processor, int Address);
extern gp_boolean gp_processor_is_p16e_access_high(pic_processor_t Processor, int Address,
                                                   gp_boolean Mpasm_compatible);

extern gp_boolean gp_processor_is_p16e_access(pic_processor_t Processor, int Address,
                                              gp_boolean Mpasm_compatible);

extern const int *gp_processor_linear_ram_exist(pic_processor_t Processor);
extern int gp_processor_is_linear_ram_addr(pic_processor_t Processor, int Address);

extern const int *gp_processor_idlocs_exist(pic_processor_t Processor);
extern int gp_processor_is_idlocs_org(pic_processor_t Processor, int Org);
extern int gp_processor_is_idlocs_byte_addr(pic_processor_t Processor, int Byte_address);

extern const int *gp_processor_config_exist(pic_processor_t Processor);
extern int gp_processor_is_config_org(pic_processor_t Processor, int Org);
extern int gp_processor_is_config_byte_addr(pic_processor_t Processor, int Byte_address);

extern const int *gp_processor_eeprom_exist(pic_processor_t Processor);
extern int gp_processor_is_eeprom_org(pic_processor_t Processor, int Org);
extern int gp_processor_is_eeprom_byte_addr(pic_processor_t Processor, int Byte_address);

extern unsigned int gp_processor_rom_width(proc_class_t Class);
extern int gp_processor_bank_from_addr(proc_class_t Class, int Address);

extern unsigned int gp_processor_set_bank(proc_class_t Class, unsigned int Num_banks,
                                          unsigned int Bank, MemBlock_t *M, unsigned int Byte_address,
                                          gp_boolean Mpasm_compatible);

extern int gp_processor_check_ibank(proc_class_t Class, int Address);

extern unsigned int gp_processor_set_ibank(proc_class_t Class, unsigned int Num_banks,
                                           unsigned int Bank, MemBlock_t *M, unsigned int Byte_address);

extern unsigned int gp_processor_check_page(proc_class_t Class, unsigned int Address);

extern unsigned int gp_processor_set_page(proc_class_t Class, unsigned int Num_pages, unsigned int Page,
                                          MemBlock_t *M, unsigned int Byte_address, gp_boolean Use_wreg);

extern unsigned int gp_processor_page_addr(proc_class_t Class, unsigned int Insn_address);

extern unsigned int gp_processor_addr_from_page_bits(proc_class_t Class, unsigned int Bits);

extern unsigned int gp_processor_retlw(proc_class_t Class);

extern int gp_processor_byte_from_insn_c(proc_class_t Class, int Insn_address);
extern int gp_processor_byte_from_insn_p(pic_processor_t Processor, int Insn_address);

extern int gp_processor_insn_from_byte_c(proc_class_t Class, int Byte_address);
extern int gp_processor_insn_from_byte_p(pic_processor_t Processor, int Byte_address);

extern const core_sfr_t *gp_processor_find_sfr(proc_class_t Class, unsigned int Address);
extern const char *gp_processor_find_sfr_name(proc_class_t Class, unsigned int Address);
extern const vector_t *gp_processor_find_vector(proc_class_t Class, unsigned int Address);

#endif /* __GPPROCESSOR_H__ */