/* PENDING: this is _very_ mcs51 specific, including a magic
number...
- It's also endin specific.
+ It's also endian specific.
*/
size = getSize (type);
emitRegularMap (bit, TRUE, TRUE);
emitRegularMap (pdata, TRUE, TRUE);
emitRegularMap (xdata, TRUE, TRUE);
+ emitRegularMap (x_abs, TRUE, TRUE);
if (port->genXINIT) {
emitRegularMap (xidata, TRUE, TRUE);
}
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
port->genXINIT(asmFile);
}
}
-
}
dbuf_write_and_destroy (&statsg->oBuf, asmFile);
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);
}