* Makefile.in, configure.in, configure,
[fw/sdcc] / src / xa51 / main.c
old mode 100755 (executable)
new mode 100644 (file)
index 03aa0cb..f73aa78
@@ -1,9 +1,7 @@
-/** @file main.c
-    xa51 specific general functions.
-
-    Note that mlh prepended _xa51_ on the static functions.  Makes
-    it easier to set a breakpoint using the debugger.
+/* @file main.c
+   xa51 specific general functions.
 */
+
 #include "common.h"
 #include "main.h"
 #include "ralloc.h"
@@ -44,15 +42,20 @@ static char *_xa51_keywords[] =
   NULL
 };
 
-extern int rewinds;
-void   _xa51_genAssemblerEnd () {
+/* rewinds declared in SDCCasm.c, function printCLine().
+ * Currently commented out.
+ *
+ * extern int rewinds;
+ */
+void   _xa51_genAssemblerEnd (FILE * of)
+{
   //fprintf (stderr, "Did %d rewind%c for c-line in asm comments\n", rewinds,
   //rewinds==1 ? '\0' : 's');
 }
 
-void xa51_assignRegisters (eBBlock ** ebbs, int count);
+void xa51_assignRegisters (ebbIndex *);
 
-static int regParmFlg = 0;     /* determine if we can register a parameter */
+static int regParmFlg = 0;      /* determine if we can register a parameter */
 
 static void
 _xa51_init (void)
@@ -61,13 +64,13 @@ _xa51_init (void)
 }
 
 static void
-_xa51_reset_regparm ()
+_xa51_reset_regparm (void)
 {
   regParmFlg = 0;
 }
 
 static int
-_xa51_regparm (sym_link * l)
+_xa51_regparm (sym_link * l, bool reentrant)
 {
   return 0; // for now
   /* for this processor it is simple
@@ -91,8 +94,13 @@ _xa51_parseOptions (int *pargc, char **argv, int *i)
 static void
 _xa51_finaliseOptions (void)
 {
+  fprintf (stderr, "*** WARNING *** The XA51 port isn't yet complete\n");
   port->mem.default_local_map = istack;
   port->mem.default_globl_map = xdata;
+  if (options.model!=MODEL_PAGE0) {
+    fprintf (stderr, "-mxa51 only supports --model-page0\n");
+    exit (1);
+  }
 }
 
 static void
@@ -102,6 +110,7 @@ _xa51_setDefaultOptions (void)
   options.intlong_rent=1;
   options.float_rent=1;
   options.stack_loc=0x100;
+  options.data_loc=0;
 }
 
 static const char *
@@ -114,40 +123,47 @@ _xa51_getRegName (struct regs *reg)
 
 /* Generate interrupt vector table. */
 static int
-_xa51_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts)
+_xa51_genIVT (struct dbuf_s * oBuf, symbol ** interrupts, int maxInterrupts)
 {
   return TRUE;
 }
 
 /* Generate code to copy XINIT to XISEG */
 static void _xa51_genXINIT (FILE * of) {
-  fprintf (of, ";      _xa51_genXINIT() start\n");
-  fprintf (of, "       mov     r0,#l_XINIT\n");
-  fprintf (of, "       beq     00002$\n");
-  fprintf (of, "       mov     r1,#s_XINIT\n");
+  fprintf (of, ";       _xa51_genXINIT() start\n");
+  fprintf (of, "        mov     r0,#l_XINIT\n");
+  fprintf (of, "        beq     00002$\n");
+  fprintf (of, "        mov     r1,#s_XINIT\n");
   fprintf (of, "        mov     r2,#s_XISEG\n");
   fprintf (of, "00001$: movc    r3l,[r1+]\n");
   fprintf (of, "        mov     [r2+],r3l\n");
   fprintf (of, "        djnz    r0,00001$\n");
   fprintf (of, "00002$:\n");
-  fprintf (of, ";      _xa51_genXINIT() end\n");
+  fprintf (of, ";       _xa51_genXINIT() end\n");
 }
 
 static void
 _xa51_genAssemblerPreamble (FILE * of)
 {
-  fprintf (of, "_errno\tsfr\t0x00; to keep the fp-lib's happy for now\n\n");
-  fprintf (of, "\t.area CSEG\t(CODE)\n");
-  fprintf (of, "__interrupt_vect:\n");
-  fprintf (of, "\t.dw\t0x8f00\n");
-  fprintf (of, "\t.dw\t__sdcc_gsinit_startup\n");
-  fprintf (of, "\n");
-  fprintf (of, "__sdcc_gsinit_startup:\n");
-  fprintf (of, "\tmov\tr7,#0x%04x\n", options.stack_loc);
-  fprintf (of, "\tcall\t_external_startup\n");
-  _xa51_genXINIT(of);
-  fprintf (of, "\tcall\t_main\n");
-  fprintf (of, "\treset\t;main should not return\n");
+  symbol *mainExists=newSymbol("main", 0);
+  mainExists->block=0;
+
+  if ((mainExists=findSymWithLevel(SymbolTab, mainExists))) {
+    fprintf (of, "\t.area GSINIT\t(CODE)\n");
+    fprintf (of, "__interrupt_vect:\n");
+    fprintf (of, "\t.dw\t0x8f00\n");
+    fprintf (of, "\t.dw\t__sdcc_gsinit_startup\n");
+    fprintf (of, "\n");
+    fprintf (of, "__sdcc_gsinit_startup:\n");
+    fprintf (of, ";\tmov.b\t_SCR,#0x01\t; page zero mode\n");
+    fprintf (of, "\t.db 0x96,0x48,0x40,0x01\n");
+    fprintf (of, "\tmov\tr7,#0x%04x\n", options.stack_loc);
+    fprintf (of, "\tcall\t_external_startup\n");
+    _xa51_genXINIT(of);
+    fprintf (of, "\t.area CSEG\t(CODE)\n");
+    fprintf (of, "\tcall\t_main\n");
+    fprintf (of, "\treset\t;main should not return\n");
+  }
 }
 
 /* dummy linker for now */
