/* lkmain.c */
-
/*
* (C) Copyright 1989-1995
* All Rights Reserved
#include <stdio.h>
#include <string.h>
-#include <alloc.h>
+//#include <alloc.h>
#include "aslink.h"
+#include <stdlib.h>
#ifndef SDK_VERSION_STRING
#define SDK_VERSION_STRING "3.0.0"
#define TARGET_STRING "gbz80"
#endif
+#ifdef WIN32T
+#include <time.h>
+
+void Timer(int action, char * message)
+{
+ static double start, end, total=0.0;
+ static const double secs_per_tick = 1.0 / CLOCKS_PER_SEC;
+
+ if(action==0) start=clock()*secs_per_tick;
+ else if(action==1)
+ {
+ end=clock() * secs_per_tick;
+ printf("%s \t%f seconds.\n", message, (end-start));
+ total+=end-start;
+ }
+ else
+ {
+ printf("Total time: \t%f seconds.\n", total);
+ total=0.0;
+ }
+}
+#endif
+
/*)Module lkmain.c
*
* The module lkmain.c contains the functions which
};
#endif /* GAMEBOY */
-VOID
+int
main(argc, argv)
char *argv[];
{
register char *p;
- register c, i;
+ register int c, i;
+
+#ifdef WIN32T
+ Timer(0, "");
+#endif
#ifdef GAMEBOY
nb_rom_banks = 2;
}
}
}
- if (startp->f_type == NULL)
+ if (startp->f_type == F_INV)
usage();
if (startp->f_type == F_LNK && startp->f_idp == NULL)
usage();
break;
if (pflag && sfp != stdin)
fprintf(stdout, "%s\n", ip);
- if (*ip == NULL || parse())
+ if (*ip == '\0' || parse())
break;
}
if (sfp)
reloc('E');
}
}
+#ifdef WIN32T
+ Timer(1, "Linker time");
+#endif
lkexit(lkerr);
+
+ /* Never get here. */
+ return 0;
}
/*)Function VOID lkexit(i)
VOID
link()
{
- register c;
+ register int c;
if ((c=endline()) == 0) { return; }
switch (c) {
+ case 'O': /*For some important sdcc options*/
+ if (pass == 0)
+ {
+ if(strlen(sdccopt)==0)
+ {
+ strcpy(sdccopt, &ip[1]);
+ strcpy(sdccopt_module, curr_module);
+ }
+ else
+ {
+ if(strcmp(sdccopt, &ip[1])!=0)
+ {
+ fprintf(stderr,
+ "?ASlink-Warning-Conflicting sdcc options:\n"
+ " \"%s\" in module \"%s\" and\n"
+ " \"%s\" in module \"%s\".\n",
+ sdccopt, sdccopt_module, &ip[1], curr_module);
+ lkerr++;
+ }
+ }
+ }
+ break;
+
case 'X':
radix = 16;
break;
case 'M':
if (pass == 0)
+ {
+ strcpy(curr_module, &ip[1]);
module();
+ }
break;
case 'A':
#else
VOID map()
{
- register i;
register struct head *hdp;
register struct lbfile *lbfh;
#endif /* MLH_MAP */
#ifdef SDK
+/* PENDING */
+VOID lstareatosym(struct area *xp);
+
VOID sym()
{
- register i;
- register struct head *hdp;
- register struct lbfile *lbfh;
-
/*
* Open sym File
*/
int
parse()
{
- register c;
+ register int c;
char fid[NINPUT];
while ((c = getnb()) != 0) {
+ if (c == ';')
+ return(0);
if ( c == '-') {
while (ctype[c=get()] & LETTER) {
switch(c) {
while(get() != '"')
;
} else if(c == 'P' || c == 'p') {
- unsigned int addr;
- unsigned char value;
patch *p = patches;
patches = (patch *)malloc(sizeof(patch));
lkexit(1);
}
}
+ if (c == ';')
+ return(0);
} else
if (ctype[c] != ILL) {
if (linkp == NULL) {
* int lkerr error flag
*
* functions called:
- * addr_t expr() lkeval.c
+ * Addr_T expr() lkeval.c
* int fprintf() c_library
* VOID getid() lklex.c
* char getnb() lklex.c
VOID
setbas()
{
- register v;
+ register int v;
char id[NCPS];
bsp = basep;
* int lkerr error flag
*
* functions called:
- * addr_t expr() lkeval.c
+ * Addr_T expr() lkeval.c
* int fprintf() c_library
* VOID getid() lklex.c
* char getnb() lklex.c
VOID
setgbl()
{
- register v;
+ register int v;
register struct sym *sp;
char id[NCPS];
char *fn;
char *ft;
{
+#if 0
register char *p1, *p2, *p3;
- register c;
+ register int c;
+#else
+ int i;
+#endif
FILE *fp;
char fb[FILSPC];
+#if 0
p1 = fn;
p2 = fb;
p3 = ft;
*p2++ = c;
}
*p2++ = 0;
+#else
+ /*Look backward the name path and get rid of the extension, if any*/
+ i=strlen(fn);
+ for(; (fn[i]!='.')&&(fn[i]!='\\')&&(fn[i]!='/')&&(i>0); i--);
+ if( (fn[i]=='.') && *ft && strcmp(ft, "lnk") )
+ {
+ strncpy(fb, fn, i);
+ fb[i]=0;
+ }
+ else
+ {
+ strcpy(fb, fn);
+ }
+
+ /*Add the extension*/
+ if (fb[i] != '.')
+ {
+ strcat(fb, ".");
+#ifdef SDK
+ strcat(fb, strlen(ft)?ft:"rel");
+#else
+ strcat(fb, strlen(ft)?ft:"REL");
+#endif
+ }
+#endif
+
#ifdef SDK
if ((fp = fopen(fb, wf?(binary?"wb":"w"):(binary?"rb":"r"))) == NULL) {
#else /* SDK */