//
// RMAC - Reboot's Macro Assembler for all Atari computers
// RISCA.C - GPU/DSP Assembler
-// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
// Source utilised with the kind permission of Landon Dyer
//
int indexed; // Indexed register flag
uint64_t eval; // Expression value
- uint16_t eattr; // Expression attributes
- SYM * esym; // External symbol involved in expr.
+ uint16_t eattr; // Expression attributes
+ SYM * esym = NULL; // External symbol involved in expr.
TOKEN r_expr[EXPRSIZE]; // Expression token list
// Get opcode parameter and type
// UNPACK
case RI_ONE:
reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO);
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, parm >> 6, reg2);
break;
altbankok = 1; // MOVETA
reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO);
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, reg1, reg2);
break;
}
else
{
+ if (esym && (esym->sattre & EQUATEDREG))
+ return error("equated register seen for immediate value");
+
+ if (eattr & RISCREG)
+ return error("register seen for immediate value");
+
if (((int)eval < reg1) || ((int)eval > reg2))
- return error("constant out of range (%d to %d", reg1, reg2);
+ return error("constant out of range (%d to %d)", reg1, reg2);
if (parm & SUB32)
reg1 = 32 - (int)eval;
CHECK_COMMA;
reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO);
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, reg1, reg2);
break;
CHECK_COMMA;
reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO);
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, 0, reg2);
val = WORDSWAP32(eval);
CHECK_COMMA;
reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO);
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, reg1, reg2);
break;
tok++;
CHECK_COMMA;
reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO);
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, reg1, reg2);
break;
return MalformedOpcode(MALF_RPAREN);
tok++;
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, reg2, reg1);
break;
tok++;
CHECK_COMMA;
reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO);
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, reg1, reg2);
break;
return MalformedOpcode(MALF_RPAREN);
tok++;
- at_eol();
+ ErrorIfNotAtEOL();
DepositRISCInstructionWord(parm, reg2, reg1);
break;
return MalformedOpcode(MALF_RPAREN);
tok++;
- at_eol();
+ ErrorIfNotAtEOL();
}
DepositRISCInstructionWord(parm, reg2, reg1);