PO_SFR_REGISTER, // A special function register (e.g. PORTA)
PO_PCL, // Program counter Low register
PO_PCLATH, // Program counter Latch high register
+ PO_PCLATU, // Program counter Latch upper register
+ PO_PRODL, // Product Register Low
+ PO_PRODH, // Product Register High
PO_LITERAL, // A constant
PO_REL_ADDR, // A relative address
PO_IMMEDIATE, // (8051 legacy)
POC_SWAPF,
POC_SWAPFW,
// POC_TRIS , // To be removed
+ POC_TBLRD, // patch 15
+ POC_TBLRD_POSTINC, //
+ POC_TBLRD_POSTDEC, //
+ POC_TBLRD_PREINC, //
+ POC_TBLWT, //
+ POC_TBLWT_POSTINC, //
+ POC_TBLWT_POSTDEC, //
+ POC_TBLWT_PREINC, // patch 15
POC_TSTFSZ,
POC_XORLW,
POC_XORWF,
{
pCodeOp pcop;
int lit;
- int lit2;
+ pCodeOp *arg2;
} pCodeOpLit2;
typedef struct pCodeOpImmd
{
pCodeOp pcop;
- int offset; /* low,med, or high byte of immediat value */
+ int offset; /* low,high or upper byte of immediate value */
int index; /* add this to the immediate value */
unsigned _const:1; /* is in code space */
pCodeAsmDir
**************************************************/
-typedef struct pCodeAsmDir
-{
- pCode pc;
-
- char *directive;
- char *arg;
-
- pBranch *label;
-} pCodeAsmDir;
-
-
/*************************************************
pCodeFlow
} pCodeInstruction;
+
+/*************************************************
+ pCodeAsmDir
+**************************************************/
+
+typedef struct pCodeAsmDir
+{
+ pCodeInstruction pci;
+
+ char *directive;
+ char *arg;
+} pCodeAsmDir;
+
+
/*************************************************
pCodeLabel
**************************************************/
#define isCALL(x) ((isPCI(x)) && (PCI(x)->op == POC_CALL))
#define isSTATUS_REG(r) ((r)->pc_type == PO_STATUS)
#define isBSR_REG(r) ((r)->pc_type == PO_BSR)
-
-#if 0
-/* these are deprecated since when creating relocatable code, the register
- address is not known (except of course of the SFRs and the Fixed registers)
-*/
-
-
-#define isACCESS_LOW(r) ((pic16_finalMapping[REG_ADDR(r)].bank == \
- PIC_BANK_FIRST) && (REG_ADDR(r) < 0x80))
-#define isACCESS_HI(r) (pic16_finalMapping[REG_ADDR(r)].bank == PIC_BANK_LAST)
-#define isACCESS_BANK(r) (isACCESS_LOW(r) || isACCESS_HI(r))
-
-#endif
-
-//#define isACCESS_BANK(r) (REG_ADDR(r)!= 0)
#define isACCESS_BANK(r) (r->accessBank)
-// && pic16_finalMapping[REG_ADDR(r)].isSFR)
-// || (pic16_finalMapping[(r)->rIdx].reg && pic16_finalMapping[(r)->rIdx].reg->isFixed))
void pic16_printCallTree(FILE *of);
void pCodePeepInit(void);
void pic16_pBlockConvert2ISR(pBlock *pb);
+void pic16_pBlockConvert2Absolute(pBlock *pb);
+void pic16_emitDB(pBlock *pb, char c); // Add DB directives to a pBlock
+void pic16_flushDB(pBlock *pb); // Add pending DB data to a pBlock
+
+pCode *pic16_newpCodeAsmDir(char *asdir, char *argfmt, ...);
pCodeOp *pic16_newpCodeOpLabel(char *name, int key);
pCodeOp *pic16_newpCodeOpImmd(char *name, int offset, int index, int code_space);
pCodeOp *pic16_newpCodeOpLit(int lit);
-pCodeOp *pic16_newpCodeOpLit2(int lit, int lit2);
+pCodeOp *pic16_newpCodeOpLit2(int lit, pCodeOp *arg2);
pCodeOp *pic16_newpCodeOpBit(char *name, int bit,int inBitSpace);
pCodeOp *pic16_newpCodeOpRegFromStr(char *name);
pCodeOp *pic16_newpCodeOp(char *name, PIC_OPTYPE p);
struct regs * pic16_getRegFromInstruction2(pCode *pc);
extern void pic16_pcode_test(void);
+extern int pic16_debug_verbose;
+extern int pic16_pcode_verbose;
/*-----------------------------------------------------------------*
* pCode objects.
extern pCodeOpReg pic16_pc_status;
extern pCodeOpReg pic16_pc_intcon;
-extern pCodeOpReg pic16_pc_indf0;
-extern pCodeOpReg pic16_pc_fsr0;
extern pCodeOpReg pic16_pc_pcl;
extern pCodeOpReg pic16_pc_pclath;
+extern pCodeOpReg pic16_pc_pclatu; // patch 14
extern pCodeOpReg pic16_pc_wreg;
+extern pCodeOpReg pic16_pc_tosl; // patch 14
+extern pCodeOpReg pic16_pc_tosh; // patch 14
+extern pCodeOpReg pic16_pc_tosu; // patch 14
+extern pCodeOpReg pic16_pc_tblptrl; // patch 15
+extern pCodeOpReg pic16_pc_tblptrh; //
+extern pCodeOpReg pic16_pc_tblptru; //
+extern pCodeOpReg pic16_pc_tablat; // patch 15
+extern pCodeOpReg pic16_pc_bsr;
+extern pCodeOpReg pic16_pc_fsr0;
+extern pCodeOpReg pic16_pc_fsr0l;
+extern pCodeOpReg pic16_pc_fsr0h;
extern pCodeOpReg pic16_pc_fsr1l;
extern pCodeOpReg pic16_pc_fsr1h;
extern pCodeOpReg pic16_pc_fsr2l;
extern pCodeOpReg pic16_pc_fsr2h;
+extern pCodeOpReg pic16_pc_indf0;
+extern pCodeOpReg pic16_pc_postinc0;
+extern pCodeOpReg pic16_pc_postdec0;
+extern pCodeOpReg pic16_pc_preinc0;
+extern pCodeOpReg pic16_pc_plusw0;
+extern pCodeOpReg pic16_pc_indf1;
extern pCodeOpReg pic16_pc_postinc1;
extern pCodeOpReg pic16_pc_postdec1;
+extern pCodeOpReg pic16_pc_preinc1;
+extern pCodeOpReg pic16_pc_plusw1;
+extern pCodeOpReg pic16_pc_indf2;
+extern pCodeOpReg pic16_pc_postinc2;
+extern pCodeOpReg pic16_pc_postdec2;
extern pCodeOpReg pic16_pc_preinc2;
extern pCodeOpReg pic16_pc_plusw2;
+extern pCodeOpReg pic16_pc_prodl;
+extern pCodeOpReg pic16_pc_prodh;
extern pCodeOpReg pic16_pc_kzero;
extern pCodeOpReg pic16_pc_wsave; /* wsave and ssave are used to save W and the Status */