]> Shamusworld >> Repos - rmac/blobdiff - rmac.c
Removed -w flag, added +o[n], ~o[n] switches to control individual optimisations...
[rmac] / rmac.c
diff --git a/rmac.c b/rmac.c
index 3f5a9b59758f551d53a0be14bb7d77001091f510..280b5979e34c2b8580eeca8f3eb20d204f30929b 100644 (file)
--- a/rmac.c
+++ b/rmac.c
@@ -3,7 +3,7 @@
 // RMAC.C - Main Application Code
 // Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
-// Source Utilised with the Kind Permission of Landon Dyer
+// Source utilised with the kind permission of Landon Dyer
 //
 
 #include "rmac.h"
@@ -29,6 +29,7 @@ int as68_flag;                                        // as68 kludge mode
 int glob_flag;                                 // Assume undefined symbols are global
 int lsym_flag;                                 // Include local symbols in object file
 int sbra_flag;                                 // Warn about possible short branches
+int prg_flag;                                  // !=0, produce .PRG executable (2=symbols)
 int legacy_flag;                               // Do stuff like insert code in RISC assembler
 int obj_format;                                        // Object format flag
 int debug;                                             // [1..9] Enable debugging levels
@@ -44,7 +45,7 @@ char * firstfname;                            // First source filename
 char * cmdlnexec;                              // Executable name, pointer to ARGV[0]
 char * searchpath;                             // Search path for include files 
 char defname[] = "noname.o";   // Default output filename
-
+int optim_flags[OPT_COUNT];    // Specific optimisations on/off matrix
 
 //
 // Manipulate file extension.
@@ -125,11 +126,19 @@ void DisplayHelp(void)
                "  -dsymbol[=value]  Define symbol\n"
                "  -e[errorfile]     Send error messages to file, not stdout\n"
                "  -f[format]        Output object file format\n"
+               "                    a: ALCYON (use this for ST)\n"
                "                    b: BSD (use this for Jaguar)\n"
                "  -i[path]          Directory to search for include files\n"
                "  -l[filename]      Create an output listing file\n"
                "  -n                Don't do things behind your back in RISC assembler\n"
                "  -o file           Output file name\n"
+               "  +o[value]         Turn a specific optimisation on\n"
+               "  ~o[value]         Turn a specific optimisation off\n"
+               "  +oall             Turn all optimisations on\n"
+               "  ~oall             Turn all optimisations off\n"
+               "  -p                Create an ST .prg (without symbols)\n"
+               "  -ps               Create an ST .prg (with symbols)\n"
+               "                    Forces -fa\n"
                "  -r[size]          Pad segments to boundary size specified\n"
                "                    w: word (2 bytes, default alignment)\n"
                "                    l: long (4 bytes)\n"
@@ -137,8 +146,10 @@ void DisplayHelp(void)
                "                    d: double phrase (16 bytes)\n"
                "                    q: quad phrase (32 bytes)\n"
                "  -s                Warn about possible short branches\n"
+               "                    and applied optimisations\n"
                "  -u                Force referenced and undefined symbols global\n"
                "  -v                Set verbose mode\n"
+               "  -x                Turn on debugging mode\n"
                "  -y[pagelen]       Set page line length (default: 61)\n"
                "\n", cmdlnexec);
 }
@@ -149,7 +160,12 @@ void DisplayHelp(void)
 //
 void DisplayVersion(void)
 {
-       printf("\nReboot's Macro Assembler for Atari Jaguar\n"
+       printf("\n"
+               " _ __ _ __ ___   __ _  ___ \n"
+               "| '__| '_ ` _ \\ / _` |/ __|\n"
+               "| |  | | | | | | (_| | (__ \n"
+               "|_|  |_| |_| |_|\\__,_|\\___|\n"
+               "\nReboot's Macro Assembler\n"
                "Copyright (C) 199x Landon Dyer, 2011-2015 Reboot\n"
                "V%01i.%01i.%01i %s (%s)\n\n", MAJOR, MINOR, PATCH, __DATE__, PLATFORM);
 }
@@ -246,6 +262,10 @@ int Process(int argc, char ** argv)
                                switch (argv[argno][2])
                                {
                                case EOS:
+                               case 'a':                       // -fa = Alcyon [the default]
+                               case 'A':
+                                       obj_format = ALCYON;
+                                       break;
                                case 'b':                       // -fb = BSD (Jaguar Recommended)
                                case 'B':
                                        obj_format = BSD;
@@ -283,9 +303,37 @@ int Process(int argc, char ** argv)
                                                errcnt++;
                                                return errcnt;
                                        }
+
                                        objfname = argv[argno];
                                }
 
