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;
}