X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=rmac.c;h=9f52e0b49f94856e1434c7d1006ab90ede01b7df;hp=1111d6d64053ac5901cea5b35e0991db71372538;hb=ace0b549a94110b69ec61442f825fb421b79799a;hpb=4205233c8397c581b4d27ab36ab81ec896ef3dd0 diff --git a/rmac.c b/rmac.c index 1111d6d..9f52e0b 100644 --- a/rmac.c +++ b/rmac.c @@ -50,12 +50,14 @@ 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 * searchpath; // Search path for include files +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_pc = 0; // Enforce PC relative 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 // // Convert a string to uppercase @@ -152,6 +154,7 @@ void DisplayHelp(void) " 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" " -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" @@ -171,13 +174,13 @@ void DisplayHelp(void) " 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" " ~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" - " -px Create an ST .prg (with exsymbols)\n" - " Forces -fa\n" + " -p Create an ST .prg (without symbols). Forces -fa\n" + " -ps Create an ST .prg (with symbols). Forces -fa\n" + " -px Create an ST .prg (with exsymbols). Forces -fa\n" " -r[size] Pad segments to boundary size specified\n" " w: word (2 bytes, default alignment)\n" " l: long (4 bytes)\n" @@ -231,6 +234,12 @@ int ParseOptimization(char * optstring) } else if (optstring[1] == 'o' || optstring[1] == 'O') // Turn on specific optimisation { + if (optstring[2] == 'p' || optstring[2] == 'P') + { + optim_pc = 1; + return OK; + } + int opt_no = atoi(&optstring[2]); if ((opt_no >= 0) && (opt_no < OPT_COUNT)) @@ -368,6 +377,10 @@ int Process(int argc, char ** argv) case 'X': obj_format = XEX; break; + case 'r': // -fr = Absolute address + case 'R': + obj_format = RAW; + break; default: printf("-f: unknown object format specified\n"); errcnt++; @@ -380,8 +393,26 @@ int Process(int argc, char ** argv) break; case 'i': // Set directory search path case 'I': + { searchpath = argv[argno] + 2; + + // Check to see if include paths actually exist + if (strlen(searchpath) > 0) + { + DIR * test = opendir(searchpath); + + if (test == NULL) + { + printf("Invalid include path: %s\n", searchpath); + errcnt++; + return errcnt; + } + + closedir(test); + } + break; + } case 'l': // Produce listing file case 'L': if (*(argv[argno] + 2) == '*')