X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=rmac.c;h=473f372cc4344f42d6c6956c41de6bb8023a7e99;hb=d21544da607af148b96a9d926d4564800892aa4e;hp=ef99ffd5240ba24bd0691bb8ba250e86d5cbd40f;hpb=4ee0f36a71367d53457147c7b31bc9845e3ac21c;p=rmac diff --git a/rmac.c b/rmac.c index ef99ffd..473f372 100644 --- a/rmac.c +++ b/rmac.c @@ -1,7 +1,7 @@ // -// RMAC - Reboot's Macro Assembler for all Atari computers +// RMAC - Renamed Macro Assembler for all Atari computers // RMAC.C - Main Application Code -// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2021 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -29,7 +29,6 @@ int list_flag; // "-l" listing flag on command line int list_pag = 1; // Enable listing pagination by default int verb_flag; // Be verbose about what's going on int m6502; // 1, assembling 6502 code -int as68_flag; // as68 kludge mode int glob_flag; // Assume undefined symbols are global int lsym_flag; // Include local symbols in object file int optim_warn_flag; // Warn about possible short branches @@ -44,15 +43,15 @@ int rgpu, rdsp; // Assembling Jaguar GPU or DSP code int robjproc; // Assembling Jaguar Object Processor code int dsp56001; // Assembling DSP 56001 code int list_fd; // File to write listing to -int regbank; // RISC register bank int segpadsize; // Segment padding size int endian; // Host processor endianess (0 = LE, 1 = BE) char * objfname; // Object filename pointer char * firstfname; // First source filename char * cmdlnexec; // Executable name, pointer to ARGV[0] +char searchpatha[512] = { 0 }; // Buffer to hold searchpath when specified char * searchpath = NULL; // Search path for include files char defname[] = "noname.o"; // Default output filename -int optim_flags[OPT_COUNT]; // Specific optimisations on/off matrix +int optim_flags[OPT_COUNT_ALL] = { 0 }; // Specific optimisations on/off matrix 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) @@ -67,7 +66,6 @@ void strtoupper(char * s) *s++ &= 0xDF; } - // // Manipulate file extension. // @@ -100,6 +98,17 @@ char * fext(char * name, char * extension, int stripp) return name; } +static int is_sep(char c) +{ + const char *seps = PATH_SEPS; + + for (seps = PATH_SEPS; *seps; seps++) { + if (*seps == c) + return 1; + } + + return 0; +} // // Return 'item'nth element of semicolon-seperated pathnames specified in the @@ -119,13 +128,13 @@ int nthpath(char * env_var, int itemno, char * buf) return 0; while (itemno--) - while (*s != EOS && *s++ != ';') + while (*s != EOS && !is_sep(*s++)) ; if (*s == EOS) return 0; - while (*s != EOS && *s != ';') + while (*s != EOS && !is_sep(*s)) *buf++ = *s++; *buf++ = EOS; @@ -133,7 +142,6 @@ int nthpath(char * env_var, int itemno, char * buf) return 1; } - // // Display command line help // @@ -162,18 +170,20 @@ void DisplayHelp(void) " -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" - " Available optimisation values and default settings:\n" - " o0: Absolute long addresses to word (on)\n" - " o1: move.l #x,dn/an to moveq (on)\n" - " o2: Word branches to short (on)\n" - " o3: Outer displacement 0(an) to (an) (off)\n" - " o4: lea size(An),An to addq #size,An (off)\n" - " o5: 68020+ Absolute long base/outer disp. to word (off)\n" - " o6: Null branches to NOP (off)\n" - " o7: clr.l Dx to moveq #0,Dx (off)\n" - " o8: adda.w/l #x,Dy to addq.w/l #x,Dy (off)\n" - " o9: adda.w/l #x,Dy to lea x(Dy),Dy (off)\n" - " op: Enforce PC relative (off)\n" + " Available optimisation switches:\n" + " o0: Absolute long addresses to word\n" + " o1: move.l #x,dn/an to moveq\n" + " o2: Word branches to short\n" + " o3: Outer displacement 0(an) to (an)\n" + " o4: lea size(An),An to addq #size,An\n" + " o5: 68020+ Absolute long base/outer disp. to word\n" + " o6: Null branches to NOP\n" + " o7: clr.l Dx to moveq #0,Dx\n" + " o8: adda.w/l #x,Dy to addq.w/l #x,Dy\n" + " o9: adda.w/l #x,Ay to lea x(Dy),Ay\n" + " o10: 56001 Use short format for immediate values if possible\n" + " o11: 56001 Auto convert short addressing mode to long (default: on)\n" + " o30: Enforce PC relative (alternative name: op)\n" " ~o[value] Turn a specific optimisation off\n" " +oall Turn all optimisations on\n" " ~oall Turn all optimisations off\n" @@ -206,12 +216,11 @@ void DisplayVersion(void) "| '__| '_ ` _ \\ / _` |/ __|\n" "| | | | | | | | (_| | (__ \n" "|_| |_| |_| |_|\\__,_|\\___|\n" - "\nReboot's Macro Assembler\n" - "Copyright (C) 199x Landon Dyer, 2011-2020 Reboot\n" + "\nRenamed Macro Assembler\n" + "Copyright (C) 199x Landon Dyer, 2011-2021 Reboot and Friends\n" "V%01i.%01i.%01i %s (%s)\n\n", MAJOR, MINOR, PATCH, __DATE__, PLATFORM); } - // // Parse optimisation options // @@ -226,6 +235,9 @@ int ParseOptimization(char * optstring) else if (*optstring != '~') return ERROR; + if (optstring[2] == 0) + return error(".opt called with zero arguments"); + if ((optstring[2] == 'a' || optstring[2] == 'A') && (optstring[3] == 'l' || optstring[3] == 'L') && (optstring[4] == 'l' || optstring[4] == 'L')) @@ -272,7 +284,6 @@ int ParseOptimization(char * optstring) return OK; } - // // Process command line arguments and do an assembly // @@ -284,16 +295,15 @@ int Process(int argc, char ** argv) int fd; // File descriptor char fnbuf[FNSIZ]; // Filename buffer int i; // Iterator + int current_path_index = 0; // Iterator for search paths errcnt = 0; // Initialize error count listing = 0; // Initialize listing level list_flag = 0; // Initialize listing flag verb_flag = perm_verb_flag; // Initialize verbose flag - as68_flag = 0; // Initialize as68 kludge mode glob_flag = 0; // Initialize .globl flag optim_warn_flag = 0; // Initialize short branch flag debug = 0; // Initialize debug flag - searchpath = NULL; // Initialize search path objfname = NULL; // Initialize object filename list_fname = NULL; // Initialize listing filename err_fname = NULL; // Initialize error filename @@ -305,7 +315,6 @@ 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 - regbank = BANK_N; // No RISC register bank specified orgactive = 0; // Not in RISC org section orgwarning = 0; // No ORG warning issued segpadsize = 2; // Initialize segment padding size @@ -410,23 +419,31 @@ int Process(int argc, char ** argv) case 'i': // Set directory search path case 'I': { - searchpath = argv[argno] + 2; + strcat(searchpatha, argv[argno] + 2); + strcat(searchpatha, ";"); + searchpath = searchpatha; // Check to see if include paths actually exist - if (strlen(searchpath) > 0) - { - DIR * test = opendir(searchpath); + char current_path[256]; - if (test == NULL) + for(i=current_path_index; nthpath("RMACPATH", i, current_path)!=0; i++) + { + if (strlen(current_path) > 0) { - printf("Invalid include path: %s\n", searchpath); - errcnt++; - return errcnt; - } + DIR * test = opendir(current_path); + + if (test == NULL) + { + printf("Invalid include path: %s\n", current_path); + errcnt++; + return errcnt; + } - closedir(test); + closedir(test); + } } + current_path_index = i - 1; break; } case 'l': // Produce listing file @@ -736,7 +753,6 @@ int Process(int argc, char ** argv) return errcnt; } - // // Determine processor endianess // @@ -751,7 +767,6 @@ int GetEndianess(void) return 1; } - // // Application entry point // @@ -759,12 +774,7 @@ 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; + optim_flags[OPT_56K_SHORT] = 1; // This ensures compatibilty with Motorola's 56k assembler cmdlnexec = argv[0]; // Obtain executable name endian = GetEndianess(); // Get processor endianess @@ -778,4 +788,3 @@ int main(int argc, char ** argv) return 0; } -