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
}
// Function to return "malformed expression" error
// This is done mainly to remove a bunch of GOTO statements in the parser
//
-static inline int MalformedOpcode(void)
+static inline int MalformedOpcode(int signal)
{
- error("Malformed opcode");
+ char buf[16];
+ sprintf(buf, "%02X", signal);
+ errors("Malformed opcode [internal $%s]", buf);
return ERROR;
}
// Evaluate what's in the global "tok" buffer
if (expr(r_expr, &eval, &eattr, &esym) != OK)
- return MalformedOpcode();
+ // Hmm, the evaluator should report the error to us...
+// return MalformedOpcode(0x00);
+ return ERROR;
if ((challoc - ch_size) < 4)
chcheck(4L);
switch (type)
{
// No operand instructions
- // NOP
- case RI_NONE:
+ // NOP (57)
+ case RI_NONE:
BuildRISCIntructionWord(parm, 0, 0);
break;
attrflg |= FU_SUB32;
if (*tok != '#')
- return MalformedOpcode();
+ return MalformedOpcode(0x01);
tok++;
if (expr(r_expr, &eval, &eattr, &esym) != OK)
- return MalformedOpcode();
+ return MalformedOpcode(0x02);
if ((challoc - ch_size) < 4)
chcheck(4L);
// Move Immediate--n,Rn--n in Second Word
case RI_MOVEI:
if (*tok != '#')
- return MalformedOpcode();
+ return MalformedOpcode(0x03);
tok++;
if (expr(r_expr, &eval, &eattr, &esym) != OK)
- return MalformedOpcode();
+ 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);
parm = 41;
if (*tok != '(')
- return MalformedOpcode();
+ return MalformedOpcode(0x05);
tok++;
else
{
if (expr(r_expr, &eval, &eattr, &esym) != OK)
- return MalformedOpcode();
+ return MalformedOpcode(0x06);
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;
}
}
if (*tok != ')')
- return MalformedOpcode();
+ return MalformedOpcode(0x07);
tok++;
CHECK_COMMA;
CHECK_COMMA;
if (*tok != '(')
- return MalformedOpcode();
+ return MalformedOpcode(0x08);
tok++;
indexed = 0;
else
{
if (expr(r_expr, &eval, &eattr, &esym) != OK)
- return MalformedOpcode();
+ return MalformedOpcode(0x09);
if ((challoc - ch_size) < 4)
chcheck(4L);
{
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;
}
}
if (*tok != ')')
- return MalformedOpcode();
+ return MalformedOpcode(0x0A);
tok++;
at_eol();
// LOADB/LOADP/LOADW (Rn),Rn
case RI_LOADN:
if (*tok != '(')
- return MalformedOpcode();
+ return MalformedOpcode(0x0B);
tok++;
reg1 = GetRegister(FU_REGONE);
if (*tok != ')')
- return MalformedOpcode();
+ return MalformedOpcode(0x0C);
tok++;
CHECK_COMMA;
CHECK_COMMA;
if (*tok != '(')
- return MalformedOpcode();
+ return MalformedOpcode(0x0D);
tok++;
reg2 = GetRegister(FU_REGTWO);
if (*tok != ')')
- return MalformedOpcode();
+ return MalformedOpcode(0x0E);
tok++;
at_eol();
{
// JR cc,n
if (expr(r_expr, &eval, &eattr, &esym) != OK)
- return MalformedOpcode();
+ return MalformedOpcode(0x0F);
if ((challoc - ch_size) < 4)
chcheck(4L);
{
// JUMP cc, (Rn)
if (*tok != '(')
- return MalformedOpcode();
+ return MalformedOpcode(0x10);
tok++;
reg2 = GetRegister(FU_REGTWO);
if (*tok != ')')
- return MalformedOpcode();
+ return MalformedOpcode(0x11);
tok++;
at_eol();
return ERROR;
}
+ lastOpcode = type;
return 0;
}