]> Shamusworld >> Repos - rmac/blobdiff - object.c
Bump version #.
[rmac] / object.c
index 367f78364b3800dad690d49e84ebea44f53f20b0..82fc76aa550e59a596461c8c83ba25c1da91de8d 100644 (file)
--- a/object.c
+++ b/object.c
@@ -12,6 +12,7 @@
 #include "mark.h"
 #include "error.h"
 #include "riscasm.h"
+#include "mark.h"
 
 /*
  *  Imports
@@ -90,6 +91,28 @@ char * constr_bsdsymtab(char * buf, SYM * sym, int globflag)
 #define        AL_BSS          0x0100
 #define        AL_FILE         0x0080
 
+LONG PRGFLAGS;         /* PRGFLAGS as defined in Atari Compendium Chapter 2 */
+                                       /* Definition   Bit(s)  Meaning */
+                                       /* PF_FASTLOAD  0               If set, clear only the BSS area on program load,              */
+                                       /*                                              otherwise clear the entire heap.                              */
+                                       /* PF_TTRAMLOAD 1               If set, the program may be loaded into alternative RAM,       */
+                                       /*                                              otherwise it must be loaded into standard RAM.                */
+                                       /* PF_TTRAMMEM  2               If set, the program's Malloc() requests may be satisfied      */
+                                       /*                                              from alternative RAM, otherwise they must be satisfied        */
+                                       /*                                              from standard RAM.                                            */
+                                       /* -                    3               Currently unused.                                             */
+                                       /* See left.    4 & 5   If these bits are set to 0 (PF_PRIVATE), the processes'       */
+                                       /*                                              entire memory space will be considered private                */
+                                       /*                                              (when memory protection is enabled).If these bits are         */
+                                       /*                                              set to 1 (PF_GLOBAL), the processes' entire memory space      */
+                                       /*                                              will be readable and writable by any process (i.e. global).   */
+                                       /*                                              If these bits are set to 2 (PF_SUPERVISOR), the processes'    */
+                                       /*                                              entire memory space will only be readable and writable by     */
+                                       /*                                              itself and any other process in supervisor mode.If these      */
+                                       /*                                              bits are set to 3 (PF_READABLE), the processes' entire memory */
+                                       /*                                              space will be readable by any application but only            */
+                                       /*                                              writable by itself.                                           */
+                                       /* -                    6-15    Currently unused.                                             */
 
 static WORD tdb_tab[] = {
        0,                              /* absolute */
@@ -197,10 +220,21 @@ int WriteObject(int fd)
        LONG trsize, drsize;    // Size of relocations
        long unused;                    // For supressing 'write' warnings
 
+       if (verb_flag)
+       {
+               printf("TEXT segment: %d bytes\n", sect[TEXT].sloc);
+               printf("DATA segment: %d bytes\n", sect[DATA].sloc);
+               printf("BSS  segment: %d bytes\n", sect[BSS].sloc);
+       }
+
        // Write requested object file...
        switch (obj_format)
        {
        case BSD:
+               if (verb_flag)
+               {
+                       printf("Total       : %d bytes\n", sect[TEXT].sloc + sect[DATA].sloc + sect[BSS].sloc);
+               }
                ssize = ((LONG)sy_assign(NULL, NULL));          // Assign index numbers to the symbols
                tds = sect[TEXT].sloc + sect[DATA].sloc;        // Get size of TEXT and DATA segment
                buf = malloc(0x600000);                                         // Allocate 6mb object file image memory
@@ -281,6 +315,18 @@ int WriteObject(int fd)
                break;
 
        case ALCYON:
+               if (verb_flag)
+               {
+                       if (prg_flag)
+                       {
+                               printf("TOS header  : 28 bytes\n");
+                               printf("Total       : %d bytes\n", 28 + sect[TEXT].sloc + sect[DATA].sloc + sect[BSS].sloc);
+                       }
+                       else
+                       {
+                               printf("Total       : %d bytes\n", sect[TEXT].sloc + sect[DATA].sloc + sect[BSS].sloc);
+                       }
+               }
                /*
                 *  Compute size of symbol table;
                 *   assign numbers to the symbols...
@@ -299,24 +345,24 @@ int WriteObject(int fd)
                if (t < ssize)
                        t = ssize;
 
-               buf = malloc(t + HDRSIZE) + HDRSIZE;
+               buf = (char *)((int)malloc(t + HDRSIZE) + HDRSIZE);
 
                /*
                 *  Build object file header
                 *   just before the text+data image
                 */
                chptr = buf - HDRSIZE;  /* -> base of header */
-               D_word(0x601a);                 /* magic number */
-               t = sect[TEXT].sloc;    /* TEXT size */
+               D_word(0x601a);                 /* 00 - magic number */
+               t = sect[TEXT].sloc;    /* 02 - TEXT size */
                D_long(t);
-               t = sect[DATA].sloc;    /* DATA size */
+               t = sect[DATA].sloc;    /* 06 - DATA size */
                D_long(t);
-               t = sect[BSS].sloc;             /* BSS size */
+               t = sect[BSS].sloc;             /* 0a - BSS size */
                D_long(t);
-               D_long(ssize);                  /* symbol table size */
-               D_long(0);                              /* stack size (unused) */
-               D_long(0);                              /* entry point (unused) */
-               D_word(0);                              /* relocation information exists */
+               D_long(ssize);                  /* 0e - symbol table size */
+               D_long(0);                              /* 12 - stack size (unused) */
+               D_long(PRGFLAGS);               /* 16 - PRGFLAGS */
+               D_word(0);                              /* 1a - relocation information exists */
 
                /*
                 *  Construct text and data segments;