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";
//
void strtoupper(char * s)
{
-#if 0
- while (*s)
- {
- *s = (char)(toupper(*s));
- s++;
- }
-#else
while (*s)
*s++ &= 0xDF;
-#endif
}
switch (type)
{
// No operand instructions
- // NOP
- case RI_NONE:
+ // NOP (57)
+ case RI_NONE:
BuildRISCIntructionWord(parm, 0, 0);
break;
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 (!(eattr & DEFINED))
{
- error("constant expected");
+ error("constant expected after '+'");
return ERROR;
}
{
reg1 = 14 + (parm - 58);
parm = 41;
- warn("NULL offset removed");
+ warn("NULL offset in LOAD ignored");
}
else
{
if (reg1 < 1 || reg1 > 32)
{
- error("constant out of range");
+ error("constant in LOAD out of range");
return ERROR;
}
{
reg2 = 14 + (parm - 60);
parm = 47;
- warn("NULL offset removed");
+ warn("NULL offset in STORE ignored");
}
else
{
if (reg2 < 1 || reg2 > 32)
{
- error("constant out of range");
+ error("constant in STORE out of range");
return ERROR;
}
return ERROR;
}
+ lastOpcode = type;
return 0;
}
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
" 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"
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]);
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
return 0;
}
+