//
// RMAC - Reboot's Macro Assembler for all Atari computers
// RMAC.C - Main Application Code
-// Copyright (C) 199x Landon Dyer, 2011-2019 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
// Source utilised with the kind permission of Landon Dyer
//
char * searchpath; // 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
" -dsymbol[=value] Define symbol (with optional value, default=0)\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"
+ " a: ALCYON\n"
" b: BSD (use this for Jaguar)\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"
" -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"
" -m[cpu] Select default CPU. Available options:\n"
- " 68000\n"
- " 68020\n"
- " 68030\n"
- " 68040\n"
- " 68060\n"
- " 6502\n"
- " tom\n"
- " jerry\n"
- " 56001\n"
+ " 68000, 68020, 68030, 68040, 68060, 6502, tom, jerry, 56001\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"
" 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"
"| | | | | | | | (_| | (__ \n"
"|_| |_| |_| |_|\\__,_|\\___|\n"
"\nReboot's Macro Assembler\n"
- "Copyright (C) 199x Landon Dyer, 2011-2019 Reboot\n"
+ "Copyright (C) 199x Landon Dyer, 2011-2020 Reboot\n"
"V%01i.%01i.%01i %s (%s)\n\n", MAJOR, MINOR, PATCH, __DATE__, PLATFORM);
}
}
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))
char fnbuf[FNSIZ]; // Filename buffer
int i; // Iterator
- errcnt = 0; // Initialise error count
- listing = 0; // Initialise listing level
- list_flag = 0; // Initialise listing flag
- verb_flag = perm_verb_flag; // Initialise verbose flag
- as68_flag = 0; // Initialise as68 kludge mode
- glob_flag = 0; // Initialise .globl flag
- sbra_flag = 0; // Initialise short branch flag
- debug = 0; // Initialise debug flag
- searchpath = NULL; // Initialise search path
- objfname = NULL; // Initialise object filename
- list_fname = NULL; // Initialise listing filename
- err_fname = NULL; // Initialise error filename
- obj_format = BSD; // Initialise object format
- firstfname = NULL; // Initialise first filename
- err_fd = ERROUT; // Initialise error file descriptor
- err_flag = 0; // Initialise error flag
- rgpu = 0; // Initialise GPU assembly flag
- rdsp = 0; // Initialise DSP assembly flag
- robjproc = 0; // Initialise OP assembly flag
+ 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
+ sbra_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
+ obj_format = BSD; // Initialize object format
+ firstfname = NULL; // Initialize first filename
+ err_fd = ERROUT; // Initialize error file descriptor
+ err_flag = 0; // Initialize error flag
+ rgpu = 0; // Initialize GPU assembly flag
+ 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; // Initialise segment padding size
+ segpadsize = 2; // Initialize segment padding size
+ dsp_orgmap[0].start = 0; // Initialize 56001 org initial address
+ dsp_orgmap[0].memtype = ORG_P; // Initialize 56001 org start segment
m6502 = 0; // 6502 mode off by default
- // Initialise modules
+ // Initialize modules
InitSymbolTable(); // Symbol table
InitTokenizer(); // Tokenizer
InitLineProcessor(); // Line processor
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++;