X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Fmcs51%2Fasmain.c;h=86d0da26690eced7f019a28a75d2355a081c1008;hb=b53262f0d50ff3004afdae254691a76a3acb4d1b;hp=eed56eac6c3eca6017d27d696ebb57cee40101b9;hpb=2060e85e1bdb674b2c1a66763d92e385600d4c17;p=fw%2Fsdcc diff --git a/as/mcs51/asmain.c b/as/mcs51/asmain.c index eed56eac..86d0da26 100644 --- a/as/mcs51/asmain.c +++ b/as/mcs51/asmain.c @@ -130,7 +130,7 @@ * 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 @@ -289,7 +289,7 @@ char *argv[]; dot.s_area = &dca; symp = ˙ minit(); - while (getline()) { + while (as_getline()) { cp = cb; cpt = cbt; ep = eb; @@ -375,7 +375,7 @@ int i; if (i) { // remove output file printf ("removing %s\n", relFile); - unlink(relFile); + remove(relFile); } exit(i); } @@ -556,7 +556,7 @@ loop: goto loop; } /* - * If the first character is a letter then assume a lable, + * If the first character is a letter then assume a label, * symbol, assembler directive, or assembler mnemonic is * being processed. */ @@ -811,6 +811,20 @@ loop: lmode = SLIST; break; + case S_OPTSDCC: + p = optsdcc; + if ((c = getnb()) != 0) { + do { + if (p < &optsdcc[NINPUT-1]) + *p++ = c; + } while ((c = get()) != 0); + } + *p = 0; + unget(c); + lmode = SLIST; + /*if (pass == 0) printf("optsdcc=%s\n", optsdcc);*/ + break; + case S_GLOBL: do { getid(id, -1); @@ -822,7 +836,7 @@ loop: break; case S_DAREA: - getid(id, -1); + getid(id, -1); uaf = 0; uf = A_CON|A_REL; if ((c = getnb()) == '(') { @@ -861,7 +875,8 @@ loop: case S_ORG: if (dot.s_area->a_flag & A_ABS) { outall(); - laddr = dot.s_addr = absexpr(); + dot.s_area->a_size += dot.s_addr - dot.s_org; + laddr = dot.s_addr = dot.s_org = absexpr(); } else { err('o'); } @@ -1119,13 +1134,22 @@ register struct area *nap; 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;