]> Shamusworld >> Repos - rmac/blobdiff - rmac.c
Version bump for last commit. :-)
[rmac] / rmac.c
diff --git a/rmac.c b/rmac.c
index 9259d4196aef9b14edf026614d26d38ee0bfeaec..17715f7ad6c86e8f9f0c6cffced6920e7b76ae00 100644 (file)
--- a/rmac.c
+++ b/rmac.c
@@ -31,6 +31,7 @@ int verb_flag;                                        // Be verbose about what's going on
 int m6502;                                             // 1, assembling 6502 code
 int glob_flag;                                 // Assume undefined symbols are global
 int lsym_flag;                                 // Include local symbols in object file (ALWAYS true)
+int dsym_flag;                                 // Gen debug syms (Requires obj_format = BSD)
 int optim_warn_flag;                   // Warn about possible short branches
 int prg_flag;                                  // !=0, produce .PRG executable (2=symbols)
 int prg_extend;                                        // !=0, output extended .PRG symbols
@@ -60,6 +61,8 @@ int activecpu = CPU_68000;            // Active 68k CPU (68000 by default)
 int activefpu = FPU_NONE;              // Active FPU (none by default)
 int org68k_active = 0;                 // .org switch for 68k (only with RAW output format)
 uint32_t org68k_address;               // .org for 68k
+int correctMathRules;                  // 1, use C operator precedence in expressions
+uint32_t used_architectures;   // Bitmask that records exactly which architectures were used during assembly
 
 //
 // Convert a string to uppercase
@@ -161,11 +164,13 @@ void DisplayHelp(void)
                "  -f[format]        Output object file format\n"
                "                    a: ALCYON\n"
                "                    b: BSD (use this for Jaguar)\n"
+               "                    c: PRG (C64)\n"
                "                    e: ELF\n"
                "                    p: P56 (use this for DSP56001 only)\n"
                "                    l: LOD (use this for DSP56001 only)\n"
                "                    x: com/exe/xex (Atari 800)\n"
                "                    r: absolute address\n"
+               "  -g                Output source level debug information (BSD object only)\n"
                "  -i[path]          Directory to search for include files\n"
                "  -l[filename]      Create an output listing file\n"
                "  -l*[filename]     Create an output listing file without pagination\n"
@@ -206,6 +211,7 @@ void DisplayHelp(void)
                "  -v                Set verbose mode\n"
                "  -x                Turn on debugging mode\n"
                "  -y[pagelen]       Set page line length (default: 61)\n"
+               "  -4                Use C style operator precedence\n"
                "\n", cmdlnexec);
 }
 
@@ -288,6 +294,42 @@ int ParseOptimization(char * optstring)
        return OK;
 }
 
+static void ProcessFile(int fd, char *fname)
+{
+       char *dbgname = fname;
+
+       if (NULL == fname)
+       {
+               fname = defname; // Kludge first filename
+               dbgname = "(stdin)";
+       }
+
+       // First file operations:
+       if (firstfname == NULL)
+       {
+               // Record first filename.
+               firstfname = fname;
+
+               // Validate option compatibility
+               if (dsym_flag)
+               {
+                       if (obj_format != BSD)
+                       {
+                               printf("-g: debug information only supported with BSD object file format\n");
+                               dsym_flag = 0;
+                               errcnt++;
+                       }
+                       else
+                       {
+                               GenMainFileSym(dbgname);
+                       }
+               }
+       }
+
+       include(fd, dbgname);
+       Assemble();
+}
+
 extern int reg68base[53];
 extern int reg68tab[222];
 extern int reg68check[222];
@@ -324,6 +366,7 @@ int Process(int argc, char ** argv)
        rdsp = 0;                                               // Initialize DSP assembly flag
        robjproc = 0;                                   // Initialize OP assembly flag
        lsym_flag = 1;                                  // Include local symbols in object file
+       dsym_flag = 0;                                  // No debug sym generation by default
        orgactive = 0;                                  // Not in RISC org section
        orgwarning = 0;                                 // No ORG warning issued
        segpadsize = 2;                                 // Initialize segment padding size
@@ -334,7 +377,8 @@ int Process(int argc, char ** argv)
        regtab = reg68tab;                              // Idem
        regcheck = reg68check;                  // Idem
        regaccept = reg68accept;                // Idem
-
+    correctMathRules = 0;                      // respect operator precedence
+       used_architectures = 0;                 // Initialise used architectures bitfield
        // Initialize modules
        InitSymbolTable();                              // Symbol table
        InitTokenizer();                                // Tokenizer
@@ -353,6 +397,9 @@ int Process(int argc, char ** argv)
                {
                        switch (argv[argno][1])
                        {
+                       case '4':
+                               correctMathRules = 1;
+                               break;
                        case 'd':                               // Define symbol
                        case 'D':
                                for(s=argv[argno]+2; *s!=EOS;)
@@ -399,6 +446,10 @@ int Process(int argc, char ** argv)
                                case 'B':
                                        obj_format = BSD;
                                        break;
+                               case 'c':
+                               case 'C':
+                                       obj_format = C64PRG;
+                                       break;
                                case 'e':                       // -fe = ELF
                                case 'E':
                                        obj_format = ELF;
@@ -427,7 +478,7 @@ int Process(int argc, char ** argv)
                                break;
                        case 'g':                               // Debugging flag
                        case 'G':
-                               printf("Debugging flag (-g) not yet implemented\n");
+                               dsym_flag = 1;
                                break;
                        case 'i':                               // Set directory search path
                        case 'I':
@@ -602,11 +653,7 @@ int Process(int argc, char ** argv)
 
                                break;
                        case EOS:                               // Input is stdin
-                               if (firstfname == NULL) // Kludge first filename
-                                       firstfname = defname;
-
-                               include(0, "(stdin)");
-                               Assemble();
+                               ProcessFile(0, NULL);
                                break;
                        case 'h':                               // Display command line usage
                        case 'H':
@@ -641,10 +688,6 @@ int Process(int argc, char ** argv)
                }
                else
                {
-                       // Record first filename.
-                       if (firstfname == NULL)
-                               firstfname = argv[argno];
-
                        strcpy(fnbuf, argv[argno]);
                        fext(fnbuf, ".s", 0);
                        fd = open(fnbuf, 0);
@@ -656,8 +699,7 @@ int Process(int argc, char ** argv)
                                continue;
                        }
 
-                       include(fd, fnbuf);
-                       Assemble();
+                       ProcessFile(fd, fnbuf);
                }
        }
 
@@ -716,7 +758,9 @@ int Process(int argc, char ** argv)
                if (firstfname == NULL)
                        firstfname = defname;
 
-               strcpy(fnbuf, firstfname);
+               // It's the size of fnbuf minus 5 because of the possible 4 char suffix
+               // + trailing null (added by fext()).
+               strncpy(fnbuf, firstfname, sizeof(fnbuf) - 5);
                fext(fnbuf, (prg_flag ? ".prg" : ".o"), 1);
                objfname = fnbuf;
        }