* 29-Oct-97 JLH pass ";!" comments to output file
*/
+#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>
#include <string.h>
-#include <alloc.h>
+
#include "asm.h"
+#include "strcmpi.h"
-extern VOID machine(struct mne *);
/*)Module asmain.c
*
* The module asmain.c includes the command argument parser,
* 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
* 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
* REL, LST, and/or SYM files may be generated.
*/
+int fatalErrors=0;
+char relFile[128];
+
int
main(argc, argv)
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);
}
dot.s_area = &dca;
symp = ˙
minit();
- while (getline()) {
+ while (as_getline()) {
cp = cb;
cpt = cbt;
ep = eb;
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)
/*for (j=0; j<MAXINC && ifp[j] != NULL; j++) {
fclose(ifp[j]);
}*/
-
+ if (i) {
+ // remove output file
+ printf ("removing %s\n", relFile);
+ remove(relFile);
+ }
exit(i);
}
* ASCII character
* 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 ifcnd[] array of IF statement condition
* int incline[] current include file line
* int incfil current file handle index
* for include files
- * addr_t laddr address of current assembler line
+ * Addr_T laddr address of current assembler line
* or value of .if argument
* int lmode listing mode
* int lop current line number on page
* int tlevel current conditional level
*
* functions called:
- * addr_t absexpr() asexpr.c
+ * Addr_T absexpr() asexpr.c
* area * alookup() assym.c
* VOID clrexpr() asexpr.c
* int digit() asexpr.c
* char getnb() aslex.c
* VOID getst() aslex.c
* sym * lookup() assym.c
- * VOID machin() ___mch.c
+ * VOID machine() ___mch.c
* mne * mlookup() assym.c
* int more() aslex.c
* VOID * new() assym.c
struct expr e1;
char id[NCPS];
char opt[NCPS];
- char fn[FILSPC];
+ char fn[PATH_MAX];
char *p;
int d, n, uaf, uf;
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.
*/
break;
case S_MODUL:
- getst(id, -1);
+ getst(id, getnb()); // a module can start with a digit
if (pass == 0) {
if (module[0]) {
err('m');
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);
if ((ap = alookup(id)) != NULL) {
if (uaf && uf != ap->a_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;
case S_ORG:
if (dot.s_area->a_flag & A_ABS) {
outall();
- laddr = dot.s_addr = absexpr();
+ laddr = dot.s_addr = dot.s_org = absexpr();
} else {
err('o');
}
d = getnb();
p = fn;
while ((c = get()) != d) {
- if (p < &fn[FILSPC-1]) {
+ if (p < &fn[PATH_MAX-1]) {
*p++ = c;
} else {
break;
{
getst(id, -1);
- if (!strcmpi(id, "on"))
+ if (!as_strcmpi(id, "on"))
{
/* Quick sanity check: size of
- * addr_t must be at least 24 bits.
+ * Addr_T must be at least 24 bits.
*/
- if (sizeof(addr_t) < 3)
+ if (sizeof(Addr_T) < 3)
{
warnBanner();
fprintf(stderr,
flat24Mode = 1;
}
}
- else if (!strcmpi(id, "off"))
+ else if (!as_strcmpi(id, "off"))
{
flat24Mode = 0;
}
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);
*
* 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
*
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;
+ } 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 {
+ 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
VOID
phase(ap, a)
struct area *ap;
-addr_t a;
+Addr_T a;
{
if (ap != dot.s_area || a != dot.s_addr)
err('p');
" 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