if (addPublics) {
/* PENDING: special case here - should remove */
- if (!strcmp(map->sname, DATA_NAME))
+ if (!strcmp(map->sname, CODE_NAME))
+ tfprintf(map->oFile, "\t!areacode\n", map->sname);
+ else if (!strcmp(map->sname, DATA_NAME))
tfprintf(map->oFile, "\t!areadata\n", map->sname);
+ else if (!strcmp(map->sname, HOME_NAME))
+ tfprintf(map->oFile, "\t!areahome\n", map->sname);
else
tfprintf(map->oFile, "\t!area\n", map->sname);
}
break;
case 2:
- fprintf(oFile, "\t.byte %s,%s\n", aopLiteral(val, 0),aopLiteral(val, 1));
+ if (port->use_dw_for_init)
+ tfprintf(oFile, "\t!dws\n", aopLiteralLong(val, 0, 2));
+ else
+ fprintf(oFile, "\t.byte %s,%s\n", aopLiteral(val, 0),aopLiteral(val, 1));
break;
case 4:
if (!val) {
tfprintf(oFile, "\t!dbs\n", aopLiteral(val, 0));
break;
case 2:
- tfprintf(oFile, "\t.byte %s,%s\n",
- aopLiteral(val, 0),aopLiteral(val, 1));
+ if (port->use_dw_for_init)
+ tfprintf(oFile, "\t!dws\n", aopLiteralLong(val, 0, size));
+ else
+ tfprintf(oFile, "\t.byte %s,%s\n",
+ aopLiteral(val, 0),aopLiteral(val, 1));
break;
case 3:
/* PENDING: 0x02 or 0x%02x, CDATA? */
tfprintf(oFile, "\t!db !constbyte\n", (unsigned int)floatFromVal(val) & 0xff);
break;
case 2:
- tfprintf (oFile, "\t.byte %s,%s\n", aopLiteral(val, 0),aopLiteral(val, 1));
+ if (port->use_dw_for_init)
+ tfprintf(oFile, "\t!dws\n", aopLiteralLong(val, 0, 2));
+ else
+ tfprintf (oFile, "\t.byte %s,%s\n", aopLiteral(val, 0),aopLiteral(val, 1));
break;
case 3:
fprintf (oFile, "\t.byte %s,%s,#0x02\n",
/* fprintf(map->oFile,"\t.area\t%s\n",map->sname); */
-
+ if (!codeOutFile)
+ codeOutFile = code->oFile;
+
/* for all variables in this segment do */
for (sym = setFirstItem (map->syms); sym;
sym = setNextItem (map->syms)) {
if (!sym->level) { /* global */
if (IS_STATIC(sym->etype))
- fprintf(code->oFile,"F%s$",moduleName); /* scope is file */
+ fprintf(codeOutFile,"F%s$",moduleName); /* scope is file */
else
- fprintf(code->oFile,"G$"); /* scope is global */
+ fprintf(codeOutFile,"G$"); /* scope is global */
}
else
/* symbol is local */
- fprintf(code->oFile,"L%s$",
+ fprintf(codeOutFile,"L%s$",
(sym->localof ? sym->localof->name : "-null-"));
- fprintf(code->oFile,"%s$%d$%d",sym->name,sym->level,sym->block);
+ fprintf(codeOutFile,"%s$%d$%d",sym->name,sym->level,sym->block);
}
/* if it has an absolute address */
if (SPEC_ABSA (sym->etype)) {
if ((options.debug || sym->level == 0) && !options.nodebug)
- fprintf(code->oFile," == 0x%04x\n", SPEC_ADDR (sym->etype));
+ fprintf(codeOutFile," == 0x%04x\n", SPEC_ADDR (sym->etype));
- fprintf (code->oFile, "%s\t=\t0x%04x\n",
+ fprintf (codeOutFile, "%s\t=\t0x%04x\n",
sym->rname,
SPEC_ADDR (sym->etype));
}
else {
if ((options.debug || sym->level == 0) && !options.nodebug)
- fprintf(code->oFile," == .\n");
+ fprintf(codeOutFile," == .\n");
/* if it has an initial value */
if (sym->ival) {
- fprintf (code->oFile, "%s:\n", sym->rname);
+ fprintf (codeOutFile, "%s:\n", sym->rname);
noAlloc++;
resolveIvalSym (sym->ival);
- printIval (sym, sym->type, sym->ival, code->oFile);
+ printIval (sym, sym->type, sym->ival, codeOutFile);
noAlloc--;
}
else {
/* allocate space */
- fprintf (code->oFile, "%s:\n", sym->rname);
+ fprintf (codeOutFile, "%s:\n", sym->rname);
/* special case for character strings */
if (IS_ARRAY (sym->type) && IS_CHAR (sym->type->next) &&
SPEC_CVAL (sym->etype).v_char)
- printChar (code->oFile,
+ printChar (codeOutFile,
SPEC_CVAL (sym->etype).v_char,
strlen(SPEC_CVAL (sym->etype).v_char)+1);
else
- tfprintf(code->oFile, "\t!ds\n", (unsigned int)getSize (sym->type)& 0xffff);
+ tfprintf(codeOutFile, "\t!ds\n", (unsigned int)getSize (sym->type)& 0xffff);
}
}
}
emitRegularMap (xdata, TRUE,TRUE);
emitRegularMap (sfr, FALSE,FALSE);
emitRegularMap (sfrbit, FALSE,FALSE);
+ emitRegularMap (home, TRUE,FALSE);
emitRegularMap (code, TRUE,FALSE);
emitStaticSeg (statsg);
}
+/*-----------------------------------------------------------------*/
+/* flushStatics - flush all currently defined statics out to file */
+/* and delete. Temporary function */
+/*-----------------------------------------------------------------*/
+void flushStatics(void)
+{
+ emitStaticSeg(statsg);
+ statsg->syms = NULL;
+}
+
/*-----------------------------------------------------------------*/
/* createInterruptVect - creates the interrupt vector */
/*-----------------------------------------------------------------*/
tfprintf(asmFile, "\t!area\n", port->mem.post_static_name);
fprintf (asmFile,"\tljmp\t__sdcc_program_startup\n");
}
-
+
+ fprintf (asmFile,
+ "%s"
+ "; Home\n"
+ "%s", iComments2, iComments2);
+ tfprintf(asmFile, "\t!areahome\n", HOME_NAME);
+ copyFile (asmFile, home->oFile);
+
/* copy over code */
fprintf (asmFile, "%s", iComments2);
fprintf (asmFile, "; code\n");
int pushed_de;
} stack;
int frameId;
+ bool flush_statics;
+ bool in_home;
} _G;
static char *aopGet(asmop *aop, int offset, bool bit16);
{
const char *l;
const char *pair = _pairs[pairId].name;
- l = aopGetLitWordLong(left, offset, FALSE);
+ l = aopGetLitWordLong(left, 0, FALSE);
wassert(l && pair);
if (isPtr(pair)) {
_G.pairs[pairId].lit = gc_strdup(l);
_G.pairs[pairId].offset = offset;
}
+ if (IS_GB && pairId == PAIR_DE) {
+ if (_G.pairs[pairId].lit && !strcmp(_G.pairs[pairId].lit, l)) {
+ if (abs(_G.pairs[pairId].offset - offset) < 3) {
+ adjustPair(pair, &_G.pairs[pairId].offset, offset);
+ return;
+ }
+ }
+ _G.pairs[pairId].last_type = left->type;
+ _G.pairs[pairId].lit = gc_strdup(l);
+ _G.pairs[pairId].offset = offset;
+ }
/* Both a lit on the right and a true symbol on the left */
- /* PENDING: for re-target */
-#if 0
if (offset)
- emit2("ld %s,!hashedstr + %d", pair, l, offset);
- else
-#endif
+ emit2("ld %s,!hashedstr + %u", pair, l, offset);
+ else
emit2("ld %s,!hashedstr", pair, l);
}
static void setArea(int inHome)
{
static int lastArea = 0;
-
- if (lastArea != inHome) {
+
+ /*
+ if (_G.in_home != inHome) {
if (inHome) {
const char *sz = port->mem.code_name;
port->mem.code_name = "HOME";
port->mem.code_name = sz;
}
else
- emit2("!area", CODE_NAME);
- lastArea = inHome;
- }
+ emit2("!area", CODE_NAME);*/
+ _G.in_home = inHome;
+ // }
+}
+
+static bool isInHome(void)
+{
+ return _G.in_home;
}
/** Emit the code for a call statement
/* PENDING: portability. */
emit2("__%s_end:", sym->rname);
}
+ _G.flush_statics = 1;
_G.stack.pushed = 0;
_G.stack.offset = 0;
}
}
if (size) {
emit2("inc %s", _pairs[pair].name);
+ _G.pairs[pair].offset++;
}
}
}
}
if (size) {
emitcode("inc", _pairs[pairId].name);
+ _G.pairs[pairId].offset++;
}
offset++;
}
if (!options.nopeep)
peepHole (&lineHead);
+ /* This is unfortunate */
/* now do the actual printing */
- printLine (lineHead, codeOutFile);
- return;
+ {
+ FILE *fp = codeOutFile;
+ if (isInHome() && codeOutFile == code->oFile)
+ codeOutFile = home->oFile;
+ printLine (lineHead, codeOutFile);
+ if (_G.flush_statics) {
+ flushStatics();
+ _G.flush_statics = 0;
+ }
+ codeOutFile = fp;
+ }
}
{ "area", ".area _%s" },
{ "areacode", ".area _%s" },
{ "areadata", ".area _%s" },
+ { "areahome", ".area _%s" },
{ "functionlabeldef", "%s:" },
{ "*hl", "(hl)" },
{ "di", "di" },
{ "area", ".area _%s" },
{ "areacode", ".area _%s" },
{ "areadata", ".area _%s" },
+ { "areahome", ".area _%s" },
{ "*ixx", "%d(ix)" },
{ "*iyx", "%d(iy)" },
{ "*hl", "(hl)" },
{ "functionlabeldef", "%s:" },
{ "zero", "$00" },
{ "one", "$01" },
- { "area", "SECTION \"%s_%F_%I\",%C" },
- { "areacode", "SECTION \"CODE\",%C" },
- { "areadata", "SECTION \"DATA\",BSS" },
+ { "area", "SECTION \"%s\",CODE" },
+ { "areadata", "SECTION \"%F_%s\",BSS" },
+ { "areacode", "SECTION \"%F_CODE\",%s" },
+ { "areahome", "SECTION \"%F_HOME\",HOME" },
{ "ascii", "DB \"%s\"" },
{ "ds", "DS %d" },
{ "db", "DB" },
{ "area", "%s\tGROUP" },
{ "areacode", "_CODE\tGROUP" },
{ "areadata", "_DATA\tGROUP" },
+ { "areahome", "_CODE\tGROUP" },
{ "ascii", "DB \"%s\"" },
{ "ds", "DS %d" },
{ "db", "DB" },