@@ -162,21 +178,44 @@ static bool cseCostEstimation (iCode *ic, iCode *pdic)
 
     /* if it is a pointer then return ok for now */
     if (IC_RESULT(ic) && IS_PTR(result_type)) return 1;
-    
-    /* if bitwise | add & subtract then no since xa51 is pretty good at it 
+
+    /* if bitwise | add & subtract then no since xa51 is pretty good at it
        so we will cse only if they are local (i.e. both ic & pdic belong to
        the same basic block */
     if (IS_BITWISE_OP(ic) || ic->op == '+' || ic->op == '-') {
-       /* then if they are the same Basic block then ok */
-       if (ic->eBBlockNum == pdic->eBBlockNum) return 1;
-       else return 0;
+        /* then if they are the same Basic block then ok */
+        if (ic->eBBlockNum == pdic->eBBlockNum) return 1;
+        else return 0;
     }
-       
+
     /* for others it is cheaper to do the cse */
     return 1;
 }
 
-#if 0
+/* Indicate which extended bit operations this port supports */
+static bool
+hasExtBitOp (int op, int size)
+{
+  if (op == RRC
+      || op == RLC
+      || op == GETHBIT
+     )
+    return TRUE;
+  else
+    return FALSE;
+}
+
+/* Indicate the expense of an access to an output storage class */
+static int
+oclsExpense (struct memmap *oclass)
+{
+  if (IN_FARSPACE(oclass))
+    return 1;
+
+  return 0;
+}
+
+
 /** $1 is always the basename.
     $2 is always the output file.
     $3 varies
@@ -185,14 +224,13 @@ static bool cseCostEstimation (iCode *ic, iCode *pdic)
 */
 static const char *_linkCmd[] =
 {
-  "{bindir}{sep}aslink", "-nf", "$1", NULL
+  "xa_link", "", "\"$1\"", NULL
 };
-#endif
 
 /* $3 is replaced by assembler.debug_opts resp. port->assembler.plain_opts */
 static const char *_asmCmd[] =
 {
-  "xa_asm", "$l", "$3", "$1.xa", NULL
+  "xa_rasm", "$l", "$3", "\"$1.asm\"", NULL
 };
 
 /* Globals */
