ld09/as09: generate fuzix binaries
authorAlan Cox <alan@linux.intel.com>
Tue, 28 Jun 2016 18:24:25 +0000 (19:24 +0100)
committerAlan Cox <alan@linux.intel.com>
Tue, 28 Jun 2016 18:24:25 +0000 (19:24 +0100)
This seems to be able to turn

.globl _start
.globl _main

.text

_start: jmp _main
FCC "F"
FCC "Z"
FCC "X"
FCC "1"
FCB 0x80
FDB 0
FDB (_codeend-_start)
FDB 0
FDB 0
FDB 0
_main:
rts
_codeend:

.data
_data
FDB 1234

.bss
_bss
FDB 12

into what looks like an actual binary

28 files changed:
Applications/as09/Makefile.z80
Applications/as09/alloc.c
Applications/as09/const.h
Applications/as09/genlist.c
Applications/as09/mops.c
Applications/as09/pops.c
Applications/as09/readsrc.c
Applications/as09/typeconv.c
Applications/ld09/Makefile
Applications/ld09/Makefile.z80
Applications/ld09/catimage.c [deleted file]
Applications/ld09/config.h
Applications/ld09/globvar.h
Applications/ld09/io.c
Applications/ld09/ld.c
Applications/ld09/mkar.c
Applications/ld09/objchop.c [deleted file]
Applications/ld09/objdump86.c
Applications/ld09/readobj.c
Applications/ld09/rel_aout.h [deleted file]
Applications/ld09/syshead.h
Applications/ld09/type.h
Applications/ld09/v7_aout.h [deleted file]
Applications/ld09/writebin.c [deleted file]
Applications/ld09/writeemu.c [deleted file]
Applications/ld09/writex86.c [deleted file]
Applications/ld09/x86_aout.h [deleted file]
Applications/ld09/x86_cpm86.h [deleted file]

index da6e55b..0f11185 100644 (file)
@@ -13,7 +13,7 @@ OBJS =        as.rel assemble.rel errors.rel express.rel \
 all: as09
 
 as09: $(OBJS)
-       $(CC) -o $@ $(OBJS)
+       $(CC) -o $@ --nostdio $(OBJS)
 
 clean realclean clobber:
        rm -f *.rel as09 *~
index 2ca84f3..4dd61b5 100644 (file)
@@ -29,9 +29,6 @@ void init_heap(void)
     brk(heapend);
     if(sbrk(0) != heapend)
        as_abort(NOMEMEORY);
-#else
-#ifdef SOS_EDOS
-    heapend = stackreg() - STAKSIZ;
 #else
     heapptr = malloc(USERMEM);
     heapend = heapptr + USERMEM;
@@ -39,7 +36,6 @@ void init_heap(void)
        as_abort(NOMEMEORY);
 #endif
 #endif
-#endif
 }
 
 void *temp_buf(void)
index 881e511..e22c03e 100644 (file)
 #define I80386                 /* generate 80386 code */
 #endif
 #define MNSIZE                 /* allow byte size in mnemonic, e.g. "movb" */
-#undef SOS_EDOS                        /* source OS is EDOS */
 
 /* defaults */
 
 #define DIRCHAR                '/'     /* character separating filename from dir */
-#define INBUFSIZE      8192
+#define INBUFSIZE      512
 #define SOS_EOLSTR     "\012"
 
 /* defaults modified by switches */
 
-#ifdef SOS_EDOS
-# undef INBUFSIZE
-# define INBUFSIZE     512
-# undef SOS_EOLSTR
-# define SOS_EOLSTR    "\015\012"
-# define STAKSIZ       256     /* table grows up to stack less this */
-#endif
-
 #ifdef __AS386_16__
 # undef INBUFSIZE
 # define INBUFSIZE     512
@@ -305,11 +296,10 @@ oops - ENTBIT misplaced
 
 /* special segments */
 
-#define BSSLOC         3
-#define DATALOC                3
-#define DPLOC          2
-#define STRLOC         1
 #define TEXTLOC                0
+#define DATALOC                1
+#define BSSLOC         2
+#define DPLOC          3
 
 #include "errors.h"
 
index 82c13dd..6bdf554 100644 (file)
@@ -429,8 +429,7 @@ void writenl(void)
 
 /* write 1 offset_t, order to suit target */
 
