#define OPTION_ICODE_IN_ASM "--i-code-in-asm"
#define OPTION_PRINT_SEARCH_DIRS "--print-search-dirs"
#define OPTION_MSVC_ERROR_STYLE "--vc"
-#define OPTION_USE_STDOUT "--use-stdout"
+#define OPTION_USE_STDOUT "--use-stdout"
static const OPTION
optionsTable[] = {
{ 0, OPTION_PEEP_FILE, NULL, "<file> use this extra peep-hole file" },
{ 0, OPTION_LIB_PATH, NULL, "<path> use this path to search for libraries" },
{ 0, "--int-long-reent", &options.intlong_rent, "Use reenterant calls on the int and long support functions" },
- { 0, "--float-reent", &options.float_rent, "Use reenterant calls on the floar support functions" },
+ { 0, "--float-reent", &options.float_rent, "Use reenterant calls on the float support functions" },
{ 0, OPTION_OUT_FMT_IHX, NULL, NULL },
{ 0, "--out-fmt-s19", &options.out_fmt, NULL },
{ 0, "--cyclomatic", &options.cyclomatic, NULL },
{ 0, OPTION_PRINT_SEARCH_DIRS, &options.printSearchDirs, "display the directories in the compiler's search path"},
{ 0, OPTION_MSVC_ERROR_STYLE, &options.vc_err_style, "messages are compatible with Micro$oft visual studio"},
{ 0, OPTION_USE_STDOUT, &options.use_stdout, "send errors to stdout instead of stderr"},
- /* End of options */
-#if 0 /* 10jun03 !OPT_DISABLE_PIC16 */
- { 0, "--no-movff", &options.no_movff, "disable generating MOVFF opcode in PIC16 port"},
- { 0, "--gen-banksel", &options.gen_banksel, "enable the generation of banksel assembler directives in PIC16 port"},
+#if !OPT_DISABLE_Z80 || !OPT_DISABLE_GBZ80
+ { 0, "--no-std-crt0", &options.no_std_crt0, "For the z80/gbz80 do not link default crt0.o"},
#endif
+ /* End of options */
{ 0, NULL }
};
#if !OPT_DISABLE_DS390
&ds390_port,
#endif
-#if !OPT_DISABLE_PIC
- &pic_port,
-#endif
#if !OPT_DISABLE_PIC16
&pic16_port,
#endif
+#if !OPT_DISABLE_PIC
+ &pic_port,
+#endif
#if !OPT_DISABLE_TININative
&tininative_port,
#endif
#endif
#if !OPT_DISABLE_DS400
&ds400_port,
-#endif
+#endif
+#if !OPT_DISABLE_HC08
+ &hc08_port,
+#endif
};
#define NUM_PORTS (sizeof(_ports)/sizeof(_ports[0]))
setParseWithComma (set **dest, char *src)
{
char *p;
+ int length;
/* skip the initial white spaces */
while (isspace(*src))
src++;
+
+ /* skip the trailing white spaces */
+ length = strlen(src);
+ while (length && isspace(src[length-1]))
+ src[--length] = '\0';
for (p = strtok(src, ","); p != NULL; p = strtok(NULL, ","))
addSet(dest, Safe_strdup(p));
/** Gets the string argument to this option. If the option is '--opt'
then for input of '--optxyz' or '--opt xyz' returns xyz.
*/
-static char *
+char *
getStringArg(const char *szStart, char **argv, int *pi, int argc)
{
if (argv[*pi][strlen(szStart)])
/** Gets the integer argument to this option using the same rules as
getStringArg.
*/
-static int
+int
getIntArg(const char *szStart, char **argv, int *pi, int argc)
{
return (int)floatFromVal(constVal(getStringArg(szStart, argv, pi, argc)));
case 'M':
{
preProcOnly = 1;
- addSet(&preArgvSet, Safe_strdup("-M"));
- break;
+ if (argv[i][2] == 'M')
+ addSet(&preArgvSet, Safe_strdup("-MM"));
+ else
+ addSet(&preArgvSet, Safe_strdup("-M"));
+ break;
}
case 'C':
{
/* standard library path */
if (!options.nostdlib)
{
- if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80)) /*Not for the z80, gbz80*/
+ if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80 || TARGET_IS_HC08)) /*Not for the z80, gbz80*/
{
switch (options.model)
{
}
else /*for the z80, gbz80*/
{
- if (TARGET_IS_Z80)
+ if (TARGET_IS_HC08)
+ c = "hc08";
+ else if (TARGET_IS_Z80)
c = "z80";
else
c = "gbz80";
}
#endif
#endif
- if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80)) /*Not for the z80, gbz80*/
+ if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80
+ || TARGET_IS_HC08)) /*Not for the z80, gbz80*/
{ /*Why the z80 port is not using the standard libraries?*/
fprintf (lnkfile, "-l %s\n", STD_LIB);
fprintf (lnkfile, "-l %s\n", STD_INT_LIB);
fprintf (lnkfile, "-l %s\n", STD_LONG_LIB);
fprintf (lnkfile, "-l %s\n", STD_FP_LIB);
}
+ else if (TARGET_IS_HC08)
+ {
+ fprintf (lnkfile, "-l hc08\n");
+ }
else if (TARGET_IS_Z80)
{
fprintf (lnkfile, "-l z80\n");
for (s = setFirstItem(libFilesSet); s != NULL; s = setNextItem(libFilesSet))
fprintf (lnkfile, "-l %s\n", s);
- /* put in the object files */
- if (fullSrcFileName)
- fprintf (lnkfile, "%s%s\n", dstFileName, port->linker.rel_ext);
-
- fputStrSet(lnkfile, relFilesSet);
-
- /*For the z80 and gbz80 ports, try to find where crt0.o is...*/
- if (TARGET_IS_Z80 || TARGET_IS_GBZ80) /*For the z80, gbz80*/
+ /*For the z80 and gbz80 ports, try to find where crt0.o is...
+ It is very important for this file to be first on the linking proccess
+ so the areas are set in the correct order, expecially _GSINIT*/
+ if ((TARGET_IS_Z80 || TARGET_IS_GBZ80) &&
+ !options.no_std_crt0 && !options.nostdlib) /*For the z80, gbz80*/
{
char crt0path[PATH_MAX];
FILE * crt0fp;
if(s==NULL) fprintf (stderr, "Warning: couldn't find crt0.o\n");
}
+ /* put in the object files */
+ if (fullSrcFileName)
+ fprintf (lnkfile, "%s%s\n", dstFileName, port->linker.rel_ext);
+
+ fputStrSet(lnkfile, relFilesSet);
+
fprintf (lnkfile, "\n-e\n");
fclose (lnkfile);
strncatz (scratchFileName,
options.out_fmt ? ".S19" : ".ihx",
sizeof(scratchFileName));
+ if (strcmp (fullDstFileName, scratchFileName))
+ unlink (fullDstFileName);
rename (scratchFileName, fullDstFileName);
strncpyz (buffer, fullDstFileName, sizeof(buffer));
strncatz (scratchFileName, ".map", sizeof(scratchFileName));
*q = 0;
strncatz(buffer, ".map", sizeof(buffer));
+ if (strcmp (scratchFileName, buffer))
+ unlink (buffer);
rename (scratchFileName, buffer);
*p = 0;
strncatz (scratchFileName, ".mem", sizeof(scratchFileName));
*q = 0;
strncatz(buffer, ".mem", sizeof(buffer));
+ if (strcmp (scratchFileName, buffer))
+ unlink (buffer);
rename (scratchFileName, buffer);
+ if (options.debug)
+ {
+ *p = 0;
+ strncatz (scratchFileName, ".cdb", sizeof(scratchFileName));
+ *q = 0;
+ strncatz(buffer, ".cdb", sizeof(buffer));
+ if (strcmp (scratchFileName, buffer))
+ unlink (buffer);
+ rename (scratchFileName, buffer);
+ /* and the OMF file without extension: */
+ *p = 0;
+ *q = 0;
+ if (strcmp (scratchFileName, buffer))
+ unlink (buffer);
+ rename (scratchFileName, buffer);
+ }
}
if (system_ret)
{
strncatz (scratchFileName,
port->linker.rel_ext,
sizeof(scratchFileName));
+ if (strcmp (scratchFileName, fullDstFileName))
+ unlink (fullDstFileName);
rename (scratchFileName, fullDstFileName);
}
}
glue();
}
+ if (fatalError) {
+ exit (1);
+ }
+
if (!options.c1mode && !noAssemble)
{
if (options.verbose)