X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Fmcs51%2Fasmain.c;h=a333cceae75c6568295119f5308125a712a600c6;hb=d7b30120ae115e8929d57e25038ca76dde13974e;hp=854d04371695efa24c4a95e5907bb8473ff5852e;hpb=b09af35f2f1cde7649d3ac4a6f5d2af6d97895a0;p=fw%2Fsdcc diff --git a/as/mcs51/asmain.c b/as/mcs51/asmain.c index 854d0437..a333ccea 100644 --- a/as/mcs51/asmain.c +++ b/as/mcs51/asmain.c @@ -11,13 +11,14 @@ * 29-Oct-97 JLH pass ";!" comments to output file */ +#include #include #include #include -#include + #include "asm.h" +#include "strcmpi.h" -extern VOID machine(struct mne *); /*)Module asmain.c * * The module asmain.c includes the command argument parser, @@ -81,7 +82,7 @@ extern VOID machine(struct mne *); * int fflag -f(f), relocations flagged flag * int flevel IF-ELSE-ENDIF flag will be non * zero for false conditional case - * addr_t fuzz tracks pass to pass changes in the + * Addr_T fuzz tracks pass to pass changes in the * address of symbols caused by * variable length instruction formats * int gflag -g, make undefined symbols global flag @@ -129,7 +130,7 @@ extern VOID machine(struct mne *); * VOID diag() assubr.c * VOID err() assubr.c * int fprintf() c-library - * int getline() aslex.c + * int as_getline() aslex.c * VOID list() aslist.c * VOID lstsym() aslist.c * VOID minit() ___mch.c @@ -147,6 +148,9 @@ extern VOID machine(struct mne *); * REL, LST, and/or SYM files may be generated. */ +int fatalErrors=0; +char relFile[128]; + int main(argc, argv) char *argv[]; @@ -241,8 +245,11 @@ char *argv[]; if (inpfil == 0) { if (lflag) lfp = afile(p, "lst", 1); - if (oflag) - ofp = afile(p, "rel", 1); + if (oflag) { + ofp = afile(p, "rel", 1); + // save the file name if we have to delete it on error + strcpy(relFile,afn); + } if (sflag) tfp = afile(p, "sym", 1); } @@ -282,7 +289,7 @@ char *argv[]; dot.s_area = &dca; symp = ˙ minit(); - while (getline()) { + while (as_getline()) { cp = cb; cpt = cbt; ep = eb; @@ -317,8 +324,10 @@ char *argv[]; if (lflag) { lstsym(lfp); } - asexit(aserr); - return 0; + //printf ("aserr: %d\n", aserr); + //printf ("fatalErrors: %d\n", fatalErrors); + asexit(fatalErrors); + return 0; // hush the compiler } /*)Function VOID asexit(i) @@ -363,7 +372,11 @@ int i; /*for (j=0; ja_flag) err('m'); - if (ap->a_flag & A_OVR) { - ap->a_size = 0; - ap->a_fuzz=0; - } } else { ap = (struct area *) new (sizeof(struct area)); ap->a_ap = areap; @@ -847,17 +871,31 @@ loop: } newdot(ap); lmode = SLIST; + if (dot.s_area->a_flag & A_ABS) + abs_ap = ap; break; case S_ORG: if (dot.s_area->a_flag & A_ABS) { - outall(); - laddr = dot.s_addr = absexpr(); + char buf[NCPS]; + laddr = absexpr(); + sprintf(buf, "%s%x", abs_ap->a_id, laddr); + if ((ap = alookup(buf)) == NULL) { + ap = (struct area *) new (sizeof(struct area)); + *ap = *areap; + ap->a_ap = areap; + strncpy(ap->a_id, buf, NCPS); + ap->a_ref = areap->a_ref + 1; + ap->a_size = 0; + ap->a_fuzz = 0; + areap = ap; + } + newdot(ap); + lmode = ALIST; + dot.s_addr = dot.s_org = laddr; } else { err('o'); } - outall(); - lmode = ALIST; break; case S_RADIX: @@ -899,7 +937,7 @@ loop: d = getnb(); p = fn; while ((c = get()) != d) { - if (p < &fn[FILSPC-1]) { + if (p < &fn[PATH_MAX-1]) { *p++ = c; } else { break; @@ -917,6 +955,50 @@ loop: } lmode = SLIST; break; + + case S_FLAT24: + if (more()) + { + getst(id, -1); + + if (!as_strcmpi(id, "on")) + { + /* Quick sanity check: size of + * Addr_T must be at least 24 bits. + */ + if (sizeof(Addr_T) < 3) + { + warnBanner(); + fprintf(stderr, + "Cannot enable Flat24 mode: " + "host system must have 24 bit " + "or greater integers.\n"); + } + else + { + flat24Mode = 1; + } + } + else if (!as_strcmpi(id, "off")) + { + flat24Mode = 0; + } + else + { + qerr(); + } + } + else + { + qerr(); + } + lmode = SLIST; + #if 0 + printf("as8051: ds390 flat mode %sabled.\n", + flat24Mode ? "en" : "dis"); + #endif + break; + /* * If not an assembler directive then go to @@ -986,30 +1068,36 @@ char *fn; char *ft; int wf; { - register char *p1, *p2, *p3; + register char *p2, *p3; register int c; FILE *fp; - p1 = fn; p2 = afn; p3 = ft; - while ((c = *p1++) != 0 && c != FSEPX) { - if (p2 < &afn[FILSPC-4]) - *p2++ = c; - } + + strcpy (afn, fn); + p2 = strrchr (afn, FSEPX); // search last '.' + if (!p2) + p2 = afn + strlen (afn); + if (p2 > &afn[PATH_MAX-4]) // truncate filename, if it's too long + p2 = &afn[PATH_MAX-4]; *p2++ = FSEPX; - if (*p3 == 0) { - if (c == FSEPX) { - p3 = p1; - } else { - p3 = dsft; - } + + // choose a file-extension + if (*p3 == 0) { // extension supplied? + p3 = strrchr (fn, FSEPX); // no: extension in fn? + if (p3) + ++p3; + else + p3 = dsft; // no: default extension } - while ((c = *p3++) != 0) { - if (p2 < &afn[FILSPC-1]) + + while ((c = *p3++) != 0) { // strncpy + if (p2 < &afn[PATH_MAX-1]) *p2++ = c; } *p2++ = 0; + if ((fp = fopen(afn, wf?"w":"r")) == NULL) { fprintf(stderr, "%s: cannot %s.\n", afn, wf?"create":"open"); asexit(1); @@ -1034,7 +1122,7 @@ int wf; * * global variables: * sym dot defined as sym[0] - * addr_t fuzz tracks pass to pass changes in the + * Addr_T fuzz tracks pass to pass changes in the * address of symbols caused by * variable length instruction formats * @@ -1052,18 +1140,42 @@ register struct area *nap; register struct area *oap; oap = dot.s_area; + /* fprintf (stderr, "%s dot.s_area->a_size: %d dot.s_addr: %d\n", + oap->a_id, dot.s_area->a_size, dot.s_addr); */ oap->a_fuzz = fuzz; - oap->a_size = dot.s_addr; - fuzz = nap->a_fuzz; + if (oap->a_flag & A_OVR) { + // the size of an overlay is the biggest size encountered + if (oap->a_size < dot.s_addr) { + oap->a_size = dot.s_addr; + } + } else if (oap->a_flag & A_ABS) { + oap->a_addr = dot.s_org; + oap->a_size += dot.s_addr - dot.s_org; + dot.s_addr = dot.s_org = 0; + } else { + oap->a_addr = 0; + oap->a_size = dot.s_addr; + } + if (nap->a_flag & A_OVR) { + // a new overlay starts at 0, no fuzz + dot.s_addr = 0; + fuzz = 0; + } else if (nap->a_flag & A_ABS) { + // a new absolute starts at org, no fuzz + dot.s_addr = dot.s_org; + fuzz = 0; + } else { + dot.s_addr = nap->a_size; + fuzz = nap->a_fuzz; + } dot.s_area = nap; - dot.s_addr = nap->a_size; outall(); } /*)Function VOID phase(ap, a) * * area * ap pointer to area - * addr_t a address in area + * Addr_T a address in area * * Function phase() compares the area ap and address a * with the current area dot.s_area and address dot.s_addr @@ -1087,7 +1199,7 @@ register struct area *nap; VOID phase(ap, a) struct area *ap; -addr_t a; +Addr_T a; { if (ap != dot.s_area || a != dot.s_addr) err('p'); @@ -1103,9 +1215,9 @@ char *usetxt[] = { " a all user symbols made global", " l create list output file1[LST]", " o create object output file1[REL]", - " s create symbol output file1[SYM]", - " p disable listing pagination", - " f flag relocatable references by ` in listing file", + " s create symbol output file1[SYM]", + " p disable listing pagination", + " f flag relocatable references by ` in listing file", " ff flag relocatable references by mode in listing file", "", 0