+                               break;
+                       case 'p':               /* -p: generate ".PRG" executable output */
+                       case 'P':
+                               /*
+                                * -p           .PRG generation w/o symbols
+                                * -ps  .PRG generation with symbols
+                                */
+                               switch (argv[argno][2])
+                               {
+                                       case EOS:
+                                               prg_flag = 1;
+                                               break;
+
+                                       case 's':
+                                       case 'S':
+                                               prg_flag = 2;
+                                               break;
+
+                                       default:
+                                               printf("-p: syntax error\n");
+                                               ++errcnt;
+                                               return errcnt;
+                               }
+
+                               // Enforce Alcyon object format - kind of silly
+                               // to ask for .prg output without it!
+                               obj_format = ALCYON;
                                break;
                        case 'r':                               // Pad seg to requested boundary size
                        case 'R':
@@ -359,6 +407,38 @@ int Process(int argc, char ** argv)
                                break;
                        }
                }
+               else if (*argv[argno] == '+' || *argv[argno] == '~')
+               {
+                       int onoff = 0;
+                       if (*argv[argno] == '+')
+                               onoff = 1;
+                       if ((argv[argno][2] == 'a' || argv[argno][2] == 'A') &&
+                               (argv[argno][3] == 'l' || argv[argno][3] == 'L') &&
+                               (argv[argno][4] == 'l' || argv[argno][4] == 'L'))
+                               memset(optim_flags, onoff, OPT_COUNT * sizeof(int));
+                       else if (argv[argno][1] == 'o' || argv[argno][1] == 'O') // Turn on specific optimisation
+                       {
+                               int opt_no = atoi(&argv[argno][2]);
+                               if (opt_no>=0 && opt_no<OPT_COUNT)
+                                       optim_flags[opt_no]=onoff;
+                               else
+                               {
+                                   DisplayVersion();
+                                       printf("Unknown switch: %s\n\n", argv[argno]);
+                                       DisplayHelp();
+                                       errcnt++;
+                                       break;
+                               }
+                       }
+                       else
+                       {
+                               DisplayVersion();
+                               printf("Unknown switch: %s\n\n", argv[argno]);
+                               DisplayHelp();
+                               errcnt++;
+                               break;
+                       }
+               }
                else
                {
                        // Record first filename.
@@ -412,8 +492,7 @@ int Process(int argc, char ** argv)
                        firstfname = defname;
 
                strcpy(fnbuf, firstfname);
-               //fext(fnbuf, prg_flag ? ".prg" : ".o", 1);
-               fext(fnbuf, ".o", 1);
+               fext(fnbuf, (prg_flag ? ".prg" : ".o"), 1);
                objfname = fnbuf;
        }
 
@@ -433,7 +512,7 @@ int Process(int argc, char ** argv)
 
                if (verb_flag)
                {
-                       s = "object";
+                       s = (prg_flag ? "executable" : "object");
                        printf("[Writing %s file: %s]\n", s, objfname);
                }
 
@@ -485,6 +564,14 @@ int main(int argc, char ** argv)
 {
        perm_verb_flag = 0;                             // Clobber "permanent" verbose flag
        legacy_flag = 1;                                // Default is legacy mode on (:-P)
+
+       // Set legacy optimisation flags to on
+       // and everything else to off
+       memset(optim_flags, 0, OPT_COUNT * sizeof(int));
+       optim_flags[OPT_ABS_SHORT] = 
+               optim_flags[OPT_MOVEL_MOVEQ] =
+               optim_flags[OPT_BSR_BCC_S] = 1;  
+
        cmdlnexec = argv[0];                    // Obtain executable name
 
        endian = GetEndianess();                // Get processor endianess