#include "common.h"
#include "main.h"
#include "ralloc.h"
-#include "gen.h"
+#include "device.h"
+#include "SDCCutil.h"
+//#include "gen.h"
+
static char _defaultRules[] =
{
NULL
};
+void pCodeInitRegisters(void);
void pic14_assignRegisters (eBBlock ** ebbs, int count);
_pic14_init (void)
{
asm_addTree (&asm_asxxxx_mapping);
+ pCodeInitRegisters();
}
static void
{
/* for this processor it is simple
can pass only the first parameter in a register */
- if (regParmFlg)
- return 0;
+ //if (regParmFlg)
+ // return 0;
+
+ regParmFlg++;// = 1;
+ return 1;
+}
+
+static int
+_process_pragma(const char *sz)
+{
+ static const char *WHITE = " \t";
+ char *ptr = strtok((char *)sz, WHITE);
+
+ if (startsWith (ptr, "memmap"))
+ {
+ char *start;
+ char *end;
+ char *type;
+ char *alias;
+
+ start = strtok((char *)NULL, WHITE);
+ end = strtok((char *)NULL, WHITE);
+ type = strtok((char *)NULL, WHITE);
+ alias = strtok((char *)NULL, WHITE);
+
+ if (start != (char *)NULL
+ && end != (char *)NULL
+ && type != (char *)NULL) {
+ value *startVal = constVal(start);
+ value *endVal = constVal(end);
+ value *aliasVal;
+ memRange r;
+
+ if (alias == (char *)NULL) {
+ aliasVal = constVal(0);
+ } else {
+ aliasVal = constVal(alias);
+ }
+
+ r.start_address = (int)floatFromVal(startVal);
+ r.end_address = (int)floatFromVal(endVal);
+ r.alias = (int)floatFromVal(aliasVal);
+ r.bank = (r.start_address >> 7) & 3;
- regParmFlg = 1;
+ if (strcmp(type, "RAM") == 0) {
+ addMemRange(&r, 0);
+ } else if (strcmp(type, "SFR") == 0) {
+ addMemRange(&r, 1);
+ } else {
+ return 1;
+ }
+ }
+
+ return 0;
+ } else if (startsWith (ptr, "maxram")) {
+ char *maxRAM = strtok((char *)NULL, WHITE);
+
+ if (maxRAM != (char *)NULL) {
+ int maxRAMaddress;
+ value *maxRAMVal;
+
+ maxRAMVal = constVal(maxRAM);
+ maxRAMaddress = (int)floatFromVal(maxRAMVal);
+ setMaxRAM(maxRAMaddress);
+ }
+
+ return 0;
+ }
return 1;
}
static void
_pic14_finaliseOptions (void)
{
+
+ port->mem.default_local_map = data;
+ port->mem.default_globl_map = data;
+#if 0
/* Hack-o-matic: if we are using the flat24 model,
* adjust pointer sizes.
*/
istack->ptrType = FPOINTER;
}
}
+#endif
}
static void
return "err";
}
+extern char *processor_base_name(void);
+
static void
_pic14_genAssemblerPreamble (FILE * of)
{
- fprintf (of, "\tlist\tp=16c84\n");
- fprintf (of, "\t__config _wdt_off\n");
- fprintf (of, "\ninclude \"p16c84.inc\"\n");
+ char * name = processor_base_name();
+
+ if(!name) {
+
+ name = "p16f877";
+ fprintf(stderr,"WARNING: No Pic has been selected, defaulting to %s\n",name);
+ }
+
+ fprintf (of, "\tlist\tp=%s\n",&name[1]);
+ fprintf (of, "\t__CONFIG 0x%x\n",getConfigWord(0x2007));
+ fprintf (of, "\tradix dec");
+ fprintf (of, "\ninclude \"%s.inc\"\n",name);
}
/* Generate interrupt vector table. */
return TRUE;
}
+static bool
+_hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right)
+{
+/*
+ sym_link *test = NULL;
+ value *val;
+*/
+
+ fprintf(stderr,"checking for native mult\n");
+
+ if ( ic->op != '*')
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+/*
+ if ( IS_LITERAL (left))
+ {
+ fprintf(stderr,"left is lit\n");
+ test = left;
+ val = OP_VALUE (IC_LEFT (ic));
+ }
+ else if ( IS_LITERAL (right))
+ {
+ fprintf(stderr,"right is lit\n");
+ test = left;
+ val = OP_VALUE (IC_RIGHT (ic));
+ }
+ else
+ {
+ fprintf(stderr,"oops, neither is lit so no\n");
+ return FALSE;
+ }
+
+ if ( getSize (test) <= 2)
+ {
+ fprintf(stderr,"yep\n");
+ return TRUE;
+ }
+ fprintf(stderr,"nope\n");
+
+ return FALSE;
+*/
+}
+
/** $1 is always the basename.
$2 is always the output file.
$3 varies
"aslink", "-nf", "$1", NULL
};
+/* Sigh. This really is not good. For now, I recommend:
+ * sdcc -S -mpic14 file.c
+ * the -S option does not compile or link
+ */
static const char *_asmCmd[] =
{
- "gpasm", NULL, NULL, NULL
+ "gpasm", "-c -I /usr/local/share/gpasm/header -o $2", "$1.asm", NULL
};
/* Globals */
-PORT pic14_port =
+PORT pic_port =
{
+ TARGET_ID_PIC,
"pic14",
"MCU pic", /* Target name */
+ "p16f877", /* Processor */
{
TRUE, /* Emit glue around main */
MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24,
{
_asmCmd,
NULL,
+ NULL,
NULL,
//"-plosgffc", /* Options with debug */
//"-plosgff", /* Options without debug */
- 0
+ 0,
+ ".asm",
+ NULL /* no do_assemble function */
},
{
_linkCmd,
NULL,
+ NULL,
".rel"
},
{
},
{
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
- 1, 1, 2, 4, 1, 2, 1, 1, 4, 4
+ 1, 2, 2, 4, 2, 2, 2, 1, 4, 4
/* TSD - I changed the size of gptr from 3 to 1. However, it should be
2 so that we can accomodate the PIC's with 4 register banks (like the
16f877)
"OSEG (OVR,DATA)",
"GSFINAL (CODE)",
"HOME (CODE)",
+ NULL, // xidata
+ NULL, // xinit
NULL,
NULL,
- 1
+ 1 // code is read only
},
{
+1, 1, 4, 1, 1, 0
},
/* pic14 has an 8 bit mul */
{
- 1, 0
+ 1, -1
},
"_",
_pic14_init,
_pic14_parseOptions,
+ NULL,
_pic14_finaliseOptions,
_pic14_setDefaultOptions,
pic14_assignRegisters,
_pic14_getRegName,
_pic14_keywords,
_pic14_genAssemblerPreamble,
+ NULL, /* no genAssemblerEnd */
_pic14_genIVT,
+ NULL, // _pic14_genXINIT
_pic14_reset_regparm,
_pic14_regparm,
+ _process_pragma, /* process a pragma */
NULL,
+ _hasNativeMulFor,
FALSE,
0, /* leave lt */
0, /* leave gt */
1, /* transform >= to ! < */
1, /* transform != to !(a == b) */
0, /* leave == */
+ FALSE, /* No array initializer support. */
+ 0, /* no CSE cost estimation yet */
+ NULL, /* no builtin functions */
+ GPOINTER, /* treat unqualified pointers as "generic" pointers */
+ 1, /* reset labelKey to 1 */
+ 1, /* globals & local static allowed */
PORT_MAGIC
};