+ strindx += strlen(sym->sname) + 1; // Incr string index incl null terminate
+ buf += 12; // Increment buffer to next record
+ symsize += 12; // Increment symbol table size
+
+ return buf;
+}
+
+
+/*
+ * Alcyon symbol flags
+ */
+#define AL_DEFINED 0x8000
+#define AL_EQUATED 0x4000
+#define AL_GLOBAL 0x2000
+#define AL_EQUREG 0x1000
+#define AL_EXTERN 0x0800
+#define AL_DATA 0x0400
+#define AL_TEXT 0x0200
+#define AL_BSS 0x0100
+#define AL_FILE 0x0080
+
+
+static WORD tdb_tab[] = {
+ 0, /* absolute */
+ AL_TEXT, /* TEXT segment based */
+ AL_DATA, 0, /* DATA segment based */
+ AL_BSS /* BSS segment based */
+};
+
+
+#define HDRSIZE 0x1C /* size of Alcyon header */
+
+
+/*
+ * Add entry to symbol table;
+ * if `globflag' is 1, make the symbol global;
+ * if in .PRG mode, adjust symbol values for fake link.
+ *
+ */
+char * constr_symtab(register char * buf, SYM * sym, int globflag)
+{
+ register int i;
+ register char * s;
+ register WORD w;
+ register LONG z;
+ register WORD w1;
+
+ /*
+ * Copy symbol name
+ */
+ s = sym->sname;
+
+ for(i=0; i<8 && *s; i++)
+ *buf++ = *s++;
+
+ while (i++ < 8)
+ *buf++ = '\0';
+
+ /*
+ * Construct and deposit flag word
+ *
+ * o all symbols are AL_DEFINED
+ * o install T/D/B/A base
+ * o install 'equated'
+ * o commons (COMMON) are AL_EXTERN, but not BSS
+ * o exports (DEFINED) are AL_GLOBAL
+ * o imports (~DEFINED) are AL_EXTERN
+ *
+ */
+ w1 = sym->sattr;
+ w = AL_DEFINED | tdb_tab[w1 & TDB];
+
+ if (w1 & EQUATED) /* equated */
+ w |= AL_EQUATED;
+
+ if (w1 & COMMON)
+ {
+ w |= AL_EXTERN | AL_GLOBAL; /* common symbol */
+ w &= ~AL_BSS; /* they're not BSS in Alcyon object files */
+ }
+ else if (w1 & DEFINED)
+ {
+ if (globflag) /* export the symbol */
+ w |= AL_GLOBAL;
+ }
+ else w |= AL_EXTERN; /* imported symbol */
+
+ *buf++ = w >> 8;
+ *buf++ = (char)w;
+
+ z = sym->svalue;
+
+ if (prg_flag) /* relocate value in .PRG segment */
+ {
+ w1 &= DATA | BSS;
+
+ if (w1)
+ z += sect[TEXT].sloc;
+
+ if (w1 & BSS)
+ z += sect[DATA].sloc;
+ }
+
+ *buf++ = z >> 24; /* deposit symbol value */
+ *buf++ = z >> 16;
+ *buf++ = z >> 8;
+ *buf++ = z;