// 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);
- // See if this symbol has been defined, then undefined:
-//does nothing
-//segfaults now (esym == NULL?)
-/* if (esym->sattre & UNDEF_EQUR)
- {
- error("undefined register");
- return ERROR;
- }*/
-
if (!(eattr & DEFINED))
{
fixup((WORD)(FU_WORD | rattr), sloc, r_expr);
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 ((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 (*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);
}
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();