//
// RMAC - Reboot's Macro Assembler for all Atari computers
// RMAC.C - Main Application Code
-// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
// Source utilised with the kind permission of Landon Dyer
//
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 prg_extend; // !=0, output extended .PRG 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
int err_flag; // '-e' specified
int err_fd; // File to write error messages to
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 activefpu = FPU_NONE; // Active FPU (none by default)
+//
+// Convert a string to uppercase
+//
+void strtoupper(char * s)
+{
+ while (*s)
+ *s++ &= 0xDF;
+}
+
+
//
// Manipulate file extension.
//
" o5: Absolute long base displacement 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"
" ~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"
" -r[size] Pad segments to boundary size specified\n"
" w: word (2 bytes, default alignment)\n"
"| | | | | | | | (_| | (__ \n"
"|_| |_| |_| |_|\\__,_|\\___|\n"
"\nReboot's Macro Assembler\n"
- "Copyright (C) 199x Landon Dyer, 2011-2017 Reboot\n"
+ "Copyright (C) 199x Landon Dyer, 2011-2018 Reboot\n"
"V%01i.%01i.%01i %s (%s)\n\n", MAJOR, MINOR, PATCH, __DATE__, PLATFORM);
}
err_flag = 0; // Initialise error flag
rgpu = 0; // Initialise GPU assembly flag
rdsp = 0; // Initialise DSP assembly flag
+ robjproc = 0; // Initialise 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
}
sy->sattr = DEFINED | EQUATED | ABS;
- sy->svalue = (*s ? (uint32_t)atoi(s) : 0);
+ sy->svalue = (*s ? (uint64_t)atoi(s) : 0);
break;
case 'e': // Redirect error message output
case 'E':
break;
case 'm':
case 'M':
- if ((*(argv[argno] + 2) == '6') && (*(argv[argno] + 3) == '8') && (*(argv[argno] + 4) == '0') && (*(argv[argno] + 5) == '0') && (*(argv[argno] + 6) == '0'))
+ if (strcmp(argv[argno] + 2, "68000") == 0)
d_68000();
- else if ((*(argv[argno] + 2) == '6')&&(*(argv[argno] + 3) == '8')&&(*(argv[argno] + 4) == '0')&&(*(argv[argno] + 5) == '2')&&(*(argv[argno] + 6) == '0'))
+ else if (strcmp(argv[argno] + 2, "68020") == 0)
d_68020();
- else if ((*(argv[argno] + 2) == '6')&&(*(argv[argno] + 3) == '8')&&(*(argv[argno] + 4) == '0')&&(*(argv[argno] + 5) == '3')&&(*(argv[argno] + 6) == '0'))
+ else if (strcmp(argv[argno] + 2, "68030") == 0)
d_68030();
- else if ((*(argv[argno] + 2) == '6')&&(*(argv[argno] + 3) == '8')&&(*(argv[argno] + 4) == '0')&&(*(argv[argno] + 5) == '4')&&(*(argv[argno] + 6) == '0'))
+ else if (strcmp(argv[argno] + 2, "68040") == 0)
d_68040();
- else if ((*(argv[argno] + 2) == '6')&&(*(argv[argno] + 3) == '8')&&(*(argv[argno] + 4) == '0')&&(*(argv[argno] + 5) == '6')&&(*(argv[argno] + 6) == '0'))
+ else if (strcmp(argv[argno] + 2, "68060") == 0)
d_68060();
- else if ((*(argv[argno] + 2) == '6')&&(*(argv[argno] + 3) == '8')&&(*(argv[argno] + 4) == '8')&&(*(argv[argno] + 5) == '8')&&(*(argv[argno] + 6) == '1'))
+ else if (strcmp(argv[argno] + 2, "68881") == 0)
d_68881();
- else if ((*(argv[argno] + 2) == '6')&&(*(argv[argno] + 3) == '8')&&(*(argv[argno] + 4) == '8')&&(*(argv[argno] + 5) == '8')&&(*(argv[argno] + 6) == '2'))
+ else if (strcmp(argv[argno] + 2, "68882") == 0)
d_68882();
- else if ((*(argv[argno] + 2) == '5')&&(*(argv[argno] + 3) == '6')&&(*(argv[argno] + 4) == '0')&&(*(argv[argno] + 5) == '0')&&(*(argv[argno] + 6) == '1'))
+ else if (strcmp(argv[argno] + 2, "56001") == 0)
d_56001();
- else if ((*(argv[argno] + 2) == '6')&&(*(argv[argno] + 3) == '5')&&(*(argv[argno] + 4) == '0')&&(*(argv[argno] + 5) == '2'))
+ else if (strcmp(argv[argno] + 2, "6502") == 0)
d_6502();
- else if ((*(argv[argno] + 2) == 't')&&(*(argv[argno] + 3) == 'o')&&(*(argv[argno] + 4) == 'm'))
+ else if (strcmp(argv[argno] + 2, "tom") == 0)
d_gpu();
- else if ((*(argv[argno] + 2) == 'j')&&(*(argv[argno] + 3) == 'e')&&(*(argv[argno] + 4) == 'r')&&(*(argv[argno] + 5) == 'r')&&(*(argv[argno] + 6) == 'y'))
+ else if (strcmp(argv[argno] + 2, "jerry") == 0)
d_dsp();
else
{
- printf("Unrecognised CPU");
+ printf("Unrecognized CPU '%s'\n", argv[argno] + 2);
errcnt++;
return errcnt;
}
case 'P':
/*
* -p .PRG generation w/o symbols
- * -ps .PRG generation with symbols
+ * -ps .PRG generation with symbols
+ * -px .PRG generation with extended symbols
*/
switch (argv[argno][2])
{
prg_flag = 2;
break;
+ case 'x':
+ case 'X':
+ prg_flag = 3;
+ break;
+
default:
printf("-p: syntax error\n");
errcnt++;