if (i) {
// remove output file
printf ("removing %s\n", relFile);
- unlink(relFile);
+ remove(relFile);
}
exit(i);
}
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.
*/
lmode = SLIST;
break;
- case S_OPTSDCC:
+ case S_OPTSDCC:
p = optsdcc;
if ((c = getnb()) != 0) {
do {
break;
case S_DAREA:
- getid(id, -1);
+ getid(id, -1);
uaf = 0;
uf = A_CON|A_REL;
if ((c = getnb()) == '(') {
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');
}
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;