summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
7596939)
Apparently MAC did fixups for programmers who forgot that they couldn't
put a MOVEI immediately after a JUMP or JR, so we do the same to keep
legacy code assembling (though we may flip the default to OFF at some
time in the future :-P). If you don't like the assembler doing stuff like
that behind your back, you can tell it not to by adding the -n switch to
your command line.
There are lots of other cases that the user should be warned about with
RISC code; these will be added in future commits. :-)
unsigned orgactive = 0; // RISC org directive active
unsigned orgaddr = 0; // Org'd address
unsigned orgwarning = 0; // Has an ORG warning been issued
unsigned orgactive = 0; // RISC org directive active
unsigned orgaddr = 0; // Org'd address
unsigned orgwarning = 0; // Has an ORG warning been issued
+int lastOpcode = -1; // Last RISC opcode assembled
char reg_err[] = "missing register R0...R31";
char reg_err[] = "missing register R0...R31";
//
void strtoupper(char * s)
{
//
void strtoupper(char * s)
{
-#if 0
- while (*s)
- {
- *s = (char)(toupper(*s));
- s++;
- }
-#else
switch (type)
{
// No operand instructions
switch (type)
{
// No operand instructions
+ // NOP (57)
+ case RI_NONE:
BuildRISCIntructionWord(parm, 0, 0);
break;
BuildRISCIntructionWord(parm, 0, 0);
break;
if (expr(r_expr, &eval, &eattr, &esym) != OK)
return MalformedOpcode(0x04);
if (expr(r_expr, &eval, &eattr, &esym) != OK)
return MalformedOpcode(0x04);
+ if (lastOpcode == RI_JUMP || lastOpcode == RI_JR)
+ {
+ if (legacy_flag)
+ {
+ // User doesn't care, emit a NOP to fix
+ BuildRISCIntructionWord(57, 0, 0);
+ warn("MOVEI following JUMP, inserting NOP to fix your BROKEN CODE");
+ }
+ else
+ warn("MOVEI following JUMP");
+ }
+
if ((challoc - ch_size) < 4)
chcheck(4L);
if ((challoc - ch_size) < 4)
chcheck(4L);
if (!(eattr & DEFINED))
{
if (!(eattr & DEFINED))
{
- error("constant expected");
+ error("constant expected after '+'");
{
reg1 = 14 + (parm - 58);
parm = 41;
{
reg1 = 14 + (parm - 58);
parm = 41;
- warn("NULL offset removed");
+ warn("NULL offset in LOAD ignored");
}
else
{
if (reg1 < 1 || reg1 > 32)
{
}
else
{
if (reg1 < 1 || reg1 > 32)
{
- error("constant out of range");
+ error("constant in LOAD out of range");
{
reg2 = 14 + (parm - 60);
parm = 47;
{
reg2 = 14 + (parm - 60);
parm = 47;
- warn("NULL offset removed");
+ warn("NULL offset in STORE ignored");
}
else
{
if (reg2 < 1 || reg2 > 32)
{
}
else
{
if (reg2 < 1 || reg2 > 32)
{
- error("constant out of range");
+ error("constant in STORE out of range");
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 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 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 obj_format; // Object format flag
int debug; // [1..9] Enable debugging levels
int err_flag; // '-e' specified
" b: BSD (use this for Jaguar)\n"
" -i[path] Directory to search for include files\n"
" -l[filename] Create an output listing file\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"
" -r[size] Pad segments to boundary size specified\n"
" w: word (2 bytes, default alignment)\n"
" -o file Output file name\n"
" -r[size] Pad segments to boundary size specified\n"
" w: word (2 bytes, default alignment)\n"
display_help();
errcnt++;
break;
display_help();
errcnt++;
break;
+ case 'n': // Turn off legacy mode
+ case 'N':
+ legacy_flag = 0;
+ printf("Legacy mode OFF\n");
+ break;
default:
display_version();
printf("Unknown switch: %s\n\n", argv[argno]);
default:
display_version();
printf("Unknown switch: %s\n\n", argv[argno]);
int main(int argc, char ** argv)
{
perm_verb_flag = 0; // Clobber "permanent" verbose flag
int main(int argc, char ** argv)
{
perm_verb_flag = 0; // Clobber "permanent" verbose flag
+ legacy_flag = 1; // Default is legacy mode on (:-P)
cmdlnexec = argv[0]; // Obtain executable name
endian = get_endianess(); // Get processor endianess
cmdlnexec = argv[0]; // Obtain executable name
endian = get_endianess(); // Get processor endianess
extern int lsym_flag;
extern int sbra_flag;
extern int obj_format;
extern int lsym_flag;
extern int sbra_flag;
extern int obj_format;
extern LONG amemtot;
// Prototypes
extern LONG amemtot;
// Prototypes
#define MAJOR 1 // Major version number
#define MINOR 2 // Minor version number
#define MAJOR 1 // Major version number
#define MINOR 2 // Minor version number
-#define PATCH 8 // Patch release number
+#define PATCH 9 // Patch release number