/* if it is a float then it gets tricky */
/* otherwise it is fairly simple */
if (!IS_FLOAT (val->type)) {
- unsigned long v = (unsigned long) floatFromVal (val);
+ unsigned long v = ulFromVal (val);
v >>= (offset * 8);
switch (size) {
size = ((SPEC_BLEN (lsym->etype) / 8) +
(SPEC_BLEN (lsym->etype) % 8 ? 1 : 0));
}
- i = (unsigned long)floatFromVal(val);
+ i = ulFromVal(val);
i <<= SPEC_BSTR (lsym->etype);
ival |= i;
if (! ( lsym->next &&
if (SPEC_STRUCT (type)->type == UNION) {
printIval (sym, sflds->type, iloop, oBuf);
- iloop = iloop->next;
+ iloop = iloop ? iloop->next : NULL;
} else {
for (; sflds; sflds = sflds->next, iloop = (iloop ? iloop->next : NULL)) {
if (IS_BITFIELD(sflds->type)) {
/* PENDING: this is _very_ mcs51 specific, including a magic
number...
- It's also endin specific.
+ It's also endian specific.
*/
size = getSize (type);
switch (getSize (type))
{
case 1:
- dbuf_tprintf (oBuf, "\t!db !constbyte\n", (unsigned int) floatFromVal (val) & 0xff);
+ dbuf_tprintf (oBuf, "\t!db !constbyte\n", (unsigned int) ulFromVal (val) & 0xff);
break;
case 2:
if (port->use_dw_for_init)
emitRegularMap (bit, TRUE, TRUE);
emitRegularMap (pdata, TRUE, TRUE);
emitRegularMap (xdata, TRUE, TRUE);
+ emitRegularMap (x_abs, TRUE, TRUE);
if (port->genXINIT) {
emitRegularMap (xidata, TRUE, TRUE);
}
char *iComments1 =
{
";--------------------------------------------------------\n"
- "; File Created by SDCC : FreeWare ANSI-C Compiler\n"};
+ "; File Created by SDCC : free open source ANSI-C Compiler\n"};
char *iComments2 =
{
time_t t;
time (&t);
fprintf (afile, "%s", iComments1);
- fprintf (afile, "; Version " SDCC_VERSION_STR " #%s (%s)\n", getBuildNumber(), __DATE__);
- fprintf (afile, "; This file generated %s", asctime (localtime (&t)));
+ fprintf (afile, "; Version " SDCC_VERSION_STR " #%s (%s) (%s)\n",
+ getBuildNumber(), __DATE__, getBuildEnvironment());
+ fprintf (afile, "; This file was generated %s", asctime (localtime (&t)));
fprintf (afile, "%s", iComments2);
}
if(port->general.glue_up_main &&
(TARGET_IS_MCS51 || TARGET_IS_DS390 || TARGET_IS_XA51 || TARGET_IS_DS400))
- {
+ {
mcs51_like=1; /*So it has bits, sfr, sbits, data, idata, etc...*/
- }
+ }
else
- {
+ {
mcs51_like=0;
- }
+ }
/* print the global struct definitions */
if (options.debug)
tfprintf (asmFile, "\t!module\n",
spacesToUnderscores (moduleBuf, moduleName, sizeof moduleBuf));
if(mcs51_like)
- {
- fprintf (asmFile, "\t.optsdcc -m%s", port->target);
-
- switch(options.model)
{
+ fprintf (asmFile, "\t.optsdcc -m%s", port->target);
+
+ switch(options.model)
+ {
case MODEL_SMALL: fprintf (asmFile, " --model-small"); break;
case MODEL_COMPACT: fprintf (asmFile, " --model-compact"); break;
case MODEL_MEDIUM: fprintf (asmFile, " --model-medium"); break;
case MODEL_FLAT24: fprintf (asmFile, " --model-flat24"); break;
case MODEL_PAGE0: fprintf (asmFile, " --model-page0"); break;
default: break;
+ }
+ /*if(options.stackAuto) fprintf (asmFile, " --stack-auto");*/
+ if(options.useXstack) fprintf (asmFile, " --xstack");
+ /*if(options.intlong_rent) fprintf (asmFile, " --int-long-rent");*/
+ /*if(options.float_rent) fprintf (asmFile, " --float-rent");*/
+ if(options.noRegParams) fprintf (asmFile, " --no-reg-params");
+ if(options.parms_in_bank1) fprintf (asmFile, " --parms-in-bank1");
+ fprintf (asmFile, "\n");
+ }
+ else if(TARGET_Z80_LIKE || TARGET_IS_HC08)
+ {
+ fprintf (asmFile, "\t.optsdcc -m%s\n", port->target);
}
- /*if(options.stackAuto) fprintf (asmFile, " --stack-auto");*/
- if(options.useXstack) fprintf (asmFile, " --xstack");
- /*if(options.intlong_rent) fprintf (asmFile, " --int-long-rent");*/
- /*if(options.float_rent) fprintf (asmFile, " --float-rent");*/
- if(options.noRegParams) fprintf (asmFile, " --no-reg-params");
- if(options.parms_in_bank1) fprintf (asmFile, " --parms-in-bank1");
- fprintf (asmFile, "\n");
- }
- else if(TARGET_IS_Z80 || TARGET_IS_GBZ80 || TARGET_IS_HC08)
- {
- fprintf (asmFile, "\t.optsdcc -m%s\n", port->target);
- }
tfprintf (asmFile, "\t!fileprelude\n");
printExterns (asmFile);
if(( mcs51_like )
- ||( TARGET_IS_Z80 )) /*.p.t.20030924 need to output SFR table for Z80 as well */
- {
+ ||( TARGET_IS_Z80 )) /*.p.t.20030924 need to output SFR table for Z80 as well */
+ {
/* copy the sfr segment */
fprintf (asmFile, "%s", iComments2);
fprintf (asmFile, "; special function registers\n");
fprintf (asmFile, "%s", iComments2);
dbuf_write_and_destroy (&sfr->oBuf, asmFile);
- }
+ }
if(mcs51_like)
{
/*JCF: Create the areas for the register banks*/
if(RegBankUsed[0]||RegBankUsed[1]||RegBankUsed[2]||RegBankUsed[3])
- {
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; overlayable register banks\n");
- fprintf (asmFile, "%s", iComments2);
- if(RegBankUsed[0])
- fprintf (asmFile, "\t.area REG_BANK_0\t(REL,OVR,DATA)\n\t.ds 8\n");
- if(RegBankUsed[1]||options.parms_in_bank1)
- fprintf (asmFile, "\t.area REG_BANK_1\t(REL,OVR,DATA)\n\t.ds 8\n");
- if(RegBankUsed[2])
- fprintf (asmFile, "\t.area REG_BANK_2\t(REL,OVR,DATA)\n\t.ds 8\n");
- if(RegBankUsed[3])
- fprintf (asmFile, "\t.area REG_BANK_3\t(REL,OVR,DATA)\n\t.ds 8\n");
- }
+ {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; overlayable register banks\n");
+ fprintf (asmFile, "%s", iComments2);
+ if(RegBankUsed[0])
+ fprintf (asmFile, "\t.area REG_BANK_0\t(REL,OVR,DATA)\n\t.ds 8\n");
+ if(RegBankUsed[1]||options.parms_in_bank1)
+ fprintf (asmFile, "\t.area REG_BANK_1\t(REL,OVR,DATA)\n\t.ds 8\n");
+ if(RegBankUsed[2])
+ fprintf (asmFile, "\t.area REG_BANK_2\t(REL,OVR,DATA)\n\t.ds 8\n");
+ if(RegBankUsed[3])
+ fprintf (asmFile, "\t.area REG_BANK_3\t(REL,OVR,DATA)\n\t.ds 8\n");
+ }
if(BitBankUsed)
- {
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; overlayable bit register bank\n");
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "\t.area BIT_BANK\t(REL,OVR,DATA)\n");
- fprintf (asmFile, "bits:\n\t.ds 1\n");
- fprintf (asmFile, "\tb0 = bits[0]\n");
- fprintf (asmFile, "\tb1 = bits[1]\n");
- fprintf (asmFile, "\tb2 = bits[2]\n");
- fprintf (asmFile, "\tb3 = bits[3]\n");
- fprintf (asmFile, "\tb4 = bits[4]\n");
- fprintf (asmFile, "\tb5 = bits[5]\n");
- fprintf (asmFile, "\tb6 = bits[6]\n");
- fprintf (asmFile, "\tb7 = bits[7]\n");
- }
+ {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; overlayable bit register bank\n");
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "\t.area BIT_BANK\t(REL,OVR,DATA)\n");
+ fprintf (asmFile, "bits:\n\t.ds 1\n");
+ fprintf (asmFile, "\tb0 = bits[0]\n");
+ fprintf (asmFile, "\tb1 = bits[1]\n");
+ fprintf (asmFile, "\tb2 = bits[2]\n");
+ fprintf (asmFile, "\tb3 = bits[3]\n");
+ fprintf (asmFile, "\tb4 = bits[4]\n");
+ fprintf (asmFile, "\tb5 = bits[5]\n");
+ fprintf (asmFile, "\tb6 = bits[6]\n");
+ fprintf (asmFile, "\tb7 = bits[7]\n");
+ }
}
/* copy the data segment */
/* create the overlay segments */
- if (overlay) {
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; overlayable items in %s ram \n", mcs51_like?"internal":"");
- fprintf (asmFile, "%s", iComments2);
- dbuf_write_and_destroy (&ovrBuf, asmFile);
- }
+ if (overlay)
+ {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; overlayable items in %s ram \n", mcs51_like?"internal":"");
+ fprintf (asmFile, "%s", iComments2);
+ dbuf_write_and_destroy (&ovrBuf, asmFile);
+ }
/* create the stack segment MOF */
if (mainf && IFFUNC_HASBODY(mainf->type))
}
/* create the idata segment */
- if ( (idata) && (mcs51_like) ) {
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; indirectly addressable internal ram data\n");
- fprintf (asmFile, "%s", iComments2);
- dbuf_write_and_destroy (&idata->oBuf, asmFile);
- }
+ if ( (idata) && (mcs51_like) )
+ {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; indirectly addressable internal ram data\n");
+ fprintf (asmFile, "%s", iComments2);
+ dbuf_write_and_destroy (&idata->oBuf, asmFile);
+ }
/* create the absolute idata/data segment */
- if ( (i_abs) && (mcs51_like) ) {
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; absolute internal ram data\n");
- fprintf (asmFile, "%s", iComments2);
- dbuf_write_and_destroy (&d_abs->oBuf, asmFile);
- dbuf_write_and_destroy (&i_abs->oBuf, asmFile);
- }
+ if ( (i_abs) && (mcs51_like) )
+ {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; absolute internal ram data\n");
+ fprintf (asmFile, "%s", iComments2);
+ dbuf_write_and_destroy (&d_abs->oBuf, asmFile);
+ dbuf_write_and_destroy (&i_abs->oBuf, asmFile);
+ }
/* copy the bit segment */
- if (mcs51_like) {
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; bit data\n");
- fprintf (asmFile, "%s", iComments2);
- dbuf_write_and_destroy (&bit->oBuf, asmFile);
- }
+ if (mcs51_like)
+ {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; bit data\n");
+ fprintf (asmFile, "%s", iComments2);
+ dbuf_write_and_destroy (&bit->oBuf, asmFile);
+ }
/* copy paged external ram data */
if (mcs51_like)
}
/* copy external ram data */
- if (mcs51_like) {
- fprintf (asmFile, "%s", iComments2);
- fprintf (asmFile, "; external ram data\n");
- fprintf (asmFile, "%s", iComments2);
- dbuf_write_and_destroy (&xdata->oBuf, asmFile);
- }
+ if (mcs51_like)
+ {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; external ram data\n");
+ fprintf (asmFile, "%s", iComments2);
+ dbuf_write_and_destroy (&xdata->oBuf, asmFile);
+ }
+
+ /* create the absolute xdata segment */
+ if (mcs51_like || TARGET_IS_HC08)
+ {
+ fprintf (asmFile, "%s", iComments2);
+ fprintf (asmFile, "; absolute external ram data\n");
+ fprintf (asmFile, "%s", iComments2);
+ dbuf_write_and_destroy (&x_abs->oBuf, asmFile);
+ }
/* copy external initialized ram data */
fprintf (asmFile, "%s", iComments2);
/* If the port wants to generate any extra areas, let it do so. */
if (port->extraAreas.genExtraAreaDeclaration)
- {
+ {
port->extraAreas.genExtraAreaDeclaration(asmFile,
mainf && IFFUNC_HASBODY(mainf->type));
- }
+ }
/* copy the interrupt vector table */
if (mainf && IFFUNC_HASBODY(mainf->type))
}
else
{
+ assert (mcs51_like);
fprintf (asmFile, "__sdcc_gsinit_startup:\n");
/* if external stack is specified then the
higher order byte of the xdatalocation is
fprintf (asmFile, "\tmov\tsp,#__start__stack - 1\n"); /* MOF */
}
- fprintf (asmFile, "\tlcall\t__sdcc_external_startup\n");
+ fprintf (asmFile, "\t%ccall\t__sdcc_external_startup\n", options.acall_ajmp?'a':'l');
fprintf (asmFile, "\tmov\ta,dpl\n");
fprintf (asmFile, "\tjz\t__sdcc_init_data\n");
- fprintf (asmFile, "\tljmp\t__sdcc_program_startup\n");
+ fprintf (asmFile, "\t%cjmp\t__sdcc_program_startup\n", options.acall_ajmp?'a':'l');
fprintf (asmFile, "__sdcc_init_data:\n");
// if the port can copy the XINIT segment to XISEG
port->genXINIT(asmFile);
}
}
-
}
dbuf_write_and_destroy (&statsg->oBuf, asmFile);
* by the ugly shucking and jiving about 20 lines ago.
*/
tfprintf (asmFile, "\t!area\n", port->mem.post_static_name);
- fprintf (asmFile, "\tljmp\t__sdcc_program_startup\n");
+ fprintf (asmFile, "\t%cjmp\t__sdcc_program_startup\n", options.acall_ajmp?'a':'l');
}
fprintf (asmFile,
/* put in jump or call to main */
if (options.mainreturn)
{
- fprintf (asmFile, "\tljmp\t_main\n"); /* needed? */
+ fprintf (asmFile, "\t%cjmp\t_main\n", options.acall_ajmp?'a':'l'); /* needed? */
fprintf (asmFile, ";\treturn from main will return to caller\n");
}
else
{
- fprintf (asmFile, "\tlcall\t_main\n");
+ fprintf (asmFile, "\t%ccall\t_main\n", options.acall_ajmp?'a':'l');
fprintf (asmFile, ";\treturn from main will lock up\n");
fprintf (asmFile, "\tsjmp .\n");
}
tfprintf (asmFile, "\t!areacode\n", options.code_seg);
dbuf_write_and_destroy (&code->oBuf, asmFile);
- if (port->genAssemblerEnd) {
+ if (port->genAssemblerEnd)
+ {
port->genAssemblerEnd(asmFile);
- }
+ }
fclose (asmFile);
}