make RAM big enough for tinibios
[fw/sdcc] / src / mcs51 / main.c
index b91a622c9c9b773258744fcf2de2f431a2fcddac..b1ca1f2998027469a02908f5f2a8a6e4dda89e59 100644 (file)
@@ -8,6 +8,8 @@
 #include "main.h"
 #include "ralloc.h"
 #include "gen.h"
+#include "../SDCCutil.h"
+extern const char *preArgv[128];       /* pre-processor arguments  */
 
 static char _defaultRules[] =
 {
@@ -64,13 +66,31 @@ _mcs51_reset_regparm ()
 static int
 _mcs51_regparm (sym_link * l)
 {
-  /* for this processor it is simple
-     can pass only the first parameter in a register */
-  if (regParmFlg)
-    return 0;
+    if (options.parms_in_bank1 == 0) {
+       /* simple can pass only the first parameter in a register */
+       if (regParmFlg)
+           return 0;
 
-  regParmFlg = 1;
-  return 1;
+       regParmFlg = 1;
+       return 1;
+    } else {
+       int size = getSize(l);
+       int remain ;
+
+       /* first one goes the usual way to DPTR */
+       if (regParmFlg == 0) {
+           regParmFlg += 4 ;
+           return 1;
+       }
+       /* second one onwards goes to RB1_0 thru RB1_7 */
+        remain = regParmFlg - 4;
+       if (size > (8 - remain)) {
+           regParmFlg = 12 ;
+           return 0;
+       }
+       regParmFlg += size ;
+       return regParmFlg - size + 1;   
+    }
 }
 
 static bool
@@ -85,6 +105,10 @@ _mcs51_parseOptions (int *pargc, char **argv, int *i)
 static void
 _mcs51_finaliseOptions (void)
 {
+  if (noXinitOpt /* || options.model==MODEL_SMALL */) {
+    port->genXINIT=0;
+  }
+
   if (options.model == MODEL_LARGE) {
       port->mem.default_local_map = xdata;
       port->mem.default_globl_map = xdata;
@@ -94,6 +118,10 @@ _mcs51_finaliseOptions (void)
       port->mem.default_local_map = data;
       port->mem.default_globl_map = data;
     }
+
+  if (options.parms_in_bank1) {
+      addToList (preArgv, "-DSDCC_PARMS_IN_BANK1");
+  }
 }
 
 static void
@@ -112,6 +140,11 @@ _mcs51_getRegName (struct regs *reg)
 static void
 _mcs51_genAssemblerPreamble (FILE * of)
 {
+    if (options.parms_in_bank1) {
+       int i ;
+       for (i=0; i < 8 ; i++ )
+           fprintf (of,"b1_%d = 0x%x \n",i,8+i);
+    }
 }
 
 /* Generate interrupt vector table. */
@@ -183,7 +216,7 @@ static bool cseCostEstimation (iCode *ic, iCode *pdic)
 */
 static const char *_linkCmd[] =
 {
-  "{bindir}{sep}aslink", "-nf", "$1", NULL
+  "aslink", "-nf", "$1", NULL
 };
 
 /* $3 is replaced by assembler.debug_opts resp. port->assembler.plain_opts */
@@ -198,6 +231,7 @@ PORT mcs51_port =
   TARGET_ID_MCS51,
   "mcs51",
   "MCU 8051",                  /* Target name */
+  NULL,                                /* Processor name */
   {
     TRUE,                      /* Emit glue around main */
     MODEL_SMALL | MODEL_LARGE,
@@ -254,6 +288,7 @@ PORT mcs51_port =
   "_",
   _mcs51_init,
   _mcs51_parseOptions,
+  NULL,
   _mcs51_finaliseOptions,
   _mcs51_setDefaultOptions,
   mcs51_assignRegisters,