@@ -200,40 +238,46 @@ PORT xa51_port =
 {
   TARGET_ID_XA51,
   "xa51",
-  "MCU 80C51XA",                       /* Target name */
+  "MCU 80C51XA",                /* Target name */
+  NULL,                         /* Processor name */
   {
-    FALSE,                     /* Emit glue around main */
-    MODEL_LARGE,
-    MODEL_LARGE
+    glue,
+    FALSE,                      /* Emit glue around main */
+    MODEL_PAGE0,
+    MODEL_PAGE0
   },
   {
     _asmCmd,
     NULL,
-    "",                                /* Options with debug */
-    "",                                /* Options without debug */
+    "",                         /* Options with debug */
+    "",                         /* Options without debug */
     0,
-    ".xa",
-    NULL                       /* no do_assemble function */
+    ".asm",
+    NULL                        /* no do_assemble function */
   },
   {
-    NULL, //_linkCmd,
+    _linkCmd,
+    NULL,
     NULL,
-    xa_link,
-    ".rel"
+    ".rel",
+    1
   },
   {
     _defaultRules
   },
   {
-       /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
+        /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
     1, 2, 2, 4, 2, 2, 3, 1, 4, 4
   },
+  /* tags for generic pointers */
+  { 0x00, 0x40, 0x60, 0x80 },           /* far, near, xstack, code */
   {
     "XSEG    (XDATA)",
     "STACK   (XDATA)",
     "CSEG    (CODE)",
     "DSEG    (DATA)",
     NULL, //"ISEG    (DATA)",
+    NULL, //"PSEG    (PAG,XDATA)",
     "XSEG    (XDATA)",
     "BSEG    (BIT)",
     NULL, //"RSEG    (DATA)",
@@ -243,15 +287,20 @@ PORT xa51_port =
     "HOME    (CODE)",
     "XISEG   (XDATA)", // initialized xdata
     "XINIT   (CODE)", // a code copy of xiseg
+    "CONST   (CODE)",           // const_name - const data (code or not)
+    "CABS    (ABS,CODE)",       // cabs_name - const absolute data (code or not)
+    "XABS    (ABS,XDATA)",      // xabs_name - absolute xdata
+    "IABS    (ABS,DATA)",       // iabs_name - absolute data
     NULL, // default local map
     NULL, // default global map
     1
   },
+  { NULL, NULL },
   {
     -1, // stack grows down
     0, // bank overhead NUY
-    6, // isr overhead
-    4, // function call overhead
+    4, // isr overhead, page zero mode
+    2, // function call overhead, page zero mode
     0, // reentrant overhead NUY
     0 // banked overhead NUY
   },
@@ -259,9 +308,24 @@ PORT xa51_port =
   {
     2, -2
   },
+  {
+    xa51_emitDebuggerSymbol
+  },
+  {
+    255/3,      /* maxCount */
+    3,          /* sizeofElement */
+    /* The rest of these costs are bogus. They approximate */
+    /* the behavior of src/SDCCicode.c 1.207 and earlier.  */
+    {4,4,4},    /* sizeofMatchJump[] */
+    {0,0,0},    /* sizeofRangeCompare[] */
+    0,          /* sizeofSubtract */
+    3,          /* sizeofDispatch */
+  },
   "_",
   _xa51_init,
   _xa51_parseOptions,
+  NULL,
+  NULL,
   _xa51_finaliseOptions,
   _xa51_setDefaultOptions,
   xa51_assignRegisters,
@@ -271,23 +335,27 @@ PORT xa51_port =
   _xa51_genAssemblerEnd,
   _xa51_genIVT,
   _xa51_genXINIT,
+  NULL,                         /* genInitStartup */
   _xa51_reset_regparm,
   _xa51_regparm,
   NULL, // process_pragma()
   NULL, // getMangledFunctionName()
   NULL, // hasNativeMulFor()
+  hasExtBitOp,                  /* hasExtBitOp */
+  oclsExpense,                  /* oclsExpense */
   TRUE, // use_dw_for_init
-  0,                           /* leave lt */
-  0,                           /* leave gt */
-  0,                           /* transform <= to ! > */
-  0,                           /* transform >= to ! < */
-  0,                           /* transform != to !(a == b) */
-  0,                           /* leave == */
+  TRUE,                         /* little endian */
+  0,                            /* leave lt */
+  0,                            /* leave gt */
+  1,                            /* transform <= to ! > */
+  1,                            /* transform >= to ! < */
+  1,                            /* transform != to !(a == b) */
+  0,                            /* leave == */
   FALSE,                        /* No array initializer support. */
   cseCostEstimation,
-  NULL,                        /* no builtin functions */
-  GPOINTER,                    /* treat unqualified pointers as "generic" pointers */
-  1,                           /* reset labelKey to 1 */
-  1,                           /* globals & local static allowed */
+  NULL,                         /* no builtin functions */
+  GPOINTER,                     /* treat unqualified pointers as "generic" pointers */
+  1,                            /* reset labelKey to 1 */
+  1,                            /* globals & local static allowed */
   PORT_MAGIC
 };