{
{ 0, OPTION_FLAT24_MODEL, NULL, "use the flat24 model for the ds390 (default)" },
{ 0, OPTION_STACK_8BIT, NULL, "use the 8bit stack for the ds390 (not supported yet)" },
- { 0, OPTION_STACK_SIZE, NULL, "Tells the linker to allocate this space for stack"},
+ { 0, OPTION_STACK_SIZE, &options.stack_size, "Tells the linker to allocate this space for stack", CLAT_INTEGER },
{ 0, "--pack-iram", NULL, "Tells the linker to pack variables in internal ram (default)"},
- { 0, "--no-pack-iram", &options.no_pack_iram,"Tells the linker not to pack variables in internal ram"},
+ { 0, "--no-pack-iram", &options.no_pack_iram, "Tells the linker not to pack variables in internal ram"},
{ 0, "--stack-10bit", &options.stack10bit, "use the 10bit stack for ds390 (default)" },
- { 0, "--use-accelerator", &options.useAccelerator,"generate code for ds390 arithmetic accelerator"},
- { 0, "--protect-sp-update", &options.protect_sp_update,"will disable interrupts during ESP:SP updates"},
- { 0, "--parms-in-bank1", &options.parms_in_bank1,"use Bank1 for parameter passing"},
+ { 0, "--use-accelerator", &options.useAccelerator, "generate code for ds390 arithmetic accelerator"},
+ { 0, "--protect-sp-update", &options.protect_sp_update, "will disable interrupts during ESP:SP updates"},
+ { 0, "--parms-in-bank1", &options.parms_in_bank1, "use Bank1 for parameter passing"},
{ 0, NULL }
};
options.model = MODEL_FLAT24;
return TRUE;
}
- else if (!strcmp (argv[*i], OPTION_STACK_SIZE))
- {
- options.stack_size = getIntArg (OPTION_STACK_SIZE, argv, i, *pargc);
- return TRUE;
- }
return FALSE;
}
return TRUE;
}
+static void
+_ds390_genInitStartup (FILE *of)
+{
+ fprintf (of, "__sdcc_gsinit_startup:\n");
+ /* if external stack is specified then the
+ higher order byte of the xdatalocation is
+ going into P2 and the lower order going into
+ spx */
+ if (options.useXstack)
+ {
+ fprintf (of, "\tmov\tP2,#0x%02x\n",
+ (((unsigned int) options.xdata_loc) >> 8) & 0xff);
+ fprintf (of, "\tmov\t_spx,#0x%02x\n",
+ (unsigned int) options.xdata_loc & 0xff);
+ }
+
+ // This should probably be a port option, but I'm being lazy.
+ // on the 400, the firmware boot loader gives us a valid stack
+ // (see '400 data sheet pg. 85 (TINI400 ROM Initialization code)
+ if (!TARGET_IS_DS400)
+ {
+ /* initialise the stack pointer. JCF: aslink takes care of the location */
+ fprintf (of, "\tmov\tsp,#__start__stack - 1\n"); /* MOF */
+ }
+
+ fprintf (of, "\tlcall\t__sdcc_external_startup\n");
+ fprintf (of, "\tmov\ta,dpl\n");
+ fprintf (of, "\tjz\t__sdcc_init_data\n");
+ fprintf (of, "\tljmp\t__sdcc_program_startup\n");
+ fprintf (of, "__sdcc_init_data:\n");
+
+ // if the port can copy the XINIT segment to XISEG
+ if (port->genXINIT)
+ {
+ port->genXINIT(of);
+ }
+}
+
/* Generate code to copy XINIT to XISEG */
static void _ds390_genXINIT (FILE * of) {
fprintf (of, "; _ds390_genXINIT() start\n");
NULL, /* no genAssemblerEnd */
_ds390_genIVT,
_ds390_genXINIT,
- NULL, /* genInitStartup */
+ _ds390_genInitStartup,
_ds390_reset_regparm,
_ds390_regparm,
NULL,
{
{ 0, OPTION_FLAT24_MODEL, NULL, "use the flat24 model for the ds390 (default)" },
{ 0, OPTION_STACK_8BIT, NULL, "use the 8bit stack for the ds390 (not supported yet)" },
- { 0, OPTION_STACK_SIZE, NULL, "Tells the linker to allocate this space for stack"},
+ { 0, OPTION_STACK_SIZE, &options.stack_size, "Tells the linker to allocate this space for stack", CLAT_INTEGER },
{ 0, "--pack-iram", NULL, "Tells the linker to pack variables in internal ram (default)"},
- { 0, "--no-pack-iram", &options.no_pack_iram,"Tells the linker not to pack variables in internal ram"},
+ { 0, "--no-pack-iram", &options.no_pack_iram, "Tells the linker not to pack variables in internal ram"},
{ 0, "--stack-10bit", &options.stack10bit, "use the 10bit stack for ds390 (default)" },
- { 0, "--use-accelerator", &options.useAccelerator,"generate code for ds390 arithmetic accelerator"},
- { 0, "--protect-sp-update", &options.protect_sp_update,"will disable interrupts during ESP:SP updates"},
- { 0, "--parms-in-bank1", &options.parms_in_bank1,"use Bank1 for parameter passing"},
- { 0, OPTION_TINI_LIBID, NULL, "<nnnn> LibraryID used in -mTININative"},
+ { 0, "--use-accelerator", &options.useAccelerator, "generate code for ds390 arithmetic accelerator"},
+ { 0, "--protect-sp-update", &options.protect_sp_update, "will disable interrupts during ESP:SP updates"},
+ { 0, "--parms-in-bank1", &options.parms_in_bank1, "use Bank1 for parameter passing"},
+ { 0, OPTION_TINI_LIBID, &options.tini_libid, "<nnnn> LibraryID used in -mTININative", CLAT_INTEGER },
{ 0, NULL }
};
-static bool
-_tininative_parseOptions (int *pargc, char **argv, int *i)
-{
- if (_ds390_parseOptions (pargc, argv, i))
- return TRUE;
-
- if (!strcmp (argv[*i], OPTION_TINI_LIBID))
- {
- options.tini_libid = getIntArg (OPTION_TINI_LIBID, argv, i, *pargc);
- return TRUE;
- }
- return FALSE;
-}
-
static void _tininative_init (void)
{
asm_addTree (&asm_a390_mapping);
},
"",
_tininative_init,
- _tininative_parseOptions,
+ _ds390_parseOptions,
_tininative_options,
NULL,
_tininative_finaliseOptions,
_tininative_genAssemblerEnd,
_tininative_genIVT,
NULL,
- NULL, /* genInitStartup */
+ _ds390_genInitStartup,
_ds390_reset_regparm,
_ds390_regparm,
NULL,
{
{ 0, OPTION_FLAT24_MODEL, NULL, "use the flat24 model for the ds400 (default)" },
{ 0, OPTION_STACK_8BIT, NULL, "use the 8bit stack for the ds400 (not supported yet)" },
- { 0, OPTION_STACK_SIZE, NULL, "Tells the linker to allocate this space for stack"},
+ { 0, OPTION_STACK_SIZE, &options.stack_size, "Tells the linker to allocate this space for stack", CLAT_INTEGER },
{ 0, "--pack-iram", NULL, "Tells the linker to pack variables in internal ram (default)"},
- { 0, "--no-pack-iram", &options.no_pack_iram,"Tells the linker not to pack variables in internal ram"},
+ { 0, "--no-pack-iram", &options.no_pack_iram, "Tells the linker not to pack variables in internal ram"},
{ 0, "--stack-10bit", &options.stack10bit, "use the 10bit stack for ds400 (default)" },
- { 0, "--use-accelerator", &options.useAccelerator,"generate code for ds400 arithmetic accelerator"},
- { 0, "--protect-sp-update", &options.protect_sp_update,"will disable interrupts during ESP:SP updates"},
- { 0, "--parms-in-bank1", &options.parms_in_bank1,"use Bank1 for parameter passing"},
+ { 0, "--use-accelerator", &options.useAccelerator, "generate code for ds400 arithmetic accelerator"},
+ { 0, "--protect-sp-update", &options.protect_sp_update, "will disable interrupts during ESP:SP updates"},
+ { 0, "--parms-in-bank1", &options.parms_in_bank1, "use Bank1 for parameter passing"},
{ 0, NULL }
};
NULL, /* no genAssemblerEnd */
_ds400_genIVT,
_ds390_genXINIT,
- NULL, /* genInitStartup */
+ _ds390_genInitStartup,
_ds390_reset_regparm,
_ds390_regparm,
NULL,