-void writeoff(offset)
-offset_t offset;
+void writeoff(offset_t offset)
 {
     char buf[sizeof offset];
 
index 73c3a4f..fa6d9e7 100644 (file)
@@ -2812,8 +2812,7 @@ void predec1(void)
 
 /* common routine for PSHS/PULS/PSHU/PULU */
 
-void sustack(stackreg)
-reg_pt stackreg;
+void sustack(reg_pt stackreg)
 {
     reg_pt reg;
 
index f367335..a77d2e8 100644 (file)
@@ -25,9 +25,7 @@ static struct sym_s *needlabel P((void));
 static void showredefinedlabel P((void));
 static void setloc P((unsigned seg));
 
-static void bumpsem(flagptr, defval)
-register struct flags_s *flagptr;
-int defval;
+static void bumpsem(struct flags_s *flagptr, int defval)
 {
     int newcount;
 
@@ -70,8 +68,7 @@ int defval;
 /* check symbol is either undefined */
 /* or has the same segment & relocatability as lc */
 
-bool_pt checksegrel(symptr)
-register struct sym_s *symptr;
+bool_pt checksegrel(struct sym_s *symptr)
 {
     if ((symptr->type & LABIT ||
        (symptr->data & IMPBIT && !(symptr->data & UNDBIT))) &&
@@ -745,7 +742,7 @@ void pfdb(void)
     firstdata = lastexp.data;
     while (TRUE)
     {
-       *adrptr++ = lastexp;
+       memcpy(adrptr++, &lastexp, sizeof(lastexp));
        mcount += 2;            /* won't overflow, line length limits it */
        if (sym != COMMA)
            break;
index 79b53e4..4a4a70f 100644 (file)
@@ -114,6 +114,7 @@ fd_t open_input(char *name)
           struct stat st;
           if( fstat(fd, &st) >= 0 )
              filelength = st.st_size;
+           /* FIXME: check allowing for the +4 below */
           if( filelength > (((unsigned)-1)>>1)-3 )
           {
              mem_end = mem_start = "\n\n";
index 2af5aff..ab80222 100644 (file)
 #define NATIVE_ENDIAN
 #endif
 
-void xxerr P((char *));
-void xxerr(x) char * x; { write(2, x, strlen(x)); }
+void xxerr(const char *x)
+{
+   write(2, x, strlen(x));
+}
 
 #ifdef __AS386_16__
 static int no_swap   = 1;
index b8a34b0..d8789fd 100644 (file)
@@ -16,46 +16,29 @@ CRT0 = ../../Library/libs/crt0_6809.o
 LIBDIR =/usr/bin
 LDFLAGS        =
 
-# Will need some of these if you want native executables on non-Linux/i386
-# -DDETECTAOUT                 # Turn on detection.
-# -DV7_A_OUT                   # a.out.h is like V7
-# -DBSD_A_OUT                  # a.out.h is like BSD
-# -DSTANDARD_GNU_A_OUT         # a.out.h is like GNU normal.
-#
-# -DREL_OUTPUT -DBUGCOMPAT     # -r Produces weird *.o files.
-#
-DEFS   =-DREL_OUTPUT
+DEFS   =
 
 # An alternative file for a non-standard a.out.h (eg i386 linux on an Alpha)
 #
 # NATIVE=-DA_OUT_INCL='"a_out_local.h"' 
 
-OBJS= dumps.o io.o ld.o readobj.o table.o typeconv.o linksyms.o mkar.o \
-      writebin.o writeemu.o
+OBJS= dumps.o io.o ld.o readobj.o table.o typeconv.o linksyms.o writefuzix.o
 
-all: ld09 objchop
+all: ld09
 
 ld09: $(OBJS)
        $(LINKER) -o $@ $(LINKER_OPT) $(CRT0) $(OBJS)
 
-objchop: objchop.o
-       $(LINKER) -o $@ $(LINKER_OPT) $(CRT0) $(OBJS)
-
 clean realclean clobber:
        rm -f *.o ld09 ld09r objchop catimage objdump09 *~
 
 $(OBJS): align.h ar.h bindef.h byteord.h config.h const.h globvar.h obj.h \
-        syshead.h type.h x86_aout.h
+        syshead.h type.h
 
 ar.h:
        test -f ar.h || \
        { rm -f ar.h ; ln -s ../libc/include/ar.h . ; } || \
        ln ../libc/include/ar.h .
 
-writebin.o: writebin.c
-       $(CC) $(CFLAGS) $(DEFS) $(NATIVE) -c $<
-
-writerel.o: writebin.c
-
 .c.o:
        $(CC) $(COPT) $(CFLAGS) $(DEFS) -c $< -o $@
index a4aa874..a8f90c0 100644 (file)
@@ -3,46 +3,26 @@
 CC = fcc
 CFLAGS = -c -O2
 
-# Will need some of these if you want native executables on non-Linux/i386
-# -DDETECTAOUT                 # Turn on detection.
-# -DV7_A_OUT                   # a.out.h is like V7
-# -DBSD_A_OUT                  # a.out.h is like BSD
-# -DSTANDARD_GNU_A_OUT         # a.out.h is like GNU normal.
-#
-# -DREL_OUTPUT -DBUGCOMPAT     # -r Produces weird *.o files.
-#
-DEFS   =-DREL_OUTPUT
+DEFS   =
 
-# An alternative file for a non-standard a.out.h (eg i386 linux on an Alpha)
-#
-# NATIVE=-DA_OUT_INCL='"a_out_local.h"' 
+OBJS= dumps.rel io.rel ld.rel readobj.rel table.rel typeconv.rel linksyms.rel \
+      writefuzix.rel
 
-OBJS= dumps.rel io.rel ld.rel readobj.rel table.rel typeconv.rel linksyms.rel mkar.rel \
-      writebin.rel writeemu.rel
-
-all: ld09 objchop
+all: ld09
 
 ld09: $(OBJS)
        $(CC) -o $@ $(OBJS)
 
-objchop: objchop.rel
-       $(CC) -o $@ $(OBJS)
-
 clean realclean clobber:
-       rm -f *.rel ld09 ld09r objchop catimage objdump09 *~
+       rm -f *.rel *.lst *.sym *.asm ld09 ld09r objchop catimage objdump09 *~ *.bin *.lk *.map *.noi
 
 $(OBJS): align.h ar.h bindef.h byteord.h config.h const.h globvar.h obj.h \
-        syshead.h type.h x86_aout.h
+        syshead.h type.h
 
 ar.h:
        test -f ar.h || \
        { rm -f ar.h ; ln -s ../libc/include/ar.h . ; } || \
        ln ../libc/include/ar.h .
 
-writebin.rel: writebin.c
-       $(CC) $(CFLAGS) $(DEFS) $(NATIVE) -c $<
-
-writerel.rel: writebin.c
-
 .c.rel:
        $(CC) $(CFLAGS) $(DEFS) -c $< -o $@
diff --git a/Applications/ld09/catimage.c b/Applications/ld09/catimage.c
deleted file mode 100644 (file)
index 1f5e160..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * This program concatenates memory images the executables specified
- * on it's command line.
- *
- * The 'boot' image must have a symbol table any symbols that match
- * the below patterns have their values patched.
- *
- * int __seg0_text;    - Always zero
- * int __seg0_data;    - Segment offset of data of boot executable
- *
- * int __seg1_text;    - Segment offset of text of first executable
- * int __seg1_data;    - Segment offset of data of first executable
- * int __seg2_text;    - Segment offset of text of second executable
- * int __seg2_data;    - Segment offset of data of second executable
- *
- * int __seg9_text;    - Segment offset of text of executable nine
- * int __seg9_data;    - Segment offset of data of executable nine
- *
- * Any segment that's not an exact multiple of 16 bytes long is rounded up.
- *
- */
-
-#include <stdio.h>
-#ifdef __STDC__
-#include <unistd.h>
-#include <stdlib.h>
-#endif
-#include "x86_aout.h"
-
-#ifndef __OUT_OK
-#error "Compile error: struct exec invalid (long not 32 bit ?)"
-#endif
-
-unsigned long text_offt[10];   /* Locations to patch (0=don't) */
-unsigned long data_offt[10];
-
-char * input_file = "";
-FILE * ofd;
-FILE * ifd = 0;
-struct exec header;
-
-main(argc, argv)
-int argc;
-char ** argv;
-{
-   long image_offset, text_off;
-   int  image_id;
-
-   if( argc < 3 || argc > 11 )
-      fatal("Usage: catimage mem.bin boot.out [a1.out] ... [a9.out]");
-
-   open_obj(argv[2]);
-
-   ofd = fopen(argv[1], "w");
-   if( ofd == 0 ) fatal("Cannot open output file");
-
-   read_symtable();
-
-   image_offset = 0;
-
-   for(image_id=0; image_id < argc-2; image_id++)
-   {
-      open_obj(argv[image_id+2]);
-
-      printf("File %-14s seg=0x%04lx text=0x%04lx data=0x%04lx\n",
-              input_file, (image_offset>>4),
-             (header.a_text>>4), (header.a_total>>4));
-
-      text_off = image_offset;
-      if( header.a_flags & A_SEP )
-      {
-         copy_segment(image_offset, A_TEXTPOS(header), header.a_text);
-         image_offset += header.a_text;
-         image_offset = ((image_offset+15L)&-16L);
-   
-         copy_segment(image_offset, A_DATAPOS(header), header.a_data);
-      }
-      else
-      {
-         copy_segment(image_offset, A_TEXTPOS(header),
-                     header.a_text+header.a_data);
-      }
-
-      patch_bin(text_offt[image_id], (unsigned)(text_off>>4));
-      patch_bin(data_offt[image_id], (unsigned)(image_offset>>4));
-
-      image_offset += header.a_total;
-      image_offset = ((image_offset+15L)&-16L);
-   }
-
-   if( fseek(ofd, image_offset-1, 0) < 0 )
-      fatal("Cannot seek to end of output");
-
-   fputc('\0', ofd);
-   fclose(ofd);
-
-   printf("Output file size %ldKb\n", ((image_offset+0x3FF)>>10));
-
-   if( ifd ) fclose(ifd);
-   exit(0);
-}
-
-open_obj(fname)
-char * fname;
-{
-   input_file = fname;
-
-   if( ifd ) fclose(ifd);
-
-   ifd = fopen(fname, "r");
-   if( ifd == 0 ) fatal("Cannot open input file");
-
-   if( fread(&header, A_MINHDR, 1, ifd) != 1 )
-      fatal("Incomplete executable header");
-
-   if( BADMAG(header) )
-      fatal("Input file has bad magic number");
-}
-
-copy_segment(out_offset, in_offset, length)
-long out_offset, in_offset, length;
-{
-   char buffer[1024];
-   int ssize;
-   long bsize = length;
-
-   if( fseek(ifd, in_offset, 0) < 0 )
-      fatal("Cannot seek to start of input segment");
-
-   if( fseek(ofd, out_offset, 0) < 0 )
-      fatal("Cannot seek to start of output segment");
-
-   while(bsize>0)
-   {
-      if( bsize > sizeof(buffer) ) ssize = sizeof(buffer);
-      else ssize = bsize;
-
-      if( (ssize=fread(buffer, 1, ssize, ifd)) <= 0 )
-         fatal("Error reading segment from executable");
-      if( fwrite(buffer, 1, ssize, ofd) != ssize )
-         fatal("Error writing output file");
-      bsize -= ssize;
-   }
-}
-
-patch_bin(file_off, value)
-long file_off;
-int value;
-{
-   char wbuf[4];
-   if( file_off > 0 )
-   {
-      printf("Patch at offset 0x%05lx = %04x\n", file_off, value);
-
-      wbuf[0] = value;
-      wbuf[0] = (value>>8);
-
-      if( fseek(ofd, file_off, 0) < 0 )
-        fatal("Cannot seek to patch binary");
-
-      if( fwrite(wbuf, 1, 2, ofd) != 2 )
-        fatal("Error patching output file");
-   }
-}
-
-read_symtable()
-{
-   struct nlist item;
-   int nitems;
-   long base_off = 0;
-
-   if( header.a_syms == 0 )
-      fatal("Input file has been stripped!");
-
-   if( fseek(ifd, A_SYMPOS(header), 0) < 0 )
-      fatal("Cannot seek to start of symbols");
-
-   nitems = header.a_syms;
-
-   /* Foreach symbol */
-   while( fread(&item, sizeof(struct nlist), 1, ifd) == 1 )
-   {
-      if( nitems-- <= 0 ) break;
-
-      /* Match the name */
-      if( memcmp(item.n_name, "__seg", 5) != 0 || item.n_name[6] != '_' )
-         continue;
-
-      /* Externals only */
-      if( (item.n_sclass & N_CLASS) != C_EXT )
-         continue;
-
-      /* Data seg only */
-      if( (item.n_sclass & N_SECT) != N_DATA &&
-          (item.n_sclass & N_SECT) != N_BSS  &&
-          (item.n_sclass & N_SECT) != N_TEXT )
-        continue;
-
-      if( item.n_name[5] < '0' || item.n_name[5] > '9' )
-         continue;
-
-      if( (header.a_flags & A_SEP) && (item.n_sclass & N_SECT) != N_TEXT )
-         base_off = header.a_text;
-      else
-         base_off = 0;
-
-      switch( item.n_name[7] )
-      {
-      case 'd': data_offt[item.n_name[5]-'0'] = base_off+item.n_value; break;
-      case 't': text_offt[item.n_name[5]-'0'] = base_off+item.n_value; break;
-      }
-
-#ifdef DEBUG
-      printf("%-8.8s ", item.n_name);
-      printf("%08lx ", item.n_value);
-      switch(item.n_sclass & N_CLASS)
-      {
-      case C_NULL: printf("C_NULL "); break;
-      case C_EXT:  printf("C_EXT  "); break;
-      case C_STAT: printf("C_STAT "); break;
-      default:     printf("%-6d ", (item.n_sclass & N_CLASS)); break;
-      }
-      switch(item.n_sclass & N_SECT)
-      {
-      case N_UNDF: printf("N_UNDF "); break;
-      case N_ABS : printf("N_ABS  "); break;
-      case N_TEXT: printf("N_TEXT "); break;
-      case N_DATA: printf("N_DATA "); break;
-      case N_BSS : printf("N_BSS  "); break;
-      case N_COMM: printf("N_COMM "); break;
-      }
-      printf("\n");
-#endif
-   }
-}
-
-fatal(str)
-char * str;
-{
-   fprintf(stderr, "catimage:%s: %s\n", input_file, str);
-   exit(2);
-}
-
index f4d9ec9..9ab77f6 100644 (file)
@@ -10,8 +10,6 @@
 
 /* one of these target operating systems must be defined */
 
-#undef EDOS                    /* generate EDOS executable */
-#undef  MINIX                  /* generate Minix executable */
 #define FUZIX                  /* FUZIX executable */
 
 /* these may need to be defined to suit the source processor */
index 5663cc0..1554b98 100644 (file)
@@ -13,12 +13,7 @@ EXTERN struct redlist *redfirst;     /* first on list of redefined symbols */
 /* K&R _explicitly_ says extern followed by public is OK */
 extern char hexdigit[];                        /* constant */
 extern int  headerless;                        /* Don't output header on exe */
-#ifndef VERY_SMALL_MEMORY
-extern int  v7;                                /* Generate an UNIX v7 a.out header */
-#endif
-#ifndef MSDOS
 extern int  cpm86;                     /* Generate CP/M-86 CMD header */
-#endif
 
 extern bin_off_t text_base_value;      /* Base address of text seg */
 extern bin_off_t data_base_value;      /* Base or alignment of data seg */
index 186f0cd..6363384 100644 (file)
@@ -44,10 +44,6 @@ static int trelfd;           /* text relocation output file descriptor */
 #endif
 static unsigned warncount;     /* count of warnings */
 
-#ifdef MSDOS
-#define off_t  long            /* NOT a typedef */
-#endif
-
 static void errexit(char *message);
 static void flushout(void);
 #ifdef REL_OUTPUT
@@ -71,6 +67,7 @@ void ioinit(char *progname)
        if(*progname=='/')
           refname=progname+1;
 
+    /* FIXME: we need a malloc with error check here */
 #ifdef REL_OUTPUT
     drelbuf = malloc(DRELBUFSIZE);
     drelbuftop = drelbuf + DRELBUFSIZE;
@@ -127,10 +124,8 @@ void executable(void)
 {
     if (errcount)
         unlink(outputname);
-#ifndef MSDOS
     else
        chmod(outputname, outputperms);
-#endif
 }
 
 void flusherr(void)
@@ -201,12 +196,10 @@ void openout(char *filename)
 #endif
        outputerror("cannot open");
 
-#ifndef MSDOS
     /* Can't do this on MSDOS; it upsets share.exe */
     oldmask = umask(0); umask(oldmask);
     outputperms = ((CREAT_PERMS | EXEC_PERMS) & ~oldmask);
     chmod(filename, outputperms & ~EXEC_PERMS);
-#endif
 
 #ifdef REL_OUTPUT
     drelbufptr = drelbuf;
@@ -288,7 +281,7 @@ void putstr(const char *message)
        putbyte(*message++);
 }
 
-static void putstrn(char *message)
+static void putstrn(const char *message)
 {
     putstr(message);
     putbyte('\n');
index 05b8d75..c5b8c64 100644 (file)
@@ -8,33 +8,18 @@
 #include "type.h"
 #include "globvar.h"
 
-#define MAX_LIBS       (NR_STDLIBS + 5)
-#ifdef MC6809
-#define NR_STDLIBS     1
-#else
-#define NR_STDLIBS     0
-#endif
+#define MAX_LIBS       5
 
 bin_off_t text_base_value = 0; /* XXX */
 bin_off_t data_base_value = 0; /* XXX */
-bin_off_t heap_top_value  = 0; /* XXX */
 int headerless = 0;
-#ifndef VERY_SMALL_MEMORY
-int v7 = 0;
-#endif
-#ifndef MSDOS
-int cpm86 = 0;
-#endif
 char hexdigit[] = "0123456789abcdef";
 
 static bool_t flag[128];
 static char *libs[MAX_LIBS] = {
-#ifdef MC6809
-    "/usr/local/lib/m09/",
-#endif
     0
 };
-static int lastlib = NR_STDLIBS;
+static int lastlib = 0;
 
 static char *buildname(char *pre, char *mid, char *suf);
 static char *expandlib(char *fn);
@@ -86,9 +71,6 @@ int main(int argc, char **argv)
     objinit();
     syminit();
     typeconv_init(INT_BIG_ENDIAN, LONG_BIG_ENDIAN);
-#ifndef MC6809
-    flag['3'] = sizeof(char *) >= 4;
-#endif
     outfilename = NUL_PTR;
     for (argn = 1; argn < argc; ++argn)
     {
@@ -109,22 +91,16 @@ int main(int argc, char **argv)
 #ifdef REL_OUTPUT
            case 'B':           /* Broken -r for dosemu. */
 #endif
+#ifdef HAS_32BIT
            case '0':           /* use 16-bit libraries */
            case '3':           /* use 32-bit libraries */
+#endif
            case 'M':           /* print symbols linked */
            case 'i':           /* separate I & D output */
            case 'm':           /* print modules linked */
            case 's':           /* strip symbols */
            case 'z':           /* unmapped zero page */
-           case 'N':           /* Native format a.out */
            case 'd':           /* Make a headerless outfile */
-#ifndef MSDOS
-           case 'c':           /* Write header in CP/M-86 format */
-#endif
-           case 'y':           /* Use a newer symbol table */
-#ifndef VERY_SMALL_MEMORY
-           case '7':           /* Produce a UNIX v7 a.out header */
-#endif
                if (arg[2] == 0)
                    flag[(int) arg[1]] = TRUE;
                else if (arg[2] == '-' && arg[3] == 0)
@@ -176,17 +152,6 @@ int main(int argc, char **argv)
                if (errno != 0)
                    use_error("invalid data address");
                break;
-           case 'H':           /* heap top address */
-               if (arg[2] == 0 && ++argn >= argc)
-                   usage();
-               errno = 0;    
-               if (arg[2] == 0 )
-                  heap_top_value = strtoul(argv[argn], (char **)0, 16);
-               else
-                  heap_top_value = strtoul(arg+2, (char **)0, 16);
-               if (errno != 0)
-                   use_error("invalid heap top");
-               break;
            case 'l':           /* library name */
                tfn = buildname(libprefix, arg + 2, libsuffix);
                if ((infilename = expandlib(tfn)) == NUL_PTR)
@@ -206,65 +171,23 @@ int main(int argc, char **argv)
     }
     if(icount==0) usage();
 
-#ifdef BUGCOMPAT
-    if( icount==1 && ( flag['r'] && !flag['N'] ) ) {
-       flag['r'] = 0;
-       flag['B'] = 1;
-    }
-#endif
-
 #ifdef REL_OUTPUT
-#ifndef MSDOS
     if( flag['r'] && !flag['N'] )
     {
        /* Do a relocatable link -- actually fake it with 'ar.c' */
        ld86r(argc, argv);
     }
 #endif
-#endif
-
-#ifdef MSDOS
-    /* MSDOS Native is special, we make a COM file */
-    if( flag['N'] )
-    {
-       flag['N'] = 0;
-       flag['d'] = 1;
-       text_base_value = 0x100;
-    }
-#endif
 
     /* Headerless executables can't use symbols. */
     headerless = flag['d'];
     if( headerless ) flag['s'] = 1;
 
-#ifndef VERY_SMALL_MEMORY
-    /* UNIX seventh edition executables */
-    v7 = flag['7'];
-#endif
-
-#ifndef MSDOS
-    /* CP/M-86 executables can't use symbols. */
-    cpm86 = flag['c'];
-    if ( cpm86 ) flag['s'] = 1;
-#endif
-
     linksyms(flag['r'] | flag['B']);
     if (outfilename == NUL_PTR)
        outfilename = "a.out";
-#ifndef MSDOS
-    if( flag['N'] )
-       writebin(outfilename, flag['i'], flag['3'], flag['s'],
-            flag['z'] & flag['3']);
-    else
-#endif
-    if( flag['B'] )
-       write_dosemu(outfilename, flag['i'], flag['3'], flag['s'],
-         flag['z'] & flag['3']);
-#if 0  /* FIXME */
-    else
-       write_elks(outfilename, flag['i'], flag['3'], flag['s'],
-            flag['z'], flag['y']);
-#endif      
+    write_fuzix(outfilename, flag['i'], flag['3'], flag['s'],
+            flag['z']);
     if (flag['m'])
        dumpmods();
     if (flag['M'])
index b271a59..2ca9855 100644 (file)
@@ -47,12 +47,14 @@ char buf[128];
    for(ar=1; ar<argc; ar++) if( ar != libarg && argv[ar][0] != '-' )
    {
       char * ptr;
+      /* FIXME: strlcpy etc */
       if( stat(argv[ar], &st) < 0 ) fatalerror("Cannot stat object");
       if((ptr=strchr(argv[ar], '/'))) ptr++; else ptr=argv[ar];
       memset(&arbuf, ' ', sizeof(arbuf));
       strcpy(buf, ptr); strcat(buf, "/                 ");
       strncpy(arbuf.ar_name, buf, sizeof(arbuf.ar_name));
      
+      /* FIXME: use ltoa ita for Fuzix */
       snprintf(arbuf.ar_date, 12, "%-12ld", (long)st.st_mtime);
       snprintf(arbuf.ar_uid, 6, "%-6d", (int)(st.st_uid%1000000L));
       snprintf(arbuf.ar_gid, 6, "%-6d", (int)(st.st_gid%1000000L));
@@ -63,6 +65,7 @@ char buf[128];
       if( fwrite(&arbuf, 1, sizeof(arbuf), fd) != sizeof(arbuf) )
          fatalerror("Cannot write header");
 
+      /* FIXME: can overflow and off_t may not be size_t*/
       ptr = malloc(st.st_size+2);
       if( ptr == 0 ) fatalerror("Out of memory");
       ptr[st.st_size] = ' ';
@@ -71,9 +74,11 @@ char buf[128];
          fatalerror("Cannot read input file");
       fclose(ifd);
 
+      /* FIXME: may overflow */
       if( st.st_size&1 ) st.st_size++;
       if( fwrite(ptr, 1, st.st_size, fd) != st.st_size )
          fatalerror("Cannot write output file");
+      free(ptr);
    }
    fclose(fd);
    exit(0);
diff --git a/Applications/ld09/objchop.c b/Applications/ld09/objchop.c
deleted file mode 100644 (file)
index 23b96aa..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-
-#include <stdio.h>
-#ifdef __STDC__
-#include <unistd.h>
-#include <stdlib.h>
-#endif
-#include "x86_aout.h"
-
-#ifndef __OUT_OK
-
-int main(int argc, char *argv[])
-{
-   fprintf(stderr, "Compile error: struct exec invalid\n");
-   exit(1);
-}
-
-#else
-
-FILE * ifd;
-struct exec header;
-
-void fatal(const char * str)
-{
-   fprintf(stderr, "objchop: %s\n", str);
-   exit(2);
-}
-
-int write_file(char *fname, long bsize)
-{
-   char buffer[1024];
-   int ssize;
-   FILE * ofd;
-
-   ofd = fopen(fname, "w");
-   if( ofd == 0 ) fatal("Cannot open output file");
-
-   while(bsize>0)
-   {
-      if( bsize > sizeof(buffer) ) ssize = sizeof(buffer);
-      else ssize = bsize;
-
-      if( (ssize=fread(buffer, 1, ssize, ifd)) <= 0 )
-         fatal("Error reading segment from executable");
-      if( fwrite(buffer, 1, ssize, ofd) != ssize )
-         fatal("Error writing output file");
-      bsize -= ssize;
-   }
-   fclose(ofd);
-}
-
-int main(int argc, char **argv)
-{
-   FILE * ofd;
-   if( argc != 5 ) fatal("Usage: objchop a.out text.bin data.bin sizes.asm");
-
-   ifd = fopen(argv[1], "r");
-   if( ifd == 0 ) fatal("Cannot open input file");
-
-   if( fread(&header, A_MINHDR, 1, ifd) != 1 )
-      fatal("Incomplete executable header");
-
-   if( BADMAG(header) )
-      fatal("Input file has bad magic number");
-
-   if( fseek(ifd, A_TEXTPOS(header), 0) < 0 )
-      fatal("Cannot seek to start of text");
-
-   write_file(argv[2], header.a_text);
-
-   if( fseek(ifd, A_DATAPOS(header), 0) < 0 )
-      fatal("Cannot seek to start of data");
-
-   write_file(argv[3], header.a_data);
-
-   ofd = fopen(argv[4], "w");
-   if( ofd == 0 ) fatal("Cannot open output file");
-
-   fprintf(ofd, "TEXT_SIZE=%ld\nDATA_SIZE=%ld\nBSS_SIZE=%ld\nALLOC_SIZE=%ld\n",
-           header.a_text, header.a_data, header.a_bss, header.a_total);
-
-   fclose(ofd);
-
-   exit(0);
-}
-
-#endif
index 85032a1..89f4e2d 100644 (file)
@@ -55,11 +55,6 @@ void fetch_aout_hdr _((void));
 void dump_aout _((void));
 void size_aout _((void));
 void nm_aout _((void));
-#ifndef VERY_SMALL_MEMORY
-void fetch_v7_hdr _((void));
-void dump_v7 _((void));
-void size_v7 _((void));
-#endif
 
 int  obj_ver;
 int  sections;
@@ -282,19 +277,6 @@ char * archive;
       case 2: nm_aout(); break;
       }
       break;
-#ifndef VERY_SMALL_MEMORY
-   case 2: /* V7 executable */
-      fseek(ifd, 0L, 0);
-      fetch_v7_hdr();
-
-      switch(display_mode)
-      {
-      case 0: dump_v7(); break;
-      case 1: size_v7(); break;
-      case 2: error("Symbol table not supported for v7"); exit(1); break;
-      }
-      break;
-#endif
    }
 
    if( strtab ) free(strtab);
@@ -333,13 +315,6 @@ read_objheader()
          sections = 1;
         return 1;
       }
-#ifndef VERY_SMALL_MEMORY
-      if( buf[1] == 1 ) /* 04xx octal */
-      {
-         sections = 1;
-         return 2;
-      }
-#endif
       return error("Bad magic number");
    }
 
@@ -893,80 +868,3 @@ nm_aout()
    if( pending_nl ) putchar('\n');
 }
 
-#ifndef VERY_SMALL_MEMORY
-/************************************************************************/
-/* V7 a.out versions
- */
-
-void
-fetch_v7_hdr()
-{
-   int i;
-
-   h_len  = 8;
-   for(i=0; i<h_len; i++)
-   {
-      header[i] = get_word();
-   }
-}
-
-void
-size_v7()
-{
-   if( display_mode == 0 )
-      printf("text\tdata\tbss\tdec\thex\tfilename\n");
-
-   printf("%ld\t%ld\t%ld\t%ld\t%lx\t%s\n",
-      header[1], header[2], header[3],
-      header[1]+ header[2]+ header[3],
-      header[1]+ header[2]+ header[3],
-      ifname);
-
-   tot_size_text += header[1];
-   tot_size_data += header[2];
-   tot_size_bss  += header[3];
-}
-
-void
-dump_v7()
-{
-   int i;
-   long l;
-
-   printf("TYPE:");
-   switch (header[0]) {
-   case 0405: printf(" overlay"); break;
-   case 0407: printf(" impure"); break;
-   case 0410: printf(" read-only text"); break;
-   case 0411: printf(" pure"); break;
-   case 0413: printf(" demand load"); break;
-   default: printf(" (unknown)"); break;
-   }
-   printf("\n");
-
-   if( header[5] )
-      printf("a_entry  = 0x%08lx\n", header[5]);
-   printf("\n");
-
-   size_aout();
-   printf("\n");
-
-   printf("TEXTSEG\n");
-   fseek(ifd, (long)h_len, 0);
-   for(l=0; l<header[1]; l++)
-   {
-      if( (i=getc(ifd)) == EOF ) break;
-      hex_output(i);
-   }
-   hex_output(EOF);
-
-   printf("DATASEG\n");
-   fseek(ifd, (long)h_len+header[1], 0);
-   for(l=0; l<header[2]; l++)
-   {
-      if( (i=getc(ifd)) == EOF ) break;
-      hex_output(i);
-   }
-   hex_output(EOF);
-}
-#endif
index 2b858c0..2a771ef 100644 (file)
@@ -121,19 +121,12 @@ static long readarheader(char **parchentry)
 
 static unsigned readfileheader(void)
 {
-    struct
-    {
-       char magic[2];
-       char count[2];          /* really an int */
-    }
-     fileheader;
-    char filechecksum;         /* part of fileheader but would unalign */
+    char fileheader[5];
 
-    readin((char *) &fileheader, sizeof fileheader);
-    readin(&filechecksum, sizeof filechecksum);
-    if (filechecksum != checksum((char *) &fileheader, sizeof fileheader))
+    readin(fileheader, sizeof fileheader);
+    if ((unsigned char)fileheader[4] != checksum(fileheader, 4))
        input1error(" is not an object file (checksum failed)");
-    return c2u2(fileheader.count);
+    return c2u2(fileheader + 2);
 }
 
 /* read the next module */
@@ -321,9 +314,10 @@ static bool_pt redsym(struct symstruct *symptr, bin_off_t value)
     return TRUE;
 }
 
-static unsigned checksum(char *string, unsigned length)
+static unsigned checksum(char *stringp, unsigned length)
 {
     unsigned char sum;         /* this is a 1-byte checksum */
+    unsigned char *string = (unsigned char *)stringp;
 
     for (sum = 0; length-- != 0;)
        sum += *string++ & 0xFF;
diff --git a/Applications/ld09/rel_aout.h b/Applications/ld09/rel_aout.h
deleted file mode 100644 (file)
index 9316a72..0000000
+++ /dev/null
@@ -1,383 +0,0 @@
-#ifndef _BSD_A_OUT_H
-#define _BSD_A_OUT_H
-
-struct exec {                  /* a.out header */
-  unsigned char        a_magic[2];     /* magic number */
-  unsigned char        a_flags;        /* flags, see below */
-  unsigned char        a_cpu;          /* cpu id */
-  unsigned char        a_hdrlen;       /* length of header */
-  unsigned char        a_unused;       /* reserved for future use */
-  unsigned short a_version;    /* version stamp (not used at present) */
-  long         a_text;         /* size of text segement in bytes */
-  long         a_data;         /* size of data segment in bytes */
-  long         a_bss;          /* size of bss segment in bytes */
-  long         a_entry;        /* entry point */
-  long         a_total;        /* total memory allocated */
-  long         a_syms;         /* size of symbol table */
-                               /* SHORT FORM ENDS HERE */
-
-  long         a_trsize;       /* text relocation size */
-  long         a_drsize;       /* data relocation size */
-  long         a_tbase;        /* text relocation base */
-  long         a_dbase;        /* data relocation base */
-};
-
-#define A_MAGIC0       ((unsigned char) 0x01)
-#define A_MAGIC1       ((unsigned char) 0x03)
-#define BADMAG(X)    ((X).a_magic[0] != A_MAGIC0 || (X).a_magic[1] != A_MAGIC1)
-
-/* CPU Id of TARGET machine (byte order coded in low order two bits) */
-#define A_NONE 0x00    /* unknown */
-#define A_I8086        0x04    /* intel i8086/8088 */
-#define A_M68K 0x0B    /* motorola m68000 */
-#define A_NS16K        0x0C    /* national semiconductor 16032 */
-#define A_I80386 0x10  /* intel i80386 */
-#define A_SPARC        0x17    /* Sun SPARC */
-
-#define A_BLR(cputype) ((cputype&0x01)!=0) /* TRUE if bytes left-to-right */
-#define A_WLR(cputype) ((cputype&0x02)!=0) /* TRUE if words left-to-right */
-
-/* Flags. */
-#define A_UZP  0x01    /* unmapped zero page (pages) */
-#define A_EXEC 0x10    /* executable */
-#define A_SEP  0x20    /* separate I/D */
-#define A_PURE 0x40    /* pure text */         /* not used */
-#define A_TOVLY        0x80    /* text overlay */      /* not used */
-
-/* Tell a.out.gnu.h not to define `struct exec'.  */
-#define __STRUCT_EXEC_OVERRIDE__
-
-/* Hide M_386 from enum declaration in a.out.h. */
-#define M_386 HIDE_M_386
-
-#ifndef __A_OUT_GNU_H__
-#define __A_OUT_GNU_H__
-
-#if defined(sequent) && defined(i386)
-#define a_magic a_info
-#include <a.out.h>
-#undef a_magic
-#define __STRUCT_EXEC_OVERRIDE__
-#define N_NLIST_DECLARED
-#define N_RELOCATION_INFO_DECLARED
-#endif
-
-#define __GNU_EXEC_MACROS__
-
-#ifndef __STRUCT_EXEC_OVERRIDE__
-
-struct exec
-{
-  unsigned long a_info;                /* Use macros N_MAGIC, etc for access */
-  unsigned long a_text;                /* length of text, in bytes */
-  unsigned long a_data;                /* length of data, in bytes */
-  unsigned long a_bss;         /* length of uninitialized data area for file, in bytes */
-  unsigned long a_syms;                /* length of symbol table data in file, in bytes */
-  unsigned long a_entry;       /* start address */
-  unsigned long a_trsize;      /* length of relocation info for text, in bytes */
-  unsigned long a_drsize;      /* length of relocation info for data, in bytes */
-};
-
-#endif /* __STRUCT_EXEC_OVERRIDE__ */
-
-/* these go in the N_MACHTYPE field */
-enum machine_type {
-#if defined (M_OLDSUN2)
-  M__OLDSUN2 = M_OLDSUN2,
-#else
-  M_OLDSUN2 = 0,
-#endif
-#if defined (M_68010)
-  M__68010 = M_68010,
-#else
-  M_68010 = 1,
-#endif
-#if defined (M_68020)
-  M__68020 = M_68020,
-#else
-  M_68020 = 2,
-#endif
-#if defined (M_SPARC)
-  M__SPARC = M_SPARC,
-#else
-  M_SPARC = 3,
-#endif
-  /* skip a bunch so we don't run into any of sun's numbers */
-  M_386 = 100,
-};
-
-#if !defined (N_MAGIC)
-#define N_MAGIC(exec) ((exec).a_info & 0xffff)
-#endif
-#define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff))
-#define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff)
-#define N_SET_INFO(exec, magic, type, flags) \
-       ((exec).a_info = ((magic) & 0xffff) \
-        | (((int)(type) & 0xff) << 16) \
-        | (((flags) & 0xff) << 24))
-#define N_SET_MAGIC(exec, magic) \
-       ((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff)))
-
-#define N_SET_MACHTYPE(exec, machtype) \
-       ((exec).a_info = \
-        ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16))
-
-#define N_SET_FLAGS(exec, flags) \
-       ((exec).a_info = \
-        ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24))
-
-#ifndef OMAGIC
-/* Code indicating object file or impure executable.  */
-#define OMAGIC 0407
-/* Code indicating pure executable.  */
-#define NMAGIC 0410
-/* Code indicating demand-paged executable.  */
-#define ZMAGIC 0413
-#endif /* not OMAGIC */
-
-#if !defined (N_BADMAG)
-#define N_BADMAG(x)                                    \
- (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC         \
-  && N_MAGIC(x) != ZMAGIC)
-#endif
-
-#define _N_BADMAG(x)                                   \
- (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC         \
-  && N_MAGIC(x) != ZMAGIC)
-
-#define _N_HDROFF(x) (SEGMENT_SIZE - sizeof (struct exec))
-
-#if !defined (N_TXTOFF)
-#define N_TXTOFF(x) \
- (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : sizeof (struct exec))
-#endif
-
-#if !defined (N_DATOFF)
-#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text)
-#endif
-
-#if !defined (N_TRELOFF)
-#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data)
-#endif
-
-#if !defined (N_DRELOFF)
-#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize)
-#endif
-
-#if !defined (N_SYMOFF)
-#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize)
-#endif
-
-#if !defined (N_STROFF)
-#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms)
-#endif
-
-/* Address of text segment in memory after it is loaded.  */
-#if !defined (N_TXTADDR)
-#define N_TXTADDR(x) 0
-#endif
-
-/* Address of data segment in memory after it is loaded.
-   Note that it is up to you to define SEGMENT_SIZE
-   on machines not listed here.  */
-#if defined(vax) || defined(hp300) || defined(pyr)
-#define SEGMENT_SIZE PAGE_SIZE
-#endif
-#ifdef hp300
-#define        PAGE_SIZE       4096
-#endif
-#ifdef sony
-#define        SEGMENT_SIZE    0x2000
-#endif /* Sony.  */
-#ifdef is68k
-#define SEGMENT_SIZE 0x20000
-#endif
-#if defined(m68k) && defined(PORTAR)
-#define PAGE_SIZE 0x400
-#define SEGMENT_SIZE PAGE_SIZE
-#endif
-
-#define _N_SEGMENT_ROUND(x) (((x) + SEGMENT_SIZE - 1) & ~(SEGMENT_SIZE - 1))
-
-#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text)
-
-#ifndef N_DATADDR
-#define N_DATADDR(x) \
-    (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \
-     : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x))))
-#endif
-
-/* Address of bss segment in memory after it is loaded.  */
-#if !defined (N_BSSADDR)
-#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data)
-#endif
-\f
-#if !defined (N_NLIST_DECLARED)
-struct nlist {
-  union {
-    char *n_name;
-    struct nlist *n_next;
-    long n_strx;
-  } n_un;
-  unsigned char n_type;
-  char n_other;
-  short n_desc;
-  unsigned long n_value;
-};
-#endif /* no N_NLIST_DECLARED.  */
-
-#if !defined (N_UNDF)
-#define N_UNDF 0
-#endif
-#if !defined (N_ABS)
-#define N_ABS 2
-#endif
-#if !defined (N_TEXT)
-#define N_TEXT 4
-#endif
-#if !defined (N_DATA)
-#define N_DATA 6
-#endif
-#if !defined (N_BSS)
-#define N_BSS 8
-#endif
-#if !defined (N_COMM)
-#define N_COMM 18
-#endif
-#if !defined (N_FN)
-#define N_FN 15
-#endif
-
-#if !defined (N_EXT)
-#define N_EXT 1
-#endif
-#if !defined (N_TYPE)
-#define N_TYPE 036
-#endif
-#if !defined (N_STAB)
-#define N_STAB 0340
-#endif
-
-/* The following type indicates the definition of a symbol as being
-   an indirect reference to another symbol.  The other symbol
-   appears as an undefined reference, immediately following this symbol.
-
-   Indirection is asymmetrical.  The other symbol's value will be used
-   to satisfy requests for the indirect symbol, but not vice versa.
-   If the other symbol does not have a definition, libraries will
-   be searched to find a definition.  */
-#define N_INDR 0xa
-
-/* The following symbols refer to set elements.
-   All the N_SET[ATDB] symbols with the same name form one set.
-   Space is allocated for the set in the text section, and each set
-   element's value is stored into one word of the space.
-   The first word of the space is the length of the set (number of elements).
-
-   The address of the set is made into an N_SETV symbol
-   whose name is the same as the name of the set.
-   This symbol acts like a N_DATA global symbol
-   in that it can satisfy undefined external references.  */
-
-/* These appear as input to LD, in a .o file.  */
-#define        N_SETA  0x14            /* Absolute set element symbol */
-#define        N_SETT  0x16            /* Text set element symbol */
-#define        N_SETD  0x18            /* Data set element symbol */
-#define        N_SETB  0x1A            /* Bss set element symbol */
-
-/* This is output from LD.  */
-#define N_SETV 0x1C            /* Pointer to set vector in data area.  */
-\f
-#if !defined (N_RELOCATION_INFO_DECLARED)
-/* This structure describes a single relocation to be performed.
-   The text-relocation section of the file is a vector of these structures,
-   all of which apply to the text section.
-   Likewise, the data-relocation section applies to the data section.  */
-
-struct relocation_info
-{
-  /* Address (within segment) to be relocated.  */
-  unsigned long r_address;
-#if 0
-  /* The meaning of r_symbolnum depends on r_extern.  */
-  unsigned int r_symbolnum:24;
-  /* Nonzero means value is a pc-relative offset
-     and it should be relocated for changes in its own address
-     as well as for changes in the symbol or section specified.  */
-  unsigned int r_pcrel:1;
-  /* Length (as exponent of 2) of the field to be relocated.
-     Thus, a value of 2 indicates 1<<2 bytes.  */
-  unsigned int r_length:2;
-  /* 1 => relocate with value of symbol.
-          r_symbolnum is the index of the symbol
-         in file's the symbol table.
-     0 => relocate with the address of a segment.
-          r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS
-         (the N_EXT bit may be set also, but signifies nothing).  */
-  unsigned int r_extern:1;
-  /* Four bits that aren't used, but when writing an object file
-     it is desirable to clear them.  */
-  unsigned int r_pad:4;
-#else
-  unsigned long foo;
-#endif
-};
-#endif /* no N_RELOCATION_INFO_DECLARED.  */
-
-
-#endif /* __A_OUT_GNU_H__ */
-
-#undef M_386
-#define M_386 A_I80386
-
-#undef N_MAGIC
-#define N_MAGIC3(magic0, magic1, type) \
-       ((magic0) | ((magic1) << 8) | ((type) << 16))
-#define N_MAGIC(exec) \
-       N_MAGIC3((exec).a_magic[0], (exec).a_magic[1], (exec).a_flags)
-       
-#undef N_MACHTYPE
-#define N_MACHTYPE(exec) ((enum machine_type)((exec).a_cpu))
-
-#undef N_FLAGS
-#define N_FLAGS(exec) 0
-
-#undef N_SET_INFO
-#define N_SET_INFO(exec, magic, type, flags) \
-       ((exec).a_magic[0] = (magic) & 0xff, \
-        (exec).a_magic[1] = ((magic) >> 8) & 0xff, \
-        (exec).a_flags = ((magic) >> 16) & 0xff, \
-        (exec).a_cpu = (type) & 0xff)
-        
-#undef N_SET_MAGIC
-#define N_SET_MAGIC(exec, magic) \
-       ((exec).a_magic[0] = (magic) & 0xff, \
-        (exec).a_magic[1] = ((magic) >> 8) & 0xff, \
-        (exec).a_flags = ((magic) >> 16) & 0xff)
-
-#undef N_SET_MACHTYPE
-#define N_SET_MACHTYPE(exec, machtype) \
-       ((exec).a_cpu = (machtype) & 0xff, \
-        (exec).a_hdrlen = sizeof (exec))
-
-#undef N_SET_FLAGS
-#define N_SET_FLAGS(exec, flags) /* nothing */
-
-#undef OMAGIC
-#define OMAGIC N_MAGIC3(A_MAGIC0, A_MAGIC1, 0)
-
-#undef NMAGIC
-#define NMAGIC N_MAGIC3(A_MAGIC0, A_MAGIC1, A_EXEC)
-
-#undef ZMAGIC
-#define ZMAGIC N_MAGIC3(A_MAGIC0, A_MAGIC1, A_EXEC)
-
-#undef _N_HDROFF
-#define _N_HDROFF(x) 0
-
-#undef PAGE_SIZE
-#define PAGE_SIZE 16
-#define SEGMENT_SIZE PAGE_SIZE
-#define getpagesize() PAGE_SIZE
-
-#endif /* _BSD_A_OUT_H */
index 4ab0b63..e603e50 100644 (file)
@@ -5,4 +5,5 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <stdint.h>
 
