#include "common.h"
#include "main.h"
#include "ralloc.h"
+#include "device.h"
+#include "SDCCutil.h"
//#include "gen.h"
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;
+
+ 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 bool
_pic14_parseOptions (int *pargc, char **argv, int *i)
{
return "err";
}
+extern char *processor_base_name(void);
+
static void
_pic14_genAssemblerPreamble (FILE * of)
{
- fprintf (of, "\tlist\tp=16f877\n");
- fprintf (of, "\t__config _wdt_off\n");
- fprintf (of, "\ninclude \"p16f877.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, "\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
*/
static const char *_linkCmd[] =
{
- "aslink", "-nf", "$1", NULL
+ "gplink", "", "\"$1.o\"", 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", "-c -I /usr/local/share/gpasm/header", "$1.asm", NULL
+ "gpasm", "-c", "\"$1.asm\"", NULL
};
TARGET_ID_PIC,
"pic14",
"MCU pic", /* Target name */
+ "", /* Processor */
{
TRUE, /* Emit glue around main */
MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24,
_linkCmd,
NULL,
NULL,
- ".rel"
+ ".o"
},
{
_defaultRules
},
{
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
- 1, 2, 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)
{
"XSEG (XDATA)",
"STACK (DATA)",
- "CSEG (CODE)",
+ "code",
"DSEG (DATA)",
"ISEG (DATA)",
"XSEG (XDATA)",
"BSEG (BIT)",
"RSEG (DATA)",
"GSINIT (CODE)",
- "OSEG (OVR,DATA)",
+ "udata_ovr",
"GSFINAL (CODE)",
"HOME (CODE)",
NULL, // xidata
NULL, // xinit
NULL,
NULL,
- 1
+ 1 // code is read only
},
{
+1, 1, 4, 1, 1, 0
"_",
_pic14_init,
_pic14_parseOptions,
+ NULL,
_pic14_finaliseOptions,
_pic14_setDefaultOptions,
pic14_assignRegisters,
NULL, // _pic14_genXINIT
_pic14_reset_regparm,
_pic14_regparm,
+ _process_pragma, /* process a pragma */
NULL,
- NULL,
- NULL,
+ _hasNativeMulFor,
FALSE,
0, /* leave lt */
0, /* leave gt */