/* 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);
}
DEBUG-NAME - 'B'
POINTER-TYPE - POINTER
*/
- if (ISTACK_NAME) {
- istack = allocMap (0, 0, 0, 0, 0, 0, options.stack_loc,
- ISTACK_NAME, 'B', POINTER);
- } else {
- istack=NULL;
- }
+ if (ISTACK_NAME)
+ {
+ istack = allocMap (0, 0, 0, 0, 0, 0, options.stack_loc, ISTACK_NAME, 'B', POINTER);
+ }
+ else
+ {
+ istack = NULL;
+ }
/* code segment ;
SFRSPACE - NO
DEBUG-NAME - 'E'
POINTER-TYPE - POINTER
*/
- if (IABS_NAME) {
- d_abs = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, IABS_NAME, 'E', POINTER);
- } else {
- d_abs = NULL;
- }
+ if (IABS_NAME)
+ {
+ d_abs = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, IABS_NAME, 'E', POINTER);
+ }
+ else
+ {
+ d_abs = NULL;
+ }
/* overlay segment - same as internal storage segment ;
SFRSPACE - NO
DEBUG-NAME - 'E'
POINTER-TYPE - POINTER
*/
- if (OVERLAY_NAME) {
- overlay = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER);
- } else {
- overlay = NULL;
- }
+ if (OVERLAY_NAME)
+ {
+ overlay = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER);
+ }
+ else
+ {
+ overlay = NULL;
+ }
/* Xternal paged segment ;
SFRSPACE - NO
DEBUG-NAME - 'P'
POINTER-TYPE - PPOINTER
*/
- if (PDATA_NAME) {
- pdata = allocMap (0, 0, 1, 0, 0, 0, options.xstack_loc, PDATA_NAME, 'P', PPOINTER);
- } else {
- pdata = NULL;
- }
+ if (PDATA_NAME)
+ {
+ pdata = allocMap (0, 0, 1, 0, 0, 0, options.xstack_loc, PDATA_NAME, 'P', PPOINTER);
+ }
+ else
+ {
+ pdata = NULL;
+ }
/* Xternal Data segment -
SFRSPACE - NO
xidata = allocMap (0, 1, 0, 0, 0, 0, 0, XIDATA_NAME, 'F', FPOINTER);
xinit = allocMap (0, 1, 0, 0, 0, 1, 0, XINIT_NAME, 'C', CPOINTER);
+ /* Absolute external storage segment ;
+ SFRSPACE - NO
+ FAR-SPACE - YES
+ PAGED - NO
+ DIRECT-ACCESS - NO
+ BIT-ACCESS - NO
+ CODE-ACCESS - NO
+ DEBUG-NAME - 'F'
+ POINTER-TYPE - FPOINTER
+ */
+ if (XABS_NAME)
+ {
+ x_abs = allocMap (0, 1, 0, 0, 0, 0, options.xdata_loc, XABS_NAME, 'F', FPOINTER);
+ }
+ else
+ {
+ x_abs = NULL;
+ }
+
/* Indirectly addressed internal data segment
SFRSPACE - NO
FAR-SPACE - NO
DEBUG-NAME - 'G'
POINTER-TYPE - IPOINTER
*/
- if (IDATA_NAME) {
- idata = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc,
- IDATA_NAME, 'G', IPOINTER);
- } else {
- idata=NULL;
- }
+ if (IDATA_NAME)
+ {
+ idata = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc, IDATA_NAME, 'G', IPOINTER);
+ }
+ else
+ {
+ idata = NULL;
+ }
/* Indirectly addressed absolute internal segment
SFRSPACE - NO
DEBUG-NAME - 'E'
POINTER-TYPE - IPOINTER
*/
- if (IABS_NAME) {
- i_abs = allocMap (0, 0, 0, 0, 0, 0, options.data_loc, IABS_NAME, 'E', IPOINTER);
- } else {
- i_abs = NULL;
- }
+ if (IABS_NAME)
+ {
+ i_abs = allocMap (0, 0, 0, 0, 0, 0, options.data_loc, IABS_NAME, 'E', IPOINTER);
+ }
+ else
+ {
+ i_abs = NULL;
+ }
/* Bit space ;
SFRSPACE - NO
if (sym->_isparm)
return FALSE;
/* if code change to constant */
- if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) {
- SPEC_OCLS(sym->etype) = c_abs;
- } else {
- SPEC_OCLS (sym->etype) = statsg;
- }
+ if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype))
+ {
+ SPEC_OCLS(sym->etype) = c_abs;
+ }
+ else
+ {
+ SPEC_OCLS (sym->etype) = statsg;
+ }
break;
case S_XDATA:
- // should we move this to the initialized data segment?
- if (port->genXINIT &&
- sym->ival && (sym->level==0) && !SPEC_ABSA (sym->etype)) {
- SPEC_OCLS(sym->etype) = xidata;
- } else {
- SPEC_OCLS (sym->etype) = xdata;
- }
+ /* absolute initialized global */
+ if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype))
+ {
+ SPEC_OCLS(sym->etype) = x_abs;
+ }
+ /* or should we move this to the initialized data segment? */
+ else if (port->genXINIT && sym->ival && (sym->level==0))
+ {
+ SPEC_OCLS(sym->etype) = xidata;
+ }
+ else
+ {
+ SPEC_OCLS (sym->etype) = xdata;
+ }
break;
case S_DATA:
/* absolute initialized global */
- if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) {
- SPEC_OCLS(sym->etype) = d_abs;
- } else {
- SPEC_OCLS (sym->etype) = data;
- }
+ if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype))
+ {
+ SPEC_OCLS(sym->etype) = d_abs;
+ }
+ else
+ {
+ SPEC_OCLS (sym->etype) = data;
+ }
break;
case S_IDATA:
/* absolute initialized global */
- if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) {
- SPEC_OCLS(sym->etype) = i_abs;
- } else {
- SPEC_OCLS (sym->etype) = idata;
- }
+ if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype))
+ {
+ SPEC_OCLS(sym->etype) = i_abs;
+ }
+ else
+ {
+ SPEC_OCLS (sym->etype) = idata;
+ }
sym->iaccess = 1;
break;
case S_PDATA: