]> Shamusworld >> Repos - rmac/blobdiff - object.c
Fixed subtle bug in expr().
[rmac] / object.c
index 2148b5f054891351f9bcfdb94d8d1c0b9185e926..4e9613f5a258a2a02f3c079ef7a8c23cea9809cf 100644 (file)
--- a/object.c
+++ b/object.c
 #include "symbol.h"
 #include "mark.h"
 #include "error.h"
-#include "risca.h"
+#include "riscasm.h"
 
-LONG symsize = 0;                                           // Size of BSD symbol table
-LONG strindx = 0x00000004;                                  // BSD string table index
-char * strtable;                                             // Pointer to the symbol string table
-char * objimage;                                             // Global object image pointer
+LONG symsize = 0;                                                      // Size of BSD symbol table
+LONG strindx = 0x00000004;                                     // BSD string table index
+char * strtable;                                                       // Pointer to the symbol string table
+char * objimage;                                                       // Global object image pointer
 
 
 //
@@ -24,52 +24,52 @@ char * objimage;                                             // Global object im
 //
 char * constr_bsdsymtab(char * buf, SYM * sym, int globflag)
 {
-       LONG z;                                                  // Scratch long
-       WORD w1;                                                 // Scratch word
-       int w2;                                                  // Scratch long
+       LONG z;                                                                 // Scratch long
+       WORD w1;                                                                // Scratch word
+       int w2;                                                                 // Scratch long
 
-       chptr = buf;                                             // Point to buffer for deposit longs
-       D_long(strindx);                                         // Deposit the symbol string index
+       chptr = buf;                                                    // Point to buffer for deposit longs
+       D_long(strindx);                                                // Deposit the symbol string index
 
-       w1 = sym->sattr;                                         // Obtain symbol attribute
+       w1 = sym->sattr;                                                // Obtain symbol attribute
        w2 = sym->sattre;
-       z = 0;                                                   // Initialise resulting symbol flags
+       z = 0;                                                                  // Initialise resulting symbol flags
 
        if (w1 & EQUATED)
        {                                       
-               z = 0x02000000;                                       // Set equated flag
+               z = 0x02000000;                                         // Set equated flag
        }
        else
        {
                switch (w1 & TDB)
                {
-               case TEXT: z = 0x04000000; break;                  // Set TEXT segment flag
-               case DATA: z = 0x06000000; break;                  // Set DATA segment flag
-               case BSS : z = 0x08000000; break;                  // Set BSS segment flag
+               case TEXT: z = 0x04000000; break;       // Set TEXT segment flag
+               case DATA: z = 0x06000000; break;       // Set DATA segment flag
+               case BSS : z = 0x08000000; break;       // Set BSS segment flag
                }
        }
 
        if (globflag)
-               z |= 0x01000000;                            // Set global flag if requested
+               z |= 0x01000000;                                        // Set global flag if requested
 
-       D_long(z);                                               // Deposit symbol attribute
+       D_long(z);                                                              // Deposit symbol attribute
 
-       z = sym->svalue;                                         // Obtain symbol value
-       w1 &= DATA|BSS;                                          // Determine DATA or BSS flag
+       z = sym->svalue;                                                // Obtain symbol value
+       w1 &= DATA | BSS;                                               // Determine DATA or BSS flag
 
        if (w1)                                                   
-               z += sect[TEXT].sloc;                                 // If DATA or BSS add TEXT segment size
+               z += sect[TEXT].sloc;                           // If DATA or BSS add TEXT segment size
 
        if (w1 & BSS) 
-               z += sect[DATA].sloc;                                 // If BSS add DATA segment size
+               z += sect[DATA].sloc;                           // If BSS add DATA segment size
 
-       D_long(z);                                               // Deposit symbol value
+       D_long(z);                                                              // Deposit symbol value
 
        strcpy(strtable + strindx, sym->sname);
 
-       strindx += strlen(sym->sname) + 1;                       // Incr string index incl null terminate
-       buf += 12;                                               // Increment buffer to next record
-       symsize += 12;                                           // Increment symbol table size
+       strindx += strlen(sym->sname) + 1;              // Incr string index incl null terminate
+       buf += 12;                                                              // Increment buffer to next record
+       symsize += 12;                                                  // Increment symbol table size
 
        return buf;
 }
@@ -80,22 +80,23 @@ char * constr_bsdsymtab(char * buf, SYM * sym, int globflag)
 //
 int object(WORD fd)
 {
-       LONG t;                                                  // Scratch long
-       LONG tds;                                                // TEXT & DATA segment size
-       int i;                                                   // Temporary int
-       CHUNK * cp;                                               // Chunk (for gather)
-       char * buf;                                               // Scratch area
-       char * p;                                                 // Temporary ptr
-       LONG ssize;                                              // Size of symbols
-       LONG trsize, drsize;                                     // Size of relocations
+       LONG t;                                 // Scratch long
+       LONG tds;                               // TEXT & DATA segment size
+       int i;                                  // Temporary int
+       CHUNK * cp;                             // Chunk (for gather)
+       char * buf;                             // Scratch area
+       char * p;                               // Temporary ptr
+       LONG ssize;                             // Size of symbols
+       LONG trsize, drsize;    // Size of relocations
+       long unused;                    // For supressing 'write' warnings
 
        // Write requested object file...
        switch (obj_format)
        {
        case BSD:
-               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(0x400000);                            // Allocate 4mb object file image memory
+               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
 
                if (buf == NULL)
                {
@@ -103,9 +104,9 @@ int object(WORD fd)
                        return ERROR;
                }
 
-               memset(buf, 0, 0x400000);                          // Reset allocated memory
-               objimage = buf;                                    // Set global object image pointer
-               strtable = malloc(0x200000);                       // Allocate 2mb scratch buffer 
+               memset(buf, 0, 0x600000);                                       // Reset allocated memory
+               objimage = buf;                                                         // Set global object image pointer
+               strtable = malloc(0x200000);                            // Allocate 2mb scratch buffer 
 
                if (strtable == NULL)
                {
@@ -113,23 +114,18 @@ int object(WORD fd)
                        return ERROR;
                }
 
-               memset(strtable, 0, 0x200000);                     // Reset allocated memory
+               memset(strtable, 0, 0x200000);                          // Reset allocated memory
 
                // Build object file header
-               chptr = buf;                                       // Base of header
-               t = 0x00000107;
-               D_long(t);                                         // Magic number
-               t = sect[TEXT].sloc;                               // TEXT size 
-               D_long(t);
-               t = sect[DATA].sloc;                               // DATA size 
-               D_long(t);
-               t = sect[BSS].sloc;                                // BSS size 
-               D_long(t);
-               t = 0x00000000;
-               D_long(t);                                         // Symbol size
-               D_long(t);                                         // First entry (0L)
-               D_long(t);                                         // TEXT relocation size
-               D_long(t);                                         // BSD relocation size
+               chptr = buf;                                                            // Base of header
+               D_long(0x00000107);                                                     // Magic number
+               D_long(sect[TEXT].sloc);                                        // TEXT size 
+               D_long(sect[DATA].sloc);                                        // DATA size 
+               D_long(sect[BSS].sloc);                                         // BSS size 
+               D_long(0x00000000);                                                     // Symbol size
+               D_long(0x00000000);                                                     // First entry (0L)
+               D_long(0x00000000);                                                     // TEXT relocation size
+               D_long(0x00000000);                                                     // BSD relocation size
 
                // Construct TEXT and DATA segments (without relocation changes)
                p = buf + BSDHDRSIZE;
@@ -144,36 +140,36 @@ int object(WORD fd)
                }
 
                // Do relocation tables (and make changes to segment data)
-               p = buf + (BSDHDRSIZE + tds);                      // Move obj image ptr to reloc info
+               p = buf + (BSDHDRSIZE + tds);                           // Move obj image ptr to reloc info
                trsize = bsdmarkimg(p, tds, sect[TEXT].sloc, TEXT);// Do TEXT relocation table
-               chptr = buf + 24;                                  // Point to relocation hdr entry
-               D_long(trsize);                                    // Write the relocation table size
-               p = buf + (BSDHDRSIZE + tds + trsize);             // Move obj image ptr to reloc info
+               chptr = buf + 24;                                                       // Point to relocation hdr entry
+               D_long(trsize);                                                         // Write the relocation table size
+               p = buf + (BSDHDRSIZE + tds + trsize);          // Move obj image ptr to reloc info
                drsize = bsdmarkimg(p, tds, sect[TEXT].sloc, DATA);// Do DATA relocation table
-               chptr = buf + 28;                                  // Point to relocation hdr entry
-               D_long(drsize);                                    // Write the relocation table size
+               chptr = buf + 28;                                                       // Point to relocation hdr entry
+               D_long(drsize);                                                         // Write the relocation table size
 
-               p = buf + (BSDHDRSIZE + tds + trsize + drsize);    // Point to start of symbol table
-               sy_assign(p, constr_bsdsymtab);                    // Build symbol and string tables
-               chptr = buf + 16;                                  // Point to sym table size hdr entry
-               D_long(symsize);                                   // Write the symbol table size
+               p = buf + (BSDHDRSIZE + tds + trsize + drsize);// Point to start of symbol table
+               sy_assign(p, constr_bsdsymtab);                         // Build symbol and string tables
+               chptr = buf + 16;                                                       // Point to sym table size hdr entry
+               D_long(symsize);                                                        // Write the symbol table size
 
                // Point to string table
                p = buf + (BSDHDRSIZE + tds + trsize + drsize + symsize);    
 
-               memcpy(p, strtable, strindx);                      // Copy string table to object image
+               memcpy(p, strtable, strindx);                           // Copy string table to object image
 
                if (buf)
-                       free(strtable);                            // Free allocated memory
+                       free(strtable);                                                 // Free allocated memory
 
-               chptr = p;                                         // Point to string table size long
-               D_long(strindx);                                   // Write string table size
+               chptr = p;                                                                      // Point to string table size long
+               D_long(strindx);                                                        // Write string table size
 
                // Write the BSD object file from the object image buffer
-               write(fd, buf, BSDHDRSIZE + tds + trsize + drsize + symsize + strindx + 4);
+               unused = write(fd, buf, BSDHDRSIZE + tds + trsize + drsize + symsize + strindx + 4);
 
                if (buf)
-                       free(buf);                                 // Free allocated memory
+                       free(buf);                                                              // Free allocated memory
 
                break;
        }