index 6a7acd4..de7bbf6 100644 (file)
@@ -84,7 +84,7 @@ void executable(void);
 void flusherr(void);
 void openin(char *filename);
 void openout(char *filename);
-void putstr(char *message);
+void putstr(const char *message);
 void put08x(bin_off_t num);
 void put08lx(bin_off_t num);
 void putbstr(unsigned width, char *str);
@@ -161,6 +161,10 @@ void write_dosemu(char *outfilename, bool_pt argsepid, bool_pt argbits32,
 void write_elks(char *outfilename, bool_pt argsepid, bool_pt argbits32,
                 bool_pt argstripflag, bool_pt arguzp, bool_pt nsym);
 
+/* write_fuzix.c */
+void write_fuzix(char *outfilename, bool_pt argsepid, bool_pt argbits32,
+                bool_pt argstripflag, bool_pt arguzp);
+
 /* linksym.c */
 void linksyms(bool_pt argreloc_output);
 
diff --git a/Applications/ld09/v7_aout.h b/Applications/ld09/v7_aout.h
deleted file mode 100644 (file)
index 020079b..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Header format of 16-bit
- * Seventh edition UNIX executables */
-
-#ifndef _V7_A_OUT_H
-#define _V7_A_OUT_H
-
-#define V7_MAGIC4 0405 /* v7 overlay */
-#define V7_OMAGIC 0407 /* I&D in one segment (impure) */
-#define V7_NMAGIC 0410 /* read-only text */
-#define V7_MAGIC3 0411 /* v7 separate I&D (pure) */
-#define V7_ZMAGIC 0413 /* v8 demand load */
-
-#define V7_HEADERLEN 16
-
-struct  v7_exec {
-    short magic;
-    unsigned short textsize;
-    unsigned short datasize;
-    unsigned short bsssize;
-    unsigned short symtabsize;
-    unsigned short entry;
-    unsigned short pad;
-    unsigned short noreloc;
-};
-
-#endif /* _V7_A_OUT_H */
diff --git a/Applications/ld09/writebin.c b/Applications/ld09/writebin.c
deleted file mode 100644 (file)
index d43cff8..0000000
+++ /dev/null
@@ -1,1044 +0,0 @@
-
-/* writebin.c - write binary file for linker */
-
-/* Copyright (C) 1994 Bruce Evans */
-
-#include "syshead.h"
-#include "bindef.h"
-#include "const.h"
-#include "obj.h"
-#include "type.h"
-#include "globvar.h"
-
-#ifdef AOUT_DETECTED
-#define btextoffset (text_base_value)
-#define bdataoffset (data_base_value)
-#define page_size() 4096
-
-#ifdef __ELF__
-#ifndef ELF_SYMS
-#define ELF_SYMS 1
-#endif
-#endif
-
-#ifdef EDOS
-# define FILEHEADERLENGTH 0
-#endif
-#ifdef MINIX
-# ifdef BSD_A_OUT
-#  ifdef STANDARD_GNU_A_OUT
-#   define HEADERLEN (sizeof(struct exec))
-#  else
-#   define HEADERLEN (48)
-#  endif
-# else
-#  ifdef REL_OUTPUT
-#   define HEADERLEN (reloc_output?sizeof(struct exec):A_MINHDR)
-                               /* part of header not counted in offsets */
-#  else
-#   define HEADERLEN (A_MINHDR)
-#  endif
-# endif
-# ifndef FILEHEADERLENGTH
-#  define FILEHEADERLENGTH (headerless?0:HEADERLEN)
-# endif
-#endif
-#define DPSEG 2
-
-#define CM_MASK 0xC0
-#define MODIFY_MASK 0x3F
-#define S_MASK 0x04
-#define OF_MASK 0x03
-
-#define CM_SPECIAL 0
-#define CM_ABSOLUTE 0x40
-#define CM_OFFSET_RELOC 0x80
-#define CM_SYMBOL_RELOC 0xC0
-
-#define CM_EOT 0
-#define CM_BYTE_SIZE 1
-#define CM_WORD_SIZE 2
-#define CM_LONG_SIZE 3
-#define CM_1_SKIP 17
-#define CM_2_SKIP 18
-#define CM_4_SKIP 19
-#define CM_0_SEG 32
-
-#define ABS_TEXT_MAX 64
-
-#define memsizeof(struc, mem) sizeof(((struc *) 0)->mem)
-
-static bool_t bits32;          /* nonzero for 32-bit executable */
-static bin_off_t combase[NSEG];/* bases of common parts of segments */
-static bin_off_t comsz[NSEG];  /* sizes of common parts of segments */
-static fastin_t curseg;        /* current segment, 0 to $F */
-static bin_off_t edataoffset;  /* end of data */
-static bin_off_t endoffset;    /* end of bss */
-static bin_off_t etextoffset;  /* end of text */
-static bin_off_t etextpadoff;  /* end of padded text */
-#ifdef REL_OUTPUT
-static unsigned ndreloc;       /* number of data relocations */
-#endif
-static unsigned nsym;          /* number of symbols written */
-#ifdef REL_OUTPUT
-static unsigned ntreloc;       /* number of text relocations */
-extern bool_t reloc_output;    /* nonzero to leave reloc info in output */
-#endif
-static unsigned relocsize;     /* current relocation size 1, 2 or 4 */
-static bin_off_t segadj[NSEG]; /* adjusts (file offset - seg offset) */
-                               /* depends on zero init */
-static bin_off_t segbase[NSEG];/* bases of data parts of segments */
-static char segboundary[9] = "__seg0DH";
-                               /* name of seg boundary __seg0DL to __segfCH */
-static bin_off_t segpos[NSEG]; /* segment positions for current module */
-static bin_off_t segsz[NSEG];  /* sizes of data parts of segments */
-                               /* depends on zero init */
-static bool_t sepid;           /* nonzero for separate I & D */
-static bool_t stripflag;       /* nonzero to strip symbols */
-static bin_off_t spos;         /* position in current seg */
-static bool_t uzp;             /* nonzero for unmapped zero page */
-
-#ifdef EDOS
-static unsigned binheaderlength(char *commandname);
-char *idconvert(struct entrylist *elptr, char *commandname);
-#endif
-static void linkmod(struct modstruct *modptr);
-static void padmod(struct modstruct *modptr);
-static void setsym(char *name, bin_off_t value);
-static void symres(char *name);
-static void setseg(fastin_pt newseg);
-static void skip(unsigned countsize);
-#ifdef EDOS
-static void writeheader(char *commandname);
-#else
-static void writeheader(void);
-#endif
-static void writenulls(bin_off_t count);
-
-/* write binary file */
-#ifndef FUNCNAME 
-#define FUNCNAME writebin
-#endif
-
-void FUNCNAME(char *outfilename, bool_pt argsepid, bool_pt argbits32,
-                     bool_pt argstripflag, bool_pt arguzp)
-{
-    char buf4[4];
-#ifdef EDOS
-    char *commandname;
-#endif
-    char *cptr;
-    struct nlist extsym;
-    flags_t flags;
-    struct modstruct *modptr;
-    fastin_t seg;
-    unsigned sizecount;
-    bin_off_t tempoffset;
-
-    sepid = argsepid;
-    bits32 = argbits32;
-    stripflag = argstripflag;
-#ifdef REL_OUTPUT
-    uzp = arguzp && !reloc_output;
-#else
-    uzp = arguzp;
-#endif
-    if (uzp)
-    {
-       if (btextoffset == 0)
-#ifdef QMAGIC
-           btextoffset = page_size()+HEADERLEN;
-#else
-           btextoffset = page_size();
-#endif
-       if (bdataoffset == 0 && sepid)
-           bdataoffset = page_size();
-    }
-#ifdef EDOS
-    commandname = stralloc(outfilename);
-    if ((cptr = strchr(commandname, ':')) != NUL_PTR)
-       commandname = cptr + 1;
-    if ((cptr = strrchr(commandname, '.')) != NUL_PTR)
-       *cptr = 0;
-#endif
-
-    /* reserve special symbols use curseg to pass parameter to symres() */
-    for (curseg = 0; curseg < NSEG; ++curseg)
-    {
-       segboundary[5] = hexdigit[curseg];      /* to __segX?H */
-       segboundary[6] = 'D';
-       symres(segboundary);    /* __segXDH */
-       segboundary[7] = 'L';
-       symres(segboundary);    /* __segXDL */
-       segboundary[6] = 'C';
-       symres(segboundary);    /* __segXCL */
-       segboundary[7] = 'H';
-       symres(segboundary);    /* __segXCH */
-#ifndef DATASEGS
-        if( curseg > 3 )
-       {
-          segboundary[6] = 'S';
-          segboundary[7] = 'O';
-          symres(segboundary); /* __segXSO */
-        }
-#endif
-    }
-#ifdef EDOS
-    curseg = 0;                        /* data seg, s.b. variable */
-#else
-    curseg = 3;
-#endif
-    symres("__edata");
-    symres("__end");
-    curseg = 0;                        /* text seg, s.b. variable */
-    symres("__etext");
-    symres("__segoff");
-
-    /* calculate segment and common sizes (sum over loaded modules) */
-    /* use zero init of segsz[] */
-    /* also relocate symbols relative to starts of their segments */
-    for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-       if (modptr->loadflag)
-       {
-           register struct symstruct **symparray;
-           register struct symstruct *symptr;
-
-           for (symparray = modptr->symparray;
-                (symptr = *symparray) != NUL_PTR; ++symparray)
-               if (symptr->modptr == modptr && !(symptr->flags & A_MASK))
-               {
-                   if (!(symptr->flags & (I_MASK | SA_MASK)))
-                   {
-                       /* relocate by offset of module in segment later */
-                       /* relocate by offset of segment in memory special */
-                       /* symbols get relocated improperly */
-                       symptr->value += segsz[symptr->flags & SEGM_MASK];
-                   }
-                   else if (symptr->value == 0)
-                   {
-#ifdef REL_OUTPUT
-                       if (!reloc_output)
-#endif
-                           undefined(symptr->name);
-                   }
-                   else
-                   {
-#ifdef REL_OUTPUT
-#if 0
-                       if (!reloc_output)
-#else  
-                       if (!reloc_output || !(symptr->flags & I_MASK))
-#endif                 
-#endif
-                       {
-                           tempoffset = ld_roundup(symptr->value, 4, bin_off_t);
-                           /* temp kludge quad alignment for 386 */
-                           symptr->value = comsz[seg = symptr->flags & SEGM_MASK];
-                           comsz[seg] += tempoffset;
-                       }
-                       if (!(symptr->flags & SA_MASK))
-                           symptr->flags |= C_MASK;
-                   }
-               }
-           for (seg = 0, cptr = modptr->segsize; seg < NSEG; ++seg)
-           {
-               segsz[seg] += cntooffset(cptr,
-                         sizecount = segsizecount((unsigned) seg, modptr));
-#ifndef EDOS
-
-               /* adjust sizes to even to get quad boundaries */
-               /* this should be specifiable dynamically */
-               segsz[seg] = ld_roundup(segsz[seg], 4, bin_off_t);
-               comsz[seg] = ld_roundup(comsz[seg], 4, bin_off_t);
-#endif
-               cptr += sizecount;
-           }
-       }
-
-    /* calculate seg positions now their sizes are known */
-    /* temp use fixed order 0D 0C 1D 1C 2D 2C ... */
-    /*
-#ifdef DATASEGS
-     * Assume seg 0 is text and rest are data
-#else
-     * Assume seg 1..3 are data, Seg 0 is real text, seg 4+ are far text
-#endif
-     */
-#ifdef EDOS
-    if (btextoffset == 0)
-       btextoffset = binheaderlength(commandname);
-#endif
-    segpos[0] = segbase[0] = spos = btextoffset;
-    combase[0] = segbase[0] + segsz[0];
-    segadj[1] = segadj[0] = -btextoffset;
-    etextpadoff = etextoffset = combase[0] + comsz[0];
-    if (sepid)
-    {
-       etextpadoff = ld_roundup(etextoffset, 0x10, bin_off_t);
-       segadj[1] += etextpadoff - bdataoffset;
-    }
-#ifdef QMAGIC
-    else if (uzp && bdataoffset == 0)
-    {
-       bdataoffset = ld_roundup(etextoffset, page_size(), bin_off_t);
-       etextpadoff = ld_roundup(etextoffset, page_size(), bin_off_t);
-       segadj[1] += etextpadoff - bdataoffset;
-    }
-#endif
-    else if (bdataoffset == 0)
-       bdataoffset = etextpadoff;
-    segpos[1] = segbase[1] = edataoffset = bdataoffset;
-    combase[1] = segbase[1] + segsz[1];
-#ifndef DATASEGS
-    for (seg = 4; seg < NSEG; ++seg)
-    {
-       segpos[seg] = segbase[seg] = 0;
-       combase[seg] = segbase[seg] + segsz[seg];
-       segadj[seg] = etextpadoff;
-
-       etextpadoff += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t);
-       segadj[1]   += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t);
-    }
-    for (seg = 2; seg < 4; ++seg)
-#else
-    for (seg = 2; seg < NSEG; ++seg)
-#endif
-    {
-       segpos[seg] = segbase[seg] = combase[seg - 1] + comsz[seg - 1];
-#ifdef MC6809
-       if (seg == DPSEG)
-       {
-           /* temporarily have fixed DP seg */
-           /* adjust if nec so it only spans 1 page */
-           tempoffset = segsz[seg] + comsz[seg];
-           if (tempoffset > 0x100)
-               fatalerror("direct page segment too large");
-           if ((((segbase[seg] + tempoffset) ^ segbase[seg])
-                & ~(bin_off_t) 0xFF) != 0)
-               segpos[seg] = segbase[seg] = (segbase[seg] + 0xFF)
-                                            & ~(bin_off_t) 0xFF;
-       }
-#endif
-
-#ifdef QMAGIC
-       if(seg==3 && uzp && !stripflag) /* XXX Stripped last seek needed */
-       {
-          bin_off_t val;
-          val = ld_roundup(segbase[seg]+segsz[seg], page_size(), bin_off_t);
-          segsz[seg] = val - segbase[seg];
-       }
-#endif 
-       combase[seg] = segbase[seg] + segsz[seg];
-       segadj[seg] = segadj[seg - 1];
-    }
-
-    /* relocate symbols by offsets of segments in memory */
-    for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-       if (modptr->loadflag)
-       {
-           register struct symstruct **symparray;
-           register struct symstruct *symptr;
-
-           for (symparray = modptr->symparray;
-                (symptr = *symparray) != NUL_PTR; ++symparray)
-               if (symptr->modptr == modptr && !(symptr->flags & A_MASK))
-               {
-                   if (symptr->flags & (C_MASK | SA_MASK))
-                   {
-#ifdef REL_OUTPUT
-#if 0
-                       if (!reloc_output)
-#else  
-                       if (!reloc_output || !(symptr->flags & I_MASK))
-#endif                 
-#endif
-                           symptr->value += combase[symptr->flags & SEGM_MASK];
-                   }
-                   else
-#ifdef REL_OUTPUT
-                   if (!reloc_output || !(symptr->flags & I_MASK))
-#endif
-                       symptr->value += segbase[symptr->flags & SEGM_MASK];
-               }
-       }
-
-    /* adjust special symbols */
-    for (seg = 0; seg < NSEG; ++seg)
-    {
-#ifdef DATASEGS
-       if (segsz[seg] != 0)
-           /* only count data of nonzero length */
-#else
-       if (segsz[seg] != 0 && seg < 4)
-#endif
-           edataoffset = segbase[seg] + segsz[seg];
-       segboundary[5] = hexdigit[seg];         /* to __segX?H */
-       segboundary[6] = 'D';
-       setsym(segboundary, (tempoffset = segbase[seg]) + segsz[seg]);
-                                               /* __segXDH */
-       segboundary[7] = 'L';
-       setsym(segboundary, tempoffset);        /* __segXDL */
-       segboundary[6] = 'C';
-       setsym(segboundary, tempoffset = combase[seg]);
-                                               /* __segXCL */
-       segboundary[7] = 'H';
-       setsym(segboundary, tempoffset + comsz[seg]);
-                                               /* __segXCH */
-#ifndef DATASEGS
-        if( seg > 3 )
-       {
-          segboundary[6] = 'S';
-          segboundary[7] = 'O';
-          setsym(segboundary, (bin_off_t)(segadj[seg]-segadj[0])/0x10);
-          /* __segXSO */
-        }
-#endif
-    }
-    setsym("__etext", etextoffset);
-    setsym("__edata", edataoffset);
-#ifdef DATASEGS
-    setsym("__end", endoffset = combase[NSEG - 1] + comsz[NSEG - 1]);
-#else
-    setsym("__end", endoffset = combase[3] + comsz[3]);
-#endif
-    setsym("__segoff", (bin_off_t)(segadj[1]-segadj[0])/0x10);
-    if( !bits32 )
-    {
-        if( etextoffset > 65536L )
-            fatalerror("text segment too large for 16bit");
-        if( endoffset > 65536L )
-            fatalerror("data segment too large for 16bit");
-    }
-
-    openout(outfilename);
-#ifdef REL_OUTPUT
-    if (reloc_output)
-       seektrel(FILEHEADERLENGTH
-                + (unsigned long) (etextpadoff - btextoffset)
-                + (unsigned long) (edataoffset - bdataoffset));
-#endif
-#ifdef EDOS
-    writeheader(commandname);
-#else
-    writeheader();
-#endif
-    for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-       if (modptr->loadflag)
-       {
-           linkmod(modptr);
-           padmod(modptr);
-       }
-
-    /* dump symbol table */
-#ifdef MINIX
-    if (!stripflag)
-    {
-#ifdef BSD_A_OUT
-       unsigned stringoff;
-#endif
-
-       seekout(FILEHEADERLENGTH
-               + (unsigned long) (etextpadoff - btextoffset)
-               + (unsigned long) (edataoffset - bdataoffset)
-#ifdef REL_OUTPUT
-               + ((unsigned long) ndreloc + ntreloc) * RELOC_INFO_SIZE
-#endif
-               );
-       extsym.n_was_numaux = extsym.n_was_type = 0;
-#ifdef BSD_A_OUT
-       stringoff = 4;
-#endif
-       for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-           if (modptr->loadflag)
-           {
-               register struct symstruct **symparray;
-               register struct symstruct *symptr;
-
-               for (symparray = modptr->symparray;
-                    (symptr = *symparray) != NUL_PTR; ++symparray)
-                   if (symptr->modptr == modptr)
-                   {
-#ifdef BSD_A_OUT
-                       offtocn((char *) &extsym.n_was_strx,
-                               (bin_off_t) stringoff, 4);
-#else
-#if ELF_SYMS
-                       if( symptr->name[0] == '_' && symptr->name[1] )
-                          strncpy((char *) extsym.n_was_name, symptr->name+1,
-                                  sizeof extsym.n_was_name);
-                       else
-                       {
-                          memcpy((char *) extsym.n_was_name, "__", 2);
-                          strncpy((char *) extsym.n_was_name+2, symptr->name,
-                                  sizeof(extsym.n_was_name)-2);
-                       }
-#else
-                       strncpy((char *) extsym.n_was_name, symptr->name,
-                               sizeof extsym.n_was_name);
-#endif
-#endif
-                       u4cn((char *) &extsym.n_value, (u4_t) symptr->value,
-                            sizeof extsym.n_value);
-                       if ((flags = symptr->flags) & A_MASK)
-                           extsym.n_was_sclass = N_ABS;
-                       else if (flags & (E_MASK | I_MASK))
-                           extsym.n_was_sclass = C_EXT;
-                       else
-                           extsym.n_was_sclass = C_STAT;
-                       if (!(flags & I_MASK) || (
-#ifdef REL_OUTPUT
-                            !reloc_output &&
-#endif
-                            (flags & C_MASK)))
-                           switch (flags & (A_MASK | SEGM_MASK))
-                           {
-#ifdef DATASEGS
-                           case 0:
-#else
-                           default:
-#endif
-                               extsym.n_was_sclass |= N_TEXT;
-                           case A_MASK:
-                               break;
-#ifdef DATASEGS
-                           default:
-#else
-                           case 1: case 2: case 3:
-                           case A_MASK|1: case A_MASK|2: case A_MASK|3:
-#endif
-                               if (flags & (C_MASK | SA_MASK))
-                                   extsym.n_was_sclass |= N_BSS;
-                               else
-                                   extsym.n_was_sclass |= N_DATA;
-                               break;
-                           }
-                       writeout((char *) &extsym, sizeof extsym);
-                       ++nsym;
-#ifdef BSD_A_OUT
-#if ELF_SYMS
-                       stringoff += strlen(symptr->name);
-                       if( symptr->name[0] != '_' || symptr->name[1] == '\0' )
-                          stringoff += 3;
-#else
-                       stringoff += strlen(symptr->name) + 1;
-#endif
-#endif
-                   }
-           }
-#ifdef BSD_A_OUT
-       offtocn((char *) &extsym.n_was_strx, (bin_off_t) stringoff, 4);
-       writeout((char *) &extsym.n_was_strx, 4);
-       for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-           if (modptr->loadflag)
-           {
-               register struct symstruct **symparray;
-               register struct symstruct *symptr;
-
-               for (symparray = modptr->symparray;
-                    (symptr = *symparray) != NUL_PTR; ++symparray)
-                   if (symptr->modptr == modptr)
-#if ELF_SYMS
-                    {
-                      if( symptr->name[0] == '_' && symptr->name[1] )
-                         writeout(symptr->name + 1, strlen(symptr->name));
-                      else
-                      {
-                         writeout("__", 2);
-                         writeout(symptr->name, strlen(symptr->name) + 1);
-                      }
-                   }
-#else
-                       writeout(symptr->name, strlen(symptr->name) + 1);
-#endif
-           }
-#endif
-       seekout((unsigned long) offsetof(struct exec, a_syms));
-       u4cn(buf4, (u4_t) nsym * sizeof extsym,
-            memsizeof(struct exec, a_syms));
-       writeout(buf4, memsizeof(struct exec, a_syms));
-#ifdef REL_OUTPUT
-       if( FILEHEADERLENGTH >= offsetof(struct exec, a_trsize)+8)
-       {
-               seekout((unsigned long) offsetof(struct exec, a_trsize));
-               u4cn(buf4, (u4_t) ntreloc * RELOC_INFO_SIZE,
-               memsizeof(struct exec, a_trsize));
-               writeout(buf4, memsizeof(struct exec, a_trsize));
-               seekout((unsigned long) offsetof(struct exec, a_drsize));
-               u4cn(buf4, (u4_t) ndreloc * RELOC_INFO_SIZE,
-               memsizeof(struct exec, a_drsize));
-               writeout(buf4, memsizeof(struct exec, a_drsize));
-       }
-#endif
-    }
-#endif /* MINIX */
-    closeout();
-#ifdef REL_OUTPUT
-    if (!reloc_output)
-#endif
-       executable();
-}
-
-#ifdef EDOS
-
-static unsigned binheaderlength(char *commandname)
-{
-    unsigned count;
-    char *name;
-    struct entrylist *elptr;
-    struct symstruct *startptr;
-
-    count = 2 + 2 + 1;         /* len len nul */
-    startptr = findsym("start");
-    for (elptr = entryfirst; elptr != NUL_PTR; elptr = elptr->elnext)
-    {
-       name = idconvert(elptr, commandname);
-       count += strlen(name) + 1 + 2 + 1;      /* nul off flg */
-       ourfree(name);
-       if (startptr != NUL_PTR)
-           count += 6;         /* LBSR $xxxx and LBRA $xxxx */
-    }
-    return count;
-}
-
-/* convert name of symbol (entry) list element to a Basic identifier */
-/* new name is built in storage obtained from stralloc() */
-/* the special name  _main  is converted to the command name first */
-/* copy upper case and numerals, convert lower case to upper, ignore rest */
-
-static char *idconvert(struct entrylist *elptr, char *commandname)
-{
-    char *name;
-    char *newname;
-
-    if (strcmp(name = elptr->elsymptr->name, "_main") == 0)
-       name = commandname;
-    newname = stralloc(name);
-    {
-       register char *t;
-       register char *s;
-
-       t = newname;
-       s = name;
-       do
-       {
-           if (*s >= '0' && *s <= '9' || *s >= 'A' && *s <= 'Z')
-               *t++ = *s;
-           if (*s >= 'a' && *s <= 'z')
-               *t++ = *s + ('A' - 'a');
-       }
-       while (*s++);
-       *t = 0;
-    }
-    if (*newname < 'A')                /* numeral or null */
-       fatalerror("bad entry name");
-    return newname;
-}
-
-#endif /* EDOS */
-
-static void linkmod(struct modstruct *modptr)
-{
-    char buf[ABS_TEXT_MAX];
-    int command;
-    unsigned char modify;
-    bin_off_t offset;
-    int symbolnum;
-    struct symstruct **symparray;
-    struct symstruct *symptr;
-
-    setseg(0);
-    relocsize = 2;
-    symparray = modptr->symparray;
-    openin(modptr->filename);  /* does nothing if already open */
-    seekin(modptr->textoffset);
-    while (TRUE)
-    {
-       if ((command = readchar()) < 0)
-           prematureeof();
-       modify = command & MODIFY_MASK;
-       switch (command & CM_MASK)
-       {
-       case CM_SPECIAL:
-           switch (modify)
-           {
-           case CM_EOT:
-               segpos[curseg] = spos;
-               return;
-           case CM_BYTE_SIZE:
-               relocsize = 1;
-               break;
-           case CM_WORD_SIZE:
-               relocsize = 2;
-               break;
-           case CM_LONG_SIZE:
-#ifdef LONG_OFFSETS
-               relocsize = 4;
-               break;
-#else
-               fatalerror("relocation by long offsets not implemented");
-#endif
-           case CM_1_SKIP:
-               skip(1);
-               break;
-           case CM_2_SKIP:
-               skip(2);
-               break;
-           case CM_4_SKIP:
-               skip(4);
-               break;
-           default:
-               if ((modify -= CM_0_SEG) >= NSEG)
-                   inputerror("bad data in");
-               setseg(modify);
-               break;
-           }
-           break;
-       case CM_ABSOLUTE:
-           if (modify == 0)
-               modify = ABS_TEXT_MAX;
-           readin(buf, (unsigned) modify);
-           writeout(buf, (unsigned) modify);
-           spos += (int) modify;
-           break;
-       case CM_OFFSET_RELOC:
-           offset = readsize(relocsize);
-           if (modify & R_MASK)
-           {
-#ifndef DATASEGS
-                int m = (modify & SEGM_MASK);
-               if( curseg != m && m != SEGM_MASK )
-                  interseg(modptr->filename, modptr->archentry, (char*)0);
-#endif
-               offset -= (spos + relocsize);
-            }
-           offtocn(buf, segbase[modify & SEGM_MASK] + offset, relocsize);
-           writeout(buf, relocsize);
-#ifdef REL_OUTPUT
-           if (reloc_output)
-           {
-               u4_t bitfield;
-
-               if (curseg == 0)
-               {
-                   ++ntreloc;
-                   offtocn(buf, spos, 4);
-                   writetrel(buf, 4);
-               }
-               else
-               {
-                   ++ndreloc;
-                   offtocn(buf, spos - segbase[1], 4);
-                   writedrel(buf, 4);
-               }
-               if ((modify & SEGM_MASK) == 0)
-                   bitfield = N_TEXT;
-               else
-                   bitfield = N_DATA;
-               if (modify & R_MASK)
-                   bitfield |= 1L << 24;
-               if (relocsize == 2)
-                   bitfield |= 1L << 25;
-               else if (relocsize == 4)
-                   bitfield |= 1L << 26;
-               u4cn(buf, bitfield, 4);
-               if (curseg == 0)
-                   writetrel(buf, 4);
-               else
-                   writedrel(buf, 4);
-           }
-#endif /* REL_OUTPUT */
-           spos += relocsize;
-           break;
-       case CM_SYMBOL_RELOC:
-           symptr = symparray[symbolnum = readconvsize((unsigned)
-                                           (modify & S_MASK ? 2 : 1))];
-           offset = readconvsize((unsigned) modify & OF_MASK);
-           if (modify & R_MASK)
-           {
-#ifndef DATASEGS
-                int m = (symptr->flags & SEGM_MASK);
-               if( curseg != m && m != SEGM_MASK )
-                  interseg(modptr->filename, modptr->archentry, symptr->name);
-#endif
-               offset -= (spos + relocsize);
-           }
-#ifdef REL_OUTPUT
-           if (!reloc_output || !(symptr->flags & I_MASK))
-#endif
-               offset += symptr->value;            
-           offtocn(buf, offset, relocsize);
-           writeout(buf, relocsize);
-#ifdef REL_OUTPUT
-           if (reloc_output)
-           {
-               u4_t bitfield;
-
-               if (curseg == 0)
-               {
-                   ++ntreloc;
-                   offtocn(buf, spos, 4);
-                   writetrel(buf, 4);
-               }
-               else
-               {
-                   ++ndreloc;
-                   offtocn(buf, spos - segbase[1], 4);
-                   writedrel(buf, 4);
-               }
-               if (symptr->flags & I_MASK)
-                   bitfield = (1L << 27) | symbolnum;
-               else if ((symptr->flags & SEGM_MASK) == 0)
-                   bitfield = N_TEXT;
-               else if (symptr->flags & (C_MASK | SA_MASK))
-                   bitfield = N_BSS;
-               else
-                   bitfield = N_DATA;
-               if (modify & R_MASK)
-                   bitfield |= 1L << 24;
-               if (relocsize == 2)
-                   bitfield |= 1L << 25;
-               else if (relocsize == 4)
-                   bitfield |= 1L << 26;
-               u4cn(buf, bitfield, 4);
-               if (curseg == 0)
-                   writetrel(buf, 4);
-               else
-                   writedrel(buf, 4);
-           }
-#endif /* REL_OUTPUT */
-           spos += relocsize;
-       }
-    }
-}
-
-static void padmod(struct modstruct *modptr)
-{
-    bin_off_t count;
-    fastin_t seg;
-    bin_off_t size;
-    unsigned sizecount;
-    char *sizeptr;
-
-    for (seg = 0, sizeptr = modptr->segsize; seg < NSEG; ++seg)
-    {
-       size = cntooffset(sizeptr,
-                         sizecount = segsizecount((unsigned) seg, modptr));
-       sizeptr += sizecount;
-       if ((count = segpos[seg] - segbase[seg]) != size)
-           size_error(seg, count, size);
-
-       /* pad to quad boundary */
-       /* not padding in-between common areas which sometimes get into file */
-       if ((size = ld_roundup(segpos[seg], 4, bin_off_t) - segpos[seg]) != 0)
-       {
-           setseg(seg);
-           writenulls(size);
-           segpos[seg] = spos;
-       }
-       segbase[seg] = segpos[seg];
-    }
-}
-
-static void setsym(char *name, bin_off_t value)
-{
-    struct symstruct *symptr;
-
-#ifdef REL_OUTPUT
-    if (!reloc_output)
-#endif
-       if ((symptr = findsym(name)) != NUL_PTR)
-           symptr->value = value;
-}
-
-static void symres(char *name)
-{
-    register struct symstruct *symptr;
-
-    if ((symptr = findsym(name)) != NUL_PTR)
-    {
-       if ((symptr->flags & SEGM_MASK) == SEGM_MASK)
-           symptr->flags &= ~SEGM_MASK | curseg;
-       if (symptr->flags != (I_MASK | curseg) || symptr->value != 0)
-           reserved(name);
-#ifdef REL_OUTPUT
-       if (!reloc_output)
-#endif
-           symptr->flags = E_MASK | curseg;    /* show defined, not common */
-    }
-}
-
-/* set new segment */
-
-static void setseg(fastin_pt newseg)
-{
-    if (newseg != curseg)
-    {
-       segpos[curseg] = spos;
-       spos = segpos[curseg = newseg];
-       seekout(FILEHEADERLENGTH + (unsigned long) spos
-               + (unsigned long) segadj[curseg]);
-    }
-}
-
-static void skip(unsigned countsize)
-{
-    writenulls((bin_off_t) readsize(countsize));
-}
-
-#ifdef EDOS
-
-static void writeheader(char *commandname)
-{
-    char buf[MAX_OFFSET_SIZE];
-    bin_off_t offset;
-    unsigned headlength;
-    char *name;
-    struct entrylist *elptr;
-    struct symstruct *startptr;
-
-    headlength = binheaderlength(commandname);
-    for (elptr = entryfirst; elptr != NUL_PTR; elptr = elptr->elnext)
-       headlength -= 6;
-    offset = headlength;
-    startptr = findsym("start");
-    offtocn(buf, edataoffset, 2);
-    writeout(buf, 2);
-    writechar(0xFF);           /* dummy data length 0xFFFF takes everything */
-    writechar(0xFF);
-    for (elptr = entryfirst; elptr != NUL_PTR; elptr = elptr->elnext)
-    {
-       name = idconvert(elptr, commandname);
-       writeout(name, (unsigned) strlen(name) + 1);
-       ourfree(name);
-       offtocn(buf, startptr == NUL_PTR ? elptr->elsymptr->value : offset, 2);
-       writeout(buf, 2);
-       writechar(0x82);        /* 8 = set flags from here, 2 = cmd line */
-       offset += 6;            /* LBSR $xxxx and LBRA $xxxx */
-    }
-    writechar(0);
-    if (startptr != NUL_PTR)
-    {
-       offset = headlength + 3;        /* over 1st LBSR */
-       for (elptr = entryfirst; elptr != NUL_PTR; elptr = elptr->elnext)
-       {
-           writechar(0x17);    /* LBSR */
-           offtocn(buf, startptr->value - offset, 2);
-           writeout(buf, 2);
-           writechar(0x16);    /* LBRA */
-           offtocn(buf, elptr->elsymptr->value - offset - 3, 2);
-           writeout(buf, 2);
-           offset += 6;
-       }
-    }
-}
-
-#endif /* EDOS */
-
-#ifdef MINIX
-
-static void writeheader(void)
-{
-    struct exec header;
-
-    memset(&header, 0, sizeof header);
-#ifdef STANDARD_GNU_A_OUT
-#ifdef N_SET_MAGIC
-#ifdef QMAGIC
-    if(uzp)
-       N_SET_MAGIC(header, QMAGIC);
-    else
-#endif
-    N_SET_MAGIC(header, OMAGIC);
-#else
-    *(unsigned short *) &header.a_magic = OMAGIC;  /* XXX - works for 386BSD */
-#endif
-#else
-    header.a_magic[0] = A_MAGIC0;
-    header.a_magic[1] = A_MAGIC1;
-#endif
-#ifdef REL_OUTPUT
-    if (!reloc_output)
-#endif
-    {
-#ifdef STANDARD_GNU_A_OUT
-#ifdef N_SET_FLAGS
-       N_SET_FLAGS(header, 0);
-#else
-       /* XXX - works for 386BSD */
-#endif
-#else
-       header.a_flags = sepid ? A_SEP : A_EXEC;
-       if (uzp)
-           header.a_flags |= A_UZP;
-#endif
-    }
-#ifdef BSD_A_OUT
-#ifdef STANDARD_GNU_A_OUT
-#ifdef N_SET_FLAGS
-    N_SET_MACHTYPE(header, M_386);
-#else
-       /* XXX - works for 386BSD which doesn't define its own machtype :-( */
-#endif
-#else
-    header.a_cpu = (bits32 || reloc_output) ? A_I80386 : A_I8086;
-#endif
-#else
-    header.a_cpu = bits32 ? A_I80386 : A_I8086;
-#endif
-#ifndef STANDARD_GNU_A_OUT
-    header.a_hdrlen = FILEHEADERLENGTH;
-#endif
-#ifdef QMAGIC
-    if (uzp)
-       offtocn((char *) &header.a_text, etextpadoff - btextoffset+HEADERLEN,
-              sizeof header.a_text);
-    else
-#endif
-    offtocn((char *) &header.a_text, etextpadoff - btextoffset,
-           sizeof header.a_text);
-    offtocn((char *) &header.a_data, edataoffset - bdataoffset,
-           sizeof header.a_data);
-    offtocn((char *) &header.a_bss, endoffset - edataoffset,
-           sizeof header.a_bss);
-
-#ifdef REL_OUTPUT
-    if (!reloc_output)
-#endif
-    {
-       offtocn((char *) &header.a_entry, btextoffset,
-                   sizeof header.a_entry);
-#ifndef STANDARD_GNU_A_OUT
-       offtocn((char *) &header.a_total, (bin_off_t)
-           (endoffset < 0x00010000L ? 0x00010000L : endoffset + 0x0008000L),
-               sizeof header.a_total);
-#endif
-    }
-    if( FILEHEADERLENGTH )
-       writeout((char *) &header, FILEHEADERLENGTH);
-}
-
-#endif /* MINIX */
-
-static void writenulls(bin_off_t count)
-{
-    long lcount = count;
-    if( lcount < 0 )
-       fatalerror("org command requires reverse seek");
-    spos += count;
-    while (count-- > 0)
-       writechar(0);
-}
-#else
-
-#ifndef FUNCNAME
-#define FUNCNAME writebin
-#endif
-
-void FUNCNAME(char *outfilename, bool_pt argsepid, bool_pt argbits32,
-                     bool_pt argstripflag, bool_pt arguzp)
-{
-    char * s  = "WARNING: Native a.out generation not included, sorry\n";
-    write(2, s, strlen(s));
-/*    write_elks(outfilename, argsepid, argbits32, argstripflag, arguzp, 0); */
-}
-#endif
diff --git a/Applications/ld09/writeemu.c b/Applications/ld09/writeemu.c
deleted file mode 100644 (file)
index b0438fc..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * This uses a special version of writebin for bug compatibility with
- * the old bin86 package.
- *
- * This _should_ be replaced by a function that writes out a as86 object
- * but then it would completely **** up dosemu compiles.
- *
- * NOTE: A some time I intend to replace this with a routine that generates
- *       an as86 object file.
- */
-
-#undef  A_OUT_INCL
-#define A_OUT_INCL             "rel_aout.h"
-#define BSD_A_OUT              1
-#define FILEHEADERLENGTH       32
-#define ELF_SYMS               0
-
-#define FUNCNAME               write_dosemu
-
-#include "writebin.c"
diff --git a/Applications/ld09/writex86.c b/Applications/ld09/writex86.c
deleted file mode 100644 (file)
index 5ddb873..0000000
+++ /dev/null
@@ -1,738 +0,0 @@
-/* writex86.c - write binary file for linker */
-
-/* Copyright (C) 1994 Bruce Evans */
-
-#include "syshead.h"
-#include "x86_aout.h"
-#ifndef VERY_SMALL_MEMORY
-#include "v7_aout.h"
-#endif
-#ifndef MSDOS
-#include "x86_cpm86.h"
-#endif
-#include "const.h"
-#include "obj.h"
-#include "type.h"
-#include "globvar.h"
-
-#define btextoffset (text_base_value)
-#define bdataoffset (data_base_value)
-#define page_size() ((bin_off_t)4096)
-
-#ifndef ELF_SYMS
-#define ELF_SYMS 0
-#endif
-
-#ifdef MSDOS
-#  define FILEHEADERLENGTH (headerless?0:A_MINHDR)
-#else
-# ifdef VERY_SMALL_MEMORY
-#  define FILEHEADERLENGTH (headerless?0:(cpm86?CPM86_HEADERLEN:A_MINHDR))
-# else
-#  define FILEHEADERLENGTH (headerless?0:(cpm86?CPM86_HEADERLEN:(v7?V7_HEADERLEN:A_MINHDR)))
-# endif
-#endif
-                               /* part of header not counted in offsets */
-#define DPSEG 2
-
-#define CM_MASK 0xC0
-#define MODIFY_MASK 0x3F
-#define S_MASK 0x04
-#define OF_MASK 0x03
-
-#define CM_SPECIAL 0
-#define CM_ABSOLUTE 0x40
-#define CM_OFFSET_RELOC 0x80
-#define CM_SYMBOL_RELOC 0xC0
-
-#define CM_EOT 0
-#define CM_BYTE_SIZE 1
-#define CM_WORD_SIZE 2
-#define CM_LONG_SIZE 3
-#define CM_1_SKIP 17
-#define CM_2_SKIP 18
-#define CM_4_SKIP 19
-#define CM_0_SEG 32
-
-#define ABS_TEXT_MAX 64
-
-#define offsetof(struc, mem) ((int) &((struc *) 0)->mem)
-#define memsizeof(struc, mem) sizeof(((struc *) 0)->mem)
-
-static bool_t bits32;          /* nonzero for 32-bit executable */
-static bin_off_t combase[NSEG];/* bases of common parts of segments */
-static bin_off_t comsz[NSEG];  /* sizes of common parts of segments */
-static fastin_t curseg;        /* current segment, 0 to $F */
-static bin_off_t edataoffset;  /* end of data */
-static bin_off_t endoffset;    /* end of bss */
-static bin_off_t etextoffset;  /* end of text */
-static bin_off_t etextpadoff;  /* end of padded text */
-static unsigned nsym;          /* number of symbols written */
-static unsigned relocsize;     /* current relocation size 1, 2 or 4 */
-static bin_off_t segadj[NSEG]; /* adjusts (file offset - seg offset) */
-                               /* depends on zero init */
-static bin_off_t segbase[NSEG];/* bases of data parts of segments */
-static char segboundary[9] = "__seg0DH";
-                               /* name of seg boundary __seg0DL to __segfCH */
-static bin_off_t segpos[NSEG]; /* segment positions for current module */
-static bin_off_t segsz[NSEG];  /* sizes of data parts of segments */
-                               /* depends on zero init */
-static bool_t sepid;           /* nonzero for separate I & D */
-static bool_t stripflag;       /* nonzero to strip symbols */
-static bin_off_t spos;         /* position in current seg */
-static bool_t uzp;             /* nonzero for unmapped zero page */
-static bool_t xsym;            /* extended symbol table */
-
-static void linkmod(struct modstruct *modptr);
-static void padmod(struct modstruct *modptr);
-static void setsym(char *name, bin_off_t value);
-static void symres(char *name);
-static void setseg(fastin_pt newseg);
-static void skip(unsigned countsize);
-static void writeheader(void);
-#ifndef VERY_SMALL_MEMORY
-static void v7header(void);
-#endif
-#ifndef MSDOS
-static void cpm86header(void);
-#endif
-static void writenulls(bin_off_t count);
-
-EXTERN bool_t reloc_output;
-
-/* write binary file */
-
-void write_elks(char *outfilename, bool_pt argsepid, bool_pt argbits32,
-                bool_pt argstripflag, bool_pt arguzp, bool_pt argxsym)
-{
-    char buf4[4];
-    char *cptr;
-    struct nlist extsym;
-    flags_t flags;
-    struct modstruct *modptr;
-    fastin_t seg;
-    unsigned sizecount;
-    bin_off_t tempoffset;
-
-    if( reloc_output )
-#ifndef MSDOS
-       fatalerror("Output binformat not configured relocatable, use -N");
-#else
-       fatalerror("Cannot use -r under MSDOS, sorry");
-#endif
-
-    sepid = argsepid;
-    bits32 = argbits32;
-    stripflag = argstripflag;
-    uzp = arguzp;
-    xsym = argxsym;
-    if (uzp)
-    {
-       if (btextoffset == 0)
-           btextoffset = page_size();
-       if (bdataoffset == 0 && sepid)
-           bdataoffset = page_size();
-    }
-
-    /* reserve special symbols use curseg to pass parameter to symres() */
-    for (curseg = 0; curseg < NSEG; ++curseg)
-    {
-       segboundary[5] = hexdigit[curseg];      /* to __segX?H */
-       segboundary[6] = 'D';
-       symres(segboundary);    /* __segXDH */
-       segboundary[7] = 'L';
-       symres(segboundary);    /* __segXDL */
-       segboundary[6] = 'C';
-       symres(segboundary);    /* __segXCL */
-       segboundary[7] = 'H';
-       symres(segboundary);    /* __segXCH */
-#ifndef DATASEGS
-        if( curseg > 3 )
-       {
-          segboundary[6] = 'S';
-          segboundary[7] = 'O';
-          symres(segboundary); /* __segXSO */
-        }
-#endif
-    }
-    curseg = 3;
-    symres("__edata");
-    symres("__end");
-    symres("__heap_top");
-    curseg = 0;                        /* text seg, s.b. variable */
-    symres("__etext");
-    symres("__segoff");
-
-    /* calculate segment and common sizes (sum over loaded modules) */
-    /* use zero init of segsz[] */
-    /* also relocate symbols relative to starts of their segments */
-    for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-       if (modptr->loadflag)
-       {
-           register struct symstruct **symparray;
-           register struct symstruct *symptr;
-
-           for (symparray = modptr->symparray;
-                (symptr = *symparray) != NUL_PTR; ++symparray)
-               if (symptr->modptr == modptr && !(symptr->flags & A_MASK))
-               {
-                   if (!(symptr->flags & (I_MASK | SA_MASK)))
-                   {
-                       /* relocate by offset of module in segment later */
-                       /* relocate by offset of segment in memory special */
-                       /* symbols get relocated improperly */
-                       symptr->value += segsz[symptr->flags & SEGM_MASK];
-                   }
-                   else if (symptr->value == 0)
-                   {
-                           undefined(symptr->name);
-                   }
-                   else
-                   {
-                       tempoffset = ld_roundup(symptr->value, 4, bin_off_t);
-                       /* temp kludge quad alignment for 386 */
-                       symptr->value = comsz[seg = symptr->flags & SEGM_MASK];
-                       comsz[seg] += tempoffset;
-                       if (!(symptr->flags & SA_MASK))
-                           symptr->flags |= C_MASK;
-                   }
-               }
-           for (seg = 0, cptr = modptr->segsize; seg < NSEG; ++seg)
-           {
-               segsz[seg] += cntooffset(cptr,
-                         sizecount = segsizecount((unsigned) seg, modptr));
-
-               /* adjust sizes to even to get quad boundaries */
-               /* this should be specifiable dynamically */
-               segsz[seg] = ld_roundup(segsz[seg], 4, bin_off_t);
-               comsz[seg] = ld_roundup(comsz[seg], 4, bin_off_t);
-               cptr += sizecount;
-           }
-       }
-
-    /* calculate seg positions now their sizes are known */
-    /*
-#ifdef DATASEGS
-     * Assume seg 0 is text and rest are data
-#else
-     * Assume seg 1..3 are data, Seg 0 is real text, seg 4+ are far text
-#endif
-     */
-    segpos[0] = segbase[0] = spos = btextoffset;
-    combase[0] = segbase[0] + segsz[0];
-    segadj[1] = segadj[0] = -btextoffset;
-    etextpadoff = etextoffset = combase[0] + comsz[0];
-    if (sepid)
-    {
-       etextpadoff = ld_roundup(etextoffset, 0x10, bin_off_t);
-       segadj[1] += etextpadoff - bdataoffset;
-    }
-    else if (bdataoffset == 0)
-       bdataoffset = etextpadoff;
-    segpos[1] = segbase[1] = edataoffset = bdataoffset;
-    combase[1] = segbase[1] + segsz[1];
-#ifndef DATASEGS
-    for (seg = 4; seg < NSEG; ++seg)
-    {
-       segpos[seg] = segbase[seg] = 0;
-       combase[seg] = segbase[seg] + segsz[seg];
-       segadj[seg] = etextpadoff;
-
-       etextpadoff += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t);
-       segadj[1]   += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t);
-    }
-    for (seg = 2; seg < 4; ++seg)
-#else
-    for (seg = 2; seg < NSEG; ++seg)
-#endif
-    {
-       segpos[seg] = segbase[seg] = combase[seg - 1] + comsz[seg - 1];
-#ifdef MC6809
-       if (seg == DPSEG)
-       {
-           /* temporarily have fixed DP seg */
-           /* adjust if nec so it only spans 1 page */
-           tempoffset = segsz[seg] + comsz[seg];
-           if (tempoffset > 0x100)
-               fatalerror("direct page segment too large");
-           if ((((segbase[seg] + tempoffset) ^ segbase[seg])
-                & ~(bin_off_t) 0xFF) != 0)
-               segpos[seg] = segbase[seg] = (segbase[seg] + 0xFF)
-                                            & ~(bin_off_t) 0xFF;
-       }
-#endif
-       combase[seg] = segbase[seg] + segsz[seg];
-       segadj[seg] = segadj[seg - 1];
-    }
-
-    /* relocate symbols by offsets of segments in memory */
-    for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-       if (modptr->loadflag)
-       {
-           register struct symstruct **symparray;
-           register struct symstruct *symptr;
-
-           for (symparray = modptr->symparray;
-                (symptr = *symparray) != NUL_PTR; ++symparray)
-               if (symptr->modptr == modptr && !(symptr->flags & A_MASK))
-               {
-                   if (symptr->flags & (C_MASK | SA_MASK))
-                       symptr->value += combase[symptr->flags & SEGM_MASK];
-                   else
-                       symptr->value += segbase[symptr->flags & SEGM_MASK];
-               }
-       }
-
-    /* adjust special symbols */
-    for (seg = 0; seg < NSEG; ++seg)
-    {
-#ifdef DATASEGS
-       if (segsz[seg] != 0)
-           /* only count data of nonzero length */
-#else
-       if (segsz[seg] != 0 && seg < 4)
-#endif
-           edataoffset = segbase[seg] + segsz[seg];
-       segboundary[5] = hexdigit[seg];         /* to __segX?H */
-       segboundary[6] = 'D';
-       setsym(segboundary, (tempoffset = segbase[seg]) + segsz[seg]);
-                                               /* __segXDH */
-       segboundary[7] = 'L';
-       setsym(segboundary, tempoffset);        /* __segXDL */
-       segboundary[6] = 'C';
-       setsym(segboundary, tempoffset = combase[seg]);
-                                               /* __segXCL */
-       segboundary[7] = 'H';
-       setsym(segboundary, tempoffset + comsz[seg]);
-                                               /* __segXCH */
-#ifndef DATASEGS
-        if( seg > 3 )
-       {
-          segboundary[6] = 'S';
-          segboundary[7] = 'O';
-          setsym(segboundary, (bin_off_t)(segadj[seg]-segadj[0])/0x10);
-          /* __segXSO */
-        }
-#endif
-    }
-    setsym("__etext", etextoffset);
-    setsym("__edata", edataoffset);
-#ifdef DATASEGS
-    setsym("__end", endoffset = combase[NSEG - 1] + comsz[NSEG - 1]);
-#else
-    setsym("__end", endoffset = combase[3] + comsz[3]);
-#endif
-    setsym("__segoff", (bin_off_t)(segadj[1]-segadj[0])/0x10);
-    if( !bits32 )
-    {
-        if( etextoffset > 65536L )
-            fatalerror("text segment too large for 16bit");
-        if( endoffset > 65536L )
-            fatalerror("data segment too large for 16bit");
-    }
-
-    if( heap_top_value < 0x100 || endoffset > heap_top_value-0x100)
-       heap_top_value = endoffset + 0x8000;
-    if( heap_top_value > 0x10000 && !bits32 ) heap_top_value = 0x10000;
-    setsym("__heap_top", (bin_off_t)heap_top_value);
-
-    openout(outfilename);
-#ifndef MSDOS
-    if (cpm86) cpm86header();
-    else
-#endif
-#ifndef VERY_SMALL_MEMORY
-    if (v7)
-       v7header();
-    else
-#endif
-       writeheader();
-    for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-       if (modptr->loadflag)
-       {
-           linkmod(modptr);
-           padmod(modptr);
-       }
-
-    /* dump symbol table */
-    if (!stripflag)
-    {
-       seekout(FILEHEADERLENGTH
-               + (unsigned long) (etextpadoff - btextoffset)
-               + (unsigned long) (edataoffset - bdataoffset)
-               );
-       extsym.n_numaux = extsym.n_type = 0;
-       for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext)
-           if (modptr->loadflag)
-           {
-               register struct symstruct **symparray;
-               register struct symstruct *symptr;
-
-               for (symparray = modptr->symparray;
-                    (symptr = *symparray) != NUL_PTR; ++symparray)
-                   if (symptr->modptr == modptr)
-                   {
-#if ELF_SYMS
-                       if (symptr->name[0] == '_' && symptr->name[1] )
-                         strncpy((char *) extsym.n_name, symptr->name+1,
-                               sizeof extsym.n_name);
-                       else
-                       {
-                         memcpy((char *) extsym.n_name, "$", 1);
-                         strncpy((char *) extsym.n_name+1, symptr->name,
-                               sizeof(extsym.n_name)-1);
-                       }
-#else
-                       strncpy((char *) extsym.n_name, symptr->name,
-                               sizeof extsym.n_name);
-#endif
-                       u4cn((char *) &extsym.n_value, (u4_t) symptr->value,
-                            sizeof extsym.n_value);
-                       if ((flags = symptr->flags) & A_MASK)
-                           extsym.n_sclass = N_ABS;
-                       else if (flags & (E_MASK | I_MASK))
-                           extsym.n_sclass = C_EXT;
-                       else
-                           extsym.n_sclass = C_STAT;
-                       if (!(flags & I_MASK) ||
-                            flags & C_MASK)
-                           switch (flags & (A_MASK | SEGM_MASK))
-                           {
-#ifdef DATASEGS
-                           case 0:
-#else
-                           default:
-#endif
-                               extsym.n_sclass |= N_TEXT;
-                           case A_MASK:
-                               break;
-#ifdef DATASEGS
-                           default:
-#else
-                           case 1: case 2: case 3:
-                           case A_MASK|1: case A_MASK|2: case A_MASK|3:
-#endif
-                               if (flags & (C_MASK | SA_MASK))
-                                   extsym.n_sclass |= N_BSS;
-                               else
-                                   extsym.n_sclass |= N_DATA;
-                               break;
-                           }
-                       writeout((char *) &extsym, sizeof extsym);
-                       ++nsym;
-#if !ELF_SYMS
-                       if( xsym )
-                       {
-                          int i;
-                          extsym.n_sclass = 0;
-                          memset((void*)&extsym.n_value,0,
-                                  sizeof(extsym.n_value));
-
-                          for(i=sizeof extsym.n_name; i<strlen(symptr->name);
-                              i+=sizeof extsym.n_name)
-                          {
-                             strncpy((char *) extsym.n_name, symptr->name+i,
-                               sizeof extsym.n_name);
-                             writeout((char *) &extsym, sizeof extsym);
-                             ++nsym;
-                          }
-                       }
-#endif
-                   }
-           }
-       seekout((unsigned long) offsetof(struct exec, a_syms));
-       u4cn(buf4, (u4_t) nsym * sizeof extsym,
-            memsizeof(struct exec, a_syms));
-       writeout(buf4, memsizeof(struct exec, a_syms));
-    }
-    closeout();
-    executable();
-}
-
-static void linkmod(modptr)
-struct modstruct *modptr;
-{
-    char buf[ABS_TEXT_MAX];
-    int command;
-    unsigned char modify;
-    bin_off_t offset;
-    int symbolnum;
-    struct symstruct **symparray;
-    struct symstruct *symptr;
-
-    setseg(0);
-    relocsize = 2;
-    symparray = modptr->symparray;
-    openin(modptr->filename);  /* does nothing if already open */
-    seekin(modptr->textoffset);
-    while (TRUE)
-    {
-       if ((command = readchar()) < 0)
-           prematureeof();
-       modify = command & MODIFY_MASK;
-       switch (command & CM_MASK)
-       {
-       case CM_SPECIAL:
-           switch (modify)
-           {
-           case CM_EOT:
-               segpos[curseg] = spos;
-               return;
-           case CM_BYTE_SIZE:
-               relocsize = 1;
-               break;
-           case CM_WORD_SIZE:
-               relocsize = 2;
-               break;
-           case CM_LONG_SIZE:
-#ifdef LONG_OFFSETS
-               relocsize = 4;
-               break;
-#else
-               fatalerror("relocation by long offsets not implemented");
-#endif
-           case CM_1_SKIP:
-               skip(1);
-               break;
-           case CM_2_SKIP:
-               skip(2);
-               break;
-           case CM_4_SKIP:
-               skip(4);
-               break;
-           default:
-               if ((modify -= CM_0_SEG) >= NSEG)
-                   inputerror("bad data in");
-               setseg(modify);
-               break;
-           }
-           break;
-       case CM_ABSOLUTE:
-           if (modify == 0)
-               modify = ABS_TEXT_MAX;
-           readin(buf, (unsigned) modify);
-           writeout(buf, (unsigned) modify);
-           spos += (int) modify;
-           break;
-       case CM_OFFSET_RELOC:
-           offset = readsize(relocsize);
-           if (modify & R_MASK)
-           {
-#ifndef DATASEGS
-                int m = (modify & SEGM_MASK);
-               if( curseg != m && m != SEGM_MASK )
-                  interseg(modptr->filename, modptr->archentry, (char*)0);
-#endif
-               offset -= (spos + relocsize);
-            }
-           offtocn(buf, segbase[modify & SEGM_MASK] + offset, relocsize);
-           writeout(buf, relocsize);
-           spos += relocsize;
-           break;
-       case CM_SYMBOL_RELOC:
-           symptr = symparray[symbolnum = readconvsize((unsigned)
-                                           (modify & S_MASK ? 2 : 1))];
-           offset = readconvsize((unsigned) modify & OF_MASK);
-           if (modify & R_MASK)
-           {
-#ifndef DATASEGS
-                int m = (symptr->flags & SEGM_MASK);
-               if( curseg != m && m != SEGM_MASK )
-                  interseg(modptr->filename, modptr->archentry, symptr->name);
-#endif
-               offset -= (spos + relocsize);
-           }
-           offset += symptr->value;        
-           offtocn(buf, offset, relocsize);
-           writeout(buf, relocsize);
-           spos += relocsize;
-       }
-    }
-}
-
-static void padmod(modptr)
-struct modstruct *modptr;
-{
-    bin_off_t count;
-    fastin_t seg;
-    bin_off_t size;
-    unsigned sizecount;
-    char *sizeptr;
-
-    for (seg = 0, sizeptr = modptr->segsize; seg < NSEG; ++seg)
-    {
-       size = cntooffset(sizeptr,
-                         sizecount = segsizecount((unsigned) seg, modptr));
-       sizeptr += sizecount;
-       if ((count = segpos[seg] - segbase[seg]) != size)
-           size_error(seg, count, size);
-
-       /* pad to quad boundary */
-       /* not padding in-between common areas which sometimes get into file */
-       if ((size = ld_roundup(segpos[seg], 4, bin_off_t) - segpos[seg]) != 0)
-       {
-           setseg(seg);
-           writenulls(size);
-           segpos[seg] = spos;
-       }
-       segbase[seg] = segpos[seg];
-    }
-}
-
-static void setsym(name, value)
-char *name;
-bin_off_t value;
-{
-    struct symstruct *symptr;
-
-    if ((symptr = findsym(name)) != NUL_PTR)
-       symptr->value = value;
-}
-
-static void symres(name)
-register char *name;
-{
-    register struct symstruct *symptr;
-
-    if ((symptr = findsym(name)) != NUL_PTR)
-    {
-       if ((symptr->flags & SEGM_MASK) == SEGM_MASK)
-           symptr->flags &= ~SEGM_MASK | curseg;
-       if (symptr->flags != (I_MASK | curseg) || symptr->value != 0)
-           reserved(name);
-       symptr->flags = E_MASK | curseg;        /* show defined, not common */
-    }
-}
-
-/* set new segment */
-
-static void setseg(newseg)
-fastin_pt newseg;
-{
-    if (newseg != curseg)
-    {
-       segpos[curseg] = spos;
-       spos = segpos[curseg = newseg];
-       seekout(FILEHEADERLENGTH + (unsigned long) spos
-               + (unsigned long) segadj[curseg]);
-    }
-}
-
-static void skip(countsize)
-unsigned countsize;
-{
-    writenulls((bin_off_t) readsize(countsize));
-}
-
-#ifndef MSDOS
-static void cpm86header()
-{
-    struct cpm86_exec header;
-    memset(&header, 0, sizeof header);
-
-    if (sepid)
-    {
-      header.ce_group[0].cg_type = CG_CODE;
-      u2c2(header.ce_group[0].cg_len, (15 + etextpadoff) / 16);
-      u2c2(header.ce_group[0].cg_min, (15 + etextpadoff) / 16);
-      header.ce_group[1].cg_type = CG_DATA;
-      u2c2(header.ce_group[1].cg_len, (15 + edataoffset) / 16);
-      u2c2(header.ce_group[1].cg_min, (15 + endoffset  ) / 16);
-      u2c2(header.ce_group[1].cg_max, 0x1000);
-    }
-    else
-    {
-      header.ce_group[0].cg_type = CG_CODE;
-      u2c2(header.ce_group[0].cg_len, (15 + edataoffset) / 16);
-      u2c2(header.ce_group[0].cg_min, (15 + endoffset  ) / 16);
-    }
-    if( FILEHEADERLENGTH )
-       writeout((char *) &header, FILEHEADERLENGTH);
-}
-#endif
-
-static void writeheader()
-{
-    struct exec header;
-
-    memset(&header, 0, sizeof header);
-    header.a_magic[0] = A_MAGIC0;
-    header.a_magic[1] = A_MAGIC1;
-    header.a_flags = sepid ? A_SEP : A_EXEC;
-    if (uzp)
-       header.a_flags |= A_UZP;
-    header.a_cpu = bits32 ? A_I80386 : A_I8086;
-    header.a_hdrlen = FILEHEADERLENGTH;
-    offtocn((char *) &header.a_text, etextpadoff - btextoffset,
-           sizeof header.a_text);
-    offtocn((char *) &header.a_data, edataoffset - bdataoffset,
-           sizeof header.a_data);
-    offtocn((char *) &header.a_bss, endoffset - edataoffset,
-           sizeof header.a_bss);
-    if (uzp)
-       offtocn((char *) &header.a_entry, page_size(),
-               sizeof header.a_entry);
-
-    offtocn((char *) &header.a_total, (bin_off_t) heap_top_value,
-           sizeof header.a_total);
-    if( FILEHEADERLENGTH )
-       writeout((char *) &header, FILEHEADERLENGTH);
-}
-
-#ifndef VERY_SMALL_MEMORY
-static void v7header()
-{
-    struct v7_exec header;
-
-    if( sizeof header != FILEHEADERLENGTH )
-       fatalerror("Executable miscompiled, computed wrong header size");
-
-    memset(&header, 0, sizeof header);
-
-    if( bits32 )
-       fatalerror("V7 a.out format is for 16-bit only");
-
-    offtocn((char *) &header.magic, sepid ? V7_MAGIC3 : V7_OMAGIC,
-            sizeof header.magic);
-
-    offtocn((char *) &header.textsize, etextpadoff - btextoffset,
-            sizeof header.textsize);
-    offtocn((char *) &header.datasize, edataoffset - bdataoffset,
-            sizeof header.datasize);
-    offtocn((char *) &header.bsssize, endoffset - edataoffset,
-            sizeof header.bsssize);
-
-    if( !stripflag )
-       fatalerror("Symbol table not implemented for V7 yet");
-
-    if( uzp )
-       fatalerror("No QMAGIC for V7");
-
-    offtocn((char *) &header.entry, entryfirst->elsymptr->value,
-            sizeof header.entry);
-
-    if( FILEHEADERLENGTH )
-       writeout((char *) &header, FILEHEADERLENGTH);
-}
-#endif
-
-static void writenulls(count)
-bin_off_t count;
-{
-    long lcount = count;
-    spos += count;
-#if 0
-    /* This will only work if we record the highest spos found an seek there
-     * at the end of the generation
-     */
-
-    seekout(FILEHEADERLENGTH + (unsigned long) spos
-        + (unsigned long) segadj[curseg]);
-    return;
-
-#endif
-    if( lcount < 0 )
-       fatalerror("org command requires reverse seek");
-    while (count-- > 0)
-       writechar(0);
-}
diff --git a/Applications/ld09/x86_aout.h b/Applications/ld09/x86_aout.h
deleted file mode 100644 (file)
index 542a70d..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Copyright (C) 1990-1996 
- * This file is part of the ld86 command for Linux-86 
- * It is distributed under the GNU Library General Public License.
- *
- * - This may actually be BSD or Minix code, can someone clarify please. -RDB
- */
-
-#ifndef __AOUT_H
-#define __AOUT_H
-
-/* If the host isn't an x86 all bets are off, use chars. */
-#if defined(i386) || defined(__BCC__) || defined(MSDOS)
-typedef long Long;
-#define __OUT_OK 1
-#else
-/* Beware: this will probably allow some BE hosts to generate broken files. */
-#ifdef INT32_MAX
-#include <stdint.h>
-typedef int32_t Long;
-#define __OUT_OK 1
-#else
-typedef char Long[4];
-#endif
-#endif
-
-struct exec {                  /* a.out header */
-  unsigned char        a_magic[2];     /* magic number */
-  unsigned char        a_flags;        /* flags, see below */
-  unsigned char        a_cpu;          /* cpu id */
-  unsigned char        a_hdrlen;       /* length of header */
-  unsigned char        a_unused;       /* reserved for future use */
-  unsigned char a_version[2];  /* version stamp (not used at present) */
-  Long         a_text;         /* size of text segement in bytes */
-  Long         a_data;         /* size of data segment in bytes */
-  Long         a_bss;          /* size of bss segment in bytes */
-  Long         a_entry;        /* entry point */
-  Long         a_total;        /* total memory allocated */
-  Long         a_syms;         /* size of symbol table */
-
-  /* SHORT FORM ENDS HERE */
-  Long         a_trsize;       /* text relocation size */
-  Long         a_drsize;       /* data relocation size */
-  Long         a_tbase;        /* text relocation base */
-  Long         a_dbase;        /* data relocation base */
-};
-
-#define A_MAGIC0      (unsigned char) 0x01
-#define A_MAGIC1      (unsigned char) 0x03
-#define BADMAG(X)     ((X).a_magic[0] != A_MAGIC0 ||(X).a_magic[1] != A_MAGIC1)
-
-/* CPU Id of TARGET machine (byte order coded in low order two bits) */
-#define A_NONE  0x00   /* unknown */
-#define A_I8086         0x04   /* intel i8086/8088 */
-#define A_M68K  0x0B   /* motorola m68000 */
-#define A_NS16K         0x0C   /* national semiconductor 16032 */
-#define A_I80386 0x10  /* intel i80386 */
-#define A_SPARC         0x17   /* Sun SPARC */
-
-#define A_BLR(cputype) ((cputype&0x01)!=0) /* TRUE if bytes left-to-right */
-#define A_WLR(cputype) ((cputype&0x02)!=0) /* TRUE if words left-to-right */
-
-/* Flags. */
-#define A_UZP  0x01    /* unmapped zero page (pages) */
-#define A_PAL  0x02    /* page aligned executable */
-#define A_NSYM 0x04    /* new style symbol table */
-#define A_EXEC 0x10    /* executable */
-#define A_SEP  0x20    /* separate I/D */
-#define A_PURE 0x40    /* pure text */
-#define A_TOVLY        0x80    /* text overlay */
-
-/* Offsets of various things. */
-#define A_MINHDR       32
-#define        A_TEXTPOS(X)    ((long)(X).a_hdrlen)
-#define        A_HASRELS(X)    ((X).a_hdrlen > (unsigned char) A_MINHDR)
-#define A_HASEXT(X)    ((X).a_hdrlen > (unsigned char) (A_MINHDR +  8))
-#define A_HASLNS(X)    ((X).a_hdrlen > (unsigned char) (A_MINHDR + 16))
-#define A_HASTOFF(X)   ((X).a_hdrlen > (unsigned char) (A_MINHDR + 24))
-#ifdef __OUT_OK
-#define A_DATAPOS(X)   (A_TEXTPOS(X) + (X).a_text)
-#define A_TRELPOS(X)   (A_DATAPOS(X) + (X).a_data)
-#define A_DRELPOS(X)   (A_TRELPOS(X) + (X).a_trsize)
-#define A_SYMPOS(X)    (A_TRELPOS(X) + (A_HASRELS(X) ? \
-                       ((X).a_trsize + (X).a_drsize) : 0))
-#endif
-
-struct reloc {
-  long r_vaddr;                        /* virtual address of reference */
-  unsigned short r_symndx;     /* internal segnum or extern symbol num */
-  unsigned short r_type;       /* relocation type */
-};
-
-/* r_tyep values: */
-#define R_ABBS         0
-#define R_RELLBYTE     2
-#define R_PCRBYTE      3
-#define R_RELWORD      4
-#define R_PCRWORD      5
-#define R_RELLONG      6
-#define R_PCRLONG      7
-#define R_REL3BYTE     8
-#define R_KBRANCHE     9
-
-/* r_symndx for internal segments */
-#define S_ABS          ((unsigned short)-1)
-#define S_TEXT         ((unsigned short)-2)
-#define S_DATA         ((unsigned short)-3)
-#define S_BSS          ((unsigned short)-4)
-
-struct nlist {                 /* symbol table entry */
-  char n_name[8];              /* symbol name */
-  Long n_value;                        /* value */
-  unsigned char        n_sclass;       /* storage class */
-  unsigned char        n_numaux;       /* number of auxiliary entries (not used) */
-  unsigned short n_type;       /* language base and derived type (not used) */
-};
-
-/* Low bits of storage class (section). */
-#define        N_SECT            07    /* section mask */
-#define N_UNDF           00    /* undefined */
-#define N_ABS            01    /* absolute */
-#define N_TEXT           02    /* text */
-#define N_DATA           03    /* data */
-#define        N_BSS             04    /* bss */
-#define N_COMM           05    /* (common) */
-
-/* High bits of storage class. */
-#define N_CLASS                0370    /* storage class mask */
-#define C_NULL         0
-#define C_EXT          0020    /* external symbol */
-#define C_STAT         0030    /* static */
-
-#endif /* _AOUT_H */
diff --git a/Applications/ld09/x86_cpm86.h b/Applications/ld09/x86_cpm86.h
deleted file mode 100644 (file)
index 0a858f5..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 2002
- * This file is part of the ld86 command for Linux-86 
- * It is distributed under the GNU Library General Public License.
- *
- * CP/M-86 CMD file header
- */
-
-#ifndef __CPM86_H
-#define __CPM86_H
-
-typedef char Short16[2];
-
-struct  cpm86_group {
-       unsigned char cg_type;  /* 1=Code 2=Data */
-       Short16       cg_len;   /* Group length, paragraphs */
-       Short16       cg_base;  /* Group address, normally 0 for relocatable */
-       Short16       cg_min;   /* Minimum size, normally = group length */
-       Short16       cg_max;   /* Maximum size, normally 0x1000 (64k) */
-};
-
-
-struct cpm86_exec {                    /* CP/M-86 header */
-       struct cpm86_group ce_group[8];
-       unsigned char ce_spare[51];
-       Short16       ce_rsxs;          /* Record with RSX list */
-       Short16       ce_fixups;        /* Record with fixups */
-       unsigned char ce_flags;         /* Concurrent CP/M flags */
-};
-
-/* Group types */
-#define CG_EMPTY 0
-#define CG_CODE  1
-#define CG_DATA  2
-#define CG_EXTRA 3
-#define CG_STACK 4
-#define CG_AUX1  5
-#define CG_AUX2  6
-#define CG_AUX3  7
-#define CG_AUX4  8
-#define CG_PURE  9     /* Code that is known to be pure */
-
-#define CPM86_HEADERLEN 0x80
-
-#endif /* _CPM86_H */